aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakashi Iwai <tiwai@suse.de>2016-12-12 16:05:20 -0500
committerTakashi Iwai <tiwai@suse.de>2016-12-12 16:05:20 -0500
commit152fce5a2371f64c57abf99dbb0600cc18d399d4 (patch)
treef3b4b8c2cf88cbd5a4a880f8c74b5d23f3f24982
parentd71bb23a81f80eeb5291e5c782377024e7265a23 (diff)
parenta5de5b74a50113564a1e0850e2da96c37c35e55d (diff)
Merge tag 'asoc-v4.10' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Updates for v4.10 There's been a few bits of framework work this time around and quite a lot of cleanups and improvements to existing code: - Support for stereo DAPM controls from Chen-yu Tsai. - Some initial work on the of-graph sound card from Morimoto-san, the main bulk of this is currently in binding review. - Lots of Renesas cleanups from Morimoto-san and sunxi work from Chen-yu Tsai. - regmap conversions of the remaining AC'97 drivers from Lars-Peter Clausen. - A new version of the topology ABI from Mengdong Lin. - New drivers for Cirrus Logic CS42L42, Qualcomm MSM8916-WCD, and Realtek RT5665.
-rw-r--r--CREDITS8
-rw-r--r--Documentation/ABI/testing/sysfs-devices-system-ibm-rtl4
-rw-r--r--Documentation/ABI/testing/sysfs-platform-sst-atom17
-rw-r--r--Documentation/devicetree/bindings/ipmi/aspeed,ast2400-ibt-bmc.txt (renamed from Documentation/devicetree/bindings/ipmi/aspeed,ast2400-bt-bmc.txt)4
-rw-r--r--Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt5
-rw-r--r--Documentation/devicetree/bindings/net/ethernet.txt24
-rw-r--r--Documentation/devicetree/bindings/pci/rockchip-pcie.txt11
-rw-r--r--Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.txt10
-rw-r--r--Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt88
-rw-r--r--Documentation/devicetree/bindings/sound/cs35l34.txt64
-rw-r--r--Documentation/devicetree/bindings/sound/cs42l42.txt110
-rw-r--r--Documentation/devicetree/bindings/sound/davinci-mcbsp.txt2
-rw-r--r--Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt2
-rw-r--r--Documentation/devicetree/bindings/sound/qcom,apq8016-sbc.txt5
-rw-r--r--Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt85
-rw-r--r--Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital.txt20
-rw-r--r--Documentation/devicetree/bindings/sound/rt5514.txt3
-rw-r--r--Documentation/devicetree/bindings/sound/rt5663.txt6
-rwxr-xr-xDocumentation/devicetree/bindings/sound/rt5665.txt68
-rw-r--r--Documentation/devicetree/bindings/sound/samsung,tm2-audio.txt38
-rw-r--r--Documentation/devicetree/bindings/sound/sun4i-codec.txt65
-rw-r--r--Documentation/devicetree/bindings/sound/sun8i-codec-analog.txt16
-rw-r--r--Documentation/devicetree/bindings/sound/tlv320aic31xx.txt1
-rw-r--r--Documentation/devicetree/bindings/sound/wm8580.txt4
-rw-r--r--Documentation/filesystems/Locking1
-rw-r--r--Documentation/filesystems/vfs.txt1
-rw-r--r--Documentation/i2c/i2c-topology4
-rw-r--r--Documentation/networking/dsa/dsa.txt3
-rw-r--r--Documentation/networking/nf_conntrack-sysctl.txt7
-rw-r--r--Documentation/virtual/kvm/api.txt11
-rw-r--r--MAINTAINERS34
-rw-r--r--Makefile30
-rw-r--r--arch/arc/Makefile7
-rw-r--r--arch/arc/boot/dts/axc001.dtsi2
-rw-r--r--arch/arc/boot/dts/nsim_700.dts2
-rw-r--r--arch/arc/boot/dts/nsimosci.dts4
-rw-r--r--arch/arc/configs/nsim_700_defconfig1
-rw-r--r--arch/arc/configs/nsim_hs_defconfig1
-rw-r--r--arch/arc/configs/nsim_hs_smp_defconfig1
-rw-r--r--arch/arc/configs/nsimosci_defconfig1
-rw-r--r--arch/arc/configs/nsimosci_hs_defconfig1
-rw-r--r--arch/arc/configs/nsimosci_hs_smp_defconfig3
-rw-r--r--arch/arc/include/asm/arcregs.h2
-rw-r--r--arch/arc/include/asm/delay.h9
-rw-r--r--arch/arc/include/asm/pgtable.h2
-rw-r--r--arch/arc/include/asm/smp.h4
-rw-r--r--arch/arc/kernel/devtree.c2
-rw-r--r--arch/arc/kernel/mcip.c32
-rw-r--r--arch/arc/kernel/process.c20
-rw-r--r--arch/arc/kernel/smp.c23
-rw-r--r--arch/arc/kernel/time.c19
-rw-r--r--arch/arc/mm/cache.c2
-rw-r--r--arch/arc/mm/dma.c26
-rw-r--r--arch/arc/plat-eznps/smp.c6
-rw-r--r--arch/arm/boot/dts/Makefile2
-rw-r--r--arch/arm/boot/dts/imx53-qsb.dts14
-rw-r--r--arch/arm/boot/dts/imx7s.dtsi5
-rw-r--r--arch/arm/boot/dts/logicpd-som-lv.dtsi5
-rw-r--r--arch/arm/boot/dts/logicpd-torpedo-som.dtsi4
-rw-r--r--arch/arm/boot/dts/omap5-board-common.dtsi7
-rw-r--r--arch/arm/boot/dts/orion5x-linkstation-lsgl.dts4
-rw-r--r--arch/arm/boot/dts/stih407-family.dtsi16
-rw-r--r--arch/arm/boot/dts/stih410-b2260.dts2
-rw-r--r--arch/arm/boot/dts/sun5i-gr8-evb.dts (renamed from arch/arm/boot/dts/ntc-gr8-evb.dts)2
-rw-r--r--arch/arm/boot/dts/sun5i-gr8.dtsi (renamed from arch/arm/boot/dts/ntc-gr8.dtsi)0
-rw-r--r--arch/arm/boot/dts/sun8i-a23-a33.dtsi4
-rw-r--r--arch/arm/boot/dts/sun8i-h3.dtsi2
-rw-r--r--arch/arm/include/asm/Kbuild1
-rw-r--r--arch/arm/include/asm/kvm_asm.h1
-rw-r--r--arch/arm/include/asm/kvm_host.h3
-rw-r--r--arch/arm/include/asm/kvm_hyp.h1
-rw-r--r--arch/arm/kernel/Makefile2
-rw-r--r--arch/arm/kernel/armksyms.c183
-rw-r--r--arch/arm/kernel/entry-ftrace.S3
-rw-r--r--arch/arm/kernel/head.S3
-rw-r--r--arch/arm/kernel/smccc-call.S3
-rw-r--r--arch/arm/kernel/traps.c20
-rw-r--r--arch/arm/kernel/vmlinux-xip.lds.S5
-rw-r--r--arch/arm/kvm/arm.c27
-rw-r--r--arch/arm/kvm/hyp/tlb.c15
-rw-r--r--arch/arm/lib/ashldi3.S3
-rw-r--r--arch/arm/lib/ashrdi3.S3
-rw-r--r--arch/arm/lib/backtrace.S37
-rw-r--r--arch/arm/lib/bitops.h5
-rw-r--r--arch/arm/lib/bswapsdi2.S3
-rw-r--r--arch/arm/lib/clear_user.S4
-rw-r--r--arch/arm/lib/copy_from_user.S2
-rw-r--r--arch/arm/lib/copy_page.S2
-rw-r--r--arch/arm/lib/copy_to_user.S4
-rw-r--r--arch/arm/lib/csumipv6.S3
-rw-r--r--arch/arm/lib/csumpartial.S2
-rw-r--r--arch/arm/lib/csumpartialcopy.S1
-rw-r--r--arch/arm/lib/csumpartialcopygeneric.S2
-rw-r--r--arch/arm/lib/csumpartialcopyuser.S1
-rw-r--r--arch/arm/lib/delay.c2
-rw-r--r--arch/arm/lib/div64.S2
-rw-r--r--arch/arm/lib/findbit.S9
-rw-r--r--arch/arm/lib/getuser.S9
-rw-r--r--arch/arm/lib/io-readsb.S2
-rw-r--r--arch/arm/lib/io-readsl.S2
-rw-r--r--arch/arm/lib/io-readsw-armv3.S3
-rw-r--r--arch/arm/lib/io-readsw-armv4.S2
-rw-r--r--arch/arm/lib/io-writesb.S2
-rw-r--r--arch/arm/lib/io-writesl.S2
-rw-r--r--arch/arm/lib/io-writesw-armv3.S2
-rw-r--r--arch/arm/lib/io-writesw-armv4.S2
-rw-r--r--arch/arm/lib/lib1funcs.S9
-rw-r--r--arch/arm/lib/lshrdi3.S3
-rw-r--r--arch/arm/lib/memchr.S2
-rw-r--r--arch/arm/lib/memcpy.S3
-rw-r--r--arch/arm/lib/memmove.S2
-rw-r--r--arch/arm/lib/memset.S3
-rw-r--r--arch/arm/lib/memzero.S2
-rw-r--r--arch/arm/lib/muldi3.S3
-rw-r--r--arch/arm/lib/putuser.S5
-rw-r--r--arch/arm/lib/strchr.S2
-rw-r--r--arch/arm/lib/strrchr.S2
-rw-r--r--arch/arm/lib/uaccess_with_memcpy.c3
-rw-r--r--arch/arm/lib/ucmpdi2.S3
-rw-r--r--arch/arm/mach-imx/Makefile1
-rw-r--r--arch/arm/mach-imx/ssi-fiq-ksym.c20
-rw-r--r--arch/arm/mach-imx/ssi-fiq.S7
-rw-r--r--arch/arm/mach-omap2/Kconfig1
-rw-r--r--arch/arm/mach-omap2/id.c16
-rw-r--r--arch/arm/mach-omap2/prm3xxx.c3
-rw-r--r--arch/arm/mach-omap2/voltage.c6
-rw-r--r--arch/arm/mm/dma-mapping.c2
-rw-r--r--arch/arm/mm/proc-v7m.S2
-rw-r--r--arch/arm64/boot/dts/arm/juno-base.dtsi2
-rw-r--r--arch/arm64/boot/dts/arm/juno-r1.dts2
-rw-r--r--arch/arm64/boot/dts/arm/juno-r2.dts2
-rw-r--r--arch/arm64/boot/dts/arm/juno.dts2
-rw-r--r--arch/arm64/boot/dts/marvell/armada-37xx.dtsi4
-rw-r--r--arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi6
-rw-r--r--arch/arm64/boot/dts/rockchip/rk3399.dtsi7
-rw-r--r--arch/arm64/include/asm/alternative.h2
-rw-r--r--arch/arm64/include/asm/cpucaps.h40
-rw-r--r--arch/arm64/include/asm/cpufeature.h20
-rw-r--r--arch/arm64/include/asm/kvm_asm.h1
-rw-r--r--arch/arm64/include/asm/kvm_host.h3
-rw-r--r--arch/arm64/include/asm/kvm_mmu.h2
-rw-r--r--arch/arm64/include/asm/lse.h1
-rw-r--r--arch/arm64/include/asm/perf_event.h10
-rw-r--r--arch/arm64/kernel/perf_event.c10
-rw-r--r--arch/arm64/kvm/hyp/tlb.c15
-rw-r--r--arch/arm64/kvm/sys_regs.c10
-rw-r--r--arch/m68k/configs/amiga_defconfig8
-rw-r--r--arch/m68k/configs/apollo_defconfig8
-rw-r--r--arch/m68k/configs/atari_defconfig8
-rw-r--r--arch/m68k/configs/bvme6000_defconfig8
-rw-r--r--arch/m68k/configs/hp300_defconfig8
-rw-r--r--arch/m68k/configs/mac_defconfig8
-rw-r--r--arch/m68k/configs/multi_defconfig8
-rw-r--r--arch/m68k/configs/mvme147_defconfig8
-rw-r--r--arch/m68k/configs/mvme16x_defconfig8
-rw-r--r--arch/m68k/configs/q40_defconfig8
-rw-r--r--arch/m68k/configs/sun3_defconfig8
-rw-r--r--arch/m68k/configs/sun3x_defconfig8
-rw-r--r--arch/m68k/include/asm/delay.h2
-rw-r--r--arch/mips/include/asm/mipsregs.h6
-rw-r--r--arch/mips/include/asm/tlb.h13
-rw-r--r--arch/mips/kernel/time.c2
-rw-r--r--arch/mips/lantiq/falcon/sysctrl.c2
-rw-r--r--arch/mips/mm/fault.c9
-rw-r--r--arch/mips/mm/init.c4
-rw-r--r--arch/mips/mm/tlb-r4k.c6
-rw-r--r--arch/nios2/kernel/time.c1
-rw-r--r--arch/openrisc/include/asm/cache.h2
-rw-r--r--arch/parisc/Kconfig4
-rw-r--r--arch/parisc/include/asm/pgtable.h8
-rw-r--r--arch/parisc/kernel/cache.c40
-rw-r--r--arch/parisc/kernel/inventory.c8
-rw-r--r--arch/parisc/kernel/pacache.S49
-rw-r--r--arch/parisc/kernel/pci-dma.c2
-rw-r--r--arch/parisc/kernel/setup.c4
-rw-r--r--arch/parisc/kernel/time.c57
-rw-r--r--arch/powerpc/boot/Makefile3
-rw-r--r--arch/powerpc/boot/main.c8
-rw-r--r--arch/powerpc/boot/opal-calls.S13
-rw-r--r--arch/powerpc/boot/opal.c13
-rw-r--r--arch/powerpc/boot/ops.h1
-rw-r--r--arch/powerpc/include/asm/asm-prototypes.h12
-rw-r--r--arch/powerpc/include/asm/exception-64s.h15
-rw-r--r--arch/powerpc/include/asm/mmu.h14
-rw-r--r--arch/powerpc/include/asm/ppc-opcode.h1
-rw-r--r--arch/powerpc/include/asm/reg.h1
-rw-r--r--arch/powerpc/kernel/cpu_setup_power.S8
-rw-r--r--arch/powerpc/kernel/eeh_driver.c4
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S11
-rw-r--r--arch/powerpc/kernel/process.c42
-rw-r--r--arch/powerpc/kernel/setup_64.c20
-rw-r--r--arch/powerpc/kernel/vmlinux.lds.S9
-rw-r--r--arch/powerpc/mm/hash64_4k.c2
-rw-r--r--arch/powerpc/mm/hash64_64k.c4
-rw-r--r--arch/powerpc/mm/hash_utils_64.c12
-rw-r--r--arch/powerpc/mm/pgtable-radix.c4
-rw-r--r--arch/powerpc/mm/tlb-radix.c4
-rw-r--r--arch/s390/hypfs/hypfs_diag.c6
-rw-r--r--arch/s390/kernel/vmlinux.lds.S2
-rw-r--r--arch/s390/pci/pci_dma.c2
-rw-r--r--arch/sparc/Kconfig23
-rw-r--r--arch/sparc/include/asm/hypervisor.h343
-rw-r--r--arch/sparc/include/asm/iommu_64.h28
-rw-r--r--arch/sparc/kernel/hvapi.c1
-rw-r--r--arch/sparc/kernel/iommu.c8
-rw-r--r--arch/sparc/kernel/iommu_common.h1
-rw-r--r--arch/sparc/kernel/pci_sun4v.c418
-rw-r--r--arch/sparc/kernel/pci_sun4v.h21
-rw-r--r--arch/sparc/kernel/pci_sun4v_asm.S68
-rw-r--r--arch/sparc/kernel/signal_32.c4
-rw-r--r--arch/sparc/mm/init_64.c71
-rw-r--r--arch/tile/include/asm/cache.h3
-rw-r--r--arch/tile/kernel/time.c4
-rw-r--r--arch/x86/boot/compressed/Makefile5
-rw-r--r--arch/x86/boot/cpu.c6
-rw-r--r--arch/x86/crypto/aesni-intel_glue.c4
-rw-r--r--arch/x86/events/amd/core.c8
-rw-r--r--arch/x86/events/core.c12
-rw-r--r--arch/x86/events/intel/core.c2
-rw-r--r--arch/x86/events/intel/cstate.c1
-rw-r--r--arch/x86/events/intel/ds.c35
-rw-r--r--arch/x86/events/intel/uncore.c8
-rw-r--r--arch/x86/events/intel/uncore_snb.c44
-rw-r--r--arch/x86/events/perf_event.h2
-rw-r--r--arch/x86/include/asm/compat.h4
-rw-r--r--arch/x86/include/asm/intel-mid.h1
-rw-r--r--arch/x86/kernel/apic/x2apic_uv_x.c4
-rw-r--r--arch/x86/kernel/apm_32.c5
-rw-r--r--arch/x86/kernel/cpu/amd.c6
-rw-r--r--arch/x86/kernel/cpu/common.c32
-rw-r--r--arch/x86/kernel/dumpstack.c2
-rw-r--r--arch/x86/kernel/fpu/core.c16
-rw-r--r--arch/x86/kernel/head_32.S9
-rw-r--r--arch/x86/kernel/sysfb_simplefb.c39
-rw-r--r--arch/x86/kernel/unwind_guess.c13
-rw-r--r--arch/x86/kvm/emulate.c36
-rw-r--r--arch/x86/kvm/ioapic.c2
-rw-r--r--arch/x86/kvm/ioapic.h4
-rw-r--r--arch/x86/kvm/irq_comm.c71
-rw-r--r--arch/x86/kvm/lapic.c2
-rw-r--r--arch/x86/kvm/x86.c47
-rw-r--r--arch/x86/mm/extable.c7
-rw-r--r--arch/x86/platform/efi/efi.c2
-rw-r--r--arch/x86/platform/efi/efi_64.c80
-rw-r--r--arch/x86/platform/intel-mid/device_libs/Makefile2
-rw-r--r--arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c (renamed from arch/x86/platform/intel-mid/device_libs/platform_wdt.c)34
-rw-r--r--arch/x86/platform/intel-mid/pwr.c19
-rw-r--r--arch/x86/platform/olpc/olpc-xo15-sci.c2
-rw-r--r--arch/x86/purgatory/Makefile1
-rw-r--r--arch/x86/tools/relocs.h2
-rw-r--r--arch/xtensa/include/uapi/asm/unistd.h9
-rw-r--r--arch/xtensa/kernel/time.c14
-rw-r--r--arch/xtensa/kernel/traps.c74
-rw-r--r--block/blk-map.c4
-rw-r--r--crypto/Makefile1
-rw-r--r--crypto/algif_aead.c59
-rw-r--r--crypto/algif_hash.c17
-rw-r--r--crypto/asymmetric_keys/x509_cert_parser.c1
-rw-r--r--crypto/drbg.c29
-rw-r--r--crypto/mcryptd.c19
-rw-r--r--crypto/scatterwalk.c4
-rw-r--r--drivers/acpi/acpi_apd.c10
-rw-r--r--drivers/acpi/acpi_lpss.c10
-rw-r--r--drivers/acpi/acpi_platform.c5
-rw-r--r--drivers/acpi/acpica/tbfadt.c10
-rw-r--r--drivers/acpi/dptf/int340x_thermal.c4
-rw-r--r--drivers/acpi/nfit/core.c55
-rw-r--r--drivers/acpi/nfit/nfit.h2
-rw-r--r--drivers/acpi/scan.c2
-rw-r--r--drivers/acpi/sleep.c29
-rw-r--r--drivers/ata/ahci.c7
-rw-r--r--drivers/ata/libata-scsi.c3
-rw-r--r--drivers/ata/sata_mv.c15
-rw-r--r--drivers/atm/eni.c2
-rw-r--r--drivers/atm/lanai.c1
-rw-r--r--drivers/base/dd.c5
-rw-r--r--drivers/base/power/main.c8
-rw-r--r--drivers/block/aoe/aoecmd.c41
-rw-r--r--drivers/block/drbd/drbd_main.c2
-rw-r--r--drivers/block/nbd.c2
-rw-r--r--drivers/block/zram/zram_drv.c11
-rw-r--r--drivers/char/ipmi/bt-bmc.c4
-rw-r--r--drivers/char/ppdev.c3
-rw-r--r--drivers/clk/bcm/Kconfig2
-rw-r--r--drivers/clk/berlin/bg2.c2
-rw-r--r--drivers/clk/berlin/bg2q.c2
-rw-r--r--drivers/clk/clk-efm32gg.c2
-rw-r--r--drivers/clk/clk-qoriq.c13
-rw-r--r--drivers/clk/clk-xgene.c10
-rw-r--r--drivers/clk/imx/clk-pllv3.c8
-rw-r--r--drivers/clk/mmp/clk-of-mmp2.c2
-rw-r--r--drivers/clk/mmp/clk-of-pxa168.c2
-rw-r--r--drivers/clk/mmp/clk-of-pxa910.c4
-rw-r--r--drivers/clk/rockchip/clk-ddr.c5
-rw-r--r--drivers/clk/samsung/clk-exynos-clkout.c22
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun6i-a31.c14
-rw-r--r--drivers/clk/sunxi-ng/ccu-sun8i-a33.c2
-rw-r--r--drivers/clk/sunxi/clk-sunxi.c2
-rw-r--r--drivers/crypto/caam/caamalg.c11
-rw-r--r--drivers/crypto/caam/ctrl.c5
-rw-r--r--drivers/crypto/chelsio/chcr_algo.h3
-rw-r--r--drivers/crypto/marvell/hash.c11
-rw-r--r--drivers/dax/dax.c4
-rw-r--r--drivers/dax/pmem.c4
-rw-r--r--drivers/dma/Kconfig1
-rw-r--r--drivers/dma/cppi41.c31
-rw-r--r--drivers/dma/edma.c1
-rw-r--r--drivers/dma/sun6i-dma.c2
-rw-r--r--drivers/extcon/extcon-arizona.c8
-rw-r--r--drivers/gpio/Kconfig4
-rw-r--r--drivers/gpio/Makefile2
-rw-r--r--drivers/gpio/gpio-pca953x.c4
-rw-r--r--drivers/gpio/gpio-tc3589x.c2
-rw-r--r--drivers/gpio/gpiolib.c7
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu.h2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c5
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c16
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c13
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c29
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c31
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c2
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c20
-rw-r--r--drivers/gpu/drm/amd/amdgpu/vi.c2
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c2
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c6
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c80
-rw-r--r--drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c6
-rw-r--r--drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c5
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c13
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.h6
-rw-r--r--drivers/gpu/drm/amd/scheduler/sched_fence.c19
-rw-r--r--drivers/gpu/drm/arc/arcpgu_hdmi.c159
-rw-r--r--drivers/gpu/drm/arm/hdlcd_crtc.c5
-rw-r--r--drivers/gpu/drm/arm/hdlcd_drv.c2
-rw-r--r--drivers/gpu/drm/drm_ioctl.c10
-rw-r--r--drivers/gpu/drm/exynos/exynos_hdmi.c5
-rw-r--r--drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c13
-rw-r--r--drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c4
-rw-r--r--drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c5
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c25
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c8
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c30
-rw-r--r--drivers/gpu/drm/i915/intel_display.c32
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c10
-rw-r--r--drivers/gpu/drm/i915/intel_hdmi.c84
-rw-r--r--drivers/gpu/drm/i915/intel_runtime_pm.c4
-rw-r--r--drivers/gpu/drm/i915/intel_sprite.c2
-rw-r--r--drivers/gpu/drm/i915/intel_vbt_defs.h3
-rw-r--r--drivers/gpu/drm/imx/ipuv3-crtc.c9
-rw-r--r--drivers/gpu/drm/mediatek/mtk_disp_ovl.c15
-rw-r--r--drivers/gpu/drm/mediatek/mtk_dpi.c9
-rw-r--r--drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c2
-rw-r--r--drivers/gpu/drm/mediatek/mtk_dsi.c64
-rw-r--r--drivers/gpu/drm/mediatek/mtk_hdmi.c17
-rw-r--r--drivers/gpu/drm/mediatek/mtk_mt8173_hdmi_phy.c42
-rw-r--r--drivers/gpu/drm/msm/dsi/dsi_host.c14
-rw-r--r--drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm.c1
-rw-r--r--drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c1
-rw-r--r--drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c1
-rw-r--r--drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c1
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c4
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c46
-rw-r--r--drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c9
-rw-r--r--drivers/gpu/drm/msm/msm_drv.c2
-rw-r--r--drivers/gpu/drm/msm/msm_gem_shrinker.c7
-rw-r--r--drivers/gpu/drm/radeon/radeon_atpx_handler.c16
-rw-r--r--drivers/gpu/drm/radeon/radeon_connectors.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c13
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_drv.c4
-rw-r--r--drivers/gpu/drm/sun4i/sun4i_rgb.c20
-rw-r--r--drivers/gpu/drm/udl/udl_main.c16
-rw-r--r--drivers/hid/hid-cp2112.c115
-rw-r--r--drivers/hid/hid-ids.h1
-rw-r--r--drivers/hid/hid-lg.c14
-rw-r--r--drivers/hid/hid-magicmouse.c12
-rw-r--r--drivers/hid/hid-rmi.c10
-rw-r--r--drivers/hid/hid-sensor-custom.c6
-rw-r--r--drivers/hid/hid-sensor-hub.c16
-rw-r--r--drivers/hid/intel-ish-hid/ipc/ipc.c102
-rw-r--r--drivers/hid/intel-ish-hid/ipc/pci-ish.c6
-rw-r--r--drivers/hid/usbhid/hid-quirks.c1
-rw-r--r--drivers/hv/vmbus_drv.c2
-rw-r--r--drivers/hwmon/hwmon.c6
-rw-r--r--drivers/i2c/Kconfig1
-rw-r--r--drivers/i2c/busses/i2c-designware-core.c64
-rw-r--r--drivers/i2c/busses/i2c-digicolor.c2
-rw-r--r--drivers/i2c/busses/i2c-octeon-core.c4
-rw-r--r--drivers/i2c/busses/i2c-octeon-core.h27
-rw-r--r--drivers/i2c/muxes/Kconfig1
-rw-r--r--drivers/i2c/muxes/i2c-demux-pinctrl.c22
-rw-r--r--drivers/i2c/muxes/i2c-mux-pca954x.c4
-rw-r--r--drivers/iio/accel/st_accel_core.c12
-rw-r--r--drivers/iio/common/hid-sensors/hid-sensor-attributes.c56
-rw-r--r--drivers/iio/common/st_sensors/st_sensors_core.c8
-rw-r--r--drivers/iio/orientation/hid-sensor-rotation.c1
-rw-r--r--drivers/iio/temperature/maxim_thermocouple.c2
-rw-r--r--drivers/infiniband/core/addr.c11
-rw-r--r--drivers/infiniband/core/cm.c126
-rw-r--r--drivers/infiniband/core/cma.c75
-rw-r--r--drivers/infiniband/core/umem.c2
-rw-r--r--drivers/infiniband/core/uverbs_main.c7
-rw-r--r--drivers/infiniband/hw/cxgb4/cq.c17
-rw-r--r--drivers/infiniband/hw/cxgb4/iw_cxgb4.h2
-rw-r--r--drivers/infiniband/hw/cxgb4/mem.c12
-rw-r--r--drivers/infiniband/hw/cxgb4/qp.c20
-rw-r--r--drivers/infiniband/hw/hfi1/affinity.c72
-rw-r--r--drivers/infiniband/hw/hfi1/affinity.h4
-rw-r--r--drivers/infiniband/hw/hfi1/chip.c27
-rw-r--r--drivers/infiniband/hw/hfi1/chip.h3
-rw-r--r--drivers/infiniband/hw/hfi1/driver.c37
-rw-r--r--drivers/infiniband/hw/hfi1/file_ops.c19
-rw-r--r--drivers/infiniband/hw/hfi1/hfi.h89
-rw-r--r--drivers/infiniband/hw/hfi1/init.c104
-rw-r--r--drivers/infiniband/hw/hfi1/pcie.c3
-rw-r--r--drivers/infiniband/hw/hfi1/pio.c13
-rw-r--r--drivers/infiniband/hw/hfi1/rc.c2
-rw-r--r--drivers/infiniband/hw/hfi1/sdma.c19
-rw-r--r--drivers/infiniband/hw/hfi1/sysfs.c25
-rw-r--r--drivers/infiniband/hw/hfi1/trace_rx.h60
-rw-r--r--drivers/infiniband/hw/hfi1/user_sdma.c2
-rw-r--r--drivers/infiniband/hw/mlx4/ah.c5
-rw-r--r--drivers/infiniband/hw/mlx4/cq.c5
-rw-r--r--drivers/infiniband/hw/mlx5/cq.c3
-rw-r--r--drivers/infiniband/hw/mlx5/main.c11
-rw-r--r--drivers/infiniband/hw/mlx5/mlx5_ib.h2
-rw-r--r--drivers/infiniband/hw/mlx5/mr.c6
-rw-r--r--drivers/infiniband/hw/mlx5/qp.c12
-rw-r--r--drivers/infiniband/sw/rdmavt/dma.c3
-rw-r--r--drivers/infiniband/sw/rxe/rxe_net.c8
-rw-r--r--drivers/infiniband/sw/rxe/rxe_qp.c2
-rw-r--r--drivers/infiniband/sw/rxe/rxe_queue.c9
-rw-r--r--drivers/infiniband/sw/rxe/rxe_queue.h2
-rw-r--r--drivers/infiniband/sw/rxe/rxe_req.c21
-rw-r--r--drivers/input/misc/arizona-haptics.c13
-rw-r--r--drivers/input/mouse/psmouse-base.c4
-rw-r--r--drivers/iommu/arm-smmu-v3.c25
-rw-r--r--drivers/iommu/arm-smmu.c16
-rw-r--r--drivers/iommu/dmar.c4
-rw-r--r--drivers/iommu/intel-iommu.c27
-rw-r--r--drivers/iommu/intel-svm.c28
-rw-r--r--drivers/isdn/gigaset/ser-gigaset.c4
-rw-r--r--drivers/isdn/hisax/hfc4s8s_l1.c1
-rw-r--r--drivers/mailbox/pcc.c13
-rw-r--r--drivers/media/dvb-frontends/Kconfig5
-rw-r--r--drivers/media/dvb-frontends/Makefile1
-rw-r--r--drivers/media/dvb-frontends/gp8psk-fe.c (renamed from drivers/media/usb/dvb-usb/gp8psk-fe.c)156
-rw-r--r--drivers/media/dvb-frontends/gp8psk-fe.h82
-rw-r--r--drivers/media/i2c/ir-kbd-i2c.c2
-rw-r--r--drivers/media/tuners/tuner-xc2028.c37
-rw-r--r--drivers/media/usb/dvb-usb/Makefile2
-rw-r--r--drivers/media/usb/dvb-usb/af9005.c33
-rw-r--r--drivers/media/usb/dvb-usb/cinergyT2-core.c33
-rw-r--r--drivers/media/usb/dvb-usb/cxusb.c39
-rw-r--r--drivers/media/usb/dvb-usb/cxusb.h1
-rw-r--r--drivers/media/usb/dvb-usb/dib0700_core.c5
-rw-r--r--drivers/media/usb/dvb-usb/dtt200u.c40
-rw-r--r--drivers/media/usb/dvb-usb/dvb-usb-init.c1
-rw-r--r--drivers/media/usb/dvb-usb/dvb-usb.h9
-rw-r--r--drivers/media/usb/dvb-usb/gp8psk.c111
-rw-r--r--drivers/media/usb/dvb-usb/gp8psk.h63
-rw-r--r--drivers/mfd/intel-lpss-pci.c31
-rw-r--r--drivers/mfd/intel-lpss.c3
-rw-r--r--drivers/mfd/intel_soc_pmic_bxtwc.c6
-rw-r--r--drivers/mfd/mfd-core.c2
-rw-r--r--drivers/mfd/stmpe.c2
-rw-r--r--drivers/mfd/syscon.c4
-rw-r--r--drivers/mfd/wm8994-core.c16
-rw-r--r--drivers/misc/mei/bus-fixup.c2
-rw-r--r--drivers/mmc/card/mmc_test.c8
-rw-r--r--drivers/mmc/core/mmc.c3
-rw-r--r--drivers/mmc/host/dw_mmc.c3
-rw-r--r--drivers/mmc/host/mxs-mmc.c4
-rw-r--r--drivers/mmc/host/sdhci-of-esdhc.c14
-rw-r--r--drivers/mmc/host/sdhci.c36
-rw-r--r--drivers/mmc/host/sdhci.h1
-rw-r--r--drivers/net/can/sja1000/plx_pci.c18
-rw-r--r--drivers/net/can/usb/peak_usb/pcan_ucan.h37
-rw-r--r--drivers/net/can/usb/peak_usb/pcan_usb_core.c8
-rw-r--r--drivers/net/can/usb/peak_usb/pcan_usb_core.h2
-rw-r--r--drivers/net/can/usb/peak_usb/pcan_usb_fd.c104
-rw-r--r--drivers/net/dsa/b53/b53_common.c16
-rw-r--r--drivers/net/dsa/bcm_sf2.c4
-rw-r--r--drivers/net/ethernet/altera/altera_tse_main.c21
-rw-r--r--drivers/net/ethernet/amd/xgbe/xgbe-main.c4
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.c12
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_hw.h2
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_main.c3
-rw-r--r--drivers/net/ethernet/apm/xgene/xgene_enet_ring2.c12
-rw-r--r--drivers/net/ethernet/arc/emac_main.c7
-rw-r--r--drivers/net/ethernet/aurora/nb8800.c9
-rw-r--r--drivers/net/ethernet/broadcom/bcmsysport.c17
-rw-r--r--drivers/net/ethernet/broadcom/bgmac.c9
-rw-r--r--drivers/net/ethernet/broadcom/bnx2.c48
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c8
-rw-r--r--drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c5
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt.c32
-rw-r--r--drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c4
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmgenet.c8
-rw-r--r--drivers/net/ethernet/broadcom/genet/bcmmii.c10
-rw-r--r--drivers/net/ethernet/brocade/bna/bnad.c4
-rw-r--r--drivers/net/ethernet/cadence/macb.c11
-rw-r--r--drivers/net/ethernet/cavium/thunder/nic.h64
-rw-r--r--drivers/net/ethernet/cavium/thunder/nic_main.c37
-rw-r--r--drivers/net/ethernet/cavium/thunder/nic_reg.h1
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c105
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_main.c153
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_queues.c118
-rw-r--r--drivers/net/ethernet/cavium/thunder/nicvf_queues.h24
-rw-r--r--drivers/net/ethernet/cavium/thunder/thunder_bgx.c4
-rw-r--r--drivers/net/ethernet/cavium/thunder/thunder_bgx.h2
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c1
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/sge.c1
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_hw.c1
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h3
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c1
-rw-r--r--drivers/net/ethernet/cirrus/ep93xx_eth.c4
-rw-r--r--drivers/net/ethernet/emulex/benet/be_cmds.c3
-rw-r--r--drivers/net/ethernet/emulex/benet/be_main.c1
-rw-r--r--drivers/net/ethernet/freescale/fec.h2
-rw-r--r--drivers/net/ethernet/freescale/fec_main.c37
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_memac.c3
-rw-r--r--drivers/net/ethernet/freescale/fman/fman_tgec.c3
-rw-r--r--drivers/net/ethernet/freescale/fman/mac.c2
-rw-r--r--drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c7
-rw-r--r--drivers/net/ethernet/freescale/gianfar.c8
-rw-r--r--drivers/net/ethernet/freescale/ucc_geth.c23
-rw-r--r--drivers/net/ethernet/hisilicon/hns/hnae.c8
-rw-r--r--drivers/net/ethernet/ibm/ehea/ehea_main.c2
-rw-r--r--drivers/net/ethernet/ibm/ibmveth.c65
-rw-r--r--drivers/net/ethernet/ibm/ibmveth.h1
-rw-r--r--drivers/net/ethernet/ibm/ibmvnic.c11
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c8
-rw-r--r--drivers/net/ethernet/intel/igbvf/netdev.c8
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_main.c8
-rw-r--r--drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c8
-rw-r--r--drivers/net/ethernet/lantiq_etop.c1
-rw-r--r--drivers/net/ethernet/marvell/mv643xx_eth.c2
-rw-r--r--drivers/net/ethernet/marvell/mvneta.c7
-rw-r--r--drivers/net/ethernet/marvell/mvpp2.c2
-rw-r--r--drivers/net/ethernet/marvell/sky2.c13
-rw-r--r--drivers/net/ethernet/mediatek/mtk_eth_soc.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/en_netdev.c23
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/main.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx4/mcg.c7
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/Kconfig2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/cmd.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en.h4
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_main.c46
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_rep.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_rx.c8
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tc.c5
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_tx.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c3
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/fs_core.c2
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/main.c44
-rw-r--r--drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h15
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.c4
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum.h2
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c134
-rw-r--r--drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c14
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_hsi.h3
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_ll2.c2
-rw-r--r--drivers/net/ethernet/qlogic/qed/qed_main.c17
-rw-r--r--drivers/net/ethernet/qlogic/qede/qede_ethtool.c25
-rw-r--r--drivers/net/ethernet/qlogic/qede/qede_main.c2
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac-mac.c15
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac-phy.c1
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac-sgmii.c2
-rw-r--r--drivers/net/ethernet/qualcomm/emac/emac.c4
-rw-r--r--drivers/net/ethernet/renesas/ravb_main.c19
-rw-r--r--drivers/net/ethernet/renesas/sh_eth.c2
-rw-r--r--drivers/net/ethernet/sfc/efx.c3
-rw-r--r--drivers/net/ethernet/smsc/smsc911x.c9
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/Kconfig2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c4
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/common.h24
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/descs.h20
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c17
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c25
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c17
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c23
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c32
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c21
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c39
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c23
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c19
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c26
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c95
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h4
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/enh_desc.c28
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac.h1
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c19
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c43
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_main.c105
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c39
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h2
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c9
-rw-r--r--drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h72
-rw-r--r--drivers/net/ethernet/sun/sunbmac.c5
-rw-r--r--drivers/net/ethernet/sun/sunbmac.h2
-rw-r--r--drivers/net/ethernet/sun/sunqe.c11
-rw-r--r--drivers/net/ethernet/sun/sunqe.h4
-rw-r--r--drivers/net/ethernet/synopsys/dwc_eth_qos.c22
-rw-r--r--drivers/net/ethernet/ti/cpmac.c1
-rw-r--r--drivers/net/ethernet/ti/cpsw-phy-sel.c4
-rw-r--r--drivers/net/ethernet/ti/cpsw.c87
-rw-r--r--drivers/net/ethernet/ti/davinci_emac.c20
-rw-r--r--drivers/net/ethernet/toshiba/ps3_gelic_wireless.c2
-rw-r--r--drivers/net/ethernet/xscale/ixp4xx_eth.c3
-rw-r--r--drivers/net/geneve.c14
-rw-r--r--drivers/net/hyperv/netvsc_drv.c5
-rw-r--r--drivers/net/ieee802154/adf7242.c1
-rw-r--r--drivers/net/ipvlan/ipvlan_main.c19
-rw-r--r--drivers/net/irda/irda-usb.c1
-rw-r--r--drivers/net/irda/w83977af_ir.c4
-rw-r--r--drivers/net/macvlan.c34
-rw-r--r--drivers/net/macvtap.c19
-rw-r--r--drivers/net/phy/fixed_phy.c2
-rw-r--r--drivers/net/phy/micrel.c8
-rw-r--r--drivers/net/phy/phy_device.c18
-rw-r--r--drivers/net/phy/realtek.c20
-rw-r--r--drivers/net/phy/vitesse.c34
-rw-r--r--drivers/net/tun.c10
-rw-r--r--drivers/net/usb/asix_devices.c6
-rw-r--r--drivers/net/usb/ax88179_178a.c17
-rw-r--r--drivers/net/usb/cdc_ether.c38
-rw-r--r--drivers/net/usb/cdc_mbim.c21
-rw-r--r--drivers/net/usb/cdc_ncm.c14
-rw-r--r--drivers/net/usb/lan78xx.c1
-rw-r--r--drivers/net/usb/qmi_wwan.c1
-rw-r--r--drivers/net/usb/r8152.c21
-rw-r--r--drivers/net/virtio_net.c54
-rw-r--r--drivers/net/vxlan.c14
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c2
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/d3.c49
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c4
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/mvm.h1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/ops.c1
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c3
-rw-r--r--drivers/net/wireless/intel/iwlwifi/mvm/scan.c33
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/drv.c79
-rw-r--r--drivers/net/wireless/intel/iwlwifi/pcie/tx.c8
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c2
-rw-r--r--drivers/net/wireless/marvell/mwifiex/cfg80211.c13
-rw-r--r--drivers/net/xen-netfront.c4
-rw-r--r--drivers/nfc/mei_phy.c2
-rw-r--r--drivers/ntb/hw/intel/ntb_hw_intel.c15
-rw-r--r--drivers/ntb/ntb_transport.c2
-rw-r--r--drivers/ntb/test/ntb_perf.c8
-rw-r--r--drivers/ntb/test/ntb_pingpong.c2
-rw-r--r--drivers/nvdimm/bus.c25
-rw-r--r--drivers/nvme/host/lightnvm.c2
-rw-r--r--drivers/nvme/host/pci.c18
-rw-r--r--drivers/nvme/host/rdma.c42
-rw-r--r--drivers/nvme/target/core.c10
-rw-r--r--drivers/nvme/target/rdma.c18
-rw-r--r--drivers/of/base.c2
-rw-r--r--drivers/of/of_mdio.c21
-rw-r--r--drivers/pci/host/pcie-designware-plat.c2
-rw-r--r--drivers/pci/host/pcie-rockchip.c62
-rw-r--r--drivers/pci/pci-mid.c6
-rw-r--r--drivers/pci/pcie/aer/aer_inject.c14
-rw-r--r--drivers/pci/probe.c28
-rw-r--r--drivers/pci/setup-res.c8
-rw-r--r--drivers/pcmcia/soc_common.c2
-rw-r--r--drivers/phy/phy-da8xx-usb.c5
-rw-r--r--drivers/phy/phy-rockchip-pcie.c13
-rw-r--r--drivers/phy/phy-sun4i-usb.c2
-rw-r--r--drivers/phy/phy-twl4030-usb.c4
-rw-r--r--drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c2
-rw-r--r--drivers/pinctrl/bcm/pinctrl-iproc-gpio.c2
-rw-r--r--drivers/pinctrl/bcm/pinctrl-nsp-gpio.c2
-rw-r--r--drivers/pinctrl/freescale/pinctrl-imx.c1
-rw-r--r--drivers/pinctrl/intel/pinctrl-cherryview.c17
-rw-r--r--drivers/pinctrl/pinctrl-st.c2
-rw-r--r--drivers/pinctrl/stm32/pinctrl-stm32.c8
-rw-r--r--drivers/platform/x86/ideapad-laptop.c7
-rw-r--r--drivers/platform/x86/intel-hid.c2
-rw-r--r--drivers/platform/x86/intel-vbtn.c2
-rw-r--r--drivers/platform/x86/toshiba-wmi.c26
-rw-r--r--drivers/pwm/pwm-meson.c1
-rw-r--r--drivers/pwm/sysfs.c2
-rw-r--r--drivers/regulator/rk808-regulator.c9
-rw-r--r--drivers/rtc/rtc-asm9260.c1
-rw-r--r--drivers/rtc/rtc-cmos.c15
-rw-r--r--drivers/rtc/rtc-omap.c38
-rw-r--r--drivers/scsi/be2iscsi/be_mgmt.c2
-rw-r--r--drivers/scsi/cxgbi/libcxgbi.c3
-rw-r--r--drivers/scsi/device_handler/scsi_dh_alua.c5
-rw-r--r--drivers/scsi/hpsa.c16
-rw-r--r--drivers/scsi/hpsa.h2
-rw-r--r--drivers/scsi/libfc/fc_lport.c2
-rw-r--r--drivers/scsi/lpfc/lpfc_sli.c14
-rw-r--r--drivers/scsi/megaraid/megaraid_sas.h2
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_scsih.c24
-rw-r--r--drivers/scsi/mvsas/mv_sas.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c21
-rw-r--r--drivers/scsi/qlogicpti.h4
-rw-r--r--drivers/scsi/vmw_pvscsi.c5
-rw-r--r--drivers/scsi/vmw_pvscsi.h2
-rw-r--r--drivers/staging/comedi/drivers/ni_tio.c3
-rw-r--r--drivers/staging/greybus/arche-platform.c1
-rw-r--r--drivers/staging/iio/impedance-analyzer/ad5933.c17
-rw-r--r--drivers/staging/nvec/nvec_ps2.c8
-rw-r--r--drivers/staging/sm750fb/ddk750_reg.h8
-rw-r--r--drivers/thermal/intel_powerclamp.c9
-rw-r--r--drivers/usb/chipidea/core.c1
-rw-r--r--drivers/usb/chipidea/udc.c2
-rw-r--r--drivers/usb/class/cdc-acm.c4
-rw-r--r--drivers/usb/dwc3/core.c5
-rw-r--r--drivers/usb/dwc3/dwc3-st.c1
-rw-r--r--drivers/usb/gadget/function/f_fs.c8
-rw-r--r--drivers/usb/gadget/function/u_ether.c8
-rw-r--r--drivers/usb/host/pci-quirks.c8
-rw-r--r--drivers/usb/musb/da8xx.c3
-rw-r--r--drivers/usb/musb/musb_core.c152
-rw-r--r--drivers/usb/musb/musb_core.h13
-rw-r--r--drivers/usb/musb/musb_dsps.c58
-rw-r--r--drivers/usb/musb/musb_gadget.c39
-rw-r--r--drivers/usb/musb/omap2430.c10
-rw-r--r--drivers/usb/musb/tusb6010.c6
-rw-r--r--drivers/usb/serial/cp210x.c1
-rw-r--r--drivers/usb/serial/ftdi_sio.c2
-rw-r--r--drivers/usb/serial/ftdi_sio_ids.h6
-rw-r--r--drivers/usb/storage/transport.c7
-rw-r--r--drivers/uwb/lc-rc.c16
-rw-r--r--drivers/uwb/pal.c2
-rw-r--r--drivers/vhost/vsock.c2
-rw-r--r--drivers/video/fbdev/amba-clcd-versatile.c4
-rw-r--r--drivers/watchdog/Kconfig1
-rw-r--r--fs/aio.c207
-rw-r--r--fs/ceph/dir.c24
-rw-r--r--fs/ceph/file.c1
-rw-r--r--fs/cifs/cifsencrypt.c11
-rw-r--r--fs/cifs/cifssmb.c4
-rw-r--r--fs/cifs/connect.c25
-rw-r--r--fs/coredump.c3
-rw-r--r--fs/crypto/fname.c53
-rw-r--r--fs/crypto/keyinfo.c16
-rw-r--r--fs/ext4/ext4.h1
-rw-r--r--fs/ext4/super.c17
-rw-r--r--fs/fuse/dir.c12
-rw-r--r--fs/fuse/file.c6
-rw-r--r--fs/fuse/fuse_i.h1
-rw-r--r--fs/fuse/inode.c3
-rw-r--r--fs/isofs/rock.c4
-rw-r--r--fs/nfs/callback.c2
-rw-r--r--fs/nfs/client.c3
-rw-r--r--fs/nfs/namespace.c2
-rw-r--r--fs/nfs/nfs4_fs.h7
-rw-r--r--fs/nfs/nfs4proc.c38
-rw-r--r--fs/nfs/nfs4session.c12
-rw-r--r--fs/nfs/nfs4state.c1
-rw-r--r--fs/nfs/pnfs.c2
-rw-r--r--fs/ntfs/dir.c2
-rw-r--r--fs/ocfs2/dir.c2
-rw-r--r--fs/orangefs/orangefs-debugfs.c149
-rw-r--r--fs/orangefs/orangefs-mod.c6
-rw-r--r--fs/overlayfs/super.c6
-rw-r--r--fs/splice.c8
-rw-r--r--fs/xattr.c22
-rw-r--r--fs/xfs/libxfs/xfs_defer.c17
-rw-r--r--include/acpi/actbl.h164
-rw-r--r--include/acpi/platform/aclinux.h3
-rw-r--r--include/asm-generic/percpu.h4
-rw-r--r--include/asm-generic/sections.h3
-rw-r--r--include/asm-generic/vmlinux.lds.h5
-rw-r--r--include/crypto/drbg.h2
-rw-r--r--include/dt-bindings/sound/cs42l42.h73
-rw-r--r--include/linux/acpi.h3
-rw-r--r--include/linux/bpf_verifier.h5
-rw-r--r--include/linux/ceph/osd_client.h2
-rw-r--r--include/linux/compiler-gcc.h4
-rw-r--r--include/linux/console.h6
-rw-r--r--include/linux/frontswap.h5
-rw-r--r--include/linux/fs.h2
-rw-r--r--include/linux/huge_mm.h2
-rw-r--r--include/linux/intel-iommu.h1
-rw-r--r--include/linux/ipv6.h2
-rw-r--r--include/linux/libnvdimm.h2
-rw-r--r--include/linux/mlx4/device.h1
-rw-r--r--include/linux/netdevice.h17
-rw-r--r--include/linux/of_mdio.h4
-rw-r--r--include/linux/pagemap.h21
-rw-r--r--include/linux/pci.h14
-rw-r--r--include/linux/phy/phy.h7
-rw-r--r--include/linux/sched.h2
-rw-r--r--include/linux/sunrpc/svc_xprt.h1
-rw-r--r--include/linux/usb/cdc_ncm.h3
-rw-r--r--include/net/bluetooth/hci_core.h2
-rw-r--r--include/net/gro_cells.h3
-rw-r--r--include/net/ip.h3
-rw-r--r--include/net/ip6_tunnel.h1
-rw-r--r--include/net/ip_fib.h1
-rw-r--r--include/net/ipv6.h2
-rw-r--r--include/net/net_namespace.h2
-rw-r--r--include/net/netfilter/nf_conntrack.h6
-rw-r--r--include/net/netfilter/nf_conntrack_labels.h3
-rw-r--r--include/net/netfilter/nf_tables.h10
-rw-r--r--include/net/sctp/sctp.h2
-rw-r--r--include/net/sock.h4
-rw-r--r--include/net/tcp.h3
-rw-r--r--include/sound/cs35l34.h35
-rw-r--r--include/sound/dmaengine_pcm.h6
-rw-r--r--include/sound/rt5514.h20
-rwxr-xr-xinclude/sound/rt5665.h47
-rw-r--r--include/sound/simple_card_utils.h8
-rw-r--r--include/sound/soc-dai.h43
-rw-r--r--include/sound/soc-dapm.h14
-rw-r--r--include/sound/soc-topology.h2
-rw-r--r--include/sound/soc.h87
-rw-r--r--include/uapi/linux/atm_zatm.h1
-rw-r--r--include/uapi/linux/bpqether.h2
-rw-r--r--include/uapi/linux/can.h1
-rw-r--r--include/uapi/linux/if.h4
-rw-r--r--include/uapi/linux/input-event-codes.h2
-rw-r--r--include/uapi/linux/kvm.h7
-rw-r--r--include/uapi/linux/netfilter/Kbuild1
-rw-r--r--include/uapi/linux/tc_act/Kbuild2
-rw-r--r--include/uapi/sound/asoc.h90
-rw-r--r--include/uapi/sound/snd_sst_tokens.h8
-rw-r--r--init/do_mounts_rd.c2
-rw-r--r--kernel/bpf/hashtab.c3
-rw-r--r--kernel/bpf/syscall.c4
-rw-r--r--kernel/bpf/verifier.c80
-rw-r--r--kernel/events/core.c12
-rw-r--r--kernel/exit.c1
-rw-r--r--kernel/irq/manage.c4
-rw-r--r--kernel/kcov.c1
-rw-r--r--kernel/locking/lockdep.c111
-rw-r--r--kernel/locking/lockdep_internals.h20
-rw-r--r--kernel/locking/rtmutex.c68
-rw-r--r--kernel/locking/rtmutex_common.h5
-rw-r--r--kernel/module.c5
-rw-r--r--kernel/power/suspend_test.c4
-rw-r--r--kernel/printk/printk.c24
-rw-r--r--kernel/sched/auto_group.c40
-rw-r--r--kernel/taskstats.c6
-rw-r--r--kernel/trace/ftrace.c24
-rw-r--r--lib/Kconfig.debug3
-rw-r--r--lib/debugobjects.c8
-rw-r--r--lib/iov_iter.c4
-rw-r--r--lib/locking-selftest.c66
-rw-r--r--lib/mpi/mpi-pow.c7
-rw-r--r--lib/stackdepot.c2
-rw-r--r--lib/test_kasan.c29
-rw-r--r--mm/cma.c3
-rw-r--r--mm/filemap.c3
-rw-r--r--mm/huge_memory.c9
-rw-r--r--mm/hugetlb.c66
-rw-r--r--mm/kasan/kasan.c19
-rw-r--r--mm/kasan/kasan.h4
-rw-r--r--mm/kasan/report.c3
-rw-r--r--mm/khugepaged.c2
-rw-r--r--mm/kmemleak.c1
-rw-r--r--mm/memory-failure.c12
-rw-r--r--mm/mlock.c7
-rw-r--r--mm/mremap.c34
-rw-r--r--mm/page_alloc.c2
-rw-r--r--mm/shmem.c17
-rw-r--r--mm/slab_common.c4
-rw-r--r--mm/swapfile.c2
-rw-r--r--mm/truncate.c8
-rw-r--r--mm/vmscan.c2
-rw-r--r--mm/workingset.c2
-rw-r--r--net/batman-adv/hard-interface.c1
-rw-r--r--net/batman-adv/tp_meter.c1
-rw-r--r--net/batman-adv/translation-table.c4
-rw-r--r--net/bluetooth/6lowpan.c4
-rw-r--r--net/bluetooth/hci_conn.c26
-rw-r--r--net/bluetooth/l2cap_core.c2
-rw-r--r--net/bluetooth/rfcomm/tty.c2
-rw-r--r--net/bluetooth/sco.c2
-rw-r--r--net/bridge/br_sysfs_br.c1
-rw-r--r--net/caif/caif_socket.c5
-rw-r--r--net/can/bcm.c50
-rw-r--r--net/can/raw.c3
-rw-r--r--net/ceph/ceph_fs.c3
-rw-r--r--net/ceph/osd_client.c1
-rw-r--r--net/core/dev.c19
-rw-r--r--net/core/ethtool.c1
-rw-r--r--net/core/filter.c68
-rw-r--r--net/core/flow.c6
-rw-r--r--net/core/flow_dissector.c13
-rw-r--r--net/core/net_namespace.c2
-rw-r--r--net/core/rtnetlink.c29
-rw-r--r--net/core/sock.c10
-rw-r--r--net/dcb/dcbnl.c1
-rw-r--r--net/dccp/ipv4.c28
-rw-r--r--net/dccp/ipv6.c19
-rw-r--r--net/dccp/proto.c4
-rw-r--r--net/dsa/dsa.c13
-rw-r--r--net/dsa/dsa2.c4
-rw-r--r--net/dsa/slave.c19
-rw-r--r--net/ipv4/Kconfig1
-rw-r--r--net/ipv4/af_inet.c11
-rw-r--r--net/ipv4/esp4.c2
-rw-r--r--net/ipv4/fib_frontend.c20
-rw-r--r--net/ipv4/fib_trie.c158
-rw-r--r--net/ipv4/icmp.c4
-rw-r--r--net/ipv4/igmp.c50
-rw-r--r--net/ipv4/ip_forward.c2
-rw-r--r--net/ipv4/ip_output.c27
-rw-r--r--net/ipv4/ip_tunnel_core.c11
-rw-r--r--net/ipv4/ipmr.c2
-rw-r--r--net/ipv4/netfilter.c5
-rw-r--r--net/ipv4/netfilter/arp_tables.c4
-rw-r--r--net/ipv4/netfilter/nft_dup_ipv4.c6
-rw-r--r--net/ipv4/ping.c4
-rw-r--r--net/ipv4/route.c4
-rw-r--r--net/ipv4/tcp.c4
-rw-r--r--net/ipv4/tcp_cong.c4
-rw-r--r--net/ipv4/tcp_dctcp.c13
-rw-r--r--net/ipv4/tcp_input.c22
-rw-r--r--net/ipv4/tcp_ipv4.c19
-rw-r--r--net/ipv4/udp.c8
-rw-r--r--net/ipv4/udp_impl.h2
-rw-r--r--net/ipv4/udplite.c2
-rw-r--r--net/ipv6/addrconf.c18
-rw-r--r--net/ipv6/datagram.c4
-rw-r--r--net/ipv6/esp6.c2
-rw-r--r--net/ipv6/icmp.c6
-rw-r--r--net/ipv6/ip6_offload.c2
-rw-r--r--net/ipv6/ip6_output.c2
-rw-r--r--net/ipv6/ip6_tunnel.c14
-rw-r--r--net/ipv6/ip6_udp_tunnel.c3
-rw-r--r--net/ipv6/ip6_vti.c31
-rw-r--r--net/ipv6/netfilter/nf_conntrack_reasm.c4
-rw-r--r--net/ipv6/netfilter/nf_defrag_ipv6_hooks.c2
-rw-r--r--net/ipv6/netfilter/nf_reject_ipv6.c1
-rw-r--r--net/ipv6/netfilter/nft_dup_ipv6.c6
-rw-r--r--net/ipv6/output_core.c2
-rw-r--r--net/ipv6/route.c4
-rw-r--r--net/ipv6/tcp_ipv6.c14
-rw-r--r--net/ipv6/udp.c8
-rw-r--r--net/ipv6/udp_impl.h2
-rw-r--r--net/ipv6/udplite.c2
-rw-r--r--net/l2tp/l2tp_ip.c66
-rw-r--r--net/l2tp/l2tp_ip6.c84
-rw-r--r--net/mac80211/sta_info.c2
-rw-r--r--net/mac80211/tx.c14
-rw-r--r--net/mac80211/vht.c16
-rw-r--r--net/mpls/af_mpls.c2
-rw-r--r--net/netfilter/ipvs/ip_vs_ctl.c2
-rw-r--r--net/netfilter/ipvs/ip_vs_sync.c7
-rw-r--r--net/netfilter/nf_conntrack_core.c49
-rw-r--r--net/netfilter/nf_conntrack_helper.c11
-rw-r--r--net/netfilter/nf_conntrack_sip.c5
-rw-r--r--net/netfilter/nf_nat_core.c49
-rw-r--r--net/netfilter/nf_tables_api.c32
-rw-r--r--net/netfilter/nft_dynset.c19
-rw-r--r--net/netfilter/nft_hash.c7
-rw-r--r--net/netfilter/nft_range.c6
-rw-r--r--net/netfilter/nft_set_hash.c19
-rw-r--r--net/netfilter/nft_set_rbtree.c2
-rw-r--r--net/netfilter/xt_connmark.c4
-rw-r--r--net/netlink/af_netlink.c21
-rw-r--r--net/netlink/af_netlink.h2
-rw-r--r--net/netlink/diag.c5
-rw-r--r--net/netlink/genetlink.c4
-rw-r--r--net/openvswitch/conntrack.c5
-rw-r--r--net/packet/af_packet.c18
-rw-r--r--net/rds/tcp.c2
-rw-r--r--net/sched/act_pedit.c24
-rw-r--r--net/sched/cls_api.c3
-rw-r--r--net/sched/cls_basic.c4
-rw-r--r--net/sched/cls_bpf.c4
-rw-r--r--net/sched/cls_cgroup.c7
-rw-r--r--net/sched/cls_flow.c1
-rw-r--r--net/sched/cls_flower.c41
-rw-r--r--net/sched/cls_matchall.c1
-rw-r--r--net/sched/cls_rsvp.h3
-rw-r--r--net/sched/cls_tcindex.c1
-rw-r--r--net/sctp/input.c35
-rw-r--r--net/sctp/ipv6.c2
-rw-r--r--net/sctp/socket.c27
-rw-r--r--net/socket.c17
-rw-r--r--net/sunrpc/clnt.c7
-rw-r--r--net/sunrpc/svc_xprt.c11
-rw-r--r--net/sunrpc/svcsock.c21
-rw-r--r--net/sunrpc/xprtrdma/frwr_ops.c37
-rw-r--r--net/sunrpc/xprtrdma/svc_rdma_transport.c6
-rw-r--r--net/sunrpc/xprtrdma/xprt_rdma.h3
-rw-r--r--net/tipc/bearer.c11
-rw-r--r--net/tipc/bearer.h13
-rw-r--r--net/tipc/link.c40
-rw-r--r--net/tipc/monitor.c10
-rw-r--r--net/tipc/socket.c50
-rw-r--r--net/tipc/udp_media.c5
-rw-r--r--net/unix/af_unix.c20
-rw-r--r--net/wireless/core.h1
-rw-r--r--net/wireless/scan.c69
-rw-r--r--net/wireless/util.c3
-rw-r--r--net/xfrm/xfrm_policy.c10
-rw-r--r--net/xfrm/xfrm_user.c2
-rw-r--r--samples/bpf/Makefile4
-rw-r--r--samples/bpf/bpf_helpers.h2
-rw-r--r--samples/bpf/sampleip_kern.c2
-rwxr-xr-xsamples/bpf/tc_l2_redirect.sh173
-rw-r--r--samples/bpf/tc_l2_redirect_kern.c236
-rw-r--r--samples/bpf/tc_l2_redirect_user.c73
-rw-r--r--samples/bpf/trace_event_kern.c2
-rw-r--r--scripts/Makefile.build81
-rw-r--r--scripts/Makefile.extrawarn1
-rw-r--r--scripts/Makefile.ubsan4
-rwxr-xr-xscripts/bloat-o-meter3
-rwxr-xr-xscripts/gcc-x86_64-has-stack-protector.sh2
-rw-r--r--scripts/kconfig/Makefile2
-rw-r--r--security/apparmor/domain.c6
-rw-r--r--sound/soc/atmel/Kconfig10
-rw-r--r--sound/soc/atmel/Makefile2
-rw-r--r--sound/soc/atmel/atmel_ssc_dai.c83
-rw-r--r--sound/soc/atmel/atmel_ssc_dai.h1
-rw-r--r--sound/soc/atmel/atmel_wm8904.c2
-rw-r--r--sound/soc/atmel/tse850-pcm5142.c472
-rw-r--r--sound/soc/bcm/Kconfig1
-rw-r--r--sound/soc/codecs/Kconfig31
-rw-r--r--sound/soc/codecs/Makefile11
-rw-r--r--sound/soc/codecs/ab8500-codec.c2
-rw-r--r--sound/soc/codecs/adau17x1.c2
-rw-r--r--sound/soc/codecs/ak4641.c22
-rw-r--r--sound/soc/codecs/ak4641.h47
-rw-r--r--sound/soc/codecs/arizona.c153
-rw-r--r--sound/soc/codecs/arizona.h109
-rw-r--r--sound/soc/codecs/cs35l34.c1251
-rw-r--r--sound/soc/codecs/cs35l34.h269
-rw-r--r--sound/soc/codecs/cs42l42.c1986
-rw-r--r--sound/soc/codecs/cs42l42.h776
-rw-r--r--sound/soc/codecs/cs42l56.c18
-rw-r--r--sound/soc/codecs/cs42l73.c4
-rw-r--r--sound/soc/codecs/cs42xx8.c10
-rw-r--r--sound/soc/codecs/cs47l24.c55
-rw-r--r--sound/soc/codecs/da7219-aad.c18
-rw-r--r--sound/soc/codecs/da7219.c139
-rw-r--r--sound/soc/codecs/da7219.h5
-rw-r--r--sound/soc/codecs/es8328.h37
-rw-r--r--sound/soc/codecs/msm8916-wcd-analog.c890
-rw-r--r--sound/soc/codecs/msm8916-wcd-digital.c923
-rw-r--r--sound/soc/codecs/nau8825.c142
-rw-r--r--sound/soc/codecs/nau8825.h16
-rw-r--r--sound/soc/codecs/rl6231.c1
-rw-r--r--sound/soc/codecs/rl6347a.c2
-rw-r--r--sound/soc/codecs/rt298.c24
-rw-r--r--sound/soc/codecs/rt5514-spi.c1
-rw-r--r--sound/soc/codecs/rt5514.c17
-rw-r--r--sound/soc/codecs/rt5514.h2
-rw-r--r--sound/soc/codecs/rt5616.c3
-rw-r--r--sound/soc/codecs/rt5640.c5
-rw-r--r--sound/soc/codecs/rt5640.h6
-rw-r--r--sound/soc/codecs/rt5660.c4
-rw-r--r--sound/soc/codecs/rt5660.h3
-rw-r--r--sound/soc/codecs/rt5663.c1137
-rw-r--r--sound/soc/codecs/rt5663.h1162
-rw-r--r--sound/soc/codecs/rt5665.c4874
-rw-r--r--sound/soc/codecs/rt5665.h1990
-rw-r--r--sound/soc/codecs/rt5670.c16
-rw-r--r--sound/soc/codecs/rt5670.h1
-rw-r--r--sound/soc/codecs/rt5677-spi.c1
-rw-r--r--sound/soc/codecs/stac9766.c162
-rw-r--r--sound/soc/codecs/stac9766.h17
-rw-r--r--sound/soc/codecs/sti-sas.c179
-rw-r--r--sound/soc/codecs/tlv320aic31xx.c3
-rw-r--r--sound/soc/codecs/tlv320aic31xx.h1
-rw-r--r--sound/soc/codecs/tlv320aic3x.c2
-rw-r--r--sound/soc/codecs/uda1380.c77
-rw-r--r--sound/soc/codecs/uda1380.h4
-rw-r--r--sound/soc/codecs/wm2200.c4
-rw-r--r--sound/soc/codecs/wm5102.c59
-rw-r--r--sound/soc/codecs/wm5110.c61
-rw-r--r--sound/soc/codecs/wm8523.c24
-rw-r--r--sound/soc/codecs/wm8580.c123
-rw-r--r--sound/soc/codecs/wm8753.h3
-rw-r--r--sound/soc/codecs/wm8978.h2
-rw-r--r--sound/soc/codecs/wm8997.c39
-rw-r--r--sound/soc/codecs/wm8998.c38
-rw-r--r--sound/soc/codecs/wm9081.c2
-rw-r--r--sound/soc/codecs/wm9705.c138
-rw-r--r--sound/soc/codecs/wm9705.h11
-rw-r--r--sound/soc/codecs/wm9712.c177
-rw-r--r--sound/soc/codecs/wm9712.h11
-rw-r--r--sound/soc/codecs/wm9713.c2
-rw-r--r--sound/soc/codecs/wm9713.h4
-rw-r--r--sound/soc/codecs/wm_adsp.c354
-rw-r--r--sound/soc/codecs/wm_adsp.h27
-rw-r--r--sound/soc/codecs/wmfw.h4
-rw-r--r--sound/soc/fsl/Kconfig1
-rw-r--r--sound/soc/fsl/efika-audio-fabric.c1
-rw-r--r--sound/soc/fsl/fsl-asoc-card.c2
-rw-r--r--sound/soc/fsl/imx-wm8962.c2
-rw-r--r--sound/soc/generic/simple-card-utils.c5
-rw-r--r--sound/soc/generic/simple-card.c2
-rw-r--r--sound/soc/generic/simple-scu-card.c115
-rw-r--r--sound/soc/intel/atom/sst-atom-controls.c2
-rw-r--r--sound/soc/intel/atom/sst-mfld-platform-pcm.c6
-rw-r--r--sound/soc/intel/atom/sst/sst.c39
-rw-r--r--sound/soc/intel/atom/sst/sst.h1
-rw-r--r--sound/soc/intel/atom/sst/sst_acpi.c2
-rw-r--r--sound/soc/intel/atom/sst/sst_ipc.c11
-rw-r--r--sound/soc/intel/atom/sst/sst_stream.c4
-rw-r--r--sound/soc/intel/baytrail/sst-baytrail-ipc.c3
-rw-r--r--sound/soc/intel/boards/bdw-rt5677.c2
-rw-r--r--sound/soc/intel/boards/broadwell.c18
-rw-r--r--sound/soc/intel/boards/bxt_da7219_max98357a.c26
-rw-r--r--sound/soc/intel/boards/bxt_rt298.c4
-rw-r--r--sound/soc/intel/boards/bytcr_rt5640.c68
-rw-r--r--sound/soc/intel/boards/bytcr_rt5651.c4
-rw-r--r--sound/soc/intel/boards/cht_bsw_max98090_ti.c4
-rw-r--r--sound/soc/intel/boards/cht_bsw_rt5645.c10
-rw-r--r--sound/soc/intel/boards/cht_bsw_rt5672.c46
-rw-r--r--sound/soc/intel/boards/haswell.c2
-rw-r--r--sound/soc/intel/boards/mfld_machine.c4
-rw-r--r--sound/soc/intel/boards/skl_nau88l25_max98357a.c6
-rw-r--r--sound/soc/intel/boards/skl_nau88l25_ssm4567.c6
-rw-r--r--sound/soc/intel/boards/skl_rt286.c4
-rw-r--r--sound/soc/intel/common/sst-acpi.h17
-rw-r--r--sound/soc/intel/common/sst-ipc.c85
-rw-r--r--sound/soc/intel/common/sst-ipc.h8
-rw-r--r--sound/soc/intel/common/sst-match-acpi.c57
-rw-r--r--sound/soc/intel/haswell/sst-haswell-ipc.c3
-rw-r--r--sound/soc/intel/skylake/bxt-sst.c145
-rw-r--r--sound/soc/intel/skylake/skl-messages.c39
-rw-r--r--sound/soc/intel/skylake/skl-pcm.c28
-rw-r--r--sound/soc/intel/skylake/skl-sst-cldma.c1
-rw-r--r--sound/soc/intel/skylake/skl-sst-dsp.h12
-rw-r--r--sound/soc/intel/skylake/skl-sst-ipc.c71
-rw-r--r--sound/soc/intel/skylake/skl-sst-ipc.h37
-rw-r--r--sound/soc/intel/skylake/skl-sst-utils.c2
-rw-r--r--sound/soc/intel/skylake/skl-topology.c47
-rw-r--r--sound/soc/intel/skylake/skl-topology.h28
-rw-r--r--sound/soc/intel/skylake/skl.c59
-rw-r--r--sound/soc/intel/skylake/skl.h6
-rw-r--r--sound/soc/kirkwood/armada-370-db.c2
-rw-r--r--sound/soc/mxs/mxs-saif.c13
-rw-r--r--sound/soc/mxs/mxs-sgtl5000.c2
-rw-r--r--sound/soc/pxa/corgi.c6
-rw-r--r--sound/soc/pxa/e740_wm9705.c1
-rw-r--r--sound/soc/pxa/e750_wm9705.c1
-rw-r--r--sound/soc/pxa/e800_wm9712.c1
-rw-r--r--sound/soc/pxa/em-x270.c1
-rw-r--r--sound/soc/pxa/hx4700.c2
-rw-r--r--sound/soc/pxa/magician.c2
-rw-r--r--sound/soc/pxa/mioa701_wm9713.c2
-rw-r--r--sound/soc/pxa/palm27x.c1
-rw-r--r--sound/soc/pxa/poodle.c4
-rw-r--r--sound/soc/pxa/pxa-ssp.h6
-rw-r--r--sound/soc/pxa/pxa2xx-i2s.h3
-rw-r--r--sound/soc/pxa/spitz.c6
-rw-r--r--sound/soc/pxa/tosa.c7
-rw-r--r--sound/soc/qcom/apq8016_sbc.c11
-rw-r--r--sound/soc/qcom/lpass-platform.c50
-rw-r--r--sound/soc/qcom/storm.c2
-rw-r--r--sound/soc/rockchip/rk3399_gru_sound.c8
-rw-r--r--sound/soc/rockchip/rockchip_max98090.c2
-rw-r--r--sound/soc/rockchip/rockchip_rt5645.c2
-rw-r--r--sound/soc/samsung/Kconfig58
-rw-r--r--sound/soc/samsung/Makefile9
-rw-r--r--sound/soc/samsung/ac97.c437
-rw-r--r--sound/soc/samsung/dmaengine.c8
-rw-r--r--sound/soc/samsung/i2s.c8
-rw-r--r--sound/soc/samsung/ln2440sbc_alc650.c72
-rw-r--r--sound/soc/samsung/pcm.c60
-rw-r--r--sound/soc/samsung/regs-ac97.h66
-rw-r--r--sound/soc/samsung/s3c2412-i2s.c2
-rw-r--r--sound/soc/samsung/s3c24xx-i2s.c51
-rw-r--r--sound/soc/samsung/s3c24xx_uda134x.c79
-rw-r--r--sound/soc/samsung/smdk2443_wm9710.c68
-rw-r--r--sound/soc/samsung/smdk_wm8580.c30
-rw-r--r--sound/soc/samsung/smdk_wm8580pcm.c175
-rw-r--r--sound/soc/samsung/smdk_wm9713.c108
-rw-r--r--sound/soc/samsung/tm2_wm5110.c552
-rw-r--r--sound/soc/sh/Kconfig3
-rw-r--r--sound/soc/sh/rcar/adg.c61
-rw-r--r--sound/soc/sh/rcar/core.c175
-rw-r--r--sound/soc/sh/rcar/dma.c295
-rw-r--r--sound/soc/sh/rcar/dvc.c2
-rw-r--r--sound/soc/sh/rcar/gen.c12
-rw-r--r--sound/soc/sh/rcar/rsnd.h156
-rw-r--r--sound/soc/sh/rcar/src.c13
-rw-r--r--sound/soc/sh/rcar/ssi.c28
-rw-r--r--sound/soc/sh/rcar/ssiu.c20
-rw-r--r--sound/soc/soc-compress.c98
-rw-r--r--sound/soc/soc-core.c181
-rw-r--r--sound/soc/soc-dapm.c154
-rw-r--r--sound/soc/soc-generic-dmaengine-pcm.c13
-rw-r--r--sound/soc/soc-pcm.c2
-rw-r--r--sound/soc/soc-topology.c751
-rw-r--r--sound/soc/soc-utils.c199
-rw-r--r--sound/soc/sti/sti_uniperif.c43
-rw-r--r--sound/soc/sti/uniperif.h2
-rw-r--r--sound/soc/sti/uniperif_player.c91
-rw-r--r--sound/soc/sti/uniperif_reader.c41
-rw-r--r--sound/soc/sunxi/Kconfig8
-rw-r--r--sound/soc/sunxi/Makefile1
-rw-r--r--sound/soc/sunxi/sun4i-codec.c867
-rw-r--r--sound/soc/sunxi/sun4i-i2s.c105
-rw-r--r--sound/soc/sunxi/sun8i-codec-analog.c665
-rw-r--r--sound/soc/tegra/tegra_alc5632.c2
-rw-r--r--sound/soc/tegra/tegra_max98090.c2
-rw-r--r--sound/soc/tegra/tegra_rt5640.c2
-rw-r--r--sound/soc/tegra/tegra_rt5677.c2
-rw-r--r--sound/soc/tegra/tegra_sgtl5000.c2
-rw-r--r--sound/soc/tegra/tegra_wm8753.c2
-rw-r--r--sound/soc/tegra/tegra_wm8903.c2
-rw-r--r--sound/soc/tegra/trimslice.c2
-rw-r--r--sound/soc/zte/Kconfig16
-rw-r--r--sound/soc/zte/Makefile4
-rw-r--r--sound/soc/zte/zx-i2s.c (renamed from sound/soc/zte/zx296702-i2s.c)0
-rw-r--r--sound/soc/zte/zx-spdif.c (renamed from sound/soc/zte/zx296702-spdif.c)2
-rw-r--r--sound/sparc/dbri.c27
-rw-r--r--tools/objtool/arch/x86/decode.c2
-rw-r--r--tools/perf/ui/browsers/hists.c48
-rw-r--r--tools/perf/util/hist.c12
-rw-r--r--tools/power/acpi/Makefile.config23
-rw-r--r--tools/power/acpi/Makefile.rules40
-rw-r--r--tools/power/acpi/tools/acpidbg/Makefile4
-rw-r--r--tools/power/acpi/tools/acpidbg/acpidbg.c8
-rw-r--r--tools/power/acpi/tools/acpidump/Makefile12
-rw-r--r--tools/power/cpupower/utils/cpufreq-set.c7
-rw-r--r--tools/testing/nvdimm/Kbuild1
-rw-r--r--tools/testing/nvdimm/test/iomap.c23
-rw-r--r--tools/testing/nvdimm/test/nfit.c236
-rw-r--r--tools/testing/nvdimm/test/nfit_test.h8
-rw-r--r--virt/kvm/arm/pmu.c8
-rw-r--r--virt/kvm/arm/vgic/vgic-mmio.c41
-rw-r--r--virt/kvm/arm/vgic/vgic-mmio.h14
-rw-r--r--virt/kvm/arm/vgic/vgic-v2.c6
-rw-r--r--virt/kvm/arm/vgic/vgic-v3.c6
-rw-r--r--virt/kvm/arm/vgic/vgic.c12
-rw-r--r--virt/kvm/async_pf.c13
-rw-r--r--virt/kvm/kvm_main.c2
1236 files changed, 32483 insertions, 9455 deletions
diff --git a/CREDITS b/CREDITS
index 837367624e45..d7ebdfbc4d4f 100644
--- a/CREDITS
+++ b/CREDITS
@@ -9,7 +9,7 @@
9 Linus 9 Linus
10---------- 10----------
11 11
12M: Matt Mackal 12N: Matt Mackal
13E: mpm@selenic.com 13E: mpm@selenic.com
14D: SLOB slab allocator 14D: SLOB slab allocator
15 15
@@ -1910,7 +1910,7 @@ S: Ra'annana, Israel
1910 1910
1911N: Andi Kleen 1911N: Andi Kleen
1912E: andi@firstfloor.org 1912E: andi@firstfloor.org
1913U: http://www.halobates.de 1913W: http://www.halobates.de
1914D: network, x86, NUMA, various hacks 1914D: network, x86, NUMA, various hacks
1915S: Schwalbenstr. 96 1915S: Schwalbenstr. 96
1916S: 85551 Ottobrunn 1916S: 85551 Ottobrunn
@@ -2089,8 +2089,8 @@ D: ST Microelectronics SPEAr13xx PCI host bridge driver
2089D: Synopsys Designware PCI host bridge driver 2089D: Synopsys Designware PCI host bridge driver
2090 2090
2091N: Gabor Kuti 2091N: Gabor Kuti
2092M: seasons@falcon.sch.bme.hu 2092E: seasons@falcon.sch.bme.hu
2093M: seasons@makosteszta.sote.hu 2093E: seasons@makosteszta.sote.hu
2094D: Original author of software suspend 2094D: Original author of software suspend
2095 2095
2096N: Jaroslav Kysela 2096N: Jaroslav Kysela
diff --git a/Documentation/ABI/testing/sysfs-devices-system-ibm-rtl b/Documentation/ABI/testing/sysfs-devices-system-ibm-rtl
index b82deeaec314..470def06ab0a 100644
--- a/Documentation/ABI/testing/sysfs-devices-system-ibm-rtl
+++ b/Documentation/ABI/testing/sysfs-devices-system-ibm-rtl
@@ -1,4 +1,4 @@
1What: state 1What: /sys/devices/system/ibm_rtl/state
2Date: Sep 2010 2Date: Sep 2010
3KernelVersion: 2.6.37 3KernelVersion: 2.6.37
4Contact: Vernon Mauery <vernux@us.ibm.com> 4Contact: Vernon Mauery <vernux@us.ibm.com>
@@ -10,7 +10,7 @@ Description: The state file allows a means by which to change in and
10Users: The ibm-prtm userspace daemon uses this interface. 10Users: The ibm-prtm userspace daemon uses this interface.
11 11
12 12
13What: version 13What: /sys/devices/system/ibm_rtl/version
14Date: Sep 2010 14Date: Sep 2010
15KernelVersion: 2.6.37 15KernelVersion: 2.6.37
16Contact: Vernon Mauery <vernux@us.ibm.com> 16Contact: Vernon Mauery <vernux@us.ibm.com>
diff --git a/Documentation/ABI/testing/sysfs-platform-sst-atom b/Documentation/ABI/testing/sysfs-platform-sst-atom
new file mode 100644
index 000000000000..0d07c0395660
--- /dev/null
+++ b/Documentation/ABI/testing/sysfs-platform-sst-atom
@@ -0,0 +1,17 @@
1What: /sys/devices/platform/8086%x:00/firmware_version
2Date: November 2016
3KernelVersion: 4.10
4Contact: "Sebastien Guiriec" <sebastien.guiriec@intel.com>
5Description:
6 LPE Firmware version for SST driver on all atom
7 plaforms (BYT/CHT/Merrifield/BSW).
8 If the FW has never been loaded it will display:
9 "FW not yet loaded"
10 If FW has been loaded it will display:
11 "v01.aa.bb.cc"
12 aa: Major version is reflecting SoC version:
13 0d: BYT FW
14 0b: BSW FW
15 07: Merrifield FW
16 bb: Minor version
17 cc: Build version
diff --git a/Documentation/devicetree/bindings/ipmi/aspeed,ast2400-bt-bmc.txt b/Documentation/devicetree/bindings/ipmi/aspeed,ast2400-ibt-bmc.txt
index fbbacd958240..6f28969af9dc 100644
--- a/Documentation/devicetree/bindings/ipmi/aspeed,ast2400-bt-bmc.txt
+++ b/Documentation/devicetree/bindings/ipmi/aspeed,ast2400-ibt-bmc.txt
@@ -6,7 +6,7 @@ perform in-band IPMI communication with their host.
6 6
7Required properties: 7Required properties:
8 8
9- compatible : should be "aspeed,ast2400-bt-bmc" 9- compatible : should be "aspeed,ast2400-ibt-bmc"
10- reg: physical address and size of the registers 10- reg: physical address and size of the registers
11 11
12Optional properties: 12Optional properties:
@@ -17,7 +17,7 @@ Optional properties:
17Example: 17Example:
18 18
19 ibt@1e789140 { 19 ibt@1e789140 {
20 compatible = "aspeed,ast2400-bt-bmc"; 20 compatible = "aspeed,ast2400-ibt-bmc";
21 reg = <0x1e789140 0x18>; 21 reg = <0x1e789140 0x18>;
22 interrupts = <8>; 22 interrupts = <8>;
23 }; 23 };
diff --git a/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt b/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt
index 4e00e859e885..bfa461aaac99 100644
--- a/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt
+++ b/Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.txt
@@ -43,6 +43,9 @@ Optional properties:
43 reset signal present internally in some host controller IC designs. 43 reset signal present internally in some host controller IC designs.
44 See Documentation/devicetree/bindings/reset/reset.txt for details. 44 See Documentation/devicetree/bindings/reset/reset.txt for details.
45 45
46* reset-names: request name for using "resets" property. Must be "reset".
47 (It will be used together with "resets" property.)
48
46* clocks: from common clock binding: handle to biu and ciu clocks for the 49* clocks: from common clock binding: handle to biu and ciu clocks for the
47 bus interface unit clock and the card interface unit clock. 50 bus interface unit clock and the card interface unit clock.
48 51
@@ -103,6 +106,8 @@ board specific portions as listed below.
103 interrupts = <0 75 0>; 106 interrupts = <0 75 0>;
104 #address-cells = <1>; 107 #address-cells = <1>;
105 #size-cells = <0>; 108 #size-cells = <0>;
109 resets = <&rst 20>;
110 reset-names = "reset";
106 }; 111 };
107 112
108[board specific internal DMA resources] 113[board specific internal DMA resources]
diff --git a/Documentation/devicetree/bindings/net/ethernet.txt b/Documentation/devicetree/bindings/net/ethernet.txt
index e1d76812419c..05150957ecfd 100644
--- a/Documentation/devicetree/bindings/net/ethernet.txt
+++ b/Documentation/devicetree/bindings/net/ethernet.txt
@@ -9,10 +9,26 @@ The following properties are common to the Ethernet controllers:
9- max-speed: number, specifies maximum speed in Mbit/s supported by the device; 9- max-speed: number, specifies maximum speed in Mbit/s supported by the device;
10- max-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than 10- max-frame-size: number, maximum transfer unit (IEEE defined MTU), rather than
11 the maximum frame size (there's contradiction in ePAPR). 11 the maximum frame size (there's contradiction in ePAPR).
12- phy-mode: string, operation mode of the PHY interface; supported values are 12- phy-mode: string, operation mode of the PHY interface. This is now a de-facto
13 "mii", "gmii", "sgmii", "qsgmii", "tbi", "rev-mii", "rmii", "rgmii", "rgmii-id", 13 standard property; supported values are:
14 "rgmii-rxid", "rgmii-txid", "rtbi", "smii", "xgmii", "trgmii"; this is now a 14 * "mii"
15 de-facto standard property; 15 * "gmii"
16 * "sgmii"
17 * "qsgmii"
18 * "tbi"
19 * "rev-mii"
20 * "rmii"
21 * "rgmii" (RX and TX delays are added by the MAC when required)
22 * "rgmii-id" (RGMII with internal RX and TX delays provided by the PHY, the
23 MAC should not add the RX or TX delays in this case)
24 * "rgmii-rxid" (RGMII with internal RX delay provided by the PHY, the MAC
25 should not add an RX delay in this case)
26 * "rgmii-txid" (RGMII with internal TX delay provided by the PHY, the MAC
27 should not add an TX delay in this case)
28 * "rtbi"
29 * "smii"
30 * "xgmii"
31 * "trgmii"
16- phy-connection-type: the same as "phy-mode" property but described in ePAPR; 32- phy-connection-type: the same as "phy-mode" property but described in ePAPR;
17- phy-handle: phandle, specifies a reference to a node representing a PHY 33- phy-handle: phandle, specifies a reference to a node representing a PHY
18 device; this property is described in ePAPR and so preferred; 34 device; this property is described in ePAPR and so preferred;
diff --git a/Documentation/devicetree/bindings/pci/rockchip-pcie.txt b/Documentation/devicetree/bindings/pci/rockchip-pcie.txt
index ba67b39939c1..71aeda1ca055 100644
--- a/Documentation/devicetree/bindings/pci/rockchip-pcie.txt
+++ b/Documentation/devicetree/bindings/pci/rockchip-pcie.txt
@@ -26,13 +26,16 @@ Required properties:
26 - "sys" 26 - "sys"
27 - "legacy" 27 - "legacy"
28 - "client" 28 - "client"
29- resets: Must contain five entries for each entry in reset-names. 29- resets: Must contain seven entries for each entry in reset-names.
30 See ../reset/reset.txt for details. 30 See ../reset/reset.txt for details.
31- reset-names: Must include the following names 31- reset-names: Must include the following names
32 - "core" 32 - "core"
33 - "mgmt" 33 - "mgmt"
34 - "mgmt-sticky" 34 - "mgmt-sticky"
35 - "pipe" 35 - "pipe"
36 - "pm"
37 - "aclk"
38 - "pclk"
36- pinctrl-names : The pin control state names 39- pinctrl-names : The pin control state names
37- pinctrl-0: The "default" pinctrl state 40- pinctrl-0: The "default" pinctrl state
38- #interrupt-cells: specifies the number of cells needed to encode an 41- #interrupt-cells: specifies the number of cells needed to encode an
@@ -86,8 +89,10 @@ pcie0: pcie@f8000000 {
86 reg = <0x0 0xf8000000 0x0 0x2000000>, <0x0 0xfd000000 0x0 0x1000000>; 89 reg = <0x0 0xf8000000 0x0 0x2000000>, <0x0 0xfd000000 0x0 0x1000000>;
87 reg-names = "axi-base", "apb-base"; 90 reg-names = "axi-base", "apb-base";
88 resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>, 91 resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
89 <&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>; 92 <&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE> ,
90 reset-names = "core", "mgmt", "mgmt-sticky", "pipe"; 93 <&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>, <&cru SRST_A_PCIE>;
94 reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
95 "pm", "pclk", "aclk";
91 phys = <&pcie_phy>; 96 phys = <&pcie_phy>;
92 phy-names = "pcie-phy"; 97 phy-names = "pcie-phy";
93 pinctrl-names = "default"; 98 pinctrl-names = "default";
diff --git a/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.txt b/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.txt
index f9753c416974..b24583aa34c3 100644
--- a/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.txt
+++ b/Documentation/devicetree/bindings/pinctrl/st,stm32-pinctrl.txt
@@ -14,11 +14,6 @@ Required properies:
14 - #size-cells : The value of this property must be 1 14 - #size-cells : The value of this property must be 1
15 - ranges : defines mapping between pin controller node (parent) to 15 - ranges : defines mapping between pin controller node (parent) to
16 gpio-bank node (children). 16 gpio-bank node (children).
17 - interrupt-parent: phandle of the interrupt parent to which the external
18 GPIO interrupts are forwarded to.
19 - st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
20 which includes IRQ mux selection register, and the offset of the IRQ mux
21 selection register.
22 - pins-are-numbered: Specify the subnodes are using numbered pinmux to 17 - pins-are-numbered: Specify the subnodes are using numbered pinmux to
23 specify pins. 18 specify pins.
24 19
@@ -37,6 +32,11 @@ Required properties:
37 32
38Optional properties: 33Optional properties:
39 - reset: : Reference to the reset controller 34 - reset: : Reference to the reset controller
35 - interrupt-parent: phandle of the interrupt parent to which the external
36 GPIO interrupts are forwarded to.
37 - st,syscfg: Should be phandle/offset pair. The phandle to the syscon node
38 which includes IRQ mux selection register, and the offset of the IRQ mux
39 selection register.
40 40
41Example: 41Example:
42#include <dt-bindings/pinctrl/stm32f429-pinfunc.h> 42#include <dt-bindings/pinctrl/stm32f429-pinfunc.h>
diff --git a/Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt b/Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt
new file mode 100644
index 000000000000..5b9b38f578bb
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/axentia,tse850-pcm5142.txt
@@ -0,0 +1,88 @@
1Devicetree bindings for the Axentia TSE-850 audio complex
2
3Required properties:
4 - compatible: "axentia,tse850-pcm5142"
5 - axentia,ssc-controller: The phandle of the atmel SSC controller used as
6 cpu dai.
7 - axentia,audio-codec: The phandle of the PCM5142 codec.
8 - axentia,add-gpios: gpio specifier that controls the mixer.
9 - axentia,loop1-gpios: gpio specifier that controls loop relays on channel 1.
10 - axentia,loop2-gpios: gpio specifier that controls loop relays on channel 2.
11 - axentia,ana-supply: Regulator that supplies the output amplifier. Must
12 support voltages in the 2V - 20V range, in 1V steps.
13
14The schematics explaining the gpios are as follows:
15
16 loop1 relays
17 IN1 +---o +------------+ o---+ OUT1
18 \ /
19 + +
20 | / |
21 +--o +--. |
22 | add | |
23 | V |
24 | .---. |
25 DAC +----------->|Sum|---+
26 | '---' |
27 | |
28 + +
29
30 IN2 +---o--+------------+--o---+ OUT2
31 loop2 relays
32
33The 'loop1' gpio pin controlls two relays, which are either in loop position,
34meaning that input and output are directly connected, or they are in mixer
35position, meaning that the signal is passed through the 'Sum' mixer. Similarly
36for 'loop2'.
37
38In the above, the 'loop1' relays are inactive, thus feeding IN1 to the mixer
39(if 'add' is active) and feeding the mixer output to OUT1. The 'loop2' relays
40are active, short-cutting the TSE-850 from channel 2. IN1, IN2, OUT1 and OUT2
41are TSE-850 connectors and DAC is the PCB name of the (filtered) output from
42the PCM5142 codec.
43
44Example:
45
46 &i2c {
47 codec: pcm5142@4c {
48 compatible = "ti,pcm5142";
49
50 reg = <0x4c>;
51
52 AVDD-supply = <&reg_3v3>;
53 DVDD-supply = <&reg_3v3>;
54 CPVDD-supply = <&reg_3v3>;
55
56 clocks = <&sck>;
57
58 pll-in = <3>;
59 pll-out = <6>;
60 };
61 };
62
63 ana: ana-reg {
64 compatible = "pwm-regulator";
65
66 regulator-name = "ANA";
67
68 pwms = <&pwm0 2 1000 PWM_POLARITY_INVERTED>;
69 pwm-dutycycle-unit = <1000>;
70 pwm-dutycycle-range = <100 1000>;
71
72 regulator-min-microvolt = <2000000>;
73 regulator-max-microvolt = <20000000>;
74 regulator-ramp-delay = <1000>;
75 };
76
77 sound {
78 compatible = "axentia,tse850-pcm5142";
79
80 axentia,ssc-controller = <&ssc0>;
81 axentia,audio-codec = <&codec>;
82
83 axentia,add-gpios = <&pioA 8 GPIO_ACTIVE_LOW>;
84 axentia,loop1-gpios = <&pioA 10 GPIO_ACTIVE_LOW>;
85 axentia,loop2-gpios = <&pioA 11 GPIO_ACTIVE_LOW>;
86
87 axentia,ana-supply = <&ana>;
88 };
diff --git a/Documentation/devicetree/bindings/sound/cs35l34.txt b/Documentation/devicetree/bindings/sound/cs35l34.txt
new file mode 100644
index 000000000000..b218ead2e68e
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/cs35l34.txt
@@ -0,0 +1,64 @@
1CS35L34 Speaker Amplifier
2
3Required properties:
4
5 - compatible : "cirrus,cs35l34"
6
7 - reg : the I2C address of the device for I2C.
8
9 - VA-supply, VP-supply : power supplies for the device,
10 as covered in
11 Documentation/devicetree/bindings/regulator/regulator.txt.
12
13 - cirrus,boost-vtge-millivolt : Boost Voltage Value. Configures the boost
14 converter's output voltage in mV. The range is from VP to 8V with
15 increments of 100mV.
16
17 - cirrus,boost-nanohenry: Inductor value for boost converter. The value is
18 in nH and they can be values of 1000nH, 1100nH, 1200nH, 1500nH, and 2200nH.
19
20Optional properties:
21
22 - reset-gpios: GPIO used to reset the amplifier.
23
24 - interrupt-parent : Specifies the phandle of the interrupt controller to
25 which the IRQs from CS35L34 are delivered to.
26 - interrupts : IRQ line info CS35L34.
27 (See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
28 for further information relating to interrupt properties)
29
30 - cirrus,boost-peak-milliamp : Boost converter peak current limit in mA. The
31 range starts at 1200mA and goes to a maximum of 3840mA with increments of
32 80mA. The default value is 2480mA.
33
34 - cirrus,i2s-sdinloc : ADSP SDIN I2S channel location. Indicates whether the
35 received mono data is in the left or right portion of the I2S frame
36 according to the AD0 pin or directly via this configuration.
37 0x0 (Default) = Selected by AD0 input (if AD0 = LOW, use left channel),
38 0x2 = Left,
39 0x1 = Selected by the inversion of the AD0 input (if AD0 = LOW, use right
40 channel),
41 0x3 = Right.
42
43 - cirrus,gain-zc-disable: Boolean property. If set, the gain change will take
44 effect without waiting for a zero cross.
45
46 - cirrus,tdm-rising-edge: Boolean property. If set, data is on the rising edge of
47 SCLK. Otherwise, data is on the falling edge of SCLK.
48
49
50Example:
51
52cs35l34: cs35l34@40 {
53 compatible = "cirrus,cs35l34";
54 reg = <0x40>;
55
56 interrupt-parent = <&gpio8>;
57 interrupts = <3 IRQ_TYPE_LEVEL_LOW>;
58
59 reset-gpios = <&gpio 10 0>;
60
61 cirrus,boost-vtge-milltvolt = <8000>; /* 8V */
62 cirrus,boost-ind-nanohenry = <1000>; /* 1uH */
63 cirrus,boost-peak-milliamp = <3000>; /* 3A */
64};
diff --git a/Documentation/devicetree/bindings/sound/cs42l42.txt b/Documentation/devicetree/bindings/sound/cs42l42.txt
new file mode 100644
index 000000000000..9a2c5e2423d5
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/cs42l42.txt
@@ -0,0 +1,110 @@
1CS42L42 audio CODEC
2
3Required properties:
4
5 - compatible : "cirrus,cs42l42"
6
7 - reg : the I2C address of the device for I2C.
8
9 - VP-supply, VCP-supply, VD_FILT-supply, VL-supply, VA-supply :
10 power supplies for the device, as covered in
11 Documentation/devicetree/bindings/regulator/regulator.txt.
12
13Optional properties:
14
15 - reset-gpios : a GPIO spec for the reset pin. If specified, it will be
16 deasserted before communication to the codec starts.
17
18 - interrupt-parent : Specifies the phandle of the interrupt controller to
19 which the IRQs from CS42L42 are delivered to.
20
21 - interrupts : IRQ line info CS42L42.
22 (See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
23 for further information relating to interrupt properties)
24
25 - cirrus,ts-inv : Boolean property. For jacks that invert the tip sense
26 polarity. Normal jacks will short tip sense pin to HS1 when headphones are
27 plugged in and leave tip sense floating when not plugged in. Inverting jacks
28 short tip sense when unplugged and float when plugged in.
29
30 0 = (Default) Non-inverted
31 1 = Inverted
32
33 - cirrus,ts-dbnc-rise : Debounce the rising edge of TIP_SENSE_PLUG. With no
34 debounce, the tip sense pin might be noisy on a plug event.
35
36 0 - 0ms,
37 1 - 125ms,
38 2 - 250ms,
39 3 - 500ms,
40 4 - 750ms,
41 5 - (Default) 1s,
42 6 - 1.25s,
43 7 - 1.5s,
44
45 - cirrus,ts-dbnc-fall : Debounce the falling edge of TIP_SENSE_UNPLUG.
46 With no debounce, the tip sense pin might be noisy on an unplug event.
47
48 0 - 0ms,
49 1 - 125ms,
50 2 - 250ms,
51 3 - 500ms,
52 4 - 750ms,
53 5 - (Default) 1s,
54 6 - 1.25s,
55 7 - 1.5s,
56
57 - cirrus,btn-det-init-dbnce : This sets how long the driver sleeps after
58 enabling button detection interrupts. After auto-detection and before
59 servicing button interrupts, the HS bias needs time to settle. If you
60 don't wait, there is possibility for erroneous button interrupt.
61
62 0ms - 200ms,
63 Default = 100ms
64
65 - cirrus,btn-det-event-dbnce : This sets how long the driver delays after
66 receiving a button press interrupt. With level detect interrupts, you want
67 to wait a small amount of time to make sure the button press is making a
68 clean connection with the bias resistors.
69
70 0ms - 20ms,
71 Default = 10ms
72
73 - cirrus,bias-lvls : For a level-detect headset button scheme, each button
74 will bias the mic pin to a certain voltage. To determine which button was
75 pressed, the driver will compare this biased voltage to sequential,
76 decreasing voltages and will stop when a comparator is tripped,
77 indicating a comparator voltage < bias voltage. This value represents a
78 percentage of the internally generated HS bias voltage. For different
79 hardware setups, a designer might want to tweak this. This is an array of
80 descending values for the comparator voltage.
81
82 Array of 4 values
83 Each 0-63
84 < x1 x2 x3 x4 >
85 Default = < 15 8 4 1>
86
87
88Example:
89
90cs42l42: cs42l42@48 {
91 compatible = "cirrus,cs42l42";
92 reg = <0x48>;
93 VA-supply = <&dummy_vreg>;
94 VP-supply = <&dummy_vreg>;
95 VCP-supply = <&dummy_vreg>;
96 VD_FILT-supply = <&dummy_vreg>;
97 VL-supply = <&dummy_vreg>;
98
99 reset-gpios = <&axi_gpio_0 1 0>;
100 interrupt-parent = <&gpio0>;
101 interrupts = <55 8>
102
103 cirrus,ts-inv = <0x00>;
104 cirrus,ts-dbnc-rise = <0x05>;
105 cirrus,ts-dbnc-fall = <0x00>;
106 cirrus,btn-det-init-dbnce = <100>;
107 cirrus,btn-det-event-dbnce = <10>;
108 cirrus,bias-lvls = <0x0F 0x08 0x04 0x01>;
109 cirrus,hs-bias-ramp-rate = <0x02>;
110}; \ No newline at end of file
diff --git a/Documentation/devicetree/bindings/sound/davinci-mcbsp.txt b/Documentation/devicetree/bindings/sound/davinci-mcbsp.txt
index 55b53e1fd72c..e0b6165c9cfc 100644
--- a/Documentation/devicetree/bindings/sound/davinci-mcbsp.txt
+++ b/Documentation/devicetree/bindings/sound/davinci-mcbsp.txt
@@ -43,7 +43,7 @@ mcbsp0: mcbsp@1d10000 {
43 <0x00310000 0x1000>; 43 <0x00310000 0x1000>;
44 reg-names = "mpu", "dat"; 44 reg-names = "mpu", "dat";
45 interrupts = <97 98>; 45 interrupts = <97 98>;
46 interrupts-names = "rx", "tx"; 46 interrupt-names = "rx", "tx";
47 dmas = <&edma0 3 1 47 dmas = <&edma0 3 1
48 &edma0 2 1>; 48 &edma0 2 1>;
49 dma-names = "tx", "rx"; 49 dma-names = "tx", "rx";
diff --git a/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt b/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
index fd40c852d7c7..462b04e8209f 100644
--- a/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
+++ b/Documentation/devicetree/bindings/sound/omap-abe-twl6040.txt
@@ -12,7 +12,7 @@ Required properties:
12 12
13Optional properties: 13Optional properties:
14- ti,dmic: phandle for the OMAP dmic node if the machine have it connected 14- ti,dmic: phandle for the OMAP dmic node if the machine have it connected
15- ti,jack_detection: Need to be present if the board capable to detect jack 15- ti,jack-detection: Need to be present if the board capable to detect jack
16 insertion, removal. 16 insertion, removal.
17 17
18Available audio endpoints for the audio-routing table: 18Available audio endpoints for the audio-routing table:
diff --git a/Documentation/devicetree/bindings/sound/qcom,apq8016-sbc.txt b/Documentation/devicetree/bindings/sound/qcom,apq8016-sbc.txt
index d9d8635ff94c..6a4aadc4ce06 100644
--- a/Documentation/devicetree/bindings/sound/qcom,apq8016-sbc.txt
+++ b/Documentation/devicetree/bindings/sound/qcom,apq8016-sbc.txt
@@ -44,8 +44,7 @@ Required dai-link subnodes:
44Required CPU/CODEC subnodes properties: 44Required CPU/CODEC subnodes properties:
45 45
46-link-name : Name of the dai link. 46-link-name : Name of the dai link.
47-sound-dai : phandle and port of CPU/CODEC 47-sound-dai : phandle/s and port of CPU/CODEC
48-capture-dai : phandle and port of CPU/CODEC
49 48
50Example: 49Example:
51 50
@@ -73,7 +72,7 @@ sound: sound {
73 sound-dai = <&lpass MI2S_PRIMARY>; 72 sound-dai = <&lpass MI2S_PRIMARY>;
74 }; 73 };
75 codec { 74 codec {
76 sound-dai = <&wcd_codec 0>; 75 sound-dai = <&lpass_codec 0>, <&wcd_codec 0>;
77 }; 76 };
78 }; 77 };
79 78
diff --git a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
new file mode 100644
index 000000000000..ccb401cfef9d
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-analog.txt
@@ -0,0 +1,85 @@
1msm8916 analog audio CODEC
2
3Bindings for codec Analog IP which is integrated in pmic pm8916,
4
5## Bindings for codec core on pmic:
6
7Required properties
8 - compatible = "qcom,pm8916-wcd-analog-codec";
9 - reg: represents the slave base address provided to the peripheral.
10 - interrupt-parent : The parent interrupt controller.
11 - interrupts: List of interrupts in given SPMI peripheral.
12 - interrupt-names: Names specified to above list of interrupts in same
13 order. List of supported interrupt names are:
14 "cdc_spk_cnp_int" - Speaker click and pop interrupt.
15 "cdc_spk_clip_int" - Speaker clip interrupt.
16 "cdc_spk_ocp_int" - Speaker over current protect interrupt.
17 "mbhc_ins_rem_det1" - jack insert removal detect interrupt 1.
18 "mbhc_but_rel_det" - button release interrupt.
19 "mbhc_but_press_det" - button press event
20 "mbhc_ins_rem_det" - jack insert removal detect interrupt.
21 "mbhc_switch_int" - multi button headset interrupt.
22 "cdc_ear_ocp_int" - Earphone over current protect interrupt.
23 "cdc_hphr_ocp_int" - Headphone R over current protect interrupt.
24 "cdc_hphl_ocp_det" - Headphone L over current protect interrupt.
25 "cdc_ear_cnp_int" - earphone cnp interrupt.
26 "cdc_hphr_cnp_int" - hphr click and pop interrupt.
27 "cdc_hphl_cnp_int" - hphl click and pop interrupt.
28
29 - clocks: Handle to mclk.
30 - clock-names: should be "mclk"
31 - vdd-cdc-io-supply: phandle to VDD_CDC_IO regulator DT node.
32 - vdd-cdc-tx-rx-cx-supply: phandle to VDD_CDC_TX/RX/CX regulator DT node.
33 - vdd-micbias-supply: phandle of VDD_MICBIAS supply's regulator DT node.
34
35Optional Properties:
36- qcom,micbias1-ext-cap: boolean, present if micbias1 has external capacitor
37 connected.
38- qcom,micbias2-ext-cap: boolean, present if micbias2 has external capacitor
39 connected.
40
41Example:
42
43spmi_bus {
44 ...
45 audio-codec@f000{
46 compatible = "qcom,pm8916-wcd-analog-codec";
47 reg = <0xf000 0x200>;
48 reg-names = "pmic-codec-core";
49 clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>;
50 clock-names = "mclk";
51 interrupt-parent = <&spmi_bus>;
52 interrupts = <0x1 0xf0 0x0 IRQ_TYPE_NONE>,
53 <0x1 0xf0 0x1 IRQ_TYPE_NONE>,
54 <0x1 0xf0 0x2 IRQ_TYPE_NONE>,
55 <0x1 0xf0 0x3 IRQ_TYPE_NONE>,
56 <0x1 0xf0 0x4 IRQ_TYPE_NONE>,
57 <0x1 0xf0 0x5 IRQ_TYPE_NONE>,
58 <0x1 0xf0 0x6 IRQ_TYPE_NONE>,
59 <0x1 0xf0 0x7 IRQ_TYPE_NONE>,
60 <0x1 0xf1 0x0 IRQ_TYPE_NONE>,
61 <0x1 0xf1 0x1 IRQ_TYPE_NONE>,
62 <0x1 0xf1 0x2 IRQ_TYPE_NONE>,
63 <0x1 0xf1 0x3 IRQ_TYPE_NONE>,
64 <0x1 0xf1 0x4 IRQ_TYPE_NONE>,
65 <0x1 0xf1 0x5 IRQ_TYPE_NONE>;
66 interrupt-names = "cdc_spk_cnp_int",
67 "cdc_spk_clip_int",
68 "cdc_spk_ocp_int",
69 "mbhc_ins_rem_det1",
70 "mbhc_but_rel_det",
71 "mbhc_but_press_det",
72 "mbhc_ins_rem_det",
73 "mbhc_switch_int",
74 "cdc_ear_ocp_int",
75 "cdc_hphr_ocp_int",
76 "cdc_hphl_ocp_det",
77 "cdc_ear_cnp_int",
78 "cdc_hphr_cnp_int",
79 "cdc_hphl_cnp_int";
80 VDD-CDC-IO-supply = <&pm8916_l5>;
81 VDD-CDC-TX-RX-CX-supply = <&pm8916_l5>;
82 VDD-MICBIAS-supply = <&pm8916_l13>;
83 #sound-dai-cells = <1>;
84 };
85};
diff --git a/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital.txt b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital.txt
new file mode 100644
index 000000000000..1c8e4cb25176
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/qcom,msm8916-wcd-digital.txt
@@ -0,0 +1,20 @@
1msm8916 digital audio CODEC
2
3## Bindings for codec core in lpass:
4
5Required properties
6 - compatible = "qcom,msm8916-wcd-digital-codec";
7 - reg: address space for lpass codec.
8 - clocks: Handle to mclk and ahbclk
9 - clock-names: should be "mclk", "ahbix-clk".
10
11Example:
12
13audio-codec@771c000{
14 compatible = "qcom,msm8916-wcd-digital-codec";
15 reg = <0x0771c000 0x400>;
16 clocks = <&gcc GCC_ULTAUDIO_AHBFABRIC_IXFABRIC_CLK>,
17 <&gcc GCC_CODEC_DIGCODEC_CLK>;
18 clock-names = "ahbix-clk", "mclk";
19 #sound-dai-cells = <1>;
20};
diff --git a/Documentation/devicetree/bindings/sound/rt5514.txt b/Documentation/devicetree/bindings/sound/rt5514.txt
index 9cabfc18cb57..929ca6756b02 100644
--- a/Documentation/devicetree/bindings/sound/rt5514.txt
+++ b/Documentation/devicetree/bindings/sound/rt5514.txt
@@ -13,6 +13,9 @@ Optional properties:
13- clocks: The phandle of the master clock to the CODEC 13- clocks: The phandle of the master clock to the CODEC
14- clock-names: Should be "mclk" 14- clock-names: Should be "mclk"
15 15
16- realtek,dmic-init-delay-ms
17 Set the DMIC initial delay (ms) to wait it ready.
18
16Pins on the device (for linking into audio routes) for RT5514: 19Pins on the device (for linking into audio routes) for RT5514:
17 20
18 * DMIC1L 21 * DMIC1L
diff --git a/Documentation/devicetree/bindings/sound/rt5663.txt b/Documentation/devicetree/bindings/sound/rt5663.txt
index 7d3c974c6e2e..70eaeaed2b18 100644
--- a/Documentation/devicetree/bindings/sound/rt5663.txt
+++ b/Documentation/devicetree/bindings/sound/rt5663.txt
@@ -1,10 +1,10 @@
1RT5663/RT5668 audio CODEC 1RT5663 audio CODEC
2 2
3This device supports I2C only. 3This device supports I2C only.
4 4
5Required properties: 5Required properties:
6 6
7- compatible : One of "realtek,rt5663" or "realtek,rt5668". 7- compatible : "realtek,rt5663".
8 8
9- reg : The I2C address of the device. 9- reg : The I2C address of the device.
10 10
@@ -12,7 +12,7 @@ Required properties:
12 12
13Optional properties: 13Optional properties:
14 14
15Pins on the device (for linking into audio routes) for RT5663/RT5668: 15Pins on the device (for linking into audio routes) for RT5663:
16 16
17 * IN1P 17 * IN1P
18 * IN1N 18 * IN1N
diff --git a/Documentation/devicetree/bindings/sound/rt5665.txt b/Documentation/devicetree/bindings/sound/rt5665.txt
new file mode 100755
index 000000000000..419c89219681
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/rt5665.txt
@@ -0,0 +1,68 @@
1RT5665/RT5666/RT5668 audio CODEC
2
3This device supports I2C only.
4
5Required properties:
6
7- compatible : One of "realtek,rt5665", "realtek,rt5666" or "realtek,rt5668".
8
9- reg : The I2C address of the device.
10
11- interrupts : The CODEC's interrupt output.
12
13Optional properties:
14
15- realtek,in1-differential
16- realtek,in2-differential
17- realtek,in3-differential
18- realtek,in4-differential
19 Boolean. Indicate MIC1/2/3/4 input are differential, rather than single-ended.
20
21- realtek,dmic1-data-pin
22 0: dmic1 is not used
23 1: using GPIO4 pin as dmic1 data pin
24 2: using IN2N pin as dmic2 data pin
25
26- realtek,dmic2-data-pin
27 0: dmic2 is not used
28 1: using GPIO5 pin as dmic2 data pin
29 2: using IN2P pin as dmic2 data pin
30
31- realtek,jd-src
32 0: No JD is used
33 1: using JD1 as JD source
34
35- realtek,ldo1-en-gpios : The GPIO that controls the CODEC's LDO1_EN pin.
36
37Pins on the device (for linking into audio routes) for RT5659/RT5658:
38
39 * DMIC L1
40 * DMIC R1
41 * DMIC L2
42 * DMIC R2
43 * IN1P
44 * IN1N
45 * IN2P
46 * IN2N
47 * IN3P
48 * IN3N
49 * IN4P
50 * IN4N
51 * HPOL
52 * HPOR
53 * LOUTL
54 * LOUTR
55 * MONOOUT
56 * PDML
57 * PDMR
58
59Example:
60
61rt5659 {
62 compatible = "realtek,rt5665";
63 reg = <0x1b>;
64 interrupt-parent = <&gpio>;
65 interrupts = <TEGRA_GPIO(W, 3) GPIO_ACTIVE_HIGH>;
66 realtek,ldo1-en-gpios =
67 <&gpio TEGRA_GPIO(V, 3) GPIO_ACTIVE_HIGH>;
68};
diff --git a/Documentation/devicetree/bindings/sound/samsung,tm2-audio.txt b/Documentation/devicetree/bindings/sound/samsung,tm2-audio.txt
new file mode 100644
index 000000000000..94442e5673b3
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/samsung,tm2-audio.txt
@@ -0,0 +1,38 @@
1Samsung Exynos5433 TM2(E) audio complex with WM5110 codec
2
3Required properties:
4
5 - compatible : "samsung,tm2-audio"
6 - model : the user-visible name of this sound complex
7 - audio-codec : the phandle of the wm5110 audio codec node,
8 as described in ../mfd/arizona.txt
9 - i2s-controller : the phandle of the I2S controller
10 - audio-amplifier : the phandle of the MAX98504 amplifier
11 - samsung,audio-routing : a list of the connections between audio components;
12 each entry is a pair of strings, the first being the
13 connection's sink, the second being the connection's
14 source; valid names for sources and sinks are the
15 WM5110's and MAX98504's pins and the jacks on the
16 board: HP, SPK, Main Mic, Sub Mic, Third Mic,
17 Headset Mic
18 - mic-bias-gpios : GPIO pin that enables the Main Mic bias regulator
19
20
21Example:
22
23sound {
24 compatible = "samsung,tm2-audio";
25 audio-codec = <&wm5110>;
26 i2s-controller = <&i2s0>;
27 audio-amplifier = <&max98504>;
28 mic-bias-gpios = <&gpr3 2 0>;
29 model = "wm5110";
30 samsung,audio-routing =
31 "HP", "HPOUT1L",
32 "HP", "HPOUT1R",
33 "SPK", "SPKOUT",
34 "SPKOUT", "HPOUT2L",
35 "SPKOUT", "HPOUT2R",
36 "Main Mic", "MICBIAS2",
37 "IN1R", "Main Mic";
38};
diff --git a/Documentation/devicetree/bindings/sound/sun4i-codec.txt b/Documentation/devicetree/bindings/sound/sun4i-codec.txt
index 0dce690f78f5..3033bd8aab0f 100644
--- a/Documentation/devicetree/bindings/sound/sun4i-codec.txt
+++ b/Documentation/devicetree/bindings/sound/sun4i-codec.txt
@@ -1,8 +1,12 @@
1* Allwinner A10 Codec 1* Allwinner A10 Codec
2 2
3Required properties: 3Required properties:
4- compatible: must be either "allwinner,sun4i-a10-codec" or 4- compatible: must be one of the following compatibles:
5 "allwinner,sun7i-a20-codec" 5 - "allwinner,sun4i-a10-codec"
6 - "allwinner,sun6i-a31-codec"
7 - "allwinner,sun7i-a20-codec"
8 - "allwinner,sun8i-a23-codec"
9 - "allwinner,sun8i-h3-codec"
6- reg: must contain the registers location and length 10- reg: must contain the registers location and length
7- interrupts: must contain the codec interrupt 11- interrupts: must contain the codec interrupt
8- dmas: DMA channels for tx and rx dma. See the DMA client binding, 12- dmas: DMA channels for tx and rx dma. See the DMA client binding,
@@ -17,6 +21,43 @@ Required properties:
17Optional properties: 21Optional properties:
18- allwinner,pa-gpios: gpio to enable external amplifier 22- allwinner,pa-gpios: gpio to enable external amplifier
19 23
24Required properties for the following compatibles:
25 - "allwinner,sun6i-a31-codec"
26 - "allwinner,sun8i-a23-codec"
27 - "allwinner,sun8i-h3-codec"
28- resets: phandle to the reset control for this device
29- allwinner,audio-routing: A list of the connections between audio components.
30 Each entry is a pair of strings, the first being the
31 connection's sink, the second being the connection's
32 source. Valid names include:
33
34 Audio pins on the SoC:
35 "HP"
36 "HPCOM"
37 "LINEIN"
38 "LINEOUT" (not on sun8i-a23)
39 "MIC1"
40 "MIC2"
41 "MIC3" (sun6i-a31 only)
42
43 Microphone biases from the SoC:
44 "HBIAS"
45 "MBIAS"
46
47 Board connectors:
48 "Headphone"
49 "Headset Mic"
50 "Line In"
51 "Line Out"
52 "Mic"
53 "Speaker"
54
55Required properties for the following compatibles:
56 - "allwinner,sun8i-a23-codec"
57 - "allwinner,sun8i-h3-codec"
58- allwinner,codec-analog-controls: A phandle to the codec analog controls
59 block in the PRCM.
60
20Example: 61Example:
21codec: codec@01c22c00 { 62codec: codec@01c22c00 {
22 #sound-dai-cells = <0>; 63 #sound-dai-cells = <0>;
@@ -28,3 +69,23 @@ codec: codec@01c22c00 {
28 dmas = <&dma 0 19>, <&dma 0 19>; 69 dmas = <&dma 0 19>, <&dma 0 19>;
29 dma-names = "rx", "tx"; 70 dma-names = "rx", "tx";
30}; 71};
72
73codec: codec@01c22c00 {
74 #sound-dai-cells = <0>;
75 compatible = "allwinner,sun6i-a31-codec";
76 reg = <0x01c22c00 0x98>;
77 interrupts = <GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>;
78 clocks = <&ccu CLK_APB1_CODEC>, <&ccu CLK_CODEC>;
79 clock-names = "apb", "codec";
80 resets = <&ccu RST_APB1_CODEC>;
81 dmas = <&dma 15>, <&dma 15>;
82 dma-names = "rx", "tx";
83 allwinner,audio-routing =
84 "Headphone", "HP",
85 "Speaker", "LINEOUT",
86 "LINEIN", "Line In",
87 "MIC1", "MBIAS",
88 "MIC1", "Mic",
89 "MIC2", "HBIAS",
90 "MIC2", "Headset Mic";
91};
diff --git a/Documentation/devicetree/bindings/sound/sun8i-codec-analog.txt b/Documentation/devicetree/bindings/sound/sun8i-codec-analog.txt
new file mode 100644
index 000000000000..779b735781ba
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/sun8i-codec-analog.txt
@@ -0,0 +1,16 @@
1* Allwinner Codec Analog Controls
2
3Required properties:
4- compatible: must be one of the following compatibles:
5 - "allwinner,sun8i-a23-codec-analog"
6 - "allwinner,sun8i-h3-codec-analog"
7
8Required properties if not a sub-node of the PRCM node:
9- reg: must contain the registers location and length
10
11Example:
12prcm: prcm@01f01400 {
13 codec_analog: codec-analog {
14 compatible = "allwinner,sun8i-a23-codec-analog";
15 };
16};
diff --git a/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt b/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt
index 9340d2ddcc54..6fbba562eaa7 100644
--- a/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt
+++ b/Documentation/devicetree/bindings/sound/tlv320aic31xx.txt
@@ -12,6 +12,7 @@ Required properties:
12 "ti,tlv320aic3120" - TLV320AIC3120 (mono speaker amp, MiniDSP) 12 "ti,tlv320aic3120" - TLV320AIC3120 (mono speaker amp, MiniDSP)
13 "ti,tlv320aic3111" - TLV320AIC3111 (stereo speaker amp, MiniDSP) 13 "ti,tlv320aic3111" - TLV320AIC3111 (stereo speaker amp, MiniDSP)
14 "ti,tlv320dac3100" - TLV320DAC3100 (no ADC, mono speaker amp, no MiniDSP) 14 "ti,tlv320dac3100" - TLV320DAC3100 (no ADC, mono speaker amp, no MiniDSP)
15 "ti,tlv320dac3101" - TLV320DAC3101 (no ADC, stereo speaker amp, no MiniDSP)
15 16
16- reg - <int> - I2C slave address 17- reg - <int> - I2C slave address
17- HPVDD-supply, SPRVDD-supply, SPLVDD-supply, AVDD-supply, IOVDD-supply, 18- HPVDD-supply, SPRVDD-supply, SPLVDD-supply, AVDD-supply, IOVDD-supply,
diff --git a/Documentation/devicetree/bindings/sound/wm8580.txt b/Documentation/devicetree/bindings/sound/wm8580.txt
index 7d9821f348da..78fce9b14954 100644
--- a/Documentation/devicetree/bindings/sound/wm8580.txt
+++ b/Documentation/devicetree/bindings/sound/wm8580.txt
@@ -1,10 +1,10 @@
1WM8580 audio CODEC 1WM8580 and WM8581 audio CODEC
2 2
3This device supports I2C only. 3This device supports I2C only.
4 4
5Required properties: 5Required properties:
6 6
7 - compatible : "wlf,wm8580" 7 - compatible : "wlf,wm8580", "wlf,wm8581"
8 8
9 - reg : the I2C address of the device. 9 - reg : the I2C address of the device.
10 10
diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
index 14cdc101d165..1b5f15653b1b 100644
--- a/Documentation/filesystems/Locking
+++ b/Documentation/filesystems/Locking
@@ -447,7 +447,6 @@ prototypes:
447 int (*flush) (struct file *); 447 int (*flush) (struct file *);
448 int (*release) (struct inode *, struct file *); 448 int (*release) (struct inode *, struct file *);
449 int (*fsync) (struct file *, loff_t start, loff_t end, int datasync); 449 int (*fsync) (struct file *, loff_t start, loff_t end, int datasync);
450 int (*aio_fsync) (struct kiocb *, int datasync);
451 int (*fasync) (int, struct file *, int); 450 int (*fasync) (int, struct file *, int);
452 int (*lock) (struct file *, int, struct file_lock *); 451 int (*lock) (struct file *, int, struct file_lock *);
453 ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, 452 ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,
diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
index d619c8d71966..b5039a00caaf 100644
--- a/Documentation/filesystems/vfs.txt
+++ b/Documentation/filesystems/vfs.txt
@@ -828,7 +828,6 @@ struct file_operations {
828 int (*flush) (struct file *, fl_owner_t id); 828 int (*flush) (struct file *, fl_owner_t id);
829 int (*release) (struct inode *, struct file *); 829 int (*release) (struct inode *, struct file *);
830 int (*fsync) (struct file *, loff_t, loff_t, int datasync); 830 int (*fsync) (struct file *, loff_t, loff_t, int datasync);
831 int (*aio_fsync) (struct kiocb *, int datasync);
832 int (*fasync) (int, struct file *, int); 831 int (*fasync) (int, struct file *, int);
833 int (*lock) (struct file *, int, struct file_lock *); 832 int (*lock) (struct file *, int, struct file_lock *);
834 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); 833 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
diff --git a/Documentation/i2c/i2c-topology b/Documentation/i2c/i2c-topology
index e0aefeece551..1a014fede0b7 100644
--- a/Documentation/i2c/i2c-topology
+++ b/Documentation/i2c/i2c-topology
@@ -326,7 +326,7 @@ Two parent-locked sibling muxes
326 326
327This is a good topology. 327This is a good topology.
328 328
329 .--------. 329 .--------.
330 .----------. .--| dev D1 | 330 .----------. .--| dev D1 |
331 | parent- |--' '--------' 331 | parent- |--' '--------'
332 .--| locked | .--------. 332 .--| locked | .--------.
@@ -350,7 +350,7 @@ Mux-locked and parent-locked sibling muxes
350 350
351This is a good topology. 351This is a good topology.
352 352
353 .--------. 353 .--------.
354 .----------. .--| dev D1 | 354 .----------. .--| dev D1 |
355 | mux- |--' '--------' 355 | mux- |--' '--------'
356 .--| locked | .--------. 356 .--| locked | .--------.
diff --git a/Documentation/networking/dsa/dsa.txt b/Documentation/networking/dsa/dsa.txt
index 6d6c07cf1a9a..63912ef34606 100644
--- a/Documentation/networking/dsa/dsa.txt
+++ b/Documentation/networking/dsa/dsa.txt
@@ -67,13 +67,14 @@ Note that DSA does not currently create network interfaces for the "cpu" and
67Switch tagging protocols 67Switch tagging protocols
68------------------------ 68------------------------
69 69
70DSA currently supports 4 different tagging protocols, and a tag-less mode as 70DSA currently supports 5 different tagging protocols, and a tag-less mode as
71well. The different protocols are implemented in: 71well. The different protocols are implemented in:
72 72
73net/dsa/tag_trailer.c: Marvell's 4 trailer tag mode (legacy) 73net/dsa/tag_trailer.c: Marvell's 4 trailer tag mode (legacy)
74net/dsa/tag_dsa.c: Marvell's original DSA tag 74net/dsa/tag_dsa.c: Marvell's original DSA tag
75net/dsa/tag_edsa.c: Marvell's enhanced DSA tag 75net/dsa/tag_edsa.c: Marvell's enhanced DSA tag
76net/dsa/tag_brcm.c: Broadcom's 4 bytes tag 76net/dsa/tag_brcm.c: Broadcom's 4 bytes tag
77net/dsa/tag_qca.c: Qualcomm's 2 bytes tag
77 78
78The exact format of the tag protocol is vendor specific, but in general, they 79The exact format of the tag protocol is vendor specific, but in general, they
79all contain something which: 80all contain something which:
diff --git a/Documentation/networking/nf_conntrack-sysctl.txt b/Documentation/networking/nf_conntrack-sysctl.txt
index 399e4e866a9c..433b6724797a 100644
--- a/Documentation/networking/nf_conntrack-sysctl.txt
+++ b/Documentation/networking/nf_conntrack-sysctl.txt
@@ -62,10 +62,13 @@ nf_conntrack_generic_timeout - INTEGER (seconds)
62 protocols. 62 protocols.
63 63
64nf_conntrack_helper - BOOLEAN 64nf_conntrack_helper - BOOLEAN
65 0 - disabled 65 0 - disabled (default)
66 not 0 - enabled (default) 66 not 0 - enabled
67 67
68 Enable automatic conntrack helper assignment. 68 Enable automatic conntrack helper assignment.
69 If disabled it is required to set up iptables rules to assign
70 helpers to connections. See the CT target description in the
71 iptables-extensions(8) man page for further information.
69 72
70nf_conntrack_icmp_timeout - INTEGER (seconds) 73nf_conntrack_icmp_timeout - INTEGER (seconds)
71 default 30 74 default 30
diff --git a/Documentation/virtual/kvm/api.txt b/Documentation/virtual/kvm/api.txt
index 739db9ab16b2..6bbceb9a3a19 100644
--- a/Documentation/virtual/kvm/api.txt
+++ b/Documentation/virtual/kvm/api.txt
@@ -777,6 +777,17 @@ Gets the current timestamp of kvmclock as seen by the current guest. In
777conjunction with KVM_SET_CLOCK, it is used to ensure monotonicity on scenarios 777conjunction with KVM_SET_CLOCK, it is used to ensure monotonicity on scenarios
778such as migration. 778such as migration.
779 779
780When KVM_CAP_ADJUST_CLOCK is passed to KVM_CHECK_EXTENSION, it returns the
781set of bits that KVM can return in struct kvm_clock_data's flag member.
782
783The only flag defined now is KVM_CLOCK_TSC_STABLE. If set, the returned
784value is the exact kvmclock value seen by all VCPUs at the instant
785when KVM_GET_CLOCK was called. If clear, the returned value is simply
786CLOCK_MONOTONIC plus a constant offset; the offset can be modified
787with KVM_SET_CLOCK. KVM will try to make all VCPUs follow this clock,
788but the exact value read by each VCPU could differ, because the host
789TSC is not stable.
790
780struct kvm_clock_data { 791struct kvm_clock_data {
781 __u64 clock; /* kvmclock current value */ 792 __u64 clock; /* kvmclock current value */
782 __u32 flags; 793 __u32 flags;
diff --git a/MAINTAINERS b/MAINTAINERS
index 411e3b87b8c2..e90590a4cbe2 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -77,6 +77,7 @@ Descriptions of section entries:
77 Q: Patchwork web based patch tracking system site 77 Q: Patchwork web based patch tracking system site
78 T: SCM tree type and location. 78 T: SCM tree type and location.
79 Type is one of: git, hg, quilt, stgit, topgit 79 Type is one of: git, hg, quilt, stgit, topgit
80 B: Bug tracking system location.
80 S: Status, one of the following: 81 S: Status, one of the following:
81 Supported: Someone is actually paid to look after this. 82 Supported: Someone is actually paid to look after this.
82 Maintained: Someone actually looks after it. 83 Maintained: Someone actually looks after it.
@@ -281,6 +282,7 @@ L: linux-acpi@vger.kernel.org
281W: https://01.org/linux-acpi 282W: https://01.org/linux-acpi
282Q: https://patchwork.kernel.org/project/linux-acpi/list/ 283Q: https://patchwork.kernel.org/project/linux-acpi/list/
283T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 284T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
285B: https://bugzilla.kernel.org
284S: Supported 286S: Supported
285F: drivers/acpi/ 287F: drivers/acpi/
286F: drivers/pnp/pnpacpi/ 288F: drivers/pnp/pnpacpi/
@@ -304,6 +306,8 @@ W: https://acpica.org/
304W: https://github.com/acpica/acpica/ 306W: https://github.com/acpica/acpica/
305Q: https://patchwork.kernel.org/project/linux-acpi/list/ 307Q: https://patchwork.kernel.org/project/linux-acpi/list/
306T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 308T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
309B: https://bugzilla.kernel.org
310B: https://bugs.acpica.org
307S: Supported 311S: Supported
308F: drivers/acpi/acpica/ 312F: drivers/acpi/acpica/
309F: include/acpi/ 313F: include/acpi/
@@ -313,6 +317,7 @@ ACPI FAN DRIVER
313M: Zhang Rui <rui.zhang@intel.com> 317M: Zhang Rui <rui.zhang@intel.com>
314L: linux-acpi@vger.kernel.org 318L: linux-acpi@vger.kernel.org
315W: https://01.org/linux-acpi 319W: https://01.org/linux-acpi
320B: https://bugzilla.kernel.org
316S: Supported 321S: Supported
317F: drivers/acpi/fan.c 322F: drivers/acpi/fan.c
318 323
@@ -328,6 +333,7 @@ ACPI THERMAL DRIVER
328M: Zhang Rui <rui.zhang@intel.com> 333M: Zhang Rui <rui.zhang@intel.com>
329L: linux-acpi@vger.kernel.org 334L: linux-acpi@vger.kernel.org
330W: https://01.org/linux-acpi 335W: https://01.org/linux-acpi
336B: https://bugzilla.kernel.org
331S: Supported 337S: Supported
332F: drivers/acpi/*thermal* 338F: drivers/acpi/*thermal*
333 339
@@ -335,6 +341,7 @@ ACPI VIDEO DRIVER
335M: Zhang Rui <rui.zhang@intel.com> 341M: Zhang Rui <rui.zhang@intel.com>
336L: linux-acpi@vger.kernel.org 342L: linux-acpi@vger.kernel.org
337W: https://01.org/linux-acpi 343W: https://01.org/linux-acpi
344B: https://bugzilla.kernel.org
338S: Supported 345S: Supported
339F: drivers/acpi/acpi_video.c 346F: drivers/acpi/acpi_video.c
340 347
@@ -2318,6 +2325,13 @@ F: include/uapi/linux/ax25.h
2318F: include/net/ax25.h 2325F: include/net/ax25.h
2319F: net/ax25/ 2326F: net/ax25/
2320 2327
2328AXENTIA ASOC DRIVERS
2329M: Peter Rosin <peda@axentia.se>
2330L: alsa-devel@alsa-project.org (moderated for non-subscribers)
2331S: Maintained
2332F: Documentation/devicetree/bindings/sound/axentia,*
2333F: sound/soc/atmel/tse850-pcm5142.c
2334
2321AZ6007 DVB DRIVER 2335AZ6007 DVB DRIVER
2322M: Mauro Carvalho Chehab <mchehab@s-opensource.com> 2336M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
2323M: Mauro Carvalho Chehab <mchehab@kernel.org> 2337M: Mauro Carvalho Chehab <mchehab@kernel.org>
@@ -5663,6 +5677,7 @@ HIBERNATION (aka Software Suspend, aka swsusp)
5663M: "Rafael J. Wysocki" <rjw@rjwysocki.net> 5677M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
5664M: Pavel Machek <pavel@ucw.cz> 5678M: Pavel Machek <pavel@ucw.cz>
5665L: linux-pm@vger.kernel.org 5679L: linux-pm@vger.kernel.org
5680B: https://bugzilla.kernel.org
5666S: Supported 5681S: Supported
5667F: arch/x86/power/ 5682F: arch/x86/power/
5668F: drivers/base/power/ 5683F: drivers/base/power/
@@ -7084,6 +7099,7 @@ F: drivers/scsi/53c700*
7084LED SUBSYSTEM 7099LED SUBSYSTEM
7085M: Richard Purdie <rpurdie@rpsys.net> 7100M: Richard Purdie <rpurdie@rpsys.net>
7086M: Jacek Anaszewski <j.anaszewski@samsung.com> 7101M: Jacek Anaszewski <j.anaszewski@samsung.com>
7102M: Pavel Machek <pavel@ucw.cz>
7087L: linux-leds@vger.kernel.org 7103L: linux-leds@vger.kernel.org
7088T: git git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds.git 7104T: git git://git.kernel.org/pub/scm/linux/kernel/git/j.anaszewski/linux-leds.git
7089S: Maintained 7105S: Maintained
@@ -8057,6 +8073,7 @@ F: drivers/infiniband/hw/mlx4/
8057F: include/linux/mlx4/ 8073F: include/linux/mlx4/
8058 8074
8059MELLANOX MLX5 core VPI driver 8075MELLANOX MLX5 core VPI driver
8076M: Saeed Mahameed <saeedm@mellanox.com>
8060M: Matan Barak <matanb@mellanox.com> 8077M: Matan Barak <matanb@mellanox.com>
8061M: Leon Romanovsky <leonro@mellanox.com> 8078M: Leon Romanovsky <leonro@mellanox.com>
8062L: netdev@vger.kernel.org 8079L: netdev@vger.kernel.org
@@ -9247,11 +9264,12 @@ S: Maintained
9247F: drivers/pci/host/*layerscape* 9264F: drivers/pci/host/*layerscape*
9248 9265
9249PCI DRIVER FOR IMX6 9266PCI DRIVER FOR IMX6
9250M: Richard Zhu <Richard.Zhu@freescale.com> 9267M: Richard Zhu <hongxing.zhu@nxp.com>
9251M: Lucas Stach <l.stach@pengutronix.de> 9268M: Lucas Stach <l.stach@pengutronix.de>
9252L: linux-pci@vger.kernel.org 9269L: linux-pci@vger.kernel.org
9253L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) 9270L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
9254S: Maintained 9271S: Maintained
9272F: Documentation/devicetree/bindings/pci/fsl,imx6q-pcie.txt
9255F: drivers/pci/host/*imx6* 9273F: drivers/pci/host/*imx6*
9256 9274
9257PCI DRIVER FOR TI KEYSTONE 9275PCI DRIVER FOR TI KEYSTONE
@@ -9310,17 +9328,11 @@ F: drivers/pci/host/pci-exynos.c
9310 9328
9311PCI DRIVER FOR SYNOPSIS DESIGNWARE 9329PCI DRIVER FOR SYNOPSIS DESIGNWARE
9312M: Jingoo Han <jingoohan1@gmail.com> 9330M: Jingoo Han <jingoohan1@gmail.com>
9313M: Pratyush Anand <pratyush.anand@gmail.com> 9331M: Joao Pinto <Joao.Pinto@synopsys.com>
9314L: linux-pci@vger.kernel.org
9315S: Maintained
9316F: drivers/pci/host/*designware*
9317
9318PCI DRIVER FOR SYNOPSYS PROTOTYPING DEVICE
9319M: Jose Abreu <Jose.Abreu@synopsys.com>
9320L: linux-pci@vger.kernel.org 9332L: linux-pci@vger.kernel.org
9321S: Maintained 9333S: Maintained
9322F: Documentation/devicetree/bindings/pci/designware-pcie.txt 9334F: Documentation/devicetree/bindings/pci/designware-pcie.txt
9323F: drivers/pci/host/pcie-designware-plat.c 9335F: drivers/pci/host/*designware*
9324 9336
9325PCI DRIVER FOR GENERIC OF HOSTS 9337PCI DRIVER FOR GENERIC OF HOSTS
9326M: Will Deacon <will.deacon@arm.com> 9338M: Will Deacon <will.deacon@arm.com>
@@ -9335,7 +9347,7 @@ PCI DRIVER FOR INTEL VOLUME MANAGEMENT DEVICE (VMD)
9335M: Keith Busch <keith.busch@intel.com> 9347M: Keith Busch <keith.busch@intel.com>
9336L: linux-pci@vger.kernel.org 9348L: linux-pci@vger.kernel.org
9337S: Supported 9349S: Supported
9338F: arch/x86/pci/vmd.c 9350F: drivers/pci/host/vmd.c
9339 9351
9340PCIE DRIVER FOR ST SPEAR13XX 9352PCIE DRIVER FOR ST SPEAR13XX
9341M: Pratyush Anand <pratyush.anand@gmail.com> 9353M: Pratyush Anand <pratyush.anand@gmail.com>
@@ -9622,6 +9634,7 @@ POWER MANAGEMENT CORE
9622M: "Rafael J. Wysocki" <rjw@rjwysocki.net> 9634M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
9623L: linux-pm@vger.kernel.org 9635L: linux-pm@vger.kernel.org
9624T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm 9636T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
9637B: https://bugzilla.kernel.org
9625S: Supported 9638S: Supported
9626F: drivers/base/power/ 9639F: drivers/base/power/
9627F: include/linux/pm.h 9640F: include/linux/pm.h
@@ -11611,6 +11624,7 @@ M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
11611M: Len Brown <len.brown@intel.com> 11624M: Len Brown <len.brown@intel.com>
11612M: Pavel Machek <pavel@ucw.cz> 11625M: Pavel Machek <pavel@ucw.cz>
11613L: linux-pm@vger.kernel.org 11626L: linux-pm@vger.kernel.org
11627B: https://bugzilla.kernel.org
11614S: Supported 11628S: Supported
11615F: Documentation/power/ 11629F: Documentation/power/
11616F: arch/x86/kernel/acpi/ 11630F: arch/x86/kernel/acpi/
diff --git a/Makefile b/Makefile
index f97f786de58d..b1037774e8e8 100644
--- a/Makefile
+++ b/Makefile
@@ -1,8 +1,8 @@
1VERSION = 4 1VERSION = 4
2PATCHLEVEL = 9 2PATCHLEVEL = 9
3SUBLEVEL = 0 3SUBLEVEL = 0
4EXTRAVERSION = -rc4 4EXTRAVERSION =
5NAME = Psychotic Stoned Sheep 5NAME = Roaring Lionus
6 6
7# *DOCUMENTATION* 7# *DOCUMENTATION*
8# To see a list of typical targets execute "make help" 8# To see a list of typical targets execute "make help"
@@ -370,7 +370,7 @@ LDFLAGS_MODULE =
370CFLAGS_KERNEL = 370CFLAGS_KERNEL =
371AFLAGS_KERNEL = 371AFLAGS_KERNEL =
372LDFLAGS_vmlinux = 372LDFLAGS_vmlinux =
373CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im 373CFLAGS_GCOV = -fprofile-arcs -ftest-coverage -fno-tree-loop-im -Wno-maybe-uninitialized
374CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,) 374CFLAGS_KCOV := $(call cc-option,-fsanitize-coverage=trace-pc,)
375 375
376 376
@@ -399,11 +399,12 @@ KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
399 -fno-strict-aliasing -fno-common \ 399 -fno-strict-aliasing -fno-common \
400 -Werror-implicit-function-declaration \ 400 -Werror-implicit-function-declaration \
401 -Wno-format-security \ 401 -Wno-format-security \
402 -std=gnu89 402 -std=gnu89 $(call cc-option,-fno-PIE)
403
403 404
404KBUILD_AFLAGS_KERNEL := 405KBUILD_AFLAGS_KERNEL :=
405KBUILD_CFLAGS_KERNEL := 406KBUILD_CFLAGS_KERNEL :=
406KBUILD_AFLAGS := -D__ASSEMBLY__ 407KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
407KBUILD_AFLAGS_MODULE := -DMODULE 408KBUILD_AFLAGS_MODULE := -DMODULE
408KBUILD_CFLAGS_MODULE := -DMODULE 409KBUILD_CFLAGS_MODULE := -DMODULE
409KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds 410KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
@@ -606,6 +607,13 @@ else
606include/config/auto.conf: ; 607include/config/auto.conf: ;
607endif # $(dot-config) 608endif # $(dot-config)
608 609
610# For the kernel to actually contain only the needed exported symbols,
611# we have to build modules as well to determine what those symbols are.
612# (this can be evaluated only once include/config/auto.conf has been included)
613ifdef CONFIG_TRIM_UNUSED_KSYMS
614 KBUILD_MODULES := 1
615endif
616
609# The all: target is the default when no target is given on the 617# The all: target is the default when no target is given on the
610# command line. 618# command line.
611# This allow a user to issue only 'make' to build a kernel including modules 619# This allow a user to issue only 'make' to build a kernel including modules
@@ -620,7 +628,6 @@ ARCH_CFLAGS :=
620include arch/$(SRCARCH)/Makefile 628include arch/$(SRCARCH)/Makefile
621 629
622KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,) 630KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
623KBUILD_CFLAGS += $(call cc-disable-warning,maybe-uninitialized,)
624KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,) 631KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
625 632
626ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION 633ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
@@ -629,15 +636,18 @@ KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
629endif 636endif
630 637
631ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE 638ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
632KBUILD_CFLAGS += -Os 639KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
633else 640else
634ifdef CONFIG_PROFILE_ALL_BRANCHES 641ifdef CONFIG_PROFILE_ALL_BRANCHES
635KBUILD_CFLAGS += -O2 642KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
636else 643else
637KBUILD_CFLAGS += -O2 644KBUILD_CFLAGS += -O2
638endif 645endif
639endif 646endif
640 647
648KBUILD_CFLAGS += $(call cc-ifversion, -lt, 0409, \
649 $(call cc-disable-warning,maybe-uninitialized,))
650
641# Tell gcc to never replace conditional load with a non-conditional one 651# Tell gcc to never replace conditional load with a non-conditional one
642KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0) 652KBUILD_CFLAGS += $(call cc-option,--param=allow-store-data-races=0)
643 653
@@ -941,7 +951,7 @@ ifdef CONFIG_GDB_SCRIPTS
941endif 951endif
942ifdef CONFIG_TRIM_UNUSED_KSYMS 952ifdef CONFIG_TRIM_UNUSED_KSYMS
943 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \ 953 $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
944 "$(MAKE) KBUILD_MODULES=1 -f $(srctree)/Makefile vmlinux_prereq" 954 "$(MAKE) -f $(srctree)/Makefile vmlinux"
945endif 955endif
946 956
947# standalone target for easier testing 957# standalone target for easier testing
@@ -1016,8 +1026,6 @@ prepare2: prepare3 prepare-compiler-check outputmakefile asm-generic
1016prepare1: prepare2 $(version_h) include/generated/utsrelease.h \ 1026prepare1: prepare2 $(version_h) include/generated/utsrelease.h \
1017 include/config/auto.conf 1027 include/config/auto.conf
1018 $(cmd_crmodverdir) 1028 $(cmd_crmodverdir)
1019 $(Q)test -e include/generated/autoksyms.h || \
1020 touch include/generated/autoksyms.h
1021 1029
1022archprepare: archheaders archscripts prepare1 scripts_basic 1030archprepare: archheaders archscripts prepare1 scripts_basic
1023 1031
diff --git a/arch/arc/Makefile b/arch/arc/Makefile
index 864adad52280..19cce226d1a8 100644
--- a/arch/arc/Makefile
+++ b/arch/arc/Makefile
@@ -50,6 +50,9 @@ atleast_gcc44 := $(call cc-ifversion, -ge, 0404, y)
50 50
51cflags-$(atleast_gcc44) += -fsection-anchors 51cflags-$(atleast_gcc44) += -fsection-anchors
52 52
53cflags-$(CONFIG_ARC_HAS_LLSC) += -mlock
54cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
55
53ifdef CONFIG_ISA_ARCV2 56ifdef CONFIG_ISA_ARCV2
54 57
55ifndef CONFIG_ARC_HAS_LL64 58ifndef CONFIG_ARC_HAS_LL64
@@ -68,7 +71,9 @@ cflags-$(CONFIG_ARC_DW2_UNWIND) += -fasynchronous-unwind-tables $(cfi)
68ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE 71ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE
69# Generic build system uses -O2, we want -O3 72# Generic build system uses -O2, we want -O3
70# Note: No need to add to cflags-y as that happens anyways 73# Note: No need to add to cflags-y as that happens anyways
71ARCH_CFLAGS += -O3 74#
75# Disable the false maybe-uninitialized warings gcc spits out at -O3
76ARCH_CFLAGS += -O3 $(call cc-disable-warning,maybe-uninitialized,)
72endif 77endif
73 78
74# small data is default for elf32 tool-chain. If not usable, disable it 79# small data is default for elf32 tool-chain. If not usable, disable it
diff --git a/arch/arc/boot/dts/axc001.dtsi b/arch/arc/boot/dts/axc001.dtsi
index 6ae2c476ad82..53ce226f77a5 100644
--- a/arch/arc/boot/dts/axc001.dtsi
+++ b/arch/arc/boot/dts/axc001.dtsi
@@ -71,7 +71,7 @@
71 reg-io-width = <4>; 71 reg-io-width = <4>;
72 }; 72 };
73 73
74 arcpmu0: pmu { 74 arcpct0: pct {
75 compatible = "snps,arc700-pct"; 75 compatible = "snps,arc700-pct";
76 }; 76 };
77 }; 77 };
diff --git a/arch/arc/boot/dts/nsim_700.dts b/arch/arc/boot/dts/nsim_700.dts
index ce0ccd20b5bf..5ee96b067c08 100644
--- a/arch/arc/boot/dts/nsim_700.dts
+++ b/arch/arc/boot/dts/nsim_700.dts
@@ -69,7 +69,7 @@
69 }; 69 };
70 }; 70 };
71 71
72 arcpmu0: pmu { 72 arcpct0: pct {
73 compatible = "snps,arc700-pct"; 73 compatible = "snps,arc700-pct";
74 }; 74 };
75 }; 75 };
diff --git a/arch/arc/boot/dts/nsimosci.dts b/arch/arc/boot/dts/nsimosci.dts
index bcf603142a33..3c391ba565ed 100644
--- a/arch/arc/boot/dts/nsimosci.dts
+++ b/arch/arc/boot/dts/nsimosci.dts
@@ -83,5 +83,9 @@
83 reg = <0xf0003000 0x44>; 83 reg = <0xf0003000 0x44>;
84 interrupts = <7>; 84 interrupts = <7>;
85 }; 85 };
86
87 arcpct0: pct {
88 compatible = "snps,arc700-pct";
89 };
86 }; 90 };
87}; 91};
diff --git a/arch/arc/configs/nsim_700_defconfig b/arch/arc/configs/nsim_700_defconfig
index 7314f538847b..b0066a749d4c 100644
--- a/arch/arc/configs/nsim_700_defconfig
+++ b/arch/arc/configs/nsim_700_defconfig
@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
14CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" 14CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
15CONFIG_KALLSYMS_ALL=y 15CONFIG_KALLSYMS_ALL=y
16CONFIG_EMBEDDED=y 16CONFIG_EMBEDDED=y
17CONFIG_PERF_EVENTS=y
17# CONFIG_SLUB_DEBUG is not set 18# CONFIG_SLUB_DEBUG is not set
18# CONFIG_COMPAT_BRK is not set 19# CONFIG_COMPAT_BRK is not set
19CONFIG_KPROBES=y 20CONFIG_KPROBES=y
diff --git a/arch/arc/configs/nsim_hs_defconfig b/arch/arc/configs/nsim_hs_defconfig
index 65ab9fbf83f2..ebe9ebb92933 100644
--- a/arch/arc/configs/nsim_hs_defconfig
+++ b/arch/arc/configs/nsim_hs_defconfig
@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
14CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/" 14CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
15CONFIG_KALLSYMS_ALL=y 15CONFIG_KALLSYMS_ALL=y
16CONFIG_EMBEDDED=y 16CONFIG_EMBEDDED=y
17CONFIG_PERF_EVENTS=y
17# CONFIG_SLUB_DEBUG is not set 18# CONFIG_SLUB_DEBUG is not set
18# CONFIG_COMPAT_BRK is not set 19# CONFIG_COMPAT_BRK is not set
19CONFIG_KPROBES=y 20CONFIG_KPROBES=y
diff --git a/arch/arc/configs/nsim_hs_smp_defconfig b/arch/arc/configs/nsim_hs_smp_defconfig
index 3b3990cddbe1..4bde43278be6 100644
--- a/arch/arc/configs/nsim_hs_smp_defconfig
+++ b/arch/arc/configs/nsim_hs_smp_defconfig
@@ -12,6 +12,7 @@ CONFIG_BLK_DEV_INITRD=y
12CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" 12CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
13CONFIG_KALLSYMS_ALL=y 13CONFIG_KALLSYMS_ALL=y
14CONFIG_EMBEDDED=y 14CONFIG_EMBEDDED=y
15CONFIG_PERF_EVENTS=y
15# CONFIG_SLUB_DEBUG is not set 16# CONFIG_SLUB_DEBUG is not set
16# CONFIG_COMPAT_BRK is not set 17# CONFIG_COMPAT_BRK is not set
17CONFIG_KPROBES=y 18CONFIG_KPROBES=y
diff --git a/arch/arc/configs/nsimosci_defconfig b/arch/arc/configs/nsimosci_defconfig
index 98cf20933bbb..f6fb3d26557e 100644
--- a/arch/arc/configs/nsimosci_defconfig
+++ b/arch/arc/configs/nsimosci_defconfig
@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
14CONFIG_INITRAMFS_SOURCE="../arc_initramfs/" 14CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
15CONFIG_KALLSYMS_ALL=y 15CONFIG_KALLSYMS_ALL=y
16CONFIG_EMBEDDED=y 16CONFIG_EMBEDDED=y
17CONFIG_PERF_EVENTS=y
17# CONFIG_SLUB_DEBUG is not set 18# CONFIG_SLUB_DEBUG is not set
18# CONFIG_COMPAT_BRK is not set 19# CONFIG_COMPAT_BRK is not set
19CONFIG_KPROBES=y 20CONFIG_KPROBES=y
diff --git a/arch/arc/configs/nsimosci_hs_defconfig b/arch/arc/configs/nsimosci_hs_defconfig
index ddf8b96d494e..b9f0fe00044b 100644
--- a/arch/arc/configs/nsimosci_hs_defconfig
+++ b/arch/arc/configs/nsimosci_hs_defconfig
@@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
14CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" 14CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
15CONFIG_KALLSYMS_ALL=y 15CONFIG_KALLSYMS_ALL=y
16CONFIG_EMBEDDED=y 16CONFIG_EMBEDDED=y
17CONFIG_PERF_EVENTS=y
17# CONFIG_SLUB_DEBUG is not set 18# CONFIG_SLUB_DEBUG is not set
18# CONFIG_COMPAT_BRK is not set 19# CONFIG_COMPAT_BRK is not set
19CONFIG_KPROBES=y 20CONFIG_KPROBES=y
diff --git a/arch/arc/configs/nsimosci_hs_smp_defconfig b/arch/arc/configs/nsimosci_hs_smp_defconfig
index ceb90745326e..6da71ba253a9 100644
--- a/arch/arc/configs/nsimosci_hs_smp_defconfig
+++ b/arch/arc/configs/nsimosci_hs_smp_defconfig
@@ -10,6 +10,7 @@ CONFIG_IKCONFIG_PROC=y
10# CONFIG_PID_NS is not set 10# CONFIG_PID_NS is not set
11CONFIG_BLK_DEV_INITRD=y 11CONFIG_BLK_DEV_INITRD=y
12CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/" 12CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
13CONFIG_PERF_EVENTS=y
13# CONFIG_COMPAT_BRK is not set 14# CONFIG_COMPAT_BRK is not set
14CONFIG_KPROBES=y 15CONFIG_KPROBES=y
15CONFIG_MODULES=y 16CONFIG_MODULES=y
@@ -34,7 +35,6 @@ CONFIG_INET=y
34# CONFIG_INET_XFRM_MODE_TRANSPORT is not set 35# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
35# CONFIG_INET_XFRM_MODE_TUNNEL is not set 36# CONFIG_INET_XFRM_MODE_TUNNEL is not set
36# CONFIG_INET_XFRM_MODE_BEET is not set 37# CONFIG_INET_XFRM_MODE_BEET is not set
37# CONFIG_INET_LRO is not set
38# CONFIG_IPV6 is not set 38# CONFIG_IPV6 is not set
39# CONFIG_WIRELESS is not set 39# CONFIG_WIRELESS is not set
40CONFIG_DEVTMPFS=y 40CONFIG_DEVTMPFS=y
@@ -72,7 +72,6 @@ CONFIG_SERIAL_OF_PLATFORM=y
72# CONFIG_HWMON is not set 72# CONFIG_HWMON is not set
73CONFIG_DRM=y 73CONFIG_DRM=y
74CONFIG_DRM_ARCPGU=y 74CONFIG_DRM_ARCPGU=y
75CONFIG_FRAMEBUFFER_CONSOLE=y
76CONFIG_LOGO=y 75CONFIG_LOGO=y
77# CONFIG_HID is not set 76# CONFIG_HID is not set
78# CONFIG_USB_SUPPORT is not set 77# CONFIG_USB_SUPPORT is not set
diff --git a/arch/arc/include/asm/arcregs.h b/arch/arc/include/asm/arcregs.h
index 7f3f9f63708c..1bd24ec3e350 100644
--- a/arch/arc/include/asm/arcregs.h
+++ b/arch/arc/include/asm/arcregs.h
@@ -43,12 +43,14 @@
43#define STATUS_AE_BIT 5 /* Exception active */ 43#define STATUS_AE_BIT 5 /* Exception active */
44#define STATUS_DE_BIT 6 /* PC is in delay slot */ 44#define STATUS_DE_BIT 6 /* PC is in delay slot */
45#define STATUS_U_BIT 7 /* User/Kernel mode */ 45#define STATUS_U_BIT 7 /* User/Kernel mode */
46#define STATUS_Z_BIT 11
46#define STATUS_L_BIT 12 /* Loop inhibit */ 47#define STATUS_L_BIT 12 /* Loop inhibit */
47 48
48/* These masks correspond to the status word(STATUS_32) bits */ 49/* These masks correspond to the status word(STATUS_32) bits */
49#define STATUS_AE_MASK (1<<STATUS_AE_BIT) 50#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
50#define STATUS_DE_MASK (1<<STATUS_DE_BIT) 51#define STATUS_DE_MASK (1<<STATUS_DE_BIT)
51#define STATUS_U_MASK (1<<STATUS_U_BIT) 52#define STATUS_U_MASK (1<<STATUS_U_BIT)
53#define STATUS_Z_MASK (1<<STATUS_Z_BIT)
52#define STATUS_L_MASK (1<<STATUS_L_BIT) 54#define STATUS_L_MASK (1<<STATUS_L_BIT)
53 55
54/* 56/*
diff --git a/arch/arc/include/asm/delay.h b/arch/arc/include/asm/delay.h
index 08e7e2a16ac1..a36e8601114d 100644
--- a/arch/arc/include/asm/delay.h
+++ b/arch/arc/include/asm/delay.h
@@ -22,10 +22,11 @@
22static inline void __delay(unsigned long loops) 22static inline void __delay(unsigned long loops)
23{ 23{
24 __asm__ __volatile__( 24 __asm__ __volatile__(
25 " lp 1f \n" 25 " mov lp_count, %0 \n"
26 " nop \n" 26 " lp 1f \n"
27 "1: \n" 27 " nop \n"
28 : "+l"(loops)); 28 "1: \n"
29 : : "r"(loops));
29} 30}
30 31
31extern void __bad_udelay(void); 32extern void __bad_udelay(void);
diff --git a/arch/arc/include/asm/pgtable.h b/arch/arc/include/asm/pgtable.h
index 89eeb3720051..e94ca72b974e 100644
--- a/arch/arc/include/asm/pgtable.h
+++ b/arch/arc/include/asm/pgtable.h
@@ -280,7 +280,7 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
280 280
281#define pte_page(pte) pfn_to_page(pte_pfn(pte)) 281#define pte_page(pte) pfn_to_page(pte_pfn(pte))
282#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot) 282#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
283#define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) 283#define pfn_pte(pfn, prot) __pte(__pfn_to_phys(pfn) | pgprot_val(prot))
284 284
285/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/ 285/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
286#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT) 286#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
diff --git a/arch/arc/include/asm/smp.h b/arch/arc/include/asm/smp.h
index 89fdd1b0a76e..0861007d9ef3 100644
--- a/arch/arc/include/asm/smp.h
+++ b/arch/arc/include/asm/smp.h
@@ -37,9 +37,9 @@ extern const char *arc_platform_smp_cpuinfo(void);
37 * API expected BY platform smp code (FROM arch smp code) 37 * API expected BY platform smp code (FROM arch smp code)
38 * 38 *
39 * smp_ipi_irq_setup: 39 * smp_ipi_irq_setup:
40 * Takes @cpu and @irq to which the arch-common ISR is hooked up 40 * Takes @cpu and @hwirq to which the arch-common ISR is hooked up
41 */ 41 */
42extern int smp_ipi_irq_setup(int cpu, int irq); 42extern int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq);
43 43
44/* 44/*
45 * struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP 45 * struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
diff --git a/arch/arc/kernel/devtree.c b/arch/arc/kernel/devtree.c
index f1e07c2344f8..3b67f538f142 100644
--- a/arch/arc/kernel/devtree.c
+++ b/arch/arc/kernel/devtree.c
@@ -31,6 +31,8 @@ static void __init arc_set_early_base_baud(unsigned long dt_root)
31 arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */ 31 arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
32 else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp")) 32 else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
33 arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */ 33 arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
34 else if (of_flat_dt_is_compatible(dt_root, "ezchip,arc-nps"))
35 arc_base_baud = 800000000; /* Fixed 800MHz clk (NPS) */
34 else 36 else
35 arc_base_baud = 50000000; /* Fixed default 50MHz */ 37 arc_base_baud = 50000000; /* Fixed default 50MHz */
36} 38}
diff --git a/arch/arc/kernel/mcip.c b/arch/arc/kernel/mcip.c
index c424d5abc318..f39142acc89e 100644
--- a/arch/arc/kernel/mcip.c
+++ b/arch/arc/kernel/mcip.c
@@ -181,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
181{ 181{
182 unsigned long flags; 182 unsigned long flags;
183 cpumask_t online; 183 cpumask_t online;
184 unsigned int destination_bits;
185 unsigned int distribution_mode;
184 186
185 /* errout if no online cpu per @cpumask */ 187 /* errout if no online cpu per @cpumask */
186 if (!cpumask_and(&online, cpumask, cpu_online_mask)) 188 if (!cpumask_and(&online, cpumask, cpu_online_mask))
@@ -188,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
188 190
189 raw_spin_lock_irqsave(&mcip_lock, flags); 191 raw_spin_lock_irqsave(&mcip_lock, flags);
190 192
191 idu_set_dest(data->hwirq, cpumask_bits(&online)[0]); 193 destination_bits = cpumask_bits(&online)[0];
192 idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR); 194 idu_set_dest(data->hwirq, destination_bits);
195
196 if (ffs(destination_bits) == fls(destination_bits))
197 distribution_mode = IDU_M_DISTRI_DEST;
198 else
199 distribution_mode = IDU_M_DISTRI_RR;
200
201 idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, distribution_mode);
193 202
194 raw_spin_unlock_irqrestore(&mcip_lock, flags); 203 raw_spin_unlock_irqrestore(&mcip_lock, flags);
195 204
@@ -207,16 +216,15 @@ static struct irq_chip idu_irq_chip = {
207 216
208}; 217};
209 218
210static int idu_first_irq; 219static irq_hw_number_t idu_first_hwirq;
211 220
212static void idu_cascade_isr(struct irq_desc *desc) 221static void idu_cascade_isr(struct irq_desc *desc)
213{ 222{
214 struct irq_domain *domain = irq_desc_get_handler_data(desc); 223 struct irq_domain *idu_domain = irq_desc_get_handler_data(desc);
215 unsigned int core_irq = irq_desc_get_irq(desc); 224 irq_hw_number_t core_hwirq = irqd_to_hwirq(irq_desc_get_irq_data(desc));
216 unsigned int idu_irq; 225 irq_hw_number_t idu_hwirq = core_hwirq - idu_first_hwirq;
217 226
218 idu_irq = core_irq - idu_first_irq; 227 generic_handle_irq(irq_find_mapping(idu_domain, idu_hwirq));
219 generic_handle_irq(irq_find_mapping(domain, idu_irq));
220} 228}
221 229
222static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq) 230static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
@@ -282,7 +290,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
282 struct irq_domain *domain; 290 struct irq_domain *domain;
283 /* Read IDU BCR to confirm nr_irqs */ 291 /* Read IDU BCR to confirm nr_irqs */
284 int nr_irqs = of_irq_count(intc); 292 int nr_irqs = of_irq_count(intc);
285 int i, irq; 293 int i, virq;
286 struct mcip_bcr mp; 294 struct mcip_bcr mp;
287 295
288 READ_BCR(ARC_REG_MCIP_BCR, mp); 296 READ_BCR(ARC_REG_MCIP_BCR, mp);
@@ -303,11 +311,11 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
303 * however we need it to get the parent virq and set IDU handler 311 * however we need it to get the parent virq and set IDU handler
304 * as first level isr 312 * as first level isr
305 */ 313 */
306 irq = irq_of_parse_and_map(intc, i); 314 virq = irq_of_parse_and_map(intc, i);
307 if (!i) 315 if (!i)
308 idu_first_irq = irq; 316 idu_first_hwirq = irqd_to_hwirq(irq_get_irq_data(virq));
309 317
310 irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain); 318 irq_set_chained_handler_and_data(virq, idu_cascade_isr, domain);
311 } 319 }
312 320
313 __mcip_cmd(CMD_IDU_ENABLE, 0); 321 __mcip_cmd(CMD_IDU_ENABLE, 0);
diff --git a/arch/arc/kernel/process.c b/arch/arc/kernel/process.c
index 59aa43cb146e..a41a79a4f4fe 100644
--- a/arch/arc/kernel/process.c
+++ b/arch/arc/kernel/process.c
@@ -43,8 +43,8 @@ SYSCALL_DEFINE0(arc_gettls)
43 43
44SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new) 44SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
45{ 45{
46 int uval; 46 struct pt_regs *regs = current_pt_regs();
47 int ret; 47 int uval = -EFAULT;
48 48
49 /* 49 /*
50 * This is only for old cores lacking LLOCK/SCOND, which by defintion 50 * This is only for old cores lacking LLOCK/SCOND, which by defintion
@@ -54,24 +54,26 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
54 */ 54 */
55 WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP)); 55 WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
56 56
57 /* Z indicates to userspace if operation succeded */
58 regs->status32 &= ~STATUS_Z_MASK;
59
57 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int))) 60 if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
58 return -EFAULT; 61 return -EFAULT;
59 62
60 preempt_disable(); 63 preempt_disable();
61 64
62 ret = __get_user(uval, uaddr); 65 if (__get_user(uval, uaddr))
63 if (ret)
64 goto done; 66 goto done;
65 67
66 if (uval != expected) 68 if (uval == expected) {
67 ret = -EAGAIN; 69 if (!__put_user(new, uaddr))
68 else 70 regs->status32 |= STATUS_Z_MASK;
69 ret = __put_user(new, uaddr); 71 }
70 72
71done: 73done:
72 preempt_enable(); 74 preempt_enable();
73 75
74 return ret; 76 return uval;
75} 77}
76 78
77void arch_cpu_idle(void) 79void arch_cpu_idle(void)
diff --git a/arch/arc/kernel/smp.c b/arch/arc/kernel/smp.c
index f183cc648851..88674d972c9d 100644
--- a/arch/arc/kernel/smp.c
+++ b/arch/arc/kernel/smp.c
@@ -22,6 +22,7 @@
22#include <linux/atomic.h> 22#include <linux/atomic.h>
23#include <linux/cpumask.h> 23#include <linux/cpumask.h>
24#include <linux/reboot.h> 24#include <linux/reboot.h>
25#include <linux/irqdomain.h>
25#include <asm/processor.h> 26#include <asm/processor.h>
26#include <asm/setup.h> 27#include <asm/setup.h>
27#include <asm/mach_desc.h> 28#include <asm/mach_desc.h>
@@ -67,11 +68,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
67 int i; 68 int i;
68 69
69 /* 70 /*
70 * Initialise the present map, which describes the set of CPUs 71 * if platform didn't set the present map already, do it now
71 * actually populated at the present time. 72 * boot cpu is set to present already by init/main.c
72 */ 73 */
73 for (i = 0; i < max_cpus; i++) 74 if (num_present_cpus() <= 1) {
74 set_cpu_present(i, true); 75 for (i = 0; i < max_cpus; i++)
76 set_cpu_present(i, true);
77 }
75} 78}
76 79
77void __init smp_cpus_done(unsigned int max_cpus) 80void __init smp_cpus_done(unsigned int max_cpus)
@@ -351,20 +354,24 @@ irqreturn_t do_IPI(int irq, void *dev_id)
351 */ 354 */
352static DEFINE_PER_CPU(int, ipi_dev); 355static DEFINE_PER_CPU(int, ipi_dev);
353 356
354int smp_ipi_irq_setup(int cpu, int irq) 357int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq)
355{ 358{
356 int *dev = per_cpu_ptr(&ipi_dev, cpu); 359 int *dev = per_cpu_ptr(&ipi_dev, cpu);
360 unsigned int virq = irq_find_mapping(NULL, hwirq);
361
362 if (!virq)
363 panic("Cannot find virq for root domain and hwirq=%lu", hwirq);
357 364
358 /* Boot cpu calls request, all call enable */ 365 /* Boot cpu calls request, all call enable */
359 if (!cpu) { 366 if (!cpu) {
360 int rc; 367 int rc;
361 368
362 rc = request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev); 369 rc = request_percpu_irq(virq, do_IPI, "IPI Interrupt", dev);
363 if (rc) 370 if (rc)
364 panic("Percpu IRQ request failed for %d\n", irq); 371 panic("Percpu IRQ request failed for %u\n", virq);
365 } 372 }
366 373
367 enable_percpu_irq(irq, 0); 374 enable_percpu_irq(virq, 0);
368 375
369 return 0; 376 return 0;
370} 377}
diff --git a/arch/arc/kernel/time.c b/arch/arc/kernel/time.c
index f927b8dc6edd..c10390d1ddb6 100644
--- a/arch/arc/kernel/time.c
+++ b/arch/arc/kernel/time.c
@@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)
152 cycle_t full; 152 cycle_t full;
153 } stamp; 153 } stamp;
154 154
155 155 /*
156 __asm__ __volatile( 156 * hardware has an internal state machine which tracks readout of
157 "1: \n" 157 * low/high and updates the CTRL.status if
158 " lr %0, [AUX_RTC_LOW] \n" 158 * - interrupt/exception taken between the two reads
159 " lr %1, [AUX_RTC_HIGH] \n" 159 * - high increments after low has been read
160 " lr %2, [AUX_RTC_CTRL] \n" 160 */
161 " bbit0.nt %2, 31, 1b \n" 161 do {
162 : "=r" (stamp.low), "=r" (stamp.high), "=r" (status)); 162 stamp.low = read_aux_reg(AUX_RTC_LOW);
163 stamp.high = read_aux_reg(AUX_RTC_HIGH);
164 status = read_aux_reg(AUX_RTC_CTRL);
165 } while (!(status & _BITUL(31)));
163 166
164 return stamp.full; 167 return stamp.full;
165} 168}
diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c
index 2b96cfc3be75..50d71695cd4e 100644
--- a/arch/arc/mm/cache.c
+++ b/arch/arc/mm/cache.c
@@ -23,7 +23,7 @@
23 23
24static int l2_line_sz; 24static int l2_line_sz;
25static int ioc_exists; 25static int ioc_exists;
26int slc_enable = 1, ioc_enable = 1; 26int slc_enable = 1, ioc_enable = 0;
27unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */ 27unsigned long perip_base = ARC_UNCACHED_ADDR_SPACE; /* legacy value for boot */
28unsigned long perip_end = 0xFFFFFFFF; /* legacy value */ 28unsigned long perip_end = 0xFFFFFFFF; /* legacy value */
29 29
diff --git a/arch/arc/mm/dma.c b/arch/arc/mm/dma.c
index 60aab5a7522b..cd8aad8226dd 100644
--- a/arch/arc/mm/dma.c
+++ b/arch/arc/mm/dma.c
@@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,
105 __free_pages(page, get_order(size)); 105 __free_pages(page, get_order(size));
106} 106}
107 107
108static int arc_dma_mmap(struct device *dev, struct vm_area_struct *vma,
109 void *cpu_addr, dma_addr_t dma_addr, size_t size,
110 unsigned long attrs)
111{
112 unsigned long user_count = vma_pages(vma);
113 unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
114 unsigned long pfn = __phys_to_pfn(plat_dma_to_phys(dev, dma_addr));
115 unsigned long off = vma->vm_pgoff;
116 int ret = -ENXIO;
117
118 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
119
120 if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
121 return ret;
122
123 if (off < count && user_count <= (count - off)) {
124 ret = remap_pfn_range(vma, vma->vm_start,
125 pfn + off,
126 user_count << PAGE_SHIFT,
127 vma->vm_page_prot);
128 }
129
130 return ret;
131}
132
108/* 133/*
109 * streaming DMA Mapping API... 134 * streaming DMA Mapping API...
110 * CPU accesses page via normal paddr, thus needs to explicitly made 135 * CPU accesses page via normal paddr, thus needs to explicitly made
@@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask)
193struct dma_map_ops arc_dma_ops = { 218struct dma_map_ops arc_dma_ops = {
194 .alloc = arc_dma_alloc, 219 .alloc = arc_dma_alloc,
195 .free = arc_dma_free, 220 .free = arc_dma_free,
221 .mmap = arc_dma_mmap,
196 .map_page = arc_dma_map_page, 222 .map_page = arc_dma_map_page,
197 .map_sg = arc_dma_map_sg, 223 .map_sg = arc_dma_map_sg,
198 .sync_single_for_device = arc_dma_sync_single_for_device, 224 .sync_single_for_device = arc_dma_sync_single_for_device,
diff --git a/arch/arc/plat-eznps/smp.c b/arch/arc/plat-eznps/smp.c
index 5e901f86e4bd..56a4c8522f11 100644
--- a/arch/arc/plat-eznps/smp.c
+++ b/arch/arc/plat-eznps/smp.c
@@ -140,16 +140,10 @@ static void eznps_init_per_cpu(int cpu)
140 mtm_enable_core(cpu); 140 mtm_enable_core(cpu);
141} 141}
142 142
143static void eznps_ipi_clear(int irq)
144{
145 write_aux_reg(CTOP_AUX_IACK, 1 << irq);
146}
147
148struct plat_smp_ops plat_smp_ops = { 143struct plat_smp_ops plat_smp_ops = {
149 .info = smp_cpuinfo_buf, 144 .info = smp_cpuinfo_buf,
150 .init_early_smp = eznps_init_cpumasks, 145 .init_early_smp = eznps_init_cpumasks,
151 .cpu_kick = eznps_smp_wakeup_cpu, 146 .cpu_kick = eznps_smp_wakeup_cpu,
152 .ipi_send = eznps_ipi_send, 147 .ipi_send = eznps_ipi_send,
153 .init_per_cpu = eznps_init_per_cpu, 148 .init_per_cpu = eznps_init_per_cpu,
154 .ipi_clear = eznps_ipi_clear,
155}; 149};
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
index befcd2619902..c558ba75cbcc 100644
--- a/arch/arm/boot/dts/Makefile
+++ b/arch/arm/boot/dts/Makefile
@@ -745,7 +745,6 @@ dtb-$(CONFIG_MACH_SUN4I) += \
745 sun4i-a10-pcduino2.dtb \ 745 sun4i-a10-pcduino2.dtb \
746 sun4i-a10-pov-protab2-ips9.dtb 746 sun4i-a10-pov-protab2-ips9.dtb
747dtb-$(CONFIG_MACH_SUN5I) += \ 747dtb-$(CONFIG_MACH_SUN5I) += \
748 ntc-gr8-evb.dtb \
749 sun5i-a10s-auxtek-t003.dtb \ 748 sun5i-a10s-auxtek-t003.dtb \
750 sun5i-a10s-auxtek-t004.dtb \ 749 sun5i-a10s-auxtek-t004.dtb \
751 sun5i-a10s-mk802.dtb \ 750 sun5i-a10s-mk802.dtb \
@@ -761,6 +760,7 @@ dtb-$(CONFIG_MACH_SUN5I) += \
761 sun5i-a13-olinuxino-micro.dtb \ 760 sun5i-a13-olinuxino-micro.dtb \
762 sun5i-a13-q8-tablet.dtb \ 761 sun5i-a13-q8-tablet.dtb \
763 sun5i-a13-utoo-p66.dtb \ 762 sun5i-a13-utoo-p66.dtb \
763 sun5i-gr8-evb.dtb \
764 sun5i-r8-chip.dtb 764 sun5i-r8-chip.dtb
765dtb-$(CONFIG_MACH_SUN6I) += \ 765dtb-$(CONFIG_MACH_SUN6I) += \
766 sun6i-a31-app4-evb1.dtb \ 766 sun6i-a31-app4-evb1.dtb \
diff --git a/arch/arm/boot/dts/imx53-qsb.dts b/arch/arm/boot/dts/imx53-qsb.dts
index dec4b073ceb1..379939699164 100644
--- a/arch/arm/boot/dts/imx53-qsb.dts
+++ b/arch/arm/boot/dts/imx53-qsb.dts
@@ -64,8 +64,8 @@
64 }; 64 };
65 65
66 ldo3_reg: ldo3 { 66 ldo3_reg: ldo3 {
67 regulator-min-microvolt = <600000>; 67 regulator-min-microvolt = <1725000>;
68 regulator-max-microvolt = <1800000>; 68 regulator-max-microvolt = <3300000>;
69 regulator-always-on; 69 regulator-always-on;
70 }; 70 };
71 71
@@ -76,8 +76,8 @@
76 }; 76 };
77 77
78 ldo5_reg: ldo5 { 78 ldo5_reg: ldo5 {
79 regulator-min-microvolt = <1725000>; 79 regulator-min-microvolt = <1200000>;
80 regulator-max-microvolt = <3300000>; 80 regulator-max-microvolt = <3600000>;
81 regulator-always-on; 81 regulator-always-on;
82 }; 82 };
83 83
@@ -100,14 +100,14 @@
100 }; 100 };
101 101
102 ldo9_reg: ldo9 { 102 ldo9_reg: ldo9 {
103 regulator-min-microvolt = <1200000>; 103 regulator-min-microvolt = <1250000>;
104 regulator-max-microvolt = <3600000>; 104 regulator-max-microvolt = <3600000>;
105 regulator-always-on; 105 regulator-always-on;
106 }; 106 };
107 107
108 ldo10_reg: ldo10 { 108 ldo10_reg: ldo10 {
109 regulator-min-microvolt = <1250000>; 109 regulator-min-microvolt = <1200000>;
110 regulator-max-microvolt = <3650000>; 110 regulator-max-microvolt = <3600000>;
111 regulator-always-on; 111 regulator-always-on;
112 }; 112 };
113 }; 113 };
diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi
index 0d7d5ac6257b..2b6cb05bc01a 100644
--- a/arch/arm/boot/dts/imx7s.dtsi
+++ b/arch/arm/boot/dts/imx7s.dtsi
@@ -643,9 +643,8 @@
643 reg = <0x30730000 0x10000>; 643 reg = <0x30730000 0x10000>;
644 interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>; 644 interrupts = <GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>;
645 clocks = <&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>, 645 clocks = <&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>,
646 <&clks IMX7D_CLK_DUMMY>, 646 <&clks IMX7D_LCDIF_PIXEL_ROOT_CLK>;
647 <&clks IMX7D_CLK_DUMMY>; 647 clock-names = "pix", "axi";
648 clock-names = "pix", "axi", "disp_axi";
649 status = "disabled"; 648 status = "disabled";
650 }; 649 };
651 }; 650 };
diff --git a/arch/arm/boot/dts/logicpd-som-lv.dtsi b/arch/arm/boot/dts/logicpd-som-lv.dtsi
index 0ff1c2de95bf..26cce4d18405 100644
--- a/arch/arm/boot/dts/logicpd-som-lv.dtsi
+++ b/arch/arm/boot/dts/logicpd-som-lv.dtsi
@@ -13,6 +13,11 @@
13 }; 13 };
14 }; 14 };
15 15
16 memory@80000000 {
17 device_type = "memory";
18 reg = <0x80000000 0>;
19 };
20
16 wl12xx_vmmc: wl12xx_vmmc { 21 wl12xx_vmmc: wl12xx_vmmc {
17 compatible = "regulator-fixed"; 22 compatible = "regulator-fixed";
18 regulator-name = "vwl1271"; 23 regulator-name = "vwl1271";
diff --git a/arch/arm/boot/dts/logicpd-torpedo-som.dtsi b/arch/arm/boot/dts/logicpd-torpedo-som.dtsi
index 731ec37aed5b..8f9a69ca818c 100644
--- a/arch/arm/boot/dts/logicpd-torpedo-som.dtsi
+++ b/arch/arm/boot/dts/logicpd-torpedo-som.dtsi
@@ -13,9 +13,9 @@
13 }; 13 };
14 }; 14 };
15 15
16 memory@0 { 16 memory@80000000 {
17 device_type = "memory"; 17 device_type = "memory";
18 reg = <0 0>; 18 reg = <0x80000000 0>;
19 }; 19 };
20 20
21 leds { 21 leds {
diff --git a/arch/arm/boot/dts/omap5-board-common.dtsi b/arch/arm/boot/dts/omap5-board-common.dtsi
index 6365635fea5c..4caadb253249 100644
--- a/arch/arm/boot/dts/omap5-board-common.dtsi
+++ b/arch/arm/boot/dts/omap5-board-common.dtsi
@@ -124,6 +124,7 @@
124 compatible = "ti,abe-twl6040"; 124 compatible = "ti,abe-twl6040";
125 ti,model = "omap5-uevm"; 125 ti,model = "omap5-uevm";
126 126
127 ti,jack-detection;
127 ti,mclk-freq = <19200000>; 128 ti,mclk-freq = <19200000>;
128 129
129 ti,mcpdm = <&mcpdm>; 130 ti,mcpdm = <&mcpdm>;
@@ -415,7 +416,7 @@
415 ti,backup-battery-charge-high-current; 416 ti,backup-battery-charge-high-current;
416 }; 417 };
417 418
418 gpadc { 419 gpadc: gpadc {
419 compatible = "ti,palmas-gpadc"; 420 compatible = "ti,palmas-gpadc";
420 interrupts = <18 0 421 interrupts = <18 0
421 16 0 422 16 0
@@ -475,8 +476,8 @@
475 smps6_reg: smps6 { 476 smps6_reg: smps6 {
476 /* VDD_DDR3 - over VDD_SMPS6 */ 477 /* VDD_DDR3 - over VDD_SMPS6 */
477 regulator-name = "smps6"; 478 regulator-name = "smps6";
478 regulator-min-microvolt = <1200000>; 479 regulator-min-microvolt = <1350000>;
479 regulator-max-microvolt = <1200000>; 480 regulator-max-microvolt = <1350000>;
480 regulator-always-on; 481 regulator-always-on;
481 regulator-boot-on; 482 regulator-boot-on;
482 }; 483 };
diff --git a/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts b/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts
index 1cf644bfd7ea..51dc734cd5b9 100644
--- a/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts
+++ b/arch/arm/boot/dts/orion5x-linkstation-lsgl.dts
@@ -82,6 +82,10 @@
82 gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>; 82 gpios = <&gpio0 9 GPIO_ACTIVE_HIGH>;
83}; 83};
84 84
85&sata {
86 nr-ports = <2>;
87};
88
85&ehci1 { 89&ehci1 {
86 status = "okay"; 90 status = "okay";
87}; 91};
diff --git a/arch/arm/boot/dts/stih407-family.dtsi b/arch/arm/boot/dts/stih407-family.dtsi
index 91096a49efa9..8f79b4147bba 100644
--- a/arch/arm/boot/dts/stih407-family.dtsi
+++ b/arch/arm/boot/dts/stih407-family.dtsi
@@ -283,6 +283,8 @@
283 clock-frequency = <400000>; 283 clock-frequency = <400000>;
284 pinctrl-names = "default"; 284 pinctrl-names = "default";
285 pinctrl-0 = <&pinctrl_i2c0_default>; 285 pinctrl-0 = <&pinctrl_i2c0_default>;
286 #address-cells = <1>;
287 #size-cells = <0>;
286 288
287 status = "disabled"; 289 status = "disabled";
288 }; 290 };
@@ -296,6 +298,8 @@
296 clock-frequency = <400000>; 298 clock-frequency = <400000>;
297 pinctrl-names = "default"; 299 pinctrl-names = "default";
298 pinctrl-0 = <&pinctrl_i2c1_default>; 300 pinctrl-0 = <&pinctrl_i2c1_default>;
301 #address-cells = <1>;
302 #size-cells = <0>;
299 303
300 status = "disabled"; 304 status = "disabled";
301 }; 305 };
@@ -309,6 +313,8 @@
309 clock-frequency = <400000>; 313 clock-frequency = <400000>;
310 pinctrl-names = "default"; 314 pinctrl-names = "default";
311 pinctrl-0 = <&pinctrl_i2c2_default>; 315 pinctrl-0 = <&pinctrl_i2c2_default>;
316 #address-cells = <1>;
317 #size-cells = <0>;
312 318
313 status = "disabled"; 319 status = "disabled";
314 }; 320 };
@@ -322,6 +328,8 @@
322 clock-frequency = <400000>; 328 clock-frequency = <400000>;
323 pinctrl-names = "default"; 329 pinctrl-names = "default";
324 pinctrl-0 = <&pinctrl_i2c3_default>; 330 pinctrl-0 = <&pinctrl_i2c3_default>;
331 #address-cells = <1>;
332 #size-cells = <0>;
325 333
326 status = "disabled"; 334 status = "disabled";
327 }; 335 };
@@ -335,6 +343,8 @@
335 clock-frequency = <400000>; 343 clock-frequency = <400000>;
336 pinctrl-names = "default"; 344 pinctrl-names = "default";
337 pinctrl-0 = <&pinctrl_i2c4_default>; 345 pinctrl-0 = <&pinctrl_i2c4_default>;
346 #address-cells = <1>;
347 #size-cells = <0>;
338 348
339 status = "disabled"; 349 status = "disabled";
340 }; 350 };
@@ -348,6 +358,8 @@
348 clock-frequency = <400000>; 358 clock-frequency = <400000>;
349 pinctrl-names = "default"; 359 pinctrl-names = "default";
350 pinctrl-0 = <&pinctrl_i2c5_default>; 360 pinctrl-0 = <&pinctrl_i2c5_default>;
361 #address-cells = <1>;
362 #size-cells = <0>;
351 363
352 status = "disabled"; 364 status = "disabled";
353 }; 365 };
@@ -363,6 +375,8 @@
363 clock-frequency = <400000>; 375 clock-frequency = <400000>;
364 pinctrl-names = "default"; 376 pinctrl-names = "default";
365 pinctrl-0 = <&pinctrl_i2c10_default>; 377 pinctrl-0 = <&pinctrl_i2c10_default>;
378 #address-cells = <1>;
379 #size-cells = <0>;
366 380
367 status = "disabled"; 381 status = "disabled";
368 }; 382 };
@@ -376,6 +390,8 @@
376 clock-frequency = <400000>; 390 clock-frequency = <400000>;
377 pinctrl-names = "default"; 391 pinctrl-names = "default";
378 pinctrl-0 = <&pinctrl_i2c11_default>; 392 pinctrl-0 = <&pinctrl_i2c11_default>;
393 #address-cells = <1>;
394 #size-cells = <0>;
379 395
380 status = "disabled"; 396 status = "disabled";
381 }; 397 };
diff --git a/arch/arm/boot/dts/stih410-b2260.dts b/arch/arm/boot/dts/stih410-b2260.dts
index ef2ff2f518f6..7fb507fcba7e 100644
--- a/arch/arm/boot/dts/stih410-b2260.dts
+++ b/arch/arm/boot/dts/stih410-b2260.dts
@@ -74,7 +74,7 @@
74 /* Low speed expansion connector */ 74 /* Low speed expansion connector */
75 spi0: spi@9844000 { 75 spi0: spi@9844000 {
76 label = "LS-SPI0"; 76 label = "LS-SPI0";
77 cs-gpio = <&pio30 3 0>; 77 cs-gpios = <&pio30 3 0>;
78 status = "okay"; 78 status = "okay";
79 }; 79 };
80 80
diff --git a/arch/arm/boot/dts/ntc-gr8-evb.dts b/arch/arm/boot/dts/sun5i-gr8-evb.dts
index 4b622f3b5220..714381fd64d7 100644
--- a/arch/arm/boot/dts/ntc-gr8-evb.dts
+++ b/arch/arm/boot/dts/sun5i-gr8-evb.dts
@@ -44,7 +44,7 @@
44 */ 44 */
45 45
46/dts-v1/; 46/dts-v1/;
47#include "ntc-gr8.dtsi" 47#include "sun5i-gr8.dtsi"
48#include "sunxi-common-regulators.dtsi" 48#include "sunxi-common-regulators.dtsi"
49 49
50#include <dt-bindings/gpio/gpio.h> 50#include <dt-bindings/gpio/gpio.h>
diff --git a/arch/arm/boot/dts/ntc-gr8.dtsi b/arch/arm/boot/dts/sun5i-gr8.dtsi
index ca54e03ef366..ca54e03ef366 100644
--- a/arch/arm/boot/dts/ntc-gr8.dtsi
+++ b/arch/arm/boot/dts/sun5i-gr8.dtsi
diff --git a/arch/arm/boot/dts/sun8i-a23-a33.dtsi b/arch/arm/boot/dts/sun8i-a23-a33.dtsi
index 48fc24f36fcb..300a1bd5a6ec 100644
--- a/arch/arm/boot/dts/sun8i-a23-a33.dtsi
+++ b/arch/arm/boot/dts/sun8i-a23-a33.dtsi
@@ -282,11 +282,15 @@
282 uart1_pins_a: uart1@0 { 282 uart1_pins_a: uart1@0 {
283 allwinner,pins = "PG6", "PG7"; 283 allwinner,pins = "PG6", "PG7";
284 allwinner,function = "uart1"; 284 allwinner,function = "uart1";
285 allwinner,drive = <SUN4I_PINCTRL_10_MA>;
286 allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
285 }; 287 };
286 288
287 uart1_pins_cts_rts_a: uart1-cts-rts@0 { 289 uart1_pins_cts_rts_a: uart1-cts-rts@0 {
288 allwinner,pins = "PG8", "PG9"; 290 allwinner,pins = "PG8", "PG9";
289 allwinner,function = "uart1"; 291 allwinner,function = "uart1";
292 allwinner,drive = <SUN4I_PINCTRL_10_MA>;
293 allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
290 }; 294 };
291 295
292 mmc0_pins_a: mmc0@0 { 296 mmc0_pins_a: mmc0@0 {
diff --git a/arch/arm/boot/dts/sun8i-h3.dtsi b/arch/arm/boot/dts/sun8i-h3.dtsi
index 75a865406d3e..f4ba088b225e 100644
--- a/arch/arm/boot/dts/sun8i-h3.dtsi
+++ b/arch/arm/boot/dts/sun8i-h3.dtsi
@@ -410,7 +410,7 @@
410 }; 410 };
411 411
412 uart3_pins: uart3 { 412 uart3_pins: uart3 {
413 allwinner,pins = "PG13", "PG14"; 413 allwinner,pins = "PA13", "PA14";
414 allwinner,function = "uart3"; 414 allwinner,function = "uart3";
415 allwinner,drive = <SUN4I_PINCTRL_10_MA>; 415 allwinner,drive = <SUN4I_PINCTRL_10_MA>;
416 allwinner,pull = <SUN4I_PINCTRL_NO_PULL>; 416 allwinner,pull = <SUN4I_PINCTRL_NO_PULL>;
diff --git a/arch/arm/include/asm/Kbuild b/arch/arm/include/asm/Kbuild
index 0745538b26d3..55e0e3ea9cb6 100644
--- a/arch/arm/include/asm/Kbuild
+++ b/arch/arm/include/asm/Kbuild
@@ -8,7 +8,6 @@ generic-y += early_ioremap.h
8generic-y += emergency-restart.h 8generic-y += emergency-restart.h
9generic-y += errno.h 9generic-y += errno.h
10generic-y += exec.h 10generic-y += exec.h
11generic-y += export.h
12generic-y += ioctl.h 11generic-y += ioctl.h
13generic-y += ipcbuf.h 12generic-y += ipcbuf.h
14generic-y += irq_regs.h 13generic-y += irq_regs.h
diff --git a/arch/arm/include/asm/kvm_asm.h b/arch/arm/include/asm/kvm_asm.h
index d7ea6bcb29bf..8ef05381984b 100644
--- a/arch/arm/include/asm/kvm_asm.h
+++ b/arch/arm/include/asm/kvm_asm.h
@@ -66,6 +66,7 @@ extern char __kvm_hyp_vector[];
66extern void __kvm_flush_vm_context(void); 66extern void __kvm_flush_vm_context(void);
67extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); 67extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
68extern void __kvm_tlb_flush_vmid(struct kvm *kvm); 68extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
69extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
69 70
70extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu); 71extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
71 72
diff --git a/arch/arm/include/asm/kvm_host.h b/arch/arm/include/asm/kvm_host.h
index 2d19e02d03fd..d5423ab15ed5 100644
--- a/arch/arm/include/asm/kvm_host.h
+++ b/arch/arm/include/asm/kvm_host.h
@@ -57,6 +57,9 @@ struct kvm_arch {
57 /* VTTBR value associated with below pgd and vmid */ 57 /* VTTBR value associated with below pgd and vmid */
58 u64 vttbr; 58 u64 vttbr;
59 59
60 /* The last vcpu id that ran on each physical CPU */
61 int __percpu *last_vcpu_ran;
62
60 /* Timer */ 63 /* Timer */
61 struct arch_timer_kvm timer; 64 struct arch_timer_kvm timer;
62 65
diff --git a/arch/arm/include/asm/kvm_hyp.h b/arch/arm/include/asm/kvm_hyp.h
index 343135ede5fa..58508900c4bb 100644
--- a/arch/arm/include/asm/kvm_hyp.h
+++ b/arch/arm/include/asm/kvm_hyp.h
@@ -71,6 +71,7 @@
71#define ICIALLUIS __ACCESS_CP15(c7, 0, c1, 0) 71#define ICIALLUIS __ACCESS_CP15(c7, 0, c1, 0)
72#define ATS1CPR __ACCESS_CP15(c7, 0, c8, 0) 72#define ATS1CPR __ACCESS_CP15(c7, 0, c8, 0)
73#define TLBIALLIS __ACCESS_CP15(c8, 0, c3, 0) 73#define TLBIALLIS __ACCESS_CP15(c8, 0, c3, 0)
74#define TLBIALL __ACCESS_CP15(c8, 0, c7, 0)
74#define TLBIALLNSNHIS __ACCESS_CP15(c8, 4, c3, 4) 75#define TLBIALLNSNHIS __ACCESS_CP15(c8, 4, c3, 4)
75#define PRRR __ACCESS_CP15(c10, 0, c2, 0) 76#define PRRR __ACCESS_CP15(c10, 0, c2, 0)
76#define NMRR __ACCESS_CP15(c10, 0, c2, 1) 77#define NMRR __ACCESS_CP15(c10, 0, c2, 1)
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 68c2c097cffe..ad325a8c7e1e 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -33,7 +33,7 @@ endif
33obj-$(CONFIG_CPU_IDLE) += cpuidle.o 33obj-$(CONFIG_CPU_IDLE) += cpuidle.o
34obj-$(CONFIG_ISA_DMA_API) += dma.o 34obj-$(CONFIG_ISA_DMA_API) += dma.o
35obj-$(CONFIG_FIQ) += fiq.o fiqasm.o 35obj-$(CONFIG_FIQ) += fiq.o fiqasm.o
36obj-$(CONFIG_MODULES) += module.o 36obj-$(CONFIG_MODULES) += armksyms.o module.o
37obj-$(CONFIG_ARM_MODULE_PLTS) += module-plts.o 37obj-$(CONFIG_ARM_MODULE_PLTS) += module-plts.o
38obj-$(CONFIG_ISA_DMA) += dma-isa.o 38obj-$(CONFIG_ISA_DMA) += dma-isa.o
39obj-$(CONFIG_PCI) += bios32.o isa.o 39obj-$(CONFIG_PCI) += bios32.o isa.o
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c
new file mode 100644
index 000000000000..7e45f69a0ddc
--- /dev/null
+++ b/arch/arm/kernel/armksyms.c
@@ -0,0 +1,183 @@
1/*
2 * linux/arch/arm/kernel/armksyms.c
3 *
4 * Copyright (C) 2000 Russell King
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10#include <linux/export.h>
11#include <linux/sched.h>
12#include <linux/string.h>
13#include <linux/cryptohash.h>
14#include <linux/delay.h>
15#include <linux/in6.h>
16#include <linux/syscalls.h>
17#include <linux/uaccess.h>
18#include <linux/io.h>
19#include <linux/arm-smccc.h>
20
21#include <asm/checksum.h>
22#include <asm/ftrace.h>
23
24/*
25 * libgcc functions - functions that are used internally by the
26 * compiler... (prototypes are not correct though, but that
27 * doesn't really matter since they're not versioned).
28 */
29extern void __ashldi3(void);
30extern void __ashrdi3(void);
31extern void __divsi3(void);
32extern void __lshrdi3(void);
33extern void __modsi3(void);
34extern void __muldi3(void);
35extern void __ucmpdi2(void);
36extern void __udivsi3(void);
37extern void __umodsi3(void);
38extern void __do_div64(void);
39extern void __bswapsi2(void);
40extern void __bswapdi2(void);
41
42extern void __aeabi_idiv(void);
43extern void __aeabi_idivmod(void);
44extern void __aeabi_lasr(void);
45extern void __aeabi_llsl(void);
46extern void __aeabi_llsr(void);
47extern void __aeabi_lmul(void);
48extern void __aeabi_uidiv(void);
49extern void __aeabi_uidivmod(void);
50extern void __aeabi_ulcmp(void);
51
52extern void fpundefinstr(void);
53
54void mmioset(void *, unsigned int, size_t);
55void mmiocpy(void *, const void *, size_t);
56
57 /* platform dependent support */
58EXPORT_SYMBOL(arm_delay_ops);
59
60 /* networking */
61EXPORT_SYMBOL(csum_partial);
62EXPORT_SYMBOL(csum_partial_copy_from_user);
63EXPORT_SYMBOL(csum_partial_copy_nocheck);
64EXPORT_SYMBOL(__csum_ipv6_magic);
65
66 /* io */
67#ifndef __raw_readsb
68EXPORT_SYMBOL(__raw_readsb);
69#endif
70#ifndef __raw_readsw
71EXPORT_SYMBOL(__raw_readsw);
72#endif
73#ifndef __raw_readsl
74EXPORT_SYMBOL(__raw_readsl);
75#endif
76#ifndef __raw_writesb
77EXPORT_SYMBOL(__raw_writesb);
78#endif
79#ifndef __raw_writesw
80EXPORT_SYMBOL(__raw_writesw);
81#endif
82#ifndef __raw_writesl
83EXPORT_SYMBOL(__raw_writesl);
84#endif
85
86 /* string / mem functions */
87EXPORT_SYMBOL(strchr);
88EXPORT_SYMBOL(strrchr);
89EXPORT_SYMBOL(memset);
90EXPORT_SYMBOL(memcpy);
91EXPORT_SYMBOL(memmove);
92EXPORT_SYMBOL(memchr);
93EXPORT_SYMBOL(__memzero);
94
95EXPORT_SYMBOL(mmioset);
96EXPORT_SYMBOL(mmiocpy);
97
98#ifdef CONFIG_MMU
99EXPORT_SYMBOL(copy_page);
100
101EXPORT_SYMBOL(arm_copy_from_user);
102EXPORT_SYMBOL(arm_copy_to_user);
103EXPORT_SYMBOL(arm_clear_user);
104
105EXPORT_SYMBOL(__get_user_1);
106EXPORT_SYMBOL(__get_user_2);
107EXPORT_SYMBOL(__get_user_4);
108EXPORT_SYMBOL(__get_user_8);
109
110#ifdef __ARMEB__
111EXPORT_SYMBOL(__get_user_64t_1);
112EXPORT_SYMBOL(__get_user_64t_2);
113EXPORT_SYMBOL(__get_user_64t_4);
114EXPORT_SYMBOL(__get_user_32t_8);
115#endif
116
117EXPORT_SYMBOL(__put_user_1);
118EXPORT_SYMBOL(__put_user_2);
119EXPORT_SYMBOL(__put_user_4);
120EXPORT_SYMBOL(__put_user_8);
121#endif
122
123 /* gcc lib functions */
124EXPORT_SYMBOL(__ashldi3);
125EXPORT_SYMBOL(__ashrdi3);
126EXPORT_SYMBOL(__divsi3);
127EXPORT_SYMBOL(__lshrdi3);
128EXPORT_SYMBOL(__modsi3);
129EXPORT_SYMBOL(__muldi3);
130EXPORT_SYMBOL(__ucmpdi2);
131EXPORT_SYMBOL(__udivsi3);
132EXPORT_SYMBOL(__umodsi3);
133EXPORT_SYMBOL(__do_div64);
134EXPORT_SYMBOL(__bswapsi2);
135EXPORT_SYMBOL(__bswapdi2);
136
137#ifdef CONFIG_AEABI
138EXPORT_SYMBOL(__aeabi_idiv);
139EXPORT_SYMBOL(__aeabi_idivmod);
140EXPORT_SYMBOL(__aeabi_lasr);
141EXPORT_SYMBOL(__aeabi_llsl);
142EXPORT_SYMBOL(__aeabi_llsr);
143EXPORT_SYMBOL(__aeabi_lmul);
144EXPORT_SYMBOL(__aeabi_uidiv);
145EXPORT_SYMBOL(__aeabi_uidivmod);
146EXPORT_SYMBOL(__aeabi_ulcmp);
147#endif
148
149 /* bitops */
150EXPORT_SYMBOL(_set_bit);
151EXPORT_SYMBOL(_test_and_set_bit);
152EXPORT_SYMBOL(_clear_bit);
153EXPORT_SYMBOL(_test_and_clear_bit);
154EXPORT_SYMBOL(_change_bit);
155EXPORT_SYMBOL(_test_and_change_bit);
156EXPORT_SYMBOL(_find_first_zero_bit_le);
157EXPORT_SYMBOL(_find_next_zero_bit_le);
158EXPORT_SYMBOL(_find_first_bit_le);
159EXPORT_SYMBOL(_find_next_bit_le);
160
161#ifdef __ARMEB__
162EXPORT_SYMBOL(_find_first_zero_bit_be);
163EXPORT_SYMBOL(_find_next_zero_bit_be);
164EXPORT_SYMBOL(_find_first_bit_be);
165EXPORT_SYMBOL(_find_next_bit_be);
166#endif
167
168#ifdef CONFIG_FUNCTION_TRACER
169#ifdef CONFIG_OLD_MCOUNT
170EXPORT_SYMBOL(mcount);
171#endif
172EXPORT_SYMBOL(__gnu_mcount_nc);
173#endif
174
175#ifdef CONFIG_ARM_PATCH_PHYS_VIRT
176EXPORT_SYMBOL(__pv_phys_pfn_offset);
177EXPORT_SYMBOL(__pv_offset);
178#endif
179
180#ifdef CONFIG_HAVE_ARM_SMCCC
181EXPORT_SYMBOL(arm_smccc_smc);
182EXPORT_SYMBOL(arm_smccc_hvc);
183#endif
diff --git a/arch/arm/kernel/entry-ftrace.S b/arch/arm/kernel/entry-ftrace.S
index b629d3f11c3d..c73c4030ca5d 100644
--- a/arch/arm/kernel/entry-ftrace.S
+++ b/arch/arm/kernel/entry-ftrace.S
@@ -7,7 +7,6 @@
7#include <asm/assembler.h> 7#include <asm/assembler.h>
8#include <asm/ftrace.h> 8#include <asm/ftrace.h>
9#include <asm/unwind.h> 9#include <asm/unwind.h>
10#include <asm/export.h>
11 10
12#include "entry-header.S" 11#include "entry-header.S"
13 12
@@ -154,7 +153,6 @@ ENTRY(mcount)
154 __mcount _old 153 __mcount _old
155#endif 154#endif
156ENDPROC(mcount) 155ENDPROC(mcount)
157EXPORT_SYMBOL(mcount)
158 156
159#ifdef CONFIG_DYNAMIC_FTRACE 157#ifdef CONFIG_DYNAMIC_FTRACE
160ENTRY(ftrace_caller_old) 158ENTRY(ftrace_caller_old)
@@ -207,7 +205,6 @@ UNWIND(.fnstart)
207#endif 205#endif
208UNWIND(.fnend) 206UNWIND(.fnend)
209ENDPROC(__gnu_mcount_nc) 207ENDPROC(__gnu_mcount_nc)
210EXPORT_SYMBOL(__gnu_mcount_nc)
211 208
212#ifdef CONFIG_DYNAMIC_FTRACE 209#ifdef CONFIG_DYNAMIC_FTRACE
213ENTRY(ftrace_caller) 210ENTRY(ftrace_caller)
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index f41cee4c5746..04286fd9e09c 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -22,7 +22,6 @@
22#include <asm/memory.h> 22#include <asm/memory.h>
23#include <asm/thread_info.h> 23#include <asm/thread_info.h>
24#include <asm/pgtable.h> 24#include <asm/pgtable.h>
25#include <asm/export.h>
26 25
27#if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_SEMIHOSTING) 26#if defined(CONFIG_DEBUG_LL) && !defined(CONFIG_DEBUG_SEMIHOSTING)
28#include CONFIG_DEBUG_LL_INCLUDE 27#include CONFIG_DEBUG_LL_INCLUDE
@@ -728,8 +727,6 @@ __pv_phys_pfn_offset:
728__pv_offset: 727__pv_offset:
729 .quad 0 728 .quad 0
730 .size __pv_offset, . -__pv_offset 729 .size __pv_offset, . -__pv_offset
731EXPORT_SYMBOL(__pv_phys_pfn_offset)
732EXPORT_SYMBOL(__pv_offset)
733#endif 730#endif
734 731
735#include "head-common.S" 732#include "head-common.S"
diff --git a/arch/arm/kernel/smccc-call.S b/arch/arm/kernel/smccc-call.S
index 37669e7e13af..2e48b674aab1 100644
--- a/arch/arm/kernel/smccc-call.S
+++ b/arch/arm/kernel/smccc-call.S
@@ -16,7 +16,6 @@
16#include <asm/opcodes-sec.h> 16#include <asm/opcodes-sec.h>
17#include <asm/opcodes-virt.h> 17#include <asm/opcodes-virt.h>
18#include <asm/unwind.h> 18#include <asm/unwind.h>
19#include <asm/export.h>
20 19
21 /* 20 /*
22 * Wrap c macros in asm macros to delay expansion until after the 21 * Wrap c macros in asm macros to delay expansion until after the
@@ -52,7 +51,6 @@ UNWIND( .fnend)
52ENTRY(arm_smccc_smc) 51ENTRY(arm_smccc_smc)
53 SMCCC SMCCC_SMC 52 SMCCC SMCCC_SMC
54ENDPROC(arm_smccc_smc) 53ENDPROC(arm_smccc_smc)
55EXPORT_SYMBOL(arm_smccc_smc)
56 54
57/* 55/*
58 * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2, 56 * void smccc_hvc(unsigned long a0, unsigned long a1, unsigned long a2,
@@ -62,4 +60,3 @@ EXPORT_SYMBOL(arm_smccc_smc)
62ENTRY(arm_smccc_hvc) 60ENTRY(arm_smccc_hvc)
63 SMCCC SMCCC_HVC 61 SMCCC SMCCC_HVC
64ENDPROC(arm_smccc_hvc) 62ENDPROC(arm_smccc_hvc)
65EXPORT_SYMBOL(arm_smccc_hvc)
diff --git a/arch/arm/kernel/traps.c b/arch/arm/kernel/traps.c
index bc698383e822..9688ec0c6ef4 100644
--- a/arch/arm/kernel/traps.c
+++ b/arch/arm/kernel/traps.c
@@ -74,6 +74,26 @@ void dump_backtrace_entry(unsigned long where, unsigned long from, unsigned long
74 dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs)); 74 dump_mem("", "Exception stack", frame + 4, frame + 4 + sizeof(struct pt_regs));
75} 75}
76 76
77void dump_backtrace_stm(u32 *stack, u32 instruction)
78{
79 char str[80], *p;
80 unsigned int x;
81 int reg;
82
83 for (reg = 10, x = 0, p = str; reg >= 0; reg--) {
84 if (instruction & BIT(reg)) {
85 p += sprintf(p, " r%d:%08x", reg, *stack--);
86 if (++x == 6) {
87 x = 0;
88 p = str;
89 printk("%s\n", str);
90 }
91 }
92 }
93 if (p != str)
94 printk("%s\n", str);
95}
96
77#ifndef CONFIG_ARM_UNWIND 97#ifndef CONFIG_ARM_UNWIND
78/* 98/*
79 * Stack pointers should always be within the kernels view of 99 * Stack pointers should always be within the kernels view of
diff --git a/arch/arm/kernel/vmlinux-xip.lds.S b/arch/arm/kernel/vmlinux-xip.lds.S
index 7fa487ef7e2f..37b2a11af345 100644
--- a/arch/arm/kernel/vmlinux-xip.lds.S
+++ b/arch/arm/kernel/vmlinux-xip.lds.S
@@ -3,6 +3,9 @@
3 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz> 3 * Written by Martin Mares <mj@atrey.karlin.mff.cuni.cz>
4 */ 4 */
5 5
6/* No __ro_after_init data in the .rodata section - which will always be ro */
7#define RO_AFTER_INIT_DATA
8
6#include <asm-generic/vmlinux.lds.h> 9#include <asm-generic/vmlinux.lds.h>
7#include <asm/cache.h> 10#include <asm/cache.h>
8#include <asm/thread_info.h> 11#include <asm/thread_info.h>
@@ -223,6 +226,8 @@ SECTIONS
223 . = ALIGN(PAGE_SIZE); 226 . = ALIGN(PAGE_SIZE);
224 __init_end = .; 227 __init_end = .;
225 228
229 *(.data..ro_after_init)
230
226 NOSAVE_DATA 231 NOSAVE_DATA
227 CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES) 232 CACHELINE_ALIGNED_DATA(L1_CACHE_BYTES)
228 READ_MOSTLY_DATA(L1_CACHE_BYTES) 233 READ_MOSTLY_DATA(L1_CACHE_BYTES)
diff --git a/arch/arm/kvm/arm.c b/arch/arm/kvm/arm.c
index 08bb84f2ad58..19b5f5c1c0ff 100644
--- a/arch/arm/kvm/arm.c
+++ b/arch/arm/kvm/arm.c
@@ -114,11 +114,18 @@ void kvm_arch_check_processor_compat(void *rtn)
114 */ 114 */
115int kvm_arch_init_vm(struct kvm *kvm, unsigned long type) 115int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
116{ 116{
117 int ret = 0; 117 int ret, cpu;
118 118
119 if (type) 119 if (type)
120 return -EINVAL; 120 return -EINVAL;
121 121
122 kvm->arch.last_vcpu_ran = alloc_percpu(typeof(*kvm->arch.last_vcpu_ran));
123 if (!kvm->arch.last_vcpu_ran)
124 return -ENOMEM;
125
126 for_each_possible_cpu(cpu)
127 *per_cpu_ptr(kvm->arch.last_vcpu_ran, cpu) = -1;
128
122 ret = kvm_alloc_stage2_pgd(kvm); 129 ret = kvm_alloc_stage2_pgd(kvm);
123 if (ret) 130 if (ret)
124 goto out_fail_alloc; 131 goto out_fail_alloc;
@@ -141,6 +148,8 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
141out_free_stage2_pgd: 148out_free_stage2_pgd:
142 kvm_free_stage2_pgd(kvm); 149 kvm_free_stage2_pgd(kvm);
143out_fail_alloc: 150out_fail_alloc:
151 free_percpu(kvm->arch.last_vcpu_ran);
152 kvm->arch.last_vcpu_ran = NULL;
144 return ret; 153 return ret;
145} 154}
146 155
@@ -168,6 +177,9 @@ void kvm_arch_destroy_vm(struct kvm *kvm)
168{ 177{
169 int i; 178 int i;
170 179
180 free_percpu(kvm->arch.last_vcpu_ran);
181 kvm->arch.last_vcpu_ran = NULL;
182
171 for (i = 0; i < KVM_MAX_VCPUS; ++i) { 183 for (i = 0; i < KVM_MAX_VCPUS; ++i) {
172 if (kvm->vcpus[i]) { 184 if (kvm->vcpus[i]) {
173 kvm_arch_vcpu_free(kvm->vcpus[i]); 185 kvm_arch_vcpu_free(kvm->vcpus[i]);
@@ -312,6 +324,19 @@ int kvm_arch_vcpu_init(struct kvm_vcpu *vcpu)
312 324
313void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu) 325void kvm_arch_vcpu_load(struct kvm_vcpu *vcpu, int cpu)
314{ 326{
327 int *last_ran;
328
329 last_ran = this_cpu_ptr(vcpu->kvm->arch.last_vcpu_ran);
330
331 /*
332 * We might get preempted before the vCPU actually runs, but
333 * over-invalidation doesn't affect correctness.
334 */
335 if (*last_ran != vcpu->vcpu_id) {
336 kvm_call_hyp(__kvm_tlb_flush_local_vmid, vcpu);
337 *last_ran = vcpu->vcpu_id;
338 }
339
315 vcpu->cpu = cpu; 340 vcpu->cpu = cpu;
316 vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state); 341 vcpu->arch.host_cpu_context = this_cpu_ptr(kvm_host_cpu_state);
317 342
diff --git a/arch/arm/kvm/hyp/tlb.c b/arch/arm/kvm/hyp/tlb.c
index 729652854f90..6d810af2d9fd 100644
--- a/arch/arm/kvm/hyp/tlb.c
+++ b/arch/arm/kvm/hyp/tlb.c
@@ -55,6 +55,21 @@ void __hyp_text __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa)
55 __kvm_tlb_flush_vmid(kvm); 55 __kvm_tlb_flush_vmid(kvm);
56} 56}
57 57
58void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
59{
60 struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
61
62 /* Switch to requested VMID */
63 write_sysreg(kvm->arch.vttbr, VTTBR);
64 isb();
65
66 write_sysreg(0, TLBIALL);
67 dsb(nsh);
68 isb();
69
70 write_sysreg(0, VTTBR);
71}
72
58void __hyp_text __kvm_flush_vm_context(void) 73void __hyp_text __kvm_flush_vm_context(void)
59{ 74{
60 write_sysreg(0, TLBIALLNSNHIS); 75 write_sysreg(0, TLBIALLNSNHIS);
diff --git a/arch/arm/lib/ashldi3.S b/arch/arm/lib/ashldi3.S
index a7e7de89bd75..b05e95840651 100644
--- a/arch/arm/lib/ashldi3.S
+++ b/arch/arm/lib/ashldi3.S
@@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */
28 28
29#include <linux/linkage.h> 29#include <linux/linkage.h>
30#include <asm/assembler.h> 30#include <asm/assembler.h>
31#include <asm/export.h>
32 31
33#ifdef __ARMEB__ 32#ifdef __ARMEB__
34#define al r1 33#define al r1
@@ -53,5 +52,3 @@ ENTRY(__aeabi_llsl)
53 52
54ENDPROC(__ashldi3) 53ENDPROC(__ashldi3)
55ENDPROC(__aeabi_llsl) 54ENDPROC(__aeabi_llsl)
56EXPORT_SYMBOL(__ashldi3)
57EXPORT_SYMBOL(__aeabi_llsl)
diff --git a/arch/arm/lib/ashrdi3.S b/arch/arm/lib/ashrdi3.S
index 490336e42518..275d7d2341a4 100644
--- a/arch/arm/lib/ashrdi3.S
+++ b/arch/arm/lib/ashrdi3.S
@@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */
28 28
29#include <linux/linkage.h> 29#include <linux/linkage.h>
30#include <asm/assembler.h> 30#include <asm/assembler.h>
31#include <asm/export.h>
32 31
33#ifdef __ARMEB__ 32#ifdef __ARMEB__
34#define al r1 33#define al r1
@@ -53,5 +52,3 @@ ENTRY(__aeabi_lasr)
53 52
54ENDPROC(__ashrdi3) 53ENDPROC(__ashrdi3)
55ENDPROC(__aeabi_lasr) 54ENDPROC(__aeabi_lasr)
56EXPORT_SYMBOL(__ashrdi3)
57EXPORT_SYMBOL(__aeabi_lasr)
diff --git a/arch/arm/lib/backtrace.S b/arch/arm/lib/backtrace.S
index fab5a50503ae..7d7952e5a3b1 100644
--- a/arch/arm/lib/backtrace.S
+++ b/arch/arm/lib/backtrace.S
@@ -10,6 +10,7 @@
10 * 27/03/03 Ian Molton Clean up CONFIG_CPU 10 * 27/03/03 Ian Molton Clean up CONFIG_CPU
11 * 11 *
12 */ 12 */
13#include <linux/kern_levels.h>
13#include <linux/linkage.h> 14#include <linux/linkage.h>
14#include <asm/assembler.h> 15#include <asm/assembler.h>
15 .text 16 .text
@@ -83,13 +84,13 @@ for_each_frame: tst frame, mask @ Check for address exceptions
83 teq r3, r1, lsr #11 84 teq r3, r1, lsr #11
84 ldreq r0, [frame, #-8] @ get sp 85 ldreq r0, [frame, #-8] @ get sp
85 subeq r0, r0, #4 @ point at the last arg 86 subeq r0, r0, #4 @ point at the last arg
86 bleq .Ldumpstm @ dump saved registers 87 bleq dump_backtrace_stm @ dump saved registers
87 88
881004: ldr r1, [sv_pc, #0] @ if stmfd sp!, {..., fp, ip, lr, pc} 891004: ldr r1, [sv_pc, #0] @ if stmfd sp!, {..., fp, ip, lr, pc}
89 ldr r3, .Ldsi @ instruction exists, 90 ldr r3, .Ldsi @ instruction exists,
90 teq r3, r1, lsr #11 91 teq r3, r1, lsr #11
91 subeq r0, frame, #16 92 subeq r0, frame, #16
92 bleq .Ldumpstm @ dump saved registers 93 bleq dump_backtrace_stm @ dump saved registers
93 94
94 teq sv_fp, #0 @ zero saved fp means 95 teq sv_fp, #0 @ zero saved fp means
95 beq no_frame @ no further frames 96 beq no_frame @ no further frames
@@ -112,38 +113,6 @@ ENDPROC(c_backtrace)
112 .long 1004b, 1006b 113 .long 1004b, 1006b
113 .popsection 114 .popsection
114 115
115#define instr r4
116#define reg r5
117#define stack r6
118
119.Ldumpstm: stmfd sp!, {instr, reg, stack, r7, lr}
120 mov stack, r0
121 mov instr, r1
122 mov reg, #10
123 mov r7, #0
1241: mov r3, #1
125 ARM( tst instr, r3, lsl reg )
126 THUMB( lsl r3, reg )
127 THUMB( tst instr, r3 )
128 beq 2f
129 add r7, r7, #1
130 teq r7, #6
131 moveq r7, #0
132 adr r3, .Lcr
133 addne r3, r3, #1 @ skip newline
134 ldr r2, [stack], #-4
135 mov r1, reg
136 adr r0, .Lfp
137 bl printk
1382: subs reg, reg, #1
139 bpl 1b
140 teq r7, #0
141 adrne r0, .Lcr
142 blne printk
143 ldmfd sp!, {instr, reg, stack, r7, pc}
144
145.Lfp: .asciz " r%d:%08x%s"
146.Lcr: .asciz "\n"
147.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n" 116.Lbad: .asciz "Backtrace aborted due to bad frame pointer <%p>\n"
148 .align 117 .align
149.Ldsi: .word 0xe92dd800 >> 11 @ stmfd sp!, {... fp, ip, lr, pc} 118.Ldsi: .word 0xe92dd800 >> 11 @ stmfd sp!, {... fp, ip, lr, pc}
diff --git a/arch/arm/lib/bitops.h b/arch/arm/lib/bitops.h
index df06638b327c..7d807cfd8ef5 100644
--- a/arch/arm/lib/bitops.h
+++ b/arch/arm/lib/bitops.h
@@ -1,6 +1,5 @@
1#include <asm/assembler.h> 1#include <asm/assembler.h>
2#include <asm/unwind.h> 2#include <asm/unwind.h>
3#include <asm/export.h>
4 3
5#if __LINUX_ARM_ARCH__ >= 6 4#if __LINUX_ARM_ARCH__ >= 6
6 .macro bitop, name, instr 5 .macro bitop, name, instr
@@ -26,7 +25,6 @@ UNWIND( .fnstart )
26 bx lr 25 bx lr
27UNWIND( .fnend ) 26UNWIND( .fnend )
28ENDPROC(\name ) 27ENDPROC(\name )
29EXPORT_SYMBOL(\name )
30 .endm 28 .endm
31 29
32 .macro testop, name, instr, store 30 .macro testop, name, instr, store
@@ -57,7 +55,6 @@ UNWIND( .fnstart )
572: bx lr 552: bx lr
58UNWIND( .fnend ) 56UNWIND( .fnend )
59ENDPROC(\name ) 57ENDPROC(\name )
60EXPORT_SYMBOL(\name )
61 .endm 58 .endm
62#else 59#else
63 .macro bitop, name, instr 60 .macro bitop, name, instr
@@ -77,7 +74,6 @@ UNWIND( .fnstart )
77 ret lr 74 ret lr
78UNWIND( .fnend ) 75UNWIND( .fnend )
79ENDPROC(\name ) 76ENDPROC(\name )
80EXPORT_SYMBOL(\name )
81 .endm 77 .endm
82 78
83/** 79/**
@@ -106,6 +102,5 @@ UNWIND( .fnstart )
106 ret lr 102 ret lr
107UNWIND( .fnend ) 103UNWIND( .fnend )
108ENDPROC(\name ) 104ENDPROC(\name )
109EXPORT_SYMBOL(\name )
110 .endm 105 .endm
111#endif 106#endif
diff --git a/arch/arm/lib/bswapsdi2.S b/arch/arm/lib/bswapsdi2.S
index f05f78247304..07cda737bb11 100644
--- a/arch/arm/lib/bswapsdi2.S
+++ b/arch/arm/lib/bswapsdi2.S
@@ -1,6 +1,5 @@
1#include <linux/linkage.h> 1#include <linux/linkage.h>
2#include <asm/assembler.h> 2#include <asm/assembler.h>
3#include <asm/export.h>
4 3
5#if __LINUX_ARM_ARCH__ >= 6 4#if __LINUX_ARM_ARCH__ >= 6
6ENTRY(__bswapsi2) 5ENTRY(__bswapsi2)
@@ -36,5 +35,3 @@ ENTRY(__bswapdi2)
36 ret lr 35 ret lr
37ENDPROC(__bswapdi2) 36ENDPROC(__bswapdi2)
38#endif 37#endif
39EXPORT_SYMBOL(__bswapsi2)
40EXPORT_SYMBOL(__bswapdi2)
diff --git a/arch/arm/lib/clear_user.S b/arch/arm/lib/clear_user.S
index b566154f5cf4..e936352ccb00 100644
--- a/arch/arm/lib/clear_user.S
+++ b/arch/arm/lib/clear_user.S
@@ -10,7 +10,6 @@
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/unwind.h> 12#include <asm/unwind.h>
13#include <asm/export.h>
14 13
15 .text 14 .text
16 15
@@ -51,9 +50,6 @@ USER( strnebt r2, [r0])
51UNWIND(.fnend) 50UNWIND(.fnend)
52ENDPROC(arm_clear_user) 51ENDPROC(arm_clear_user)
53ENDPROC(__clear_user_std) 52ENDPROC(__clear_user_std)
54#ifndef CONFIG_UACCESS_WITH_MEMCPY
55EXPORT_SYMBOL(arm_clear_user)
56#endif
57 53
58 .pushsection .text.fixup,"ax" 54 .pushsection .text.fixup,"ax"
59 .align 0 55 .align 0
diff --git a/arch/arm/lib/copy_from_user.S b/arch/arm/lib/copy_from_user.S
index 63e4c1ed0225..7a4b06049001 100644
--- a/arch/arm/lib/copy_from_user.S
+++ b/arch/arm/lib/copy_from_user.S
@@ -13,7 +13,6 @@
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/unwind.h> 15#include <asm/unwind.h>
16#include <asm/export.h>
17 16
18/* 17/*
19 * Prototype: 18 * Prototype:
@@ -95,7 +94,6 @@ ENTRY(arm_copy_from_user)
95#include "copy_template.S" 94#include "copy_template.S"
96 95
97ENDPROC(arm_copy_from_user) 96ENDPROC(arm_copy_from_user)
98EXPORT_SYMBOL(arm_copy_from_user)
99 97
100 .pushsection .fixup,"ax" 98 .pushsection .fixup,"ax"
101 .align 0 99 .align 0
diff --git a/arch/arm/lib/copy_page.S b/arch/arm/lib/copy_page.S
index d97851d4af7a..6ee2f6706f86 100644
--- a/arch/arm/lib/copy_page.S
+++ b/arch/arm/lib/copy_page.S
@@ -13,7 +13,6 @@
13#include <asm/assembler.h> 13#include <asm/assembler.h>
14#include <asm/asm-offsets.h> 14#include <asm/asm-offsets.h>
15#include <asm/cache.h> 15#include <asm/cache.h>
16#include <asm/export.h>
17 16
18#define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 )) 17#define COPY_COUNT (PAGE_SZ / (2 * L1_CACHE_BYTES) PLD( -1 ))
19 18
@@ -46,4 +45,3 @@ ENTRY(copy_page)
46 PLD( beq 2b ) 45 PLD( beq 2b )
47 ldmfd sp!, {r4, pc} @ 3 46 ldmfd sp!, {r4, pc} @ 3
48ENDPROC(copy_page) 47ENDPROC(copy_page)
49EXPORT_SYMBOL(copy_page)
diff --git a/arch/arm/lib/copy_to_user.S b/arch/arm/lib/copy_to_user.S
index 592c179112d1..caf5019d8161 100644
--- a/arch/arm/lib/copy_to_user.S
+++ b/arch/arm/lib/copy_to_user.S
@@ -13,7 +13,6 @@
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/unwind.h> 15#include <asm/unwind.h>
16#include <asm/export.h>
17 16
18/* 17/*
19 * Prototype: 18 * Prototype:
@@ -100,9 +99,6 @@ WEAK(arm_copy_to_user)
100 99
101ENDPROC(arm_copy_to_user) 100ENDPROC(arm_copy_to_user)
102ENDPROC(__copy_to_user_std) 101ENDPROC(__copy_to_user_std)
103#ifndef CONFIG_UACCESS_WITH_MEMCPY
104EXPORT_SYMBOL(arm_copy_to_user)
105#endif
106 102
107 .pushsection .text.fixup,"ax" 103 .pushsection .text.fixup,"ax"
108 .align 0 104 .align 0
diff --git a/arch/arm/lib/csumipv6.S b/arch/arm/lib/csumipv6.S
index 68603b5ee537..3ac6ef01bc43 100644
--- a/arch/arm/lib/csumipv6.S
+++ b/arch/arm/lib/csumipv6.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14 .text 13 .text
15 14
@@ -31,4 +30,4 @@ ENTRY(__csum_ipv6_magic)
31 adcs r0, r0, #0 30 adcs r0, r0, #0
32 ldmfd sp!, {pc} 31 ldmfd sp!, {pc}
33ENDPROC(__csum_ipv6_magic) 32ENDPROC(__csum_ipv6_magic)
34EXPORT_SYMBOL(__csum_ipv6_magic) 33
diff --git a/arch/arm/lib/csumpartial.S b/arch/arm/lib/csumpartial.S
index 830b20e81c37..984e0f29d548 100644
--- a/arch/arm/lib/csumpartial.S
+++ b/arch/arm/lib/csumpartial.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14 .text 13 .text
15 14
@@ -141,4 +140,3 @@ ENTRY(csum_partial)
141 bne 4b 140 bne 4b
142 b .Lless4 141 b .Lless4
143ENDPROC(csum_partial) 142ENDPROC(csum_partial)
144EXPORT_SYMBOL(csum_partial)
diff --git a/arch/arm/lib/csumpartialcopy.S b/arch/arm/lib/csumpartialcopy.S
index 9c3383fed129..d03fc71fc88c 100644
--- a/arch/arm/lib/csumpartialcopy.S
+++ b/arch/arm/lib/csumpartialcopy.S
@@ -49,6 +49,5 @@
49 49
50#define FN_ENTRY ENTRY(csum_partial_copy_nocheck) 50#define FN_ENTRY ENTRY(csum_partial_copy_nocheck)
51#define FN_EXIT ENDPROC(csum_partial_copy_nocheck) 51#define FN_EXIT ENDPROC(csum_partial_copy_nocheck)
52#define FN_EXPORT EXPORT_SYMBOL(csum_partial_copy_nocheck)
53 52
54#include "csumpartialcopygeneric.S" 53#include "csumpartialcopygeneric.S"
diff --git a/arch/arm/lib/csumpartialcopygeneric.S b/arch/arm/lib/csumpartialcopygeneric.S
index 8b94d20e51d1..10b45909610c 100644
--- a/arch/arm/lib/csumpartialcopygeneric.S
+++ b/arch/arm/lib/csumpartialcopygeneric.S
@@ -8,7 +8,6 @@
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 */ 9 */
10#include <asm/assembler.h> 10#include <asm/assembler.h>
11#include <asm/export.h>
12 11
13/* 12/*
14 * unsigned int 13 * unsigned int
@@ -332,4 +331,3 @@ FN_ENTRY
332 mov r5, r4, get_byte_1 331 mov r5, r4, get_byte_1
333 b .Lexit 332 b .Lexit
334FN_EXIT 333FN_EXIT
335FN_EXPORT
diff --git a/arch/arm/lib/csumpartialcopyuser.S b/arch/arm/lib/csumpartialcopyuser.S
index 5d495edf3d83..1712f132b80d 100644
--- a/arch/arm/lib/csumpartialcopyuser.S
+++ b/arch/arm/lib/csumpartialcopyuser.S
@@ -73,7 +73,6 @@
73 73
74#define FN_ENTRY ENTRY(csum_partial_copy_from_user) 74#define FN_ENTRY ENTRY(csum_partial_copy_from_user)
75#define FN_EXIT ENDPROC(csum_partial_copy_from_user) 75#define FN_EXIT ENDPROC(csum_partial_copy_from_user)
76#define FN_EXPORT EXPORT_SYMBOL(csum_partial_copy_from_user)
77 76
78#include "csumpartialcopygeneric.S" 77#include "csumpartialcopygeneric.S"
79 78
diff --git a/arch/arm/lib/delay.c b/arch/arm/lib/delay.c
index 69aad80a3af4..2cef11884857 100644
--- a/arch/arm/lib/delay.c
+++ b/arch/arm/lib/delay.c
@@ -24,7 +24,6 @@
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/kernel.h> 25#include <linux/kernel.h>
26#include <linux/module.h> 26#include <linux/module.h>
27#include <linux/export.h>
28#include <linux/timex.h> 27#include <linux/timex.h>
29 28
30/* 29/*
@@ -35,7 +34,6 @@ struct arm_delay_ops arm_delay_ops __ro_after_init = {
35 .const_udelay = __loop_const_udelay, 34 .const_udelay = __loop_const_udelay,
36 .udelay = __loop_udelay, 35 .udelay = __loop_udelay,
37}; 36};
38EXPORT_SYMBOL(arm_delay_ops);
39 37
40static const struct delay_timer *delay_timer; 38static const struct delay_timer *delay_timer;
41static bool delay_calibrated; 39static bool delay_calibrated;
diff --git a/arch/arm/lib/div64.S b/arch/arm/lib/div64.S
index 0c9e1c18fc9e..a9eafe4981eb 100644
--- a/arch/arm/lib/div64.S
+++ b/arch/arm/lib/div64.S
@@ -15,7 +15,6 @@
15#include <linux/linkage.h> 15#include <linux/linkage.h>
16#include <asm/assembler.h> 16#include <asm/assembler.h>
17#include <asm/unwind.h> 17#include <asm/unwind.h>
18#include <asm/export.h>
19 18
20#ifdef __ARMEB__ 19#ifdef __ARMEB__
21#define xh r0 20#define xh r0
@@ -211,4 +210,3 @@ Ldiv0_64:
211 210
212UNWIND(.fnend) 211UNWIND(.fnend)
213ENDPROC(__do_div64) 212ENDPROC(__do_div64)
214EXPORT_SYMBOL(__do_div64)
diff --git a/arch/arm/lib/findbit.S b/arch/arm/lib/findbit.S
index 26302b8cd38f..7848780e8834 100644
--- a/arch/arm/lib/findbit.S
+++ b/arch/arm/lib/findbit.S
@@ -15,7 +15,6 @@
15 */ 15 */
16#include <linux/linkage.h> 16#include <linux/linkage.h>
17#include <asm/assembler.h> 17#include <asm/assembler.h>
18#include <asm/export.h>
19 .text 18 .text
20 19
21/* 20/*
@@ -38,7 +37,6 @@ ENTRY(_find_first_zero_bit_le)
383: mov r0, r1 @ no free bits 373: mov r0, r1 @ no free bits
39 ret lr 38 ret lr
40ENDPROC(_find_first_zero_bit_le) 39ENDPROC(_find_first_zero_bit_le)
41EXPORT_SYMBOL(_find_first_zero_bit_le)
42 40
43/* 41/*
44 * Purpose : Find next 'zero' bit 42 * Purpose : Find next 'zero' bit
@@ -59,7 +57,6 @@ ENTRY(_find_next_zero_bit_le)
59 add r2, r2, #1 @ align bit pointer 57 add r2, r2, #1 @ align bit pointer
60 b 2b @ loop for next bit 58 b 2b @ loop for next bit
61ENDPROC(_find_next_zero_bit_le) 59ENDPROC(_find_next_zero_bit_le)
62EXPORT_SYMBOL(_find_next_zero_bit_le)
63 60
64/* 61/*
65 * Purpose : Find a 'one' bit 62 * Purpose : Find a 'one' bit
@@ -81,7 +78,6 @@ ENTRY(_find_first_bit_le)
813: mov r0, r1 @ no free bits 783: mov r0, r1 @ no free bits
82 ret lr 79 ret lr
83ENDPROC(_find_first_bit_le) 80ENDPROC(_find_first_bit_le)
84EXPORT_SYMBOL(_find_first_bit_le)
85 81
86/* 82/*
87 * Purpose : Find next 'one' bit 83 * Purpose : Find next 'one' bit
@@ -101,7 +97,6 @@ ENTRY(_find_next_bit_le)
101 add r2, r2, #1 @ align bit pointer 97 add r2, r2, #1 @ align bit pointer
102 b 2b @ loop for next bit 98 b 2b @ loop for next bit
103ENDPROC(_find_next_bit_le) 99ENDPROC(_find_next_bit_le)
104EXPORT_SYMBOL(_find_next_bit_le)
105 100
106#ifdef __ARMEB__ 101#ifdef __ARMEB__
107 102
@@ -121,7 +116,6 @@ ENTRY(_find_first_zero_bit_be)
1213: mov r0, r1 @ no free bits 1163: mov r0, r1 @ no free bits
122 ret lr 117 ret lr
123ENDPROC(_find_first_zero_bit_be) 118ENDPROC(_find_first_zero_bit_be)
124EXPORT_SYMBOL(_find_first_zero_bit_be)
125 119
126ENTRY(_find_next_zero_bit_be) 120ENTRY(_find_next_zero_bit_be)
127 teq r1, #0 121 teq r1, #0
@@ -139,7 +133,6 @@ ENTRY(_find_next_zero_bit_be)
139 add r2, r2, #1 @ align bit pointer 133 add r2, r2, #1 @ align bit pointer
140 b 2b @ loop for next bit 134 b 2b @ loop for next bit
141ENDPROC(_find_next_zero_bit_be) 135ENDPROC(_find_next_zero_bit_be)
142EXPORT_SYMBOL(_find_next_zero_bit_be)
143 136
144ENTRY(_find_first_bit_be) 137ENTRY(_find_first_bit_be)
145 teq r1, #0 138 teq r1, #0
@@ -157,7 +150,6 @@ ENTRY(_find_first_bit_be)
1573: mov r0, r1 @ no free bits 1503: mov r0, r1 @ no free bits
158 ret lr 151 ret lr
159ENDPROC(_find_first_bit_be) 152ENDPROC(_find_first_bit_be)
160EXPORT_SYMBOL(_find_first_bit_be)
161 153
162ENTRY(_find_next_bit_be) 154ENTRY(_find_next_bit_be)
163 teq r1, #0 155 teq r1, #0
@@ -174,7 +166,6 @@ ENTRY(_find_next_bit_be)
174 add r2, r2, #1 @ align bit pointer 166 add r2, r2, #1 @ align bit pointer
175 b 2b @ loop for next bit 167 b 2b @ loop for next bit
176ENDPROC(_find_next_bit_be) 168ENDPROC(_find_next_bit_be)
177EXPORT_SYMBOL(_find_next_bit_be)
178 169
179#endif 170#endif
180 171
diff --git a/arch/arm/lib/getuser.S b/arch/arm/lib/getuser.S
index 9d09a38e73af..8ecfd15c3a02 100644
--- a/arch/arm/lib/getuser.S
+++ b/arch/arm/lib/getuser.S
@@ -31,7 +31,6 @@
31#include <asm/assembler.h> 31#include <asm/assembler.h>
32#include <asm/errno.h> 32#include <asm/errno.h>
33#include <asm/domain.h> 33#include <asm/domain.h>
34#include <asm/export.h>
35 34
36ENTRY(__get_user_1) 35ENTRY(__get_user_1)
37 check_uaccess r0, 1, r1, r2, __get_user_bad 36 check_uaccess r0, 1, r1, r2, __get_user_bad
@@ -39,7 +38,6 @@ ENTRY(__get_user_1)
39 mov r0, #0 38 mov r0, #0
40 ret lr 39 ret lr
41ENDPROC(__get_user_1) 40ENDPROC(__get_user_1)
42EXPORT_SYMBOL(__get_user_1)
43 41
44ENTRY(__get_user_2) 42ENTRY(__get_user_2)
45 check_uaccess r0, 2, r1, r2, __get_user_bad 43 check_uaccess r0, 2, r1, r2, __get_user_bad
@@ -60,7 +58,6 @@ rb .req r0
60 mov r0, #0 58 mov r0, #0
61 ret lr 59 ret lr
62ENDPROC(__get_user_2) 60ENDPROC(__get_user_2)
63EXPORT_SYMBOL(__get_user_2)
64 61
65ENTRY(__get_user_4) 62ENTRY(__get_user_4)
66 check_uaccess r0, 4, r1, r2, __get_user_bad 63 check_uaccess r0, 4, r1, r2, __get_user_bad
@@ -68,7 +65,6 @@ ENTRY(__get_user_4)
68 mov r0, #0 65 mov r0, #0
69 ret lr 66 ret lr
70ENDPROC(__get_user_4) 67ENDPROC(__get_user_4)
71EXPORT_SYMBOL(__get_user_4)
72 68
73ENTRY(__get_user_8) 69ENTRY(__get_user_8)
74 check_uaccess r0, 8, r1, r2, __get_user_bad 70 check_uaccess r0, 8, r1, r2, __get_user_bad
@@ -82,7 +78,6 @@ ENTRY(__get_user_8)
82 mov r0, #0 78 mov r0, #0
83 ret lr 79 ret lr
84ENDPROC(__get_user_8) 80ENDPROC(__get_user_8)
85EXPORT_SYMBOL(__get_user_8)
86 81
87#ifdef __ARMEB__ 82#ifdef __ARMEB__
88ENTRY(__get_user_32t_8) 83ENTRY(__get_user_32t_8)
@@ -96,7 +91,6 @@ ENTRY(__get_user_32t_8)
96 mov r0, #0 91 mov r0, #0
97 ret lr 92 ret lr
98ENDPROC(__get_user_32t_8) 93ENDPROC(__get_user_32t_8)
99EXPORT_SYMBOL(__get_user_32t_8)
100 94
101ENTRY(__get_user_64t_1) 95ENTRY(__get_user_64t_1)
102 check_uaccess r0, 1, r1, r2, __get_user_bad8 96 check_uaccess r0, 1, r1, r2, __get_user_bad8
@@ -104,7 +98,6 @@ ENTRY(__get_user_64t_1)
104 mov r0, #0 98 mov r0, #0
105 ret lr 99 ret lr
106ENDPROC(__get_user_64t_1) 100ENDPROC(__get_user_64t_1)
107EXPORT_SYMBOL(__get_user_64t_1)
108 101
109ENTRY(__get_user_64t_2) 102ENTRY(__get_user_64t_2)
110 check_uaccess r0, 2, r1, r2, __get_user_bad8 103 check_uaccess r0, 2, r1, r2, __get_user_bad8
@@ -121,7 +114,6 @@ rb .req r0
121 mov r0, #0 114 mov r0, #0
122 ret lr 115 ret lr
123ENDPROC(__get_user_64t_2) 116ENDPROC(__get_user_64t_2)
124EXPORT_SYMBOL(__get_user_64t_2)
125 117
126ENTRY(__get_user_64t_4) 118ENTRY(__get_user_64t_4)
127 check_uaccess r0, 4, r1, r2, __get_user_bad8 119 check_uaccess r0, 4, r1, r2, __get_user_bad8
@@ -129,7 +121,6 @@ ENTRY(__get_user_64t_4)
129 mov r0, #0 121 mov r0, #0
130 ret lr 122 ret lr
131ENDPROC(__get_user_64t_4) 123ENDPROC(__get_user_64t_4)
132EXPORT_SYMBOL(__get_user_64t_4)
133#endif 124#endif
134 125
135__get_user_bad8: 126__get_user_bad8:
diff --git a/arch/arm/lib/io-readsb.S b/arch/arm/lib/io-readsb.S
index 3dff7a3a2aef..c31b2f3153f1 100644
--- a/arch/arm/lib/io-readsb.S
+++ b/arch/arm/lib/io-readsb.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14.Linsb_align: rsb ip, ip, #4 13.Linsb_align: rsb ip, ip, #4
15 cmp ip, r2 14 cmp ip, r2
@@ -122,4 +121,3 @@ ENTRY(__raw_readsb)
122 121
123 ldmfd sp!, {r4 - r6, pc} 122 ldmfd sp!, {r4 - r6, pc}
124ENDPROC(__raw_readsb) 123ENDPROC(__raw_readsb)
125EXPORT_SYMBOL(__raw_readsb)
diff --git a/arch/arm/lib/io-readsl.S b/arch/arm/lib/io-readsl.S
index bfd39682325b..2ed86fa5465f 100644
--- a/arch/arm/lib/io-readsl.S
+++ b/arch/arm/lib/io-readsl.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14ENTRY(__raw_readsl) 13ENTRY(__raw_readsl)
15 teq r2, #0 @ do we have to check for the zero len? 14 teq r2, #0 @ do we have to check for the zero len?
@@ -78,4 +77,3 @@ ENTRY(__raw_readsl)
78 strb r3, [r1, #0] 77 strb r3, [r1, #0]
79 ret lr 78 ret lr
80ENDPROC(__raw_readsl) 79ENDPROC(__raw_readsl)
81EXPORT_SYMBOL(__raw_readsl)
diff --git a/arch/arm/lib/io-readsw-armv3.S b/arch/arm/lib/io-readsw-armv3.S
index b3af3db6caac..413da9914529 100644
--- a/arch/arm/lib/io-readsw-armv3.S
+++ b/arch/arm/lib/io-readsw-armv3.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14.Linsw_bad_alignment: 13.Linsw_bad_alignment:
15 adr r0, .Linsw_bad_align_msg 14 adr r0, .Linsw_bad_align_msg
@@ -104,4 +103,4 @@ ENTRY(__raw_readsw)
104 103
105 ldmfd sp!, {r4, r5, r6, pc} 104 ldmfd sp!, {r4, r5, r6, pc}
106 105
107EXPORT_SYMBOL(__raw_readsw) 106
diff --git a/arch/arm/lib/io-readsw-armv4.S b/arch/arm/lib/io-readsw-armv4.S
index 3c7a7a40b33e..d9a45e9692ae 100644
--- a/arch/arm/lib/io-readsw-armv4.S
+++ b/arch/arm/lib/io-readsw-armv4.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14 .macro pack, rd, hw1, hw2 13 .macro pack, rd, hw1, hw2
15#ifndef __ARMEB__ 14#ifndef __ARMEB__
@@ -130,4 +129,3 @@ ENTRY(__raw_readsw)
130 strneb ip, [r1] 129 strneb ip, [r1]
131 ldmfd sp!, {r4, pc} 130 ldmfd sp!, {r4, pc}
132ENDPROC(__raw_readsw) 131ENDPROC(__raw_readsw)
133EXPORT_SYMBOL(__raw_readsw)
diff --git a/arch/arm/lib/io-writesb.S b/arch/arm/lib/io-writesb.S
index fa3633594415..a46bbc9b168b 100644
--- a/arch/arm/lib/io-writesb.S
+++ b/arch/arm/lib/io-writesb.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14 .macro outword, rd 13 .macro outword, rd
15#ifndef __ARMEB__ 14#ifndef __ARMEB__
@@ -93,4 +92,3 @@ ENTRY(__raw_writesb)
93 92
94 ldmfd sp!, {r4, r5, pc} 93 ldmfd sp!, {r4, r5, pc}
95ENDPROC(__raw_writesb) 94ENDPROC(__raw_writesb)
96EXPORT_SYMBOL(__raw_writesb)
diff --git a/arch/arm/lib/io-writesl.S b/arch/arm/lib/io-writesl.S
index 98ed6aec0b47..4ea2435988c1 100644
--- a/arch/arm/lib/io-writesl.S
+++ b/arch/arm/lib/io-writesl.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14ENTRY(__raw_writesl) 13ENTRY(__raw_writesl)
15 teq r2, #0 @ do we have to check for the zero len? 14 teq r2, #0 @ do we have to check for the zero len?
@@ -66,4 +65,3 @@ ENTRY(__raw_writesl)
66 bne 6b 65 bne 6b
67 ret lr 66 ret lr
68ENDPROC(__raw_writesl) 67ENDPROC(__raw_writesl)
69EXPORT_SYMBOL(__raw_writesl)
diff --git a/arch/arm/lib/io-writesw-armv3.S b/arch/arm/lib/io-writesw-armv3.S
index 577184c082bb..121789eb6802 100644
--- a/arch/arm/lib/io-writesw-armv3.S
+++ b/arch/arm/lib/io-writesw-armv3.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14.Loutsw_bad_alignment: 13.Loutsw_bad_alignment:
15 adr r0, .Loutsw_bad_align_msg 14 adr r0, .Loutsw_bad_align_msg
@@ -125,4 +124,3 @@ ENTRY(__raw_writesw)
125 strne ip, [r0] 124 strne ip, [r0]
126 125
127 ldmfd sp!, {r4, r5, r6, pc} 126 ldmfd sp!, {r4, r5, r6, pc}
128EXPORT_SYMBOL(__raw_writesw)
diff --git a/arch/arm/lib/io-writesw-armv4.S b/arch/arm/lib/io-writesw-armv4.S
index e335f489d1fc..269f90c51ad2 100644
--- a/arch/arm/lib/io-writesw-armv4.S
+++ b/arch/arm/lib/io-writesw-armv4.S
@@ -9,7 +9,6 @@
9 */ 9 */
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/export.h>
13 12
14 .macro outword, rd 13 .macro outword, rd
15#ifndef __ARMEB__ 14#ifndef __ARMEB__
@@ -99,4 +98,3 @@ ENTRY(__raw_writesw)
99 strneh ip, [r0] 98 strneh ip, [r0]
100 ret lr 99 ret lr
101ENDPROC(__raw_writesw) 100ENDPROC(__raw_writesw)
102EXPORT_SYMBOL(__raw_writesw)
diff --git a/arch/arm/lib/lib1funcs.S b/arch/arm/lib/lib1funcs.S
index f541bc013bff..9397b2e532af 100644
--- a/arch/arm/lib/lib1funcs.S
+++ b/arch/arm/lib/lib1funcs.S
@@ -36,7 +36,6 @@ Boston, MA 02111-1307, USA. */
36#include <linux/linkage.h> 36#include <linux/linkage.h>
37#include <asm/assembler.h> 37#include <asm/assembler.h>
38#include <asm/unwind.h> 38#include <asm/unwind.h>
39#include <asm/export.h>
40 39
41.macro ARM_DIV_BODY dividend, divisor, result, curbit 40.macro ARM_DIV_BODY dividend, divisor, result, curbit
42 41
@@ -239,8 +238,6 @@ UNWIND(.fnstart)
239UNWIND(.fnend) 238UNWIND(.fnend)
240ENDPROC(__udivsi3) 239ENDPROC(__udivsi3)
241ENDPROC(__aeabi_uidiv) 240ENDPROC(__aeabi_uidiv)
242EXPORT_SYMBOL(__udivsi3)
243EXPORT_SYMBOL(__aeabi_uidiv)
244 241
245ENTRY(__umodsi3) 242ENTRY(__umodsi3)
246UNWIND(.fnstart) 243UNWIND(.fnstart)
@@ -259,7 +256,6 @@ UNWIND(.fnstart)
259 256
260UNWIND(.fnend) 257UNWIND(.fnend)
261ENDPROC(__umodsi3) 258ENDPROC(__umodsi3)
262EXPORT_SYMBOL(__umodsi3)
263 259
264#ifdef CONFIG_ARM_PATCH_IDIV 260#ifdef CONFIG_ARM_PATCH_IDIV
265 .align 3 261 .align 3
@@ -307,8 +303,6 @@ UNWIND(.fnstart)
307UNWIND(.fnend) 303UNWIND(.fnend)
308ENDPROC(__divsi3) 304ENDPROC(__divsi3)
309ENDPROC(__aeabi_idiv) 305ENDPROC(__aeabi_idiv)
310EXPORT_SYMBOL(__divsi3)
311EXPORT_SYMBOL(__aeabi_idiv)
312 306
313ENTRY(__modsi3) 307ENTRY(__modsi3)
314UNWIND(.fnstart) 308UNWIND(.fnstart)
@@ -333,7 +327,6 @@ UNWIND(.fnstart)
333 327
334UNWIND(.fnend) 328UNWIND(.fnend)
335ENDPROC(__modsi3) 329ENDPROC(__modsi3)
336EXPORT_SYMBOL(__modsi3)
337 330
338#ifdef CONFIG_AEABI 331#ifdef CONFIG_AEABI
339 332
@@ -350,7 +343,6 @@ UNWIND(.save {r0, r1, ip, lr} )
350 343
351UNWIND(.fnend) 344UNWIND(.fnend)
352ENDPROC(__aeabi_uidivmod) 345ENDPROC(__aeabi_uidivmod)
353EXPORT_SYMBOL(__aeabi_uidivmod)
354 346
355ENTRY(__aeabi_idivmod) 347ENTRY(__aeabi_idivmod)
356UNWIND(.fnstart) 348UNWIND(.fnstart)
@@ -364,7 +356,6 @@ UNWIND(.save {r0, r1, ip, lr} )
364 356
365UNWIND(.fnend) 357UNWIND(.fnend)
366ENDPROC(__aeabi_idivmod) 358ENDPROC(__aeabi_idivmod)
367EXPORT_SYMBOL(__aeabi_idivmod)
368 359
369#endif 360#endif
370 361
diff --git a/arch/arm/lib/lshrdi3.S b/arch/arm/lib/lshrdi3.S
index e40833981417..922dcd88b02b 100644
--- a/arch/arm/lib/lshrdi3.S
+++ b/arch/arm/lib/lshrdi3.S
@@ -28,7 +28,6 @@ Boston, MA 02110-1301, USA. */
28 28
29#include <linux/linkage.h> 29#include <linux/linkage.h>
30#include <asm/assembler.h> 30#include <asm/assembler.h>
31#include <asm/export.h>
32 31
33#ifdef __ARMEB__ 32#ifdef __ARMEB__
34#define al r1 33#define al r1
@@ -53,5 +52,3 @@ ENTRY(__aeabi_llsr)
53 52
54ENDPROC(__lshrdi3) 53ENDPROC(__lshrdi3)
55ENDPROC(__aeabi_llsr) 54ENDPROC(__aeabi_llsr)
56EXPORT_SYMBOL(__lshrdi3)
57EXPORT_SYMBOL(__aeabi_llsr)
diff --git a/arch/arm/lib/memchr.S b/arch/arm/lib/memchr.S
index 44182bf686a5..74a5bed6d999 100644
--- a/arch/arm/lib/memchr.S
+++ b/arch/arm/lib/memchr.S
@@ -11,7 +11,6 @@
11 */ 11 */
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <asm/assembler.h> 13#include <asm/assembler.h>
14#include <asm/export.h>
15 14
16 .text 15 .text
17 .align 5 16 .align 5
@@ -25,4 +24,3 @@ ENTRY(memchr)
252: movne r0, #0 242: movne r0, #0
26 ret lr 25 ret lr
27ENDPROC(memchr) 26ENDPROC(memchr)
28EXPORT_SYMBOL(memchr)
diff --git a/arch/arm/lib/memcpy.S b/arch/arm/lib/memcpy.S
index 1be5b6ddf37c..64111bd4440b 100644
--- a/arch/arm/lib/memcpy.S
+++ b/arch/arm/lib/memcpy.S
@@ -13,7 +13,6 @@
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/unwind.h> 15#include <asm/unwind.h>
16#include <asm/export.h>
17 16
18#define LDR1W_SHIFT 0 17#define LDR1W_SHIFT 0
19#define STR1W_SHIFT 0 18#define STR1W_SHIFT 0
@@ -69,5 +68,3 @@ ENTRY(memcpy)
69 68
70ENDPROC(memcpy) 69ENDPROC(memcpy)
71ENDPROC(mmiocpy) 70ENDPROC(mmiocpy)
72EXPORT_SYMBOL(memcpy)
73EXPORT_SYMBOL(mmiocpy)
diff --git a/arch/arm/lib/memmove.S b/arch/arm/lib/memmove.S
index 71dcc5400d02..69a9d47fc5ab 100644
--- a/arch/arm/lib/memmove.S
+++ b/arch/arm/lib/memmove.S
@@ -13,7 +13,6 @@
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/unwind.h> 15#include <asm/unwind.h>
16#include <asm/export.h>
17 16
18 .text 17 .text
19 18
@@ -226,4 +225,3 @@ ENTRY(memmove)
22618: backward_copy_shift push=24 pull=8 22518: backward_copy_shift push=24 pull=8
227 226
228ENDPROC(memmove) 227ENDPROC(memmove)
229EXPORT_SYMBOL(memmove)
diff --git a/arch/arm/lib/memset.S b/arch/arm/lib/memset.S
index 7b72044cba62..3c65e3bd790f 100644
--- a/arch/arm/lib/memset.S
+++ b/arch/arm/lib/memset.S
@@ -12,7 +12,6 @@
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <asm/assembler.h> 13#include <asm/assembler.h>
14#include <asm/unwind.h> 14#include <asm/unwind.h>
15#include <asm/export.h>
16 15
17 .text 16 .text
18 .align 5 17 .align 5
@@ -136,5 +135,3 @@ UNWIND( .fnstart )
136UNWIND( .fnend ) 135UNWIND( .fnend )
137ENDPROC(memset) 136ENDPROC(memset)
138ENDPROC(mmioset) 137ENDPROC(mmioset)
139EXPORT_SYMBOL(memset)
140EXPORT_SYMBOL(mmioset)
diff --git a/arch/arm/lib/memzero.S b/arch/arm/lib/memzero.S
index 6dec26ed5bcc..0eded952e089 100644
--- a/arch/arm/lib/memzero.S
+++ b/arch/arm/lib/memzero.S
@@ -10,7 +10,6 @@
10#include <linux/linkage.h> 10#include <linux/linkage.h>
11#include <asm/assembler.h> 11#include <asm/assembler.h>
12#include <asm/unwind.h> 12#include <asm/unwind.h>
13#include <asm/export.h>
14 13
15 .text 14 .text
16 .align 5 15 .align 5
@@ -136,4 +135,3 @@ UNWIND( .fnstart )
136 ret lr @ 1 135 ret lr @ 1
137UNWIND( .fnend ) 136UNWIND( .fnend )
138ENDPROC(__memzero) 137ENDPROC(__memzero)
139EXPORT_SYMBOL(__memzero)
diff --git a/arch/arm/lib/muldi3.S b/arch/arm/lib/muldi3.S
index b8f12388ccac..204305956925 100644
--- a/arch/arm/lib/muldi3.S
+++ b/arch/arm/lib/muldi3.S
@@ -12,7 +12,6 @@
12 12
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/export.h>
16 15
17#ifdef __ARMEB__ 16#ifdef __ARMEB__
18#define xh r0 17#define xh r0
@@ -47,5 +46,3 @@ ENTRY(__aeabi_lmul)
47 46
48ENDPROC(__muldi3) 47ENDPROC(__muldi3)
49ENDPROC(__aeabi_lmul) 48ENDPROC(__aeabi_lmul)
50EXPORT_SYMBOL(__muldi3)
51EXPORT_SYMBOL(__aeabi_lmul)
diff --git a/arch/arm/lib/putuser.S b/arch/arm/lib/putuser.S
index 11de126e2ed6..38d660d3705f 100644
--- a/arch/arm/lib/putuser.S
+++ b/arch/arm/lib/putuser.S
@@ -31,7 +31,6 @@
31#include <asm/assembler.h> 31#include <asm/assembler.h>
32#include <asm/errno.h> 32#include <asm/errno.h>
33#include <asm/domain.h> 33#include <asm/domain.h>
34#include <asm/export.h>
35 34
36ENTRY(__put_user_1) 35ENTRY(__put_user_1)
37 check_uaccess r0, 1, r1, ip, __put_user_bad 36 check_uaccess r0, 1, r1, ip, __put_user_bad
@@ -39,7 +38,6 @@ ENTRY(__put_user_1)
39 mov r0, #0 38 mov r0, #0
40 ret lr 39 ret lr
41ENDPROC(__put_user_1) 40ENDPROC(__put_user_1)
42EXPORT_SYMBOL(__put_user_1)
43 41
44ENTRY(__put_user_2) 42ENTRY(__put_user_2)
45 check_uaccess r0, 2, r1, ip, __put_user_bad 43 check_uaccess r0, 2, r1, ip, __put_user_bad
@@ -64,7 +62,6 @@ ENTRY(__put_user_2)
64 mov r0, #0 62 mov r0, #0
65 ret lr 63 ret lr
66ENDPROC(__put_user_2) 64ENDPROC(__put_user_2)
67EXPORT_SYMBOL(__put_user_2)
68 65
69ENTRY(__put_user_4) 66ENTRY(__put_user_4)
70 check_uaccess r0, 4, r1, ip, __put_user_bad 67 check_uaccess r0, 4, r1, ip, __put_user_bad
@@ -72,7 +69,6 @@ ENTRY(__put_user_4)
72 mov r0, #0 69 mov r0, #0
73 ret lr 70 ret lr
74ENDPROC(__put_user_4) 71ENDPROC(__put_user_4)
75EXPORT_SYMBOL(__put_user_4)
76 72
77ENTRY(__put_user_8) 73ENTRY(__put_user_8)
78 check_uaccess r0, 8, r1, ip, __put_user_bad 74 check_uaccess r0, 8, r1, ip, __put_user_bad
@@ -86,7 +82,6 @@ ENTRY(__put_user_8)
86 mov r0, #0 82 mov r0, #0
87 ret lr 83 ret lr
88ENDPROC(__put_user_8) 84ENDPROC(__put_user_8)
89EXPORT_SYMBOL(__put_user_8)
90 85
91__put_user_bad: 86__put_user_bad:
92 mov r0, #-EFAULT 87 mov r0, #-EFAULT
diff --git a/arch/arm/lib/strchr.S b/arch/arm/lib/strchr.S
index 7301f6e6046c..013d64c71e8d 100644
--- a/arch/arm/lib/strchr.S
+++ b/arch/arm/lib/strchr.S
@@ -11,7 +11,6 @@
11 */ 11 */
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <asm/assembler.h> 13#include <asm/assembler.h>
14#include <asm/export.h>
15 14
16 .text 15 .text
17 .align 5 16 .align 5
@@ -26,4 +25,3 @@ ENTRY(strchr)
26 subeq r0, r0, #1 25 subeq r0, r0, #1
27 ret lr 26 ret lr
28ENDPROC(strchr) 27ENDPROC(strchr)
29EXPORT_SYMBOL(strchr)
diff --git a/arch/arm/lib/strrchr.S b/arch/arm/lib/strrchr.S
index aaf9fd98b754..3cec1c7482c4 100644
--- a/arch/arm/lib/strrchr.S
+++ b/arch/arm/lib/strrchr.S
@@ -11,7 +11,6 @@
11 */ 11 */
12#include <linux/linkage.h> 12#include <linux/linkage.h>
13#include <asm/assembler.h> 13#include <asm/assembler.h>
14#include <asm/export.h>
15 14
16 .text 15 .text
17 .align 5 16 .align 5
@@ -25,4 +24,3 @@ ENTRY(strrchr)
25 mov r0, r3 24 mov r0, r3
26 ret lr 25 ret lr
27ENDPROC(strrchr) 26ENDPROC(strrchr)
28EXPORT_SYMBOL(strrchr)
diff --git a/arch/arm/lib/uaccess_with_memcpy.c b/arch/arm/lib/uaccess_with_memcpy.c
index 1626e3a551a1..6bd1089b07e0 100644
--- a/arch/arm/lib/uaccess_with_memcpy.c
+++ b/arch/arm/lib/uaccess_with_memcpy.c
@@ -19,7 +19,6 @@
19#include <linux/gfp.h> 19#include <linux/gfp.h>
20#include <linux/highmem.h> 20#include <linux/highmem.h>
21#include <linux/hugetlb.h> 21#include <linux/hugetlb.h>
22#include <linux/export.h>
23#include <asm/current.h> 22#include <asm/current.h>
24#include <asm/page.h> 23#include <asm/page.h>
25 24
@@ -157,7 +156,6 @@ arm_copy_to_user(void __user *to, const void *from, unsigned long n)
157 } 156 }
158 return n; 157 return n;
159} 158}
160EXPORT_SYMBOL(arm_copy_to_user);
161 159
162static unsigned long noinline 160static unsigned long noinline
163__clear_user_memset(void __user *addr, unsigned long n) 161__clear_user_memset(void __user *addr, unsigned long n)
@@ -215,7 +213,6 @@ unsigned long arm_clear_user(void __user *addr, unsigned long n)
215 } 213 }
216 return n; 214 return n;
217} 215}
218EXPORT_SYMBOL(arm_clear_user);
219 216
220#if 0 217#if 0
221 218
diff --git a/arch/arm/lib/ucmpdi2.S b/arch/arm/lib/ucmpdi2.S
index 127a91af46f3..ad4a6309141a 100644
--- a/arch/arm/lib/ucmpdi2.S
+++ b/arch/arm/lib/ucmpdi2.S
@@ -12,7 +12,6 @@
12 12
13#include <linux/linkage.h> 13#include <linux/linkage.h>
14#include <asm/assembler.h> 14#include <asm/assembler.h>
15#include <asm/export.h>
16 15
17#ifdef __ARMEB__ 16#ifdef __ARMEB__
18#define xh r0 17#define xh r0
@@ -36,7 +35,6 @@ ENTRY(__ucmpdi2)
36 ret lr 35 ret lr
37 36
38ENDPROC(__ucmpdi2) 37ENDPROC(__ucmpdi2)
39EXPORT_SYMBOL(__ucmpdi2)
40 38
41#ifdef CONFIG_AEABI 39#ifdef CONFIG_AEABI
42 40
@@ -50,7 +48,6 @@ ENTRY(__aeabi_ulcmp)
50 ret lr 48 ret lr
51 49
52ENDPROC(__aeabi_ulcmp) 50ENDPROC(__aeabi_ulcmp)
53EXPORT_SYMBOL(__aeabi_ulcmp)
54 51
55#endif 52#endif
56 53
diff --git a/arch/arm/mach-imx/Makefile b/arch/arm/mach-imx/Makefile
index 737450fe790c..cab128913e72 100644
--- a/arch/arm/mach-imx/Makefile
+++ b/arch/arm/mach-imx/Makefile
@@ -32,6 +32,7 @@ endif
32 32
33ifdef CONFIG_SND_IMX_SOC 33ifdef CONFIG_SND_IMX_SOC
34obj-y += ssi-fiq.o 34obj-y += ssi-fiq.o
35obj-y += ssi-fiq-ksym.o
35endif 36endif
36 37
37# i.MX21 based machines 38# i.MX21 based machines
diff --git a/arch/arm/mach-imx/ssi-fiq-ksym.c b/arch/arm/mach-imx/ssi-fiq-ksym.c
new file mode 100644
index 000000000000..792090f9a032
--- /dev/null
+++ b/arch/arm/mach-imx/ssi-fiq-ksym.c
@@ -0,0 +1,20 @@
1/*
2 * Exported ksyms for the SSI FIQ handler
3 *
4 * Copyright (C) 2009, Sascha Hauer <s.hauer@pengutronix.de>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#include <linux/module.h>
12
13#include <linux/platform_data/asoc-imx-ssi.h>
14
15EXPORT_SYMBOL(imx_ssi_fiq_tx_buffer);
16EXPORT_SYMBOL(imx_ssi_fiq_rx_buffer);
17EXPORT_SYMBOL(imx_ssi_fiq_start);
18EXPORT_SYMBOL(imx_ssi_fiq_end);
19EXPORT_SYMBOL(imx_ssi_fiq_base);
20
diff --git a/arch/arm/mach-imx/ssi-fiq.S b/arch/arm/mach-imx/ssi-fiq.S
index fd7917f1c204..a8b93c5f29b5 100644
--- a/arch/arm/mach-imx/ssi-fiq.S
+++ b/arch/arm/mach-imx/ssi-fiq.S
@@ -8,7 +8,6 @@
8 8
9#include <linux/linkage.h> 9#include <linux/linkage.h>
10#include <asm/assembler.h> 10#include <asm/assembler.h>
11#include <asm/export.h>
12 11
13/* 12/*
14 * r8 = bit 0-15: tx offset, bit 16-31: tx buffer size 13 * r8 = bit 0-15: tx offset, bit 16-31: tx buffer size
@@ -145,8 +144,4 @@ imx_ssi_fiq_tx_buffer:
145 .word 0x0 144 .word 0x0
146.L_imx_ssi_fiq_end: 145.L_imx_ssi_fiq_end:
147imx_ssi_fiq_end: 146imx_ssi_fiq_end:
148EXPORT_SYMBOL(imx_ssi_fiq_tx_buffer) 147
149EXPORT_SYMBOL(imx_ssi_fiq_rx_buffer)
150EXPORT_SYMBOL(imx_ssi_fiq_start)
151EXPORT_SYMBOL(imx_ssi_fiq_end)
152EXPORT_SYMBOL(imx_ssi_fiq_base)
diff --git a/arch/arm/mach-omap2/Kconfig b/arch/arm/mach-omap2/Kconfig
index a9afeebd59f2..0465338183c7 100644
--- a/arch/arm/mach-omap2/Kconfig
+++ b/arch/arm/mach-omap2/Kconfig
@@ -71,6 +71,7 @@ config SOC_AM43XX
71 select HAVE_ARM_TWD 71 select HAVE_ARM_TWD
72 select ARM_ERRATA_754322 72 select ARM_ERRATA_754322
73 select ARM_ERRATA_775420 73 select ARM_ERRATA_775420
74 select OMAP_INTERCONNECT
74 75
75config SOC_DRA7XX 76config SOC_DRA7XX
76 bool "TI DRA7XX" 77 bool "TI DRA7XX"
diff --git a/arch/arm/mach-omap2/id.c b/arch/arm/mach-omap2/id.c
index 2abd53ae3e7a..cc6d9fa60924 100644
--- a/arch/arm/mach-omap2/id.c
+++ b/arch/arm/mach-omap2/id.c
@@ -205,11 +205,15 @@ void __init omap2xxx_check_revision(void)
205 205
206#define OMAP3_SHOW_FEATURE(feat) \ 206#define OMAP3_SHOW_FEATURE(feat) \
207 if (omap3_has_ ##feat()) \ 207 if (omap3_has_ ##feat()) \
208 printk(#feat" "); 208 n += scnprintf(buf + n, sizeof(buf) - n, #feat " ");
209 209
210static void __init omap3_cpuinfo(void) 210static void __init omap3_cpuinfo(void)
211{ 211{
212 const char *cpu_name; 212 const char *cpu_name;
213 char buf[64];
214 int n = 0;
215
216 memset(buf, 0, sizeof(buf));
213 217
214 /* 218 /*
215 * OMAP3430 and OMAP3530 are assumed to be same. 219 * OMAP3430 and OMAP3530 are assumed to be same.
@@ -241,10 +245,10 @@ static void __init omap3_cpuinfo(void)
241 cpu_name = "OMAP3503"; 245 cpu_name = "OMAP3503";
242 } 246 }
243 247
244 sprintf(soc_name, "%s", cpu_name); 248 scnprintf(soc_name, sizeof(soc_name), "%s", cpu_name);
245 249
246 /* Print verbose information */ 250 /* Print verbose information */
247 pr_info("%s %s (", soc_name, soc_rev); 251 n += scnprintf(buf, sizeof(buf) - n, "%s %s (", soc_name, soc_rev);
248 252
249 OMAP3_SHOW_FEATURE(l2cache); 253 OMAP3_SHOW_FEATURE(l2cache);
250 OMAP3_SHOW_FEATURE(iva); 254 OMAP3_SHOW_FEATURE(iva);
@@ -252,8 +256,10 @@ static void __init omap3_cpuinfo(void)
252 OMAP3_SHOW_FEATURE(neon); 256 OMAP3_SHOW_FEATURE(neon);
253 OMAP3_SHOW_FEATURE(isp); 257 OMAP3_SHOW_FEATURE(isp);
254 OMAP3_SHOW_FEATURE(192mhz_clk); 258 OMAP3_SHOW_FEATURE(192mhz_clk);
255 259 if (*(buf + n - 1) == ' ')
256 printk(")\n"); 260 n--;
261 n += scnprintf(buf + n, sizeof(buf) - n, ")\n");
262 pr_info("%s", buf);
257} 263}
258 264
259#define OMAP3_CHECK_FEATURE(status,feat) \ 265#define OMAP3_CHECK_FEATURE(status,feat) \
diff --git a/arch/arm/mach-omap2/prm3xxx.c b/arch/arm/mach-omap2/prm3xxx.c
index 62680aad2126..718981bb80cd 100644
--- a/arch/arm/mach-omap2/prm3xxx.c
+++ b/arch/arm/mach-omap2/prm3xxx.c
@@ -319,6 +319,9 @@ void __init omap3_prm_init_pm(bool has_uart4, bool has_iva)
319 if (has_uart4) { 319 if (has_uart4) {
320 en_uart4_mask = OMAP3630_EN_UART4_MASK; 320 en_uart4_mask = OMAP3630_EN_UART4_MASK;
321 grpsel_uart4_mask = OMAP3630_GRPSEL_UART4_MASK; 321 grpsel_uart4_mask = OMAP3630_GRPSEL_UART4_MASK;
322 } else {
323 en_uart4_mask = 0;
324 grpsel_uart4_mask = 0;
322 } 325 }
323 326
324 /* Enable wakeups in PER */ 327 /* Enable wakeups in PER */
diff --git a/arch/arm/mach-omap2/voltage.c b/arch/arm/mach-omap2/voltage.c
index cba8cada8c81..cd15dbd62671 100644
--- a/arch/arm/mach-omap2/voltage.c
+++ b/arch/arm/mach-omap2/voltage.c
@@ -87,6 +87,12 @@ int voltdm_scale(struct voltagedomain *voltdm,
87 return -ENODATA; 87 return -ENODATA;
88 } 88 }
89 89
90 if (!voltdm->volt_data) {
91 pr_err("%s: No voltage data defined for vdd_%s\n",
92 __func__, voltdm->name);
93 return -ENODATA;
94 }
95
90 /* Adjust voltage to the exact voltage from the OPP table */ 96 /* Adjust voltage to the exact voltage from the OPP table */
91 for (i = 0; voltdm->volt_data[i].volt_nominal != 0; i++) { 97 for (i = 0; voltdm->volt_data[i].volt_nominal != 0; i++) {
92 if (voltdm->volt_data[i].volt_nominal >= target_volt) { 98 if (voltdm->volt_data[i].volt_nominal >= target_volt) {
diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
index ab4f74536057..ab7710002ba6 100644
--- a/arch/arm/mm/dma-mapping.c
+++ b/arch/arm/mm/dma-mapping.c
@@ -1167,7 +1167,7 @@ static int __init dma_debug_do_init(void)
1167 dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES); 1167 dma_debug_init(PREALLOC_DMA_DEBUG_ENTRIES);
1168 return 0; 1168 return 0;
1169} 1169}
1170fs_initcall(dma_debug_do_init); 1170core_initcall(dma_debug_do_init);
1171 1171
1172#ifdef CONFIG_ARM_DMA_USE_IOMMU 1172#ifdef CONFIG_ARM_DMA_USE_IOMMU
1173 1173
diff --git a/arch/arm/mm/proc-v7m.S b/arch/arm/mm/proc-v7m.S
index f6d333f09bfe..8dea61640cc1 100644
--- a/arch/arm/mm/proc-v7m.S
+++ b/arch/arm/mm/proc-v7m.S
@@ -96,7 +96,7 @@ ENTRY(cpu_cm7_proc_fin)
96 ret lr 96 ret lr
97ENDPROC(cpu_cm7_proc_fin) 97ENDPROC(cpu_cm7_proc_fin)
98 98
99 .section ".text.init", #alloc, #execinstr 99 .section ".init.text", #alloc, #execinstr
100 100
101__v7m_cm7_setup: 101__v7m_cm7_setup:
102 mov r8, #(V7M_SCB_CCR_DC | V7M_SCB_CCR_IC| V7M_SCB_CCR_BP) 102 mov r8, #(V7M_SCB_CCR_DC | V7M_SCB_CCR_IC| V7M_SCB_CCR_BP)
diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi b/arch/arm64/boot/dts/arm/juno-base.dtsi
index 334271a25f70..7d3a2acc6a55 100644
--- a/arch/arm64/boot/dts/arm/juno-base.dtsi
+++ b/arch/arm64/boot/dts/arm/juno-base.dtsi
@@ -393,7 +393,7 @@
393 #address-cells = <3>; 393 #address-cells = <3>;
394 #size-cells = <2>; 394 #size-cells = <2>;
395 dma-coherent; 395 dma-coherent;
396 ranges = <0x01000000 0x00 0x5f800000 0x00 0x5f800000 0x0 0x00800000>, 396 ranges = <0x01000000 0x00 0x00000000 0x00 0x5f800000 0x0 0x00800000>,
397 <0x02000000 0x00 0x50000000 0x00 0x50000000 0x0 0x08000000>, 397 <0x02000000 0x00 0x50000000 0x00 0x50000000 0x0 0x08000000>,
398 <0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>; 398 <0x42000000 0x40 0x00000000 0x40 0x00000000 0x1 0x00000000>;
399 #interrupt-cells = <1>; 399 #interrupt-cells = <1>;
diff --git a/arch/arm64/boot/dts/arm/juno-r1.dts b/arch/arm64/boot/dts/arm/juno-r1.dts
index 123a58b29cbd..f0b857d6d73c 100644
--- a/arch/arm64/boot/dts/arm/juno-r1.dts
+++ b/arch/arm64/boot/dts/arm/juno-r1.dts
@@ -76,7 +76,7 @@
76 compatible = "arm,idle-state"; 76 compatible = "arm,idle-state";
77 arm,psci-suspend-param = <0x1010000>; 77 arm,psci-suspend-param = <0x1010000>;
78 local-timer-stop; 78 local-timer-stop;
79 entry-latency-us = <300>; 79 entry-latency-us = <400>;
80 exit-latency-us = <1200>; 80 exit-latency-us = <1200>;
81 min-residency-us = <2500>; 81 min-residency-us = <2500>;
82 }; 82 };
diff --git a/arch/arm64/boot/dts/arm/juno-r2.dts b/arch/arm64/boot/dts/arm/juno-r2.dts
index 007be826efce..26aaa6a7670f 100644
--- a/arch/arm64/boot/dts/arm/juno-r2.dts
+++ b/arch/arm64/boot/dts/arm/juno-r2.dts
@@ -76,7 +76,7 @@
76 compatible = "arm,idle-state"; 76 compatible = "arm,idle-state";
77 arm,psci-suspend-param = <0x1010000>; 77 arm,psci-suspend-param = <0x1010000>;
78 local-timer-stop; 78 local-timer-stop;
79 entry-latency-us = <300>; 79 entry-latency-us = <400>;
80 exit-latency-us = <1200>; 80 exit-latency-us = <1200>;
81 min-residency-us = <2500>; 81 min-residency-us = <2500>;
82 }; 82 };
diff --git a/arch/arm64/boot/dts/arm/juno.dts b/arch/arm64/boot/dts/arm/juno.dts
index a7270eff6939..6e154d948a80 100644
--- a/arch/arm64/boot/dts/arm/juno.dts
+++ b/arch/arm64/boot/dts/arm/juno.dts
@@ -76,7 +76,7 @@
76 compatible = "arm,idle-state"; 76 compatible = "arm,idle-state";
77 arm,psci-suspend-param = <0x1010000>; 77 arm,psci-suspend-param = <0x1010000>;
78 local-timer-stop; 78 local-timer-stop;
79 entry-latency-us = <300>; 79 entry-latency-us = <400>;
80 exit-latency-us = <1200>; 80 exit-latency-us = <1200>;
81 min-residency-us = <2500>; 81 min-residency-us = <2500>;
82 }; 82 };
diff --git a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
index c4762538ec01..e9bd58793464 100644
--- a/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-37xx.dtsi
@@ -105,7 +105,7 @@
105 status = "disabled"; 105 status = "disabled";
106 }; 106 };
107 107
108 nb_perih_clk: nb-periph-clk@13000{ 108 nb_periph_clk: nb-periph-clk@13000 {
109 compatible = "marvell,armada-3700-periph-clock-nb"; 109 compatible = "marvell,armada-3700-periph-clock-nb";
110 reg = <0x13000 0x100>; 110 reg = <0x13000 0x100>;
111 clocks = <&tbg 0>, <&tbg 1>, <&tbg 2>, 111 clocks = <&tbg 0>, <&tbg 1>, <&tbg 2>,
@@ -113,7 +113,7 @@
113 #clock-cells = <1>; 113 #clock-cells = <1>;
114 }; 114 };
115 115
116 sb_perih_clk: sb-periph-clk@18000{ 116 sb_periph_clk: sb-periph-clk@18000 {
117 compatible = "marvell,armada-3700-periph-clock-sb"; 117 compatible = "marvell,armada-3700-periph-clock-sb";
118 reg = <0x18000 0x100>; 118 reg = <0x18000 0x100>;
119 clocks = <&tbg 0>, <&tbg 1>, <&tbg 2>, 119 clocks = <&tbg 0>, <&tbg 1>, <&tbg 2>,
diff --git a/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi b/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
index 842fb333285c..6bf9e241179b 100644
--- a/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
+++ b/arch/arm64/boot/dts/marvell/armada-cp110-slave.dtsi
@@ -130,8 +130,8 @@
130 reg = <0x700600 0x50>; 130 reg = <0x700600 0x50>;
131 #address-cells = <0x1>; 131 #address-cells = <0x1>;
132 #size-cells = <0x0>; 132 #size-cells = <0x0>;
133 cell-index = <1>; 133 cell-index = <3>;
134 clocks = <&cps_syscon0 0 3>; 134 clocks = <&cps_syscon0 1 21>;
135 status = "disabled"; 135 status = "disabled";
136 }; 136 };
137 137
@@ -140,7 +140,7 @@
140 reg = <0x700680 0x50>; 140 reg = <0x700680 0x50>;
141 #address-cells = <1>; 141 #address-cells = <1>;
142 #size-cells = <0>; 142 #size-cells = <0>;
143 cell-index = <2>; 143 cell-index = <4>;
144 clocks = <&cps_syscon0 1 21>; 144 clocks = <&cps_syscon0 1 21>;
145 status = "disabled"; 145 status = "disabled";
146 }; 146 };
diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
index b65c193dc64e..7afbfb0f96a3 100644
--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
@@ -300,8 +300,11 @@
300 ranges = <0x83000000 0x0 0xfa000000 0x0 0xfa000000 0x0 0x600000 300 ranges = <0x83000000 0x0 0xfa000000 0x0 0xfa000000 0x0 0x600000
301 0x81000000 0x0 0xfa600000 0x0 0xfa600000 0x0 0x100000>; 301 0x81000000 0x0 0xfa600000 0x0 0xfa600000 0x0 0x100000>;
302 resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>, 302 resets = <&cru SRST_PCIE_CORE>, <&cru SRST_PCIE_MGMT>,
303 <&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>; 303 <&cru SRST_PCIE_MGMT_STICKY>, <&cru SRST_PCIE_PIPE>,
304 reset-names = "core", "mgmt", "mgmt-sticky", "pipe"; 304 <&cru SRST_PCIE_PM>, <&cru SRST_P_PCIE>,
305 <&cru SRST_A_PCIE>;
306 reset-names = "core", "mgmt", "mgmt-sticky", "pipe",
307 "pm", "pclk", "aclk";
305 status = "disabled"; 308 status = "disabled";
306 309
307 pcie0_intc: interrupt-controller { 310 pcie0_intc: interrupt-controller {
diff --git a/arch/arm64/include/asm/alternative.h b/arch/arm64/include/asm/alternative.h
index 39feb85a6931..6e1cb8c5af4d 100644
--- a/arch/arm64/include/asm/alternative.h
+++ b/arch/arm64/include/asm/alternative.h
@@ -1,7 +1,7 @@
1#ifndef __ASM_ALTERNATIVE_H 1#ifndef __ASM_ALTERNATIVE_H
2#define __ASM_ALTERNATIVE_H 2#define __ASM_ALTERNATIVE_H
3 3
4#include <asm/cpufeature.h> 4#include <asm/cpucaps.h>
5#include <asm/insn.h> 5#include <asm/insn.h>
6 6
7#ifndef __ASSEMBLY__ 7#ifndef __ASSEMBLY__
diff --git a/arch/arm64/include/asm/cpucaps.h b/arch/arm64/include/asm/cpucaps.h
new file mode 100644
index 000000000000..87b446535185
--- /dev/null
+++ b/arch/arm64/include/asm/cpucaps.h
@@ -0,0 +1,40 @@
1/*
2 * arch/arm64/include/asm/cpucaps.h
3 *
4 * Copyright (C) 2016 ARM Ltd.
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 */
18#ifndef __ASM_CPUCAPS_H
19#define __ASM_CPUCAPS_H
20
21#define ARM64_WORKAROUND_CLEAN_CACHE 0
22#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
23#define ARM64_WORKAROUND_845719 2
24#define ARM64_HAS_SYSREG_GIC_CPUIF 3
25#define ARM64_HAS_PAN 4
26#define ARM64_HAS_LSE_ATOMICS 5
27#define ARM64_WORKAROUND_CAVIUM_23154 6
28#define ARM64_WORKAROUND_834220 7
29#define ARM64_HAS_NO_HW_PREFETCH 8
30#define ARM64_HAS_UAO 9
31#define ARM64_ALT_PAN_NOT_UAO 10
32#define ARM64_HAS_VIRT_HOST_EXTN 11
33#define ARM64_WORKAROUND_CAVIUM_27456 12
34#define ARM64_HAS_32BIT_EL0 13
35#define ARM64_HYP_OFFSET_LOW 14
36#define ARM64_MISMATCHED_CACHE_LINE_SIZE 15
37
38#define ARM64_NCAPS 16
39
40#endif /* __ASM_CPUCAPS_H */
diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
index a27c3245ba21..0bc0b1de90c4 100644
--- a/arch/arm64/include/asm/cpufeature.h
+++ b/arch/arm64/include/asm/cpufeature.h
@@ -11,6 +11,7 @@
11 11
12#include <linux/jump_label.h> 12#include <linux/jump_label.h>
13 13
14#include <asm/cpucaps.h>
14#include <asm/hwcap.h> 15#include <asm/hwcap.h>
15#include <asm/sysreg.h> 16#include <asm/sysreg.h>
16 17
@@ -24,25 +25,6 @@
24#define MAX_CPU_FEATURES (8 * sizeof(elf_hwcap)) 25#define MAX_CPU_FEATURES (8 * sizeof(elf_hwcap))
25#define cpu_feature(x) ilog2(HWCAP_ ## x) 26#define cpu_feature(x) ilog2(HWCAP_ ## x)
26 27
27#define ARM64_WORKAROUND_CLEAN_CACHE 0
28#define ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE 1
29#define ARM64_WORKAROUND_845719 2
30#define ARM64_HAS_SYSREG_GIC_CPUIF 3
31#define ARM64_HAS_PAN 4
32#define ARM64_HAS_LSE_ATOMICS 5
33#define ARM64_WORKAROUND_CAVIUM_23154 6
34#define ARM64_WORKAROUND_834220 7
35#define ARM64_HAS_NO_HW_PREFETCH 8
36#define ARM64_HAS_UAO 9
37#define ARM64_ALT_PAN_NOT_UAO 10
38#define ARM64_HAS_VIRT_HOST_EXTN 11
39#define ARM64_WORKAROUND_CAVIUM_27456 12
40#define ARM64_HAS_32BIT_EL0 13
41#define ARM64_HYP_OFFSET_LOW 14
42#define ARM64_MISMATCHED_CACHE_LINE_SIZE 15
43
44#define ARM64_NCAPS 16
45
46#ifndef __ASSEMBLY__ 28#ifndef __ASSEMBLY__
47 29
48#include <linux/kernel.h> 30#include <linux/kernel.h>
diff --git a/arch/arm64/include/asm/kvm_asm.h b/arch/arm64/include/asm/kvm_asm.h
index 18f746551bf6..ec3553eb9349 100644
--- a/arch/arm64/include/asm/kvm_asm.h
+++ b/arch/arm64/include/asm/kvm_asm.h
@@ -54,6 +54,7 @@ extern char __kvm_hyp_vector[];
54extern void __kvm_flush_vm_context(void); 54extern void __kvm_flush_vm_context(void);
55extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa); 55extern void __kvm_tlb_flush_vmid_ipa(struct kvm *kvm, phys_addr_t ipa);
56extern void __kvm_tlb_flush_vmid(struct kvm *kvm); 56extern void __kvm_tlb_flush_vmid(struct kvm *kvm);
57extern void __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu);
57 58
58extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu); 59extern int __kvm_vcpu_run(struct kvm_vcpu *vcpu);
59 60
diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
index bd94e6766759..e5050388e062 100644
--- a/arch/arm64/include/asm/kvm_host.h
+++ b/arch/arm64/include/asm/kvm_host.h
@@ -62,6 +62,9 @@ struct kvm_arch {
62 /* VTTBR value associated with above pgd and vmid */ 62 /* VTTBR value associated with above pgd and vmid */
63 u64 vttbr; 63 u64 vttbr;
64 64
65 /* The last vcpu id that ran on each physical CPU */
66 int __percpu *last_vcpu_ran;
67
65 /* The maximum number of vCPUs depends on the used GIC model */ 68 /* The maximum number of vCPUs depends on the used GIC model */
66 int max_vcpus; 69 int max_vcpus;
67 70
diff --git a/arch/arm64/include/asm/kvm_mmu.h b/arch/arm64/include/asm/kvm_mmu.h
index a79b969c26fc..6f72fe8b0e3e 100644
--- a/arch/arm64/include/asm/kvm_mmu.h
+++ b/arch/arm64/include/asm/kvm_mmu.h
@@ -128,7 +128,7 @@ static inline unsigned long __kern_hyp_va(unsigned long v)
128 return v; 128 return v;
129} 129}
130 130
131#define kern_hyp_va(v) (typeof(v))(__kern_hyp_va((unsigned long)(v))) 131#define kern_hyp_va(v) ((typeof(v))(__kern_hyp_va((unsigned long)(v))))
132 132
133/* 133/*
134 * We currently only support a 40bit IPA. 134 * We currently only support a 40bit IPA.
diff --git a/arch/arm64/include/asm/lse.h b/arch/arm64/include/asm/lse.h
index 23acc00be32d..fc756e22c84c 100644
--- a/arch/arm64/include/asm/lse.h
+++ b/arch/arm64/include/asm/lse.h
@@ -5,7 +5,6 @@
5 5
6#include <linux/stringify.h> 6#include <linux/stringify.h>
7#include <asm/alternative.h> 7#include <asm/alternative.h>
8#include <asm/cpufeature.h>
9 8
10#ifdef __ASSEMBLER__ 9#ifdef __ASSEMBLER__
11 10
diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h
index 2065f46fa740..38b6a2b49d68 100644
--- a/arch/arm64/include/asm/perf_event.h
+++ b/arch/arm64/include/asm/perf_event.h
@@ -46,7 +46,15 @@
46#define ARMV8_PMU_EVTYPE_MASK 0xc800ffff /* Mask for writable bits */ 46#define ARMV8_PMU_EVTYPE_MASK 0xc800ffff /* Mask for writable bits */
47#define ARMV8_PMU_EVTYPE_EVENT 0xffff /* Mask for EVENT bits */ 47#define ARMV8_PMU_EVTYPE_EVENT 0xffff /* Mask for EVENT bits */
48 48
49#define ARMV8_PMU_EVTYPE_EVENT_SW_INCR 0 /* Software increment event */ 49/*
50 * PMUv3 event types: required events
51 */
52#define ARMV8_PMUV3_PERFCTR_SW_INCR 0x00
53#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL 0x03
54#define ARMV8_PMUV3_PERFCTR_L1D_CACHE 0x04
55#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED 0x10
56#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES 0x11
57#define ARMV8_PMUV3_PERFCTR_BR_PRED 0x12
50 58
51/* 59/*
52 * Event filters for PMUv3 60 * Event filters for PMUv3
diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c
index a9310a69fffd..57ae9d9ed9bb 100644
--- a/arch/arm64/kernel/perf_event.c
+++ b/arch/arm64/kernel/perf_event.c
@@ -31,17 +31,9 @@
31 31
32/* 32/*
33 * ARMv8 PMUv3 Performance Events handling code. 33 * ARMv8 PMUv3 Performance Events handling code.
34 * Common event types. 34 * Common event types (some are defined in asm/perf_event.h).
35 */ 35 */
36 36
37/* Required events. */
38#define ARMV8_PMUV3_PERFCTR_SW_INCR 0x00
39#define ARMV8_PMUV3_PERFCTR_L1D_CACHE_REFILL 0x03
40#define ARMV8_PMUV3_PERFCTR_L1D_CACHE 0x04
41#define ARMV8_PMUV3_PERFCTR_BR_MIS_PRED 0x10
42#define ARMV8_PMUV3_PERFCTR_CPU_CYCLES 0x11
43#define ARMV8_PMUV3_PERFCTR_BR_PRED 0x12
44
45/* At least one of the following is required. */ 37/* At least one of the following is required. */
46#define ARMV8_PMUV3_PERFCTR_INST_RETIRED 0x08 38#define ARMV8_PMUV3_PERFCTR_INST_RETIRED 0x08
47#define ARMV8_PMUV3_PERFCTR_INST_SPEC 0x1B 39#define ARMV8_PMUV3_PERFCTR_INST_SPEC 0x1B
diff --git a/arch/arm64/kvm/hyp/tlb.c b/arch/arm64/kvm/hyp/tlb.c
index 9cc0ea784ae6..88e2f2b938f0 100644
--- a/arch/arm64/kvm/hyp/tlb.c
+++ b/arch/arm64/kvm/hyp/tlb.c
@@ -64,6 +64,21 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
64 write_sysreg(0, vttbr_el2); 64 write_sysreg(0, vttbr_el2);
65} 65}
66 66
67void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
68{
69 struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
70
71 /* Switch to requested VMID */
72 write_sysreg(kvm->arch.vttbr, vttbr_el2);
73 isb();
74
75 asm volatile("tlbi vmalle1" : : );
76 dsb(nsh);
77 isb();
78
79 write_sysreg(0, vttbr_el2);
80}
81
67void __hyp_text __kvm_flush_vm_context(void) 82void __hyp_text __kvm_flush_vm_context(void)
68{ 83{
69 dsb(ishst); 84 dsb(ishst);
diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
index f302fdb3a030..87e7e6608cd8 100644
--- a/arch/arm64/kvm/sys_regs.c
+++ b/arch/arm64/kvm/sys_regs.c
@@ -597,8 +597,14 @@ static bool access_pmu_evcntr(struct kvm_vcpu *vcpu,
597 597
598 idx = ARMV8_PMU_CYCLE_IDX; 598 idx = ARMV8_PMU_CYCLE_IDX;
599 } else { 599 } else {
600 BUG(); 600 return false;
601 } 601 }
602 } else if (r->CRn == 0 && r->CRm == 9) {
603 /* PMCCNTR */
604 if (pmu_access_event_counter_el0_disabled(vcpu))
605 return false;
606
607 idx = ARMV8_PMU_CYCLE_IDX;
602 } else if (r->CRn == 14 && (r->CRm & 12) == 8) { 608 } else if (r->CRn == 14 && (r->CRm & 12) == 8) {
603 /* PMEVCNTRn_EL0 */ 609 /* PMEVCNTRn_EL0 */
604 if (pmu_access_event_counter_el0_disabled(vcpu)) 610 if (pmu_access_event_counter_el0_disabled(vcpu))
@@ -606,7 +612,7 @@ static bool access_pmu_evcntr(struct kvm_vcpu *vcpu,
606 612
607 idx = ((r->CRm & 3) << 3) | (r->Op2 & 7); 613 idx = ((r->CRm & 3) << 3) | (r->Op2 & 7);
608 } else { 614 } else {
609 BUG(); 615 return false;
610 } 616 }
611 617
612 if (!pmu_counter_idx_valid(vcpu, idx)) 618 if (!pmu_counter_idx_valid(vcpu, idx))
diff --git a/arch/m68k/configs/amiga_defconfig b/arch/m68k/configs/amiga_defconfig
index 55be7e3ff109..b98acd15ca22 100644
--- a/arch/m68k/configs/amiga_defconfig
+++ b/arch/m68k/configs/amiga_defconfig
@@ -95,9 +95,10 @@ CONFIG_NF_TABLES_INET=m
95CONFIG_NF_TABLES_NETDEV=m 95CONFIG_NF_TABLES_NETDEV=m
96CONFIG_NFT_EXTHDR=m 96CONFIG_NFT_EXTHDR=m
97CONFIG_NFT_META=m 97CONFIG_NFT_META=m
98CONFIG_NFT_NUMGEN=m
98CONFIG_NFT_CT=m 99CONFIG_NFT_CT=m
99CONFIG_NFT_RBTREE=m 100CONFIG_NFT_SET_RBTREE=m
100CONFIG_NFT_HASH=m 101CONFIG_NFT_SET_HASH=m
101CONFIG_NFT_COUNTER=m 102CONFIG_NFT_COUNTER=m
102CONFIG_NFT_LOG=m 103CONFIG_NFT_LOG=m
103CONFIG_NFT_LIMIT=m 104CONFIG_NFT_LIMIT=m
@@ -105,8 +106,10 @@ CONFIG_NFT_MASQ=m
105CONFIG_NFT_REDIR=m 106CONFIG_NFT_REDIR=m
106CONFIG_NFT_NAT=m 107CONFIG_NFT_NAT=m
107CONFIG_NFT_QUEUE=m 108CONFIG_NFT_QUEUE=m
109CONFIG_NFT_QUOTA=m
108CONFIG_NFT_REJECT=m 110CONFIG_NFT_REJECT=m
109CONFIG_NFT_COMPAT=m 111CONFIG_NFT_COMPAT=m
112CONFIG_NFT_HASH=m
110CONFIG_NFT_DUP_NETDEV=m 113CONFIG_NFT_DUP_NETDEV=m
111CONFIG_NFT_FWD_NETDEV=m 114CONFIG_NFT_FWD_NETDEV=m
112CONFIG_NETFILTER_XT_SET=m 115CONFIG_NETFILTER_XT_SET=m
@@ -366,6 +369,7 @@ CONFIG_NETCONSOLE=m
366CONFIG_NETCONSOLE_DYNAMIC=y 369CONFIG_NETCONSOLE_DYNAMIC=y
367CONFIG_VETH=m 370CONFIG_VETH=m
368# CONFIG_NET_VENDOR_3COM is not set 371# CONFIG_NET_VENDOR_3COM is not set
372# CONFIG_NET_VENDOR_AMAZON is not set
369CONFIG_A2065=y 373CONFIG_A2065=y
370CONFIG_ARIADNE=y 374CONFIG_ARIADNE=y
371# CONFIG_NET_VENDOR_ARC is not set 375# CONFIG_NET_VENDOR_ARC is not set
diff --git a/arch/m68k/configs/apollo_defconfig b/arch/m68k/configs/apollo_defconfig
index 365dda66b0e6..f80dc57e6374 100644
--- a/arch/m68k/configs/apollo_defconfig
+++ b/arch/m68k/configs/apollo_defconfig
@@ -93,9 +93,10 @@ CONFIG_NF_TABLES_INET=m
93CONFIG_NF_TABLES_NETDEV=m 93CONFIG_NF_TABLES_NETDEV=m
94CONFIG_NFT_EXTHDR=m 94CONFIG_NFT_EXTHDR=m
95CONFIG_NFT_META=m 95CONFIG_NFT_META=m
96CONFIG_NFT_NUMGEN=m
96CONFIG_NFT_CT=m 97CONFIG_NFT_CT=m
97CONFIG_NFT_RBTREE=m 98CONFIG_NFT_SET_RBTREE=m
98CONFIG_NFT_HASH=m 99CONFIG_NFT_SET_HASH=m
99CONFIG_NFT_COUNTER=m 100CONFIG_NFT_COUNTER=m
100CONFIG_NFT_LOG=m 101CONFIG_NFT_LOG=m
101CONFIG_NFT_LIMIT=m 102CONFIG_NFT_LIMIT=m
@@ -103,8 +104,10 @@ CONFIG_NFT_MASQ=m
103CONFIG_NFT_REDIR=m 104CONFIG_NFT_REDIR=m
104CONFIG_NFT_NAT=m 105CONFIG_NFT_NAT=m
105CONFIG_NFT_QUEUE=m 106CONFIG_NFT_QUEUE=m
107CONFIG_NFT_QUOTA=m
106CONFIG_NFT_REJECT=m 108CONFIG_NFT_REJECT=m
107CONFIG_NFT_COMPAT=m 109CONFIG_NFT_COMPAT=m
110CONFIG_NFT_HASH=m
108CONFIG_NFT_DUP_NETDEV=m 111CONFIG_NFT_DUP_NETDEV=m
109CONFIG_NFT_FWD_NETDEV=m 112CONFIG_NFT_FWD_NETDEV=m
110CONFIG_NETFILTER_XT_SET=m 113CONFIG_NETFILTER_XT_SET=m
@@ -347,6 +350,7 @@ CONFIG_MACSEC=m
347CONFIG_NETCONSOLE=m 350CONFIG_NETCONSOLE=m
348CONFIG_NETCONSOLE_DYNAMIC=y 351CONFIG_NETCONSOLE_DYNAMIC=y
349CONFIG_VETH=m 352CONFIG_VETH=m
353# CONFIG_NET_VENDOR_AMAZON is not set
350# CONFIG_NET_VENDOR_ARC is not set 354# CONFIG_NET_VENDOR_ARC is not set
351# CONFIG_NET_CADENCE is not set 355# CONFIG_NET_CADENCE is not set
352# CONFIG_NET_VENDOR_BROADCOM is not set 356# CONFIG_NET_VENDOR_BROADCOM is not set
diff --git a/arch/m68k/configs/atari_defconfig b/arch/m68k/configs/atari_defconfig
index ce3cbfd16fcd..4e16b1821fbb 100644
--- a/arch/m68k/configs/atari_defconfig
+++ b/arch/m68k/configs/atari_defconfig
@@ -93,9 +93,10 @@ CONFIG_NF_TABLES_INET=m
93CONFIG_NF_TABLES_NETDEV=m 93CONFIG_NF_TABLES_NETDEV=m
94CONFIG_NFT_EXTHDR=m 94CONFIG_NFT_EXTHDR=m
95CONFIG_NFT_META=m 95CONFIG_NFT_META=m
96CONFIG_NFT_NUMGEN=m
96CONFIG_NFT_CT=m 97CONFIG_NFT_CT=m
97CONFIG_NFT_RBTREE=m 98CONFIG_NFT_SET_RBTREE=m
98CONFIG_NFT_HASH=m 99CONFIG_NFT_SET_HASH=m
99CONFIG_NFT_COUNTER=m 100CONFIG_NFT_COUNTER=m
100CONFIG_NFT_LOG=m 101CONFIG_NFT_LOG=m
101CONFIG_NFT_LIMIT=m 102CONFIG_NFT_LIMIT=m
@@ -103,8 +104,10 @@ CONFIG_NFT_MASQ=m
103CONFIG_NFT_REDIR=m 104CONFIG_NFT_REDIR=m
104CONFIG_NFT_NAT=m 105CONFIG_NFT_NAT=m
105CONFIG_NFT_QUEUE=m 106CONFIG_NFT_QUEUE=m
107CONFIG_NFT_QUOTA=m
106CONFIG_NFT_REJECT=m 108CONFIG_NFT_REJECT=m
107CONFIG_NFT_COMPAT=m 109CONFIG_NFT_COMPAT=m
110CONFIG_NFT_HASH=m
108CONFIG_NFT_DUP_NETDEV=m 111CONFIG_NFT_DUP_NETDEV=m
109CONFIG_NFT_FWD_NETDEV=m 112CONFIG_NFT_FWD_NETDEV=m
110CONFIG_NETFILTER_XT_SET=m 113CONFIG_NETFILTER_XT_SET=m
@@ -356,6 +359,7 @@ CONFIG_MACSEC=m
356CONFIG_NETCONSOLE=m 359CONFIG_NETCONSOLE=m
357CONFIG_NETCONSOLE_DYNAMIC=y 360CONFIG_NETCONSOLE_DYNAMIC=y
358CONFIG_VETH=m 361CONFIG_VETH=m
362# CONFIG_NET_VENDOR_AMAZON is not set
359CONFIG_ATARILANCE=y 363CONFIG_ATARILANCE=y
360# CONFIG_NET_VENDOR_ARC is not set 364# CONFIG_NET_VENDOR_ARC is not set
361# CONFIG_NET_CADENCE is not set 365# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/configs/bvme6000_defconfig b/arch/m68k/configs/bvme6000_defconfig
index 8db496a9797d..2767bbf5ad61 100644
--- a/arch/m68k/configs/bvme6000_defconfig
+++ b/arch/m68k/configs/bvme6000_defconfig
@@ -91,9 +91,10 @@ CONFIG_NF_TABLES_INET=m
91CONFIG_NF_TABLES_NETDEV=m 91CONFIG_NF_TABLES_NETDEV=m
92CONFIG_NFT_EXTHDR=m 92CONFIG_NFT_EXTHDR=m
93CONFIG_NFT_META=m 93CONFIG_NFT_META=m
94CONFIG_NFT_NUMGEN=m
94CONFIG_NFT_CT=m 95CONFIG_NFT_CT=m
95CONFIG_NFT_RBTREE=m 96CONFIG_NFT_SET_RBTREE=m
96CONFIG_NFT_HASH=m 97CONFIG_NFT_SET_HASH=m
97CONFIG_NFT_COUNTER=m 98CONFIG_NFT_COUNTER=m
98CONFIG_NFT_LOG=m 99CONFIG_NFT_LOG=m
99CONFIG_NFT_LIMIT=m 100CONFIG_NFT_LIMIT=m
@@ -101,8 +102,10 @@ CONFIG_NFT_MASQ=m
101CONFIG_NFT_REDIR=m 102CONFIG_NFT_REDIR=m
102CONFIG_NFT_NAT=m 103CONFIG_NFT_NAT=m
103CONFIG_NFT_QUEUE=m 104CONFIG_NFT_QUEUE=m
105CONFIG_NFT_QUOTA=m
104CONFIG_NFT_REJECT=m 106CONFIG_NFT_REJECT=m
105CONFIG_NFT_COMPAT=m 107CONFIG_NFT_COMPAT=m
108CONFIG_NFT_HASH=m
106CONFIG_NFT_DUP_NETDEV=m 109CONFIG_NFT_DUP_NETDEV=m
107CONFIG_NFT_FWD_NETDEV=m 110CONFIG_NFT_FWD_NETDEV=m
108CONFIG_NETFILTER_XT_SET=m 111CONFIG_NETFILTER_XT_SET=m
@@ -346,6 +349,7 @@ CONFIG_MACSEC=m
346CONFIG_NETCONSOLE=m 349CONFIG_NETCONSOLE=m
347CONFIG_NETCONSOLE_DYNAMIC=y 350CONFIG_NETCONSOLE_DYNAMIC=y
348CONFIG_VETH=m 351CONFIG_VETH=m
352# CONFIG_NET_VENDOR_AMAZON is not set
349# CONFIG_NET_VENDOR_ARC is not set 353# CONFIG_NET_VENDOR_ARC is not set
350# CONFIG_NET_CADENCE is not set 354# CONFIG_NET_CADENCE is not set
351# CONFIG_NET_VENDOR_BROADCOM is not set 355# CONFIG_NET_VENDOR_BROADCOM is not set
diff --git a/arch/m68k/configs/hp300_defconfig b/arch/m68k/configs/hp300_defconfig
index 8314156f7149..d13ba309265e 100644
--- a/arch/m68k/configs/hp300_defconfig
+++ b/arch/m68k/configs/hp300_defconfig
@@ -93,9 +93,10 @@ CONFIG_NF_TABLES_INET=m
93CONFIG_NF_TABLES_NETDEV=m 93CONFIG_NF_TABLES_NETDEV=m
94CONFIG_NFT_EXTHDR=m 94CONFIG_NFT_EXTHDR=m
95CONFIG_NFT_META=m 95CONFIG_NFT_META=m
96CONFIG_NFT_NUMGEN=m
96CONFIG_NFT_CT=m 97CONFIG_NFT_CT=m
97CONFIG_NFT_RBTREE=m 98CONFIG_NFT_SET_RBTREE=m
98CONFIG_NFT_HASH=m 99CONFIG_NFT_SET_HASH=m
99CONFIG_NFT_COUNTER=m 100CONFIG_NFT_COUNTER=m
100CONFIG_NFT_LOG=m 101CONFIG_NFT_LOG=m
101CONFIG_NFT_LIMIT=m 102CONFIG_NFT_LIMIT=m
@@ -103,8 +104,10 @@ CONFIG_NFT_MASQ=m
103CONFIG_NFT_REDIR=m 104CONFIG_NFT_REDIR=m
104CONFIG_NFT_NAT=m 105CONFIG_NFT_NAT=m
105CONFIG_NFT_QUEUE=m 106CONFIG_NFT_QUEUE=m
107CONFIG_NFT_QUOTA=m
106CONFIG_NFT_REJECT=m 108CONFIG_NFT_REJECT=m
107CONFIG_NFT_COMPAT=m 109CONFIG_NFT_COMPAT=m
110CONFIG_NFT_HASH=m
108CONFIG_NFT_DUP_NETDEV=m 111CONFIG_NFT_DUP_NETDEV=m
109CONFIG_NFT_FWD_NETDEV=m 112CONFIG_NFT_FWD_NETDEV=m
110CONFIG_NETFILTER_XT_SET=m 113CONFIG_NETFILTER_XT_SET=m
@@ -347,6 +350,7 @@ CONFIG_MACSEC=m
347CONFIG_NETCONSOLE=m 350CONFIG_NETCONSOLE=m
348CONFIG_NETCONSOLE_DYNAMIC=y 351CONFIG_NETCONSOLE_DYNAMIC=y
349CONFIG_VETH=m 352CONFIG_VETH=m
353# CONFIG_NET_VENDOR_AMAZON is not set
350CONFIG_HPLANCE=y 354CONFIG_HPLANCE=y
351# CONFIG_NET_VENDOR_ARC is not set 355# CONFIG_NET_VENDOR_ARC is not set
352# CONFIG_NET_CADENCE is not set 356# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/configs/mac_defconfig b/arch/m68k/configs/mac_defconfig
index 6600270b9622..78b5101c1aa6 100644
--- a/arch/m68k/configs/mac_defconfig
+++ b/arch/m68k/configs/mac_defconfig
@@ -92,9 +92,10 @@ CONFIG_NF_TABLES_INET=m
92CONFIG_NF_TABLES_NETDEV=m 92CONFIG_NF_TABLES_NETDEV=m
93CONFIG_NFT_EXTHDR=m 93CONFIG_NFT_EXTHDR=m
94CONFIG_NFT_META=m 94CONFIG_NFT_META=m
95CONFIG_NFT_NUMGEN=m
95CONFIG_NFT_CT=m 96CONFIG_NFT_CT=m
96CONFIG_NFT_RBTREE=m 97CONFIG_NFT_SET_RBTREE=m
97CONFIG_NFT_HASH=m 98CONFIG_NFT_SET_HASH=m
98CONFIG_NFT_COUNTER=m 99CONFIG_NFT_COUNTER=m
99CONFIG_NFT_LOG=m 100CONFIG_NFT_LOG=m
100CONFIG_NFT_LIMIT=m 101CONFIG_NFT_LIMIT=m
@@ -102,8 +103,10 @@ CONFIG_NFT_MASQ=m
102CONFIG_NFT_REDIR=m 103CONFIG_NFT_REDIR=m
103CONFIG_NFT_NAT=m 104CONFIG_NFT_NAT=m
104CONFIG_NFT_QUEUE=m 105CONFIG_NFT_QUEUE=m
106CONFIG_NFT_QUOTA=m
105CONFIG_NFT_REJECT=m 107CONFIG_NFT_REJECT=m
106CONFIG_NFT_COMPAT=m 108CONFIG_NFT_COMPAT=m
109CONFIG_NFT_HASH=m
107CONFIG_NFT_DUP_NETDEV=m 110CONFIG_NFT_DUP_NETDEV=m
108CONFIG_NFT_FWD_NETDEV=m 111CONFIG_NFT_FWD_NETDEV=m
109CONFIG_NETFILTER_XT_SET=m 112CONFIG_NETFILTER_XT_SET=m
@@ -363,6 +366,7 @@ CONFIG_MACSEC=m
363CONFIG_NETCONSOLE=m 366CONFIG_NETCONSOLE=m
364CONFIG_NETCONSOLE_DYNAMIC=y 367CONFIG_NETCONSOLE_DYNAMIC=y
365CONFIG_VETH=m 368CONFIG_VETH=m
369# CONFIG_NET_VENDOR_AMAZON is not set
366CONFIG_MACMACE=y 370CONFIG_MACMACE=y
367# CONFIG_NET_VENDOR_ARC is not set 371# CONFIG_NET_VENDOR_ARC is not set
368# CONFIG_NET_CADENCE is not set 372# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/configs/multi_defconfig b/arch/m68k/configs/multi_defconfig
index 90abfe9eabba..38e5bcbd0d62 100644
--- a/arch/m68k/configs/multi_defconfig
+++ b/arch/m68k/configs/multi_defconfig
@@ -102,9 +102,10 @@ CONFIG_NF_TABLES_INET=m
102CONFIG_NF_TABLES_NETDEV=m 102CONFIG_NF_TABLES_NETDEV=m
103CONFIG_NFT_EXTHDR=m 103CONFIG_NFT_EXTHDR=m
104CONFIG_NFT_META=m 104CONFIG_NFT_META=m
105CONFIG_NFT_NUMGEN=m
105CONFIG_NFT_CT=m 106CONFIG_NFT_CT=m
106CONFIG_NFT_RBTREE=m 107CONFIG_NFT_SET_RBTREE=m
107CONFIG_NFT_HASH=m 108CONFIG_NFT_SET_HASH=m
108CONFIG_NFT_COUNTER=m 109CONFIG_NFT_COUNTER=m
109CONFIG_NFT_LOG=m 110CONFIG_NFT_LOG=m
110CONFIG_NFT_LIMIT=m 111CONFIG_NFT_LIMIT=m
@@ -112,8 +113,10 @@ CONFIG_NFT_MASQ=m
112CONFIG_NFT_REDIR=m 113CONFIG_NFT_REDIR=m
113CONFIG_NFT_NAT=m 114CONFIG_NFT_NAT=m
114CONFIG_NFT_QUEUE=m 115CONFIG_NFT_QUEUE=m
116CONFIG_NFT_QUOTA=m
115CONFIG_NFT_REJECT=m 117CONFIG_NFT_REJECT=m
116CONFIG_NFT_COMPAT=m 118CONFIG_NFT_COMPAT=m
119CONFIG_NFT_HASH=m
117CONFIG_NFT_DUP_NETDEV=m 120CONFIG_NFT_DUP_NETDEV=m
118CONFIG_NFT_FWD_NETDEV=m 121CONFIG_NFT_FWD_NETDEV=m
119CONFIG_NETFILTER_XT_SET=m 122CONFIG_NETFILTER_XT_SET=m
@@ -397,6 +400,7 @@ CONFIG_NETCONSOLE=m
397CONFIG_NETCONSOLE_DYNAMIC=y 400CONFIG_NETCONSOLE_DYNAMIC=y
398CONFIG_VETH=m 401CONFIG_VETH=m
399# CONFIG_NET_VENDOR_3COM is not set 402# CONFIG_NET_VENDOR_3COM is not set
403# CONFIG_NET_VENDOR_AMAZON is not set
400CONFIG_A2065=y 404CONFIG_A2065=y
401CONFIG_ARIADNE=y 405CONFIG_ARIADNE=y
402CONFIG_ATARILANCE=y 406CONFIG_ATARILANCE=y
diff --git a/arch/m68k/configs/mvme147_defconfig b/arch/m68k/configs/mvme147_defconfig
index 0d502c2f73d5..28687192b68e 100644
--- a/arch/m68k/configs/mvme147_defconfig
+++ b/arch/m68k/configs/mvme147_defconfig
@@ -90,9 +90,10 @@ CONFIG_NF_TABLES_INET=m
90CONFIG_NF_TABLES_NETDEV=m 90CONFIG_NF_TABLES_NETDEV=m
91CONFIG_NFT_EXTHDR=m 91CONFIG_NFT_EXTHDR=m
92CONFIG_NFT_META=m 92CONFIG_NFT_META=m
93CONFIG_NFT_NUMGEN=m
93CONFIG_NFT_CT=m 94CONFIG_NFT_CT=m
94CONFIG_NFT_RBTREE=m 95CONFIG_NFT_SET_RBTREE=m
95CONFIG_NFT_HASH=m 96CONFIG_NFT_SET_HASH=m
96CONFIG_NFT_COUNTER=m 97CONFIG_NFT_COUNTER=m
97CONFIG_NFT_LOG=m 98CONFIG_NFT_LOG=m
98CONFIG_NFT_LIMIT=m 99CONFIG_NFT_LIMIT=m
@@ -100,8 +101,10 @@ CONFIG_NFT_MASQ=m
100CONFIG_NFT_REDIR=m 101CONFIG_NFT_REDIR=m
101CONFIG_NFT_NAT=m 102CONFIG_NFT_NAT=m
102CONFIG_NFT_QUEUE=m 103CONFIG_NFT_QUEUE=m
104CONFIG_NFT_QUOTA=m
103CONFIG_NFT_REJECT=m 105CONFIG_NFT_REJECT=m
104CONFIG_NFT_COMPAT=m 106CONFIG_NFT_COMPAT=m
107CONFIG_NFT_HASH=m
105CONFIG_NFT_DUP_NETDEV=m 108CONFIG_NFT_DUP_NETDEV=m
106CONFIG_NFT_FWD_NETDEV=m 109CONFIG_NFT_FWD_NETDEV=m
107CONFIG_NETFILTER_XT_SET=m 110CONFIG_NETFILTER_XT_SET=m
@@ -345,6 +348,7 @@ CONFIG_MACSEC=m
345CONFIG_NETCONSOLE=m 348CONFIG_NETCONSOLE=m
346CONFIG_NETCONSOLE_DYNAMIC=y 349CONFIG_NETCONSOLE_DYNAMIC=y
347CONFIG_VETH=m 350CONFIG_VETH=m
351# CONFIG_NET_VENDOR_AMAZON is not set
348CONFIG_MVME147_NET=y 352CONFIG_MVME147_NET=y
349# CONFIG_NET_VENDOR_ARC is not set 353# CONFIG_NET_VENDOR_ARC is not set
350# CONFIG_NET_CADENCE is not set 354# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/configs/mvme16x_defconfig b/arch/m68k/configs/mvme16x_defconfig
index 5930e91fc710..5a5f109ab3cd 100644
--- a/arch/m68k/configs/mvme16x_defconfig
+++ b/arch/m68k/configs/mvme16x_defconfig
@@ -91,9 +91,10 @@ CONFIG_NF_TABLES_INET=m
91CONFIG_NF_TABLES_NETDEV=m 91CONFIG_NF_TABLES_NETDEV=m
92CONFIG_NFT_EXTHDR=m 92CONFIG_NFT_EXTHDR=m
93CONFIG_NFT_META=m 93CONFIG_NFT_META=m
94CONFIG_NFT_NUMGEN=m
94CONFIG_NFT_CT=m 95CONFIG_NFT_CT=m
95CONFIG_NFT_RBTREE=m 96CONFIG_NFT_SET_RBTREE=m
96CONFIG_NFT_HASH=m 97CONFIG_NFT_SET_HASH=m
97CONFIG_NFT_COUNTER=m 98CONFIG_NFT_COUNTER=m
98CONFIG_NFT_LOG=m 99CONFIG_NFT_LOG=m
99CONFIG_NFT_LIMIT=m 100CONFIG_NFT_LIMIT=m
@@ -101,8 +102,10 @@ CONFIG_NFT_MASQ=m
101CONFIG_NFT_REDIR=m 102CONFIG_NFT_REDIR=m
102CONFIG_NFT_NAT=m 103CONFIG_NFT_NAT=m
103CONFIG_NFT_QUEUE=m 104CONFIG_NFT_QUEUE=m
105CONFIG_NFT_QUOTA=m
104CONFIG_NFT_REJECT=m 106CONFIG_NFT_REJECT=m
105CONFIG_NFT_COMPAT=m 107CONFIG_NFT_COMPAT=m
108CONFIG_NFT_HASH=m
106CONFIG_NFT_DUP_NETDEV=m 109CONFIG_NFT_DUP_NETDEV=m
107CONFIG_NFT_FWD_NETDEV=m 110CONFIG_NFT_FWD_NETDEV=m
108CONFIG_NETFILTER_XT_SET=m 111CONFIG_NETFILTER_XT_SET=m
@@ -346,6 +349,7 @@ CONFIG_MACSEC=m
346CONFIG_NETCONSOLE=m 349CONFIG_NETCONSOLE=m
347CONFIG_NETCONSOLE_DYNAMIC=y 350CONFIG_NETCONSOLE_DYNAMIC=y
348CONFIG_VETH=m 351CONFIG_VETH=m
352# CONFIG_NET_VENDOR_AMAZON is not set
349# CONFIG_NET_VENDOR_ARC is not set 353# CONFIG_NET_VENDOR_ARC is not set
350# CONFIG_NET_CADENCE is not set 354# CONFIG_NET_CADENCE is not set
351# CONFIG_NET_VENDOR_BROADCOM is not set 355# CONFIG_NET_VENDOR_BROADCOM is not set
diff --git a/arch/m68k/configs/q40_defconfig b/arch/m68k/configs/q40_defconfig
index 74e3ad82eca9..e557c9de3fbc 100644
--- a/arch/m68k/configs/q40_defconfig
+++ b/arch/m68k/configs/q40_defconfig
@@ -91,9 +91,10 @@ CONFIG_NF_TABLES_INET=m
91CONFIG_NF_TABLES_NETDEV=m 91CONFIG_NF_TABLES_NETDEV=m
92CONFIG_NFT_EXTHDR=m 92CONFIG_NFT_EXTHDR=m
93CONFIG_NFT_META=m 93CONFIG_NFT_META=m
94CONFIG_NFT_NUMGEN=m
94CONFIG_NFT_CT=m 95CONFIG_NFT_CT=m
95CONFIG_NFT_RBTREE=m 96CONFIG_NFT_SET_RBTREE=m
96CONFIG_NFT_HASH=m 97CONFIG_NFT_SET_HASH=m
97CONFIG_NFT_COUNTER=m 98CONFIG_NFT_COUNTER=m
98CONFIG_NFT_LOG=m 99CONFIG_NFT_LOG=m
99CONFIG_NFT_LIMIT=m 100CONFIG_NFT_LIMIT=m
@@ -101,8 +102,10 @@ CONFIG_NFT_MASQ=m
101CONFIG_NFT_REDIR=m 102CONFIG_NFT_REDIR=m
102CONFIG_NFT_NAT=m 103CONFIG_NFT_NAT=m
103CONFIG_NFT_QUEUE=m 104CONFIG_NFT_QUEUE=m
105CONFIG_NFT_QUOTA=m
104CONFIG_NFT_REJECT=m 106CONFIG_NFT_REJECT=m
105CONFIG_NFT_COMPAT=m 107CONFIG_NFT_COMPAT=m
108CONFIG_NFT_HASH=m
106CONFIG_NFT_DUP_NETDEV=m 109CONFIG_NFT_DUP_NETDEV=m
107CONFIG_NFT_FWD_NETDEV=m 110CONFIG_NFT_FWD_NETDEV=m
108CONFIG_NETFILTER_XT_SET=m 111CONFIG_NETFILTER_XT_SET=m
@@ -353,6 +356,7 @@ CONFIG_NETCONSOLE=m
353CONFIG_NETCONSOLE_DYNAMIC=y 356CONFIG_NETCONSOLE_DYNAMIC=y
354CONFIG_VETH=m 357CONFIG_VETH=m
355# CONFIG_NET_VENDOR_3COM is not set 358# CONFIG_NET_VENDOR_3COM is not set
359# CONFIG_NET_VENDOR_AMAZON is not set
356# CONFIG_NET_VENDOR_AMD is not set 360# CONFIG_NET_VENDOR_AMD is not set
357# CONFIG_NET_VENDOR_ARC is not set 361# CONFIG_NET_VENDOR_ARC is not set
358# CONFIG_NET_CADENCE is not set 362# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/configs/sun3_defconfig b/arch/m68k/configs/sun3_defconfig
index 4ba8606a4e69..c6a748a36daf 100644
--- a/arch/m68k/configs/sun3_defconfig
+++ b/arch/m68k/configs/sun3_defconfig
@@ -88,9 +88,10 @@ CONFIG_NF_TABLES_INET=m
88CONFIG_NF_TABLES_NETDEV=m 88CONFIG_NF_TABLES_NETDEV=m
89CONFIG_NFT_EXTHDR=m 89CONFIG_NFT_EXTHDR=m
90CONFIG_NFT_META=m 90CONFIG_NFT_META=m
91CONFIG_NFT_NUMGEN=m
91CONFIG_NFT_CT=m 92CONFIG_NFT_CT=m
92CONFIG_NFT_RBTREE=m 93CONFIG_NFT_SET_RBTREE=m
93CONFIG_NFT_HASH=m 94CONFIG_NFT_SET_HASH=m
94CONFIG_NFT_COUNTER=m 95CONFIG_NFT_COUNTER=m
95CONFIG_NFT_LOG=m 96CONFIG_NFT_LOG=m
96CONFIG_NFT_LIMIT=m 97CONFIG_NFT_LIMIT=m
@@ -98,8 +99,10 @@ CONFIG_NFT_MASQ=m
98CONFIG_NFT_REDIR=m 99CONFIG_NFT_REDIR=m
99CONFIG_NFT_NAT=m 100CONFIG_NFT_NAT=m
100CONFIG_NFT_QUEUE=m 101CONFIG_NFT_QUEUE=m
102CONFIG_NFT_QUOTA=m
101CONFIG_NFT_REJECT=m 103CONFIG_NFT_REJECT=m
102CONFIG_NFT_COMPAT=m 104CONFIG_NFT_COMPAT=m
105CONFIG_NFT_HASH=m
103CONFIG_NFT_DUP_NETDEV=m 106CONFIG_NFT_DUP_NETDEV=m
104CONFIG_NFT_FWD_NETDEV=m 107CONFIG_NFT_FWD_NETDEV=m
105CONFIG_NETFILTER_XT_SET=m 108CONFIG_NETFILTER_XT_SET=m
@@ -343,6 +346,7 @@ CONFIG_MACSEC=m
343CONFIG_NETCONSOLE=m 346CONFIG_NETCONSOLE=m
344CONFIG_NETCONSOLE_DYNAMIC=y 347CONFIG_NETCONSOLE_DYNAMIC=y
345CONFIG_VETH=m 348CONFIG_VETH=m
349# CONFIG_NET_VENDOR_AMAZON is not set
346CONFIG_SUN3LANCE=y 350CONFIG_SUN3LANCE=y
347# CONFIG_NET_VENDOR_ARC is not set 351# CONFIG_NET_VENDOR_ARC is not set
348# CONFIG_NET_CADENCE is not set 352# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/configs/sun3x_defconfig b/arch/m68k/configs/sun3x_defconfig
index c6f49726a6c9..10d60857b9a6 100644
--- a/arch/m68k/configs/sun3x_defconfig
+++ b/arch/m68k/configs/sun3x_defconfig
@@ -88,9 +88,10 @@ CONFIG_NF_TABLES_INET=m
88CONFIG_NF_TABLES_NETDEV=m 88CONFIG_NF_TABLES_NETDEV=m
89CONFIG_NFT_EXTHDR=m 89CONFIG_NFT_EXTHDR=m
90CONFIG_NFT_META=m 90CONFIG_NFT_META=m
91CONFIG_NFT_NUMGEN=m
91CONFIG_NFT_CT=m 92CONFIG_NFT_CT=m
92CONFIG_NFT_RBTREE=m 93CONFIG_NFT_SET_RBTREE=m
93CONFIG_NFT_HASH=m 94CONFIG_NFT_SET_HASH=m
94CONFIG_NFT_COUNTER=m 95CONFIG_NFT_COUNTER=m
95CONFIG_NFT_LOG=m 96CONFIG_NFT_LOG=m
96CONFIG_NFT_LIMIT=m 97CONFIG_NFT_LIMIT=m
@@ -98,8 +99,10 @@ CONFIG_NFT_MASQ=m
98CONFIG_NFT_REDIR=m 99CONFIG_NFT_REDIR=m
99CONFIG_NFT_NAT=m 100CONFIG_NFT_NAT=m
100CONFIG_NFT_QUEUE=m 101CONFIG_NFT_QUEUE=m
102CONFIG_NFT_QUOTA=m
101CONFIG_NFT_REJECT=m 103CONFIG_NFT_REJECT=m
102CONFIG_NFT_COMPAT=m 104CONFIG_NFT_COMPAT=m
105CONFIG_NFT_HASH=m
103CONFIG_NFT_DUP_NETDEV=m 106CONFIG_NFT_DUP_NETDEV=m
104CONFIG_NFT_FWD_NETDEV=m 107CONFIG_NFT_FWD_NETDEV=m
105CONFIG_NETFILTER_XT_SET=m 108CONFIG_NETFILTER_XT_SET=m
@@ -343,6 +346,7 @@ CONFIG_MACSEC=m
343CONFIG_NETCONSOLE=m 346CONFIG_NETCONSOLE=m
344CONFIG_NETCONSOLE_DYNAMIC=y 347CONFIG_NETCONSOLE_DYNAMIC=y
345CONFIG_VETH=m 348CONFIG_VETH=m
349# CONFIG_NET_VENDOR_AMAZON is not set
346CONFIG_SUN3LANCE=y 350CONFIG_SUN3LANCE=y
347# CONFIG_NET_VENDOR_ARC is not set 351# CONFIG_NET_VENDOR_ARC is not set
348# CONFIG_NET_CADENCE is not set 352# CONFIG_NET_CADENCE is not set
diff --git a/arch/m68k/include/asm/delay.h b/arch/m68k/include/asm/delay.h
index d28fa8fe26fe..c598d847d56b 100644
--- a/arch/m68k/include/asm/delay.h
+++ b/arch/m68k/include/asm/delay.h
@@ -114,6 +114,6 @@ static inline void __udelay(unsigned long usecs)
114 */ 114 */
115#define HZSCALE (268435456 / (1000000 / HZ)) 115#define HZSCALE (268435456 / (1000000 / HZ))
116 116
117#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000)); 117#define ndelay(n) __delay(DIV_ROUND_UP((n) * ((((HZSCALE) >> 11) * (loops_per_jiffy >> 11)) >> 6), 1000))
118 118
119#endif /* defined(_M68K_DELAY_H) */ 119#endif /* defined(_M68K_DELAY_H) */
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index 7dd2dd47909a..df78b2ca70eb 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -215,6 +215,12 @@
215#endif 215#endif
216 216
217/* 217/*
218 * Wired register bits
219 */
220#define MIPSR6_WIRED_LIMIT (_ULCAST_(0xffff) << 16)
221#define MIPSR6_WIRED_WIRED (_ULCAST_(0xffff) << 0)
222
223/*
218 * Values used for computation of new tlb entries 224 * Values used for computation of new tlb entries
219 */ 225 */
220#define PL_4K 12 226#define PL_4K 12
diff --git a/arch/mips/include/asm/tlb.h b/arch/mips/include/asm/tlb.h
index 4a2349302b55..dd179fd8acda 100644
--- a/arch/mips/include/asm/tlb.h
+++ b/arch/mips/include/asm/tlb.h
@@ -1,6 +1,9 @@
1#ifndef __ASM_TLB_H 1#ifndef __ASM_TLB_H
2#define __ASM_TLB_H 2#define __ASM_TLB_H
3 3
4#include <asm/cpu-features.h>
5#include <asm/mipsregs.h>
6
4/* 7/*
5 * MIPS doesn't need any special per-pte or per-vma handling, except 8 * MIPS doesn't need any special per-pte or per-vma handling, except
6 * we need to flush cache for area to be unmapped. 9 * we need to flush cache for area to be unmapped.
@@ -22,6 +25,16 @@
22 ((CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | \ 25 ((CKSEG0 + ((idx) << (PAGE_SHIFT + 1))) | \
23 (cpu_has_tlbinv ? MIPS_ENTRYHI_EHINV : 0)) 26 (cpu_has_tlbinv ? MIPS_ENTRYHI_EHINV : 0))
24 27
28static inline unsigned int num_wired_entries(void)
29{
30 unsigned int wired = read_c0_wired();
31
32 if (cpu_has_mips_r6)
33 wired &= MIPSR6_WIRED_WIRED;
34
35 return wired;
36}
37
25#include <asm-generic/tlb.h> 38#include <asm-generic/tlb.h>
26 39
27#endif /* __ASM_TLB_H */ 40#endif /* __ASM_TLB_H */
diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
index 8d0170969e22..a7f81261c781 100644
--- a/arch/mips/kernel/time.c
+++ b/arch/mips/kernel/time.c
@@ -36,7 +36,7 @@ EXPORT_SYMBOL(rtc_lock);
36 36
37int __weak rtc_mips_set_time(unsigned long sec) 37int __weak rtc_mips_set_time(unsigned long sec)
38{ 38{
39 return 0; 39 return -ENODEV;
40} 40}
41 41
42int __weak rtc_mips_set_mmss(unsigned long nowtime) 42int __weak rtc_mips_set_mmss(unsigned long nowtime)
diff --git a/arch/mips/lantiq/falcon/sysctrl.c b/arch/mips/lantiq/falcon/sysctrl.c
index 2a1b3021589c..82bbd0e2e298 100644
--- a/arch/mips/lantiq/falcon/sysctrl.c
+++ b/arch/mips/lantiq/falcon/sysctrl.c
@@ -24,7 +24,7 @@
24 24
25/* GPE frequency selection */ 25/* GPE frequency selection */
26#define GPPC_OFFSET 24 26#define GPPC_OFFSET 24
27#define GPEFREQ_MASK 0x00000C0 27#define GPEFREQ_MASK 0x0000C00
28#define GPEFREQ_OFFSET 10 28#define GPEFREQ_OFFSET 10
29/* Clock status register */ 29/* Clock status register */
30#define SYSCTL_CLKS 0x0000 30#define SYSCTL_CLKS 0x0000
diff --git a/arch/mips/mm/fault.c b/arch/mips/mm/fault.c
index d56a855828c2..3bef306cdfdb 100644
--- a/arch/mips/mm/fault.c
+++ b/arch/mips/mm/fault.c
@@ -209,17 +209,18 @@ bad_area_nosemaphore:
209 if (show_unhandled_signals && 209 if (show_unhandled_signals &&
210 unhandled_signal(tsk, SIGSEGV) && 210 unhandled_signal(tsk, SIGSEGV) &&
211 __ratelimit(&ratelimit_state)) { 211 __ratelimit(&ratelimit_state)) {
212 pr_info("\ndo_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx", 212 pr_info("do_page_fault(): sending SIGSEGV to %s for invalid %s %0*lx\n",
213 tsk->comm, 213 tsk->comm,
214 write ? "write access to" : "read access from", 214 write ? "write access to" : "read access from",
215 field, address); 215 field, address);
216 pr_info("epc = %0*lx in", field, 216 pr_info("epc = %0*lx in", field,
217 (unsigned long) regs->cp0_epc); 217 (unsigned long) regs->cp0_epc);
218 print_vma_addr(" ", regs->cp0_epc); 218 print_vma_addr(KERN_CONT " ", regs->cp0_epc);
219 pr_cont("\n");
219 pr_info("ra = %0*lx in", field, 220 pr_info("ra = %0*lx in", field,
220 (unsigned long) regs->regs[31]); 221 (unsigned long) regs->regs[31]);
221 print_vma_addr(" ", regs->regs[31]); 222 print_vma_addr(KERN_CONT " ", regs->regs[31]);
222 pr_info("\n"); 223 pr_cont("\n");
223 } 224 }
224 current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f; 225 current->thread.trap_nr = (regs->cp0_cause >> 2) & 0x1f;
225 info.si_signo = SIGSEGV; 226 info.si_signo = SIGSEGV;
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 3a6edecc3f38..e86ebcf5c071 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -118,7 +118,7 @@ static void *__kmap_pgprot(struct page *page, unsigned long addr, pgprot_t prot)
118 writex_c0_entrylo1(entrylo); 118 writex_c0_entrylo1(entrylo);
119 } 119 }
120#endif 120#endif
121 tlbidx = read_c0_wired(); 121 tlbidx = num_wired_entries();
122 write_c0_wired(tlbidx + 1); 122 write_c0_wired(tlbidx + 1);
123 write_c0_index(tlbidx); 123 write_c0_index(tlbidx);
124 mtc0_tlbw_hazard(); 124 mtc0_tlbw_hazard();
@@ -147,7 +147,7 @@ void kunmap_coherent(void)
147 147
148 local_irq_save(flags); 148 local_irq_save(flags);
149 old_ctx = read_c0_entryhi(); 149 old_ctx = read_c0_entryhi();
150 wired = read_c0_wired() - 1; 150 wired = num_wired_entries() - 1;
151 write_c0_wired(wired); 151 write_c0_wired(wired);
152 write_c0_index(wired); 152 write_c0_index(wired);
153 write_c0_entryhi(UNIQUE_ENTRYHI(wired)); 153 write_c0_entryhi(UNIQUE_ENTRYHI(wired));
diff --git a/arch/mips/mm/tlb-r4k.c b/arch/mips/mm/tlb-r4k.c
index bba9c1484b41..0596505770db 100644
--- a/arch/mips/mm/tlb-r4k.c
+++ b/arch/mips/mm/tlb-r4k.c
@@ -65,7 +65,7 @@ void local_flush_tlb_all(void)
65 write_c0_entrylo0(0); 65 write_c0_entrylo0(0);
66 write_c0_entrylo1(0); 66 write_c0_entrylo1(0);
67 67
68 entry = read_c0_wired(); 68 entry = num_wired_entries();
69 69
70 /* 70 /*
71 * Blast 'em all away. 71 * Blast 'em all away.
@@ -385,7 +385,7 @@ void add_wired_entry(unsigned long entrylo0, unsigned long entrylo1,
385 old_ctx = read_c0_entryhi(); 385 old_ctx = read_c0_entryhi();
386 htw_stop(); 386 htw_stop();
387 old_pagemask = read_c0_pagemask(); 387 old_pagemask = read_c0_pagemask();
388 wired = read_c0_wired(); 388 wired = num_wired_entries();
389 write_c0_wired(wired + 1); 389 write_c0_wired(wired + 1);
390 write_c0_index(wired); 390 write_c0_index(wired);
391 tlbw_use_hazard(); /* What is the hazard here? */ 391 tlbw_use_hazard(); /* What is the hazard here? */
@@ -449,7 +449,7 @@ __init int add_temporary_entry(unsigned long entrylo0, unsigned long entrylo1,
449 htw_stop(); 449 htw_stop();
450 old_ctx = read_c0_entryhi(); 450 old_ctx = read_c0_entryhi();
451 old_pagemask = read_c0_pagemask(); 451 old_pagemask = read_c0_pagemask();
452 wired = read_c0_wired(); 452 wired = num_wired_entries();
453 if (--temp_tlb_entry < wired) { 453 if (--temp_tlb_entry < wired) {
454 printk(KERN_WARNING 454 printk(KERN_WARNING
455 "No TLB space left for add_temporary_entry\n"); 455 "No TLB space left for add_temporary_entry\n");
diff --git a/arch/nios2/kernel/time.c b/arch/nios2/kernel/time.c
index d9563ddb337e..746bf5caaffc 100644
--- a/arch/nios2/kernel/time.c
+++ b/arch/nios2/kernel/time.c
@@ -324,6 +324,7 @@ static int __init nios2_time_init(struct device_node *timer)
324 ret = nios2_clocksource_init(timer); 324 ret = nios2_clocksource_init(timer);
325 break; 325 break;
326 default: 326 default:
327 ret = 0;
327 break; 328 break;
328 } 329 }
329 330
diff --git a/arch/openrisc/include/asm/cache.h b/arch/openrisc/include/asm/cache.h
index 4ce7a01a252d..5f55da9cbfd5 100644
--- a/arch/openrisc/include/asm/cache.h
+++ b/arch/openrisc/include/asm/cache.h
@@ -23,6 +23,8 @@
23 * they shouldn't be hard-coded! 23 * they shouldn't be hard-coded!
24 */ 24 */
25 25
26#define __ro_after_init __read_mostly
27
26#define L1_CACHE_BYTES 16 28#define L1_CACHE_BYTES 16
27#define L1_CACHE_SHIFT 4 29#define L1_CACHE_SHIFT 4
28 30
diff --git a/arch/parisc/Kconfig b/arch/parisc/Kconfig
index 71c4a3aa3752..a14b86587013 100644
--- a/arch/parisc/Kconfig
+++ b/arch/parisc/Kconfig
@@ -34,7 +34,9 @@ config PARISC
34 select HAVE_ARCH_HASH 34 select HAVE_ARCH_HASH
35 select HAVE_ARCH_SECCOMP_FILTER 35 select HAVE_ARCH_SECCOMP_FILTER
36 select HAVE_ARCH_TRACEHOOK 36 select HAVE_ARCH_TRACEHOOK
37 select HAVE_UNSTABLE_SCHED_CLOCK if (SMP || !64BIT) 37 select GENERIC_SCHED_CLOCK
38 select HAVE_UNSTABLE_SCHED_CLOCK if SMP
39 select GENERIC_CLOCKEVENTS
38 select ARCH_NO_COHERENT_DMA_MMAP 40 select ARCH_NO_COHERENT_DMA_MMAP
39 select CPU_NO_EFFICIENT_FFS 41 select CPU_NO_EFFICIENT_FFS
40 42
diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h
index c2c43f714684..3a4ed9f91d57 100644
--- a/arch/parisc/include/asm/pgtable.h
+++ b/arch/parisc/include/asm/pgtable.h
@@ -65,9 +65,9 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
65 unsigned long flags; \ 65 unsigned long flags; \
66 spin_lock_irqsave(&pa_tlb_lock, flags); \ 66 spin_lock_irqsave(&pa_tlb_lock, flags); \
67 old_pte = *ptep; \ 67 old_pte = *ptep; \
68 set_pte(ptep, pteval); \
69 if (pte_inserted(old_pte)) \ 68 if (pte_inserted(old_pte)) \
70 purge_tlb_entries(mm, addr); \ 69 purge_tlb_entries(mm, addr); \
70 set_pte(ptep, pteval); \
71 spin_unlock_irqrestore(&pa_tlb_lock, flags); \ 71 spin_unlock_irqrestore(&pa_tlb_lock, flags); \
72 } while (0) 72 } while (0)
73 73
@@ -478,8 +478,8 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned
478 spin_unlock_irqrestore(&pa_tlb_lock, flags); 478 spin_unlock_irqrestore(&pa_tlb_lock, flags);
479 return 0; 479 return 0;
480 } 480 }
481 set_pte(ptep, pte_mkold(pte));
482 purge_tlb_entries(vma->vm_mm, addr); 481 purge_tlb_entries(vma->vm_mm, addr);
482 set_pte(ptep, pte_mkold(pte));
483 spin_unlock_irqrestore(&pa_tlb_lock, flags); 483 spin_unlock_irqrestore(&pa_tlb_lock, flags);
484 return 1; 484 return 1;
485} 485}
@@ -492,9 +492,9 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
492 492
493 spin_lock_irqsave(&pa_tlb_lock, flags); 493 spin_lock_irqsave(&pa_tlb_lock, flags);
494 old_pte = *ptep; 494 old_pte = *ptep;
495 set_pte(ptep, __pte(0));
496 if (pte_inserted(old_pte)) 495 if (pte_inserted(old_pte))
497 purge_tlb_entries(mm, addr); 496 purge_tlb_entries(mm, addr);
497 set_pte(ptep, __pte(0));
498 spin_unlock_irqrestore(&pa_tlb_lock, flags); 498 spin_unlock_irqrestore(&pa_tlb_lock, flags);
499 499
500 return old_pte; 500 return old_pte;
@@ -504,8 +504,8 @@ static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr,
504{ 504{
505 unsigned long flags; 505 unsigned long flags;
506 spin_lock_irqsave(&pa_tlb_lock, flags); 506 spin_lock_irqsave(&pa_tlb_lock, flags);
507 set_pte(ptep, pte_wrprotect(*ptep));
508 purge_tlb_entries(mm, addr); 507 purge_tlb_entries(mm, addr);
508 set_pte(ptep, pte_wrprotect(*ptep));
509 spin_unlock_irqrestore(&pa_tlb_lock, flags); 509 spin_unlock_irqrestore(&pa_tlb_lock, flags);
510} 510}
511 511
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
index 629eb464d5ba..977f0a4f5ecf 100644
--- a/arch/parisc/kernel/cache.c
+++ b/arch/parisc/kernel/cache.c
@@ -369,6 +369,7 @@ void __init parisc_setup_cache_timing(void)
369{ 369{
370 unsigned long rangetime, alltime; 370 unsigned long rangetime, alltime;
371 unsigned long size, start; 371 unsigned long size, start;
372 unsigned long threshold;
372 373
373 alltime = mfctl(16); 374 alltime = mfctl(16);
374 flush_data_cache(); 375 flush_data_cache();
@@ -382,26 +383,30 @@ void __init parisc_setup_cache_timing(void)
382 printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n", 383 printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n",
383 alltime, size, rangetime); 384 alltime, size, rangetime);
384 385
385 /* Racy, but if we see an intermediate value, it's ok too... */ 386 threshold = L1_CACHE_ALIGN(size * alltime / rangetime);
386 parisc_cache_flush_threshold = size * alltime / rangetime; 387 if (threshold > cache_info.dc_size)
387 388 threshold = cache_info.dc_size;
388 parisc_cache_flush_threshold = L1_CACHE_ALIGN(parisc_cache_flush_threshold); 389 if (threshold)
389 if (!parisc_cache_flush_threshold) 390 parisc_cache_flush_threshold = threshold;
390 parisc_cache_flush_threshold = FLUSH_THRESHOLD; 391 printk(KERN_INFO "Cache flush threshold set to %lu KiB\n",
391
392 if (parisc_cache_flush_threshold > cache_info.dc_size)
393 parisc_cache_flush_threshold = cache_info.dc_size;
394
395 printk(KERN_INFO "Setting cache flush threshold to %lu kB\n",
396 parisc_cache_flush_threshold/1024); 392 parisc_cache_flush_threshold/1024);
397 393
398 /* calculate TLB flush threshold */ 394 /* calculate TLB flush threshold */
399 395
396 /* On SMP machines, skip the TLB measure of kernel text which
397 * has been mapped as huge pages. */
398 if (num_online_cpus() > 1 && !parisc_requires_coherency()) {
399 threshold = max(cache_info.it_size, cache_info.dt_size);
400 threshold *= PAGE_SIZE;
401 threshold /= num_online_cpus();
402 goto set_tlb_threshold;
403 }
404
400 alltime = mfctl(16); 405 alltime = mfctl(16);
401 flush_tlb_all(); 406 flush_tlb_all();
402 alltime = mfctl(16) - alltime; 407 alltime = mfctl(16) - alltime;
403 408
404 size = PAGE_SIZE; 409 size = 0;
405 start = (unsigned long) _text; 410 start = (unsigned long) _text;
406 rangetime = mfctl(16); 411 rangetime = mfctl(16);
407 while (start < (unsigned long) _end) { 412 while (start < (unsigned long) _end) {
@@ -414,13 +419,12 @@ void __init parisc_setup_cache_timing(void)
414 printk(KERN_DEBUG "Whole TLB flush %lu cycles, flushing %lu bytes %lu cycles\n", 419 printk(KERN_DEBUG "Whole TLB flush %lu cycles, flushing %lu bytes %lu cycles\n",
415 alltime, size, rangetime); 420 alltime, size, rangetime);
416 421
417 parisc_tlb_flush_threshold = size * alltime / rangetime; 422 threshold = PAGE_ALIGN(num_online_cpus() * size * alltime / rangetime);
418 parisc_tlb_flush_threshold *= num_online_cpus();
419 parisc_tlb_flush_threshold = PAGE_ALIGN(parisc_tlb_flush_threshold);
420 if (!parisc_tlb_flush_threshold)
421 parisc_tlb_flush_threshold = FLUSH_TLB_THRESHOLD;
422 423
423 printk(KERN_INFO "Setting TLB flush threshold to %lu kB\n", 424set_tlb_threshold:
425 if (threshold)
426 parisc_tlb_flush_threshold = threshold;
427 printk(KERN_INFO "TLB flush threshold set to %lu KiB\n",
424 parisc_tlb_flush_threshold/1024); 428 parisc_tlb_flush_threshold/1024);
425} 429}
426 430
diff --git a/arch/parisc/kernel/inventory.c b/arch/parisc/kernel/inventory.c
index 545f9d2fe711..c05d1876d27c 100644
--- a/arch/parisc/kernel/inventory.c
+++ b/arch/parisc/kernel/inventory.c
@@ -58,7 +58,7 @@ void __init setup_pdc(void)
58 status = pdc_system_map_find_mods(&module_result, &module_path, 0); 58 status = pdc_system_map_find_mods(&module_result, &module_path, 0);
59 if (status == PDC_OK) { 59 if (status == PDC_OK) {
60 pdc_type = PDC_TYPE_SYSTEM_MAP; 60 pdc_type = PDC_TYPE_SYSTEM_MAP;
61 printk("System Map.\n"); 61 pr_cont("System Map.\n");
62 return; 62 return;
63 } 63 }
64 64
@@ -77,7 +77,7 @@ void __init setup_pdc(void)
77 status = pdc_pat_cell_get_number(&cell_info); 77 status = pdc_pat_cell_get_number(&cell_info);
78 if (status == PDC_OK) { 78 if (status == PDC_OK) {
79 pdc_type = PDC_TYPE_PAT; 79 pdc_type = PDC_TYPE_PAT;
80 printk("64 bit PAT.\n"); 80 pr_cont("64 bit PAT.\n");
81 return; 81 return;
82 } 82 }
83#endif 83#endif
@@ -97,12 +97,12 @@ void __init setup_pdc(void)
97 case 0xC: /* 715/64, at least */ 97 case 0xC: /* 715/64, at least */
98 98
99 pdc_type = PDC_TYPE_SNAKE; 99 pdc_type = PDC_TYPE_SNAKE;
100 printk("Snake.\n"); 100 pr_cont("Snake.\n");
101 return; 101 return;
102 102
103 default: /* Everything else */ 103 default: /* Everything else */
104 104
105 printk("Unsupported.\n"); 105 pr_cont("Unsupported.\n");
106 panic("If this is a 64-bit machine, please try a 64-bit kernel.\n"); 106 panic("If this is a 64-bit machine, please try a 64-bit kernel.\n");
107 } 107 }
108} 108}
diff --git a/arch/parisc/kernel/pacache.S b/arch/parisc/kernel/pacache.S
index 985e06da37f5..adf7187f8951 100644
--- a/arch/parisc/kernel/pacache.S
+++ b/arch/parisc/kernel/pacache.S
@@ -96,7 +96,7 @@ fitmanyloop: /* Loop if LOOP >= 2 */
96 96
97fitmanymiddle: /* Loop if LOOP >= 2 */ 97fitmanymiddle: /* Loop if LOOP >= 2 */
98 addib,COND(>) -1, %r31, fitmanymiddle /* Adjusted inner loop decr */ 98 addib,COND(>) -1, %r31, fitmanymiddle /* Adjusted inner loop decr */
99 pitlbe 0(%sr1, %r28) 99 pitlbe %r0(%sr1, %r28)
100 pitlbe,m %arg1(%sr1, %r28) /* Last pitlbe and addr adjust */ 100 pitlbe,m %arg1(%sr1, %r28) /* Last pitlbe and addr adjust */
101 addib,COND(>) -1, %r29, fitmanymiddle /* Middle loop decr */ 101 addib,COND(>) -1, %r29, fitmanymiddle /* Middle loop decr */
102 copy %arg3, %r31 /* Re-init inner loop count */ 102 copy %arg3, %r31 /* Re-init inner loop count */
@@ -139,7 +139,7 @@ fdtmanyloop: /* Loop if LOOP >= 2 */
139 139
140fdtmanymiddle: /* Loop if LOOP >= 2 */ 140fdtmanymiddle: /* Loop if LOOP >= 2 */
141 addib,COND(>) -1, %r31, fdtmanymiddle /* Adjusted inner loop decr */ 141 addib,COND(>) -1, %r31, fdtmanymiddle /* Adjusted inner loop decr */
142 pdtlbe 0(%sr1, %r28) 142 pdtlbe %r0(%sr1, %r28)
143 pdtlbe,m %arg1(%sr1, %r28) /* Last pdtlbe and addr adjust */ 143 pdtlbe,m %arg1(%sr1, %r28) /* Last pdtlbe and addr adjust */
144 addib,COND(>) -1, %r29, fdtmanymiddle /* Middle loop decr */ 144 addib,COND(>) -1, %r29, fdtmanymiddle /* Middle loop decr */
145 copy %arg3, %r31 /* Re-init inner loop count */ 145 copy %arg3, %r31 /* Re-init inner loop count */
@@ -626,12 +626,12 @@ ENTRY_CFI(copy_user_page_asm)
626 /* Purge any old translations */ 626 /* Purge any old translations */
627 627
628#ifdef CONFIG_PA20 628#ifdef CONFIG_PA20
629 pdtlb,l 0(%r28) 629 pdtlb,l %r0(%r28)
630 pdtlb,l 0(%r29) 630 pdtlb,l %r0(%r29)
631#else 631#else
632 tlb_lock %r20,%r21,%r22 632 tlb_lock %r20,%r21,%r22
633 pdtlb 0(%r28) 633 pdtlb %r0(%r28)
634 pdtlb 0(%r29) 634 pdtlb %r0(%r29)
635 tlb_unlock %r20,%r21,%r22 635 tlb_unlock %r20,%r21,%r22
636#endif 636#endif
637 637
@@ -774,10 +774,10 @@ ENTRY_CFI(clear_user_page_asm)
774 /* Purge any old translation */ 774 /* Purge any old translation */
775 775
776#ifdef CONFIG_PA20 776#ifdef CONFIG_PA20
777 pdtlb,l 0(%r28) 777 pdtlb,l %r0(%r28)
778#else 778#else
779 tlb_lock %r20,%r21,%r22 779 tlb_lock %r20,%r21,%r22
780 pdtlb 0(%r28) 780 pdtlb %r0(%r28)
781 tlb_unlock %r20,%r21,%r22 781 tlb_unlock %r20,%r21,%r22
782#endif 782#endif
783 783
@@ -858,10 +858,10 @@ ENTRY_CFI(flush_dcache_page_asm)
858 /* Purge any old translation */ 858 /* Purge any old translation */
859 859
860#ifdef CONFIG_PA20 860#ifdef CONFIG_PA20
861 pdtlb,l 0(%r28) 861 pdtlb,l %r0(%r28)
862#else 862#else
863 tlb_lock %r20,%r21,%r22 863 tlb_lock %r20,%r21,%r22
864 pdtlb 0(%r28) 864 pdtlb %r0(%r28)
865 tlb_unlock %r20,%r21,%r22 865 tlb_unlock %r20,%r21,%r22
866#endif 866#endif
867 867
@@ -892,19 +892,10 @@ ENTRY_CFI(flush_dcache_page_asm)
892 fdc,m r31(%r28) 892 fdc,m r31(%r28)
893 fdc,m r31(%r28) 893 fdc,m r31(%r28)
894 fdc,m r31(%r28) 894 fdc,m r31(%r28)
895 cmpb,COND(<<) %r28, %r25,1b 895 cmpb,COND(<<) %r28, %r25,1b
896 fdc,m r31(%r28) 896 fdc,m r31(%r28)
897 897
898 sync 898 sync
899
900#ifdef CONFIG_PA20
901 pdtlb,l 0(%r25)
902#else
903 tlb_lock %r20,%r21,%r22
904 pdtlb 0(%r25)
905 tlb_unlock %r20,%r21,%r22
906#endif
907
908 bv %r0(%r2) 899 bv %r0(%r2)
909 nop 900 nop
910 .exit 901 .exit
@@ -931,13 +922,18 @@ ENTRY_CFI(flush_icache_page_asm)
931 depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */ 922 depwi 0, 31,PAGE_SHIFT, %r28 /* Clear any offset bits */
932#endif 923#endif
933 924
934 /* Purge any old translation */ 925 /* Purge any old translation. Note that the FIC instruction
926 * may use either the instruction or data TLB. Given that we
927 * have a flat address space, it's not clear which TLB will be
928 * used. So, we purge both entries. */
935 929
936#ifdef CONFIG_PA20 930#ifdef CONFIG_PA20
931 pdtlb,l %r0(%r28)
937 pitlb,l %r0(%sr4,%r28) 932 pitlb,l %r0(%sr4,%r28)
938#else 933#else
939 tlb_lock %r20,%r21,%r22 934 tlb_lock %r20,%r21,%r22
940 pitlb (%sr4,%r28) 935 pdtlb %r0(%r28)
936 pitlb %r0(%sr4,%r28)
941 tlb_unlock %r20,%r21,%r22 937 tlb_unlock %r20,%r21,%r22
942#endif 938#endif
943 939
@@ -974,15 +970,6 @@ ENTRY_CFI(flush_icache_page_asm)
974 fic,m %r31(%sr4,%r28) 970 fic,m %r31(%sr4,%r28)
975 971
976 sync 972 sync
977
978#ifdef CONFIG_PA20
979 pitlb,l %r0(%sr4,%r25)
980#else
981 tlb_lock %r20,%r21,%r22
982 pitlb (%sr4,%r25)
983 tlb_unlock %r20,%r21,%r22
984#endif
985
986 bv %r0(%r2) 973 bv %r0(%r2)
987 nop 974 nop
988 .exit 975 .exit
diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c
index 02d9ed0f3949..494ff6e8c88a 100644
--- a/arch/parisc/kernel/pci-dma.c
+++ b/arch/parisc/kernel/pci-dma.c
@@ -95,8 +95,8 @@ static inline int map_pte_uncached(pte_t * pte,
95 95
96 if (!pte_none(*pte)) 96 if (!pte_none(*pte))
97 printk(KERN_ERR "map_pte_uncached: page already exists\n"); 97 printk(KERN_ERR "map_pte_uncached: page already exists\n");
98 set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
99 purge_tlb_start(flags); 98 purge_tlb_start(flags);
99 set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
100 pdtlb_kernel(orig_vaddr); 100 pdtlb_kernel(orig_vaddr);
101 purge_tlb_end(flags); 101 purge_tlb_end(flags);
102 vaddr += PAGE_SIZE; 102 vaddr += PAGE_SIZE;
diff --git a/arch/parisc/kernel/setup.c b/arch/parisc/kernel/setup.c
index 81d6f6391944..2e66a887788e 100644
--- a/arch/parisc/kernel/setup.c
+++ b/arch/parisc/kernel/setup.c
@@ -334,6 +334,10 @@ static int __init parisc_init(void)
334 /* tell PDC we're Linux. Nevermind failure. */ 334 /* tell PDC we're Linux. Nevermind failure. */
335 pdc_stable_write(0x40, &osid, sizeof(osid)); 335 pdc_stable_write(0x40, &osid, sizeof(osid));
336 336
337 /* start with known state */
338 flush_cache_all_local();
339 flush_tlb_all_local(NULL);
340
337 processor_init(); 341 processor_init();
338#ifdef CONFIG_SMP 342#ifdef CONFIG_SMP
339 pr_info("CPU(s): %d out of %d %s at %d.%06d MHz online\n", 343 pr_info("CPU(s): %d out of %d %s at %d.%06d MHz online\n",
diff --git a/arch/parisc/kernel/time.c b/arch/parisc/kernel/time.c
index 9b63b876a13a..325f30d82b64 100644
--- a/arch/parisc/kernel/time.c
+++ b/arch/parisc/kernel/time.c
@@ -14,6 +14,7 @@
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/rtc.h> 15#include <linux/rtc.h>
16#include <linux/sched.h> 16#include <linux/sched.h>
17#include <linux/sched_clock.h>
17#include <linux/kernel.h> 18#include <linux/kernel.h>
18#include <linux/param.h> 19#include <linux/param.h>
19#include <linux/string.h> 20#include <linux/string.h>
@@ -39,18 +40,6 @@
39 40
40static unsigned long clocktick __read_mostly; /* timer cycles per tick */ 41static unsigned long clocktick __read_mostly; /* timer cycles per tick */
41 42
42#ifndef CONFIG_64BIT
43/*
44 * The processor-internal cycle counter (Control Register 16) is used as time
45 * source for the sched_clock() function. This register is 64bit wide on a
46 * 64-bit kernel and 32bit on a 32-bit kernel. Since sched_clock() always
47 * requires a 64bit counter we emulate on the 32-bit kernel the higher 32bits
48 * with a per-cpu variable which we increase every time the counter
49 * wraps-around (which happens every ~4 secounds).
50 */
51static DEFINE_PER_CPU(unsigned long, cr16_high_32_bits);
52#endif
53
54/* 43/*
55 * We keep time on PA-RISC Linux by using the Interval Timer which is 44 * We keep time on PA-RISC Linux by using the Interval Timer which is
56 * a pair of registers; one is read-only and one is write-only; both 45 * a pair of registers; one is read-only and one is write-only; both
@@ -121,12 +110,6 @@ irqreturn_t __irq_entry timer_interrupt(int irq, void *dev_id)
121 */ 110 */
122 mtctl(next_tick, 16); 111 mtctl(next_tick, 16);
123 112
124#if !defined(CONFIG_64BIT)
125 /* check for overflow on a 32bit kernel (every ~4 seconds). */
126 if (unlikely(next_tick < now))
127 this_cpu_inc(cr16_high_32_bits);
128#endif
129
130 /* Skip one clocktick on purpose if we missed next_tick. 113 /* Skip one clocktick on purpose if we missed next_tick.
131 * The new CR16 must be "later" than current CR16 otherwise 114 * The new CR16 must be "later" than current CR16 otherwise
132 * itimer would not fire until CR16 wrapped - e.g 4 seconds 115 * itimer would not fire until CR16 wrapped - e.g 4 seconds
@@ -208,7 +191,7 @@ EXPORT_SYMBOL(profile_pc);
208 191
209/* clock source code */ 192/* clock source code */
210 193
211static cycle_t read_cr16(struct clocksource *cs) 194static cycle_t notrace read_cr16(struct clocksource *cs)
212{ 195{
213 return get_cycles(); 196 return get_cycles();
214} 197}
@@ -287,26 +270,9 @@ void read_persistent_clock(struct timespec *ts)
287} 270}
288 271
289 272
290/* 273static u64 notrace read_cr16_sched_clock(void)
291 * sched_clock() framework
292 */
293
294static u32 cyc2ns_mul __read_mostly;
295static u32 cyc2ns_shift __read_mostly;
296
297u64 sched_clock(void)
298{ 274{
299 u64 now; 275 return get_cycles();
300
301 /* Get current cycle counter (Control Register 16). */
302#ifdef CONFIG_64BIT
303 now = mfctl(16);
304#else
305 now = mfctl(16) + (((u64) this_cpu_read(cr16_high_32_bits)) << 32);
306#endif
307
308 /* return the value in ns (cycles_2_ns) */
309 return mul_u64_u32_shr(now, cyc2ns_mul, cyc2ns_shift);
310} 276}
311 277
312 278
@@ -316,17 +282,16 @@ u64 sched_clock(void)
316 282
317void __init time_init(void) 283void __init time_init(void)
318{ 284{
319 unsigned long current_cr16_khz; 285 unsigned long cr16_hz;
320 286
321 current_cr16_khz = PAGE0->mem_10msec/10; /* kHz */
322 clocktick = (100 * PAGE0->mem_10msec) / HZ; 287 clocktick = (100 * PAGE0->mem_10msec) / HZ;
323
324 /* calculate mult/shift values for cr16 */
325 clocks_calc_mult_shift(&cyc2ns_mul, &cyc2ns_shift, current_cr16_khz,
326 NSEC_PER_MSEC, 0);
327
328 start_cpu_itimer(); /* get CPU 0 started */ 288 start_cpu_itimer(); /* get CPU 0 started */
329 289
290 cr16_hz = 100 * PAGE0->mem_10msec; /* Hz */
291
330 /* register at clocksource framework */ 292 /* register at clocksource framework */
331 clocksource_register_khz(&clocksource_cr16, current_cr16_khz); 293 clocksource_register_hz(&clocksource_cr16, cr16_hz);
294
295 /* register as sched_clock source */
296 sched_clock_register(read_cr16_sched_clock, BITS_PER_LONG, cr16_hz);
332} 297}
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index eae2dc8bc218..9d47f2efa830 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -100,7 +100,8 @@ src-wlib-y := string.S crt0.S crtsavres.S stdio.c decompress.c main.c \
100 ns16550.c serial.c simple_alloc.c div64.S util.S \ 100 ns16550.c serial.c simple_alloc.c div64.S util.S \
101 elf_util.c $(zlib-y) devtree.c stdlib.c \ 101 elf_util.c $(zlib-y) devtree.c stdlib.c \
102 oflib.c ofconsole.c cuboot.c mpsc.c cpm-serial.c \ 102 oflib.c ofconsole.c cuboot.c mpsc.c cpm-serial.c \
103 uartlite.c mpc52xx-psc.c opal.c opal-calls.S 103 uartlite.c mpc52xx-psc.c opal.c
104src-wlib-$(CONFIG_PPC64_BOOT_WRAPPER) += opal-calls.S
104src-wlib-$(CONFIG_40x) += 4xx.c planetcore.c 105src-wlib-$(CONFIG_40x) += 4xx.c planetcore.c
105src-wlib-$(CONFIG_44x) += 4xx.c ebony.c bamboo.c 106src-wlib-$(CONFIG_44x) += 4xx.c ebony.c bamboo.c
106src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c fsl-soc.c 107src-wlib-$(CONFIG_8xx) += mpc8xx.c planetcore.c fsl-soc.c
diff --git a/arch/powerpc/boot/main.c b/arch/powerpc/boot/main.c
index 57d42d129033..78aaf4ffd7ab 100644
--- a/arch/powerpc/boot/main.c
+++ b/arch/powerpc/boot/main.c
@@ -232,8 +232,12 @@ void start(void)
232 console_ops.close(); 232 console_ops.close();
233 233
234 kentry = (kernel_entry_t) vmlinux.addr; 234 kentry = (kernel_entry_t) vmlinux.addr;
235 if (ft_addr) 235 if (ft_addr) {
236 kentry(ft_addr, 0, NULL); 236 if(platform_ops.kentry)
237 platform_ops.kentry(ft_addr, vmlinux.addr);
238 else
239 kentry(ft_addr, 0, NULL);
240 }
237 else 241 else
238 kentry((unsigned long)initrd.addr, initrd.size, 242 kentry((unsigned long)initrd.addr, initrd.size,
239 loader_info.promptr); 243 loader_info.promptr);
diff --git a/arch/powerpc/boot/opal-calls.S b/arch/powerpc/boot/opal-calls.S
index ff2f1b97bc53..2a99fc9a3ccf 100644
--- a/arch/powerpc/boot/opal-calls.S
+++ b/arch/powerpc/boot/opal-calls.S
@@ -12,6 +12,19 @@
12 12
13 .text 13 .text
14 14
15 .globl opal_kentry
16opal_kentry:
17 /* r3 is the fdt ptr */
18 mtctr r4
19 li r4, 0
20 li r5, 0
21 li r6, 0
22 li r7, 0
23 ld r11,opal@got(r2)
24 ld r8,0(r11)
25 ld r9,8(r11)
26 bctr
27
15#define OPAL_CALL(name, token) \ 28#define OPAL_CALL(name, token) \
16 .globl name; \ 29 .globl name; \
17name: \ 30name: \
diff --git a/arch/powerpc/boot/opal.c b/arch/powerpc/boot/opal.c
index 1f37e1c1d6d8..0272570d02de 100644
--- a/arch/powerpc/boot/opal.c
+++ b/arch/powerpc/boot/opal.c
@@ -13,7 +13,7 @@
13#include <libfdt.h> 13#include <libfdt.h>
14#include "../include/asm/opal-api.h" 14#include "../include/asm/opal-api.h"
15 15
16#ifdef __powerpc64__ 16#ifdef CONFIG_PPC64_BOOT_WRAPPER
17 17
18/* Global OPAL struct used by opal-call.S */ 18/* Global OPAL struct used by opal-call.S */
19struct opal { 19struct opal {
@@ -23,14 +23,25 @@ struct opal {
23 23
24static u32 opal_con_id; 24static u32 opal_con_id;
25 25
26/* see opal-wrappers.S */
26int64_t opal_console_write(int64_t term_number, u64 *length, const u8 *buffer); 27int64_t opal_console_write(int64_t term_number, u64 *length, const u8 *buffer);
27int64_t opal_console_read(int64_t term_number, uint64_t *length, u8 *buffer); 28int64_t opal_console_read(int64_t term_number, uint64_t *length, u8 *buffer);
28int64_t opal_console_write_buffer_space(uint64_t term_number, uint64_t *length); 29int64_t opal_console_write_buffer_space(uint64_t term_number, uint64_t *length);
29int64_t opal_console_flush(uint64_t term_number); 30int64_t opal_console_flush(uint64_t term_number);
30int64_t opal_poll_events(uint64_t *outstanding_event_mask); 31int64_t opal_poll_events(uint64_t *outstanding_event_mask);
31 32
33void opal_kentry(unsigned long fdt_addr, void *vmlinux_addr);
34
32static int opal_con_open(void) 35static int opal_con_open(void)
33{ 36{
37 /*
38 * When OPAL loads the boot kernel it stashes the OPAL base and entry
39 * address in r8 and r9 so the kernel can use the OPAL console
40 * before unflattening the devicetree. While executing the wrapper will
41 * probably trash r8 and r9 so this kentry hook restores them before
42 * entering the decompressed kernel.
43 */
44 platform_ops.kentry = opal_kentry;
34 return 0; 45 return 0;
35} 46}
36 47
diff --git a/arch/powerpc/boot/ops.h b/arch/powerpc/boot/ops.h
index 309d1b127e96..fad1862f4b2d 100644
--- a/arch/powerpc/boot/ops.h
+++ b/arch/powerpc/boot/ops.h
@@ -30,6 +30,7 @@ struct platform_ops {
30 void * (*realloc)(void *ptr, unsigned long size); 30 void * (*realloc)(void *ptr, unsigned long size);
31 void (*exit)(void); 31 void (*exit)(void);
32 void * (*vmlinux_alloc)(unsigned long size); 32 void * (*vmlinux_alloc)(unsigned long size);
33 void (*kentry)(unsigned long fdt_addr, void *vmlinux_addr);
33}; 34};
34extern struct platform_ops platform_ops; 35extern struct platform_ops platform_ops;
35 36
diff --git a/arch/powerpc/include/asm/asm-prototypes.h b/arch/powerpc/include/asm/asm-prototypes.h
index d1492736d852..e0baba1535e6 100644
--- a/arch/powerpc/include/asm/asm-prototypes.h
+++ b/arch/powerpc/include/asm/asm-prototypes.h
@@ -14,6 +14,10 @@
14 14
15#include <linux/threads.h> 15#include <linux/threads.h>
16#include <linux/kprobes.h> 16#include <linux/kprobes.h>
17#include <asm/cacheflush.h>
18#include <asm/checksum.h>
19#include <asm/uaccess.h>
20#include <asm/epapr_hcalls.h>
17 21
18#include <uapi/asm/ucontext.h> 22#include <uapi/asm/ucontext.h>
19 23
@@ -109,4 +113,12 @@ void early_setup_secondary(void);
109/* time */ 113/* time */
110void accumulate_stolen_time(void); 114void accumulate_stolen_time(void);
111 115
116/* misc runtime */
117extern u64 __bswapdi2(u64);
118extern s64 __lshrdi3(s64, int);
119extern s64 __ashldi3(s64, int);
120extern s64 __ashrdi3(s64, int);
121extern int __cmpdi2(s64, s64);
122extern int __ucmpdi2(u64, u64);
123
112#endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */ 124#endif /* _ASM_POWERPC_ASM_PROTOTYPES_H */
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 84d49b197c32..9a3eee661297 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -91,7 +91,7 @@
91 */ 91 */
92#define LOAD_HANDLER(reg, label) \ 92#define LOAD_HANDLER(reg, label) \
93 ld reg,PACAKBASE(r13); /* get high part of &label */ \ 93 ld reg,PACAKBASE(r13); /* get high part of &label */ \
94 ori reg,reg,(FIXED_SYMBOL_ABS_ADDR(label))@l; 94 ori reg,reg,FIXED_SYMBOL_ABS_ADDR(label);
95 95
96#define __LOAD_HANDLER(reg, label) \ 96#define __LOAD_HANDLER(reg, label) \
97 ld reg,PACAKBASE(r13); \ 97 ld reg,PACAKBASE(r13); \
@@ -158,14 +158,17 @@ BEGIN_FTR_SECTION_NESTED(943) \
158 std ra,offset(r13); \ 158 std ra,offset(r13); \
159END_FTR_SECTION_NESTED(ftr,ftr,943) 159END_FTR_SECTION_NESTED(ftr,ftr,943)
160 160
161#define EXCEPTION_PROLOG_0(area) \ 161#define EXCEPTION_PROLOG_0_PACA(area) \
162 GET_PACA(r13); \
163 std r9,area+EX_R9(r13); /* save r9 */ \ 162 std r9,area+EX_R9(r13); /* save r9 */ \
164 OPT_GET_SPR(r9, SPRN_PPR, CPU_FTR_HAS_PPR); \ 163 OPT_GET_SPR(r9, SPRN_PPR, CPU_FTR_HAS_PPR); \
165 HMT_MEDIUM; \ 164 HMT_MEDIUM; \
166 std r10,area+EX_R10(r13); /* save r10 - r12 */ \ 165 std r10,area+EX_R10(r13); /* save r10 - r12 */ \
167 OPT_GET_SPR(r10, SPRN_CFAR, CPU_FTR_CFAR) 166 OPT_GET_SPR(r10, SPRN_CFAR, CPU_FTR_CFAR)
168 167
168#define EXCEPTION_PROLOG_0(area) \
169 GET_PACA(r13); \
170 EXCEPTION_PROLOG_0_PACA(area)
171
169#define __EXCEPTION_PROLOG_1(area, extra, vec) \ 172#define __EXCEPTION_PROLOG_1(area, extra, vec) \
170 OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \ 173 OPT_SAVE_REG_TO_PACA(area+EX_PPR, r9, CPU_FTR_HAS_PPR); \
171 OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \ 174 OPT_SAVE_REG_TO_PACA(area+EX_CFAR, r10, CPU_FTR_CFAR); \
@@ -196,6 +199,12 @@ END_FTR_SECTION_NESTED(ftr,ftr,943)
196 EXCEPTION_PROLOG_1(area, extra, vec); \ 199 EXCEPTION_PROLOG_1(area, extra, vec); \
197 EXCEPTION_PROLOG_PSERIES_1(label, h); 200 EXCEPTION_PROLOG_PSERIES_1(label, h);
198 201
202/* Have the PACA in r13 already */
203#define EXCEPTION_PROLOG_PSERIES_PACA(area, label, h, extra, vec) \
204 EXCEPTION_PROLOG_0_PACA(area); \
205 EXCEPTION_PROLOG_1(area, extra, vec); \
206 EXCEPTION_PROLOG_PSERIES_1(label, h);
207
199#define __KVMTEST(h, n) \ 208#define __KVMTEST(h, n) \
200 lbz r10,HSTATE_IN_GUEST(r13); \ 209 lbz r10,HSTATE_IN_GUEST(r13); \
201 cmpwi r10,0; \ 210 cmpwi r10,0; \
diff --git a/arch/powerpc/include/asm/mmu.h b/arch/powerpc/include/asm/mmu.h
index e88368354e49..e311c25751a4 100644
--- a/arch/powerpc/include/asm/mmu.h
+++ b/arch/powerpc/include/asm/mmu.h
@@ -29,6 +29,12 @@
29 */ 29 */
30 30
31/* 31/*
32 * Kernel read only support.
33 * We added the ppp value 0b110 in ISA 2.04.
34 */
35#define MMU_FTR_KERNEL_RO ASM_CONST(0x00004000)
36
37/*
32 * We need to clear top 16bits of va (from the remaining 64 bits )in 38 * We need to clear top 16bits of va (from the remaining 64 bits )in
33 * tlbie* instructions 39 * tlbie* instructions
34 */ 40 */
@@ -103,10 +109,10 @@
103#define MMU_FTRS_POWER4 MMU_FTRS_DEFAULT_HPTE_ARCH_V2 109#define MMU_FTRS_POWER4 MMU_FTRS_DEFAULT_HPTE_ARCH_V2
104#define MMU_FTRS_PPC970 MMU_FTRS_POWER4 | MMU_FTR_TLBIE_CROP_VA 110#define MMU_FTRS_PPC970 MMU_FTRS_POWER4 | MMU_FTR_TLBIE_CROP_VA
105#define MMU_FTRS_POWER5 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE 111#define MMU_FTRS_POWER5 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE
106#define MMU_FTRS_POWER6 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE 112#define MMU_FTRS_POWER6 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
107#define MMU_FTRS_POWER7 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE 113#define MMU_FTRS_POWER7 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
108#define MMU_FTRS_POWER8 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE 114#define MMU_FTRS_POWER8 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
109#define MMU_FTRS_POWER9 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE 115#define MMU_FTRS_POWER9 MMU_FTRS_POWER4 | MMU_FTR_LOCKLESS_TLBIE | MMU_FTR_KERNEL_RO
110#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 116#define MMU_FTRS_CELL MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
111 MMU_FTR_CI_LARGE_PAGE 117 MMU_FTR_CI_LARGE_PAGE
112#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \ 118#define MMU_FTRS_PA6T MMU_FTRS_DEFAULT_HPTE_ARCH_V2 | \
diff --git a/arch/powerpc/include/asm/ppc-opcode.h b/arch/powerpc/include/asm/ppc-opcode.h
index 0132831b3081..c56ea8c84abb 100644
--- a/arch/powerpc/include/asm/ppc-opcode.h
+++ b/arch/powerpc/include/asm/ppc-opcode.h
@@ -460,5 +460,6 @@
460 460
461#define PPC_SLBIA(IH) stringify_in_c(.long PPC_INST_SLBIA | \ 461#define PPC_SLBIA(IH) stringify_in_c(.long PPC_INST_SLBIA | \
462 ((IH & 0x7) << 21)) 462 ((IH & 0x7) << 21))
463#define PPC_INVALIDATE_ERAT PPC_SLBIA(7)
463 464
464#endif /* _ASM_POWERPC_PPC_OPCODE_H */ 465#endif /* _ASM_POWERPC_PPC_OPCODE_H */
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 9cd4e8cbc78c..9e1499f98def 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -355,6 +355,7 @@
355#define LPCR_PECE0 ASM_CONST(0x0000000000004000) /* ext. exceptions can cause exit */ 355#define LPCR_PECE0 ASM_CONST(0x0000000000004000) /* ext. exceptions can cause exit */
356#define LPCR_PECE1 ASM_CONST(0x0000000000002000) /* decrementer can cause exit */ 356#define LPCR_PECE1 ASM_CONST(0x0000000000002000) /* decrementer can cause exit */
357#define LPCR_PECE2 ASM_CONST(0x0000000000001000) /* machine check etc can cause exit */ 357#define LPCR_PECE2 ASM_CONST(0x0000000000001000) /* machine check etc can cause exit */
358#define LPCR_PECE_HVEE ASM_CONST(0x0000400000000000) /* P9 Wakeup on HV interrupts */
358#define LPCR_MER ASM_CONST(0x0000000000000800) /* Mediated External Exception */ 359#define LPCR_MER ASM_CONST(0x0000000000000800) /* Mediated External Exception */
359#define LPCR_MER_SH 11 360#define LPCR_MER_SH 11
360#define LPCR_TC ASM_CONST(0x0000000000000200) /* Translation control */ 361#define LPCR_TC ASM_CONST(0x0000000000000200) /* Translation control */
diff --git a/arch/powerpc/kernel/cpu_setup_power.S b/arch/powerpc/kernel/cpu_setup_power.S
index 52ff3f025437..37c027ca83b2 100644
--- a/arch/powerpc/kernel/cpu_setup_power.S
+++ b/arch/powerpc/kernel/cpu_setup_power.S
@@ -98,8 +98,8 @@ _GLOBAL(__setup_cpu_power9)
98 li r0,0 98 li r0,0
99 mtspr SPRN_LPID,r0 99 mtspr SPRN_LPID,r0
100 mfspr r3,SPRN_LPCR 100 mfspr r3,SPRN_LPCR
101 ori r3, r3, LPCR_PECEDH 101 LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
102 ori r3, r3, LPCR_HVICE 102 or r3, r3, r4
103 bl __init_LPCR 103 bl __init_LPCR
104 bl __init_HFSCR 104 bl __init_HFSCR
105 bl __init_tlb_power9 105 bl __init_tlb_power9
@@ -118,8 +118,8 @@ _GLOBAL(__restore_cpu_power9)
118 li r0,0 118 li r0,0
119 mtspr SPRN_LPID,r0 119 mtspr SPRN_LPID,r0
120 mfspr r3,SPRN_LPCR 120 mfspr r3,SPRN_LPCR
121 ori r3, r3, LPCR_PECEDH 121 LOAD_REG_IMMEDIATE(r4, LPCR_PECEDH | LPCR_PECE_HVEE | LPCR_HVICE)
122 ori r3, r3, LPCR_HVICE 122 or r3, r3, r4
123 bl __init_LPCR 123 bl __init_LPCR
124 bl __init_HFSCR 124 bl __init_HFSCR
125 bl __init_tlb_power9 125 bl __init_tlb_power9
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c
index a62be72da274..5c31369435f2 100644
--- a/arch/powerpc/kernel/eeh_driver.c
+++ b/arch/powerpc/kernel/eeh_driver.c
@@ -671,8 +671,10 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus,
671 671
672 /* Clear frozen state */ 672 /* Clear frozen state */
673 rc = eeh_clear_pe_frozen_state(pe, false); 673 rc = eeh_clear_pe_frozen_state(pe, false);
674 if (rc) 674 if (rc) {
675 pci_unlock_rescan_remove();
675 return rc; 676 return rc;
677 }
676 678
677 /* Give the system 5 seconds to finish running the user-space 679 /* Give the system 5 seconds to finish running the user-space
678 * hotplug shutdown scripts, e.g. ifdown for ethernet. Yes, 680 * hotplug shutdown scripts, e.g. ifdown for ethernet. Yes,
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 08ba447a4b3d..1ba82ea90230 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -116,7 +116,9 @@ EXC_VIRT_NONE(0x4000, 0x4100)
116 116
117EXC_REAL_BEGIN(system_reset, 0x100, 0x200) 117EXC_REAL_BEGIN(system_reset, 0x100, 0x200)
118 SET_SCRATCH0(r13) 118 SET_SCRATCH0(r13)
119 EXCEPTION_PROLOG_PSERIES(PACA_EXGEN, system_reset_common, EXC_STD, 119 GET_PACA(r13)
120 clrrdi r13,r13,1 /* Last bit of HSPRG0 is set if waking from winkle */
121 EXCEPTION_PROLOG_PSERIES_PACA(PACA_EXGEN, system_reset_common, EXC_STD,
120 IDLETEST, 0x100) 122 IDLETEST, 0x100)
121 123
122EXC_REAL_END(system_reset, 0x100, 0x200) 124EXC_REAL_END(system_reset, 0x100, 0x200)
@@ -124,6 +126,9 @@ EXC_VIRT_NONE(0x4100, 0x4200)
124 126
125#ifdef CONFIG_PPC_P7_NAP 127#ifdef CONFIG_PPC_P7_NAP
126EXC_COMMON_BEGIN(system_reset_idle_common) 128EXC_COMMON_BEGIN(system_reset_idle_common)
129BEGIN_FTR_SECTION
130 GET_PACA(r13) /* Restore HSPRG0 to get the winkle bit in r13 */
131END_FTR_SECTION_IFCLR(CPU_FTR_ARCH_300)
127 bl pnv_restore_hyp_resource 132 bl pnv_restore_hyp_resource
128 133
129 li r0,PNV_THREAD_RUNNING 134 li r0,PNV_THREAD_RUNNING
@@ -169,7 +174,7 @@ EXC_REAL_BEGIN(machine_check, 0x200, 0x300)
169 SET_SCRATCH0(r13) /* save r13 */ 174 SET_SCRATCH0(r13) /* save r13 */
170 /* 175 /*
171 * Running native on arch 2.06 or later, we may wakeup from winkle 176 * Running native on arch 2.06 or later, we may wakeup from winkle
172 * inside machine check. If yes, then last bit of HSPGR0 would be set 177 * inside machine check. If yes, then last bit of HSPRG0 would be set
173 * to 1. Hence clear it unconditionally. 178 * to 1. Hence clear it unconditionally.
174 */ 179 */
175 GET_PACA(r13) 180 GET_PACA(r13)
@@ -388,7 +393,7 @@ EXC_COMMON_BEGIN(machine_check_handle_early)
388 /* 393 /*
389 * Go back to winkle. Please note that this thread was woken up in 394 * Go back to winkle. Please note that this thread was woken up in
390 * machine check from winkle and have not restored the per-subcore 395 * machine check from winkle and have not restored the per-subcore
391 * state. Hence before going back to winkle, set last bit of HSPGR0 396 * state. Hence before going back to winkle, set last bit of HSPRG0
392 * to 1. This will make sure that if this thread gets woken up 397 * to 1. This will make sure that if this thread gets woken up
393 * again at reset vector 0x100 then it will get chance to restore 398 * again at reset vector 0x100 then it will get chance to restore
394 * the subcore state. 399 * the subcore state.
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c
index ce6dc61b15b2..49a680d5ae37 100644
--- a/arch/powerpc/kernel/process.c
+++ b/arch/powerpc/kernel/process.c
@@ -1215,7 +1215,7 @@ static void show_instructions(struct pt_regs *regs)
1215 int instr; 1215 int instr;
1216 1216
1217 if (!(i % 8)) 1217 if (!(i % 8))
1218 printk("\n"); 1218 pr_cont("\n");
1219 1219
1220#if !defined(CONFIG_BOOKE) 1220#if !defined(CONFIG_BOOKE)
1221 /* If executing with the IMMU off, adjust pc rather 1221 /* If executing with the IMMU off, adjust pc rather
@@ -1227,18 +1227,18 @@ static void show_instructions(struct pt_regs *regs)
1227 1227
1228 if (!__kernel_text_address(pc) || 1228 if (!__kernel_text_address(pc) ||
1229 probe_kernel_address((unsigned int __user *)pc, instr)) { 1229 probe_kernel_address((unsigned int __user *)pc, instr)) {
1230 printk(KERN_CONT "XXXXXXXX "); 1230 pr_cont("XXXXXXXX ");
1231 } else { 1231 } else {
1232 if (regs->nip == pc) 1232 if (regs->nip == pc)
1233 printk(KERN_CONT "<%08x> ", instr); 1233 pr_cont("<%08x> ", instr);
1234 else 1234 else
1235 printk(KERN_CONT "%08x ", instr); 1235 pr_cont("%08x ", instr);
1236 } 1236 }
1237 1237
1238 pc += sizeof(int); 1238 pc += sizeof(int);
1239 } 1239 }
1240 1240
1241 printk("\n"); 1241 pr_cont("\n");
1242} 1242}
1243 1243
1244struct regbit { 1244struct regbit {
@@ -1282,7 +1282,7 @@ static void print_bits(unsigned long val, struct regbit *bits, const char *sep)
1282 1282
1283 for (; bits->bit; ++bits) 1283 for (; bits->bit; ++bits)
1284 if (val & bits->bit) { 1284 if (val & bits->bit) {
1285 printk("%s%s", s, bits->name); 1285 pr_cont("%s%s", s, bits->name);
1286 s = sep; 1286 s = sep;
1287 } 1287 }
1288} 1288}
@@ -1305,9 +1305,9 @@ static void print_tm_bits(unsigned long val)
1305 * T: Transactional (bit 34) 1305 * T: Transactional (bit 34)
1306 */ 1306 */
1307 if (val & (MSR_TM | MSR_TS_S | MSR_TS_T)) { 1307 if (val & (MSR_TM | MSR_TS_S | MSR_TS_T)) {
1308 printk(",TM["); 1308 pr_cont(",TM[");
1309 print_bits(val, msr_tm_bits, ""); 1309 print_bits(val, msr_tm_bits, "");
1310 printk("]"); 1310 pr_cont("]");
1311 } 1311 }
1312} 1312}
1313#else 1313#else
@@ -1316,10 +1316,10 @@ static void print_tm_bits(unsigned long val) {}
1316 1316
1317static void print_msr_bits(unsigned long val) 1317static void print_msr_bits(unsigned long val)
1318{ 1318{
1319 printk("<"); 1319 pr_cont("<");
1320 print_bits(val, msr_bits, ","); 1320 print_bits(val, msr_bits, ",");
1321 print_tm_bits(val); 1321 print_tm_bits(val);
1322 printk(">"); 1322 pr_cont(">");
1323} 1323}
1324 1324
1325#ifdef CONFIG_PPC64 1325#ifdef CONFIG_PPC64
@@ -1347,29 +1347,29 @@ void show_regs(struct pt_regs * regs)
1347 printk(" CR: %08lx XER: %08lx\n", regs->ccr, regs->xer); 1347 printk(" CR: %08lx XER: %08lx\n", regs->ccr, regs->xer);
1348 trap = TRAP(regs); 1348 trap = TRAP(regs);
1349 if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR)) 1349 if ((regs->trap != 0xc00) && cpu_has_feature(CPU_FTR_CFAR))
1350 printk("CFAR: "REG" ", regs->orig_gpr3); 1350 pr_cont("CFAR: "REG" ", regs->orig_gpr3);
1351 if (trap == 0x200 || trap == 0x300 || trap == 0x600) 1351 if (trap == 0x200 || trap == 0x300 || trap == 0x600)
1352#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE) 1352#if defined(CONFIG_4xx) || defined(CONFIG_BOOKE)
1353 printk("DEAR: "REG" ESR: "REG" ", regs->dar, regs->dsisr); 1353 pr_cont("DEAR: "REG" ESR: "REG" ", regs->dar, regs->dsisr);
1354#else 1354#else
1355 printk("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr); 1355 pr_cont("DAR: "REG" DSISR: %08lx ", regs->dar, regs->dsisr);
1356#endif 1356#endif
1357#ifdef CONFIG_PPC64 1357#ifdef CONFIG_PPC64
1358 printk("SOFTE: %ld ", regs->softe); 1358 pr_cont("SOFTE: %ld ", regs->softe);
1359#endif 1359#endif
1360#ifdef CONFIG_PPC_TRANSACTIONAL_MEM 1360#ifdef CONFIG_PPC_TRANSACTIONAL_MEM
1361 if (MSR_TM_ACTIVE(regs->msr)) 1361 if (MSR_TM_ACTIVE(regs->msr))
1362 printk("\nPACATMSCRATCH: %016llx ", get_paca()->tm_scratch); 1362 pr_cont("\nPACATMSCRATCH: %016llx ", get_paca()->tm_scratch);
1363#endif 1363#endif
1364 1364
1365 for (i = 0; i < 32; i++) { 1365 for (i = 0; i < 32; i++) {
1366 if ((i % REGS_PER_LINE) == 0) 1366 if ((i % REGS_PER_LINE) == 0)
1367 printk("\nGPR%02d: ", i); 1367 pr_cont("\nGPR%02d: ", i);
1368 printk(REG " ", regs->gpr[i]); 1368 pr_cont(REG " ", regs->gpr[i]);
1369 if (i == LAST_VOLATILE && !FULL_REGS(regs)) 1369 if (i == LAST_VOLATILE && !FULL_REGS(regs))
1370 break; 1370 break;
1371 } 1371 }
1372 printk("\n"); 1372 pr_cont("\n");
1373#ifdef CONFIG_KALLSYMS 1373#ifdef CONFIG_KALLSYMS
1374 /* 1374 /*
1375 * Lookup NIP late so we have the best change of getting the 1375 * Lookup NIP late so we have the best change of getting the
@@ -1900,14 +1900,14 @@ void show_stack(struct task_struct *tsk, unsigned long *stack)
1900 printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip); 1900 printk("["REG"] ["REG"] %pS", sp, ip, (void *)ip);
1901#ifdef CONFIG_FUNCTION_GRAPH_TRACER 1901#ifdef CONFIG_FUNCTION_GRAPH_TRACER
1902 if ((ip == rth) && curr_frame >= 0) { 1902 if ((ip == rth) && curr_frame >= 0) {
1903 printk(" (%pS)", 1903 pr_cont(" (%pS)",
1904 (void *)current->ret_stack[curr_frame].ret); 1904 (void *)current->ret_stack[curr_frame].ret);
1905 curr_frame--; 1905 curr_frame--;
1906 } 1906 }
1907#endif 1907#endif
1908 if (firstframe) 1908 if (firstframe)
1909 printk(" (unreliable)"); 1909 pr_cont(" (unreliable)");
1910 printk("\n"); 1910 pr_cont("\n");
1911 } 1911 }
1912 firstframe = 0; 1912 firstframe = 0;
1913 1913
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c
index 7ac8e6eaab5b..8d586cff8a41 100644
--- a/arch/powerpc/kernel/setup_64.c
+++ b/arch/powerpc/kernel/setup_64.c
@@ -226,17 +226,25 @@ static void __init configure_exceptions(void)
226 if (firmware_has_feature(FW_FEATURE_OPAL)) 226 if (firmware_has_feature(FW_FEATURE_OPAL))
227 opal_configure_cores(); 227 opal_configure_cores();
228 228
229 /* Enable AIL if supported, and we are in hypervisor mode */ 229 /* AIL on native is done in cpu_ready_for_interrupts() */
230 if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
231 early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
232 unsigned long lpcr = mfspr(SPRN_LPCR);
233 mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
234 }
235 } 230 }
236} 231}
237 232
238static void cpu_ready_for_interrupts(void) 233static void cpu_ready_for_interrupts(void)
239{ 234{
235 /*
236 * Enable AIL if supported, and we are in hypervisor mode. This
237 * is called once for every processor.
238 *
239 * If we are not in hypervisor mode the job is done once for
240 * the whole partition in configure_exceptions().
241 */
242 if (early_cpu_has_feature(CPU_FTR_HVMODE) &&
243 early_cpu_has_feature(CPU_FTR_ARCH_207S)) {
244 unsigned long lpcr = mfspr(SPRN_LPCR);
245 mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
246 }
247
240 /* Set IR and DR in PACA MSR */ 248 /* Set IR and DR in PACA MSR */
241 get_paca()->kernel_msr = MSR_KERNEL; 249 get_paca()->kernel_msr = MSR_KERNEL;
242} 250}
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S
index 8295f51c1a5f..7394b770ae1f 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -94,8 +94,17 @@ SECTIONS
94 * detected, and will result in a crash at boot due to offsets being 94 * detected, and will result in a crash at boot due to offsets being
95 * wrong. 95 * wrong.
96 */ 96 */
97#ifdef CONFIG_PPC64
98 /*
99 * BLOCK(0) overrides the default output section alignment because
100 * this needs to start right after .head.text in order for fixed
101 * section placement to work.
102 */
103 .text BLOCK(0) : AT(ADDR(.text) - LOAD_OFFSET) {
104#else
97 .text : AT(ADDR(.text) - LOAD_OFFSET) { 105 .text : AT(ADDR(.text) - LOAD_OFFSET) {
98 ALIGN_FUNCTION(); 106 ALIGN_FUNCTION();
107#endif
99 /* careful! __ftr_alt_* sections need to be close to .text */ 108 /* careful! __ftr_alt_* sections need to be close to .text */
100 *(.text .fixup __ftr_alt_* .ref.text) 109 *(.text .fixup __ftr_alt_* .ref.text)
101 SCHED_TEXT 110 SCHED_TEXT
diff --git a/arch/powerpc/mm/hash64_4k.c b/arch/powerpc/mm/hash64_4k.c
index 42c702b3be1f..6fa450c12d6d 100644
--- a/arch/powerpc/mm/hash64_4k.c
+++ b/arch/powerpc/mm/hash64_4k.c
@@ -55,7 +55,7 @@ int __hash_page_4K(unsigned long ea, unsigned long access, unsigned long vsid,
55 */ 55 */
56 rflags = htab_convert_pte_flags(new_pte); 56 rflags = htab_convert_pte_flags(new_pte);
57 57
58 if (!cpu_has_feature(CPU_FTR_NOEXECUTE) && 58 if (cpu_has_feature(CPU_FTR_NOEXECUTE) &&
59 !cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) 59 !cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
60 rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap); 60 rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap);
61 61
diff --git a/arch/powerpc/mm/hash64_64k.c b/arch/powerpc/mm/hash64_64k.c
index 3bbbea07378c..1a68cb19b0e3 100644
--- a/arch/powerpc/mm/hash64_64k.c
+++ b/arch/powerpc/mm/hash64_64k.c
@@ -87,7 +87,7 @@ int __hash_page_4K(unsigned long ea, unsigned long access, unsigned long vsid,
87 subpg_pte = new_pte & ~subpg_prot; 87 subpg_pte = new_pte & ~subpg_prot;
88 rflags = htab_convert_pte_flags(subpg_pte); 88 rflags = htab_convert_pte_flags(subpg_pte);
89 89
90 if (!cpu_has_feature(CPU_FTR_NOEXECUTE) && 90 if (cpu_has_feature(CPU_FTR_NOEXECUTE) &&
91 !cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) { 91 !cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) {
92 92
93 /* 93 /*
@@ -258,7 +258,7 @@ int __hash_page_64K(unsigned long ea, unsigned long access,
258 258
259 rflags = htab_convert_pte_flags(new_pte); 259 rflags = htab_convert_pte_flags(new_pte);
260 260
261 if (!cpu_has_feature(CPU_FTR_NOEXECUTE) && 261 if (cpu_has_feature(CPU_FTR_NOEXECUTE) &&
262 !cpu_has_feature(CPU_FTR_COHERENT_ICACHE)) 262 !cpu_has_feature(CPU_FTR_COHERENT_ICACHE))
263 rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap); 263 rflags = hash_page_do_lazy_icache(rflags, __pte(old_pte), trap);
264 264
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 44d3c3a38e3e..78dabf065ba9 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -193,8 +193,12 @@ unsigned long htab_convert_pte_flags(unsigned long pteflags)
193 /* 193 /*
194 * Kernel read only mapped with ppp bits 0b110 194 * Kernel read only mapped with ppp bits 0b110
195 */ 195 */
196 if (!(pteflags & _PAGE_WRITE)) 196 if (!(pteflags & _PAGE_WRITE)) {
197 rflags |= (HPTE_R_PP0 | 0x2); 197 if (mmu_has_feature(MMU_FTR_KERNEL_RO))
198 rflags |= (HPTE_R_PP0 | 0x2);
199 else
200 rflags |= 0x3;
201 }
198 } else { 202 } else {
199 if (pteflags & _PAGE_RWX) 203 if (pteflags & _PAGE_RWX)
200 rflags |= 0x2; 204 rflags |= 0x2;
@@ -1029,6 +1033,10 @@ void hash__early_init_mmu_secondary(void)
1029{ 1033{
1030 /* Initialize hash table for that CPU */ 1034 /* Initialize hash table for that CPU */
1031 if (!firmware_has_feature(FW_FEATURE_LPAR)) { 1035 if (!firmware_has_feature(FW_FEATURE_LPAR)) {
1036
1037 if (cpu_has_feature(CPU_FTR_POWER9_DD1))
1038 update_hid_for_hash();
1039
1032 if (!cpu_has_feature(CPU_FTR_ARCH_300)) 1040 if (!cpu_has_feature(CPU_FTR_ARCH_300))
1033 mtspr(SPRN_SDR1, _SDR1); 1041 mtspr(SPRN_SDR1, _SDR1);
1034 else 1042 else
diff --git a/arch/powerpc/mm/pgtable-radix.c b/arch/powerpc/mm/pgtable-radix.c
index ed7bddc456b7..688b54517655 100644
--- a/arch/powerpc/mm/pgtable-radix.c
+++ b/arch/powerpc/mm/pgtable-radix.c
@@ -388,6 +388,10 @@ void radix__early_init_mmu_secondary(void)
388 * update partition table control register and UPRT 388 * update partition table control register and UPRT
389 */ 389 */
390 if (!firmware_has_feature(FW_FEATURE_LPAR)) { 390 if (!firmware_has_feature(FW_FEATURE_LPAR)) {
391
392 if (cpu_has_feature(CPU_FTR_POWER9_DD1))
393 update_hid_for_radix();
394
391 lpcr = mfspr(SPRN_LPCR); 395 lpcr = mfspr(SPRN_LPCR);
392 mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR); 396 mtspr(SPRN_LPCR, lpcr | LPCR_UPRT | LPCR_HR);
393 397
diff --git a/arch/powerpc/mm/tlb-radix.c b/arch/powerpc/mm/tlb-radix.c
index bda8c43be78a..3493cf4e0452 100644
--- a/arch/powerpc/mm/tlb-radix.c
+++ b/arch/powerpc/mm/tlb-radix.c
@@ -50,6 +50,8 @@ static inline void _tlbiel_pid(unsigned long pid, unsigned long ric)
50 for (set = 0; set < POWER9_TLB_SETS_RADIX ; set++) { 50 for (set = 0; set < POWER9_TLB_SETS_RADIX ; set++) {
51 __tlbiel_pid(pid, set, ric); 51 __tlbiel_pid(pid, set, ric);
52 } 52 }
53 if (cpu_has_feature(CPU_FTR_POWER9_DD1))
54 asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
53 return; 55 return;
54} 56}
55 57
@@ -83,6 +85,8 @@ static inline void _tlbiel_va(unsigned long va, unsigned long pid,
83 asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1) 85 asm volatile(PPC_TLBIEL(%0, %4, %3, %2, %1)
84 : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory"); 86 : : "r"(rb), "i"(r), "i"(prs), "i"(ric), "r"(rs) : "memory");
85 asm volatile("ptesync": : :"memory"); 87 asm volatile("ptesync": : :"memory");
88 if (cpu_has_feature(CPU_FTR_POWER9_DD1))
89 asm volatile(PPC_INVALIDATE_ERAT : : :"memory");
86} 90}
87 91
88static inline void _tlbie_va(unsigned long va, unsigned long pid, 92static inline void _tlbie_va(unsigned long va, unsigned long pid,
diff --git a/arch/s390/hypfs/hypfs_diag.c b/arch/s390/hypfs/hypfs_diag.c
index 28f03ca60100..794bebb43d23 100644
--- a/arch/s390/hypfs/hypfs_diag.c
+++ b/arch/s390/hypfs/hypfs_diag.c
@@ -363,11 +363,11 @@ out:
363static int diag224_get_name_table(void) 363static int diag224_get_name_table(void)
364{ 364{
365 /* memory must be below 2GB */ 365 /* memory must be below 2GB */
366 diag224_cpu_names = kmalloc(PAGE_SIZE, GFP_KERNEL | GFP_DMA); 366 diag224_cpu_names = (char *) __get_free_page(GFP_KERNEL | GFP_DMA);
367 if (!diag224_cpu_names) 367 if (!diag224_cpu_names)
368 return -ENOMEM; 368 return -ENOMEM;
369 if (diag224(diag224_cpu_names)) { 369 if (diag224(diag224_cpu_names)) {
370 kfree(diag224_cpu_names); 370 free_page((unsigned long) diag224_cpu_names);
371 return -EOPNOTSUPP; 371 return -EOPNOTSUPP;
372 } 372 }
373 EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16); 373 EBCASC(diag224_cpu_names + 16, (*diag224_cpu_names + 1) * 16);
@@ -376,7 +376,7 @@ static int diag224_get_name_table(void)
376 376
377static void diag224_delete_name_table(void) 377static void diag224_delete_name_table(void)
378{ 378{
379 kfree(diag224_cpu_names); 379 free_page((unsigned long) diag224_cpu_names);
380} 380}
381 381
382static int diag224_idx2name(int index, char *name) 382static int diag224_idx2name(int index, char *name)
diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S
index 000e6e91f6a0..3667d20e997f 100644
--- a/arch/s390/kernel/vmlinux.lds.S
+++ b/arch/s390/kernel/vmlinux.lds.S
@@ -62,9 +62,11 @@ SECTIONS
62 62
63 . = ALIGN(PAGE_SIZE); 63 . = ALIGN(PAGE_SIZE);
64 __start_ro_after_init = .; 64 __start_ro_after_init = .;
65 __start_data_ro_after_init = .;
65 .data..ro_after_init : { 66 .data..ro_after_init : {
66 *(.data..ro_after_init) 67 *(.data..ro_after_init)
67 } 68 }
69 __end_data_ro_after_init = .;
68 EXCEPTION_TABLE(16) 70 EXCEPTION_TABLE(16)
69 . = ALIGN(PAGE_SIZE); 71 . = ALIGN(PAGE_SIZE);
70 __end_ro_after_init = .; 72 __end_ro_after_init = .;
diff --git a/arch/s390/pci/pci_dma.c b/arch/s390/pci/pci_dma.c
index 7350c8bc13a2..6b2f72f523b9 100644
--- a/arch/s390/pci/pci_dma.c
+++ b/arch/s390/pci/pci_dma.c
@@ -423,7 +423,7 @@ static int __s390_dma_map_sg(struct device *dev, struct scatterlist *sg,
423 dma_addr_t dma_addr_base, dma_addr; 423 dma_addr_t dma_addr_base, dma_addr;
424 int flags = ZPCI_PTE_VALID; 424 int flags = ZPCI_PTE_VALID;
425 struct scatterlist *s; 425 struct scatterlist *s;
426 unsigned long pa; 426 unsigned long pa = 0;
427 int ret; 427 int ret;
428 428
429 size = PAGE_ALIGN(size); 429 size = PAGE_ALIGN(size);
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index b23c76b42d6e..165ecdd24d22 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -43,6 +43,7 @@ config SPARC
43 select ARCH_HAS_SG_CHAIN 43 select ARCH_HAS_SG_CHAIN
44 select CPU_NO_EFFICIENT_FFS 44 select CPU_NO_EFFICIENT_FFS
45 select HAVE_ARCH_HARDENED_USERCOPY 45 select HAVE_ARCH_HARDENED_USERCOPY
46 select PROVE_LOCKING_SMALL if PROVE_LOCKING
46 47
47config SPARC32 48config SPARC32
48 def_bool !64BIT 49 def_bool !64BIT
@@ -89,6 +90,14 @@ config ARCH_DEFCONFIG
89config ARCH_PROC_KCORE_TEXT 90config ARCH_PROC_KCORE_TEXT
90 def_bool y 91 def_bool y
91 92
93config ARCH_ATU
94 bool
95 default y if SPARC64
96
97config ARCH_DMA_ADDR_T_64BIT
98 bool
99 default y if ARCH_ATU
100
92config IOMMU_HELPER 101config IOMMU_HELPER
93 bool 102 bool
94 default y if SPARC64 103 default y if SPARC64
@@ -304,6 +313,20 @@ config ARCH_SPARSEMEM_ENABLE
304config ARCH_SPARSEMEM_DEFAULT 313config ARCH_SPARSEMEM_DEFAULT
305 def_bool y if SPARC64 314 def_bool y if SPARC64
306 315
316config FORCE_MAX_ZONEORDER
317 int "Maximum zone order"
318 default "13"
319 help
320 The kernel memory allocator divides physically contiguous memory
321 blocks into "zones", where each zone is a power of two number of
322 pages. This option selects the largest power of two that the kernel
323 keeps in the memory allocator. If you need to allocate very large
324 blocks of physically contiguous memory, then you may need to
325 increase this value.
326
327 This config option is actually maximum order plus one. For example,
328 a value of 13 means that the largest free memory block is 2^12 pages.
329
307source "mm/Kconfig" 330source "mm/Kconfig"
308 331
309if SPARC64 332if SPARC64
diff --git a/arch/sparc/include/asm/hypervisor.h b/arch/sparc/include/asm/hypervisor.h
index 666d5ba230d2..73cb8978df58 100644
--- a/arch/sparc/include/asm/hypervisor.h
+++ b/arch/sparc/include/asm/hypervisor.h
@@ -2335,6 +2335,348 @@ unsigned long sun4v_vintr_set_target(unsigned long dev_handle,
2335 */ 2335 */
2336#define HV_FAST_PCI_MSG_SETVALID 0xd3 2336#define HV_FAST_PCI_MSG_SETVALID 0xd3
2337 2337
2338/* PCI IOMMU v2 definitions and services
2339 *
2340 * While the PCI IO definitions above is valid IOMMU v2 adds new PCI IO
2341 * definitions and services.
2342 *
2343 * CTE Clump Table Entry. First level table entry in the ATU.
2344 *
2345 * pci_device_list
2346 * A 32-bit aligned list of pci_devices.
2347 *
2348 * pci_device_listp
2349 * real address of a pci_device_list. 32-bit aligned.
2350 *
2351 * iotte IOMMU translation table entry.
2352 *
2353 * iotte_attributes
2354 * IO Attributes for IOMMU v2 mappings. In addition to
2355 * read, write IOMMU v2 supports relax ordering
2356 *
2357 * io_page_list A 64-bit aligned list of real addresses. Each real
2358 * address in an io_page_list must be properly aligned
2359 * to the pagesize of the given IOTSB.
2360 *
2361 * io_page_list_p Real address of an io_page_list, 64-bit aligned.
2362 *
2363 * IOTSB IO Translation Storage Buffer. An aligned table of
2364 * IOTTEs. Each IOTSB has a pagesize, table size, and
2365 * virtual address associated with it that must match
2366 * a pagesize and table size supported by the un-derlying
2367 * hardware implementation. The alignment requirements
2368 * for an IOTSB depend on the pagesize used for that IOTSB.
2369 * Each IOTTE in an IOTSB maps one pagesize-sized page.
2370 * The size of the IOTSB dictates how large of a virtual
2371 * address space the IOTSB is capable of mapping.
2372 *
2373 * iotsb_handle An opaque identifier for an IOTSB. A devhandle plus
2374 * iotsb_handle represents a binding of an IOTSB to a
2375 * PCI root complex.
2376 *
2377 * iotsb_index Zero-based IOTTE number within an IOTSB.
2378 */
2379
2380/* The index_count argument consists of two fields:
2381 * bits 63:48 #iottes and bits 47:0 iotsb_index
2382 */
2383#define HV_PCI_IOTSB_INDEX_COUNT(__iottes, __iotsb_index) \
2384 (((u64)(__iottes) << 48UL) | ((u64)(__iotsb_index)))
2385
2386/* pci_iotsb_conf()
2387 * TRAP: HV_FAST_TRAP
2388 * FUNCTION: HV_FAST_PCI_IOTSB_CONF
2389 * ARG0: devhandle
2390 * ARG1: r_addr
2391 * ARG2: size
2392 * ARG3: pagesize
2393 * ARG4: iova
2394 * RET0: status
2395 * RET1: iotsb_handle
2396 * ERRORS: EINVAL Invalid devhandle, size, iova, or pagesize
2397 * EBADALIGN r_addr is not properly aligned
2398 * ENORADDR r_addr is not a valid real address
2399 * ETOOMANY No further IOTSBs may be configured
2400 * EBUSY Duplicate devhandle, raddir, iova combination
2401 *
2402 * Create an IOTSB suitable for the PCI root complex identified by devhandle,
2403 * for the DMA virtual address defined by the argument iova.
2404 *
2405 * r_addr is the properly aligned base address of the IOTSB and size is the
2406 * IOTSB (table) size in bytes.The IOTSB is required to be zeroed prior to
2407 * being configured. If it contains any values other than zeros then the
2408 * behavior is undefined.
2409 *
2410 * pagesize is the size of each page in the IOTSB. Note that the combination of
2411 * size (table size) and pagesize must be valid.
2412 *
2413 * virt is the DMA virtual address this IOTSB will map.
2414 *
2415 * If successful, the opaque 64-bit handle iotsb_handle is returned in ret1.
2416 * Once configured, privileged access to the IOTSB memory is prohibited and
2417 * creates undefined behavior. The only permitted access is indirect via these
2418 * services.
2419 */
2420#define HV_FAST_PCI_IOTSB_CONF 0x190
2421
2422/* pci_iotsb_info()
2423 * TRAP: HV_FAST_TRAP
2424 * FUNCTION: HV_FAST_PCI_IOTSB_INFO
2425 * ARG0: devhandle
2426 * ARG1: iotsb_handle
2427 * RET0: status
2428 * RET1: r_addr
2429 * RET2: size
2430 * RET3: pagesize
2431 * RET4: iova
2432 * RET5: #bound
2433 * ERRORS: EINVAL Invalid devhandle or iotsb_handle
2434 *
2435 * This service returns configuration information about an IOTSB previously
2436 * created with pci_iotsb_conf.
2437 *
2438 * iotsb_handle value 0 may be used with this service to inquire about the
2439 * legacy IOTSB that may or may not exist. If the service succeeds, the return
2440 * values describe the legacy IOTSB and I/O virtual addresses mapped by that
2441 * table. However, the table base address r_addr may contain the value -1 which
2442 * indicates a memory range that cannot be accessed or be reclaimed.
2443 *
2444 * The return value #bound contains the number of PCI devices that iotsb_handle
2445 * is currently bound to.
2446 */
2447#define HV_FAST_PCI_IOTSB_INFO 0x191
2448
2449/* pci_iotsb_unconf()
2450 * TRAP: HV_FAST_TRAP
2451 * FUNCTION: HV_FAST_PCI_IOTSB_UNCONF
2452 * ARG0: devhandle
2453 * ARG1: iotsb_handle
2454 * RET0: status
2455 * ERRORS: EINVAL Invalid devhandle or iotsb_handle
2456 * EBUSY The IOTSB is bound and may not be unconfigured
2457 *
2458 * This service unconfigures the IOTSB identified by the devhandle and
2459 * iotsb_handle arguments, previously created with pci_iotsb_conf.
2460 * The IOTSB must not be currently bound to any device or the service will fail
2461 *
2462 * If the call succeeds, iotsb_handle is no longer valid.
2463 */
2464#define HV_FAST_PCI_IOTSB_UNCONF 0x192
2465
2466/* pci_iotsb_bind()
2467 * TRAP: HV_FAST_TRAP
2468 * FUNCTION: HV_FAST_PCI_IOTSB_BIND
2469 * ARG0: devhandle
2470 * ARG1: iotsb_handle
2471 * ARG2: pci_device
2472 * RET0: status
2473 * ERRORS: EINVAL Invalid devhandle, iotsb_handle, or pci_device
2474 * EBUSY A PCI function is already bound to an IOTSB at the same
2475 * address range as specified by devhandle, iotsb_handle.
2476 *
2477 * This service binds the PCI function specified by the argument pci_device to
2478 * the IOTSB specified by the arguments devhandle and iotsb_handle.
2479 *
2480 * The PCI device function is bound to the specified IOTSB with the IOVA range
2481 * specified when the IOTSB was configured via pci_iotsb_conf. If the function
2482 * is already bound then it is unbound first.
2483 */
2484#define HV_FAST_PCI_IOTSB_BIND 0x193
2485
2486/* pci_iotsb_unbind()
2487 * TRAP: HV_FAST_TRAP
2488 * FUNCTION: HV_FAST_PCI_IOTSB_UNBIND
2489 * ARG0: devhandle
2490 * ARG1: iotsb_handle
2491 * ARG2: pci_device
2492 * RET0: status
2493 * ERRORS: EINVAL Invalid devhandle, iotsb_handle, or pci_device
2494 * ENOMAP The PCI function was not bound to the specified IOTSB
2495 *
2496 * This service unbinds the PCI device specified by the argument pci_device
2497 * from the IOTSB identified * by the arguments devhandle and iotsb_handle.
2498 *
2499 * If the PCI device is not bound to the specified IOTSB then this service will
2500 * fail with status ENOMAP
2501 */
2502#define HV_FAST_PCI_IOTSB_UNBIND 0x194
2503
2504/* pci_iotsb_get_binding()
2505 * TRAP: HV_FAST_TRAP
2506 * FUNCTION: HV_FAST_PCI_IOTSB_GET_BINDING
2507 * ARG0: devhandle
2508 * ARG1: iotsb_handle
2509 * ARG2: iova
2510 * RET0: status
2511 * RET1: iotsb_handle
2512 * ERRORS: EINVAL Invalid devhandle, pci_device, or iova
2513 * ENOMAP The PCI function is not bound to an IOTSB at iova
2514 *
2515 * This service returns the IOTSB binding, iotsb_handle, for a given pci_device
2516 * and DMA virtual address, iova.
2517 *
2518 * iova must be the base address of a DMA virtual address range as defined by
2519 * the iommu-address-ranges property in the root complex device node defined
2520 * by the argument devhandle.
2521 */
2522#define HV_FAST_PCI_IOTSB_GET_BINDING 0x195
2523
2524/* pci_iotsb_map()
2525 * TRAP: HV_FAST_TRAP
2526 * FUNCTION: HV_FAST_PCI_IOTSB_MAP
2527 * ARG0: devhandle
2528 * ARG1: iotsb_handle
2529 * ARG2: index_count
2530 * ARG3: iotte_attributes
2531 * ARG4: io_page_list_p
2532 * RET0: status
2533 * RET1: #mapped
2534 * ERRORS: EINVAL Invalid devhandle, iotsb_handle, #iottes,
2535 * iotsb_index or iotte_attributes
2536 * EBADALIGN Improperly aligned io_page_list_p or I/O page
2537 * address in the I/O page list.
2538 * ENORADDR Invalid io_page_list_p or I/O page address in
2539 * the I/O page list.
2540 *
2541 * This service creates and flushes mappings in the IOTSB defined by the
2542 * arguments devhandle, iotsb.
2543 *
2544 * The index_count argument consists of two fields. Bits 63:48 contain #iotte
2545 * and bits 47:0 contain iotsb_index
2546 *
2547 * The first mapping is created in the IOTSB index specified by iotsb_index.
2548 * Subsequent mappings are created at iotsb_index+1 and so on.
2549 *
2550 * The attributes of each mapping are defined by the argument iotte_attributes.
2551 *
2552 * The io_page_list_p specifies the real address of the 64-bit-aligned list of
2553 * #iottes I/O page addresses. Each page address must be a properly aligned
2554 * real address of a page to be mapped in the IOTSB. The first entry in the I/O
2555 * page list contains the real address of the first page, the 2nd entry for the
2556 * 2nd page, and so on.
2557 *
2558 * #iottes must be greater than zero.
2559 *
2560 * The return value #mapped is the actual number of mappings created, which may
2561 * be less than or equal to the argument #iottes. If the function returns
2562 * successfully with a #mapped value less than the requested #iottes then the
2563 * caller should continue to invoke the service with updated iotsb_index,
2564 * #iottes, and io_page_list_p arguments until all pages are mapped.
2565 *
2566 * This service must not be used to demap a mapping. In other words, all
2567 * mappings must be valid and have one or both of the RW attribute bits set.
2568 *
2569 * Note:
2570 * It is implementation-defined whether I/O page real address validity checking
2571 * is done at time mappings are established or deferred until they are
2572 * accessed.
2573 */
2574#define HV_FAST_PCI_IOTSB_MAP 0x196
2575
2576/* pci_iotsb_map_one()
2577 * TRAP: HV_FAST_TRAP
2578 * FUNCTION: HV_FAST_PCI_IOTSB_MAP_ONE
2579 * ARG0: devhandle
2580 * ARG1: iotsb_handle
2581 * ARG2: iotsb_index
2582 * ARG3: iotte_attributes
2583 * ARG4: r_addr
2584 * RET0: status
2585 * ERRORS: EINVAL Invalid devhandle,iotsb_handle, iotsb_index
2586 * or iotte_attributes
2587 * EBADALIGN Improperly aligned r_addr
2588 * ENORADDR Invalid r_addr
2589 *
2590 * This service creates and flushes a single mapping in the IOTSB defined by the
2591 * arguments devhandle, iotsb.
2592 *
2593 * The mapping for the page at r_addr is created at the IOTSB index specified by
2594 * iotsb_index with the attributes iotte_attributes.
2595 *
2596 * This service must not be used to demap a mapping. In other words, the mapping
2597 * must be valid and have one or both of the RW attribute bits set.
2598 *
2599 * Note:
2600 * It is implementation-defined whether I/O page real address validity checking
2601 * is done at time mappings are established or deferred until they are
2602 * accessed.
2603 */
2604#define HV_FAST_PCI_IOTSB_MAP_ONE 0x197
2605
2606/* pci_iotsb_demap()
2607 * TRAP: HV_FAST_TRAP
2608 * FUNCTION: HV_FAST_PCI_IOTSB_DEMAP
2609 * ARG0: devhandle
2610 * ARG1: iotsb_handle
2611 * ARG2: iotsb_index
2612 * ARG3: #iottes
2613 * RET0: status
2614 * RET1: #unmapped
2615 * ERRORS: EINVAL Invalid devhandle, iotsb_handle, iotsb_index or #iottes
2616 *
2617 * This service unmaps and flushes up to #iottes mappings starting at index
2618 * iotsb_index from the IOTSB defined by the arguments devhandle, iotsb.
2619 *
2620 * #iottes must be greater than zero.
2621 *
2622 * The actual number of IOTTEs unmapped is returned in #unmapped and may be less
2623 * than or equal to the requested number of IOTTEs, #iottes.
2624 *
2625 * If #unmapped is less than #iottes, the caller should continue to invoke this
2626 * service with updated iotsb_index and #iottes arguments until all pages are
2627 * demapped.
2628 */
2629#define HV_FAST_PCI_IOTSB_DEMAP 0x198
2630
2631/* pci_iotsb_getmap()
2632 * TRAP: HV_FAST_TRAP
2633 * FUNCTION: HV_FAST_PCI_IOTSB_GETMAP
2634 * ARG0: devhandle
2635 * ARG1: iotsb_handle
2636 * ARG2: iotsb_index
2637 * RET0: status
2638 * RET1: r_addr
2639 * RET2: iotte_attributes
2640 * ERRORS: EINVAL Invalid devhandle, iotsb_handle, or iotsb_index
2641 * ENOMAP No mapping was found
2642 *
2643 * This service returns the mapping specified by index iotsb_index from the
2644 * IOTSB defined by the arguments devhandle, iotsb.
2645 *
2646 * Upon success, the real address of the mapping shall be returned in
2647 * r_addr and thethe IOTTE mapping attributes shall be returned in
2648 * iotte_attributes.
2649 *
2650 * The return value iotte_attributes may not include optional features used in
2651 * the call to create the mapping.
2652 */
2653#define HV_FAST_PCI_IOTSB_GETMAP 0x199
2654
2655/* pci_iotsb_sync_mappings()
2656 * TRAP: HV_FAST_TRAP
2657 * FUNCTION: HV_FAST_PCI_IOTSB_SYNC_MAPPINGS
2658 * ARG0: devhandle
2659 * ARG1: iotsb_handle
2660 * ARG2: iotsb_index
2661 * ARG3: #iottes
2662 * RET0: status
2663 * RET1: #synced
2664 * ERROS: EINVAL Invalid devhandle, iotsb_handle, iotsb_index, or #iottes
2665 *
2666 * This service synchronizes #iottes mappings starting at index iotsb_index in
2667 * the IOTSB defined by the arguments devhandle, iotsb.
2668 *
2669 * #iottes must be greater than zero.
2670 *
2671 * The actual number of IOTTEs synchronized is returned in #synced, which may
2672 * be less than or equal to the requested number, #iottes.
2673 *
2674 * Upon a successful return, #synced is less than #iottes, the caller should
2675 * continue to invoke this service with updated iotsb_index and #iottes
2676 * arguments until all pages are synchronized.
2677 */
2678#define HV_FAST_PCI_IOTSB_SYNC_MAPPINGS 0x19a
2679
2338/* Logical Domain Channel services. */ 2680/* Logical Domain Channel services. */
2339 2681
2340#define LDC_CHANNEL_DOWN 0 2682#define LDC_CHANNEL_DOWN 0
@@ -2993,6 +3335,7 @@ unsigned long sun4v_m7_set_perfreg(unsigned long reg_num,
2993#define HV_GRP_SDIO 0x0108 3335#define HV_GRP_SDIO 0x0108
2994#define HV_GRP_SDIO_ERR 0x0109 3336#define HV_GRP_SDIO_ERR 0x0109
2995#define HV_GRP_REBOOT_DATA 0x0110 3337#define HV_GRP_REBOOT_DATA 0x0110
3338#define HV_GRP_ATU 0x0111
2996#define HV_GRP_M7_PERF 0x0114 3339#define HV_GRP_M7_PERF 0x0114
2997#define HV_GRP_NIAG_PERF 0x0200 3340#define HV_GRP_NIAG_PERF 0x0200
2998#define HV_GRP_FIRE_PERF 0x0201 3341#define HV_GRP_FIRE_PERF 0x0201
diff --git a/arch/sparc/include/asm/iommu_64.h b/arch/sparc/include/asm/iommu_64.h
index cd0d69fa7592..f24f356f2503 100644
--- a/arch/sparc/include/asm/iommu_64.h
+++ b/arch/sparc/include/asm/iommu_64.h
@@ -24,8 +24,36 @@ struct iommu_arena {
24 unsigned int limit; 24 unsigned int limit;
25}; 25};
26 26
27#define ATU_64_SPACE_SIZE 0x800000000 /* 32G */
28
29/* Data structures for SPARC ATU architecture */
30struct atu_iotsb {
31 void *table; /* IOTSB table base virtual addr*/
32 u64 ra; /* IOTSB table real addr */
33 u64 dvma_size; /* ranges[3].size or OS slected 32G size */
34 u64 dvma_base; /* ranges[3].base */
35 u64 table_size; /* IOTSB table size */
36 u64 page_size; /* IO PAGE size for IOTSB */
37 u32 iotsb_num; /* tsbnum is same as iotsb_handle */
38};
39
40struct atu_ranges {
41 u64 base;
42 u64 size;
43};
44
45struct atu {
46 struct atu_ranges *ranges;
47 struct atu_iotsb *iotsb;
48 struct iommu_map_table tbl;
49 u64 base;
50 u64 size;
51 u64 dma_addr_mask;
52};
53
27struct iommu { 54struct iommu {
28 struct iommu_map_table tbl; 55 struct iommu_map_table tbl;
56 struct atu *atu;
29 spinlock_t lock; 57 spinlock_t lock;
30 u32 dma_addr_mask; 58 u32 dma_addr_mask;
31 iopte_t *page_table; 59 iopte_t *page_table;
diff --git a/arch/sparc/kernel/hvapi.c b/arch/sparc/kernel/hvapi.c
index 662500fa555f..267731234ce8 100644
--- a/arch/sparc/kernel/hvapi.c
+++ b/arch/sparc/kernel/hvapi.c
@@ -39,6 +39,7 @@ static struct api_info api_table[] = {
39 { .group = HV_GRP_SDIO, }, 39 { .group = HV_GRP_SDIO, },
40 { .group = HV_GRP_SDIO_ERR, }, 40 { .group = HV_GRP_SDIO_ERR, },
41 { .group = HV_GRP_REBOOT_DATA, }, 41 { .group = HV_GRP_REBOOT_DATA, },
42 { .group = HV_GRP_ATU, .flags = FLAG_PRE_API },
42 { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API }, 43 { .group = HV_GRP_NIAG_PERF, .flags = FLAG_PRE_API },
43 { .group = HV_GRP_FIRE_PERF, }, 44 { .group = HV_GRP_FIRE_PERF, },
44 { .group = HV_GRP_N2_CPU, }, 45 { .group = HV_GRP_N2_CPU, },
diff --git a/arch/sparc/kernel/iommu.c b/arch/sparc/kernel/iommu.c
index 5c615abff030..852a3291db96 100644
--- a/arch/sparc/kernel/iommu.c
+++ b/arch/sparc/kernel/iommu.c
@@ -760,8 +760,12 @@ int dma_supported(struct device *dev, u64 device_mask)
760 struct iommu *iommu = dev->archdata.iommu; 760 struct iommu *iommu = dev->archdata.iommu;
761 u64 dma_addr_mask = iommu->dma_addr_mask; 761 u64 dma_addr_mask = iommu->dma_addr_mask;
762 762
763 if (device_mask >= (1UL << 32UL)) 763 if (device_mask > DMA_BIT_MASK(32)) {
764 return 0; 764 if (iommu->atu)
765 dma_addr_mask = iommu->atu->dma_addr_mask;
766 else
767 return 0;
768 }
765 769
766 if ((device_mask & dma_addr_mask) == dma_addr_mask) 770 if ((device_mask & dma_addr_mask) == dma_addr_mask)
767 return 1; 771 return 1;
diff --git a/arch/sparc/kernel/iommu_common.h b/arch/sparc/kernel/iommu_common.h
index b40cec252905..828493329f68 100644
--- a/arch/sparc/kernel/iommu_common.h
+++ b/arch/sparc/kernel/iommu_common.h
@@ -13,7 +13,6 @@
13#include <linux/scatterlist.h> 13#include <linux/scatterlist.h>
14#include <linux/device.h> 14#include <linux/device.h>
15#include <linux/iommu-helper.h> 15#include <linux/iommu-helper.h>
16#include <linux/scatterlist.h>
17 16
18#include <asm/iommu.h> 17#include <asm/iommu.h>
19 18
diff --git a/arch/sparc/kernel/pci_sun4v.c b/arch/sparc/kernel/pci_sun4v.c
index db57d8acdc01..06981cc716b6 100644
--- a/arch/sparc/kernel/pci_sun4v.c
+++ b/arch/sparc/kernel/pci_sun4v.c
@@ -44,6 +44,9 @@ static struct vpci_version vpci_versions[] = {
44 { .major = 1, .minor = 1 }, 44 { .major = 1, .minor = 1 },
45}; 45};
46 46
47static unsigned long vatu_major = 1;
48static unsigned long vatu_minor = 1;
49
47#define PGLIST_NENTS (PAGE_SIZE / sizeof(u64)) 50#define PGLIST_NENTS (PAGE_SIZE / sizeof(u64))
48 51
49struct iommu_batch { 52struct iommu_batch {
@@ -69,34 +72,57 @@ static inline void iommu_batch_start(struct device *dev, unsigned long prot, uns
69} 72}
70 73
71/* Interrupts must be disabled. */ 74/* Interrupts must be disabled. */
72static long iommu_batch_flush(struct iommu_batch *p) 75static long iommu_batch_flush(struct iommu_batch *p, u64 mask)
73{ 76{
74 struct pci_pbm_info *pbm = p->dev->archdata.host_controller; 77 struct pci_pbm_info *pbm = p->dev->archdata.host_controller;
78 u64 *pglist = p->pglist;
79 u64 index_count;
75 unsigned long devhandle = pbm->devhandle; 80 unsigned long devhandle = pbm->devhandle;
76 unsigned long prot = p->prot; 81 unsigned long prot = p->prot;
77 unsigned long entry = p->entry; 82 unsigned long entry = p->entry;
78 u64 *pglist = p->pglist;
79 unsigned long npages = p->npages; 83 unsigned long npages = p->npages;
84 unsigned long iotsb_num;
85 unsigned long ret;
86 long num;
80 87
81 /* VPCI maj=1, min=[0,1] only supports read and write */ 88 /* VPCI maj=1, min=[0,1] only supports read and write */
82 if (vpci_major < 2) 89 if (vpci_major < 2)
83 prot &= (HV_PCI_MAP_ATTR_READ | HV_PCI_MAP_ATTR_WRITE); 90 prot &= (HV_PCI_MAP_ATTR_READ | HV_PCI_MAP_ATTR_WRITE);
84 91
85 while (npages != 0) { 92 while (npages != 0) {
86 long num; 93 if (mask <= DMA_BIT_MASK(32)) {
87 94 num = pci_sun4v_iommu_map(devhandle,
88 num = pci_sun4v_iommu_map(devhandle, HV_PCI_TSBID(0, entry), 95 HV_PCI_TSBID(0, entry),
89 npages, prot, __pa(pglist)); 96 npages,
90 if (unlikely(num < 0)) { 97 prot,
91 if (printk_ratelimit()) 98 __pa(pglist));
92 printk("iommu_batch_flush: IOMMU map of " 99 if (unlikely(num < 0)) {
93 "[%08lx:%08llx:%lx:%lx:%lx] failed with " 100 pr_err_ratelimited("%s: IOMMU map of [%08lx:%08llx:%lx:%lx:%lx] failed with status %ld\n",
94 "status %ld\n", 101 __func__,
95 devhandle, HV_PCI_TSBID(0, entry), 102 devhandle,
96 npages, prot, __pa(pglist), num); 103 HV_PCI_TSBID(0, entry),
97 return -1; 104 npages, prot, __pa(pglist),
105 num);
106 return -1;
107 }
108 } else {
109 index_count = HV_PCI_IOTSB_INDEX_COUNT(npages, entry),
110 iotsb_num = pbm->iommu->atu->iotsb->iotsb_num;
111 ret = pci_sun4v_iotsb_map(devhandle,
112 iotsb_num,
113 index_count,
114 prot,
115 __pa(pglist),
116 &num);
117 if (unlikely(ret != HV_EOK)) {
118 pr_err_ratelimited("%s: ATU map of [%08lx:%lx:%llx:%lx:%lx] failed with status %ld\n",
119 __func__,
120 devhandle, iotsb_num,
121 index_count, prot,
122 __pa(pglist), ret);
123 return -1;
124 }
98 } 125 }
99
100 entry += num; 126 entry += num;
101 npages -= num; 127 npages -= num;
102 pglist += num; 128 pglist += num;
@@ -108,19 +134,19 @@ static long iommu_batch_flush(struct iommu_batch *p)
108 return 0; 134 return 0;
109} 135}
110 136
111static inline void iommu_batch_new_entry(unsigned long entry) 137static inline void iommu_batch_new_entry(unsigned long entry, u64 mask)
112{ 138{
113 struct iommu_batch *p = this_cpu_ptr(&iommu_batch); 139 struct iommu_batch *p = this_cpu_ptr(&iommu_batch);
114 140
115 if (p->entry + p->npages == entry) 141 if (p->entry + p->npages == entry)
116 return; 142 return;
117 if (p->entry != ~0UL) 143 if (p->entry != ~0UL)
118 iommu_batch_flush(p); 144 iommu_batch_flush(p, mask);
119 p->entry = entry; 145 p->entry = entry;
120} 146}
121 147
122/* Interrupts must be disabled. */ 148/* Interrupts must be disabled. */
123static inline long iommu_batch_add(u64 phys_page) 149static inline long iommu_batch_add(u64 phys_page, u64 mask)
124{ 150{
125 struct iommu_batch *p = this_cpu_ptr(&iommu_batch); 151 struct iommu_batch *p = this_cpu_ptr(&iommu_batch);
126 152
@@ -128,28 +154,31 @@ static inline long iommu_batch_add(u64 phys_page)
128 154
129 p->pglist[p->npages++] = phys_page; 155 p->pglist[p->npages++] = phys_page;
130 if (p->npages == PGLIST_NENTS) 156 if (p->npages == PGLIST_NENTS)
131 return iommu_batch_flush(p); 157 return iommu_batch_flush(p, mask);
132 158
133 return 0; 159 return 0;
134} 160}
135 161
136/* Interrupts must be disabled. */ 162/* Interrupts must be disabled. */
137static inline long iommu_batch_end(void) 163static inline long iommu_batch_end(u64 mask)
138{ 164{
139 struct iommu_batch *p = this_cpu_ptr(&iommu_batch); 165 struct iommu_batch *p = this_cpu_ptr(&iommu_batch);
140 166
141 BUG_ON(p->npages >= PGLIST_NENTS); 167 BUG_ON(p->npages >= PGLIST_NENTS);
142 168
143 return iommu_batch_flush(p); 169 return iommu_batch_flush(p, mask);
144} 170}
145 171
146static void *dma_4v_alloc_coherent(struct device *dev, size_t size, 172static void *dma_4v_alloc_coherent(struct device *dev, size_t size,
147 dma_addr_t *dma_addrp, gfp_t gfp, 173 dma_addr_t *dma_addrp, gfp_t gfp,
148 unsigned long attrs) 174 unsigned long attrs)
149{ 175{
176 u64 mask;
150 unsigned long flags, order, first_page, npages, n; 177 unsigned long flags, order, first_page, npages, n;
151 unsigned long prot = 0; 178 unsigned long prot = 0;
152 struct iommu *iommu; 179 struct iommu *iommu;
180 struct atu *atu;
181 struct iommu_map_table *tbl;
153 struct page *page; 182 struct page *page;
154 void *ret; 183 void *ret;
155 long entry; 184 long entry;
@@ -174,14 +203,21 @@ static void *dma_4v_alloc_coherent(struct device *dev, size_t size,
174 memset((char *)first_page, 0, PAGE_SIZE << order); 203 memset((char *)first_page, 0, PAGE_SIZE << order);
175 204
176 iommu = dev->archdata.iommu; 205 iommu = dev->archdata.iommu;
206 atu = iommu->atu;
207
208 mask = dev->coherent_dma_mask;
209 if (mask <= DMA_BIT_MASK(32))
210 tbl = &iommu->tbl;
211 else
212 tbl = &atu->tbl;
177 213
178 entry = iommu_tbl_range_alloc(dev, &iommu->tbl, npages, NULL, 214 entry = iommu_tbl_range_alloc(dev, tbl, npages, NULL,
179 (unsigned long)(-1), 0); 215 (unsigned long)(-1), 0);
180 216
181 if (unlikely(entry == IOMMU_ERROR_CODE)) 217 if (unlikely(entry == IOMMU_ERROR_CODE))
182 goto range_alloc_fail; 218 goto range_alloc_fail;
183 219
184 *dma_addrp = (iommu->tbl.table_map_base + (entry << IO_PAGE_SHIFT)); 220 *dma_addrp = (tbl->table_map_base + (entry << IO_PAGE_SHIFT));
185 ret = (void *) first_page; 221 ret = (void *) first_page;
186 first_page = __pa(first_page); 222 first_page = __pa(first_page);
187 223
@@ -193,12 +229,12 @@ static void *dma_4v_alloc_coherent(struct device *dev, size_t size,
193 entry); 229 entry);
194 230
195 for (n = 0; n < npages; n++) { 231 for (n = 0; n < npages; n++) {
196 long err = iommu_batch_add(first_page + (n * PAGE_SIZE)); 232 long err = iommu_batch_add(first_page + (n * PAGE_SIZE), mask);
197 if (unlikely(err < 0L)) 233 if (unlikely(err < 0L))
198 goto iommu_map_fail; 234 goto iommu_map_fail;
199 } 235 }
200 236
201 if (unlikely(iommu_batch_end() < 0L)) 237 if (unlikely(iommu_batch_end(mask) < 0L))
202 goto iommu_map_fail; 238 goto iommu_map_fail;
203 239
204 local_irq_restore(flags); 240 local_irq_restore(flags);
@@ -206,25 +242,71 @@ static void *dma_4v_alloc_coherent(struct device *dev, size_t size,
206 return ret; 242 return ret;
207 243
208iommu_map_fail: 244iommu_map_fail:
209 iommu_tbl_range_free(&iommu->tbl, *dma_addrp, npages, IOMMU_ERROR_CODE); 245 iommu_tbl_range_free(tbl, *dma_addrp, npages, IOMMU_ERROR_CODE);
210 246
211range_alloc_fail: 247range_alloc_fail:
212 free_pages(first_page, order); 248 free_pages(first_page, order);
213 return NULL; 249 return NULL;
214} 250}
215 251
216static void dma_4v_iommu_demap(void *demap_arg, unsigned long entry, 252unsigned long dma_4v_iotsb_bind(unsigned long devhandle,
217 unsigned long npages) 253 unsigned long iotsb_num,
254 struct pci_bus *bus_dev)
255{
256 struct pci_dev *pdev;
257 unsigned long err;
258 unsigned int bus;
259 unsigned int device;
260 unsigned int fun;
261
262 list_for_each_entry(pdev, &bus_dev->devices, bus_list) {
263 if (pdev->subordinate) {
264 /* No need to bind pci bridge */
265 dma_4v_iotsb_bind(devhandle, iotsb_num,
266 pdev->subordinate);
267 } else {
268 bus = bus_dev->number;
269 device = PCI_SLOT(pdev->devfn);
270 fun = PCI_FUNC(pdev->devfn);
271 err = pci_sun4v_iotsb_bind(devhandle, iotsb_num,
272 HV_PCI_DEVICE_BUILD(bus,
273 device,
274 fun));
275
276 /* If bind fails for one device it is going to fail
277 * for rest of the devices because we are sharing
278 * IOTSB. So in case of failure simply return with
279 * error.
280 */
281 if (err)
282 return err;
283 }
284 }
285
286 return 0;
287}
288
289static void dma_4v_iommu_demap(struct device *dev, unsigned long devhandle,
290 dma_addr_t dvma, unsigned long iotsb_num,
291 unsigned long entry, unsigned long npages)
218{ 292{
219 u32 devhandle = *(u32 *)demap_arg;
220 unsigned long num, flags; 293 unsigned long num, flags;
294 unsigned long ret;
221 295
222 local_irq_save(flags); 296 local_irq_save(flags);
223 do { 297 do {
224 num = pci_sun4v_iommu_demap(devhandle, 298 if (dvma <= DMA_BIT_MASK(32)) {
225 HV_PCI_TSBID(0, entry), 299 num = pci_sun4v_iommu_demap(devhandle,
226 npages); 300 HV_PCI_TSBID(0, entry),
227 301 npages);
302 } else {
303 ret = pci_sun4v_iotsb_demap(devhandle, iotsb_num,
304 entry, npages, &num);
305 if (unlikely(ret != HV_EOK)) {
306 pr_err_ratelimited("pci_iotsb_demap() failed with error: %ld\n",
307 ret);
308 }
309 }
228 entry += num; 310 entry += num;
229 npages -= num; 311 npages -= num;
230 } while (npages != 0); 312 } while (npages != 0);
@@ -236,16 +318,28 @@ static void dma_4v_free_coherent(struct device *dev, size_t size, void *cpu,
236{ 318{
237 struct pci_pbm_info *pbm; 319 struct pci_pbm_info *pbm;
238 struct iommu *iommu; 320 struct iommu *iommu;
321 struct atu *atu;
322 struct iommu_map_table *tbl;
239 unsigned long order, npages, entry; 323 unsigned long order, npages, entry;
324 unsigned long iotsb_num;
240 u32 devhandle; 325 u32 devhandle;
241 326
242 npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT; 327 npages = IO_PAGE_ALIGN(size) >> IO_PAGE_SHIFT;
243 iommu = dev->archdata.iommu; 328 iommu = dev->archdata.iommu;
244 pbm = dev->archdata.host_controller; 329 pbm = dev->archdata.host_controller;
330 atu = iommu->atu;
245 devhandle = pbm->devhandle; 331 devhandle = pbm->devhandle;
246 entry = ((dvma - iommu->tbl.table_map_base) >> IO_PAGE_SHIFT); 332
247 dma_4v_iommu_demap(&devhandle, entry, npages); 333 if (dvma <= DMA_BIT_MASK(32)) {
248 iommu_tbl_range_free(&iommu->tbl, dvma, npages, IOMMU_ERROR_CODE); 334 tbl = &iommu->tbl;
335 iotsb_num = 0; /* we don't care for legacy iommu */
336 } else {
337 tbl = &atu->tbl;
338 iotsb_num = atu->iotsb->iotsb_num;
339 }
340 entry = ((dvma - tbl->table_map_base) >> IO_PAGE_SHIFT);
341 dma_4v_iommu_demap(dev, devhandle, dvma, iotsb_num, entry, npages);
342 iommu_tbl_range_free(tbl, dvma, npages, IOMMU_ERROR_CODE);
249 order = get_order(size); 343 order = get_order(size);
250 if (order < 10) 344 if (order < 10)
251 free_pages((unsigned long)cpu, order); 345 free_pages((unsigned long)cpu, order);
@@ -257,13 +351,17 @@ static dma_addr_t dma_4v_map_page(struct device *dev, struct page *page,
257 unsigned long attrs) 351 unsigned long attrs)
258{ 352{
259 struct iommu *iommu; 353 struct iommu *iommu;
354 struct atu *atu;
355 struct iommu_map_table *tbl;
356 u64 mask;
260 unsigned long flags, npages, oaddr; 357 unsigned long flags, npages, oaddr;
261 unsigned long i, base_paddr; 358 unsigned long i, base_paddr;
262 u32 bus_addr, ret;
263 unsigned long prot; 359 unsigned long prot;
360 dma_addr_t bus_addr, ret;
264 long entry; 361 long entry;
265 362
266 iommu = dev->archdata.iommu; 363 iommu = dev->archdata.iommu;
364 atu = iommu->atu;
267 365
268 if (unlikely(direction == DMA_NONE)) 366 if (unlikely(direction == DMA_NONE))
269 goto bad; 367 goto bad;
@@ -272,13 +370,19 @@ static dma_addr_t dma_4v_map_page(struct device *dev, struct page *page,
272 npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK); 370 npages = IO_PAGE_ALIGN(oaddr + sz) - (oaddr & IO_PAGE_MASK);
273 npages >>= IO_PAGE_SHIFT; 371 npages >>= IO_PAGE_SHIFT;
274 372
275 entry = iommu_tbl_range_alloc(dev, &iommu->tbl, npages, NULL, 373 mask = *dev->dma_mask;
374 if (mask <= DMA_BIT_MASK(32))
375 tbl = &iommu->tbl;
376 else
377 tbl = &atu->tbl;
378
379 entry = iommu_tbl_range_alloc(dev, tbl, npages, NULL,
276 (unsigned long)(-1), 0); 380 (unsigned long)(-1), 0);
277 381
278 if (unlikely(entry == IOMMU_ERROR_CODE)) 382 if (unlikely(entry == IOMMU_ERROR_CODE))
279 goto bad; 383 goto bad;
280 384
281 bus_addr = (iommu->tbl.table_map_base + (entry << IO_PAGE_SHIFT)); 385 bus_addr = (tbl->table_map_base + (entry << IO_PAGE_SHIFT));
282 ret = bus_addr | (oaddr & ~IO_PAGE_MASK); 386 ret = bus_addr | (oaddr & ~IO_PAGE_MASK);
283 base_paddr = __pa(oaddr & IO_PAGE_MASK); 387 base_paddr = __pa(oaddr & IO_PAGE_MASK);
284 prot = HV_PCI_MAP_ATTR_READ; 388 prot = HV_PCI_MAP_ATTR_READ;
@@ -293,11 +397,11 @@ static dma_addr_t dma_4v_map_page(struct device *dev, struct page *page,
293 iommu_batch_start(dev, prot, entry); 397 iommu_batch_start(dev, prot, entry);
294 398
295 for (i = 0; i < npages; i++, base_paddr += IO_PAGE_SIZE) { 399 for (i = 0; i < npages; i++, base_paddr += IO_PAGE_SIZE) {
296 long err = iommu_batch_add(base_paddr); 400 long err = iommu_batch_add(base_paddr, mask);
297 if (unlikely(err < 0L)) 401 if (unlikely(err < 0L))
298 goto iommu_map_fail; 402 goto iommu_map_fail;
299 } 403 }
300 if (unlikely(iommu_batch_end() < 0L)) 404 if (unlikely(iommu_batch_end(mask) < 0L))
301 goto iommu_map_fail; 405 goto iommu_map_fail;
302 406
303 local_irq_restore(flags); 407 local_irq_restore(flags);
@@ -310,7 +414,7 @@ bad:
310 return DMA_ERROR_CODE; 414 return DMA_ERROR_CODE;
311 415
312iommu_map_fail: 416iommu_map_fail:
313 iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, IOMMU_ERROR_CODE); 417 iommu_tbl_range_free(tbl, bus_addr, npages, IOMMU_ERROR_CODE);
314 return DMA_ERROR_CODE; 418 return DMA_ERROR_CODE;
315} 419}
316 420
@@ -320,7 +424,10 @@ static void dma_4v_unmap_page(struct device *dev, dma_addr_t bus_addr,
320{ 424{
321 struct pci_pbm_info *pbm; 425 struct pci_pbm_info *pbm;
322 struct iommu *iommu; 426 struct iommu *iommu;
427 struct atu *atu;
428 struct iommu_map_table *tbl;
323 unsigned long npages; 429 unsigned long npages;
430 unsigned long iotsb_num;
324 long entry; 431 long entry;
325 u32 devhandle; 432 u32 devhandle;
326 433
@@ -332,14 +439,23 @@ static void dma_4v_unmap_page(struct device *dev, dma_addr_t bus_addr,
332 439
333 iommu = dev->archdata.iommu; 440 iommu = dev->archdata.iommu;
334 pbm = dev->archdata.host_controller; 441 pbm = dev->archdata.host_controller;
442 atu = iommu->atu;
335 devhandle = pbm->devhandle; 443 devhandle = pbm->devhandle;
336 444
337 npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK); 445 npages = IO_PAGE_ALIGN(bus_addr + sz) - (bus_addr & IO_PAGE_MASK);
338 npages >>= IO_PAGE_SHIFT; 446 npages >>= IO_PAGE_SHIFT;
339 bus_addr &= IO_PAGE_MASK; 447 bus_addr &= IO_PAGE_MASK;
340 entry = (bus_addr - iommu->tbl.table_map_base) >> IO_PAGE_SHIFT; 448
341 dma_4v_iommu_demap(&devhandle, entry, npages); 449 if (bus_addr <= DMA_BIT_MASK(32)) {
342 iommu_tbl_range_free(&iommu->tbl, bus_addr, npages, IOMMU_ERROR_CODE); 450 iotsb_num = 0; /* we don't care for legacy iommu */
451 tbl = &iommu->tbl;
452 } else {
453 iotsb_num = atu->iotsb->iotsb_num;
454 tbl = &atu->tbl;
455 }
456 entry = (bus_addr - tbl->table_map_base) >> IO_PAGE_SHIFT;
457 dma_4v_iommu_demap(dev, devhandle, bus_addr, iotsb_num, entry, npages);
458 iommu_tbl_range_free(tbl, bus_addr, npages, IOMMU_ERROR_CODE);
343} 459}
344 460
345static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist, 461static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
@@ -353,12 +469,17 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
353 unsigned long seg_boundary_size; 469 unsigned long seg_boundary_size;
354 int outcount, incount, i; 470 int outcount, incount, i;
355 struct iommu *iommu; 471 struct iommu *iommu;
472 struct atu *atu;
473 struct iommu_map_table *tbl;
474 u64 mask;
356 unsigned long base_shift; 475 unsigned long base_shift;
357 long err; 476 long err;
358 477
359 BUG_ON(direction == DMA_NONE); 478 BUG_ON(direction == DMA_NONE);
360 479
361 iommu = dev->archdata.iommu; 480 iommu = dev->archdata.iommu;
481 atu = iommu->atu;
482
362 if (nelems == 0 || !iommu) 483 if (nelems == 0 || !iommu)
363 return 0; 484 return 0;
364 485
@@ -384,7 +505,15 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
384 max_seg_size = dma_get_max_seg_size(dev); 505 max_seg_size = dma_get_max_seg_size(dev);
385 seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1, 506 seg_boundary_size = ALIGN(dma_get_seg_boundary(dev) + 1,
386 IO_PAGE_SIZE) >> IO_PAGE_SHIFT; 507 IO_PAGE_SIZE) >> IO_PAGE_SHIFT;
387 base_shift = iommu->tbl.table_map_base >> IO_PAGE_SHIFT; 508
509 mask = *dev->dma_mask;
510 if (mask <= DMA_BIT_MASK(32))
511 tbl = &iommu->tbl;
512 else
513 tbl = &atu->tbl;
514
515 base_shift = tbl->table_map_base >> IO_PAGE_SHIFT;
516
388 for_each_sg(sglist, s, nelems, i) { 517 for_each_sg(sglist, s, nelems, i) {
389 unsigned long paddr, npages, entry, out_entry = 0, slen; 518 unsigned long paddr, npages, entry, out_entry = 0, slen;
390 519
@@ -397,27 +526,26 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
397 /* Allocate iommu entries for that segment */ 526 /* Allocate iommu entries for that segment */
398 paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s); 527 paddr = (unsigned long) SG_ENT_PHYS_ADDRESS(s);
399 npages = iommu_num_pages(paddr, slen, IO_PAGE_SIZE); 528 npages = iommu_num_pages(paddr, slen, IO_PAGE_SIZE);
400 entry = iommu_tbl_range_alloc(dev, &iommu->tbl, npages, 529 entry = iommu_tbl_range_alloc(dev, tbl, npages,
401 &handle, (unsigned long)(-1), 0); 530 &handle, (unsigned long)(-1), 0);
402 531
403 /* Handle failure */ 532 /* Handle failure */
404 if (unlikely(entry == IOMMU_ERROR_CODE)) { 533 if (unlikely(entry == IOMMU_ERROR_CODE)) {
405 if (printk_ratelimit()) 534 pr_err_ratelimited("iommu_alloc failed, iommu %p paddr %lx npages %lx\n",
406 printk(KERN_INFO "iommu_alloc failed, iommu %p paddr %lx" 535 tbl, paddr, npages);
407 " npages %lx\n", iommu, paddr, npages);
408 goto iommu_map_failed; 536 goto iommu_map_failed;
409 } 537 }
410 538
411 iommu_batch_new_entry(entry); 539 iommu_batch_new_entry(entry, mask);
412 540
413 /* Convert entry to a dma_addr_t */ 541 /* Convert entry to a dma_addr_t */
414 dma_addr = iommu->tbl.table_map_base + (entry << IO_PAGE_SHIFT); 542 dma_addr = tbl->table_map_base + (entry << IO_PAGE_SHIFT);
415 dma_addr |= (s->offset & ~IO_PAGE_MASK); 543 dma_addr |= (s->offset & ~IO_PAGE_MASK);
416 544
417 /* Insert into HW table */ 545 /* Insert into HW table */
418 paddr &= IO_PAGE_MASK; 546 paddr &= IO_PAGE_MASK;
419 while (npages--) { 547 while (npages--) {
420 err = iommu_batch_add(paddr); 548 err = iommu_batch_add(paddr, mask);
421 if (unlikely(err < 0L)) 549 if (unlikely(err < 0L))
422 goto iommu_map_failed; 550 goto iommu_map_failed;
423 paddr += IO_PAGE_SIZE; 551 paddr += IO_PAGE_SIZE;
@@ -452,7 +580,7 @@ static int dma_4v_map_sg(struct device *dev, struct scatterlist *sglist,
452 dma_next = dma_addr + slen; 580 dma_next = dma_addr + slen;
453 } 581 }
454 582
455 err = iommu_batch_end(); 583 err = iommu_batch_end(mask);
456 584
457 if (unlikely(err < 0L)) 585 if (unlikely(err < 0L))
458 goto iommu_map_failed; 586 goto iommu_map_failed;
@@ -475,7 +603,7 @@ iommu_map_failed:
475 vaddr = s->dma_address & IO_PAGE_MASK; 603 vaddr = s->dma_address & IO_PAGE_MASK;
476 npages = iommu_num_pages(s->dma_address, s->dma_length, 604 npages = iommu_num_pages(s->dma_address, s->dma_length,
477 IO_PAGE_SIZE); 605 IO_PAGE_SIZE);
478 iommu_tbl_range_free(&iommu->tbl, vaddr, npages, 606 iommu_tbl_range_free(tbl, vaddr, npages,
479 IOMMU_ERROR_CODE); 607 IOMMU_ERROR_CODE);
480 /* XXX demap? XXX */ 608 /* XXX demap? XXX */
481 s->dma_address = DMA_ERROR_CODE; 609 s->dma_address = DMA_ERROR_CODE;
@@ -496,13 +624,16 @@ static void dma_4v_unmap_sg(struct device *dev, struct scatterlist *sglist,
496 struct pci_pbm_info *pbm; 624 struct pci_pbm_info *pbm;
497 struct scatterlist *sg; 625 struct scatterlist *sg;
498 struct iommu *iommu; 626 struct iommu *iommu;
627 struct atu *atu;
499 unsigned long flags, entry; 628 unsigned long flags, entry;
629 unsigned long iotsb_num;
500 u32 devhandle; 630 u32 devhandle;
501 631
502 BUG_ON(direction == DMA_NONE); 632 BUG_ON(direction == DMA_NONE);
503 633
504 iommu = dev->archdata.iommu; 634 iommu = dev->archdata.iommu;
505 pbm = dev->archdata.host_controller; 635 pbm = dev->archdata.host_controller;
636 atu = iommu->atu;
506 devhandle = pbm->devhandle; 637 devhandle = pbm->devhandle;
507 638
508 local_irq_save(flags); 639 local_irq_save(flags);
@@ -512,15 +643,24 @@ static void dma_4v_unmap_sg(struct device *dev, struct scatterlist *sglist,
512 dma_addr_t dma_handle = sg->dma_address; 643 dma_addr_t dma_handle = sg->dma_address;
513 unsigned int len = sg->dma_length; 644 unsigned int len = sg->dma_length;
514 unsigned long npages; 645 unsigned long npages;
515 struct iommu_map_table *tbl = &iommu->tbl; 646 struct iommu_map_table *tbl;
516 unsigned long shift = IO_PAGE_SHIFT; 647 unsigned long shift = IO_PAGE_SHIFT;
517 648
518 if (!len) 649 if (!len)
519 break; 650 break;
520 npages = iommu_num_pages(dma_handle, len, IO_PAGE_SIZE); 651 npages = iommu_num_pages(dma_handle, len, IO_PAGE_SIZE);
652
653 if (dma_handle <= DMA_BIT_MASK(32)) {
654 iotsb_num = 0; /* we don't care for legacy iommu */
655 tbl = &iommu->tbl;
656 } else {
657 iotsb_num = atu->iotsb->iotsb_num;
658 tbl = &atu->tbl;
659 }
521 entry = ((dma_handle - tbl->table_map_base) >> shift); 660 entry = ((dma_handle - tbl->table_map_base) >> shift);
522 dma_4v_iommu_demap(&devhandle, entry, npages); 661 dma_4v_iommu_demap(dev, devhandle, dma_handle, iotsb_num,
523 iommu_tbl_range_free(&iommu->tbl, dma_handle, npages, 662 entry, npages);
663 iommu_tbl_range_free(tbl, dma_handle, npages,
524 IOMMU_ERROR_CODE); 664 IOMMU_ERROR_CODE);
525 sg = sg_next(sg); 665 sg = sg_next(sg);
526 } 666 }
@@ -581,6 +721,132 @@ static unsigned long probe_existing_entries(struct pci_pbm_info *pbm,
581 return cnt; 721 return cnt;
582} 722}
583 723
724static int pci_sun4v_atu_alloc_iotsb(struct pci_pbm_info *pbm)
725{
726 struct atu *atu = pbm->iommu->atu;
727 struct atu_iotsb *iotsb;
728 void *table;
729 u64 table_size;
730 u64 iotsb_num;
731 unsigned long order;
732 unsigned long err;
733
734 iotsb = kzalloc(sizeof(*iotsb), GFP_KERNEL);
735 if (!iotsb) {
736 err = -ENOMEM;
737 goto out_err;
738 }
739 atu->iotsb = iotsb;
740
741 /* calculate size of IOTSB */
742 table_size = (atu->size / IO_PAGE_SIZE) * 8;
743 order = get_order(table_size);
744 table = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, order);
745 if (!table) {
746 err = -ENOMEM;
747 goto table_failed;
748 }
749 iotsb->table = table;
750 iotsb->ra = __pa(table);
751 iotsb->dvma_size = atu->size;
752 iotsb->dvma_base = atu->base;
753 iotsb->table_size = table_size;
754 iotsb->page_size = IO_PAGE_SIZE;
755
756 /* configure and register IOTSB with HV */
757 err = pci_sun4v_iotsb_conf(pbm->devhandle,
758 iotsb->ra,
759 iotsb->table_size,
760 iotsb->page_size,
761 iotsb->dvma_base,
762 &iotsb_num);
763 if (err) {
764 pr_err(PFX "pci_iotsb_conf failed error: %ld\n", err);
765 goto iotsb_conf_failed;
766 }
767 iotsb->iotsb_num = iotsb_num;
768
769 err = dma_4v_iotsb_bind(pbm->devhandle, iotsb_num, pbm->pci_bus);
770 if (err) {
771 pr_err(PFX "pci_iotsb_bind failed error: %ld\n", err);
772 goto iotsb_conf_failed;
773 }
774
775 return 0;
776
777iotsb_conf_failed:
778 free_pages((unsigned long)table, order);
779table_failed:
780 kfree(iotsb);
781out_err:
782 return err;
783}
784
785static int pci_sun4v_atu_init(struct pci_pbm_info *pbm)
786{
787 struct atu *atu = pbm->iommu->atu;
788 unsigned long err;
789 const u64 *ranges;
790 u64 map_size, num_iotte;
791 u64 dma_mask;
792 const u32 *page_size;
793 int len;
794
795 ranges = of_get_property(pbm->op->dev.of_node, "iommu-address-ranges",
796 &len);
797 if (!ranges) {
798 pr_err(PFX "No iommu-address-ranges\n");
799 return -EINVAL;
800 }
801
802 page_size = of_get_property(pbm->op->dev.of_node, "iommu-pagesizes",
803 NULL);
804 if (!page_size) {
805 pr_err(PFX "No iommu-pagesizes\n");
806 return -EINVAL;
807 }
808
809 /* There are 4 iommu-address-ranges supported. Each range is pair of
810 * {base, size}. The ranges[0] and ranges[1] are 32bit address space
811 * while ranges[2] and ranges[3] are 64bit space. We want to use 64bit
812 * address ranges to support 64bit addressing. Because 'size' for
813 * address ranges[2] and ranges[3] are same we can select either of
814 * ranges[2] or ranges[3] for mapping. However due to 'size' is too
815 * large for OS to allocate IOTSB we are using fix size 32G
816 * (ATU_64_SPACE_SIZE) which is more than enough for all PCIe devices
817 * to share.
818 */
819 atu->ranges = (struct atu_ranges *)ranges;
820 atu->base = atu->ranges[3].base;
821 atu->size = ATU_64_SPACE_SIZE;
822
823 /* Create IOTSB */
824 err = pci_sun4v_atu_alloc_iotsb(pbm);
825 if (err) {
826 pr_err(PFX "Error creating ATU IOTSB\n");
827 return err;
828 }
829
830 /* Create ATU iommu map.
831 * One bit represents one iotte in IOTSB table.
832 */
833 dma_mask = (roundup_pow_of_two(atu->size) - 1UL);
834 num_iotte = atu->size / IO_PAGE_SIZE;
835 map_size = num_iotte / 8;
836 atu->tbl.table_map_base = atu->base;
837 atu->dma_addr_mask = dma_mask;
838 atu->tbl.map = kzalloc(map_size, GFP_KERNEL);
839 if (!atu->tbl.map)
840 return -ENOMEM;
841
842 iommu_tbl_pool_init(&atu->tbl, num_iotte, IO_PAGE_SHIFT,
843 NULL, false /* no large_pool */,
844 0 /* default npools */,
845 false /* want span boundary checking */);
846
847 return 0;
848}
849
584static int pci_sun4v_iommu_init(struct pci_pbm_info *pbm) 850static int pci_sun4v_iommu_init(struct pci_pbm_info *pbm)
585{ 851{
586 static const u32 vdma_default[] = { 0x80000000, 0x80000000 }; 852 static const u32 vdma_default[] = { 0x80000000, 0x80000000 };
@@ -918,6 +1184,18 @@ static int pci_sun4v_pbm_init(struct pci_pbm_info *pbm,
918 1184
919 pci_sun4v_scan_bus(pbm, &op->dev); 1185 pci_sun4v_scan_bus(pbm, &op->dev);
920 1186
1187 /* if atu_init fails its not complete failure.
1188 * we can still continue using legacy iommu.
1189 */
1190 if (pbm->iommu->atu) {
1191 err = pci_sun4v_atu_init(pbm);
1192 if (err) {
1193 kfree(pbm->iommu->atu);
1194 pbm->iommu->atu = NULL;
1195 pr_err(PFX "ATU init failed, err=%d\n", err);
1196 }
1197 }
1198
921 pbm->next = pci_pbm_root; 1199 pbm->next = pci_pbm_root;
922 pci_pbm_root = pbm; 1200 pci_pbm_root = pbm;
923 1201
@@ -931,8 +1209,10 @@ static int pci_sun4v_probe(struct platform_device *op)
931 struct pci_pbm_info *pbm; 1209 struct pci_pbm_info *pbm;
932 struct device_node *dp; 1210 struct device_node *dp;
933 struct iommu *iommu; 1211 struct iommu *iommu;
1212 struct atu *atu;
934 u32 devhandle; 1213 u32 devhandle;
935 int i, err = -ENODEV; 1214 int i, err = -ENODEV;
1215 static bool hv_atu = true;
936 1216
937 dp = op->dev.of_node; 1217 dp = op->dev.of_node;
938 1218
@@ -954,6 +1234,19 @@ static int pci_sun4v_probe(struct platform_device *op)
954 pr_info(PFX "Registered hvapi major[%lu] minor[%lu]\n", 1234 pr_info(PFX "Registered hvapi major[%lu] minor[%lu]\n",
955 vpci_major, vpci_minor); 1235 vpci_major, vpci_minor);
956 1236
1237 err = sun4v_hvapi_register(HV_GRP_ATU, vatu_major, &vatu_minor);
1238 if (err) {
1239 /* don't return an error if we fail to register the
1240 * ATU group, but ATU hcalls won't be available.
1241 */
1242 hv_atu = false;
1243 pr_err(PFX "Could not register hvapi ATU err=%d\n",
1244 err);
1245 } else {
1246 pr_info(PFX "Registered hvapi ATU major[%lu] minor[%lu]\n",
1247 vatu_major, vatu_minor);
1248 }
1249
957 dma_ops = &sun4v_dma_ops; 1250 dma_ops = &sun4v_dma_ops;
958 } 1251 }
959 1252
@@ -991,6 +1284,14 @@ static int pci_sun4v_probe(struct platform_device *op)
991 } 1284 }
992 1285
993 pbm->iommu = iommu; 1286 pbm->iommu = iommu;
1287 iommu->atu = NULL;
1288 if (hv_atu) {
1289 atu = kzalloc(sizeof(*atu), GFP_KERNEL);
1290 if (!atu)
1291 pr_err(PFX "Could not allocate atu\n");
1292 else
1293 iommu->atu = atu;
1294 }
994 1295
995 err = pci_sun4v_pbm_init(pbm, op, devhandle); 1296 err = pci_sun4v_pbm_init(pbm, op, devhandle);
996 if (err) 1297 if (err)
@@ -1001,6 +1302,7 @@ static int pci_sun4v_probe(struct platform_device *op)
1001 return 0; 1302 return 0;
1002 1303
1003out_free_iommu: 1304out_free_iommu:
1305 kfree(iommu->atu);
1004 kfree(pbm->iommu); 1306 kfree(pbm->iommu);
1005 1307
1006out_free_controller: 1308out_free_controller:
diff --git a/arch/sparc/kernel/pci_sun4v.h b/arch/sparc/kernel/pci_sun4v.h
index 5642212390b2..22603a4e48bf 100644
--- a/arch/sparc/kernel/pci_sun4v.h
+++ b/arch/sparc/kernel/pci_sun4v.h
@@ -89,4 +89,25 @@ unsigned long pci_sun4v_msg_setvalid(unsigned long devhandle,
89 unsigned long msinum, 89 unsigned long msinum,
90 unsigned long valid); 90 unsigned long valid);
91 91
92/* Sun4v HV IOMMU v2 APIs */
93unsigned long pci_sun4v_iotsb_conf(unsigned long devhandle,
94 unsigned long ra,
95 unsigned long table_size,
96 unsigned long page_size,
97 unsigned long dvma_base,
98 u64 *iotsb_num);
99unsigned long pci_sun4v_iotsb_bind(unsigned long devhandle,
100 unsigned long iotsb_num,
101 unsigned int pci_device);
102unsigned long pci_sun4v_iotsb_map(unsigned long devhandle,
103 unsigned long iotsb_num,
104 unsigned long iotsb_index_iottes,
105 unsigned long io_attributes,
106 unsigned long io_page_list_pa,
107 long *mapped);
108unsigned long pci_sun4v_iotsb_demap(unsigned long devhandle,
109 unsigned long iotsb_num,
110 unsigned long iotsb_index,
111 unsigned long iottes,
112 unsigned long *demapped);
92#endif /* !(_PCI_SUN4V_H) */ 113#endif /* !(_PCI_SUN4V_H) */
diff --git a/arch/sparc/kernel/pci_sun4v_asm.S b/arch/sparc/kernel/pci_sun4v_asm.S
index e606d46c6815..578f09657916 100644
--- a/arch/sparc/kernel/pci_sun4v_asm.S
+++ b/arch/sparc/kernel/pci_sun4v_asm.S
@@ -360,3 +360,71 @@ ENTRY(pci_sun4v_msg_setvalid)
360 mov %o0, %o0 360 mov %o0, %o0
361ENDPROC(pci_sun4v_msg_setvalid) 361ENDPROC(pci_sun4v_msg_setvalid)
362 362
363 /*
364 * %o0: devhandle
365 * %o1: r_addr
366 * %o2: size
367 * %o3: pagesize
368 * %o4: virt
369 * %o5: &iotsb_num/&iotsb_handle
370 *
371 * returns %o0: status
372 * %o1: iotsb_num/iotsb_handle
373 */
374ENTRY(pci_sun4v_iotsb_conf)
375 mov %o5, %g1
376 mov HV_FAST_PCI_IOTSB_CONF, %o5
377 ta HV_FAST_TRAP
378 retl
379 stx %o1, [%g1]
380ENDPROC(pci_sun4v_iotsb_conf)
381
382 /*
383 * %o0: devhandle
384 * %o1: iotsb_num/iotsb_handle
385 * %o2: pci_device
386 *
387 * returns %o0: status
388 */
389ENTRY(pci_sun4v_iotsb_bind)
390 mov HV_FAST_PCI_IOTSB_BIND, %o5
391 ta HV_FAST_TRAP
392 retl
393 nop
394ENDPROC(pci_sun4v_iotsb_bind)
395
396 /*
397 * %o0: devhandle
398 * %o1: iotsb_num/iotsb_handle
399 * %o2: index_count
400 * %o3: iotte_attributes
401 * %o4: io_page_list_p
402 * %o5: &mapped
403 *
404 * returns %o0: status
405 * %o1: #mapped
406 */
407ENTRY(pci_sun4v_iotsb_map)
408 mov %o5, %g1
409 mov HV_FAST_PCI_IOTSB_MAP, %o5
410 ta HV_FAST_TRAP
411 retl
412 stx %o1, [%g1]
413ENDPROC(pci_sun4v_iotsb_map)
414
415 /*
416 * %o0: devhandle
417 * %o1: iotsb_num/iotsb_handle
418 * %o2: iotsb_index
419 * %o3: #iottes
420 * %o4: &demapped
421 *
422 * returns %o0: status
423 * %o1: #demapped
424 */
425ENTRY(pci_sun4v_iotsb_demap)
426 mov HV_FAST_PCI_IOTSB_DEMAP, %o5
427 ta HV_FAST_TRAP
428 retl
429 stx %o1, [%o4]
430ENDPROC(pci_sun4v_iotsb_demap)
diff --git a/arch/sparc/kernel/signal_32.c b/arch/sparc/kernel/signal_32.c
index c3c12efe0bc0..9c0c8fd0b292 100644
--- a/arch/sparc/kernel/signal_32.c
+++ b/arch/sparc/kernel/signal_32.c
@@ -89,7 +89,7 @@ asmlinkage void do_sigreturn(struct pt_regs *regs)
89 sf = (struct signal_frame __user *) regs->u_regs[UREG_FP]; 89 sf = (struct signal_frame __user *) regs->u_regs[UREG_FP];
90 90
91 /* 1. Make sure we are not getting garbage from the user */ 91 /* 1. Make sure we are not getting garbage from the user */
92 if (!invalid_frame_pointer(sf, sizeof(*sf))) 92 if (invalid_frame_pointer(sf, sizeof(*sf)))
93 goto segv_and_exit; 93 goto segv_and_exit;
94 94
95 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP])) 95 if (get_user(ufp, &sf->info.si_regs.u_regs[UREG_FP]))
@@ -150,7 +150,7 @@ asmlinkage void do_rt_sigreturn(struct pt_regs *regs)
150 150
151 synchronize_user_stack(); 151 synchronize_user_stack();
152 sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP]; 152 sf = (struct rt_signal_frame __user *) regs->u_regs[UREG_FP];
153 if (!invalid_frame_pointer(sf, sizeof(*sf))) 153 if (invalid_frame_pointer(sf, sizeof(*sf)))
154 goto segv; 154 goto segv;
155 155
156 if (get_user(ufp, &sf->regs.u_regs[UREG_FP])) 156 if (get_user(ufp, &sf->regs.u_regs[UREG_FP]))
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c
index 439784b7b7ac..37aa537b3ad8 100644
--- a/arch/sparc/mm/init_64.c
+++ b/arch/sparc/mm/init_64.c
@@ -802,8 +802,10 @@ struct mdesc_mblock {
802}; 802};
803static struct mdesc_mblock *mblocks; 803static struct mdesc_mblock *mblocks;
804static int num_mblocks; 804static int num_mblocks;
805static int find_numa_node_for_addr(unsigned long pa,
806 struct node_mem_mask *pnode_mask);
805 807
806static unsigned long ra_to_pa(unsigned long addr) 808static unsigned long __init ra_to_pa(unsigned long addr)
807{ 809{
808 int i; 810 int i;
809 811
@@ -819,8 +821,11 @@ static unsigned long ra_to_pa(unsigned long addr)
819 return addr; 821 return addr;
820} 822}
821 823
822static int find_node(unsigned long addr) 824static int __init find_node(unsigned long addr)
823{ 825{
826 static bool search_mdesc = true;
827 static struct node_mem_mask last_mem_mask = { ~0UL, ~0UL };
828 static int last_index;
824 int i; 829 int i;
825 830
826 addr = ra_to_pa(addr); 831 addr = ra_to_pa(addr);
@@ -830,13 +835,30 @@ static int find_node(unsigned long addr)
830 if ((addr & p->mask) == p->val) 835 if ((addr & p->mask) == p->val)
831 return i; 836 return i;
832 } 837 }
833 /* The following condition has been observed on LDOM guests.*/ 838 /* The following condition has been observed on LDOM guests because
834 WARN_ONCE(1, "find_node: A physical address doesn't match a NUMA node" 839 * node_masks only contains the best latency mask and value.
835 " rule. Some physical memory will be owned by node 0."); 840 * LDOM guest's mdesc can contain a single latency group to
836 return 0; 841 * cover multiple address range. Print warning message only if the
842 * address cannot be found in node_masks nor mdesc.
843 */
844 if ((search_mdesc) &&
845 ((addr & last_mem_mask.mask) != last_mem_mask.val)) {
846 /* find the available node in the mdesc */
847 last_index = find_numa_node_for_addr(addr, &last_mem_mask);
848 numadbg("find_node: latency group for address 0x%lx is %d\n",
849 addr, last_index);
850 if ((last_index < 0) || (last_index >= num_node_masks)) {
851 /* WARN_ONCE() and use default group 0 */
852 WARN_ONCE(1, "find_node: A physical address doesn't match a NUMA node rule. Some physical memory will be owned by node 0.");
853 search_mdesc = false;
854 last_index = 0;
855 }
856 }
857
858 return last_index;
837} 859}
838 860
839static u64 memblock_nid_range(u64 start, u64 end, int *nid) 861static u64 __init memblock_nid_range(u64 start, u64 end, int *nid)
840{ 862{
841 *nid = find_node(start); 863 *nid = find_node(start);
842 start += PAGE_SIZE; 864 start += PAGE_SIZE;
@@ -1160,6 +1182,41 @@ int __node_distance(int from, int to)
1160 return numa_latency[from][to]; 1182 return numa_latency[from][to];
1161} 1183}
1162 1184
1185static int find_numa_node_for_addr(unsigned long pa,
1186 struct node_mem_mask *pnode_mask)
1187{
1188 struct mdesc_handle *md = mdesc_grab();
1189 u64 node, arc;
1190 int i = 0;
1191
1192 node = mdesc_node_by_name(md, MDESC_NODE_NULL, "latency-groups");
1193 if (node == MDESC_NODE_NULL)
1194 goto out;
1195
1196 mdesc_for_each_node_by_name(md, node, "group") {
1197 mdesc_for_each_arc(arc, md, node, MDESC_ARC_TYPE_FWD) {
1198 u64 target = mdesc_arc_target(md, arc);
1199 struct mdesc_mlgroup *m = find_mlgroup(target);
1200
1201 if (!m)
1202 continue;
1203 if ((pa & m->mask) == m->match) {
1204 if (pnode_mask) {
1205 pnode_mask->mask = m->mask;
1206 pnode_mask->val = m->match;
1207 }
1208 mdesc_release(md);
1209 return i;
1210 }
1211 }
1212 i++;
1213 }
1214
1215out:
1216 mdesc_release(md);
1217 return -1;
1218}
1219
1163static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp) 1220static int __init find_best_numa_node_for_mlgroup(struct mdesc_mlgroup *grp)
1164{ 1221{
1165 int i; 1222 int i;
diff --git a/arch/tile/include/asm/cache.h b/arch/tile/include/asm/cache.h
index 6160761d5f61..4810e48dbbbf 100644
--- a/arch/tile/include/asm/cache.h
+++ b/arch/tile/include/asm/cache.h
@@ -61,4 +61,7 @@
61 */ 61 */
62#define __write_once __read_mostly 62#define __write_once __read_mostly
63 63
64/* __ro_after_init is the generic name for the tile arch __write_once. */
65#define __ro_after_init __read_mostly
66
64#endif /* _ASM_TILE_CACHE_H */ 67#endif /* _ASM_TILE_CACHE_H */
diff --git a/arch/tile/kernel/time.c b/arch/tile/kernel/time.c
index 178989e6d3e3..ea960d660917 100644
--- a/arch/tile/kernel/time.c
+++ b/arch/tile/kernel/time.c
@@ -218,8 +218,8 @@ void do_timer_interrupt(struct pt_regs *regs, int fault_num)
218 */ 218 */
219unsigned long long sched_clock(void) 219unsigned long long sched_clock(void)
220{ 220{
221 return clocksource_cyc2ns(get_cycles(), 221 return mult_frac(get_cycles(),
222 sched_clock_mult, SCHED_CLOCK_SHIFT); 222 sched_clock_mult, 1ULL << SCHED_CLOCK_SHIFT);
223} 223}
224 224
225int setup_profiling_timer(unsigned int multiplier) 225int setup_profiling_timer(unsigned int multiplier)
diff --git a/arch/x86/boot/compressed/Makefile b/arch/x86/boot/compressed/Makefile
index 536ccfcc01c6..34d9e15857c3 100644
--- a/arch/x86/boot/compressed/Makefile
+++ b/arch/x86/boot/compressed/Makefile
@@ -40,8 +40,8 @@ GCOV_PROFILE := n
40UBSAN_SANITIZE :=n 40UBSAN_SANITIZE :=n
41 41
42LDFLAGS := -m elf_$(UTS_MACHINE) 42LDFLAGS := -m elf_$(UTS_MACHINE)
43ifeq ($(CONFIG_RELOCATABLE),y) 43# Compressed kernel should be built as PIE since it may be loaded at any
44# If kernel is relocatable, build compressed kernel as PIE. 44# address by the bootloader.
45ifeq ($(CONFIG_X86_32),y) 45ifeq ($(CONFIG_X86_32),y)
46LDFLAGS += $(call ld-option, -pie) $(call ld-option, --no-dynamic-linker) 46LDFLAGS += $(call ld-option, -pie) $(call ld-option, --no-dynamic-linker)
47else 47else
@@ -51,7 +51,6 @@ else
51LDFLAGS += $(shell $(LD) --help 2>&1 | grep -q "\-z noreloc-overflow" \ 51LDFLAGS += $(shell $(LD) --help 2>&1 | grep -q "\-z noreloc-overflow" \
52 && echo "-z noreloc-overflow -pie --no-dynamic-linker") 52 && echo "-z noreloc-overflow -pie --no-dynamic-linker")
53endif 53endif
54endif
55LDFLAGS_vmlinux := -T 54LDFLAGS_vmlinux := -T
56 55
57hostprogs-y := mkpiggy 56hostprogs-y := mkpiggy
diff --git a/arch/x86/boot/cpu.c b/arch/x86/boot/cpu.c
index 26240dde081e..4224ede43b4e 100644
--- a/arch/x86/boot/cpu.c
+++ b/arch/x86/boot/cpu.c
@@ -87,6 +87,12 @@ int validate_cpu(void)
87 return -1; 87 return -1;
88 } 88 }
89 89
90 if (CONFIG_X86_MINIMUM_CPU_FAMILY <= 4 && !IS_ENABLED(CONFIG_M486) &&
91 !has_eflag(X86_EFLAGS_ID)) {
92 printf("This kernel requires a CPU with the CPUID instruction. Build with CONFIG_M486=y to run on this CPU.\n");
93 return -1;
94 }
95
90 if (err_flags) { 96 if (err_flags) {
91 puts("This kernel requires the following features " 97 puts("This kernel requires the following features "
92 "not present on the CPU:\n"); 98 "not present on the CPU:\n");
diff --git a/arch/x86/crypto/aesni-intel_glue.c b/arch/x86/crypto/aesni-intel_glue.c
index 0ab5ee1c26af..aa8b0672f87a 100644
--- a/arch/x86/crypto/aesni-intel_glue.c
+++ b/arch/x86/crypto/aesni-intel_glue.c
@@ -888,7 +888,7 @@ static int helper_rfc4106_encrypt(struct aead_request *req)
888 unsigned long auth_tag_len = crypto_aead_authsize(tfm); 888 unsigned long auth_tag_len = crypto_aead_authsize(tfm);
889 u8 iv[16] __attribute__ ((__aligned__(AESNI_ALIGN))); 889 u8 iv[16] __attribute__ ((__aligned__(AESNI_ALIGN)));
890 struct scatter_walk src_sg_walk; 890 struct scatter_walk src_sg_walk;
891 struct scatter_walk dst_sg_walk; 891 struct scatter_walk dst_sg_walk = {};
892 unsigned int i; 892 unsigned int i;
893 893
894 /* Assuming we are supporting rfc4106 64-bit extended */ 894 /* Assuming we are supporting rfc4106 64-bit extended */
@@ -968,7 +968,7 @@ static int helper_rfc4106_decrypt(struct aead_request *req)
968 u8 iv[16] __attribute__ ((__aligned__(AESNI_ALIGN))); 968 u8 iv[16] __attribute__ ((__aligned__(AESNI_ALIGN)));
969 u8 authTag[16]; 969 u8 authTag[16];
970 struct scatter_walk src_sg_walk; 970 struct scatter_walk src_sg_walk;
971 struct scatter_walk dst_sg_walk; 971 struct scatter_walk dst_sg_walk = {};
972 unsigned int i; 972 unsigned int i;
973 973
974 if (unlikely(req->assoclen != 16 && req->assoclen != 20)) 974 if (unlikely(req->assoclen != 16 && req->assoclen != 20))
diff --git a/arch/x86/events/amd/core.c b/arch/x86/events/amd/core.c
index f5f4b3fbbbc2..afb222b63cae 100644
--- a/arch/x86/events/amd/core.c
+++ b/arch/x86/events/amd/core.c
@@ -662,7 +662,13 @@ static int __init amd_core_pmu_init(void)
662 pr_cont("Fam15h "); 662 pr_cont("Fam15h ");
663 x86_pmu.get_event_constraints = amd_get_event_constraints_f15h; 663 x86_pmu.get_event_constraints = amd_get_event_constraints_f15h;
664 break; 664 break;
665 665 case 0x17:
666 pr_cont("Fam17h ");
667 /*
668 * In family 17h, there are no event constraints in the PMC hardware.
669 * We fallback to using default amd_get_event_constraints.
670 */
671 break;
666 default: 672 default:
667 pr_err("core perfctr but no constraints; unknown hardware!\n"); 673 pr_err("core perfctr but no constraints; unknown hardware!\n");
668 return -ENODEV; 674 return -ENODEV;
diff --git a/arch/x86/events/core.c b/arch/x86/events/core.c
index d31735f37ed7..6e395c996900 100644
--- a/arch/x86/events/core.c
+++ b/arch/x86/events/core.c
@@ -69,7 +69,7 @@ u64 x86_perf_event_update(struct perf_event *event)
69 int shift = 64 - x86_pmu.cntval_bits; 69 int shift = 64 - x86_pmu.cntval_bits;
70 u64 prev_raw_count, new_raw_count; 70 u64 prev_raw_count, new_raw_count;
71 int idx = hwc->idx; 71 int idx = hwc->idx;
72 s64 delta; 72 u64 delta;
73 73
74 if (idx == INTEL_PMC_IDX_FIXED_BTS) 74 if (idx == INTEL_PMC_IDX_FIXED_BTS)
75 return 0; 75 return 0;
@@ -2352,7 +2352,7 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
2352 frame.next_frame = 0; 2352 frame.next_frame = 0;
2353 frame.return_address = 0; 2353 frame.return_address = 0;
2354 2354
2355 if (!access_ok(VERIFY_READ, fp, 8)) 2355 if (!valid_user_frame(fp, sizeof(frame)))
2356 break; 2356 break;
2357 2357
2358 bytes = __copy_from_user_nmi(&frame.next_frame, fp, 4); 2358 bytes = __copy_from_user_nmi(&frame.next_frame, fp, 4);
@@ -2362,9 +2362,6 @@ perf_callchain_user32(struct pt_regs *regs, struct perf_callchain_entry_ctx *ent
2362 if (bytes != 0) 2362 if (bytes != 0)
2363 break; 2363 break;
2364 2364
2365 if (!valid_user_frame(fp, sizeof(frame)))
2366 break;
2367
2368 perf_callchain_store(entry, cs_base + frame.return_address); 2365 perf_callchain_store(entry, cs_base + frame.return_address);
2369 fp = compat_ptr(ss_base + frame.next_frame); 2366 fp = compat_ptr(ss_base + frame.next_frame);
2370 } 2367 }
@@ -2413,7 +2410,7 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
2413 frame.next_frame = NULL; 2410 frame.next_frame = NULL;
2414 frame.return_address = 0; 2411 frame.return_address = 0;
2415 2412
2416 if (!access_ok(VERIFY_READ, fp, sizeof(*fp) * 2)) 2413 if (!valid_user_frame(fp, sizeof(frame)))
2417 break; 2414 break;
2418 2415
2419 bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp)); 2416 bytes = __copy_from_user_nmi(&frame.next_frame, fp, sizeof(*fp));
@@ -2423,9 +2420,6 @@ perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs
2423 if (bytes != 0) 2420 if (bytes != 0)
2424 break; 2421 break;
2425 2422
2426 if (!valid_user_frame(fp, sizeof(frame)))
2427 break;
2428
2429 perf_callchain_store(entry, frame.return_address); 2423 perf_callchain_store(entry, frame.return_address);
2430 fp = (void __user *)frame.next_frame; 2424 fp = (void __user *)frame.next_frame;
2431 } 2425 }
diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index a74a2dbc0180..cb8522290e6a 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -4034,7 +4034,7 @@ __init int intel_pmu_init(void)
4034 4034
4035 /* Support full width counters using alternative MSR range */ 4035 /* Support full width counters using alternative MSR range */
4036 if (x86_pmu.intel_cap.full_width_write) { 4036 if (x86_pmu.intel_cap.full_width_write) {
4037 x86_pmu.max_period = x86_pmu.cntval_mask; 4037 x86_pmu.max_period = x86_pmu.cntval_mask >> 1;
4038 x86_pmu.perfctr = MSR_IA32_PMC0; 4038 x86_pmu.perfctr = MSR_IA32_PMC0;
4039 pr_cont("full-width counters, "); 4039 pr_cont("full-width counters, ");
4040 } 4040 }
diff --git a/arch/x86/events/intel/cstate.c b/arch/x86/events/intel/cstate.c
index 4f5ac726335f..da51e5a3e2ff 100644
--- a/arch/x86/events/intel/cstate.c
+++ b/arch/x86/events/intel/cstate.c
@@ -540,6 +540,7 @@ static const struct x86_cpu_id intel_cstates_match[] __initconst = {
540 X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_DESKTOP, snb_cstates), 540 X86_CSTATES_MODEL(INTEL_FAM6_SKYLAKE_DESKTOP, snb_cstates),
541 541
542 X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNL, knl_cstates), 542 X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNL, knl_cstates),
543 X86_CSTATES_MODEL(INTEL_FAM6_XEON_PHI_KNM, knl_cstates),
543 { }, 544 { },
544}; 545};
545MODULE_DEVICE_TABLE(x86cpu, intel_cstates_match); 546MODULE_DEVICE_TABLE(x86cpu, intel_cstates_match);
diff --git a/arch/x86/events/intel/ds.c b/arch/x86/events/intel/ds.c
index 0319311dbdbb..be202390bbd3 100644
--- a/arch/x86/events/intel/ds.c
+++ b/arch/x86/events/intel/ds.c
@@ -1108,20 +1108,20 @@ static void setup_pebs_sample_data(struct perf_event *event,
1108 } 1108 }
1109 1109
1110 /* 1110 /*
1111 * We use the interrupt regs as a base because the PEBS record 1111 * We use the interrupt regs as a base because the PEBS record does not
1112 * does not contain a full regs set, specifically it seems to 1112 * contain a full regs set, specifically it seems to lack segment
1113 * lack segment descriptors, which get used by things like 1113 * descriptors, which get used by things like user_mode().
1114 * user_mode().
1115 * 1114 *
1116 * In the simple case fix up only the IP and BP,SP regs, for 1115 * In the simple case fix up only the IP for PERF_SAMPLE_IP.
1117 * PERF_SAMPLE_IP and PERF_SAMPLE_CALLCHAIN to function properly. 1116 *
1118 * A possible PERF_SAMPLE_REGS will have to transfer all regs. 1117 * We must however always use BP,SP from iregs for the unwinder to stay
1118 * sane; the record BP,SP can point into thin air when the record is
1119 * from a previous PMI context or an (I)RET happend between the record
1120 * and PMI.
1119 */ 1121 */
1120 *regs = *iregs; 1122 *regs = *iregs;
1121 regs->flags = pebs->flags; 1123 regs->flags = pebs->flags;
1122 set_linear_ip(regs, pebs->ip); 1124 set_linear_ip(regs, pebs->ip);
1123 regs->bp = pebs->bp;
1124 regs->sp = pebs->sp;
1125 1125
1126 if (sample_type & PERF_SAMPLE_REGS_INTR) { 1126 if (sample_type & PERF_SAMPLE_REGS_INTR) {
1127 regs->ax = pebs->ax; 1127 regs->ax = pebs->ax;
@@ -1130,10 +1130,21 @@ static void setup_pebs_sample_data(struct perf_event *event,
1130 regs->dx = pebs->dx; 1130 regs->dx = pebs->dx;
1131 regs->si = pebs->si; 1131 regs->si = pebs->si;
1132 regs->di = pebs->di; 1132 regs->di = pebs->di;
1133 regs->bp = pebs->bp;
1134 regs->sp = pebs->sp;
1135 1133
1136 regs->flags = pebs->flags; 1134 /*
1135 * Per the above; only set BP,SP if we don't need callchains.
1136 *
1137 * XXX: does this make sense?
1138 */
1139 if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) {
1140 regs->bp = pebs->bp;
1141 regs->sp = pebs->sp;
1142 }
1143
1144 /*
1145 * Preserve PERF_EFLAGS_VM from set_linear_ip().
1146 */
1147 regs->flags = pebs->flags | (regs->flags & PERF_EFLAGS_VM);
1137#ifndef CONFIG_X86_32 1148#ifndef CONFIG_X86_32
1138 regs->r8 = pebs->r8; 1149 regs->r8 = pebs->r8;
1139 regs->r9 = pebs->r9; 1150 regs->r9 = pebs->r9;
diff --git a/arch/x86/events/intel/uncore.c b/arch/x86/events/intel/uncore.c
index efca2685d876..dbaaf7dc8373 100644
--- a/arch/x86/events/intel/uncore.c
+++ b/arch/x86/events/intel/uncore.c
@@ -319,9 +319,9 @@ static struct intel_uncore_box *uncore_alloc_box(struct intel_uncore_type *type,
319 */ 319 */
320static int uncore_pmu_event_init(struct perf_event *event); 320static int uncore_pmu_event_init(struct perf_event *event);
321 321
322static bool is_uncore_event(struct perf_event *event) 322static bool is_box_event(struct intel_uncore_box *box, struct perf_event *event)
323{ 323{
324 return event->pmu->event_init == uncore_pmu_event_init; 324 return &box->pmu->pmu == event->pmu;
325} 325}
326 326
327static int 327static int
@@ -340,7 +340,7 @@ uncore_collect_events(struct intel_uncore_box *box, struct perf_event *leader,
340 340
341 n = box->n_events; 341 n = box->n_events;
342 342
343 if (is_uncore_event(leader)) { 343 if (is_box_event(box, leader)) {
344 box->event_list[n] = leader; 344 box->event_list[n] = leader;
345 n++; 345 n++;
346 } 346 }
@@ -349,7 +349,7 @@ uncore_collect_events(struct intel_uncore_box *box, struct perf_event *leader,
349 return n; 349 return n;
350 350
351 list_for_each_entry(event, &leader->sibling_list, group_entry) { 351 list_for_each_entry(event, &leader->sibling_list, group_entry) {
352 if (!is_uncore_event(event) || 352 if (!is_box_event(box, event) ||
353 event->state <= PERF_EVENT_STATE_OFF) 353 event->state <= PERF_EVENT_STATE_OFF)
354 continue; 354 continue;
355 355
diff --git a/arch/x86/events/intel/uncore_snb.c b/arch/x86/events/intel/uncore_snb.c
index 5f845eef9a4d..a3dcc12bef4a 100644
--- a/arch/x86/events/intel/uncore_snb.c
+++ b/arch/x86/events/intel/uncore_snb.c
@@ -8,8 +8,12 @@
8#define PCI_DEVICE_ID_INTEL_HSW_IMC 0x0c00 8#define PCI_DEVICE_ID_INTEL_HSW_IMC 0x0c00
9#define PCI_DEVICE_ID_INTEL_HSW_U_IMC 0x0a04 9#define PCI_DEVICE_ID_INTEL_HSW_U_IMC 0x0a04
10#define PCI_DEVICE_ID_INTEL_BDW_IMC 0x1604 10#define PCI_DEVICE_ID_INTEL_BDW_IMC 0x1604
11#define PCI_DEVICE_ID_INTEL_SKL_IMC 0x191f 11#define PCI_DEVICE_ID_INTEL_SKL_U_IMC 0x1904
12#define PCI_DEVICE_ID_INTEL_SKL_U_IMC 0x190c 12#define PCI_DEVICE_ID_INTEL_SKL_Y_IMC 0x190c
13#define PCI_DEVICE_ID_INTEL_SKL_HD_IMC 0x1900
14#define PCI_DEVICE_ID_INTEL_SKL_HQ_IMC 0x1910
15#define PCI_DEVICE_ID_INTEL_SKL_SD_IMC 0x190f
16#define PCI_DEVICE_ID_INTEL_SKL_SQ_IMC 0x191f
13 17
14/* SNB event control */ 18/* SNB event control */
15#define SNB_UNC_CTL_EV_SEL_MASK 0x000000ff 19#define SNB_UNC_CTL_EV_SEL_MASK 0x000000ff
@@ -486,24 +490,12 @@ static int snb_uncore_imc_event_add(struct perf_event *event, int flags)
486 490
487 snb_uncore_imc_event_start(event, 0); 491 snb_uncore_imc_event_start(event, 0);
488 492
489 box->n_events++;
490
491 return 0; 493 return 0;
492} 494}
493 495
494static void snb_uncore_imc_event_del(struct perf_event *event, int flags) 496static void snb_uncore_imc_event_del(struct perf_event *event, int flags)
495{ 497{
496 struct intel_uncore_box *box = uncore_event_to_box(event);
497 int i;
498
499 snb_uncore_imc_event_stop(event, PERF_EF_UPDATE); 498 snb_uncore_imc_event_stop(event, PERF_EF_UPDATE);
500
501 for (i = 0; i < box->n_events; i++) {
502 if (event == box->event_list[i]) {
503 --box->n_events;
504 break;
505 }
506 }
507} 499}
508 500
509int snb_pci2phy_map_init(int devid) 501int snb_pci2phy_map_init(int devid)
@@ -616,13 +608,29 @@ static const struct pci_device_id bdw_uncore_pci_ids[] = {
616 608
617static const struct pci_device_id skl_uncore_pci_ids[] = { 609static const struct pci_device_id skl_uncore_pci_ids[] = {
618 { /* IMC */ 610 { /* IMC */
619 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_IMC), 611 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_Y_IMC),
620 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), 612 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
621 }, 613 },
622 { /* IMC */ 614 { /* IMC */
623 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_U_IMC), 615 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_U_IMC),
624 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0), 616 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
625 }, 617 },
618 { /* IMC */
619 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_HD_IMC),
620 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
621 },
622 { /* IMC */
623 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_HQ_IMC),
624 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
625 },
626 { /* IMC */
627 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SD_IMC),
628 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
629 },
630 { /* IMC */
631 PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SQ_IMC),
632 .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
633 },
626 634
627 { /* end: all zeroes */ }, 635 { /* end: all zeroes */ },
628}; 636};
@@ -666,8 +674,12 @@ static const struct imc_uncore_pci_dev desktop_imc_pci_ids[] = {
666 IMC_DEV(HSW_IMC, &hsw_uncore_pci_driver), /* 4th Gen Core Processor */ 674 IMC_DEV(HSW_IMC, &hsw_uncore_pci_driver), /* 4th Gen Core Processor */
667 IMC_DEV(HSW_U_IMC, &hsw_uncore_pci_driver), /* 4th Gen Core ULT Mobile Processor */ 675 IMC_DEV(HSW_U_IMC, &hsw_uncore_pci_driver), /* 4th Gen Core ULT Mobile Processor */
668 IMC_DEV(BDW_IMC, &bdw_uncore_pci_driver), /* 5th Gen Core U */ 676 IMC_DEV(BDW_IMC, &bdw_uncore_pci_driver), /* 5th Gen Core U */
669 IMC_DEV(SKL_IMC, &skl_uncore_pci_driver), /* 6th Gen Core */ 677 IMC_DEV(SKL_Y_IMC, &skl_uncore_pci_driver), /* 6th Gen Core Y */
670 IMC_DEV(SKL_U_IMC, &skl_uncore_pci_driver), /* 6th Gen Core U */ 678 IMC_DEV(SKL_U_IMC, &skl_uncore_pci_driver), /* 6th Gen Core U */
679 IMC_DEV(SKL_HD_IMC, &skl_uncore_pci_driver), /* 6th Gen Core H Dual Core */
680 IMC_DEV(SKL_HQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core H Quad Core */
681 IMC_DEV(SKL_SD_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Dual Core */
682 IMC_DEV(SKL_SQ_IMC, &skl_uncore_pci_driver), /* 6th Gen Core S Quad Core */
671 { /* end marker */ } 683 { /* end marker */ }
672}; 684};
673 685
diff --git a/arch/x86/events/perf_event.h b/arch/x86/events/perf_event.h
index 5874d8de1f8d..a77ee026643d 100644
--- a/arch/x86/events/perf_event.h
+++ b/arch/x86/events/perf_event.h
@@ -113,7 +113,7 @@ struct debug_store {
113 * Per register state. 113 * Per register state.
114 */ 114 */
115struct er_account { 115struct er_account {
116 raw_spinlock_t lock; /* per-core: protect structure */ 116 raw_spinlock_t lock; /* per-core: protect structure */
117 u64 config; /* extra MSR config */ 117 u64 config; /* extra MSR config */
118 u64 reg; /* extra MSR number */ 118 u64 reg; /* extra MSR number */
119 atomic_t ref; /* reference count */ 119 atomic_t ref; /* reference count */
diff --git a/arch/x86/include/asm/compat.h b/arch/x86/include/asm/compat.h
index 03d269bed941..24118c0b4640 100644
--- a/arch/x86/include/asm/compat.h
+++ b/arch/x86/include/asm/compat.h
@@ -272,7 +272,6 @@ struct compat_shmid64_ds {
272/* 272/*
273 * The type of struct elf_prstatus.pr_reg in compatible core dumps. 273 * The type of struct elf_prstatus.pr_reg in compatible core dumps.
274 */ 274 */
275#ifdef CONFIG_X86_X32_ABI
276typedef struct user_regs_struct compat_elf_gregset_t; 275typedef struct user_regs_struct compat_elf_gregset_t;
277 276
278/* Full regset -- prstatus on x32, otherwise on ia32 */ 277/* Full regset -- prstatus on x32, otherwise on ia32 */
@@ -281,10 +280,9 @@ typedef struct user_regs_struct compat_elf_gregset_t;
281 do { *(int *) (((void *) &((S)->pr_reg)) + R) = (V); } \ 280 do { *(int *) (((void *) &((S)->pr_reg)) + R) = (V); } \
282 while (0) 281 while (0)
283 282
283#ifdef CONFIG_X86_X32_ABI
284#define COMPAT_USE_64BIT_TIME \ 284#define COMPAT_USE_64BIT_TIME \
285 (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT)) 285 (!!(task_pt_regs(current)->orig_ax & __X32_SYSCALL_BIT))
286#else
287typedef struct user_regs_struct32 compat_elf_gregset_t;
288#endif 286#endif
289 287
290/* 288/*
diff --git a/arch/x86/include/asm/intel-mid.h b/arch/x86/include/asm/intel-mid.h
index 5b6753d1f7f4..49da9f497b90 100644
--- a/arch/x86/include/asm/intel-mid.h
+++ b/arch/x86/include/asm/intel-mid.h
@@ -17,6 +17,7 @@
17 17
18extern int intel_mid_pci_init(void); 18extern int intel_mid_pci_init(void);
19extern int intel_mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state); 19extern int intel_mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state);
20extern pci_power_t intel_mid_pci_get_power_state(struct pci_dev *pdev);
20 21
21extern void intel_mid_pwr_power_off(void); 22extern void intel_mid_pwr_power_off(void);
22 23
diff --git a/arch/x86/kernel/apic/x2apic_uv_x.c b/arch/x86/kernel/apic/x2apic_uv_x.c
index aeef53ce93e1..35690a168cf7 100644
--- a/arch/x86/kernel/apic/x2apic_uv_x.c
+++ b/arch/x86/kernel/apic/x2apic_uv_x.c
@@ -815,9 +815,9 @@ static __init void map_mmioh_high_uv3(int index, int min_pnode, int max_pnode)
815 l = li; 815 l = li;
816 } 816 }
817 addr1 = (base << shift) + 817 addr1 = (base << shift) +
818 f * (unsigned long)(1 << m_io); 818 f * (1ULL << m_io);
819 addr2 = (base << shift) + 819 addr2 = (base << shift) +
820 (l + 1) * (unsigned long)(1 << m_io); 820 (l + 1) * (1ULL << m_io);
821 pr_info("UV: %s[%03d..%03d] NASID 0x%04x ADDR 0x%016lx - 0x%016lx\n", 821 pr_info("UV: %s[%03d..%03d] NASID 0x%04x ADDR 0x%016lx - 0x%016lx\n",
822 id, fi, li, lnasid, addr1, addr2); 822 id, fi, li, lnasid, addr1, addr2);
823 if (max_io < l) 823 if (max_io < l)
diff --git a/arch/x86/kernel/apm_32.c b/arch/x86/kernel/apm_32.c
index c7364bd633e1..51287cd90bf6 100644
--- a/arch/x86/kernel/apm_32.c
+++ b/arch/x86/kernel/apm_32.c
@@ -1042,8 +1042,11 @@ static int apm_get_power_status(u_short *status, u_short *bat, u_short *life)
1042 1042
1043 if (apm_info.get_power_status_broken) 1043 if (apm_info.get_power_status_broken)
1044 return APM_32_UNSUPPORTED; 1044 return APM_32_UNSUPPORTED;
1045 if (apm_bios_call(&call)) 1045 if (apm_bios_call(&call)) {
1046 if (!call.err)
1047 return APM_NO_ERROR;
1046 return call.err; 1048 return call.err;
1049 }
1047 *status = call.ebx; 1050 *status = call.ebx;
1048 *bat = call.ecx; 1051 *bat = call.ecx;
1049 if (apm_info.get_power_status_swabinminutes) { 1052 if (apm_info.get_power_status_swabinminutes) {
diff --git a/arch/x86/kernel/cpu/amd.c b/arch/x86/kernel/cpu/amd.c
index b81fe2d63e15..1e81a37c034e 100644
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@ -347,7 +347,6 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c)
347#ifdef CONFIG_SMP 347#ifdef CONFIG_SMP
348 unsigned bits; 348 unsigned bits;
349 int cpu = smp_processor_id(); 349 int cpu = smp_processor_id();
350 unsigned int socket_id, core_complex_id;
351 350
352 bits = c->x86_coreid_bits; 351 bits = c->x86_coreid_bits;
353 /* Low order bits define the core id (index of core in socket) */ 352 /* Low order bits define the core id (index of core in socket) */
@@ -365,10 +364,7 @@ static void amd_detect_cmp(struct cpuinfo_x86 *c)
365 if (c->x86 != 0x17 || !cpuid_edx(0x80000006)) 364 if (c->x86 != 0x17 || !cpuid_edx(0x80000006))
366 return; 365 return;
367 366
368 socket_id = (c->apicid >> bits) - 1; 367 per_cpu(cpu_llc_id, cpu) = c->apicid >> 3;
369 core_complex_id = (c->apicid & ((1 << bits) - 1)) >> 3;
370
371 per_cpu(cpu_llc_id, cpu) = (socket_id << 3) | core_complex_id;
372#endif 368#endif
373} 369}
374 370
diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
index 9bd910a7dd0a..cc9e980c68ec 100644
--- a/arch/x86/kernel/cpu/common.c
+++ b/arch/x86/kernel/cpu/common.c
@@ -979,6 +979,35 @@ static void x86_init_cache_qos(struct cpuinfo_x86 *c)
979} 979}
980 980
981/* 981/*
982 * The physical to logical package id mapping is initialized from the
983 * acpi/mptables information. Make sure that CPUID actually agrees with
984 * that.
985 */
986static void sanitize_package_id(struct cpuinfo_x86 *c)
987{
988#ifdef CONFIG_SMP
989 unsigned int pkg, apicid, cpu = smp_processor_id();
990
991 apicid = apic->cpu_present_to_apicid(cpu);
992 pkg = apicid >> boot_cpu_data.x86_coreid_bits;
993
994 if (apicid != c->initial_apicid) {
995 pr_err(FW_BUG "CPU%u: APIC id mismatch. Firmware: %x CPUID: %x\n",
996 cpu, apicid, c->initial_apicid);
997 c->initial_apicid = apicid;
998 }
999 if (pkg != c->phys_proc_id) {
1000 pr_err(FW_BUG "CPU%u: Using firmware package id %u instead of %u\n",
1001 cpu, pkg, c->phys_proc_id);
1002 c->phys_proc_id = pkg;
1003 }
1004 c->logical_proc_id = topology_phys_to_logical_pkg(pkg);
1005#else
1006 c->logical_proc_id = 0;
1007#endif
1008}
1009
1010/*
982 * This does the hard work of actually picking apart the CPU stuff... 1011 * This does the hard work of actually picking apart the CPU stuff...
983 */ 1012 */
984static void identify_cpu(struct cpuinfo_x86 *c) 1013static void identify_cpu(struct cpuinfo_x86 *c)
@@ -1103,8 +1132,7 @@ static void identify_cpu(struct cpuinfo_x86 *c)
1103#ifdef CONFIG_NUMA 1132#ifdef CONFIG_NUMA
1104 numa_add_cpu(smp_processor_id()); 1133 numa_add_cpu(smp_processor_id());
1105#endif 1134#endif
1106 /* The boot/hotplug time assigment got cleared, restore it */ 1135 sanitize_package_id(c);
1107 c->logical_proc_id = topology_phys_to_logical_pkg(c->phys_proc_id);
1108} 1136}
1109 1137
1110/* 1138/*
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index 9b7cf5c28f5f..85f854b98a9d 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -112,7 +112,7 @@ void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
112 for (; stack < stack_info.end; stack++) { 112 for (; stack < stack_info.end; stack++) {
113 unsigned long real_addr; 113 unsigned long real_addr;
114 int reliable = 0; 114 int reliable = 0;
115 unsigned long addr = *stack; 115 unsigned long addr = READ_ONCE_NOCHECK(*stack);
116 unsigned long *ret_addr_p = 116 unsigned long *ret_addr_p =
117 unwind_get_return_address_ptr(&state); 117 unwind_get_return_address_ptr(&state);
118 118
diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c
index 47004010ad5d..ebb4e95fbd74 100644
--- a/arch/x86/kernel/fpu/core.c
+++ b/arch/x86/kernel/fpu/core.c
@@ -521,14 +521,14 @@ void fpu__clear(struct fpu *fpu)
521{ 521{
522 WARN_ON_FPU(fpu != &current->thread.fpu); /* Almost certainly an anomaly */ 522 WARN_ON_FPU(fpu != &current->thread.fpu); /* Almost certainly an anomaly */
523 523
524 if (!use_eager_fpu() || !static_cpu_has(X86_FEATURE_FPU)) { 524 fpu__drop(fpu);
525 /* FPU state will be reallocated lazily at the first use. */ 525
526 fpu__drop(fpu); 526 /*
527 } else { 527 * Make sure fpstate is cleared and initialized.
528 if (!fpu->fpstate_active) { 528 */
529 fpu__activate_curr(fpu); 529 if (static_cpu_has(X86_FEATURE_FPU)) {
530 user_fpu_begin(); 530 fpu__activate_curr(fpu);
531 } 531 user_fpu_begin();
532 copy_init_fpstate_to_fpregs(); 532 copy_init_fpstate_to_fpregs();
533 } 533 }
534} 534}
diff --git a/arch/x86/kernel/head_32.S b/arch/x86/kernel/head_32.S
index b6b2f0264af3..2dabea46f039 100644
--- a/arch/x86/kernel/head_32.S
+++ b/arch/x86/kernel/head_32.S
@@ -665,14 +665,17 @@ __PAGE_ALIGNED_BSS
665initial_pg_pmd: 665initial_pg_pmd:
666 .fill 1024*KPMDS,4,0 666 .fill 1024*KPMDS,4,0
667#else 667#else
668ENTRY(initial_page_table) 668.globl initial_page_table
669initial_page_table:
669 .fill 1024,4,0 670 .fill 1024,4,0
670#endif 671#endif
671initial_pg_fixmap: 672initial_pg_fixmap:
672 .fill 1024,4,0 673 .fill 1024,4,0
673ENTRY(empty_zero_page) 674.globl empty_zero_page
675empty_zero_page:
674 .fill 4096,1,0 676 .fill 4096,1,0
675ENTRY(swapper_pg_dir) 677.globl swapper_pg_dir
678swapper_pg_dir:
676 .fill 1024,4,0 679 .fill 1024,4,0
677EXPORT_SYMBOL(empty_zero_page) 680EXPORT_SYMBOL(empty_zero_page)
678 681
diff --git a/arch/x86/kernel/sysfb_simplefb.c b/arch/x86/kernel/sysfb_simplefb.c
index 764a29f84de7..85195d447a92 100644
--- a/arch/x86/kernel/sysfb_simplefb.c
+++ b/arch/x86/kernel/sysfb_simplefb.c
@@ -66,13 +66,36 @@ __init int create_simplefb(const struct screen_info *si,
66{ 66{
67 struct platform_device *pd; 67 struct platform_device *pd;
68 struct resource res; 68 struct resource res;
69 unsigned long len; 69 u64 base, size;
70 u32 length;
70 71
71 /* don't use lfb_size as it may contain the whole VMEM instead of only 72 /*
72 * the part that is occupied by the framebuffer */ 73 * If the 64BIT_BASE capability is set, ext_lfb_base will contain the
73 len = mode->height * mode->stride; 74 * upper half of the base address. Assemble the address, then make sure
74 len = PAGE_ALIGN(len); 75 * it is valid and we can actually access it.
75 if (len > (u64)si->lfb_size << 16) { 76 */
77 base = si->lfb_base;
78 if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)
79 base |= (u64)si->ext_lfb_base << 32;
80 if (!base || (u64)(resource_size_t)base != base) {
81 printk(KERN_DEBUG "sysfb: inaccessible VRAM base\n");
82 return -EINVAL;
83 }
84
85 /*
86 * Don't use lfb_size as IORESOURCE size, since it may contain the
87 * entire VMEM, and thus require huge mappings. Use just the part we
88 * need, that is, the part where the framebuffer is located. But verify
89 * that it does not exceed the advertised VMEM.
90 * Note that in case of VBE, the lfb_size is shifted by 16 bits for
91 * historical reasons.
92 */
93 size = si->lfb_size;
94 if (si->orig_video_isVGA == VIDEO_TYPE_VLFB)
95 size <<= 16;
96 length = mode->height * mode->stride;
97 length = PAGE_ALIGN(length);
98 if (length > size) {
76 printk(KERN_WARNING "sysfb: VRAM smaller than advertised\n"); 99 printk(KERN_WARNING "sysfb: VRAM smaller than advertised\n");
77 return -EINVAL; 100 return -EINVAL;
78 } 101 }
@@ -81,8 +104,8 @@ __init int create_simplefb(const struct screen_info *si,
81 memset(&res, 0, sizeof(res)); 104 memset(&res, 0, sizeof(res));
82 res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; 105 res.flags = IORESOURCE_MEM | IORESOURCE_BUSY;
83 res.name = simplefb_resname; 106 res.name = simplefb_resname;
84 res.start = si->lfb_base; 107 res.start = base;
85 res.end = si->lfb_base + len - 1; 108 res.end = res.start + length - 1;
86 if (res.end <= res.start) 109 if (res.end <= res.start)
87 return -EINVAL; 110 return -EINVAL;
88 111
diff --git a/arch/x86/kernel/unwind_guess.c b/arch/x86/kernel/unwind_guess.c
index 2d721e533cf4..22881ddcbb9f 100644
--- a/arch/x86/kernel/unwind_guess.c
+++ b/arch/x86/kernel/unwind_guess.c
@@ -7,11 +7,15 @@
7 7
8unsigned long unwind_get_return_address(struct unwind_state *state) 8unsigned long unwind_get_return_address(struct unwind_state *state)
9{ 9{
10 unsigned long addr;
11
10 if (unwind_done(state)) 12 if (unwind_done(state))
11 return 0; 13 return 0;
12 14
15 addr = READ_ONCE_NOCHECK(*state->sp);
16
13 return ftrace_graph_ret_addr(state->task, &state->graph_idx, 17 return ftrace_graph_ret_addr(state->task, &state->graph_idx,
14 *state->sp, state->sp); 18 addr, state->sp);
15} 19}
16EXPORT_SYMBOL_GPL(unwind_get_return_address); 20EXPORT_SYMBOL_GPL(unwind_get_return_address);
17 21
@@ -23,9 +27,12 @@ bool unwind_next_frame(struct unwind_state *state)
23 return false; 27 return false;
24 28
25 do { 29 do {
26 for (state->sp++; state->sp < info->end; state->sp++) 30 for (state->sp++; state->sp < info->end; state->sp++) {
27 if (__kernel_text_address(*state->sp)) 31 unsigned long addr = READ_ONCE_NOCHECK(*state->sp);
32
33 if (__kernel_text_address(addr))
28 return true; 34 return true;
35 }
29 36
30 state->sp = info->next_sp; 37 state->sp = info->next_sp;
31 38
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c
index cbd7b92585bb..a3ce9d260d68 100644
--- a/arch/x86/kvm/emulate.c
+++ b/arch/x86/kvm/emulate.c
@@ -2105,16 +2105,10 @@ static int em_iret(struct x86_emulate_ctxt *ctxt)
2105static int em_jmp_far(struct x86_emulate_ctxt *ctxt) 2105static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
2106{ 2106{
2107 int rc; 2107 int rc;
2108 unsigned short sel, old_sel; 2108 unsigned short sel;
2109 struct desc_struct old_desc, new_desc; 2109 struct desc_struct new_desc;
2110 const struct x86_emulate_ops *ops = ctxt->ops;
2111 u8 cpl = ctxt->ops->cpl(ctxt); 2110 u8 cpl = ctxt->ops->cpl(ctxt);
2112 2111
2113 /* Assignment of RIP may only fail in 64-bit mode */
2114 if (ctxt->mode == X86EMUL_MODE_PROT64)
2115 ops->get_segment(ctxt, &old_sel, &old_desc, NULL,
2116 VCPU_SREG_CS);
2117
2118 memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2); 2112 memcpy(&sel, ctxt->src.valptr + ctxt->op_bytes, 2);
2119 2113
2120 rc = __load_segment_descriptor(ctxt, sel, VCPU_SREG_CS, cpl, 2114 rc = __load_segment_descriptor(ctxt, sel, VCPU_SREG_CS, cpl,
@@ -2124,12 +2118,10 @@ static int em_jmp_far(struct x86_emulate_ctxt *ctxt)
2124 return rc; 2118 return rc;
2125 2119
2126 rc = assign_eip_far(ctxt, ctxt->src.val, &new_desc); 2120 rc = assign_eip_far(ctxt, ctxt->src.val, &new_desc);
2127 if (rc != X86EMUL_CONTINUE) { 2121 /* Error handling is not implemented. */
2128 WARN_ON(ctxt->mode != X86EMUL_MODE_PROT64); 2122 if (rc != X86EMUL_CONTINUE)
2129 /* assigning eip failed; restore the old cs */ 2123 return X86EMUL_UNHANDLEABLE;
2130 ops->set_segment(ctxt, old_sel, &old_desc, 0, VCPU_SREG_CS); 2124
2131 return rc;
2132 }
2133 return rc; 2125 return rc;
2134} 2126}
2135 2127
@@ -2189,14 +2181,8 @@ static int em_ret_far(struct x86_emulate_ctxt *ctxt)
2189{ 2181{
2190 int rc; 2182 int rc;
2191 unsigned long eip, cs; 2183 unsigned long eip, cs;
2192 u16 old_cs;
2193 int cpl = ctxt->ops->cpl(ctxt); 2184 int cpl = ctxt->ops->cpl(ctxt);
2194 struct desc_struct old_desc, new_desc; 2185 struct desc_struct new_desc;
2195 const struct x86_emulate_ops *ops = ctxt->ops;
2196
2197 if (ctxt->mode == X86EMUL_MODE_PROT64)
2198 ops->get_segment(ctxt, &old_cs, &old_desc, NULL,
2199 VCPU_SREG_CS);
2200 2186
2201 rc = emulate_pop(ctxt, &eip, ctxt->op_bytes); 2187 rc = emulate_pop(ctxt, &eip, ctxt->op_bytes);
2202 if (rc != X86EMUL_CONTINUE) 2188 if (rc != X86EMUL_CONTINUE)
@@ -2213,10 +2199,10 @@ static int em_ret_far(struct x86_emulate_ctxt *ctxt)
2213 if (rc != X86EMUL_CONTINUE) 2199 if (rc != X86EMUL_CONTINUE)
2214 return rc; 2200 return rc;
2215 rc = assign_eip_far(ctxt, eip, &new_desc); 2201 rc = assign_eip_far(ctxt, eip, &new_desc);
2216 if (rc != X86EMUL_CONTINUE) { 2202 /* Error handling is not implemented. */
2217 WARN_ON(ctxt->mode != X86EMUL_MODE_PROT64); 2203 if (rc != X86EMUL_CONTINUE)
2218 ops->set_segment(ctxt, old_cs, &old_desc, 0, VCPU_SREG_CS); 2204 return X86EMUL_UNHANDLEABLE;
2219 } 2205
2220 return rc; 2206 return rc;
2221} 2207}
2222 2208
diff --git a/arch/x86/kvm/ioapic.c b/arch/x86/kvm/ioapic.c
index 1a22de70f7f7..6e219e5c07d2 100644
--- a/arch/x86/kvm/ioapic.c
+++ b/arch/x86/kvm/ioapic.c
@@ -94,7 +94,7 @@ static unsigned long ioapic_read_indirect(struct kvm_ioapic *ioapic,
94static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic) 94static void rtc_irq_eoi_tracking_reset(struct kvm_ioapic *ioapic)
95{ 95{
96 ioapic->rtc_status.pending_eoi = 0; 96 ioapic->rtc_status.pending_eoi = 0;
97 bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPUS); 97 bitmap_zero(ioapic->rtc_status.dest_map.map, KVM_MAX_VCPU_ID);
98} 98}
99 99
100static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic); 100static void kvm_rtc_eoi_tracking_restore_all(struct kvm_ioapic *ioapic);
diff --git a/arch/x86/kvm/ioapic.h b/arch/x86/kvm/ioapic.h
index 7d2692a49657..1cc6e54436db 100644
--- a/arch/x86/kvm/ioapic.h
+++ b/arch/x86/kvm/ioapic.h
@@ -42,13 +42,13 @@ struct kvm_vcpu;
42 42
43struct dest_map { 43struct dest_map {
44 /* vcpu bitmap where IRQ has been sent */ 44 /* vcpu bitmap where IRQ has been sent */
45 DECLARE_BITMAP(map, KVM_MAX_VCPUS); 45 DECLARE_BITMAP(map, KVM_MAX_VCPU_ID);
46 46
47 /* 47 /*
48 * Vector sent to a given vcpu, only valid when 48 * Vector sent to a given vcpu, only valid when
49 * the vcpu's bit in map is set 49 * the vcpu's bit in map is set
50 */ 50 */
51 u8 vectors[KVM_MAX_VCPUS]; 51 u8 vectors[KVM_MAX_VCPU_ID];
52}; 52};
53 53
54 54
diff --git a/arch/x86/kvm/irq_comm.c b/arch/x86/kvm/irq_comm.c
index 25810b144b58..6c0191615f23 100644
--- a/arch/x86/kvm/irq_comm.c
+++ b/arch/x86/kvm/irq_comm.c
@@ -41,6 +41,15 @@ static int kvm_set_pic_irq(struct kvm_kernel_irq_routing_entry *e,
41 bool line_status) 41 bool line_status)
42{ 42{
43 struct kvm_pic *pic = pic_irqchip(kvm); 43 struct kvm_pic *pic = pic_irqchip(kvm);
44
45 /*
46 * XXX: rejecting pic routes when pic isn't in use would be better,
47 * but the default routing table is installed while kvm->arch.vpic is
48 * NULL and KVM_CREATE_IRQCHIP can race with KVM_IRQ_LINE.
49 */
50 if (!pic)
51 return -1;
52
44 return kvm_pic_set_irq(pic, e->irqchip.pin, irq_source_id, level); 53 return kvm_pic_set_irq(pic, e->irqchip.pin, irq_source_id, level);
45} 54}
46 55
@@ -49,6 +58,10 @@ static int kvm_set_ioapic_irq(struct kvm_kernel_irq_routing_entry *e,
49 bool line_status) 58 bool line_status)
50{ 59{
51 struct kvm_ioapic *ioapic = kvm->arch.vioapic; 60 struct kvm_ioapic *ioapic = kvm->arch.vioapic;
61
62 if (!ioapic)
63 return -1;
64
52 return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, irq_source_id, level, 65 return kvm_ioapic_set_irq(ioapic, e->irqchip.pin, irq_source_id, level,
53 line_status); 66 line_status);
54} 67}
@@ -156,6 +169,16 @@ int kvm_set_msi(struct kvm_kernel_irq_routing_entry *e,
156} 169}
157 170
158 171
172static int kvm_hv_set_sint(struct kvm_kernel_irq_routing_entry *e,
173 struct kvm *kvm, int irq_source_id, int level,
174 bool line_status)
175{
176 if (!level)
177 return -1;
178
179 return kvm_hv_synic_set_irq(kvm, e->hv_sint.vcpu, e->hv_sint.sint);
180}
181
159int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e, 182int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
160 struct kvm *kvm, int irq_source_id, int level, 183 struct kvm *kvm, int irq_source_id, int level,
161 bool line_status) 184 bool line_status)
@@ -163,18 +186,26 @@ int kvm_arch_set_irq_inatomic(struct kvm_kernel_irq_routing_entry *e,
163 struct kvm_lapic_irq irq; 186 struct kvm_lapic_irq irq;
164 int r; 187 int r;
165 188
166 if (unlikely(e->type != KVM_IRQ_ROUTING_MSI)) 189 switch (e->type) {
167 return -EWOULDBLOCK; 190 case KVM_IRQ_ROUTING_HV_SINT:
191 return kvm_hv_set_sint(e, kvm, irq_source_id, level,
192 line_status);
168 193
169 if (kvm_msi_route_invalid(kvm, e)) 194 case KVM_IRQ_ROUTING_MSI:
170 return -EINVAL; 195 if (kvm_msi_route_invalid(kvm, e))
196 return -EINVAL;
171 197
172 kvm_set_msi_irq(kvm, e, &irq); 198 kvm_set_msi_irq(kvm, e, &irq);
173 199
174 if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL)) 200 if (kvm_irq_delivery_to_apic_fast(kvm, NULL, &irq, &r, NULL))
175 return r; 201 return r;
176 else 202 break;
177 return -EWOULDBLOCK; 203
204 default:
205 break;
206 }
207
208 return -EWOULDBLOCK;
178} 209}
179 210
180int kvm_request_irq_source_id(struct kvm *kvm) 211int kvm_request_irq_source_id(struct kvm *kvm)
@@ -254,16 +285,6 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
254 srcu_read_unlock(&kvm->irq_srcu, idx); 285 srcu_read_unlock(&kvm->irq_srcu, idx);
255} 286}
256 287
257static int kvm_hv_set_sint(struct kvm_kernel_irq_routing_entry *e,
258 struct kvm *kvm, int irq_source_id, int level,
259 bool line_status)
260{
261 if (!level)
262 return -1;
263
264 return kvm_hv_synic_set_irq(kvm, e->hv_sint.vcpu, e->hv_sint.sint);
265}
266
267int kvm_set_routing_entry(struct kvm *kvm, 288int kvm_set_routing_entry(struct kvm *kvm,
268 struct kvm_kernel_irq_routing_entry *e, 289 struct kvm_kernel_irq_routing_entry *e,
269 const struct kvm_irq_routing_entry *ue) 290 const struct kvm_irq_routing_entry *ue)
@@ -423,18 +444,6 @@ void kvm_scan_ioapic_routes(struct kvm_vcpu *vcpu,
423 srcu_read_unlock(&kvm->irq_srcu, idx); 444 srcu_read_unlock(&kvm->irq_srcu, idx);
424} 445}
425 446
426int kvm_arch_set_irq(struct kvm_kernel_irq_routing_entry *irq, struct kvm *kvm,
427 int irq_source_id, int level, bool line_status)
428{
429 switch (irq->type) {
430 case KVM_IRQ_ROUTING_HV_SINT:
431 return kvm_hv_set_sint(irq, kvm, irq_source_id, level,
432 line_status);
433 default:
434 return -EWOULDBLOCK;
435 }
436}
437
438void kvm_arch_irq_routing_update(struct kvm *kvm) 447void kvm_arch_irq_routing_update(struct kvm *kvm)
439{ 448{
440 kvm_hv_irq_routing_update(kvm); 449 kvm_hv_irq_routing_update(kvm);
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
index 23b99f305382..6f69340f9fa3 100644
--- a/arch/x86/kvm/lapic.c
+++ b/arch/x86/kvm/lapic.c
@@ -138,7 +138,7 @@ static inline bool kvm_apic_map_get_logical_dest(struct kvm_apic_map *map,
138 *mask = dest_id & 0xff; 138 *mask = dest_id & 0xff;
139 return true; 139 return true;
140 case KVM_APIC_MODE_XAPIC_CLUSTER: 140 case KVM_APIC_MODE_XAPIC_CLUSTER:
141 *cluster = map->xapic_cluster_map[dest_id >> 4]; 141 *cluster = map->xapic_cluster_map[(dest_id >> 4) & 0xf];
142 *mask = dest_id & 0xf; 142 *mask = dest_id & 0xf;
143 return true; 143 return true;
144 default: 144 default:
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
index 3017de0431bd..04c5d96b1d67 100644
--- a/arch/x86/kvm/x86.c
+++ b/arch/x86/kvm/x86.c
@@ -210,7 +210,18 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
210 struct kvm_shared_msrs *locals 210 struct kvm_shared_msrs *locals
211 = container_of(urn, struct kvm_shared_msrs, urn); 211 = container_of(urn, struct kvm_shared_msrs, urn);
212 struct kvm_shared_msr_values *values; 212 struct kvm_shared_msr_values *values;
213 unsigned long flags;
213 214
215 /*
216 * Disabling irqs at this point since the following code could be
217 * interrupted and executed through kvm_arch_hardware_disable()
218 */
219 local_irq_save(flags);
220 if (locals->registered) {
221 locals->registered = false;
222 user_return_notifier_unregister(urn);
223 }
224 local_irq_restore(flags);
214 for (slot = 0; slot < shared_msrs_global.nr; ++slot) { 225 for (slot = 0; slot < shared_msrs_global.nr; ++slot) {
215 values = &locals->values[slot]; 226 values = &locals->values[slot];
216 if (values->host != values->curr) { 227 if (values->host != values->curr) {
@@ -218,8 +229,6 @@ static void kvm_on_user_return(struct user_return_notifier *urn)
218 values->curr = values->host; 229 values->curr = values->host;
219 } 230 }
220 } 231 }
221 locals->registered = false;
222 user_return_notifier_unregister(urn);
223} 232}
224 233
225static void shared_msr_update(unsigned slot, u32 msr) 234static void shared_msr_update(unsigned slot, u32 msr)
@@ -1724,18 +1733,23 @@ static void kvm_gen_update_masterclock(struct kvm *kvm)
1724 1733
1725static u64 __get_kvmclock_ns(struct kvm *kvm) 1734static u64 __get_kvmclock_ns(struct kvm *kvm)
1726{ 1735{
1727 struct kvm_vcpu *vcpu = kvm_get_vcpu(kvm, 0);
1728 struct kvm_arch *ka = &kvm->arch; 1736 struct kvm_arch *ka = &kvm->arch;
1729 s64 ns; 1737 struct pvclock_vcpu_time_info hv_clock;
1730 1738
1731 if (vcpu->arch.hv_clock.flags & PVCLOCK_TSC_STABLE_BIT) { 1739 spin_lock(&ka->pvclock_gtod_sync_lock);
1732 u64 tsc = kvm_read_l1_tsc(vcpu, rdtsc()); 1740 if (!ka->use_master_clock) {
1733 ns = __pvclock_read_cycles(&vcpu->arch.hv_clock, tsc); 1741 spin_unlock(&ka->pvclock_gtod_sync_lock);
1734 } else { 1742 return ktime_get_boot_ns() + ka->kvmclock_offset;
1735 ns = ktime_get_boot_ns() + ka->kvmclock_offset;
1736 } 1743 }
1737 1744
1738 return ns; 1745 hv_clock.tsc_timestamp = ka->master_cycle_now;
1746 hv_clock.system_time = ka->master_kernel_ns + ka->kvmclock_offset;
1747 spin_unlock(&ka->pvclock_gtod_sync_lock);
1748
1749 kvm_get_time_scale(NSEC_PER_SEC, __this_cpu_read(cpu_tsc_khz) * 1000LL,
1750 &hv_clock.tsc_shift,
1751 &hv_clock.tsc_to_system_mul);
1752 return __pvclock_read_cycles(&hv_clock, rdtsc());
1739} 1753}
1740 1754
1741u64 get_kvmclock_ns(struct kvm *kvm) 1755u64 get_kvmclock_ns(struct kvm *kvm)
@@ -2596,7 +2610,6 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
2596 case KVM_CAP_PIT_STATE2: 2610 case KVM_CAP_PIT_STATE2:
2597 case KVM_CAP_SET_IDENTITY_MAP_ADDR: 2611 case KVM_CAP_SET_IDENTITY_MAP_ADDR:
2598 case KVM_CAP_XEN_HVM: 2612 case KVM_CAP_XEN_HVM:
2599 case KVM_CAP_ADJUST_CLOCK:
2600 case KVM_CAP_VCPU_EVENTS: 2613 case KVM_CAP_VCPU_EVENTS:
2601 case KVM_CAP_HYPERV: 2614 case KVM_CAP_HYPERV:
2602 case KVM_CAP_HYPERV_VAPIC: 2615 case KVM_CAP_HYPERV_VAPIC:
@@ -2623,6 +2636,9 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)
2623#endif 2636#endif
2624 r = 1; 2637 r = 1;
2625 break; 2638 break;
2639 case KVM_CAP_ADJUST_CLOCK:
2640 r = KVM_CLOCK_TSC_STABLE;
2641 break;
2626 case KVM_CAP_X86_SMM: 2642 case KVM_CAP_X86_SMM:
2627 /* SMBASE is usually relocated above 1M on modern chipsets, 2643 /* SMBASE is usually relocated above 1M on modern chipsets,
2628 * and SMM handlers might indeed rely on 4G segment limits, 2644 * and SMM handlers might indeed rely on 4G segment limits,
@@ -3415,6 +3431,7 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
3415 }; 3431 };
3416 case KVM_SET_VAPIC_ADDR: { 3432 case KVM_SET_VAPIC_ADDR: {
3417 struct kvm_vapic_addr va; 3433 struct kvm_vapic_addr va;
3434 int idx;
3418 3435
3419 r = -EINVAL; 3436 r = -EINVAL;
3420 if (!lapic_in_kernel(vcpu)) 3437 if (!lapic_in_kernel(vcpu))
@@ -3422,7 +3439,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
3422 r = -EFAULT; 3439 r = -EFAULT;
3423 if (copy_from_user(&va, argp, sizeof va)) 3440 if (copy_from_user(&va, argp, sizeof va))
3424 goto out; 3441 goto out;
3442 idx = srcu_read_lock(&vcpu->kvm->srcu);
3425 r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr); 3443 r = kvm_lapic_set_vapic_addr(vcpu, va.vapic_addr);
3444 srcu_read_unlock(&vcpu->kvm->srcu, idx);
3426 break; 3445 break;
3427 } 3446 }
3428 case KVM_X86_SETUP_MCE: { 3447 case KVM_X86_SETUP_MCE: {
@@ -4103,9 +4122,11 @@ long kvm_arch_vm_ioctl(struct file *filp,
4103 struct kvm_clock_data user_ns; 4122 struct kvm_clock_data user_ns;
4104 u64 now_ns; 4123 u64 now_ns;
4105 4124
4106 now_ns = get_kvmclock_ns(kvm); 4125 local_irq_disable();
4126 now_ns = __get_kvmclock_ns(kvm);
4107 user_ns.clock = now_ns; 4127 user_ns.clock = now_ns;
4108 user_ns.flags = 0; 4128 user_ns.flags = kvm->arch.use_master_clock ? KVM_CLOCK_TSC_STABLE : 0;
4129 local_irq_enable();
4109 memset(&user_ns.pad, 0, sizeof(user_ns.pad)); 4130 memset(&user_ns.pad, 0, sizeof(user_ns.pad));
4110 4131
4111 r = -EFAULT; 4132 r = -EFAULT;
diff --git a/arch/x86/mm/extable.c b/arch/x86/mm/extable.c
index 79ae939970d3..fcd06f7526de 100644
--- a/arch/x86/mm/extable.c
+++ b/arch/x86/mm/extable.c
@@ -135,7 +135,12 @@ void __init early_fixup_exception(struct pt_regs *regs, int trapnr)
135 if (early_recursion_flag > 2) 135 if (early_recursion_flag > 2)
136 goto halt_loop; 136 goto halt_loop;
137 137
138 if (regs->cs != __KERNEL_CS) 138 /*
139 * Old CPUs leave the high bits of CS on the stack
140 * undefined. I'm not sure which CPUs do this, but at least
141 * the 486 DX works this way.
142 */
143 if ((regs->cs & 0xFFFF) != __KERNEL_CS)
139 goto fail; 144 goto fail;
140 145
141 /* 146 /*
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index bf99aa7005eb..936a488d6cf6 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -861,7 +861,7 @@ static void __init __efi_enter_virtual_mode(void)
861 int count = 0, pg_shift = 0; 861 int count = 0, pg_shift = 0;
862 void *new_memmap = NULL; 862 void *new_memmap = NULL;
863 efi_status_t status; 863 efi_status_t status;
864 phys_addr_t pa; 864 unsigned long pa;
865 865
866 efi.systab = NULL; 866 efi.systab = NULL;
867 867
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c
index 58b0f801f66f..319148bd4b05 100644
--- a/arch/x86/platform/efi/efi_64.c
+++ b/arch/x86/platform/efi/efi_64.c
@@ -31,6 +31,7 @@
31#include <linux/io.h> 31#include <linux/io.h>
32#include <linux/reboot.h> 32#include <linux/reboot.h>
33#include <linux/slab.h> 33#include <linux/slab.h>
34#include <linux/ucs2_string.h>
34 35
35#include <asm/setup.h> 36#include <asm/setup.h>
36#include <asm/page.h> 37#include <asm/page.h>
@@ -211,6 +212,35 @@ void efi_sync_low_kernel_mappings(void)
211 memcpy(pud_efi, pud_k, sizeof(pud_t) * num_entries); 212 memcpy(pud_efi, pud_k, sizeof(pud_t) * num_entries);
212} 213}
213 214
215/*
216 * Wrapper for slow_virt_to_phys() that handles NULL addresses.
217 */
218static inline phys_addr_t
219virt_to_phys_or_null_size(void *va, unsigned long size)
220{
221 bool bad_size;
222
223 if (!va)
224 return 0;
225
226 if (virt_addr_valid(va))
227 return virt_to_phys(va);
228
229 /*
230 * A fully aligned variable on the stack is guaranteed not to
231 * cross a page bounary. Try to catch strings on the stack by
232 * checking that 'size' is a power of two.
233 */
234 bad_size = size > PAGE_SIZE || !is_power_of_2(size);
235
236 WARN_ON(!IS_ALIGNED((unsigned long)va, size) || bad_size);
237
238 return slow_virt_to_phys(va);
239}
240
241#define virt_to_phys_or_null(addr) \
242 virt_to_phys_or_null_size((addr), sizeof(*(addr)))
243
214int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) 244int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
215{ 245{
216 unsigned long pfn, text; 246 unsigned long pfn, text;
@@ -494,8 +524,8 @@ static efi_status_t efi_thunk_get_time(efi_time_t *tm, efi_time_cap_t *tc)
494 524
495 spin_lock(&rtc_lock); 525 spin_lock(&rtc_lock);
496 526
497 phys_tm = virt_to_phys(tm); 527 phys_tm = virt_to_phys_or_null(tm);
498 phys_tc = virt_to_phys(tc); 528 phys_tc = virt_to_phys_or_null(tc);
499 529
500 status = efi_thunk(get_time, phys_tm, phys_tc); 530 status = efi_thunk(get_time, phys_tm, phys_tc);
501 531
@@ -511,7 +541,7 @@ static efi_status_t efi_thunk_set_time(efi_time_t *tm)
511 541
512 spin_lock(&rtc_lock); 542 spin_lock(&rtc_lock);
513 543
514 phys_tm = virt_to_phys(tm); 544 phys_tm = virt_to_phys_or_null(tm);
515 545
516 status = efi_thunk(set_time, phys_tm); 546 status = efi_thunk(set_time, phys_tm);
517 547
@@ -529,9 +559,9 @@ efi_thunk_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending,
529 559
530 spin_lock(&rtc_lock); 560 spin_lock(&rtc_lock);
531 561
532 phys_enabled = virt_to_phys(enabled); 562 phys_enabled = virt_to_phys_or_null(enabled);
533 phys_pending = virt_to_phys(pending); 563 phys_pending = virt_to_phys_or_null(pending);
534 phys_tm = virt_to_phys(tm); 564 phys_tm = virt_to_phys_or_null(tm);
535 565
536 status = efi_thunk(get_wakeup_time, phys_enabled, 566 status = efi_thunk(get_wakeup_time, phys_enabled,
537 phys_pending, phys_tm); 567 phys_pending, phys_tm);
@@ -549,7 +579,7 @@ efi_thunk_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
549 579
550 spin_lock(&rtc_lock); 580 spin_lock(&rtc_lock);
551 581
552 phys_tm = virt_to_phys(tm); 582 phys_tm = virt_to_phys_or_null(tm);
553 583
554 status = efi_thunk(set_wakeup_time, enabled, phys_tm); 584 status = efi_thunk(set_wakeup_time, enabled, phys_tm);
555 585
@@ -558,6 +588,10 @@ efi_thunk_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
558 return status; 588 return status;
559} 589}
560 590
591static unsigned long efi_name_size(efi_char16_t *name)
592{
593 return ucs2_strsize(name, EFI_VAR_NAME_LEN) + 1;
594}
561 595
562static efi_status_t 596static efi_status_t
563efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor, 597efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
@@ -567,11 +601,11 @@ efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
567 u32 phys_name, phys_vendor, phys_attr; 601 u32 phys_name, phys_vendor, phys_attr;
568 u32 phys_data_size, phys_data; 602 u32 phys_data_size, phys_data;
569 603
570 phys_data_size = virt_to_phys(data_size); 604 phys_data_size = virt_to_phys_or_null(data_size);
571 phys_vendor = virt_to_phys(vendor); 605 phys_vendor = virt_to_phys_or_null(vendor);
572 phys_name = virt_to_phys(name); 606 phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
573 phys_attr = virt_to_phys(attr); 607 phys_attr = virt_to_phys_or_null(attr);
574 phys_data = virt_to_phys(data); 608 phys_data = virt_to_phys_or_null_size(data, *data_size);
575 609
576 status = efi_thunk(get_variable, phys_name, phys_vendor, 610 status = efi_thunk(get_variable, phys_name, phys_vendor,
577 phys_attr, phys_data_size, phys_data); 611 phys_attr, phys_data_size, phys_data);
@@ -586,9 +620,9 @@ efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor,
586 u32 phys_name, phys_vendor, phys_data; 620 u32 phys_name, phys_vendor, phys_data;
587 efi_status_t status; 621 efi_status_t status;
588 622
589 phys_name = virt_to_phys(name); 623 phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
590 phys_vendor = virt_to_phys(vendor); 624 phys_vendor = virt_to_phys_or_null(vendor);
591 phys_data = virt_to_phys(data); 625 phys_data = virt_to_phys_or_null_size(data, data_size);
592 626
593 /* If data_size is > sizeof(u32) we've got problems */ 627 /* If data_size is > sizeof(u32) we've got problems */
594 status = efi_thunk(set_variable, phys_name, phys_vendor, 628 status = efi_thunk(set_variable, phys_name, phys_vendor,
@@ -605,9 +639,9 @@ efi_thunk_get_next_variable(unsigned long *name_size,
605 efi_status_t status; 639 efi_status_t status;
606 u32 phys_name_size, phys_name, phys_vendor; 640 u32 phys_name_size, phys_name, phys_vendor;
607 641
608 phys_name_size = virt_to_phys(name_size); 642 phys_name_size = virt_to_phys_or_null(name_size);
609 phys_vendor = virt_to_phys(vendor); 643 phys_vendor = virt_to_phys_or_null(vendor);
610 phys_name = virt_to_phys(name); 644 phys_name = virt_to_phys_or_null_size(name, *name_size);
611 645
612 status = efi_thunk(get_next_variable, phys_name_size, 646 status = efi_thunk(get_next_variable, phys_name_size,
613 phys_name, phys_vendor); 647 phys_name, phys_vendor);
@@ -621,7 +655,7 @@ efi_thunk_get_next_high_mono_count(u32 *count)
621 efi_status_t status; 655 efi_status_t status;
622 u32 phys_count; 656 u32 phys_count;
623 657
624 phys_count = virt_to_phys(count); 658 phys_count = virt_to_phys_or_null(count);
625 status = efi_thunk(get_next_high_mono_count, phys_count); 659 status = efi_thunk(get_next_high_mono_count, phys_count);
626 660
627 return status; 661 return status;
@@ -633,7 +667,7 @@ efi_thunk_reset_system(int reset_type, efi_status_t status,
633{ 667{
634 u32 phys_data; 668 u32 phys_data;
635 669
636 phys_data = virt_to_phys(data); 670 phys_data = virt_to_phys_or_null_size(data, data_size);
637 671
638 efi_thunk(reset_system, reset_type, status, data_size, phys_data); 672 efi_thunk(reset_system, reset_type, status, data_size, phys_data);
639} 673}
@@ -661,9 +695,9 @@ efi_thunk_query_variable_info(u32 attr, u64 *storage_space,
661 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION) 695 if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
662 return EFI_UNSUPPORTED; 696 return EFI_UNSUPPORTED;
663 697
664 phys_storage = virt_to_phys(storage_space); 698 phys_storage = virt_to_phys_or_null(storage_space);
665 phys_remaining = virt_to_phys(remaining_space); 699 phys_remaining = virt_to_phys_or_null(remaining_space);
666 phys_max = virt_to_phys(max_variable_size); 700 phys_max = virt_to_phys_or_null(max_variable_size);
667 701
668 status = efi_thunk(query_variable_info, attr, phys_storage, 702 status = efi_thunk(query_variable_info, attr, phys_storage,
669 phys_remaining, phys_max); 703 phys_remaining, phys_max);
diff --git a/arch/x86/platform/intel-mid/device_libs/Makefile b/arch/x86/platform/intel-mid/device_libs/Makefile
index 429d08be7848..dd6cfa4ad3ac 100644
--- a/arch/x86/platform/intel-mid/device_libs/Makefile
+++ b/arch/x86/platform/intel-mid/device_libs/Makefile
@@ -28,4 +28,4 @@ obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_pcal9555a.o
28obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o 28obj-$(subst m,y,$(CONFIG_GPIO_PCA953X)) += platform_tca6416.o
29# MISC Devices 29# MISC Devices
30obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o 30obj-$(subst m,y,$(CONFIG_KEYBOARD_GPIO)) += platform_gpio_keys.o
31obj-$(subst m,y,$(CONFIG_INTEL_MID_WATCHDOG)) += platform_wdt.o 31obj-$(subst m,y,$(CONFIG_INTEL_MID_WATCHDOG)) += platform_mrfld_wdt.o
diff --git a/arch/x86/platform/intel-mid/device_libs/platform_wdt.c b/arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c
index de734134bc8d..3f1f1c77d090 100644
--- a/arch/x86/platform/intel-mid/device_libs/platform_wdt.c
+++ b/arch/x86/platform/intel-mid/device_libs/platform_mrfld_wdt.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * platform_wdt.c: Watchdog platform library file 2 * Intel Merrifield watchdog platform device library file
3 * 3 *
4 * (C) Copyright 2014 Intel Corporation 4 * (C) Copyright 2014 Intel Corporation
5 * Author: David Cohen <david.a.cohen@linux.intel.com> 5 * Author: David Cohen <david.a.cohen@linux.intel.com>
@@ -14,7 +14,9 @@
14#include <linux/interrupt.h> 14#include <linux/interrupt.h>
15#include <linux/platform_device.h> 15#include <linux/platform_device.h>
16#include <linux/platform_data/intel-mid_wdt.h> 16#include <linux/platform_data/intel-mid_wdt.h>
17
17#include <asm/intel-mid.h> 18#include <asm/intel-mid.h>
19#include <asm/intel_scu_ipc.h>
18#include <asm/io_apic.h> 20#include <asm/io_apic.h>
19 21
20#define TANGIER_EXT_TIMER0_MSI 15 22#define TANGIER_EXT_TIMER0_MSI 15
@@ -50,14 +52,34 @@ static struct intel_mid_wdt_pdata tangier_pdata = {
50 .probe = tangier_probe, 52 .probe = tangier_probe,
51}; 53};
52 54
53static int __init register_mid_wdt(void) 55static int wdt_scu_status_change(struct notifier_block *nb,
56 unsigned long code, void *data)
54{ 57{
55 if (intel_mid_identify_cpu() == INTEL_MID_CPU_CHIP_TANGIER) { 58 if (code == SCU_DOWN) {
56 wdt_dev.dev.platform_data = &tangier_pdata; 59 platform_device_unregister(&wdt_dev);
57 return platform_device_register(&wdt_dev); 60 return 0;
58 } 61 }
59 62
60 return -ENODEV; 63 return platform_device_register(&wdt_dev);
61} 64}
62 65
66static struct notifier_block wdt_scu_notifier = {
67 .notifier_call = wdt_scu_status_change,
68};
69
70static int __init register_mid_wdt(void)
71{
72 if (intel_mid_identify_cpu() != INTEL_MID_CPU_CHIP_TANGIER)
73 return -ENODEV;
74
75 wdt_dev.dev.platform_data = &tangier_pdata;
76
77 /*
78 * We need to be sure that the SCU IPC is ready before watchdog device
79 * can be registered:
80 */
81 intel_scu_notifier_add(&wdt_scu_notifier);
82
83 return 0;
84}
63rootfs_initcall(register_mid_wdt); 85rootfs_initcall(register_mid_wdt);
diff --git a/arch/x86/platform/intel-mid/pwr.c b/arch/x86/platform/intel-mid/pwr.c
index 5d3b45ad1c03..67375dda451c 100644
--- a/arch/x86/platform/intel-mid/pwr.c
+++ b/arch/x86/platform/intel-mid/pwr.c
@@ -272,6 +272,25 @@ int intel_mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state)
272} 272}
273EXPORT_SYMBOL_GPL(intel_mid_pci_set_power_state); 273EXPORT_SYMBOL_GPL(intel_mid_pci_set_power_state);
274 274
275pci_power_t intel_mid_pci_get_power_state(struct pci_dev *pdev)
276{
277 struct mid_pwr *pwr = midpwr;
278 int id, reg, bit;
279 u32 power;
280
281 if (!pwr || !pwr->available)
282 return PCI_UNKNOWN;
283
284 id = intel_mid_pwr_get_lss_id(pdev);
285 if (id < 0)
286 return PCI_UNKNOWN;
287
288 reg = (id * LSS_PWS_BITS) / 32;
289 bit = (id * LSS_PWS_BITS) % 32;
290 power = mid_pwr_get_state(pwr, reg);
291 return (__force pci_power_t)((power >> bit) & 3);
292}
293
275void intel_mid_pwr_power_off(void) 294void intel_mid_pwr_power_off(void)
276{ 295{
277 struct mid_pwr *pwr = midpwr; 296 struct mid_pwr *pwr = midpwr;
diff --git a/arch/x86/platform/olpc/olpc-xo15-sci.c b/arch/x86/platform/olpc/olpc-xo15-sci.c
index 55130846ac87..c0533fbc39e3 100644
--- a/arch/x86/platform/olpc/olpc-xo15-sci.c
+++ b/arch/x86/platform/olpc/olpc-xo15-sci.c
@@ -196,6 +196,7 @@ static int xo15_sci_remove(struct acpi_device *device)
196 return 0; 196 return 0;
197} 197}
198 198
199#ifdef CONFIG_PM_SLEEP
199static int xo15_sci_resume(struct device *dev) 200static int xo15_sci_resume(struct device *dev)
200{ 201{
201 /* Enable all EC events */ 202 /* Enable all EC events */
@@ -207,6 +208,7 @@ static int xo15_sci_resume(struct device *dev)
207 208
208 return 0; 209 return 0;
209} 210}
211#endif
210 212
211static SIMPLE_DEV_PM_OPS(xo15_sci_pm, NULL, xo15_sci_resume); 213static SIMPLE_DEV_PM_OPS(xo15_sci_pm, NULL, xo15_sci_resume);
212 214
diff --git a/arch/x86/purgatory/Makefile b/arch/x86/purgatory/Makefile
index ac58c1616408..555b9fa0ad43 100644
--- a/arch/x86/purgatory/Makefile
+++ b/arch/x86/purgatory/Makefile
@@ -16,6 +16,7 @@ KCOV_INSTRUMENT := n
16 16
17KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large 17KBUILD_CFLAGS := -fno-strict-aliasing -Wall -Wstrict-prototypes -fno-zero-initialized-in-bss -fno-builtin -ffreestanding -c -MD -Os -mcmodel=large
18KBUILD_CFLAGS += -m$(BITS) 18KBUILD_CFLAGS += -m$(BITS)
19KBUILD_CFLAGS += $(call cc-option,-fno-PIE)
19 20
20$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE 21$(obj)/purgatory.ro: $(PURGATORY_OBJS) FORCE
21 $(call if_changed,ld) 22 $(call if_changed,ld)
diff --git a/arch/x86/tools/relocs.h b/arch/x86/tools/relocs.h
index f59590645b68..1d23bf953a4a 100644
--- a/arch/x86/tools/relocs.h
+++ b/arch/x86/tools/relocs.h
@@ -16,7 +16,7 @@
16#include <regex.h> 16#include <regex.h>
17#include <tools/le_byteshift.h> 17#include <tools/le_byteshift.h>
18 18
19void die(char *fmt, ...); 19void die(char *fmt, ...) __attribute__((noreturn));
20 20
21#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 21#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
22 22
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h
index de9b14b2d348..cd400af4a6b2 100644
--- a/arch/xtensa/include/uapi/asm/unistd.h
+++ b/arch/xtensa/include/uapi/asm/unistd.h
@@ -767,7 +767,14 @@ __SYSCALL(346, sys_preadv2, 6)
767#define __NR_pwritev2 347 767#define __NR_pwritev2 347
768__SYSCALL(347, sys_pwritev2, 6) 768__SYSCALL(347, sys_pwritev2, 6)
769 769
770#define __NR_syscall_count 348 770#define __NR_pkey_mprotect 348
771__SYSCALL(348, sys_pkey_mprotect, 4)
772#define __NR_pkey_alloc 349
773__SYSCALL(349, sys_pkey_alloc, 2)
774#define __NR_pkey_free 350
775__SYSCALL(350, sys_pkey_free, 1)
776
777#define __NR_syscall_count 351
771 778
772/* 779/*
773 * sysxtensa syscall handler 780 * sysxtensa syscall handler
diff --git a/arch/xtensa/kernel/time.c b/arch/xtensa/kernel/time.c
index 9a5bcd0381a7..be81e69b25bc 100644
--- a/arch/xtensa/kernel/time.c
+++ b/arch/xtensa/kernel/time.c
@@ -172,10 +172,11 @@ void __init time_init(void)
172{ 172{
173 of_clk_init(NULL); 173 of_clk_init(NULL);
174#ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT 174#ifdef CONFIG_XTENSA_CALIBRATE_CCOUNT
175 printk("Calibrating CPU frequency "); 175 pr_info("Calibrating CPU frequency ");
176 calibrate_ccount(); 176 calibrate_ccount();
177 printk("%d.%02d MHz\n", (int)ccount_freq/1000000, 177 pr_cont("%d.%02d MHz\n",
178 (int)(ccount_freq/10000)%100); 178 (int)ccount_freq / 1000000,
179 (int)(ccount_freq / 10000) % 100);
179#else 180#else
180 ccount_freq = CONFIG_XTENSA_CPU_CLOCK*1000000UL; 181 ccount_freq = CONFIG_XTENSA_CPU_CLOCK*1000000UL;
181#endif 182#endif
@@ -210,9 +211,8 @@ irqreturn_t timer_interrupt(int irq, void *dev_id)
210void calibrate_delay(void) 211void calibrate_delay(void)
211{ 212{
212 loops_per_jiffy = ccount_freq / HZ; 213 loops_per_jiffy = ccount_freq / HZ;
213 printk("Calibrating delay loop (skipped)... " 214 pr_info("Calibrating delay loop (skipped)... %lu.%02lu BogoMIPS preset\n",
214 "%lu.%02lu BogoMIPS preset\n", 215 loops_per_jiffy / (1000000 / HZ),
215 loops_per_jiffy/(1000000/HZ), 216 (loops_per_jiffy / (10000 / HZ)) % 100);
216 (loops_per_jiffy/(10000/HZ)) % 100);
217} 217}
218#endif 218#endif
diff --git a/arch/xtensa/kernel/traps.c b/arch/xtensa/kernel/traps.c
index d02fc304b31c..ce37d5b899fe 100644
--- a/arch/xtensa/kernel/traps.c
+++ b/arch/xtensa/kernel/traps.c
@@ -465,26 +465,25 @@ void show_regs(struct pt_regs * regs)
465 465
466 for (i = 0; i < 16; i++) { 466 for (i = 0; i < 16; i++) {
467 if ((i % 8) == 0) 467 if ((i % 8) == 0)
468 printk(KERN_INFO "a%02d:", i); 468 pr_info("a%02d:", i);
469 printk(KERN_CONT " %08lx", regs->areg[i]); 469 pr_cont(" %08lx", regs->areg[i]);
470 } 470 }
471 printk(KERN_CONT "\n"); 471 pr_cont("\n");
472 472 pr_info("pc: %08lx, ps: %08lx, depc: %08lx, excvaddr: %08lx\n",
473 printk("pc: %08lx, ps: %08lx, depc: %08lx, excvaddr: %08lx\n", 473 regs->pc, regs->ps, regs->depc, regs->excvaddr);
474 regs->pc, regs->ps, regs->depc, regs->excvaddr); 474 pr_info("lbeg: %08lx, lend: %08lx lcount: %08lx, sar: %08lx\n",
475 printk("lbeg: %08lx, lend: %08lx lcount: %08lx, sar: %08lx\n", 475 regs->lbeg, regs->lend, regs->lcount, regs->sar);
476 regs->lbeg, regs->lend, regs->lcount, regs->sar);
477 if (user_mode(regs)) 476 if (user_mode(regs))
478 printk("wb: %08lx, ws: %08lx, wmask: %08lx, syscall: %ld\n", 477 pr_cont("wb: %08lx, ws: %08lx, wmask: %08lx, syscall: %ld\n",
479 regs->windowbase, regs->windowstart, regs->wmask, 478 regs->windowbase, regs->windowstart, regs->wmask,
480 regs->syscall); 479 regs->syscall);
481} 480}
482 481
483static int show_trace_cb(struct stackframe *frame, void *data) 482static int show_trace_cb(struct stackframe *frame, void *data)
484{ 483{
485 if (kernel_text_address(frame->pc)) { 484 if (kernel_text_address(frame->pc)) {
486 printk(" [<%08lx>] ", frame->pc); 485 pr_cont(" [<%08lx>]", frame->pc);
487 print_symbol("%s\n", frame->pc); 486 print_symbol(" %s\n", frame->pc);
488 } 487 }
489 return 0; 488 return 0;
490} 489}
@@ -494,19 +493,13 @@ void show_trace(struct task_struct *task, unsigned long *sp)
494 if (!sp) 493 if (!sp)
495 sp = stack_pointer(task); 494 sp = stack_pointer(task);
496 495
497 printk("Call Trace:"); 496 pr_info("Call Trace:\n");
498#ifdef CONFIG_KALLSYMS
499 printk("\n");
500#endif
501 walk_stackframe(sp, show_trace_cb, NULL); 497 walk_stackframe(sp, show_trace_cb, NULL);
502 printk("\n"); 498#ifndef CONFIG_KALLSYMS
499 pr_cont("\n");
500#endif
503} 501}
504 502
505/*
506 * This routine abuses get_user()/put_user() to reference pointers
507 * with at least a bit of error checking ...
508 */
509
510static int kstack_depth_to_print = 24; 503static int kstack_depth_to_print = 24;
511 504
512void show_stack(struct task_struct *task, unsigned long *sp) 505void show_stack(struct task_struct *task, unsigned long *sp)
@@ -518,52 +511,29 @@ void show_stack(struct task_struct *task, unsigned long *sp)
518 sp = stack_pointer(task); 511 sp = stack_pointer(task);
519 stack = sp; 512 stack = sp;
520 513
521 printk("\nStack: "); 514 pr_info("Stack:\n");
522 515
523 for (i = 0; i < kstack_depth_to_print; i++) { 516 for (i = 0; i < kstack_depth_to_print; i++) {
524 if (kstack_end(sp)) 517 if (kstack_end(sp))
525 break; 518 break;
526 if (i && ((i % 8) == 0)) 519 pr_cont(" %08lx", *sp++);
527 printk("\n "); 520 if (i % 8 == 7)
528 printk("%08lx ", *sp++); 521 pr_cont("\n");
529 } 522 }
530 printk("\n");
531 show_trace(task, stack); 523 show_trace(task, stack);
532} 524}
533 525
534void show_code(unsigned int *pc)
535{
536 long i;
537
538 printk("\nCode:");
539
540 for(i = -3 ; i < 6 ; i++) {
541 unsigned long insn;
542 if (__get_user(insn, pc + i)) {
543 printk(" (Bad address in pc)\n");
544 break;
545 }
546 printk("%c%08lx%c",(i?' ':'<'),insn,(i?' ':'>'));
547 }
548}
549
550DEFINE_SPINLOCK(die_lock); 526DEFINE_SPINLOCK(die_lock);
551 527
552void die(const char * str, struct pt_regs * regs, long err) 528void die(const char * str, struct pt_regs * regs, long err)
553{ 529{
554 static int die_counter; 530 static int die_counter;
555 int nl = 0;
556 531
557 console_verbose(); 532 console_verbose();
558 spin_lock_irq(&die_lock); 533 spin_lock_irq(&die_lock);
559 534
560 printk("%s: sig: %ld [#%d]\n", str, err, ++die_counter); 535 pr_info("%s: sig: %ld [#%d]%s\n", str, err, ++die_counter,
561#ifdef CONFIG_PREEMPT 536 IS_ENABLED(CONFIG_PREEMPT) ? " PREEMPT" : "");
562 printk("PREEMPT ");
563 nl = 1;
564#endif
565 if (nl)
566 printk("\n");
567 show_regs(regs); 537 show_regs(regs);
568 if (!user_mode(regs)) 538 if (!user_mode(regs))
569 show_stack(NULL, (unsigned long*)regs->areg[1]); 539 show_stack(NULL, (unsigned long*)regs->areg[1]);
diff --git a/block/blk-map.c b/block/blk-map.c
index b8657fa8dc9a..27fd8d92892d 100644
--- a/block/blk-map.c
+++ b/block/blk-map.c
@@ -118,6 +118,9 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
118 struct iov_iter i; 118 struct iov_iter i;
119 int ret; 119 int ret;
120 120
121 if (!iter_is_iovec(iter))
122 goto fail;
123
121 if (map_data) 124 if (map_data)
122 copy = true; 125 copy = true;
123 else if (iov_iter_alignment(iter) & align) 126 else if (iov_iter_alignment(iter) & align)
@@ -140,6 +143,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
140 143
141unmap_rq: 144unmap_rq:
142 __blk_rq_unmap_user(bio); 145 __blk_rq_unmap_user(bio);
146fail:
143 rq->bio = NULL; 147 rq->bio = NULL;
144 return -EINVAL; 148 return -EINVAL;
145} 149}
diff --git a/crypto/Makefile b/crypto/Makefile
index 99cc64ac70ef..bd6a029094e6 100644
--- a/crypto/Makefile
+++ b/crypto/Makefile
@@ -40,6 +40,7 @@ obj-$(CONFIG_CRYPTO_ECDH) += ecdh_generic.o
40 40
41$(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h 41$(obj)/rsapubkey-asn1.o: $(obj)/rsapubkey-asn1.c $(obj)/rsapubkey-asn1.h
42$(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h 42$(obj)/rsaprivkey-asn1.o: $(obj)/rsaprivkey-asn1.c $(obj)/rsaprivkey-asn1.h
43$(obj)/rsa_helper.o: $(obj)/rsapubkey-asn1.h $(obj)/rsaprivkey-asn1.h
43clean-files += rsapubkey-asn1.c rsapubkey-asn1.h 44clean-files += rsapubkey-asn1.c rsapubkey-asn1.h
44clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h 45clean-files += rsaprivkey-asn1.c rsaprivkey-asn1.h
45 46
diff --git a/crypto/algif_aead.c b/crypto/algif_aead.c
index 80a0f1a78551..e9c0993b131d 100644
--- a/crypto/algif_aead.c
+++ b/crypto/algif_aead.c
@@ -81,7 +81,11 @@ static inline bool aead_sufficient_data(struct aead_ctx *ctx)
81{ 81{
82 unsigned as = crypto_aead_authsize(crypto_aead_reqtfm(&ctx->aead_req)); 82 unsigned as = crypto_aead_authsize(crypto_aead_reqtfm(&ctx->aead_req));
83 83
84 return ctx->used >= ctx->aead_assoclen + as; 84 /*
85 * The minimum amount of memory needed for an AEAD cipher is
86 * the AAD and in case of decryption the tag.
87 */
88 return ctx->used >= ctx->aead_assoclen + (ctx->enc ? 0 : as);
85} 89}
86 90
87static void aead_reset_ctx(struct aead_ctx *ctx) 91static void aead_reset_ctx(struct aead_ctx *ctx)
@@ -416,7 +420,7 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
416 unsigned int i, reqlen = GET_REQ_SIZE(tfm); 420 unsigned int i, reqlen = GET_REQ_SIZE(tfm);
417 int err = -ENOMEM; 421 int err = -ENOMEM;
418 unsigned long used; 422 unsigned long used;
419 size_t outlen; 423 size_t outlen = 0;
420 size_t usedpages = 0; 424 size_t usedpages = 0;
421 425
422 lock_sock(sk); 426 lock_sock(sk);
@@ -426,12 +430,15 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
426 goto unlock; 430 goto unlock;
427 } 431 }
428 432
429 used = ctx->used;
430 outlen = used;
431
432 if (!aead_sufficient_data(ctx)) 433 if (!aead_sufficient_data(ctx))
433 goto unlock; 434 goto unlock;
434 435
436 used = ctx->used;
437 if (ctx->enc)
438 outlen = used + as;
439 else
440 outlen = used - as;
441
435 req = sock_kmalloc(sk, reqlen, GFP_KERNEL); 442 req = sock_kmalloc(sk, reqlen, GFP_KERNEL);
436 if (unlikely(!req)) 443 if (unlikely(!req))
437 goto unlock; 444 goto unlock;
@@ -445,7 +452,7 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
445 aead_request_set_ad(req, ctx->aead_assoclen); 452 aead_request_set_ad(req, ctx->aead_assoclen);
446 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, 453 aead_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
447 aead_async_cb, sk); 454 aead_async_cb, sk);
448 used -= ctx->aead_assoclen + (ctx->enc ? as : 0); 455 used -= ctx->aead_assoclen;
449 456
450 /* take over all tx sgls from ctx */ 457 /* take over all tx sgls from ctx */
451 areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) * sgl->cur, 458 areq->tsgl = sock_kmalloc(sk, sizeof(*areq->tsgl) * sgl->cur,
@@ -461,7 +468,7 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
461 areq->tsgls = sgl->cur; 468 areq->tsgls = sgl->cur;
462 469
463 /* create rx sgls */ 470 /* create rx sgls */
464 while (iov_iter_count(&msg->msg_iter)) { 471 while (outlen > usedpages && iov_iter_count(&msg->msg_iter)) {
465 size_t seglen = min_t(size_t, iov_iter_count(&msg->msg_iter), 472 size_t seglen = min_t(size_t, iov_iter_count(&msg->msg_iter),
466 (outlen - usedpages)); 473 (outlen - usedpages));
467 474
@@ -491,16 +498,14 @@ static int aead_recvmsg_async(struct socket *sock, struct msghdr *msg,
491 498
492 last_rsgl = rsgl; 499 last_rsgl = rsgl;
493 500
494 /* we do not need more iovecs as we have sufficient memory */
495 if (outlen <= usedpages)
496 break;
497
498 iov_iter_advance(&msg->msg_iter, err); 501 iov_iter_advance(&msg->msg_iter, err);
499 } 502 }
500 err = -EINVAL; 503
501 /* ensure output buffer is sufficiently large */ 504 /* ensure output buffer is sufficiently large */
502 if (usedpages < outlen) 505 if (usedpages < outlen) {
503 goto free; 506 err = -EINVAL;
507 goto unlock;
508 }
504 509
505 aead_request_set_crypt(req, areq->tsgl, areq->first_rsgl.sgl.sg, used, 510 aead_request_set_crypt(req, areq->tsgl, areq->first_rsgl.sgl.sg, used,
506 areq->iv); 511 areq->iv);
@@ -571,6 +576,7 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags)
571 goto unlock; 576 goto unlock;
572 } 577 }
573 578
579 /* data length provided by caller via sendmsg/sendpage */
574 used = ctx->used; 580 used = ctx->used;
575 581
576 /* 582 /*
@@ -585,16 +591,27 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags)
585 if (!aead_sufficient_data(ctx)) 591 if (!aead_sufficient_data(ctx))
586 goto unlock; 592 goto unlock;
587 593
588 outlen = used; 594 /*
595 * Calculate the minimum output buffer size holding the result of the
596 * cipher operation. When encrypting data, the receiving buffer is
597 * larger by the tag length compared to the input buffer as the
598 * encryption operation generates the tag. For decryption, the input
599 * buffer provides the tag which is consumed resulting in only the
600 * plaintext without a buffer for the tag returned to the caller.
601 */
602 if (ctx->enc)
603 outlen = used + as;
604 else
605 outlen = used - as;
589 606
590 /* 607 /*
591 * The cipher operation input data is reduced by the associated data 608 * The cipher operation input data is reduced by the associated data
592 * length as this data is processed separately later on. 609 * length as this data is processed separately later on.
593 */ 610 */
594 used -= ctx->aead_assoclen + (ctx->enc ? as : 0); 611 used -= ctx->aead_assoclen;
595 612
596 /* convert iovecs of output buffers into scatterlists */ 613 /* convert iovecs of output buffers into scatterlists */
597 while (iov_iter_count(&msg->msg_iter)) { 614 while (outlen > usedpages && iov_iter_count(&msg->msg_iter)) {
598 size_t seglen = min_t(size_t, iov_iter_count(&msg->msg_iter), 615 size_t seglen = min_t(size_t, iov_iter_count(&msg->msg_iter),
599 (outlen - usedpages)); 616 (outlen - usedpages));
600 617
@@ -621,16 +638,14 @@ static int aead_recvmsg_sync(struct socket *sock, struct msghdr *msg, int flags)
621 638
622 last_rsgl = rsgl; 639 last_rsgl = rsgl;
623 640
624 /* we do not need more iovecs as we have sufficient memory */
625 if (outlen <= usedpages)
626 break;
627 iov_iter_advance(&msg->msg_iter, err); 641 iov_iter_advance(&msg->msg_iter, err);
628 } 642 }
629 643
630 err = -EINVAL;
631 /* ensure output buffer is sufficiently large */ 644 /* ensure output buffer is sufficiently large */
632 if (usedpages < outlen) 645 if (usedpages < outlen) {
646 err = -EINVAL;
633 goto unlock; 647 goto unlock;
648 }
634 649
635 sg_mark_end(sgl->sg + sgl->cur - 1); 650 sg_mark_end(sgl->sg + sgl->cur - 1);
636 aead_request_set_crypt(&ctx->aead_req, sgl->sg, ctx->first_rsgl.sgl.sg, 651 aead_request_set_crypt(&ctx->aead_req, sgl->sg, ctx->first_rsgl.sgl.sg,
diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
index 2d8466f9e49b..d19b09cdf284 100644
--- a/crypto/algif_hash.c
+++ b/crypto/algif_hash.c
@@ -214,23 +214,26 @@ static int hash_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
214 214
215 ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0); 215 ahash_request_set_crypt(&ctx->req, NULL, ctx->result, 0);
216 216
217 if (ctx->more) { 217 if (!result && !ctx->more) {
218 err = af_alg_wait_for_completion(
219 crypto_ahash_init(&ctx->req),
220 &ctx->completion);
221 if (err)
222 goto unlock;
223 }
224
225 if (!result || ctx->more) {
218 ctx->more = 0; 226 ctx->more = 0;
219 err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req), 227 err = af_alg_wait_for_completion(crypto_ahash_final(&ctx->req),
220 &ctx->completion); 228 &ctx->completion);
221 if (err) 229 if (err)
222 goto unlock; 230 goto unlock;
223 } else if (!result) {
224 err = af_alg_wait_for_completion(
225 crypto_ahash_digest(&ctx->req),
226 &ctx->completion);
227 } 231 }
228 232
229 err = memcpy_to_msg(msg, ctx->result, len); 233 err = memcpy_to_msg(msg, ctx->result, len);
230 234
231 hash_free_result(sk, ctx);
232
233unlock: 235unlock:
236 hash_free_result(sk, ctx);
234 release_sock(sk); 237 release_sock(sk);
235 238
236 return err ?: len; 239 return err ?: len;
diff --git a/crypto/asymmetric_keys/x509_cert_parser.c b/crypto/asymmetric_keys/x509_cert_parser.c
index 865f46ea724f..c80765b211cf 100644
--- a/crypto/asymmetric_keys/x509_cert_parser.c
+++ b/crypto/asymmetric_keys/x509_cert_parser.c
@@ -133,7 +133,6 @@ struct x509_certificate *x509_cert_parse(const void *data, size_t datalen)
133 return cert; 133 return cert;
134 134
135error_decode: 135error_decode:
136 kfree(cert->pub->key);
137 kfree(ctx); 136 kfree(ctx);
138error_no_ctx: 137error_no_ctx:
139 x509_free_certificate(cert); 138 x509_free_certificate(cert);
diff --git a/crypto/drbg.c b/crypto/drbg.c
index fb33f7d3b052..053035b5c8f8 100644
--- a/crypto/drbg.c
+++ b/crypto/drbg.c
@@ -262,6 +262,7 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
262 u8 *inbuf, u32 inbuflen, 262 u8 *inbuf, u32 inbuflen,
263 u8 *outbuf, u32 outlen); 263 u8 *outbuf, u32 outlen);
264#define DRBG_CTR_NULL_LEN 128 264#define DRBG_CTR_NULL_LEN 128
265#define DRBG_OUTSCRATCHLEN DRBG_CTR_NULL_LEN
265 266
266/* BCC function for CTR DRBG as defined in 10.4.3 */ 267/* BCC function for CTR DRBG as defined in 10.4.3 */
267static int drbg_ctr_bcc(struct drbg_state *drbg, 268static int drbg_ctr_bcc(struct drbg_state *drbg,
@@ -1644,6 +1645,9 @@ static int drbg_fini_sym_kernel(struct drbg_state *drbg)
1644 kfree(drbg->ctr_null_value_buf); 1645 kfree(drbg->ctr_null_value_buf);
1645 drbg->ctr_null_value = NULL; 1646 drbg->ctr_null_value = NULL;
1646 1647
1648 kfree(drbg->outscratchpadbuf);
1649 drbg->outscratchpadbuf = NULL;
1650
1647 return 0; 1651 return 0;
1648} 1652}
1649 1653
@@ -1708,6 +1712,15 @@ static int drbg_init_sym_kernel(struct drbg_state *drbg)
1708 drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf, 1712 drbg->ctr_null_value = (u8 *)PTR_ALIGN(drbg->ctr_null_value_buf,
1709 alignmask + 1); 1713 alignmask + 1);
1710 1714
1715 drbg->outscratchpadbuf = kmalloc(DRBG_OUTSCRATCHLEN + alignmask,
1716 GFP_KERNEL);
1717 if (!drbg->outscratchpadbuf) {
1718 drbg_fini_sym_kernel(drbg);
1719 return -ENOMEM;
1720 }
1721 drbg->outscratchpad = (u8 *)PTR_ALIGN(drbg->outscratchpadbuf,
1722 alignmask + 1);
1723
1711 return alignmask; 1724 return alignmask;
1712} 1725}
1713 1726
@@ -1737,15 +1750,16 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
1737 u8 *outbuf, u32 outlen) 1750 u8 *outbuf, u32 outlen)
1738{ 1751{
1739 struct scatterlist sg_in; 1752 struct scatterlist sg_in;
1753 int ret;
1740 1754
1741 sg_init_one(&sg_in, inbuf, inlen); 1755 sg_init_one(&sg_in, inbuf, inlen);
1742 1756
1743 while (outlen) { 1757 while (outlen) {
1744 u32 cryptlen = min_t(u32, inlen, outlen); 1758 u32 cryptlen = min3(inlen, outlen, (u32)DRBG_OUTSCRATCHLEN);
1745 struct scatterlist sg_out; 1759 struct scatterlist sg_out;
1746 int ret;
1747 1760
1748 sg_init_one(&sg_out, outbuf, cryptlen); 1761 /* Output buffer may not be valid for SGL, use scratchpad */
1762 sg_init_one(&sg_out, drbg->outscratchpad, cryptlen);
1749 skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out, 1763 skcipher_request_set_crypt(drbg->ctr_req, &sg_in, &sg_out,
1750 cryptlen, drbg->V); 1764 cryptlen, drbg->V);
1751 ret = crypto_skcipher_encrypt(drbg->ctr_req); 1765 ret = crypto_skcipher_encrypt(drbg->ctr_req);
@@ -1761,14 +1775,19 @@ static int drbg_kcapi_sym_ctr(struct drbg_state *drbg,
1761 break; 1775 break;
1762 } 1776 }
1763 default: 1777 default:
1764 return ret; 1778 goto out;
1765 } 1779 }
1766 init_completion(&drbg->ctr_completion); 1780 init_completion(&drbg->ctr_completion);
1767 1781
1782 memcpy(outbuf, drbg->outscratchpad, cryptlen);
1783
1768 outlen -= cryptlen; 1784 outlen -= cryptlen;
1769 } 1785 }
1786 ret = 0;
1770 1787
1771 return 0; 1788out:
1789 memzero_explicit(drbg->outscratchpad, DRBG_OUTSCRATCHLEN);
1790 return ret;
1772} 1791}
1773#endif /* CONFIG_CRYPTO_DRBG_CTR */ 1792#endif /* CONFIG_CRYPTO_DRBG_CTR */
1774 1793
diff --git a/crypto/mcryptd.c b/crypto/mcryptd.c
index 94ee44acd465..c207458d6299 100644
--- a/crypto/mcryptd.c
+++ b/crypto/mcryptd.c
@@ -254,18 +254,22 @@ out_free_inst:
254 goto out; 254 goto out;
255} 255}
256 256
257static inline void mcryptd_check_internal(struct rtattr **tb, u32 *type, 257static inline bool mcryptd_check_internal(struct rtattr **tb, u32 *type,
258 u32 *mask) 258 u32 *mask)
259{ 259{
260 struct crypto_attr_type *algt; 260 struct crypto_attr_type *algt;
261 261
262 algt = crypto_get_attr_type(tb); 262 algt = crypto_get_attr_type(tb);
263 if (IS_ERR(algt)) 263 if (IS_ERR(algt))
264 return; 264 return false;
265 if ((algt->type & CRYPTO_ALG_INTERNAL)) 265
266 *type |= CRYPTO_ALG_INTERNAL; 266 *type |= algt->type & CRYPTO_ALG_INTERNAL;
267 if ((algt->mask & CRYPTO_ALG_INTERNAL)) 267 *mask |= algt->mask & CRYPTO_ALG_INTERNAL;
268 *mask |= CRYPTO_ALG_INTERNAL; 268
269 if (*type & *mask & CRYPTO_ALG_INTERNAL)
270 return true;
271 else
272 return false;
269} 273}
270 274
271static int mcryptd_hash_init_tfm(struct crypto_tfm *tfm) 275static int mcryptd_hash_init_tfm(struct crypto_tfm *tfm)
@@ -492,7 +496,8 @@ static int mcryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
492 u32 mask = 0; 496 u32 mask = 0;
493 int err; 497 int err;
494 498
495 mcryptd_check_internal(tb, &type, &mask); 499 if (!mcryptd_check_internal(tb, &type, &mask))
500 return -EINVAL;
496 501
497 halg = ahash_attr_alg(tb[1], type, mask); 502 halg = ahash_attr_alg(tb[1], type, mask);
498 if (IS_ERR(halg)) 503 if (IS_ERR(halg))
diff --git a/crypto/scatterwalk.c b/crypto/scatterwalk.c
index 52ce17a3dd63..c16c94f88733 100644
--- a/crypto/scatterwalk.c
+++ b/crypto/scatterwalk.c
@@ -68,10 +68,6 @@ void scatterwalk_map_and_copy(void *buf, struct scatterlist *sg,
68 68
69 sg = scatterwalk_ffwd(tmp, sg, start); 69 sg = scatterwalk_ffwd(tmp, sg, start);
70 70
71 if (sg_page(sg) == virt_to_page(buf) &&
72 sg->offset == offset_in_page(buf))
73 return;
74
75 scatterwalk_start(&walk, sg); 71 scatterwalk_start(&walk, sg);
76 scatterwalk_copychunks(buf, &walk, nbytes, out); 72 scatterwalk_copychunks(buf, &walk, nbytes, out);
77 scatterwalk_done(&walk, out, 0); 73 scatterwalk_done(&walk, out, 0);
diff --git a/drivers/acpi/acpi_apd.c b/drivers/acpi/acpi_apd.c
index d58fbf7f04e6..7dd70927991e 100644
--- a/drivers/acpi/acpi_apd.c
+++ b/drivers/acpi/acpi_apd.c
@@ -122,7 +122,7 @@ static int acpi_apd_create_device(struct acpi_device *adev,
122 int ret; 122 int ret;
123 123
124 if (!dev_desc) { 124 if (!dev_desc) {
125 pdev = acpi_create_platform_device(adev); 125 pdev = acpi_create_platform_device(adev, NULL);
126 return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1; 126 return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
127 } 127 }
128 128
@@ -139,14 +139,8 @@ static int acpi_apd_create_device(struct acpi_device *adev,
139 goto err_out; 139 goto err_out;
140 } 140 }
141 141
142 if (dev_desc->properties) {
143 ret = device_add_properties(&adev->dev, dev_desc->properties);
144 if (ret)
145 goto err_out;
146 }
147
148 adev->driver_data = pdata; 142 adev->driver_data = pdata;
149 pdev = acpi_create_platform_device(adev); 143 pdev = acpi_create_platform_device(adev, dev_desc->properties);
150 if (!IS_ERR_OR_NULL(pdev)) 144 if (!IS_ERR_OR_NULL(pdev))
151 return 1; 145 return 1;
152 146
diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c
index 552010288135..373657f7e35a 100644
--- a/drivers/acpi/acpi_lpss.c
+++ b/drivers/acpi/acpi_lpss.c
@@ -395,7 +395,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
395 395
396 dev_desc = (const struct lpss_device_desc *)id->driver_data; 396 dev_desc = (const struct lpss_device_desc *)id->driver_data;
397 if (!dev_desc) { 397 if (!dev_desc) {
398 pdev = acpi_create_platform_device(adev); 398 pdev = acpi_create_platform_device(adev, NULL);
399 return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1; 399 return IS_ERR_OR_NULL(pdev) ? PTR_ERR(pdev) : 1;
400 } 400 }
401 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL); 401 pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
@@ -451,14 +451,8 @@ static int acpi_lpss_create_device(struct acpi_device *adev,
451 goto err_out; 451 goto err_out;
452 } 452 }
453 453
454 if (dev_desc->properties) {
455 ret = device_add_properties(&adev->dev, dev_desc->properties);
456 if (ret)
457 goto err_out;
458 }
459
460 adev->driver_data = pdata; 454 adev->driver_data = pdata;
461 pdev = acpi_create_platform_device(adev); 455 pdev = acpi_create_platform_device(adev, dev_desc->properties);
462 if (!IS_ERR_OR_NULL(pdev)) { 456 if (!IS_ERR_OR_NULL(pdev)) {
463 return 1; 457 return 1;
464 } 458 }
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index b200ae1f3c6f..b4c1a6a51da4 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -50,6 +50,7 @@ static void acpi_platform_fill_resource(struct acpi_device *adev,
50/** 50/**
51 * acpi_create_platform_device - Create platform device for ACPI device node 51 * acpi_create_platform_device - Create platform device for ACPI device node
52 * @adev: ACPI device node to create a platform device for. 52 * @adev: ACPI device node to create a platform device for.
53 * @properties: Optional collection of build-in properties.
53 * 54 *
54 * Check if the given @adev can be represented as a platform device and, if 55 * Check if the given @adev can be represented as a platform device and, if
55 * that's the case, create and register a platform device, populate its common 56 * that's the case, create and register a platform device, populate its common
@@ -57,7 +58,8 @@ static void acpi_platform_fill_resource(struct acpi_device *adev,
57 * 58 *
58 * Name of the platform device will be the same as @adev's. 59 * Name of the platform device will be the same as @adev's.
59 */ 60 */
60struct platform_device *acpi_create_platform_device(struct acpi_device *adev) 61struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
62 struct property_entry *properties)
61{ 63{
62 struct platform_device *pdev = NULL; 64 struct platform_device *pdev = NULL;
63 struct platform_device_info pdevinfo; 65 struct platform_device_info pdevinfo;
@@ -106,6 +108,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev)
106 pdevinfo.res = resources; 108 pdevinfo.res = resources;
107 pdevinfo.num_res = count; 109 pdevinfo.num_res = count;
108 pdevinfo.fwnode = acpi_fwnode_handle(adev); 110 pdevinfo.fwnode = acpi_fwnode_handle(adev);
111 pdevinfo.properties = properties;
109 112
110 if (acpi_dma_supported(adev)) 113 if (acpi_dma_supported(adev))
111 pdevinfo.dma_mask = DMA_BIT_MASK(32); 114 pdevinfo.dma_mask = DMA_BIT_MASK(32);
diff --git a/drivers/acpi/acpica/tbfadt.c b/drivers/acpi/acpica/tbfadt.c
index 046c4d0394ee..5fb838e592dc 100644
--- a/drivers/acpi/acpica/tbfadt.c
+++ b/drivers/acpi/acpica/tbfadt.c
@@ -480,19 +480,17 @@ static void acpi_tb_convert_fadt(void)
480 u32 i; 480 u32 i;
481 481
482 /* 482 /*
483 * For ACPI 1.0 FADTs (revision 1), ensure that reserved fields which 483 * For ACPI 1.0 FADTs (revision 1 or 2), ensure that reserved fields which
484 * should be zero are indeed zero. This will workaround BIOSs that 484 * should be zero are indeed zero. This will workaround BIOSs that
485 * inadvertently place values in these fields. 485 * inadvertently place values in these fields.
486 * 486 *
487 * The ACPI 1.0 reserved fields that will be zeroed are the bytes located 487 * The ACPI 1.0 reserved fields that will be zeroed are the bytes located
488 * at offset 45, 55, 95, and the word located at offset 109, 110. 488 * at offset 45, 55, 95, and the word located at offset 109, 110.
489 * 489 *
490 * Note: The FADT revision value is unreliable because of BIOS errors. 490 * Note: The FADT revision value is unreliable. Only the length can be
491 * The table length is instead used as the final word on the version. 491 * trusted.
492 *
493 * Note: FADT revision 3 is the ACPI 2.0 version of the FADT.
494 */ 492 */
495 if (acpi_gbl_FADT.header.length <= ACPI_FADT_V3_SIZE) { 493 if (acpi_gbl_FADT.header.length <= ACPI_FADT_V2_SIZE) {
496 acpi_gbl_FADT.preferred_profile = 0; 494 acpi_gbl_FADT.preferred_profile = 0;
497 acpi_gbl_FADT.pstate_control = 0; 495 acpi_gbl_FADT.pstate_control = 0;
498 acpi_gbl_FADT.cst_control = 0; 496 acpi_gbl_FADT.cst_control = 0;
diff --git a/drivers/acpi/dptf/int340x_thermal.c b/drivers/acpi/dptf/int340x_thermal.c
index 33505c651f62..86364097e236 100644
--- a/drivers/acpi/dptf/int340x_thermal.c
+++ b/drivers/acpi/dptf/int340x_thermal.c
@@ -34,11 +34,11 @@ static int int340x_thermal_handler_attach(struct acpi_device *adev,
34 const struct acpi_device_id *id) 34 const struct acpi_device_id *id)
35{ 35{
36 if (IS_ENABLED(CONFIG_INT340X_THERMAL)) 36 if (IS_ENABLED(CONFIG_INT340X_THERMAL))
37 acpi_create_platform_device(adev); 37 acpi_create_platform_device(adev, NULL);
38 /* Intel SoC DTS thermal driver needs INT3401 to set IRQ descriptor */ 38 /* Intel SoC DTS thermal driver needs INT3401 to set IRQ descriptor */
39 else if (IS_ENABLED(CONFIG_INTEL_SOC_DTS_THERMAL) && 39 else if (IS_ENABLED(CONFIG_INTEL_SOC_DTS_THERMAL) &&
40 id->driver_data == INT3401_DEVICE) 40 id->driver_data == INT3401_DEVICE)
41 acpi_create_platform_device(adev); 41 acpi_create_platform_device(adev, NULL);
42 return 1; 42 return 1;
43} 43}
44 44
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c
index 71a7d07c28c9..312c4b4dc363 100644
--- a/drivers/acpi/nfit/core.c
+++ b/drivers/acpi/nfit/core.c
@@ -94,7 +94,7 @@ static struct acpi_device *to_acpi_dev(struct acpi_nfit_desc *acpi_desc)
94 return to_acpi_device(acpi_desc->dev); 94 return to_acpi_device(acpi_desc->dev);
95} 95}
96 96
97static int xlat_status(void *buf, unsigned int cmd, u32 status) 97static int xlat_bus_status(void *buf, unsigned int cmd, u32 status)
98{ 98{
99 struct nd_cmd_clear_error *clear_err; 99 struct nd_cmd_clear_error *clear_err;
100 struct nd_cmd_ars_status *ars_status; 100 struct nd_cmd_ars_status *ars_status;
@@ -113,7 +113,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
113 flags = ND_ARS_PERSISTENT | ND_ARS_VOLATILE; 113 flags = ND_ARS_PERSISTENT | ND_ARS_VOLATILE;
114 if ((status >> 16 & flags) == 0) 114 if ((status >> 16 & flags) == 0)
115 return -ENOTTY; 115 return -ENOTTY;
116 break; 116 return 0;
117 case ND_CMD_ARS_START: 117 case ND_CMD_ARS_START:
118 /* ARS is in progress */ 118 /* ARS is in progress */
119 if ((status & 0xffff) == NFIT_ARS_START_BUSY) 119 if ((status & 0xffff) == NFIT_ARS_START_BUSY)
@@ -122,7 +122,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
122 /* Command failed */ 122 /* Command failed */
123 if (status & 0xffff) 123 if (status & 0xffff)
124 return -EIO; 124 return -EIO;
125 break; 125 return 0;
126 case ND_CMD_ARS_STATUS: 126 case ND_CMD_ARS_STATUS:
127 ars_status = buf; 127 ars_status = buf;
128 /* Command failed */ 128 /* Command failed */
@@ -146,7 +146,8 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
146 * then just continue with the returned results. 146 * then just continue with the returned results.
147 */ 147 */
148 if (status == NFIT_ARS_STATUS_INTR) { 148 if (status == NFIT_ARS_STATUS_INTR) {
149 if (ars_status->flags & NFIT_ARS_F_OVERFLOW) 149 if (ars_status->out_length >= 40 && (ars_status->flags
150 & NFIT_ARS_F_OVERFLOW))
150 return -ENOSPC; 151 return -ENOSPC;
151 return 0; 152 return 0;
152 } 153 }
@@ -154,7 +155,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
154 /* Unknown status */ 155 /* Unknown status */
155 if (status >> 16) 156 if (status >> 16)
156 return -EIO; 157 return -EIO;
157 break; 158 return 0;
158 case ND_CMD_CLEAR_ERROR: 159 case ND_CMD_CLEAR_ERROR:
159 clear_err = buf; 160 clear_err = buf;
160 if (status & 0xffff) 161 if (status & 0xffff)
@@ -163,7 +164,7 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
163 return -EIO; 164 return -EIO;
164 if (clear_err->length > clear_err->cleared) 165 if (clear_err->length > clear_err->cleared)
165 return clear_err->cleared; 166 return clear_err->cleared;
166 break; 167 return 0;
167 default: 168 default:
168 break; 169 break;
169 } 170 }
@@ -174,9 +175,18 @@ static int xlat_status(void *buf, unsigned int cmd, u32 status)
174 return 0; 175 return 0;
175} 176}
176 177
177static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, 178static int xlat_status(struct nvdimm *nvdimm, void *buf, unsigned int cmd,
178 struct nvdimm *nvdimm, unsigned int cmd, void *buf, 179 u32 status)
179 unsigned int buf_len, int *cmd_rc) 180{
181 if (!nvdimm)
182 return xlat_bus_status(buf, cmd, status);
183 if (status)
184 return -EIO;
185 return 0;
186}
187
188int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
189 unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc)
180{ 190{
181 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc); 191 struct acpi_nfit_desc *acpi_desc = to_acpi_nfit_desc(nd_desc);
182 union acpi_object in_obj, in_buf, *out_obj; 192 union acpi_object in_obj, in_buf, *out_obj;
@@ -298,7 +308,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
298 308
299 for (i = 0, offset = 0; i < desc->out_num; i++) { 309 for (i = 0, offset = 0; i < desc->out_num; i++) {
300 u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, buf, 310 u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, buf,
301 (u32 *) out_obj->buffer.pointer); 311 (u32 *) out_obj->buffer.pointer,
312 out_obj->buffer.length - offset);
302 313
303 if (offset + out_size > out_obj->buffer.length) { 314 if (offset + out_size > out_obj->buffer.length) {
304 dev_dbg(dev, "%s:%s output object underflow cmd: %s field: %d\n", 315 dev_dbg(dev, "%s:%s output object underflow cmd: %s field: %d\n",
@@ -333,7 +344,8 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
333 */ 344 */
334 rc = buf_len - offset - in_buf.buffer.length; 345 rc = buf_len - offset - in_buf.buffer.length;
335 if (cmd_rc) 346 if (cmd_rc)
336 *cmd_rc = xlat_status(buf, cmd, fw_status); 347 *cmd_rc = xlat_status(nvdimm, buf, cmd,
348 fw_status);
337 } else { 349 } else {
338 dev_err(dev, "%s:%s underrun cmd: %s buf_len: %d out_len: %d\n", 350 dev_err(dev, "%s:%s underrun cmd: %s buf_len: %d out_len: %d\n",
339 __func__, dimm_name, cmd_name, buf_len, 351 __func__, dimm_name, cmd_name, buf_len,
@@ -343,7 +355,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
343 } else { 355 } else {
344 rc = 0; 356 rc = 0;
345 if (cmd_rc) 357 if (cmd_rc)
346 *cmd_rc = xlat_status(buf, cmd, fw_status); 358 *cmd_rc = xlat_status(nvdimm, buf, cmd, fw_status);
347 } 359 }
348 360
349 out: 361 out:
@@ -351,6 +363,7 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
351 363
352 return rc; 364 return rc;
353} 365}
366EXPORT_SYMBOL_GPL(acpi_nfit_ctl);
354 367
355static const char *spa_type_name(u16 type) 368static const char *spa_type_name(u16 type)
356{ 369{
@@ -2001,19 +2014,32 @@ static int ars_get_status(struct acpi_nfit_desc *acpi_desc)
2001 return cmd_rc; 2014 return cmd_rc;
2002} 2015}
2003 2016
2004static int ars_status_process_records(struct nvdimm_bus *nvdimm_bus, 2017static int ars_status_process_records(struct acpi_nfit_desc *acpi_desc,
2005 struct nd_cmd_ars_status *ars_status) 2018 struct nd_cmd_ars_status *ars_status)
2006{ 2019{
2020 struct nvdimm_bus *nvdimm_bus = acpi_desc->nvdimm_bus;
2007 int rc; 2021 int rc;
2008 u32 i; 2022 u32 i;
2009 2023
2024 /*
2025 * First record starts at 44 byte offset from the start of the
2026 * payload.
2027 */
2028 if (ars_status->out_length < 44)
2029 return 0;
2010 for (i = 0; i < ars_status->num_records; i++) { 2030 for (i = 0; i < ars_status->num_records; i++) {
2031 /* only process full records */
2032 if (ars_status->out_length
2033 < 44 + sizeof(struct nd_ars_record) * (i + 1))
2034 break;
2011 rc = nvdimm_bus_add_poison(nvdimm_bus, 2035 rc = nvdimm_bus_add_poison(nvdimm_bus,
2012 ars_status->records[i].err_address, 2036 ars_status->records[i].err_address,
2013 ars_status->records[i].length); 2037 ars_status->records[i].length);
2014 if (rc) 2038 if (rc)
2015 return rc; 2039 return rc;
2016 } 2040 }
2041 if (i < ars_status->num_records)
2042 dev_warn(acpi_desc->dev, "detected truncated ars results\n");
2017 2043
2018 return 0; 2044 return 0;
2019} 2045}
@@ -2266,8 +2292,7 @@ static int acpi_nfit_query_poison(struct acpi_nfit_desc *acpi_desc,
2266 if (rc < 0 && rc != -ENOSPC) 2292 if (rc < 0 && rc != -ENOSPC)
2267 return rc; 2293 return rc;
2268 2294
2269 if (ars_status_process_records(acpi_desc->nvdimm_bus, 2295 if (ars_status_process_records(acpi_desc, acpi_desc->ars_status))
2270 acpi_desc->ars_status))
2271 return -ENOMEM; 2296 return -ENOMEM;
2272 2297
2273 return 0; 2298 return 0;
diff --git a/drivers/acpi/nfit/nfit.h b/drivers/acpi/nfit/nfit.h
index 14296f5267c8..fc29c2e9832e 100644
--- a/drivers/acpi/nfit/nfit.h
+++ b/drivers/acpi/nfit/nfit.h
@@ -240,5 +240,7 @@ const u8 *to_nfit_uuid(enum nfit_uuids id);
240int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz); 240int acpi_nfit_init(struct acpi_nfit_desc *acpi_desc, void *nfit, acpi_size sz);
241void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event); 241void __acpi_nfit_notify(struct device *dev, acpi_handle handle, u32 event);
242void __acpi_nvdimm_notify(struct device *dev, u32 event); 242void __acpi_nvdimm_notify(struct device *dev, u32 event);
243int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc, struct nvdimm *nvdimm,
244 unsigned int cmd, void *buf, unsigned int buf_len, int *cmd_rc);
243void acpi_nfit_desc_init(struct acpi_nfit_desc *acpi_desc, struct device *dev); 245void acpi_nfit_desc_init(struct acpi_nfit_desc *acpi_desc, struct device *dev);
244#endif /* __NFIT_H__ */ 246#endif /* __NFIT_H__ */
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index 035ac646d8db..3d1856f1f4d0 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -1734,7 +1734,7 @@ static void acpi_default_enumeration(struct acpi_device *device)
1734 &is_spi_i2c_slave); 1734 &is_spi_i2c_slave);
1735 acpi_dev_free_resource_list(&resource_list); 1735 acpi_dev_free_resource_list(&resource_list);
1736 if (!is_spi_i2c_slave) { 1736 if (!is_spi_i2c_slave) {
1737 acpi_create_platform_device(device); 1737 acpi_create_platform_device(device, NULL);
1738 acpi_device_set_enumerated(device); 1738 acpi_device_set_enumerated(device);
1739 } else { 1739 } else {
1740 blocking_notifier_call_chain(&acpi_reconfig_chain, 1740 blocking_notifier_call_chain(&acpi_reconfig_chain,
diff --git a/drivers/acpi/sleep.c b/drivers/acpi/sleep.c
index deb0ff78eba8..54abb26b7366 100644
--- a/drivers/acpi/sleep.c
+++ b/drivers/acpi/sleep.c
@@ -47,32 +47,15 @@ static void acpi_sleep_tts_switch(u32 acpi_state)
47 } 47 }
48} 48}
49 49
50static void acpi_sleep_pts_switch(u32 acpi_state) 50static int tts_notify_reboot(struct notifier_block *this,
51{
52 acpi_status status;
53
54 status = acpi_execute_simple_method(NULL, "\\_PTS", acpi_state);
55 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
56 /*
57 * OS can't evaluate the _PTS object correctly. Some warning
58 * message will be printed. But it won't break anything.
59 */
60 printk(KERN_NOTICE "Failure in evaluating _PTS object\n");
61 }
62}
63
64static int sleep_notify_reboot(struct notifier_block *this,
65 unsigned long code, void *x) 51 unsigned long code, void *x)
66{ 52{
67 acpi_sleep_tts_switch(ACPI_STATE_S5); 53 acpi_sleep_tts_switch(ACPI_STATE_S5);
68
69 acpi_sleep_pts_switch(ACPI_STATE_S5);
70
71 return NOTIFY_DONE; 54 return NOTIFY_DONE;
72} 55}
73 56
74static struct notifier_block sleep_notifier = { 57static struct notifier_block tts_notifier = {
75 .notifier_call = sleep_notify_reboot, 58 .notifier_call = tts_notify_reboot,
76 .next = NULL, 59 .next = NULL,
77 .priority = 0, 60 .priority = 0,
78}; 61};
@@ -916,9 +899,9 @@ int __init acpi_sleep_init(void)
916 pr_info(PREFIX "(supports%s)\n", supported); 899 pr_info(PREFIX "(supports%s)\n", supported);
917 900
918 /* 901 /*
919 * Register the sleep_notifier to reboot notifier list so that the _TTS 902 * Register the tts_notifier to reboot notifier list so that the _TTS
920 * and _PTS object can also be evaluated when the system enters S5. 903 * object can also be evaluated when the system enters S5.
921 */ 904 */
922 register_reboot_notifier(&sleep_notifier); 905 register_reboot_notifier(&tts_notifier);
923 return 0; 906 return 0;
924} 907}
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 9669fc7c19df..74f4c662f776 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1436,13 +1436,6 @@ static int ahci_init_msi(struct pci_dev *pdev, unsigned int n_ports,
1436 "ahci: MRSM is on, fallback to single MSI\n"); 1436 "ahci: MRSM is on, fallback to single MSI\n");
1437 pci_free_irq_vectors(pdev); 1437 pci_free_irq_vectors(pdev);
1438 } 1438 }
1439
1440 /*
1441 * -ENOSPC indicated we don't have enough vectors. Don't bother
1442 * trying a single vectors for any other error:
1443 */
1444 if (nvec < 0 && nvec != -ENOSPC)
1445 return nvec;
1446 } 1439 }
1447 1440
1448 /* 1441 /*
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 9cceb4a875a5..8e575fbdf31d 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1088,7 +1088,7 @@ static void ata_gen_passthru_sense(struct ata_queued_cmd *qc)
1088 desc[1] = tf->command; /* status */ 1088 desc[1] = tf->command; /* status */
1089 desc[2] = tf->device; 1089 desc[2] = tf->device;
1090 desc[3] = tf->nsect; 1090 desc[3] = tf->nsect;
1091 desc[0] = 0; 1091 desc[7] = 0;
1092 if (tf->flags & ATA_TFLAG_LBA48) { 1092 if (tf->flags & ATA_TFLAG_LBA48) {
1093 desc[8] |= 0x80; 1093 desc[8] |= 0x80;
1094 if (tf->hob_nsect) 1094 if (tf->hob_nsect)
@@ -1159,6 +1159,7 @@ static void ata_scsi_sdev_config(struct scsi_device *sdev)
1159{ 1159{
1160 sdev->use_10_for_rw = 1; 1160 sdev->use_10_for_rw = 1;
1161 sdev->use_10_for_ms = 1; 1161 sdev->use_10_for_ms = 1;
1162 sdev->no_write_same = 1;
1162 1163
1163 /* Schedule policy is determined by ->qc_defer() callback and 1164 /* Schedule policy is determined by ->qc_defer() callback and
1164 * it needs to see every deferred qc. Set dev_blocked to 1 to 1165 * it needs to see every deferred qc. Set dev_blocked to 1 to
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
index efc48bf89d51..823e938c9a78 100644
--- a/drivers/ata/sata_mv.c
+++ b/drivers/ata/sata_mv.c
@@ -4090,7 +4090,20 @@ static int mv_platform_probe(struct platform_device *pdev)
4090 4090
4091 /* allocate host */ 4091 /* allocate host */
4092 if (pdev->dev.of_node) { 4092 if (pdev->dev.of_node) {
4093 of_property_read_u32(pdev->dev.of_node, "nr-ports", &n_ports); 4093 rc = of_property_read_u32(pdev->dev.of_node, "nr-ports",
4094 &n_ports);
4095 if (rc) {
4096 dev_err(&pdev->dev,
4097 "error parsing nr-ports property: %d\n", rc);
4098 return rc;
4099 }
4100
4101 if (n_ports <= 0) {
4102 dev_err(&pdev->dev, "nr-ports must be positive: %d\n",
4103 n_ports);
4104 return -EINVAL;
4105 }
4106
4094 irq = irq_of_parse_and_map(pdev->dev.of_node, 0); 4107 irq = irq_of_parse_and_map(pdev->dev.of_node, 0);
4095 } else { 4108 } else {
4096 mv_platform_data = dev_get_platdata(&pdev->dev); 4109 mv_platform_data = dev_get_platdata(&pdev->dev);
diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c
index f2aaf9e32a36..40c2d561417b 100644
--- a/drivers/atm/eni.c
+++ b/drivers/atm/eni.c
@@ -1727,7 +1727,7 @@ static int eni_do_init(struct atm_dev *dev)
1727 printk("\n"); 1727 printk("\n");
1728 printk(KERN_ERR DEV_LABEL "(itf %d): can't set up page " 1728 printk(KERN_ERR DEV_LABEL "(itf %d): can't set up page "
1729 "mapping\n",dev->number); 1729 "mapping\n",dev->number);
1730 return error; 1730 return -ENOMEM;
1731 } 1731 }
1732 eni_dev->ioaddr = base; 1732 eni_dev->ioaddr = base;
1733 eni_dev->base_diff = real_base - (unsigned long) base; 1733 eni_dev->base_diff = real_base - (unsigned long) base;
diff --git a/drivers/atm/lanai.c b/drivers/atm/lanai.c
index ce43ae3e87b3..445505d9ea07 100644
--- a/drivers/atm/lanai.c
+++ b/drivers/atm/lanai.c
@@ -2143,6 +2143,7 @@ static int lanai_dev_open(struct atm_dev *atmdev)
2143 lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE); 2143 lanai->base = (bus_addr_t) ioremap(raw_base, LANAI_MAPPING_SIZE);
2144 if (lanai->base == NULL) { 2144 if (lanai->base == NULL) {
2145 printk(KERN_ERR DEV_LABEL ": couldn't remap I/O space\n"); 2145 printk(KERN_ERR DEV_LABEL ": couldn't remap I/O space\n");
2146 result = -ENOMEM;
2146 goto error_pci; 2147 goto error_pci;
2147 } 2148 }
2148 /* 3.3: Reset lanai and PHY */ 2149 /* 3.3: Reset lanai and PHY */
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index d22a7260f42b..d76cd97a98b6 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -324,7 +324,8 @@ static int really_probe(struct device *dev, struct device_driver *drv)
324{ 324{
325 int ret = -EPROBE_DEFER; 325 int ret = -EPROBE_DEFER;
326 int local_trigger_count = atomic_read(&deferred_trigger_count); 326 int local_trigger_count = atomic_read(&deferred_trigger_count);
327 bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE); 327 bool test_remove = IS_ENABLED(CONFIG_DEBUG_TEST_DRIVER_REMOVE) &&
328 !drv->suppress_bind_attrs;
328 329
329 if (defer_all_probes) { 330 if (defer_all_probes) {
330 /* 331 /*
@@ -383,7 +384,7 @@ re_probe:
383 if (test_remove) { 384 if (test_remove) {
384 test_remove = false; 385 test_remove = false;
385 386
386 if (dev->bus && dev->bus->remove) 387 if (dev->bus->remove)
387 dev->bus->remove(dev); 388 dev->bus->remove(dev);
388 else if (drv->remove) 389 else if (drv->remove)
389 drv->remove(dev); 390 drv->remove(dev);
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index e44944f4be77..2932a5bd892f 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1027,6 +1027,8 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
1027 TRACE_DEVICE(dev); 1027 TRACE_DEVICE(dev);
1028 TRACE_SUSPEND(0); 1028 TRACE_SUSPEND(0);
1029 1029
1030 dpm_wait_for_children(dev, async);
1031
1030 if (async_error) 1032 if (async_error)
1031 goto Complete; 1033 goto Complete;
1032 1034
@@ -1038,8 +1040,6 @@ static int __device_suspend_noirq(struct device *dev, pm_message_t state, bool a
1038 if (dev->power.syscore || dev->power.direct_complete) 1040 if (dev->power.syscore || dev->power.direct_complete)
1039 goto Complete; 1041 goto Complete;
1040 1042
1041 dpm_wait_for_children(dev, async);
1042
1043 if (dev->pm_domain) { 1043 if (dev->pm_domain) {
1044 info = "noirq power domain "; 1044 info = "noirq power domain ";
1045 callback = pm_noirq_op(&dev->pm_domain->ops, state); 1045 callback = pm_noirq_op(&dev->pm_domain->ops, state);
@@ -1174,6 +1174,8 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
1174 1174
1175 __pm_runtime_disable(dev, false); 1175 __pm_runtime_disable(dev, false);
1176 1176
1177 dpm_wait_for_children(dev, async);
1178
1177 if (async_error) 1179 if (async_error)
1178 goto Complete; 1180 goto Complete;
1179 1181
@@ -1185,8 +1187,6 @@ static int __device_suspend_late(struct device *dev, pm_message_t state, bool as
1185 if (dev->power.syscore || dev->power.direct_complete) 1187 if (dev->power.syscore || dev->power.direct_complete)
1186 goto Complete; 1188 goto Complete;
1187 1189
1188 dpm_wait_for_children(dev, async);
1189
1190 if (dev->pm_domain) { 1190 if (dev->pm_domain) {
1191 info = "late power domain "; 1191 info = "late power domain ";
1192 callback = pm_late_early_op(&dev->pm_domain->ops, state); 1192 callback = pm_late_early_op(&dev->pm_domain->ops, state);
diff --git a/drivers/block/aoe/aoecmd.c b/drivers/block/aoe/aoecmd.c
index ab19adb07a12..3c606c09fd5a 100644
--- a/drivers/block/aoe/aoecmd.c
+++ b/drivers/block/aoe/aoecmd.c
@@ -853,45 +853,6 @@ rqbiocnt(struct request *r)
853 return n; 853 return n;
854} 854}
855 855
856/* This can be removed if we are certain that no users of the block
857 * layer will ever use zero-count pages in bios. Otherwise we have to
858 * protect against the put_page sometimes done by the network layer.
859 *
860 * See http://oss.sgi.com/archives/xfs/2007-01/msg00594.html for
861 * discussion.
862 *
863 * We cannot use get_page in the workaround, because it insists on a
864 * positive page count as a precondition. So we use _refcount directly.
865 */
866static void
867bio_pageinc(struct bio *bio)
868{
869 struct bio_vec bv;
870 struct page *page;
871 struct bvec_iter iter;
872
873 bio_for_each_segment(bv, bio, iter) {
874 /* Non-zero page count for non-head members of
875 * compound pages is no longer allowed by the kernel.
876 */
877 page = compound_head(bv.bv_page);
878 page_ref_inc(page);
879 }
880}
881
882static void
883bio_pagedec(struct bio *bio)
884{
885 struct page *page;
886 struct bio_vec bv;
887 struct bvec_iter iter;
888
889 bio_for_each_segment(bv, bio, iter) {
890 page = compound_head(bv.bv_page);
891 page_ref_dec(page);
892 }
893}
894
895static void 856static void
896bufinit(struct buf *buf, struct request *rq, struct bio *bio) 857bufinit(struct buf *buf, struct request *rq, struct bio *bio)
897{ 858{
@@ -899,7 +860,6 @@ bufinit(struct buf *buf, struct request *rq, struct bio *bio)
899 buf->rq = rq; 860 buf->rq = rq;
900 buf->bio = bio; 861 buf->bio = bio;
901 buf->iter = bio->bi_iter; 862 buf->iter = bio->bi_iter;
902 bio_pageinc(bio);
903} 863}
904 864
905static struct buf * 865static struct buf *
@@ -1127,7 +1087,6 @@ aoe_end_buf(struct aoedev *d, struct buf *buf)
1127 if (buf == d->ip.buf) 1087 if (buf == d->ip.buf)
1128 d->ip.buf = NULL; 1088 d->ip.buf = NULL;
1129 rq = buf->rq; 1089 rq = buf->rq;
1130 bio_pagedec(buf->bio);
1131 mempool_free(buf, d->bufpool); 1090 mempool_free(buf, d->bufpool);
1132 n = (unsigned long) rq->special; 1091 n = (unsigned long) rq->special;
1133 rq->special = (void *) --n; 1092 rq->special = (void *) --n;
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index 100be556e613..83482721bc01 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -1871,7 +1871,7 @@ int drbd_send(struct drbd_connection *connection, struct socket *sock,
1871 drbd_update_congested(connection); 1871 drbd_update_congested(connection);
1872 } 1872 }
1873 do { 1873 do {
1874 rv = kernel_sendmsg(sock, &msg, &iov, 1, size); 1874 rv = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);
1875 if (rv == -EAGAIN) { 1875 if (rv == -EAGAIN) {
1876 if (we_should_drop_the_connection(connection, sock)) 1876 if (we_should_drop_the_connection(connection, sock))
1877 break; 1877 break;
diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 19a16b2dbb91..7a1048755914 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -599,7 +599,7 @@ static int __nbd_ioctl(struct block_device *bdev, struct nbd_device *nbd,
599 return -EINVAL; 599 return -EINVAL;
600 600
601 sreq = blk_mq_alloc_request(bdev_get_queue(bdev), WRITE, 0); 601 sreq = blk_mq_alloc_request(bdev_get_queue(bdev), WRITE, 0);
602 if (!sreq) 602 if (IS_ERR(sreq))
603 return -ENOMEM; 603 return -ENOMEM;
604 604
605 mutex_unlock(&nbd->tx_lock); 605 mutex_unlock(&nbd->tx_lock);
diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c
index 04365b17ee67..5497f7fc44d0 100644
--- a/drivers/block/zram/zram_drv.c
+++ b/drivers/block/zram/zram_drv.c
@@ -1403,7 +1403,8 @@ static ssize_t hot_remove_store(struct class *class,
1403 zram = idr_find(&zram_index_idr, dev_id); 1403 zram = idr_find(&zram_index_idr, dev_id);
1404 if (zram) { 1404 if (zram) {
1405 ret = zram_remove(zram); 1405 ret = zram_remove(zram);
1406 idr_remove(&zram_index_idr, dev_id); 1406 if (!ret)
1407 idr_remove(&zram_index_idr, dev_id);
1407 } else { 1408 } else {
1408 ret = -ENODEV; 1409 ret = -ENODEV;
1409 } 1410 }
@@ -1412,8 +1413,14 @@ static ssize_t hot_remove_store(struct class *class,
1412 return ret ? ret : count; 1413 return ret ? ret : count;
1413} 1414}
1414 1415
1416/*
1417 * NOTE: hot_add attribute is not the usual read-only sysfs attribute. In a
1418 * sense that reading from this file does alter the state of your system -- it
1419 * creates a new un-initialized zram device and returns back this device's
1420 * device_id (or an error code if it fails to create a new device).
1421 */
1415static struct class_attribute zram_control_class_attrs[] = { 1422static struct class_attribute zram_control_class_attrs[] = {
1416 __ATTR_RO(hot_add), 1423 __ATTR(hot_add, 0400, hot_add_show, NULL),
1417 __ATTR_WO(hot_remove), 1424 __ATTR_WO(hot_remove),
1418 __ATTR_NULL, 1425 __ATTR_NULL,
1419}; 1426};
diff --git a/drivers/char/ipmi/bt-bmc.c b/drivers/char/ipmi/bt-bmc.c
index b49e61320952..fc9e8891eae3 100644
--- a/drivers/char/ipmi/bt-bmc.c
+++ b/drivers/char/ipmi/bt-bmc.c
@@ -484,7 +484,7 @@ static int bt_bmc_remove(struct platform_device *pdev)
484} 484}
485 485
486static const struct of_device_id bt_bmc_match[] = { 486static const struct of_device_id bt_bmc_match[] = {
487 { .compatible = "aspeed,ast2400-bt-bmc" }, 487 { .compatible = "aspeed,ast2400-ibt-bmc" },
488 { }, 488 { },
489}; 489};
490 490
@@ -502,4 +502,4 @@ module_platform_driver(bt_bmc_driver);
502MODULE_DEVICE_TABLE(of, bt_bmc_match); 502MODULE_DEVICE_TABLE(of, bt_bmc_match);
503MODULE_LICENSE("GPL"); 503MODULE_LICENSE("GPL");
504MODULE_AUTHOR("Alistair Popple <alistair@popple.id.au>"); 504MODULE_AUTHOR("Alistair Popple <alistair@popple.id.au>");
505MODULE_DESCRIPTION("Linux device interface to the BT interface"); 505MODULE_DESCRIPTION("Linux device interface to the IPMI BT interface");
diff --git a/drivers/char/ppdev.c b/drivers/char/ppdev.c
index d23368874710..6af1ce04b3da 100644
--- a/drivers/char/ppdev.c
+++ b/drivers/char/ppdev.c
@@ -748,10 +748,7 @@ static int pp_release(struct inode *inode, struct file *file)
748 } 748 }
749 749
750 if (pp->pdev) { 750 if (pp->pdev) {
751 const char *name = pp->pdev->name;
752
753 parport_unregister_device(pp->pdev); 751 parport_unregister_device(pp->pdev);
754 kfree(name);
755 pp->pdev = NULL; 752 pp->pdev = NULL;
756 pr_debug(CHRDEV "%x: unregistered pardevice\n", minor); 753 pr_debug(CHRDEV "%x: unregistered pardevice\n", minor);
757 } 754 }
diff --git a/drivers/clk/bcm/Kconfig b/drivers/clk/bcm/Kconfig
index f21e9b7afd1a..e3eed5a78404 100644
--- a/drivers/clk/bcm/Kconfig
+++ b/drivers/clk/bcm/Kconfig
@@ -20,7 +20,7 @@ config CLK_BCM_KONA
20 20
21config COMMON_CLK_IPROC 21config COMMON_CLK_IPROC
22 bool "Broadcom iProc clock support" 22 bool "Broadcom iProc clock support"
23 depends on ARCH_BCM_IPROC || COMPILE_TEST 23 depends on ARCH_BCM_IPROC || ARCH_BCM_63XX || COMPILE_TEST
24 depends on COMMON_CLK 24 depends on COMMON_CLK
25 default ARCH_BCM_IPROC 25 default ARCH_BCM_IPROC
26 help 26 help
diff --git a/drivers/clk/berlin/bg2.c b/drivers/clk/berlin/bg2.c
index edf3b96b3b73..1d99292e2039 100644
--- a/drivers/clk/berlin/bg2.c
+++ b/drivers/clk/berlin/bg2.c
@@ -685,7 +685,7 @@ static void __init berlin2_clock_setup(struct device_node *np)
685 } 685 }
686 686
687 /* register clk-provider */ 687 /* register clk-provider */
688 of_clk_add_hw_provider(np, of_clk_hw_onecell_get, &clk_data); 688 of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
689 689
690 return; 690 return;
691 691
diff --git a/drivers/clk/berlin/bg2q.c b/drivers/clk/berlin/bg2q.c
index 0718e831475f..3b784b593afd 100644
--- a/drivers/clk/berlin/bg2q.c
+++ b/drivers/clk/berlin/bg2q.c
@@ -382,7 +382,7 @@ static void __init berlin2q_clock_setup(struct device_node *np)
382 } 382 }
383 383
384 /* register clk-provider */ 384 /* register clk-provider */
385 of_clk_add_hw_provider(np, of_clk_hw_onecell_get, &clk_data); 385 of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
386 386
387 return; 387 return;
388 388
diff --git a/drivers/clk/clk-efm32gg.c b/drivers/clk/clk-efm32gg.c
index 8802a2dd56ac..f674778fb3ac 100644
--- a/drivers/clk/clk-efm32gg.c
+++ b/drivers/clk/clk-efm32gg.c
@@ -82,6 +82,6 @@ static void __init efm32gg_cmu_init(struct device_node *np)
82 hws[clk_HFPERCLKDAC0] = clk_hw_register_gate(NULL, "HFPERCLK.DAC0", 82 hws[clk_HFPERCLKDAC0] = clk_hw_register_gate(NULL, "HFPERCLK.DAC0",
83 "HFXO", 0, base + CMU_HFPERCLKEN0, 17, 0, NULL); 83 "HFXO", 0, base + CMU_HFPERCLKEN0, 17, 0, NULL);
84 84
85 of_clk_add_hw_provider(np, of_clk_hw_onecell_get, &clk_data); 85 of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_data);
86} 86}
87CLK_OF_DECLARE(efm32ggcmu, "efm32gg,cmu", efm32gg_cmu_init); 87CLK_OF_DECLARE(efm32ggcmu, "efm32gg,cmu", efm32gg_cmu_init);
diff --git a/drivers/clk/clk-qoriq.c b/drivers/clk/clk-qoriq.c
index 20b105584f82..80ae2a51452d 100644
--- a/drivers/clk/clk-qoriq.c
+++ b/drivers/clk/clk-qoriq.c
@@ -700,6 +700,7 @@ static struct clk * __init create_mux_common(struct clockgen *cg,
700 struct mux_hwclock *hwc, 700 struct mux_hwclock *hwc,
701 const struct clk_ops *ops, 701 const struct clk_ops *ops,
702 unsigned long min_rate, 702 unsigned long min_rate,
703 unsigned long max_rate,
703 unsigned long pct80_rate, 704 unsigned long pct80_rate,
704 const char *fmt, int idx) 705 const char *fmt, int idx)
705{ 706{
@@ -728,6 +729,8 @@ static struct clk * __init create_mux_common(struct clockgen *cg,
728 continue; 729 continue;
729 if (rate < min_rate) 730 if (rate < min_rate)
730 continue; 731 continue;
732 if (rate > max_rate)
733 continue;
731 734
732 parent_names[j] = div->name; 735 parent_names[j] = div->name;
733 hwc->parent_to_clksel[j] = i; 736 hwc->parent_to_clksel[j] = i;
@@ -759,7 +762,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
759 struct mux_hwclock *hwc; 762 struct mux_hwclock *hwc;
760 const struct clockgen_pll_div *div; 763 const struct clockgen_pll_div *div;
761 unsigned long plat_rate, min_rate; 764 unsigned long plat_rate, min_rate;
762 u64 pct80_rate; 765 u64 max_rate, pct80_rate;
763 u32 clksel; 766 u32 clksel;
764 767
765 hwc = kzalloc(sizeof(*hwc), GFP_KERNEL); 768 hwc = kzalloc(sizeof(*hwc), GFP_KERNEL);
@@ -787,8 +790,8 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
787 return NULL; 790 return NULL;
788 } 791 }
789 792
790 pct80_rate = clk_get_rate(div->clk); 793 max_rate = clk_get_rate(div->clk);
791 pct80_rate *= 8; 794 pct80_rate = max_rate * 8;
792 do_div(pct80_rate, 10); 795 do_div(pct80_rate, 10);
793 796
794 plat_rate = clk_get_rate(cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk); 797 plat_rate = clk_get_rate(cg->pll[PLATFORM_PLL].div[PLL_DIV1].clk);
@@ -798,7 +801,7 @@ static struct clk * __init create_one_cmux(struct clockgen *cg, int idx)
798 else 801 else
799 min_rate = plat_rate / 2; 802 min_rate = plat_rate / 2;
800 803
801 return create_mux_common(cg, hwc, &cmux_ops, min_rate, 804 return create_mux_common(cg, hwc, &cmux_ops, min_rate, max_rate,
802 pct80_rate, "cg-cmux%d", idx); 805 pct80_rate, "cg-cmux%d", idx);
803} 806}
804 807
@@ -813,7 +816,7 @@ static struct clk * __init create_one_hwaccel(struct clockgen *cg, int idx)
813 hwc->reg = cg->regs + 0x20 * idx + 0x10; 816 hwc->reg = cg->regs + 0x20 * idx + 0x10;
814 hwc->info = cg->info.hwaccel[idx]; 817 hwc->info = cg->info.hwaccel[idx];
815 818
816 return create_mux_common(cg, hwc, &hwaccel_ops, 0, 0, 819 return create_mux_common(cg, hwc, &hwaccel_ops, 0, ULONG_MAX, 0,
817 "cg-hwaccel%d", idx); 820 "cg-hwaccel%d", idx);
818} 821}
819 822
diff --git a/drivers/clk/clk-xgene.c b/drivers/clk/clk-xgene.c
index 5daddf5ecc4b..bc37030e38ba 100644
--- a/drivers/clk/clk-xgene.c
+++ b/drivers/clk/clk-xgene.c
@@ -463,22 +463,20 @@ static int xgene_clk_enable(struct clk_hw *hw)
463 struct xgene_clk *pclk = to_xgene_clk(hw); 463 struct xgene_clk *pclk = to_xgene_clk(hw);
464 unsigned long flags = 0; 464 unsigned long flags = 0;
465 u32 data; 465 u32 data;
466 phys_addr_t reg;
467 466
468 if (pclk->lock) 467 if (pclk->lock)
469 spin_lock_irqsave(pclk->lock, flags); 468 spin_lock_irqsave(pclk->lock, flags);
470 469
471 if (pclk->param.csr_reg != NULL) { 470 if (pclk->param.csr_reg != NULL) {
472 pr_debug("%s clock enabled\n", clk_hw_get_name(hw)); 471 pr_debug("%s clock enabled\n", clk_hw_get_name(hw));
473 reg = __pa(pclk->param.csr_reg);
474 /* First enable the clock */ 472 /* First enable the clock */
475 data = xgene_clk_read(pclk->param.csr_reg + 473 data = xgene_clk_read(pclk->param.csr_reg +
476 pclk->param.reg_clk_offset); 474 pclk->param.reg_clk_offset);
477 data |= pclk->param.reg_clk_mask; 475 data |= pclk->param.reg_clk_mask;
478 xgene_clk_write(data, pclk->param.csr_reg + 476 xgene_clk_write(data, pclk->param.csr_reg +
479 pclk->param.reg_clk_offset); 477 pclk->param.reg_clk_offset);
480 pr_debug("%s clock PADDR base %pa clk offset 0x%08X mask 0x%08X value 0x%08X\n", 478 pr_debug("%s clk offset 0x%08X mask 0x%08X value 0x%08X\n",
481 clk_hw_get_name(hw), &reg, 479 clk_hw_get_name(hw),
482 pclk->param.reg_clk_offset, pclk->param.reg_clk_mask, 480 pclk->param.reg_clk_offset, pclk->param.reg_clk_mask,
483 data); 481 data);
484 482
@@ -488,8 +486,8 @@ static int xgene_clk_enable(struct clk_hw *hw)
488 data &= ~pclk->param.reg_csr_mask; 486 data &= ~pclk->param.reg_csr_mask;
489 xgene_clk_write(data, pclk->param.csr_reg + 487 xgene_clk_write(data, pclk->param.csr_reg +
490 pclk->param.reg_csr_offset); 488 pclk->param.reg_csr_offset);
491 pr_debug("%s CSR RESET PADDR base %pa csr offset 0x%08X mask 0x%08X value 0x%08X\n", 489 pr_debug("%s csr offset 0x%08X mask 0x%08X value 0x%08X\n",
492 clk_hw_get_name(hw), &reg, 490 clk_hw_get_name(hw),
493 pclk->param.reg_csr_offset, pclk->param.reg_csr_mask, 491 pclk->param.reg_csr_offset, pclk->param.reg_csr_mask,
494 data); 492 data);
495 } 493 }
diff --git a/drivers/clk/imx/clk-pllv3.c b/drivers/clk/imx/clk-pllv3.c
index 19f9b622981a..7a6acc3e4a92 100644
--- a/drivers/clk/imx/clk-pllv3.c
+++ b/drivers/clk/imx/clk-pllv3.c
@@ -223,7 +223,7 @@ static unsigned long clk_pllv3_av_recalc_rate(struct clk_hw *hw,
223 temp64 *= mfn; 223 temp64 *= mfn;
224 do_div(temp64, mfd); 224 do_div(temp64, mfd);
225 225
226 return (parent_rate * div) + (u32)temp64; 226 return parent_rate * div + (unsigned long)temp64;
227} 227}
228 228
229static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate, 229static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
@@ -247,7 +247,11 @@ static long clk_pllv3_av_round_rate(struct clk_hw *hw, unsigned long rate,
247 do_div(temp64, parent_rate); 247 do_div(temp64, parent_rate);
248 mfn = temp64; 248 mfn = temp64;
249 249
250 return parent_rate * div + parent_rate * mfn / mfd; 250 temp64 = (u64)parent_rate;
251 temp64 *= mfn;
252 do_div(temp64, mfd);
253
254 return parent_rate * div + (unsigned long)temp64;
251} 255}
252 256
253static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate, 257static int clk_pllv3_av_set_rate(struct clk_hw *hw, unsigned long rate,
diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c
index 3a51fff1b0e7..9adaf48aea23 100644
--- a/drivers/clk/mmp/clk-of-mmp2.c
+++ b/drivers/clk/mmp/clk-of-mmp2.c
@@ -313,7 +313,7 @@ static void __init mmp2_clk_init(struct device_node *np)
313 } 313 }
314 314
315 pxa_unit->apmu_base = of_iomap(np, 1); 315 pxa_unit->apmu_base = of_iomap(np, 1);
316 if (!pxa_unit->mpmu_base) { 316 if (!pxa_unit->apmu_base) {
317 pr_err("failed to map apmu registers\n"); 317 pr_err("failed to map apmu registers\n");
318 return; 318 return;
319 } 319 }
diff --git a/drivers/clk/mmp/clk-of-pxa168.c b/drivers/clk/mmp/clk-of-pxa168.c
index 87f2317b2a00..f110c02e83cb 100644
--- a/drivers/clk/mmp/clk-of-pxa168.c
+++ b/drivers/clk/mmp/clk-of-pxa168.c
@@ -262,7 +262,7 @@ static void __init pxa168_clk_init(struct device_node *np)
262 } 262 }
263 263
264 pxa_unit->apmu_base = of_iomap(np, 1); 264 pxa_unit->apmu_base = of_iomap(np, 1);
265 if (!pxa_unit->mpmu_base) { 265 if (!pxa_unit->apmu_base) {
266 pr_err("failed to map apmu registers\n"); 266 pr_err("failed to map apmu registers\n");
267 return; 267 return;
268 } 268 }
diff --git a/drivers/clk/mmp/clk-of-pxa910.c b/drivers/clk/mmp/clk-of-pxa910.c
index e22a67f76d93..64d1ef49caeb 100644
--- a/drivers/clk/mmp/clk-of-pxa910.c
+++ b/drivers/clk/mmp/clk-of-pxa910.c
@@ -282,7 +282,7 @@ static void __init pxa910_clk_init(struct device_node *np)
282 } 282 }
283 283
284 pxa_unit->apmu_base = of_iomap(np, 1); 284 pxa_unit->apmu_base = of_iomap(np, 1);
285 if (!pxa_unit->mpmu_base) { 285 if (!pxa_unit->apmu_base) {
286 pr_err("failed to map apmu registers\n"); 286 pr_err("failed to map apmu registers\n");
287 return; 287 return;
288 } 288 }
@@ -294,7 +294,7 @@ static void __init pxa910_clk_init(struct device_node *np)
294 } 294 }
295 295
296 pxa_unit->apbcp_base = of_iomap(np, 3); 296 pxa_unit->apbcp_base = of_iomap(np, 3);
297 if (!pxa_unit->mpmu_base) { 297 if (!pxa_unit->apbcp_base) {
298 pr_err("failed to map apbcp registers\n"); 298 pr_err("failed to map apbcp registers\n");
299 return; 299 return;
300 } 300 }
diff --git a/drivers/clk/rockchip/clk-ddr.c b/drivers/clk/rockchip/clk-ddr.c
index 8feba93672c5..e8075359366b 100644
--- a/drivers/clk/rockchip/clk-ddr.c
+++ b/drivers/clk/rockchip/clk-ddr.c
@@ -144,11 +144,8 @@ struct clk *rockchip_clk_register_ddrclk(const char *name, int flags,
144 ddrclk->ddr_flag = ddr_flag; 144 ddrclk->ddr_flag = ddr_flag;
145 145
146 clk = clk_register(NULL, &ddrclk->hw); 146 clk = clk_register(NULL, &ddrclk->hw);
147 if (IS_ERR(clk)) { 147 if (IS_ERR(clk))
148 pr_err("%s: could not register ddrclk %s\n", __func__, name);
149 kfree(ddrclk); 148 kfree(ddrclk);
150 return NULL;
151 }
152 149
153 return clk; 150 return clk;
154} 151}
diff --git a/drivers/clk/samsung/clk-exynos-clkout.c b/drivers/clk/samsung/clk-exynos-clkout.c
index 96fab6cfb202..6c6afb87b4ce 100644
--- a/drivers/clk/samsung/clk-exynos-clkout.c
+++ b/drivers/clk/samsung/clk-exynos-clkout.c
@@ -132,28 +132,34 @@ free_clkout:
132 pr_err("%s: failed to register clkout clock\n", __func__); 132 pr_err("%s: failed to register clkout clock\n", __func__);
133} 133}
134 134
135/*
136 * We use CLK_OF_DECLARE_DRIVER initialization method to avoid setting
137 * the OF_POPULATED flag on the pmu device tree node, so later the
138 * Exynos PMU platform device can be properly probed with PMU driver.
139 */
140
135static void __init exynos4_clkout_init(struct device_node *node) 141static void __init exynos4_clkout_init(struct device_node *node)
136{ 142{
137 exynos_clkout_init(node, EXYNOS4_CLKOUT_MUX_MASK); 143 exynos_clkout_init(node, EXYNOS4_CLKOUT_MUX_MASK);
138} 144}
139CLK_OF_DECLARE(exynos4210_clkout, "samsung,exynos4210-pmu", 145CLK_OF_DECLARE_DRIVER(exynos4210_clkout, "samsung,exynos4210-pmu",
140 exynos4_clkout_init); 146 exynos4_clkout_init);
141CLK_OF_DECLARE(exynos4212_clkout, "samsung,exynos4212-pmu", 147CLK_OF_DECLARE_DRIVER(exynos4212_clkout, "samsung,exynos4212-pmu",
142 exynos4_clkout_init); 148 exynos4_clkout_init);
143CLK_OF_DECLARE(exynos4412_clkout, "samsung,exynos4412-pmu", 149CLK_OF_DECLARE_DRIVER(exynos4412_clkout, "samsung,exynos4412-pmu",
144 exynos4_clkout_init); 150 exynos4_clkout_init);
145CLK_OF_DECLARE(exynos3250_clkout, "samsung,exynos3250-pmu", 151CLK_OF_DECLARE_DRIVER(exynos3250_clkout, "samsung,exynos3250-pmu",
146 exynos4_clkout_init); 152 exynos4_clkout_init);
147 153
148static void __init exynos5_clkout_init(struct device_node *node) 154static void __init exynos5_clkout_init(struct device_node *node)
149{ 155{
150 exynos_clkout_init(node, EXYNOS5_CLKOUT_MUX_MASK); 156 exynos_clkout_init(node, EXYNOS5_CLKOUT_MUX_MASK);
151} 157}
152CLK_OF_DECLARE(exynos5250_clkout, "samsung,exynos5250-pmu", 158CLK_OF_DECLARE_DRIVER(exynos5250_clkout, "samsung,exynos5250-pmu",
153 exynos5_clkout_init); 159 exynos5_clkout_init);
154CLK_OF_DECLARE(exynos5410_clkout, "samsung,exynos5410-pmu", 160CLK_OF_DECLARE_DRIVER(exynos5410_clkout, "samsung,exynos5410-pmu",
155 exynos5_clkout_init); 161 exynos5_clkout_init);
156CLK_OF_DECLARE(exynos5420_clkout, "samsung,exynos5420-pmu", 162CLK_OF_DECLARE_DRIVER(exynos5420_clkout, "samsung,exynos5420-pmu",
157 exynos5_clkout_init); 163 exynos5_clkout_init);
158CLK_OF_DECLARE(exynos5433_clkout, "samsung,exynos5433-pmu", 164CLK_OF_DECLARE_DRIVER(exynos5433_clkout, "samsung,exynos5433-pmu",
159 exynos5_clkout_init); 165 exynos5_clkout_init);
diff --git a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
index 79596463e0d9..fc75a335a7ce 100644
--- a/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
+++ b/drivers/clk/sunxi-ng/ccu-sun6i-a31.c
@@ -143,7 +143,7 @@ static SUNXI_CCU_NKM_WITH_MUX_GATE_LOCK(pll_mipi_clk, "pll-mipi",
143 4, 2, /* K */ 143 4, 2, /* K */
144 0, 4, /* M */ 144 0, 4, /* M */
145 21, 0, /* mux */ 145 21, 0, /* mux */
146 BIT(31), /* gate */ 146 BIT(31) | BIT(23) | BIT(22), /* gate */
147 BIT(28), /* lock */ 147 BIT(28), /* lock */
148 CLK_SET_RATE_UNGATE); 148 CLK_SET_RATE_UNGATE);
149 149
@@ -191,6 +191,8 @@ static struct clk_div_table axi_div_table[] = {
191static SUNXI_CCU_DIV_TABLE(axi_clk, "axi", "cpu", 191static SUNXI_CCU_DIV_TABLE(axi_clk, "axi", "cpu",
192 0x050, 0, 3, axi_div_table, 0); 192 0x050, 0, 3, axi_div_table, 0);
193 193
194#define SUN6I_A31_AHB1_REG 0x054
195
194static const char * const ahb1_parents[] = { "osc32k", "osc24M", 196static const char * const ahb1_parents[] = { "osc32k", "osc24M",
195 "axi", "pll-periph" }; 197 "axi", "pll-periph" };
196 198
@@ -1230,6 +1232,16 @@ static void __init sun6i_a31_ccu_setup(struct device_node *node)
1230 val &= BIT(16); 1232 val &= BIT(16);
1231 writel(val, reg + SUN6I_A31_PLL_MIPI_REG); 1233 writel(val, reg + SUN6I_A31_PLL_MIPI_REG);
1232 1234
1235 /* Force AHB1 to PLL6 / 3 */
1236 val = readl(reg + SUN6I_A31_AHB1_REG);
1237 /* set PLL6 pre-div = 3 */
1238 val &= ~GENMASK(7, 6);
1239 val |= 0x2 << 6;
1240 /* select PLL6 / pre-div */
1241 val &= ~GENMASK(13, 12);
1242 val |= 0x3 << 12;
1243 writel(val, reg + SUN6I_A31_AHB1_REG);
1244
1233 sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc); 1245 sunxi_ccu_probe(node, reg, &sun6i_a31_ccu_desc);
1234 1246
1235 ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk, 1247 ccu_mux_notifier_register(pll_cpu_clk.common.hw.clk,
diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
index 96b40ca57697..9bd1f78a0547 100644
--- a/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
+++ b/drivers/clk/sunxi-ng/ccu-sun8i-a33.c
@@ -131,7 +131,7 @@ static SUNXI_CCU_NKM_WITH_GATE_LOCK(pll_mipi_clk, "pll-mipi",
131 8, 4, /* N */ 131 8, 4, /* N */
132 4, 2, /* K */ 132 4, 2, /* K */
133 0, 4, /* M */ 133 0, 4, /* M */
134 BIT(31), /* gate */ 134 BIT(31) | BIT(23) | BIT(22), /* gate */
135 BIT(28), /* lock */ 135 BIT(28), /* lock */
136 CLK_SET_RATE_UNGATE); 136 CLK_SET_RATE_UNGATE);
137 137
diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c
index 838b22aa8b67..f2c9274b8bd5 100644
--- a/drivers/clk/sunxi/clk-sunxi.c
+++ b/drivers/clk/sunxi/clk-sunxi.c
@@ -373,7 +373,7 @@ static void sun4i_get_apb1_factors(struct factors_request *req)
373 else 373 else
374 calcp = 3; 374 calcp = 3;
375 375
376 calcm = (req->parent_rate >> calcp) - 1; 376 calcm = (div >> calcp) - 1;
377 377
378 req->rate = (req->parent_rate >> calcp) / (calcm + 1); 378 req->rate = (req->parent_rate >> calcp) / (calcm + 1);
379 req->m = calcm; 379 req->m = calcm;
diff --git a/drivers/crypto/caam/caamalg.c b/drivers/crypto/caam/caamalg.c
index 156aad167cd6..954a64c7757b 100644
--- a/drivers/crypto/caam/caamalg.c
+++ b/drivers/crypto/caam/caamalg.c
@@ -137,7 +137,7 @@ static void dbg_dump_sg(const char *level, const char *prefix_str,
137 } 137 }
138 138
139 buf = it_page + it->offset; 139 buf = it_page + it->offset;
140 len = min(tlen, it->length); 140 len = min_t(size_t, tlen, it->length);
141 print_hex_dump(level, prefix_str, prefix_type, rowsize, 141 print_hex_dump(level, prefix_str, prefix_type, rowsize,
142 groupsize, buf, len, ascii); 142 groupsize, buf, len, ascii);
143 tlen -= len; 143 tlen -= len;
@@ -4583,6 +4583,15 @@ static int __init caam_algapi_init(void)
4583 if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES)) 4583 if (!aes_inst && (alg_sel == OP_ALG_ALGSEL_AES))
4584 continue; 4584 continue;
4585 4585
4586 /*
4587 * Check support for AES modes not available
4588 * on LP devices.
4589 */
4590 if ((cha_vid & CHA_ID_LS_AES_MASK) == CHA_ID_LS_AES_LP)
4591 if ((alg->class1_alg_type & OP_ALG_AAI_MASK) ==
4592 OP_ALG_AAI_XTS)
4593 continue;
4594
4586 t_alg = caam_alg_alloc(alg); 4595 t_alg = caam_alg_alloc(alg);
4587 if (IS_ERR(t_alg)) { 4596 if (IS_ERR(t_alg)) {
4588 err = PTR_ERR(t_alg); 4597 err = PTR_ERR(t_alg);
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c
index 72ff19658985..e483b78c6343 100644
--- a/drivers/crypto/caam/ctrl.c
+++ b/drivers/crypto/caam/ctrl.c
@@ -558,8 +558,9 @@ static int caam_probe(struct platform_device *pdev)
558 * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel, 558 * Enable DECO watchdogs and, if this is a PHYS_ADDR_T_64BIT kernel,
559 * long pointers in master configuration register 559 * long pointers in master configuration register
560 */ 560 */
561 clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK, MCFGR_AWCACHE_CACH | 561 clrsetbits_32(&ctrl->mcr, MCFGR_AWCACHE_MASK | MCFGR_LONG_PTR,
562 MCFGR_AWCACHE_BUFF | MCFGR_WDENABLE | MCFGR_LARGE_BURST | 562 MCFGR_AWCACHE_CACH | MCFGR_AWCACHE_BUFF |
563 MCFGR_WDENABLE | MCFGR_LARGE_BURST |
563 (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0)); 564 (sizeof(dma_addr_t) == sizeof(u64) ? MCFGR_LONG_PTR : 0));
564 565
565 /* 566 /*
diff --git a/drivers/crypto/chelsio/chcr_algo.h b/drivers/crypto/chelsio/chcr_algo.h
index ec64fbcdeb49..199b0bb69b89 100644
--- a/drivers/crypto/chelsio/chcr_algo.h
+++ b/drivers/crypto/chelsio/chcr_algo.h
@@ -422,7 +422,7 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key,
422{ 422{
423 u32 temp; 423 u32 temp;
424 u32 w_ring[MAX_NK]; 424 u32 w_ring[MAX_NK];
425 int i, j, k = 0; 425 int i, j, k;
426 u8 nr, nk; 426 u8 nr, nk;
427 427
428 switch (keylength) { 428 switch (keylength) {
@@ -460,6 +460,7 @@ static inline void get_aes_decrypt_key(unsigned char *dec_key,
460 temp = w_ring[i % nk]; 460 temp = w_ring[i % nk];
461 i++; 461 i++;
462 } 462 }
463 i--;
463 for (k = 0, j = i % nk; k < nk; k++) { 464 for (k = 0, j = i % nk; k < nk; k++) {
464 *((u32 *)dec_key + k) = htonl(w_ring[j]); 465 *((u32 *)dec_key + k) = htonl(w_ring[j]);
465 j--; 466 j--;
diff --git a/drivers/crypto/marvell/hash.c b/drivers/crypto/marvell/hash.c
index 9f284682c091..77712b375b84 100644
--- a/drivers/crypto/marvell/hash.c
+++ b/drivers/crypto/marvell/hash.c
@@ -168,12 +168,11 @@ static void mv_cesa_ahash_std_step(struct ahash_request *req)
168 mv_cesa_adjust_op(engine, &creq->op_tmpl); 168 mv_cesa_adjust_op(engine, &creq->op_tmpl);
169 memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl)); 169 memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
170 170
171 digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req)); 171 if (!sreq->offset) {
172 for (i = 0; i < digsize / 4; i++) 172 digsize = crypto_ahash_digestsize(crypto_ahash_reqtfm(req));
173 writel_relaxed(creq->state[i], engine->regs + CESA_IVDIG(i)); 173 for (i = 0; i < digsize / 4; i++)
174 174 writel_relaxed(creq->state[i], engine->regs + CESA_IVDIG(i));
175 mv_cesa_adjust_op(engine, &creq->op_tmpl); 175 }
176 memcpy_toio(engine->sram, &creq->op_tmpl, sizeof(creq->op_tmpl));
177 176
178 if (creq->cache_ptr) 177 if (creq->cache_ptr)
179 memcpy_toio(engine->sram + CESA_SA_DATA_SRAM_OFFSET, 178 memcpy_toio(engine->sram + CESA_SA_DATA_SRAM_OFFSET,
diff --git a/drivers/dax/dax.c b/drivers/dax/dax.c
index 0e499bfca41c..286447a83dab 100644
--- a/drivers/dax/dax.c
+++ b/drivers/dax/dax.c
@@ -270,8 +270,8 @@ static int check_vma(struct dax_dev *dax_dev, struct vm_area_struct *vma,
270 if (!dax_dev->alive) 270 if (!dax_dev->alive)
271 return -ENXIO; 271 return -ENXIO;
272 272
273 /* prevent private / writable mappings from being established */ 273 /* prevent private mappings from being established */
274 if ((vma->vm_flags & (VM_NORESERVE|VM_SHARED|VM_WRITE)) == VM_WRITE) { 274 if ((vma->vm_flags & VM_MAYSHARE) != VM_MAYSHARE) {
275 dev_info(dev, "%s: %s: fail, attempted private mapping\n", 275 dev_info(dev, "%s: %s: fail, attempted private mapping\n",
276 current->comm, func); 276 current->comm, func);
277 return -EINVAL; 277 return -EINVAL;
diff --git a/drivers/dax/pmem.c b/drivers/dax/pmem.c
index 4a15fa5df98b..73c6ce93a0d9 100644
--- a/drivers/dax/pmem.c
+++ b/drivers/dax/pmem.c
@@ -78,7 +78,9 @@ static int dax_pmem_probe(struct device *dev)
78 nsio = to_nd_namespace_io(&ndns->dev); 78 nsio = to_nd_namespace_io(&ndns->dev);
79 79
80 /* parse the 'pfn' info block via ->rw_bytes */ 80 /* parse the 'pfn' info block via ->rw_bytes */
81 devm_nsio_enable(dev, nsio); 81 rc = devm_nsio_enable(dev, nsio);
82 if (rc)
83 return rc;
82 altmap = nvdimm_setup_pfn(nd_pfn, &res, &__altmap); 84 altmap = nvdimm_setup_pfn(nd_pfn, &res, &__altmap);
83 if (IS_ERR(altmap)) 85 if (IS_ERR(altmap))
84 return PTR_ERR(altmap); 86 return PTR_ERR(altmap);
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index af63a6bcf564..141aefbe37ec 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -306,6 +306,7 @@ config MMP_TDMA
306 depends on ARCH_MMP || COMPILE_TEST 306 depends on ARCH_MMP || COMPILE_TEST
307 select DMA_ENGINE 307 select DMA_ENGINE
308 select MMP_SRAM if ARCH_MMP 308 select MMP_SRAM if ARCH_MMP
309 select GENERIC_ALLOCATOR
309 help 310 help
310 Support the MMP Two-Channel DMA engine. 311 Support the MMP Two-Channel DMA engine.
311 This engine used for MMP Audio DMA and pxa910 SQU. 312 This engine used for MMP Audio DMA and pxa910 SQU.
diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c
index bac5f023013b..d5ba43a87a68 100644
--- a/drivers/dma/cppi41.c
+++ b/drivers/dma/cppi41.c
@@ -317,6 +317,12 @@ static irqreturn_t cppi41_irq(int irq, void *data)
317 317
318 while (val) { 318 while (val) {
319 u32 desc, len; 319 u32 desc, len;
320 int error;
321
322 error = pm_runtime_get(cdd->ddev.dev);
323 if (error < 0)
324 dev_err(cdd->ddev.dev, "%s pm runtime get: %i\n",
325 __func__, error);
320 326
321 q_num = __fls(val); 327 q_num = __fls(val);
322 val &= ~(1 << q_num); 328 val &= ~(1 << q_num);
@@ -338,7 +344,6 @@ static irqreturn_t cppi41_irq(int irq, void *data)
338 dma_cookie_complete(&c->txd); 344 dma_cookie_complete(&c->txd);
339 dmaengine_desc_get_callback_invoke(&c->txd, NULL); 345 dmaengine_desc_get_callback_invoke(&c->txd, NULL);
340 346
341 /* Paired with cppi41_dma_issue_pending */
342 pm_runtime_mark_last_busy(cdd->ddev.dev); 347 pm_runtime_mark_last_busy(cdd->ddev.dev);
343 pm_runtime_put_autosuspend(cdd->ddev.dev); 348 pm_runtime_put_autosuspend(cdd->ddev.dev);
344 } 349 }
@@ -362,8 +367,13 @@ static int cppi41_dma_alloc_chan_resources(struct dma_chan *chan)
362 int error; 367 int error;
363 368
364 error = pm_runtime_get_sync(cdd->ddev.dev); 369 error = pm_runtime_get_sync(cdd->ddev.dev);
365 if (error < 0) 370 if (error < 0) {
371 dev_err(cdd->ddev.dev, "%s pm runtime get: %i\n",
372 __func__, error);
373 pm_runtime_put_noidle(cdd->ddev.dev);
374
366 return error; 375 return error;
376 }
367 377
368 dma_cookie_init(chan); 378 dma_cookie_init(chan);
369 dma_async_tx_descriptor_init(&c->txd, chan); 379 dma_async_tx_descriptor_init(&c->txd, chan);
@@ -385,8 +395,11 @@ static void cppi41_dma_free_chan_resources(struct dma_chan *chan)
385 int error; 395 int error;
386 396
387 error = pm_runtime_get_sync(cdd->ddev.dev); 397 error = pm_runtime_get_sync(cdd->ddev.dev);
388 if (error < 0) 398 if (error < 0) {
399 pm_runtime_put_noidle(cdd->ddev.dev);
400
389 return; 401 return;
402 }
390 403
391 WARN_ON(!list_empty(&cdd->pending)); 404 WARN_ON(!list_empty(&cdd->pending));
392 405
@@ -460,9 +473,9 @@ static void cppi41_dma_issue_pending(struct dma_chan *chan)
460 struct cppi41_dd *cdd = c->cdd; 473 struct cppi41_dd *cdd = c->cdd;
461 int error; 474 int error;
462 475
463 /* PM runtime paired with dmaengine_desc_get_callback_invoke */
464 error = pm_runtime_get(cdd->ddev.dev); 476 error = pm_runtime_get(cdd->ddev.dev);
465 if ((error != -EINPROGRESS) && error < 0) { 477 if ((error != -EINPROGRESS) && error < 0) {
478 pm_runtime_put_noidle(cdd->ddev.dev);
466 dev_err(cdd->ddev.dev, "Failed to pm_runtime_get: %i\n", 479 dev_err(cdd->ddev.dev, "Failed to pm_runtime_get: %i\n",
467 error); 480 error);
468 481
@@ -473,6 +486,9 @@ static void cppi41_dma_issue_pending(struct dma_chan *chan)
473 push_desc_queue(c); 486 push_desc_queue(c);
474 else 487 else
475 pending_desc(c); 488 pending_desc(c);
489
490 pm_runtime_mark_last_busy(cdd->ddev.dev);
491 pm_runtime_put_autosuspend(cdd->ddev.dev);
476} 492}
477 493
478static u32 get_host_pd0(u32 length) 494static u32 get_host_pd0(u32 length)
@@ -1059,8 +1075,8 @@ err_chans:
1059 deinit_cppi41(dev, cdd); 1075 deinit_cppi41(dev, cdd);
1060err_init_cppi: 1076err_init_cppi:
1061 pm_runtime_dont_use_autosuspend(dev); 1077 pm_runtime_dont_use_autosuspend(dev);
1062 pm_runtime_put_sync(dev);
1063err_get_sync: 1078err_get_sync:
1079 pm_runtime_put_sync(dev);
1064 pm_runtime_disable(dev); 1080 pm_runtime_disable(dev);
1065 iounmap(cdd->usbss_mem); 1081 iounmap(cdd->usbss_mem);
1066 iounmap(cdd->ctrl_mem); 1082 iounmap(cdd->ctrl_mem);
@@ -1072,7 +1088,12 @@ err_get_sync:
1072static int cppi41_dma_remove(struct platform_device *pdev) 1088static int cppi41_dma_remove(struct platform_device *pdev)
1073{ 1089{
1074 struct cppi41_dd *cdd = platform_get_drvdata(pdev); 1090 struct cppi41_dd *cdd = platform_get_drvdata(pdev);
1091 int error;
1075 1092
1093 error = pm_runtime_get_sync(&pdev->dev);
1094 if (error < 0)
1095 dev_err(&pdev->dev, "%s could not pm_runtime_get: %i\n",
1096 __func__, error);
1076 of_dma_controller_free(pdev->dev.of_node); 1097 of_dma_controller_free(pdev->dev.of_node);
1077 dma_async_device_unregister(&cdd->ddev); 1098 dma_async_device_unregister(&cdd->ddev);
1078 1099
diff --git a/drivers/dma/edma.c b/drivers/dma/edma.c
index e18a58068bca..77242b37ef87 100644
--- a/drivers/dma/edma.c
+++ b/drivers/dma/edma.c
@@ -1628,6 +1628,7 @@ static int edma_alloc_chan_resources(struct dma_chan *chan)
1628 if (echan->slot[0] < 0) { 1628 if (echan->slot[0] < 0) {
1629 dev_err(dev, "Entry slot allocation failed for channel %u\n", 1629 dev_err(dev, "Entry slot allocation failed for channel %u\n",
1630 EDMA_CHAN_SLOT(echan->ch_num)); 1630 EDMA_CHAN_SLOT(echan->ch_num));
1631 ret = echan->slot[0];
1631 goto err_slot; 1632 goto err_slot;
1632 } 1633 }
1633 1634
diff --git a/drivers/dma/sun6i-dma.c b/drivers/dma/sun6i-dma.c
index 83461994e418..a2358780ab2c 100644
--- a/drivers/dma/sun6i-dma.c
+++ b/drivers/dma/sun6i-dma.c
@@ -578,7 +578,7 @@ static struct dma_async_tx_descriptor *sun6i_dma_prep_dma_memcpy(
578 578
579 burst = convert_burst(8); 579 burst = convert_burst(8);
580 width = convert_buswidth(DMA_SLAVE_BUSWIDTH_4_BYTES); 580 width = convert_buswidth(DMA_SLAVE_BUSWIDTH_4_BYTES);
581 v_lli->cfg |= DMA_CHAN_CFG_SRC_DRQ(DRQ_SDRAM) | 581 v_lli->cfg = DMA_CHAN_CFG_SRC_DRQ(DRQ_SDRAM) |
582 DMA_CHAN_CFG_DST_DRQ(DRQ_SDRAM) | 582 DMA_CHAN_CFG_DST_DRQ(DRQ_SDRAM) |
583 DMA_CHAN_CFG_DST_LINEAR_MODE | 583 DMA_CHAN_CFG_DST_LINEAR_MODE |
584 DMA_CHAN_CFG_SRC_LINEAR_MODE | 584 DMA_CHAN_CFG_SRC_LINEAR_MODE |
diff --git a/drivers/extcon/extcon-arizona.c b/drivers/extcon/extcon-arizona.c
index 56e6c4c7c60d..d836d4ce5ee4 100644
--- a/drivers/extcon/extcon-arizona.c
+++ b/drivers/extcon/extcon-arizona.c
@@ -274,9 +274,10 @@ static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
274 struct arizona *arizona = info->arizona; 274 struct arizona *arizona = info->arizona;
275 const char *widget = arizona_extcon_get_micbias(info); 275 const char *widget = arizona_extcon_get_micbias(info);
276 struct snd_soc_dapm_context *dapm = arizona->dapm; 276 struct snd_soc_dapm_context *dapm = arizona->dapm;
277 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
277 int ret; 278 int ret;
278 279
279 ret = snd_soc_dapm_force_enable_pin(dapm, widget); 280 ret = snd_soc_component_force_enable_pin(component, widget);
280 if (ret != 0) 281 if (ret != 0)
281 dev_warn(arizona->dev, "Failed to enable %s: %d\n", 282 dev_warn(arizona->dev, "Failed to enable %s: %d\n",
282 widget, ret); 283 widget, ret);
@@ -284,7 +285,7 @@ static void arizona_extcon_pulse_micbias(struct arizona_extcon_info *info)
284 snd_soc_dapm_sync(dapm); 285 snd_soc_dapm_sync(dapm);
285 286
286 if (!arizona->pdata.micd_force_micbias) { 287 if (!arizona->pdata.micd_force_micbias) {
287 ret = snd_soc_dapm_disable_pin(arizona->dapm, widget); 288 ret = snd_soc_component_disable_pin(component, widget);
288 if (ret != 0) 289 if (ret != 0)
289 dev_warn(arizona->dev, "Failed to disable %s: %d\n", 290 dev_warn(arizona->dev, "Failed to disable %s: %d\n",
290 widget, ret); 291 widget, ret);
@@ -349,6 +350,7 @@ static void arizona_stop_mic(struct arizona_extcon_info *info)
349 struct arizona *arizona = info->arizona; 350 struct arizona *arizona = info->arizona;
350 const char *widget = arizona_extcon_get_micbias(info); 351 const char *widget = arizona_extcon_get_micbias(info);
351 struct snd_soc_dapm_context *dapm = arizona->dapm; 352 struct snd_soc_dapm_context *dapm = arizona->dapm;
353 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
352 bool change; 354 bool change;
353 int ret; 355 int ret;
354 356
@@ -356,7 +358,7 @@ static void arizona_stop_mic(struct arizona_extcon_info *info)
356 ARIZONA_MICD_ENA, 0, 358 ARIZONA_MICD_ENA, 0,
357 &change); 359 &change);
358 360
359 ret = snd_soc_dapm_disable_pin(dapm, widget); 361 ret = snd_soc_component_disable_pin(component, widget);
360 if (ret != 0) 362 if (ret != 0)
361 dev_warn(arizona->dev, 363 dev_warn(arizona->dev,
362 "Failed to disable %s: %d\n", 364 "Failed to disable %s: %d\n",
diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig
index d011cb89d25e..ed37e5908b91 100644
--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -22,10 +22,6 @@ menuconfig GPIOLIB
22 22
23if GPIOLIB 23if GPIOLIB
24 24
25config GPIO_DEVRES
26 def_bool y
27 depends on HAS_IOMEM
28
29config OF_GPIO 25config OF_GPIO
30 def_bool y 26 def_bool y
31 depends on OF 27 depends on OF
diff --git a/drivers/gpio/Makefile b/drivers/gpio/Makefile
index ab28a2daeacc..d074c2299393 100644
--- a/drivers/gpio/Makefile
+++ b/drivers/gpio/Makefile
@@ -2,7 +2,7 @@
2 2
3ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG 3ccflags-$(CONFIG_DEBUG_GPIO) += -DDEBUG
4 4
5obj-$(CONFIG_GPIO_DEVRES) += devres.o 5obj-$(CONFIG_GPIOLIB) += devres.o
6obj-$(CONFIG_GPIOLIB) += gpiolib.o 6obj-$(CONFIG_GPIOLIB) += gpiolib.o
7obj-$(CONFIG_GPIOLIB) += gpiolib-legacy.o 7obj-$(CONFIG_GPIOLIB) += gpiolib-legacy.o
8obj-$(CONFIG_OF_GPIO) += gpiolib-of.o 8obj-$(CONFIG_OF_GPIO) += gpiolib-of.o
diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c
index e422568e14ad..fe731f094257 100644
--- a/drivers/gpio/gpio-pca953x.c
+++ b/drivers/gpio/gpio-pca953x.c
@@ -372,14 +372,15 @@ static void pca953x_gpio_set_multiple(struct gpio_chip *gc,
372 372
373 bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ); 373 bank_shift = fls((chip->gpio_chip.ngpio - 1) / BANK_SZ);
374 374
375 memcpy(reg_val, chip->reg_output, NBANK(chip));
376 mutex_lock(&chip->i2c_lock); 375 mutex_lock(&chip->i2c_lock);
376 memcpy(reg_val, chip->reg_output, NBANK(chip));
377 for (bank = 0; bank < NBANK(chip); bank++) { 377 for (bank = 0; bank < NBANK(chip); bank++) {
378 bank_mask = mask[bank / sizeof(*mask)] >> 378 bank_mask = mask[bank / sizeof(*mask)] >>
379 ((bank % sizeof(*mask)) * 8); 379 ((bank % sizeof(*mask)) * 8);
380 if (bank_mask) { 380 if (bank_mask) {
381 bank_val = bits[bank / sizeof(*bits)] >> 381 bank_val = bits[bank / sizeof(*bits)] >>
382 ((bank % sizeof(*bits)) * 8); 382 ((bank % sizeof(*bits)) * 8);
383 bank_val &= bank_mask;
383 reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val; 384 reg_val[bank] = (reg_val[bank] & ~bank_mask) | bank_val;
384 } 385 }
385 } 386 }
@@ -607,7 +608,6 @@ static int pca953x_irq_setup(struct pca953x_chip *chip,
607 608
608 if (client->irq && irq_base != -1 609 if (client->irq && irq_base != -1
609 && (chip->driver_data & PCA_INT)) { 610 && (chip->driver_data & PCA_INT)) {
610
611 ret = pca953x_read_regs(chip, 611 ret = pca953x_read_regs(chip,
612 chip->regs->input, chip->irq_stat); 612 chip->regs->input, chip->irq_stat);
613 if (ret) 613 if (ret)
diff --git a/drivers/gpio/gpio-tc3589x.c b/drivers/gpio/gpio-tc3589x.c
index 5a5a6cb00eea..d6e21f1a70a9 100644
--- a/drivers/gpio/gpio-tc3589x.c
+++ b/drivers/gpio/gpio-tc3589x.c
@@ -97,7 +97,7 @@ static int tc3589x_gpio_get_direction(struct gpio_chip *chip,
97 if (ret < 0) 97 if (ret < 0)
98 return ret; 98 return ret;
99 99
100 return !!(ret & BIT(pos)); 100 return !(ret & BIT(pos));
101} 101}
102 102
103static int tc3589x_gpio_set_single_ended(struct gpio_chip *chip, 103static int tc3589x_gpio_set_single_ended(struct gpio_chip *chip,
diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
index 93ed0e00c578..868128a676ba 100644
--- a/drivers/gpio/gpiolib.c
+++ b/drivers/gpio/gpiolib.c
@@ -2737,8 +2737,11 @@ int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset)
2737 if (IS_ERR(desc)) 2737 if (IS_ERR(desc))
2738 return PTR_ERR(desc); 2738 return PTR_ERR(desc);
2739 2739
2740 /* Flush direction if something changed behind our back */ 2740 /*
2741 if (chip->get_direction) { 2741 * If it's fast: flush the direction setting if something changed
2742 * behind our back
2743 */
2744 if (!chip->can_sleep && chip->get_direction) {
2742 int dir = chip->get_direction(chip, offset); 2745 int dir = chip->get_direction(chip, offset);
2743 2746
2744 if (dir) 2747 if (dir)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 039b57e4644c..05c2850c04b0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -459,6 +459,7 @@ struct amdgpu_bo {
459 u64 metadata_flags; 459 u64 metadata_flags;
460 void *metadata; 460 void *metadata;
461 u32 metadata_size; 461 u32 metadata_size;
462 unsigned prime_shared_count;
462 /* list of all virtual address to which this bo 463 /* list of all virtual address to which this bo
463 * is associated to 464 * is associated to
464 */ 465 */
@@ -2471,6 +2472,7 @@ void amdgpu_driver_postclose_kms(struct drm_device *dev,
2471 struct drm_file *file_priv); 2472 struct drm_file *file_priv);
2472void amdgpu_driver_preclose_kms(struct drm_device *dev, 2473void amdgpu_driver_preclose_kms(struct drm_device *dev,
2473 struct drm_file *file_priv); 2474 struct drm_file *file_priv);
2475int amdgpu_suspend(struct amdgpu_device *adev);
2474int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon); 2476int amdgpu_device_suspend(struct drm_device *dev, bool suspend, bool fbcon);
2475int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon); 2477int amdgpu_device_resume(struct drm_device *dev, bool resume, bool fbcon);
2476u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe); 2478u32 amdgpu_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
index 892d60fb225b..2057683f7b59 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
@@ -395,9 +395,12 @@ static int acp_hw_fini(void *handle)
395{ 395{
396 int i, ret; 396 int i, ret;
397 struct device *dev; 397 struct device *dev;
398
399 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 398 struct amdgpu_device *adev = (struct amdgpu_device *)handle;
400 399
400 /* return early if no ACP */
401 if (!adev->acp.acp_genpd)
402 return 0;
403
401 for (i = 0; i < ACP_DEVS ; i++) { 404 for (i = 0; i < ACP_DEVS ; i++) {
402 dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i); 405 dev = get_mfd_cell_dev(adev->acp.acp_cell[i].name, i);
403 ret = pm_genpd_remove_device(&adev->acp.acp_genpd->gpd, dev); 406 ret = pm_genpd_remove_device(&adev->acp.acp_genpd->gpd, dev);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
index dae35a96a694..6c343a933182 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atpx_handler.c
@@ -34,6 +34,7 @@ struct amdgpu_atpx {
34 34
35static struct amdgpu_atpx_priv { 35static struct amdgpu_atpx_priv {
36 bool atpx_detected; 36 bool atpx_detected;
37 bool bridge_pm_usable;
37 /* handle for device - and atpx */ 38 /* handle for device - and atpx */
38 acpi_handle dhandle; 39 acpi_handle dhandle;
39 acpi_handle other_handle; 40 acpi_handle other_handle;
@@ -205,7 +206,11 @@ static int amdgpu_atpx_validate(struct amdgpu_atpx *atpx)
205 atpx->is_hybrid = false; 206 atpx->is_hybrid = false;
206 if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { 207 if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
207 printk("ATPX Hybrid Graphics\n"); 208 printk("ATPX Hybrid Graphics\n");
208 atpx->functions.power_cntl = false; 209 /*
210 * Disable legacy PM methods only when pcie port PM is usable,
211 * otherwise the device might fail to power off or power on.
212 */
213 atpx->functions.power_cntl = !amdgpu_atpx_priv.bridge_pm_usable;
209 atpx->is_hybrid = true; 214 atpx->is_hybrid = true;
210 } 215 }
211 216
@@ -555,17 +560,25 @@ static bool amdgpu_atpx_detect(void)
555 struct pci_dev *pdev = NULL; 560 struct pci_dev *pdev = NULL;
556 bool has_atpx = false; 561 bool has_atpx = false;
557 int vga_count = 0; 562 int vga_count = 0;
563 bool d3_supported = false;
564 struct pci_dev *parent_pdev;
558 565
559 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { 566 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
560 vga_count++; 567 vga_count++;
561 568
562 has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); 569 has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
570
571 parent_pdev = pci_upstream_bridge(pdev);
572 d3_supported |= parent_pdev && parent_pdev->bridge_d3;
563 } 573 }
564 574
565 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { 575 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) {
566 vga_count++; 576 vga_count++;
567 577
568 has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true); 578 has_atpx |= (amdgpu_atpx_pci_probe_handle(pdev) == true);
579
580 parent_pdev = pci_upstream_bridge(pdev);
581 d3_supported |= parent_pdev && parent_pdev->bridge_d3;
569 } 582 }
570 583
571 if (has_atpx && vga_count == 2) { 584 if (has_atpx && vga_count == 2) {
@@ -573,6 +586,7 @@ static bool amdgpu_atpx_detect(void)
573 printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", 586 printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
574 acpi_method_name); 587 acpi_method_name);
575 amdgpu_atpx_priv.atpx_detected = true; 588 amdgpu_atpx_priv.atpx_detected = true;
589 amdgpu_atpx_priv.bridge_pm_usable = d3_supported;
576 amdgpu_atpx_init(); 590 amdgpu_atpx_init();
577 return true; 591 return true;
578 } 592 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
index 651115dcce12..c02db01f6583 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_bo_list.c
@@ -132,7 +132,7 @@ static int amdgpu_bo_list_set(struct amdgpu_device *adev,
132 entry->priority = min(info[i].bo_priority, 132 entry->priority = min(info[i].bo_priority,
133 AMDGPU_BO_LIST_MAX_PRIORITY); 133 AMDGPU_BO_LIST_MAX_PRIORITY);
134 entry->tv.bo = &entry->robj->tbo; 134 entry->tv.bo = &entry->robj->tbo;
135 entry->tv.shared = true; 135 entry->tv.shared = !entry->robj->prime_shared_count;
136 136
137 if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_GDS) 137 if (entry->robj->prefered_domains == AMDGPU_GEM_DOMAIN_GDS)
138 gds_obj = entry->robj; 138 gds_obj = entry->robj;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
index 7a8bfa34682f..662976292535 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
@@ -795,10 +795,19 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,
795 if (!adev->pm.fw) { 795 if (!adev->pm.fw) {
796 switch (adev->asic_type) { 796 switch (adev->asic_type) {
797 case CHIP_TOPAZ: 797 case CHIP_TOPAZ:
798 strcpy(fw_name, "amdgpu/topaz_smc.bin"); 798 if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) ||
799 ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) ||
800 ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87)))
801 strcpy(fw_name, "amdgpu/topaz_k_smc.bin");
802 else
803 strcpy(fw_name, "amdgpu/topaz_smc.bin");
799 break; 804 break;
800 case CHIP_TONGA: 805 case CHIP_TONGA:
801 strcpy(fw_name, "amdgpu/tonga_smc.bin"); 806 if (((adev->pdev->device == 0x6939) && (adev->pdev->revision == 0xf1)) ||
807 ((adev->pdev->device == 0x6938) && (adev->pdev->revision == 0xf1)))
808 strcpy(fw_name, "amdgpu/tonga_k_smc.bin");
809 else
810 strcpy(fw_name, "amdgpu/tonga_smc.bin");
802 break; 811 break;
803 case CHIP_FIJI: 812 case CHIP_FIJI:
804 strcpy(fw_name, "amdgpu/fiji_smc.bin"); 813 strcpy(fw_name, "amdgpu/fiji_smc.bin");
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
index e3281d4e3e41..086aa5c9c634 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
@@ -769,7 +769,7 @@ static void amdgpu_connector_unregister(struct drm_connector *connector)
769{ 769{
770 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 770 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector);
771 771
772 if (amdgpu_connector->ddc_bus->has_aux) { 772 if (amdgpu_connector->ddc_bus && amdgpu_connector->ddc_bus->has_aux) {
773 drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux); 773 drm_dp_aux_unregister(&amdgpu_connector->ddc_bus->aux);
774 amdgpu_connector->ddc_bus->has_aux = false; 774 amdgpu_connector->ddc_bus->has_aux = false;
775 } 775 }
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 7ca07e7b25c1..e41d4baebf86 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -658,12 +658,10 @@ static bool amdgpu_vpost_needed(struct amdgpu_device *adev)
658 return false; 658 return false;
659 659
660 if (amdgpu_passthrough(adev)) { 660 if (amdgpu_passthrough(adev)) {
661 /* for FIJI: In whole GPU pass-through virtualization case 661 /* for FIJI: In whole GPU pass-through virtualization case, after VM reboot
662 * old smc fw won't clear some registers (e.g. MEM_SIZE, BIOS_SCRATCH) 662 * some old smc fw still need driver do vPost otherwise gpu hang, while
663 * so amdgpu_card_posted return false and driver will incorrectly skip vPost. 663 * those smc fw version above 22.15 doesn't have this flaw, so we force
664 * but if we force vPost do in pass-through case, the driver reload will hang. 664 * vpost executed for smc version below 22.15
665 * whether doing vPost depends on amdgpu_card_posted if smc version is above
666 * 00160e00 for FIJI.
667 */ 665 */
668 if (adev->asic_type == CHIP_FIJI) { 666 if (adev->asic_type == CHIP_FIJI) {
669 int err; 667 int err;
@@ -674,22 +672,11 @@ static bool amdgpu_vpost_needed(struct amdgpu_device *adev)
674 return true; 672 return true;
675 673
676 fw_ver = *((uint32_t *)adev->pm.fw->data + 69); 674 fw_ver = *((uint32_t *)adev->pm.fw->data + 69);
677 if (fw_ver >= 0x00160e00) 675 if (fw_ver < 0x00160e00)
678 return !amdgpu_card_posted(adev); 676 return true;
679 } 677 }
680 } else {
681 /* in bare-metal case, amdgpu_card_posted return false
682 * after system reboot/boot, and return true if driver
683 * reloaded.
684 * we shouldn't do vPost after driver reload otherwise GPU
685 * could hang.
686 */
687 if (amdgpu_card_posted(adev))
688 return false;
689 } 678 }
690 679 return !amdgpu_card_posted(adev);
691 /* we assume vPost is neede for all other cases */
692 return true;
693} 680}
694 681
695/** 682/**
@@ -1506,7 +1493,7 @@ static int amdgpu_fini(struct amdgpu_device *adev)
1506 return 0; 1493 return 0;
1507} 1494}
1508 1495
1509static int amdgpu_suspend(struct amdgpu_device *adev) 1496int amdgpu_suspend(struct amdgpu_device *adev)
1510{ 1497{
1511 int i, r; 1498 int i, r;
1512 1499
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 71ed27eb3dde..e0890deccb2f 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -479,12 +479,15 @@ amdgpu_pci_remove(struct pci_dev *pdev)
479static void 479static void
480amdgpu_pci_shutdown(struct pci_dev *pdev) 480amdgpu_pci_shutdown(struct pci_dev *pdev)
481{ 481{
482 struct drm_device *dev = pci_get_drvdata(pdev);
483 struct amdgpu_device *adev = dev->dev_private;
484
482 /* if we are running in a VM, make sure the device 485 /* if we are running in a VM, make sure the device
483 * torn down properly on reboot/shutdown. 486 * torn down properly on reboot/shutdown.
484 * unfortunately we can't detect certain 487 * unfortunately we can't detect certain
485 * hypervisors so just do this all the time. 488 * hypervisors so just do this all the time.
486 */ 489 */
487 amdgpu_pci_remove(pdev); 490 amdgpu_suspend(adev);
488} 491}
489 492
490static int amdgpu_pmops_suspend(struct device *dev) 493static int amdgpu_pmops_suspend(struct device *dev)
@@ -735,8 +738,20 @@ static struct pci_driver amdgpu_kms_pci_driver = {
735 738
736static int __init amdgpu_init(void) 739static int __init amdgpu_init(void)
737{ 740{
738 amdgpu_sync_init(); 741 int r;
739 amdgpu_fence_slab_init(); 742
743 r = amdgpu_sync_init();
744 if (r)
745 goto error_sync;
746
747 r = amdgpu_fence_slab_init();
748 if (r)
749 goto error_fence;
750
751 r = amd_sched_fence_slab_init();
752 if (r)
753 goto error_sched;
754
740 if (vgacon_text_force()) { 755 if (vgacon_text_force()) {
741 DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n"); 756 DRM_ERROR("VGACON disables amdgpu kernel modesetting.\n");
742 return -EINVAL; 757 return -EINVAL;
@@ -748,6 +763,15 @@ static int __init amdgpu_init(void)
748 amdgpu_register_atpx_handler(); 763 amdgpu_register_atpx_handler();
749 /* let modprobe override vga console setting */ 764 /* let modprobe override vga console setting */
750 return drm_pci_init(driver, pdriver); 765 return drm_pci_init(driver, pdriver);
766
767error_sched:
768 amdgpu_fence_slab_fini();
769
770error_fence:
771 amdgpu_sync_fini();
772
773error_sync:
774 return r;
751} 775}
752 776
753static void __exit amdgpu_exit(void) 777static void __exit amdgpu_exit(void)
@@ -756,6 +780,7 @@ static void __exit amdgpu_exit(void)
756 drm_pci_exit(driver, pdriver); 780 drm_pci_exit(driver, pdriver);
757 amdgpu_unregister_atpx_handler(); 781 amdgpu_unregister_atpx_handler();
758 amdgpu_sync_fini(); 782 amdgpu_sync_fini();
783 amd_sched_fence_slab_fini();
759 amdgpu_fence_slab_fini(); 784 amdgpu_fence_slab_fini();
760} 785}
761 786
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
index 203d98b00555..3938fca1ea8e 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
@@ -99,6 +99,8 @@ int amdgpu_driver_load_kms(struct drm_device *dev, unsigned long flags)
99 99
100 if ((amdgpu_runtime_pm != 0) && 100 if ((amdgpu_runtime_pm != 0) &&
101 amdgpu_has_atpx() && 101 amdgpu_has_atpx() &&
102 (amdgpu_is_atpx_hybrid() ||
103 amdgpu_has_atpx_dgpu_power_cntl()) &&
102 ((flags & AMD_IS_APU) == 0)) 104 ((flags & AMD_IS_APU) == 0))
103 flags |= AMD_IS_PX; 105 flags |= AMD_IS_PX;
104 106
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
index 7700dc22f243..3826d5aea0a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c
@@ -74,20 +74,36 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev,
74 if (ret) 74 if (ret)
75 return ERR_PTR(ret); 75 return ERR_PTR(ret);
76 76
77 bo->prime_shared_count = 1;
77 return &bo->gem_base; 78 return &bo->gem_base;
78} 79}
79 80
80int amdgpu_gem_prime_pin(struct drm_gem_object *obj) 81int amdgpu_gem_prime_pin(struct drm_gem_object *obj)
81{ 82{
82 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 83 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj);
83 int ret = 0; 84 long ret = 0;
84 85
85 ret = amdgpu_bo_reserve(bo, false); 86 ret = amdgpu_bo_reserve(bo, false);
86 if (unlikely(ret != 0)) 87 if (unlikely(ret != 0))
87 return ret; 88 return ret;
88 89
90 /*
91 * Wait for all shared fences to complete before we switch to future
92 * use of exclusive fence on this prime shared bo.
93 */
94 ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false,
95 MAX_SCHEDULE_TIMEOUT);
96 if (unlikely(ret < 0)) {
97 DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret);
98 amdgpu_bo_unreserve(bo);
99 return ret;
100 }
101
89 /* pin buffer into GTT */ 102 /* pin buffer into GTT */
90 ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL); 103 ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL);
104 if (likely(ret == 0))
105 bo->prime_shared_count++;
106
91 amdgpu_bo_unreserve(bo); 107 amdgpu_bo_unreserve(bo);
92 return ret; 108 return ret;
93} 109}
@@ -102,6 +118,8 @@ void amdgpu_gem_prime_unpin(struct drm_gem_object *obj)
102 return; 118 return;
103 119
104 amdgpu_bo_unpin(bo); 120 amdgpu_bo_unpin(bo);
121 if (bo->prime_shared_count)
122 bo->prime_shared_count--;
105 amdgpu_bo_unreserve(bo); 123 amdgpu_bo_unreserve(bo);
106} 124}
107 125
diff --git a/drivers/gpu/drm/amd/amdgpu/vi.c b/drivers/gpu/drm/amd/amdgpu/vi.c
index 7c13090df7c0..f62f1a74f890 100644
--- a/drivers/gpu/drm/amd/amdgpu/vi.c
+++ b/drivers/gpu/drm/amd/amdgpu/vi.c
@@ -80,7 +80,9 @@
80#include "dce_virtual.h" 80#include "dce_virtual.h"
81 81
82MODULE_FIRMWARE("amdgpu/topaz_smc.bin"); 82MODULE_FIRMWARE("amdgpu/topaz_smc.bin");
83MODULE_FIRMWARE("amdgpu/topaz_k_smc.bin");
83MODULE_FIRMWARE("amdgpu/tonga_smc.bin"); 84MODULE_FIRMWARE("amdgpu/tonga_smc.bin");
85MODULE_FIRMWARE("amdgpu/tonga_k_smc.bin");
84MODULE_FIRMWARE("amdgpu/fiji_smc.bin"); 86MODULE_FIRMWARE("amdgpu/fiji_smc.bin");
85MODULE_FIRMWARE("amdgpu/polaris10_smc.bin"); 87MODULE_FIRMWARE("amdgpu/polaris10_smc.bin");
86MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin"); 88MODULE_FIRMWARE("amdgpu/polaris10_smc_sk.bin");
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
index 14f8c1f4da3d..0723758ed065 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hardwaremanager.c
@@ -272,7 +272,7 @@ bool phm_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hw
272 PHM_FUNC_CHECK(hwmgr); 272 PHM_FUNC_CHECK(hwmgr);
273 273
274 if (hwmgr->hwmgr_func->check_smc_update_required_for_display_configuration == NULL) 274 if (hwmgr->hwmgr_func->check_smc_update_required_for_display_configuration == NULL)
275 return -EINVAL; 275 return false;
276 276
277 return hwmgr->hwmgr_func->check_smc_update_required_for_display_configuration(hwmgr); 277 return hwmgr->hwmgr_func->check_smc_update_required_for_display_configuration(hwmgr);
278} 278}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
index 2ba7937d2545..e03dcb6ea9c1 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/hwmgr.c
@@ -710,8 +710,10 @@ int phm_get_voltage_evv_on_sclk(struct pp_hwmgr *hwmgr, uint8_t voltage_type,
710 uint32_t vol; 710 uint32_t vol;
711 int ret = 0; 711 int ret = 0;
712 712
713 if (hwmgr->chip_id < CHIP_POLARIS10) { 713 if (hwmgr->chip_id < CHIP_TONGA) {
714 atomctrl_get_voltage_evv_on_sclk(hwmgr, voltage_type, sclk, id, voltage); 714 ret = atomctrl_get_voltage_evv(hwmgr, id, voltage);
715 } else if (hwmgr->chip_id < CHIP_POLARIS10) {
716 ret = atomctrl_get_voltage_evv_on_sclk(hwmgr, voltage_type, sclk, id, voltage);
715 if (*voltage >= 2000 || *voltage == 0) 717 if (*voltage >= 2000 || *voltage == 0)
716 *voltage = 1150; 718 *voltage = 1150;
717 } else { 719 } else {
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
index 75854021f403..08cd0bd3ebe5 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
@@ -1460,19 +1460,17 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
1460 struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = NULL; 1460 struct phm_ppt_v1_clock_voltage_dependency_table *sclk_table = NULL;
1461 1461
1462 1462
1463 if (table_info == NULL)
1464 return -EINVAL;
1465
1466 sclk_table = table_info->vdd_dep_on_sclk;
1467
1468 for (i = 0; i < SMU7_MAX_LEAKAGE_COUNT; i++) { 1463 for (i = 0; i < SMU7_MAX_LEAKAGE_COUNT; i++) {
1469 vv_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i; 1464 vv_id = ATOM_VIRTUAL_VOLTAGE_ID0 + i;
1470 1465
1471 if (data->vdd_gfx_control == SMU7_VOLTAGE_CONTROL_BY_SVID2) { 1466 if (data->vdd_gfx_control == SMU7_VOLTAGE_CONTROL_BY_SVID2) {
1472 if (0 == phm_get_sclk_for_voltage_evv(hwmgr, 1467 if ((hwmgr->pp_table_version == PP_TABLE_V1)
1468 && !phm_get_sclk_for_voltage_evv(hwmgr,
1473 table_info->vddgfx_lookup_table, vv_id, &sclk)) { 1469 table_info->vddgfx_lookup_table, vv_id, &sclk)) {
1474 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 1470 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
1475 PHM_PlatformCaps_ClockStretcher)) { 1471 PHM_PlatformCaps_ClockStretcher)) {
1472 sclk_table = table_info->vdd_dep_on_sclk;
1473
1476 for (j = 1; j < sclk_table->count; j++) { 1474 for (j = 1; j < sclk_table->count; j++) {
1477 if (sclk_table->entries[j].clk == sclk && 1475 if (sclk_table->entries[j].clk == sclk &&
1478 sclk_table->entries[j].cks_enable == 0) { 1476 sclk_table->entries[j].cks_enable == 0) {
@@ -1498,12 +1496,15 @@ static int smu7_get_evv_voltages(struct pp_hwmgr *hwmgr)
1498 } 1496 }
1499 } 1497 }
1500 } else { 1498 } else {
1501
1502 if ((hwmgr->pp_table_version == PP_TABLE_V0) 1499 if ((hwmgr->pp_table_version == PP_TABLE_V0)
1503 || !phm_get_sclk_for_voltage_evv(hwmgr, 1500 || !phm_get_sclk_for_voltage_evv(hwmgr,
1504 table_info->vddc_lookup_table, vv_id, &sclk)) { 1501 table_info->vddc_lookup_table, vv_id, &sclk)) {
1505 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 1502 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps,
1506 PHM_PlatformCaps_ClockStretcher)) { 1503 PHM_PlatformCaps_ClockStretcher)) {
1504 if (table_info == NULL)
1505 return -EINVAL;
1506 sclk_table = table_info->vdd_dep_on_sclk;
1507
1507 for (j = 1; j < sclk_table->count; j++) { 1508 for (j = 1; j < sclk_table->count; j++) {
1508 if (sclk_table->entries[j].clk == sclk && 1509 if (sclk_table->entries[j].clk == sclk &&
1509 sclk_table->entries[j].cks_enable == 0) { 1510 sclk_table->entries[j].cks_enable == 0) {
@@ -2133,9 +2134,11 @@ static int smu7_patch_limits_vddc(struct pp_hwmgr *hwmgr,
2133 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 2134 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
2134 2135
2135 if (tab) { 2136 if (tab) {
2137 vddc = tab->vddc;
2136 smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddc, 2138 smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddc,
2137 &data->vddc_leakage); 2139 &data->vddc_leakage);
2138 tab->vddc = vddc; 2140 tab->vddc = vddc;
2141 vddci = tab->vddci;
2139 smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddci, 2142 smu7_patch_ppt_v0_with_vdd_leakage(hwmgr, &vddci,
2140 &data->vddci_leakage); 2143 &data->vddci_leakage);
2141 tab->vddci = vddci; 2144 tab->vddci = vddci;
@@ -2981,19 +2984,19 @@ static int smu7_get_pp_table_entry_callback_func_v0(struct pp_hwmgr *hwmgr,
2981 if (!(data->mc_micro_code_feature & DISABLE_MC_LOADMICROCODE) && memory_clock > data->highest_mclk) 2984 if (!(data->mc_micro_code_feature & DISABLE_MC_LOADMICROCODE) && memory_clock > data->highest_mclk)
2982 data->highest_mclk = memory_clock; 2985 data->highest_mclk = memory_clock;
2983 2986
2984 performance_level = &(ps->performance_levels
2985 [ps->performance_level_count++]);
2986
2987 PP_ASSERT_WITH_CODE( 2987 PP_ASSERT_WITH_CODE(
2988 (ps->performance_level_count < smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_GRAPHICS)), 2988 (ps->performance_level_count < smum_get_mac_definition(hwmgr->smumgr, SMU_MAX_LEVELS_GRAPHICS)),
2989 "Performance levels exceeds SMC limit!", 2989 "Performance levels exceeds SMC limit!",
2990 return -EINVAL); 2990 return -EINVAL);
2991 2991
2992 PP_ASSERT_WITH_CODE( 2992 PP_ASSERT_WITH_CODE(
2993 (ps->performance_level_count <= 2993 (ps->performance_level_count <
2994 hwmgr->platform_descriptor.hardwareActivityPerformanceLevels), 2994 hwmgr->platform_descriptor.hardwareActivityPerformanceLevels),
2995 "Performance levels exceeds Driver limit!", 2995 "Performance levels exceeds Driver limit, Skip!",
2996 return -EINVAL); 2996 return 0);
2997
2998 performance_level = &(ps->performance_levels
2999 [ps->performance_level_count++]);
2997 3000
2998 /* Performance levels are arranged from low to high. */ 3001 /* Performance levels are arranged from low to high. */
2999 performance_level->memory_clock = memory_clock; 3002 performance_level->memory_clock = memory_clock;
@@ -4228,18 +4231,26 @@ static int smu7_get_sclks(struct pp_hwmgr *hwmgr, struct amd_pp_clocks *clocks)
4228{ 4231{
4229 struct phm_ppt_v1_information *table_info = 4232 struct phm_ppt_v1_information *table_info =
4230 (struct phm_ppt_v1_information *)hwmgr->pptable; 4233 (struct phm_ppt_v1_information *)hwmgr->pptable;
4231 struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table; 4234 struct phm_ppt_v1_clock_voltage_dependency_table *dep_sclk_table = NULL;
4235 struct phm_clock_voltage_dependency_table *sclk_table;
4232 int i; 4236 int i;
4233 4237
4234 if (table_info == NULL) 4238 if (hwmgr->pp_table_version == PP_TABLE_V1) {
4235 return -EINVAL; 4239 if (table_info == NULL || table_info->vdd_dep_on_sclk == NULL)
4236 4240 return -EINVAL;
4237 dep_sclk_table = table_info->vdd_dep_on_sclk; 4241 dep_sclk_table = table_info->vdd_dep_on_sclk;
4238 4242 for (i = 0; i < dep_sclk_table->count; i++) {
4239 for (i = 0; i < dep_sclk_table->count; i++) { 4243 clocks->clock[i] = dep_sclk_table->entries[i].clk;
4240 clocks->clock[i] = dep_sclk_table->entries[i].clk; 4244 clocks->count++;
4241 clocks->count++; 4245 }
4246 } else if (hwmgr->pp_table_version == PP_TABLE_V0) {
4247 sclk_table = hwmgr->dyn_state.vddc_dependency_on_sclk;
4248 for (i = 0; i < sclk_table->count; i++) {
4249 clocks->clock[i] = sclk_table->entries[i].clk;
4250 clocks->count++;
4251 }
4242 } 4252 }
4253
4243 return 0; 4254 return 0;
4244} 4255}
4245 4256
@@ -4261,17 +4272,24 @@ static int smu7_get_mclks(struct pp_hwmgr *hwmgr, struct amd_pp_clocks *clocks)
4261 (struct phm_ppt_v1_information *)hwmgr->pptable; 4272 (struct phm_ppt_v1_information *)hwmgr->pptable;
4262 struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table; 4273 struct phm_ppt_v1_clock_voltage_dependency_table *dep_mclk_table;
4263 int i; 4274 int i;
4275 struct phm_clock_voltage_dependency_table *mclk_table;
4264 4276
4265 if (table_info == NULL) 4277 if (hwmgr->pp_table_version == PP_TABLE_V1) {
4266 return -EINVAL; 4278 if (table_info == NULL)
4267 4279 return -EINVAL;
4268 dep_mclk_table = table_info->vdd_dep_on_mclk; 4280 dep_mclk_table = table_info->vdd_dep_on_mclk;
4269 4281 for (i = 0; i < dep_mclk_table->count; i++) {
4270 for (i = 0; i < dep_mclk_table->count; i++) { 4282 clocks->clock[i] = dep_mclk_table->entries[i].clk;
4271 clocks->clock[i] = dep_mclk_table->entries[i].clk; 4283 clocks->latency[i] = smu7_get_mem_latency(hwmgr,
4272 clocks->latency[i] = smu7_get_mem_latency(hwmgr,
4273 dep_mclk_table->entries[i].clk); 4284 dep_mclk_table->entries[i].clk);
4274 clocks->count++; 4285 clocks->count++;
4286 }
4287 } else if (hwmgr->pp_table_version == PP_TABLE_V0) {
4288 mclk_table = hwmgr->dyn_state.vddc_dependency_on_mclk;
4289 for (i = 0; i < mclk_table->count; i++) {
4290 clocks->clock[i] = mclk_table->entries[i].clk;
4291 clocks->count++;
4292 }
4275 } 4293 }
4276 return 0; 4294 return 0;
4277} 4295}
diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
index fb6c6f6106d5..29d0319b22e6 100644
--- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
+++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu7_thermal.c
@@ -30,7 +30,7 @@ int smu7_fan_ctrl_get_fan_speed_info(struct pp_hwmgr *hwmgr,
30 struct phm_fan_speed_info *fan_speed_info) 30 struct phm_fan_speed_info *fan_speed_info)
31{ 31{
32 if (hwmgr->thermal_controller.fanInfo.bNoFan) 32 if (hwmgr->thermal_controller.fanInfo.bNoFan)
33 return 0; 33 return -ENODEV;
34 34
35 fan_speed_info->supports_percent_read = true; 35 fan_speed_info->supports_percent_read = true;
36 fan_speed_info->supports_percent_write = true; 36 fan_speed_info->supports_percent_write = true;
@@ -60,7 +60,7 @@ int smu7_fan_ctrl_get_fan_speed_percent(struct pp_hwmgr *hwmgr,
60 uint64_t tmp64; 60 uint64_t tmp64;
61 61
62 if (hwmgr->thermal_controller.fanInfo.bNoFan) 62 if (hwmgr->thermal_controller.fanInfo.bNoFan)
63 return 0; 63 return -ENODEV;
64 64
65 duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, 65 duty100 = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
66 CG_FDO_CTRL1, FMAX_DUTY100); 66 CG_FDO_CTRL1, FMAX_DUTY100);
@@ -89,7 +89,7 @@ int smu7_fan_ctrl_get_fan_speed_rpm(struct pp_hwmgr *hwmgr, uint32_t *speed)
89 if (hwmgr->thermal_controller.fanInfo.bNoFan || 89 if (hwmgr->thermal_controller.fanInfo.bNoFan ||
90 (hwmgr->thermal_controller.fanInfo. 90 (hwmgr->thermal_controller.fanInfo.
91 ucTachometerPulsesPerRevolution == 0)) 91 ucTachometerPulsesPerRevolution == 0))
92 return 0; 92 return -ENODEV;
93 93
94 tach_period = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC, 94 tach_period = PHM_READ_VFPF_INDIRECT_FIELD(hwmgr->device, CGS_IND_REG__SMC,
95 CG_TACH_STATUS, TACH_PERIOD); 95 CG_TACH_STATUS, TACH_PERIOD);
diff --git a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c
index 4ccc0b72324d..71bb2f8dc157 100644
--- a/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c
+++ b/drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c
@@ -2214,6 +2214,7 @@ uint32_t polaris10_get_mac_definition(uint32_t value)
2214int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr) 2214int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
2215{ 2215{
2216 struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend); 2216 struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(hwmgr->smumgr->backend);
2217 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend);
2217 uint32_t tmp; 2218 uint32_t tmp;
2218 int result; 2219 int result;
2219 bool error = false; 2220 bool error = false;
@@ -2233,8 +2234,10 @@ int polaris10_process_firmware_header(struct pp_hwmgr *hwmgr)
2233 offsetof(SMU74_Firmware_Header, SoftRegisters), 2234 offsetof(SMU74_Firmware_Header, SoftRegisters),
2234 &tmp, SMC_RAM_END); 2235 &tmp, SMC_RAM_END);
2235 2236
2236 if (!result) 2237 if (!result) {
2238 data->soft_regs_start = tmp;
2237 smu_data->smu7_data.soft_regs_start = tmp; 2239 smu_data->smu7_data.soft_regs_start = tmp;
2240 }
2238 2241
2239 error |= (0 != result); 2242 error |= (0 != result);
2240 2243
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index 910b8d5b21c5..ffe1f85ce300 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -34,9 +34,6 @@ static bool amd_sched_entity_is_ready(struct amd_sched_entity *entity);
34static void amd_sched_wakeup(struct amd_gpu_scheduler *sched); 34static void amd_sched_wakeup(struct amd_gpu_scheduler *sched);
35static void amd_sched_process_job(struct fence *f, struct fence_cb *cb); 35static void amd_sched_process_job(struct fence *f, struct fence_cb *cb);
36 36
37struct kmem_cache *sched_fence_slab;
38atomic_t sched_fence_slab_ref = ATOMIC_INIT(0);
39
40/* Initialize a given run queue struct */ 37/* Initialize a given run queue struct */
41static void amd_sched_rq_init(struct amd_sched_rq *rq) 38static void amd_sched_rq_init(struct amd_sched_rq *rq)
42{ 39{
@@ -618,13 +615,6 @@ int amd_sched_init(struct amd_gpu_scheduler *sched,
618 INIT_LIST_HEAD(&sched->ring_mirror_list); 615 INIT_LIST_HEAD(&sched->ring_mirror_list);
619 spin_lock_init(&sched->job_list_lock); 616 spin_lock_init(&sched->job_list_lock);
620 atomic_set(&sched->hw_rq_count, 0); 617 atomic_set(&sched->hw_rq_count, 0);
621 if (atomic_inc_return(&sched_fence_slab_ref) == 1) {
622 sched_fence_slab = kmem_cache_create(
623 "amd_sched_fence", sizeof(struct amd_sched_fence), 0,
624 SLAB_HWCACHE_ALIGN, NULL);
625 if (!sched_fence_slab)
626 return -ENOMEM;
627 }
628 618
629 /* Each scheduler will run on a seperate kernel thread */ 619 /* Each scheduler will run on a seperate kernel thread */
630 sched->thread = kthread_run(amd_sched_main, sched, sched->name); 620 sched->thread = kthread_run(amd_sched_main, sched, sched->name);
@@ -645,7 +635,4 @@ void amd_sched_fini(struct amd_gpu_scheduler *sched)
645{ 635{
646 if (sched->thread) 636 if (sched->thread)
647 kthread_stop(sched->thread); 637 kthread_stop(sched->thread);
648 rcu_barrier();
649 if (atomic_dec_and_test(&sched_fence_slab_ref))
650 kmem_cache_destroy(sched_fence_slab);
651} 638}
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
index 7cbbbfb502ef..51068e6c3d9a 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.h
@@ -30,9 +30,6 @@
30struct amd_gpu_scheduler; 30struct amd_gpu_scheduler;
31struct amd_sched_rq; 31struct amd_sched_rq;
32 32
33extern struct kmem_cache *sched_fence_slab;
34extern atomic_t sched_fence_slab_ref;
35
36/** 33/**
37 * A scheduler entity is a wrapper around a job queue or a group 34 * A scheduler entity is a wrapper around a job queue or a group
38 * of other entities. Entities take turns emitting jobs from their 35 * of other entities. Entities take turns emitting jobs from their
@@ -145,6 +142,9 @@ void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
145 struct amd_sched_entity *entity); 142 struct amd_sched_entity *entity);
146void amd_sched_entity_push_job(struct amd_sched_job *sched_job); 143void amd_sched_entity_push_job(struct amd_sched_job *sched_job);
147 144
145int amd_sched_fence_slab_init(void);
146void amd_sched_fence_slab_fini(void);
147
148struct amd_sched_fence *amd_sched_fence_create( 148struct amd_sched_fence *amd_sched_fence_create(
149 struct amd_sched_entity *s_entity, void *owner); 149 struct amd_sched_entity *s_entity, void *owner);
150void amd_sched_fence_scheduled(struct amd_sched_fence *fence); 150void amd_sched_fence_scheduled(struct amd_sched_fence *fence);
diff --git a/drivers/gpu/drm/amd/scheduler/sched_fence.c b/drivers/gpu/drm/amd/scheduler/sched_fence.c
index 3653b5a40494..88fc2d662579 100644
--- a/drivers/gpu/drm/amd/scheduler/sched_fence.c
+++ b/drivers/gpu/drm/amd/scheduler/sched_fence.c
@@ -27,6 +27,25 @@
27#include <drm/drmP.h> 27#include <drm/drmP.h>
28#include "gpu_scheduler.h" 28#include "gpu_scheduler.h"
29 29
30static struct kmem_cache *sched_fence_slab;
31
32int amd_sched_fence_slab_init(void)
33{
34 sched_fence_slab = kmem_cache_create(
35 "amd_sched_fence", sizeof(struct amd_sched_fence), 0,
36 SLAB_HWCACHE_ALIGN, NULL);
37 if (!sched_fence_slab)
38 return -ENOMEM;
39
40 return 0;
41}
42
43void amd_sched_fence_slab_fini(void)
44{
45 rcu_barrier();
46 kmem_cache_destroy(sched_fence_slab);
47}
48
30struct amd_sched_fence *amd_sched_fence_create(struct amd_sched_entity *entity, 49struct amd_sched_fence *amd_sched_fence_create(struct amd_sched_entity *entity,
31 void *owner) 50 void *owner)
32{ 51{
diff --git a/drivers/gpu/drm/arc/arcpgu_hdmi.c b/drivers/gpu/drm/arc/arcpgu_hdmi.c
index b7a8b2ac4055..b69c66b4897e 100644
--- a/drivers/gpu/drm/arc/arcpgu_hdmi.c
+++ b/drivers/gpu/drm/arc/arcpgu_hdmi.c
@@ -14,170 +14,45 @@
14 * 14 *
15 */ 15 */
16 16
17#include <drm/drm_crtc_helper.h> 17#include <drm/drm_crtc.h>
18#include <drm/drm_encoder_slave.h> 18#include <drm/drm_encoder_slave.h>
19#include <drm/drm_atomic_helper.h>
20 19
21#include "arcpgu.h" 20#include "arcpgu.h"
22 21
23struct arcpgu_drm_connector {
24 struct drm_connector connector;
25 struct drm_encoder_slave *encoder_slave;
26};
27
28static int arcpgu_drm_connector_get_modes(struct drm_connector *connector)
29{
30 const struct drm_encoder_slave_funcs *sfuncs;
31 struct drm_encoder_slave *slave;
32 struct arcpgu_drm_connector *con =
33 container_of(connector, struct arcpgu_drm_connector, connector);
34
35 slave = con->encoder_slave;
36 if (slave == NULL) {
37 dev_err(connector->dev->dev,
38 "connector_get_modes: cannot find slave encoder for connector\n");
39 return 0;
40 }
41
42 sfuncs = slave->slave_funcs;
43 if (sfuncs->get_modes == NULL)
44 return 0;
45
46 return sfuncs->get_modes(&slave->base, connector);
47}
48
49static enum drm_connector_status
50arcpgu_drm_connector_detect(struct drm_connector *connector, bool force)
51{
52 enum drm_connector_status status = connector_status_unknown;
53 const struct drm_encoder_slave_funcs *sfuncs;
54 struct drm_encoder_slave *slave;
55
56 struct arcpgu_drm_connector *con =
57 container_of(connector, struct arcpgu_drm_connector, connector);
58
59 slave = con->encoder_slave;
60 if (slave == NULL) {
61 dev_err(connector->dev->dev,
62 "connector_detect: cannot find slave encoder for connector\n");
63 return status;
64 }
65
66 sfuncs = slave->slave_funcs;
67 if (sfuncs && sfuncs->detect)
68 return sfuncs->detect(&slave->base, connector);
69
70 dev_err(connector->dev->dev, "connector_detect: could not detect slave funcs\n");
71 return status;
72}
73
74static void arcpgu_drm_connector_destroy(struct drm_connector *connector)
75{
76 drm_connector_unregister(connector);
77 drm_connector_cleanup(connector);
78}
79
80static const struct drm_connector_helper_funcs
81arcpgu_drm_connector_helper_funcs = {
82 .get_modes = arcpgu_drm_connector_get_modes,
83};
84
85static const struct drm_connector_funcs arcpgu_drm_connector_funcs = {
86 .dpms = drm_helper_connector_dpms,
87 .reset = drm_atomic_helper_connector_reset,
88 .detect = arcpgu_drm_connector_detect,
89 .fill_modes = drm_helper_probe_single_connector_modes,
90 .destroy = arcpgu_drm_connector_destroy,
91 .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
92 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
93};
94
95static struct drm_encoder_helper_funcs arcpgu_drm_encoder_helper_funcs = {
96 .dpms = drm_i2c_encoder_dpms,
97 .mode_fixup = drm_i2c_encoder_mode_fixup,
98 .mode_set = drm_i2c_encoder_mode_set,
99 .prepare = drm_i2c_encoder_prepare,
100 .commit = drm_i2c_encoder_commit,
101 .detect = drm_i2c_encoder_detect,
102};
103
104static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = { 22static struct drm_encoder_funcs arcpgu_drm_encoder_funcs = {
105 .destroy = drm_encoder_cleanup, 23 .destroy = drm_encoder_cleanup,
106}; 24};
107 25
108int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np) 26int arcpgu_drm_hdmi_init(struct drm_device *drm, struct device_node *np)
109{ 27{
110 struct arcpgu_drm_connector *arcpgu_connector; 28 struct drm_encoder *encoder;
111 struct drm_i2c_encoder_driver *driver; 29 struct drm_bridge *bridge;
112 struct drm_encoder_slave *encoder; 30
113 struct drm_connector *connector; 31 int ret = 0;
114 struct i2c_client *i2c_slave;
115 int ret;
116 32
117 encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL); 33 encoder = devm_kzalloc(drm->dev, sizeof(*encoder), GFP_KERNEL);
118 if (encoder == NULL) 34 if (encoder == NULL)
119 return -ENOMEM; 35 return -ENOMEM;
120 36
121 i2c_slave = of_find_i2c_device_by_node(np); 37 /* Locate drm bridge from the hdmi encoder DT node */
122 if (!i2c_slave || !i2c_get_clientdata(i2c_slave)) { 38 bridge = of_drm_find_bridge(np);
123 dev_err(drm->dev, "failed to find i2c slave encoder\n"); 39 if (!bridge)
124 return -EPROBE_DEFER;
125 }
126
127 if (i2c_slave->dev.driver == NULL) {
128 dev_err(drm->dev, "failed to find i2c slave driver\n");
129 return -EPROBE_DEFER; 40 return -EPROBE_DEFER;
130 }
131 41
132 driver = 42 encoder->possible_crtcs = 1;
133 to_drm_i2c_encoder_driver(to_i2c_driver(i2c_slave->dev.driver)); 43 encoder->possible_clones = 0;
134 ret = driver->encoder_init(i2c_slave, drm, encoder); 44 ret = drm_encoder_init(drm, encoder, &arcpgu_drm_encoder_funcs,
135 if (ret) {
136 dev_err(drm->dev, "failed to initialize i2c encoder slave\n");
137 return ret;
138 }
139
140 encoder->base.possible_crtcs = 1;
141 encoder->base.possible_clones = 0;
142 ret = drm_encoder_init(drm, &encoder->base, &arcpgu_drm_encoder_funcs,
143 DRM_MODE_ENCODER_TMDS, NULL); 45 DRM_MODE_ENCODER_TMDS, NULL);
144 if (ret) 46 if (ret)
145 return ret; 47 return ret;
146 48
147 drm_encoder_helper_add(&encoder->base, 49 /* Link drm_bridge to encoder */
148 &arcpgu_drm_encoder_helper_funcs); 50 bridge->encoder = encoder;
149 51 encoder->bridge = bridge;
150 arcpgu_connector = devm_kzalloc(drm->dev, sizeof(*arcpgu_connector),
151 GFP_KERNEL);
152 if (!arcpgu_connector) {
153 ret = -ENOMEM;
154 goto error_encoder_cleanup;
155 }
156
157 connector = &arcpgu_connector->connector;
158 drm_connector_helper_add(connector, &arcpgu_drm_connector_helper_funcs);
159 ret = drm_connector_init(drm, connector, &arcpgu_drm_connector_funcs,
160 DRM_MODE_CONNECTOR_HDMIA);
161 if (ret < 0) {
162 dev_err(drm->dev, "failed to initialize drm connector\n");
163 goto error_encoder_cleanup;
164 }
165 52
166 ret = drm_mode_connector_attach_encoder(connector, &encoder->base); 53 ret = drm_bridge_attach(drm, bridge);
167 if (ret < 0) { 54 if (ret)
168 dev_err(drm->dev, "could not attach connector to encoder\n"); 55 drm_encoder_cleanup(encoder);
169 drm_connector_unregister(connector);
170 goto error_connector_cleanup;
171 }
172
173 arcpgu_connector->encoder_slave = encoder;
174
175 return 0;
176
177error_connector_cleanup:
178 drm_connector_cleanup(connector);
179 56
180error_encoder_cleanup:
181 drm_encoder_cleanup(&encoder->base);
182 return ret; 57 return ret;
183} 58}
diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c
index 48019ae22ddb..28341b32067f 100644
--- a/drivers/gpu/drm/arm/hdlcd_crtc.c
+++ b/drivers/gpu/drm/arm/hdlcd_crtc.c
@@ -150,15 +150,14 @@ static void hdlcd_crtc_enable(struct drm_crtc *crtc)
150 clk_prepare_enable(hdlcd->clk); 150 clk_prepare_enable(hdlcd->clk);
151 hdlcd_crtc_mode_set_nofb(crtc); 151 hdlcd_crtc_mode_set_nofb(crtc);
152 hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1); 152 hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 1);
153 drm_crtc_vblank_on(crtc);
153} 154}
154 155
155static void hdlcd_crtc_disable(struct drm_crtc *crtc) 156static void hdlcd_crtc_disable(struct drm_crtc *crtc)
156{ 157{
157 struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc); 158 struct hdlcd_drm_private *hdlcd = crtc_to_hdlcd_priv(crtc);
158 159
159 if (!crtc->state->active) 160 drm_crtc_vblank_off(crtc);
160 return;
161
162 hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0); 161 hdlcd_write(hdlcd, HDLCD_REG_COMMAND, 0);
163 clk_disable_unprepare(hdlcd->clk); 162 clk_disable_unprepare(hdlcd->clk);
164} 163}
diff --git a/drivers/gpu/drm/arm/hdlcd_drv.c b/drivers/gpu/drm/arm/hdlcd_drv.c
index fb6a418ce6be..e138fb51e8ce 100644
--- a/drivers/gpu/drm/arm/hdlcd_drv.c
+++ b/drivers/gpu/drm/arm/hdlcd_drv.c
@@ -375,7 +375,6 @@ static int hdlcd_drm_bind(struct device *dev)
375 375
376err_fbdev: 376err_fbdev:
377 drm_kms_helper_poll_fini(drm); 377 drm_kms_helper_poll_fini(drm);
378 drm_mode_config_cleanup(drm);
379 drm_vblank_cleanup(drm); 378 drm_vblank_cleanup(drm);
380err_vblank: 379err_vblank:
381 pm_runtime_disable(drm->dev); 380 pm_runtime_disable(drm->dev);
@@ -387,6 +386,7 @@ err_unload:
387 drm_irq_uninstall(drm); 386 drm_irq_uninstall(drm);
388 of_reserved_mem_device_release(drm->dev); 387 of_reserved_mem_device_release(drm->dev);
389err_free: 388err_free:
389 drm_mode_config_cleanup(drm);
390 dev_set_drvdata(dev, NULL); 390 dev_set_drvdata(dev, NULL);
391 drm_dev_unref(drm); 391 drm_dev_unref(drm);
392 392
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 0ad2c47f808f..71c3473476c7 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -254,10 +254,12 @@ static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_
254 req->value = dev->mode_config.async_page_flip; 254 req->value = dev->mode_config.async_page_flip;
255 break; 255 break;
256 case DRM_CAP_PAGE_FLIP_TARGET: 256 case DRM_CAP_PAGE_FLIP_TARGET:
257 req->value = 1; 257 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
258 drm_for_each_crtc(crtc, dev) { 258 req->value = 1;
259 if (!crtc->funcs->page_flip_target) 259 drm_for_each_crtc(crtc, dev) {
260 req->value = 0; 260 if (!crtc->funcs->page_flip_target)
261 req->value = 0;
262 }
261 } 263 }
262 break; 264 break;
263 case DRM_CAP_CURSOR_WIDTH: 265 case DRM_CAP_CURSOR_WIDTH:
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index e8fb6ef947ee..38eaa63afb31 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -1907,6 +1907,8 @@ err_disable_pm_runtime:
1907err_hdmiphy: 1907err_hdmiphy:
1908 if (hdata->hdmiphy_port) 1908 if (hdata->hdmiphy_port)
1909 put_device(&hdata->hdmiphy_port->dev); 1909 put_device(&hdata->hdmiphy_port->dev);
1910 if (hdata->regs_hdmiphy)
1911 iounmap(hdata->regs_hdmiphy);
1910err_ddc: 1912err_ddc:
1911 put_device(&hdata->ddc_adpt->dev); 1913 put_device(&hdata->ddc_adpt->dev);
1912 1914
@@ -1929,6 +1931,9 @@ static int hdmi_remove(struct platform_device *pdev)
1929 if (hdata->hdmiphy_port) 1931 if (hdata->hdmiphy_port)
1930 put_device(&hdata->hdmiphy_port->dev); 1932 put_device(&hdata->hdmiphy_port->dev);
1931 1933
1934 if (hdata->regs_hdmiphy)
1935 iounmap(hdata->regs_hdmiphy);
1936
1932 put_device(&hdata->ddc_adpt->dev); 1937 put_device(&hdata->ddc_adpt->dev);
1933 1938
1934 return 0; 1939 return 0;
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
index b2d5e188b1b8..deb57435cc89 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_crtc.c
@@ -25,8 +25,13 @@
25static void fsl_dcu_drm_crtc_atomic_flush(struct drm_crtc *crtc, 25static void fsl_dcu_drm_crtc_atomic_flush(struct drm_crtc *crtc,
26 struct drm_crtc_state *old_crtc_state) 26 struct drm_crtc_state *old_crtc_state)
27{ 27{
28 struct drm_device *dev = crtc->dev;
29 struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
28 struct drm_pending_vblank_event *event = crtc->state->event; 30 struct drm_pending_vblank_event *event = crtc->state->event;
29 31
32 regmap_write(fsl_dev->regmap,
33 DCU_UPDATE_MODE, DCU_UPDATE_MODE_READREG);
34
30 if (event) { 35 if (event) {
31 crtc->state->event = NULL; 36 crtc->state->event = NULL;
32 37
@@ -39,11 +44,15 @@ static void fsl_dcu_drm_crtc_atomic_flush(struct drm_crtc *crtc,
39 } 44 }
40} 45}
41 46
42static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc) 47static void fsl_dcu_drm_crtc_atomic_disable(struct drm_crtc *crtc,
48 struct drm_crtc_state *old_crtc_state)
43{ 49{
44 struct drm_device *dev = crtc->dev; 50 struct drm_device *dev = crtc->dev;
45 struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; 51 struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
46 52
53 /* always disable planes on the CRTC */
54 drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, true);
55
47 drm_crtc_vblank_off(crtc); 56 drm_crtc_vblank_off(crtc);
48 57
49 regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE, 58 regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,
@@ -122,8 +131,8 @@ static void fsl_dcu_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
122} 131}
123 132
124static const struct drm_crtc_helper_funcs fsl_dcu_drm_crtc_helper_funcs = { 133static const struct drm_crtc_helper_funcs fsl_dcu_drm_crtc_helper_funcs = {
134 .atomic_disable = fsl_dcu_drm_crtc_atomic_disable,
125 .atomic_flush = fsl_dcu_drm_crtc_atomic_flush, 135 .atomic_flush = fsl_dcu_drm_crtc_atomic_flush,
126 .disable = fsl_dcu_drm_disable_crtc,
127 .enable = fsl_dcu_drm_crtc_enable, 136 .enable = fsl_dcu_drm_crtc_enable,
128 .mode_set_nofb = fsl_dcu_drm_crtc_mode_set_nofb, 137 .mode_set_nofb = fsl_dcu_drm_crtc_mode_set_nofb,
129}; 138};
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
index e04efbed1a54..cc2fde2ae5ef 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_drv.c
@@ -59,8 +59,6 @@ static int fsl_dcu_drm_irq_init(struct drm_device *dev)
59 59
60 regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0); 60 regmap_write(fsl_dev->regmap, DCU_INT_STATUS, 0);
61 regmap_write(fsl_dev->regmap, DCU_INT_MASK, ~0); 61 regmap_write(fsl_dev->regmap, DCU_INT_MASK, ~0);
62 regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
63 DCU_UPDATE_MODE_READREG);
64 62
65 return ret; 63 return ret;
66} 64}
@@ -139,8 +137,6 @@ static irqreturn_t fsl_dcu_drm_irq(int irq, void *arg)
139 drm_handle_vblank(dev, 0); 137 drm_handle_vblank(dev, 0);
140 138
141 regmap_write(fsl_dev->regmap, DCU_INT_STATUS, int_status); 139 regmap_write(fsl_dev->regmap, DCU_INT_STATUS, int_status);
142 regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
143 DCU_UPDATE_MODE_READREG);
144 140
145 return IRQ_HANDLED; 141 return IRQ_HANDLED;
146} 142}
diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c
index 9e6f7d8112b3..a99f48847420 100644
--- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c
+++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c
@@ -160,11 +160,6 @@ static void fsl_dcu_drm_plane_atomic_update(struct drm_plane *plane,
160 DCU_LAYER_POST_SKIP(0) | 160 DCU_LAYER_POST_SKIP(0) |
161 DCU_LAYER_PRE_SKIP(0)); 161 DCU_LAYER_PRE_SKIP(0));
162 } 162 }
163 regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,
164 DCU_MODE_DCU_MODE_MASK,
165 DCU_MODE_DCU_MODE(DCU_MODE_NORMAL));
166 regmap_write(fsl_dev->regmap,
167 DCU_UPDATE_MODE, DCU_UPDATE_MODE_READREG);
168 163
169 return; 164 return;
170} 165}
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 23960de81b57..00eb4814b913 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1806,7 +1806,7 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf)
1806 /* Use a partial view if it is bigger than available space */ 1806 /* Use a partial view if it is bigger than available space */
1807 chunk_size = MIN_CHUNK_PAGES; 1807 chunk_size = MIN_CHUNK_PAGES;
1808 if (i915_gem_object_is_tiled(obj)) 1808 if (i915_gem_object_is_tiled(obj))
1809 chunk_size = max(chunk_size, tile_row_pages(obj)); 1809 chunk_size = roundup(chunk_size, tile_row_pages(obj));
1810 1810
1811 memset(&view, 0, sizeof(view)); 1811 memset(&view, 0, sizeof(view));
1812 view.type = I915_GGTT_VIEW_PARTIAL; 1812 view.type = I915_GGTT_VIEW_PARTIAL;
@@ -2268,7 +2268,7 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2268 page = shmem_read_mapping_page(mapping, i); 2268 page = shmem_read_mapping_page(mapping, i);
2269 if (IS_ERR(page)) { 2269 if (IS_ERR(page)) {
2270 ret = PTR_ERR(page); 2270 ret = PTR_ERR(page);
2271 goto err_pages; 2271 goto err_sg;
2272 } 2272 }
2273 } 2273 }
2274#ifdef CONFIG_SWIOTLB 2274#ifdef CONFIG_SWIOTLB
@@ -2311,8 +2311,9 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2311 2311
2312 return 0; 2312 return 0;
2313 2313
2314err_pages: 2314err_sg:
2315 sg_mark_end(sg); 2315 sg_mark_end(sg);
2316err_pages:
2316 for_each_sgt_page(page, sgt_iter, st) 2317 for_each_sgt_page(page, sgt_iter, st)
2317 put_page(page); 2318 put_page(page);
2318 sg_free_table(st); 2319 sg_free_table(st);
@@ -3543,8 +3544,22 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
3543 if (view->type == I915_GGTT_VIEW_NORMAL) 3544 if (view->type == I915_GGTT_VIEW_NORMAL)
3544 vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, 3545 vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment,
3545 PIN_MAPPABLE | PIN_NONBLOCK); 3546 PIN_MAPPABLE | PIN_NONBLOCK);
3546 if (IS_ERR(vma)) 3547 if (IS_ERR(vma)) {
3547 vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, 0); 3548 struct drm_i915_private *i915 = to_i915(obj->base.dev);
3549 unsigned int flags;
3550
3551 /* Valleyview is definitely limited to scanning out the first
3552 * 512MiB. Lets presume this behaviour was inherited from the
3553 * g4x display engine and that all earlier gen are similarly
3554 * limited. Testing suggests that it is a little more
3555 * complicated than this. For example, Cherryview appears quite
3556 * happy to scanout from anywhere within its global aperture.
3557 */
3558 flags = 0;
3559 if (HAS_GMCH_DISPLAY(i915))
3560 flags = PIN_MAPPABLE;
3561 vma = i915_gem_object_ggtt_pin(obj, view, 0, alignment, flags);
3562 }
3548 if (IS_ERR(vma)) 3563 if (IS_ERR(vma))
3549 goto err_unpin_display; 3564 goto err_unpin_display;
3550 3565
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index 7adb4c77cc7f..a218c2e395e7 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -1281,6 +1281,12 @@ i915_gem_validate_context(struct drm_device *dev, struct drm_file *file,
1281 return ctx; 1281 return ctx;
1282} 1282}
1283 1283
1284static bool gpu_write_needs_clflush(struct drm_i915_gem_object *obj)
1285{
1286 return !(obj->cache_level == I915_CACHE_NONE ||
1287 obj->cache_level == I915_CACHE_WT);
1288}
1289
1284void i915_vma_move_to_active(struct i915_vma *vma, 1290void i915_vma_move_to_active(struct i915_vma *vma,
1285 struct drm_i915_gem_request *req, 1291 struct drm_i915_gem_request *req,
1286 unsigned int flags) 1292 unsigned int flags)
@@ -1311,6 +1317,8 @@ void i915_vma_move_to_active(struct i915_vma *vma,
1311 1317
1312 /* update for the implicit flush after a batch */ 1318 /* update for the implicit flush after a batch */
1313 obj->base.write_domain &= ~I915_GEM_GPU_DOMAINS; 1319 obj->base.write_domain &= ~I915_GEM_GPU_DOMAINS;
1320 if (!obj->cache_dirty && gpu_write_needs_clflush(obj))
1321 obj->cache_dirty = true;
1314 } 1322 }
1315 1323
1316 if (flags & EXEC_OBJECT_NEEDS_FENCE) 1324 if (flags & EXEC_OBJECT_NEEDS_FENCE)
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 1f8af87c6294..cf2560708e03 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -1143,7 +1143,7 @@ static void parse_ddi_port(struct drm_i915_private *dev_priv, enum port port,
1143 if (!child) 1143 if (!child)
1144 return; 1144 return;
1145 1145
1146 aux_channel = child->raw[25]; 1146 aux_channel = child->common.aux_channel;
1147 ddc_pin = child->common.ddc_pin; 1147 ddc_pin = child->common.ddc_pin;
1148 1148
1149 is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING; 1149 is_dvi = child->common.device_type & DEVICE_TYPE_TMDS_DVI_SIGNALING;
@@ -1673,7 +1673,8 @@ bool intel_bios_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
1673 return false; 1673 return false;
1674} 1674}
1675 1675
1676bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum port port) 1676static bool child_dev_is_dp_dual_mode(const union child_device_config *p_child,
1677 enum port port)
1677{ 1678{
1678 static const struct { 1679 static const struct {
1679 u16 dp, hdmi; 1680 u16 dp, hdmi;
@@ -1687,22 +1688,35 @@ bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv, enum por
1687 [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, }, 1688 [PORT_D] = { DVO_PORT_DPD, DVO_PORT_HDMID, },
1688 [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, }, 1689 [PORT_E] = { DVO_PORT_DPE, DVO_PORT_HDMIE, },
1689 }; 1690 };
1690 int i;
1691 1691
1692 if (port == PORT_A || port >= ARRAY_SIZE(port_mapping)) 1692 if (port == PORT_A || port >= ARRAY_SIZE(port_mapping))
1693 return false; 1693 return false;
1694 1694
1695 if (!dev_priv->vbt.child_dev_num) 1695 if ((p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) !=
1696 (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
1696 return false; 1697 return false;
1697 1698
1699 if (p_child->common.dvo_port == port_mapping[port].dp)
1700 return true;
1701
1702 /* Only accept a HDMI dvo_port as DP++ if it has an AUX channel */
1703 if (p_child->common.dvo_port == port_mapping[port].hdmi &&
1704 p_child->common.aux_channel != 0)
1705 return true;
1706
1707 return false;
1708}
1709
1710bool intel_bios_is_port_dp_dual_mode(struct drm_i915_private *dev_priv,
1711 enum port port)
1712{
1713 int i;
1714
1698 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) { 1715 for (i = 0; i < dev_priv->vbt.child_dev_num; i++) {
1699 const union child_device_config *p_child = 1716 const union child_device_config *p_child =
1700 &dev_priv->vbt.child_dev[i]; 1717 &dev_priv->vbt.child_dev[i];
1701 1718
1702 if ((p_child->common.dvo_port == port_mapping[port].dp || 1719 if (child_dev_is_dp_dual_mode(p_child, port))
1703 p_child->common.dvo_port == port_mapping[port].hdmi) &&
1704 (p_child->common.device_type & DEVICE_TYPE_DP_DUAL_MODE_BITS) ==
1705 (DEVICE_TYPE_DP_DUAL_MODE & DEVICE_TYPE_DP_DUAL_MODE_BITS))
1706 return true; 1720 return true;
1707 } 1721 }
1708 1722
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0ad1879bfd9d..3cb70d73239b 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -10243,6 +10243,29 @@ static void bxt_modeset_commit_cdclk(struct drm_atomic_state *old_state)
10243 bxt_set_cdclk(to_i915(dev), req_cdclk); 10243 bxt_set_cdclk(to_i915(dev), req_cdclk);
10244} 10244}
10245 10245
10246static int bdw_adjust_min_pipe_pixel_rate(struct intel_crtc_state *crtc_state,
10247 int pixel_rate)
10248{
10249 struct drm_i915_private *dev_priv = to_i915(crtc_state->base.crtc->dev);
10250
10251 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */
10252 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled)
10253 pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95);
10254
10255 /* BSpec says "Do not use DisplayPort with CDCLK less than
10256 * 432 MHz, audio enabled, port width x4, and link rate
10257 * HBR2 (5.4 GHz), or else there may be audio corruption or
10258 * screen corruption."
10259 */
10260 if (intel_crtc_has_dp_encoder(crtc_state) &&
10261 crtc_state->has_audio &&
10262 crtc_state->port_clock >= 540000 &&
10263 crtc_state->lane_count == 4)
10264 pixel_rate = max(432000, pixel_rate);
10265
10266 return pixel_rate;
10267}
10268
10246/* compute the max rate for new configuration */ 10269/* compute the max rate for new configuration */
10247static int ilk_max_pixel_rate(struct drm_atomic_state *state) 10270static int ilk_max_pixel_rate(struct drm_atomic_state *state)
10248{ 10271{
@@ -10268,9 +10291,9 @@ static int ilk_max_pixel_rate(struct drm_atomic_state *state)
10268 10291
10269 pixel_rate = ilk_pipe_pixel_rate(crtc_state); 10292 pixel_rate = ilk_pipe_pixel_rate(crtc_state);
10270 10293
10271 /* pixel rate mustn't exceed 95% of cdclk with IPS on BDW */ 10294 if (IS_BROADWELL(dev_priv) || IS_GEN9(dev_priv))
10272 if (IS_BROADWELL(dev_priv) && crtc_state->ips_enabled) 10295 pixel_rate = bdw_adjust_min_pipe_pixel_rate(crtc_state,
10273 pixel_rate = DIV_ROUND_UP(pixel_rate * 100, 95); 10296 pixel_rate);
10274 10297
10275 intel_state->min_pixclk[i] = pixel_rate; 10298 intel_state->min_pixclk[i] = pixel_rate;
10276 } 10299 }
@@ -12237,7 +12260,7 @@ static int intel_crtc_page_flip(struct drm_crtc *crtc,
12237 intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error); 12260 intel_crtc->reset_count = i915_reset_count(&dev_priv->gpu_error);
12238 if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) { 12261 if (i915_reset_in_progress_or_wedged(&dev_priv->gpu_error)) {
12239 ret = -EIO; 12262 ret = -EIO;
12240 goto cleanup; 12263 goto unlock;
12241 } 12264 }
12242 12265
12243 atomic_inc(&intel_crtc->unpin_work_count); 12266 atomic_inc(&intel_crtc->unpin_work_count);
@@ -12329,6 +12352,7 @@ cleanup_unpin:
12329 intel_unpin_fb_obj(fb, crtc->primary->state->rotation); 12352 intel_unpin_fb_obj(fb, crtc->primary->state->rotation);
12330cleanup_pending: 12353cleanup_pending:
12331 atomic_dec(&intel_crtc->unpin_work_count); 12354 atomic_dec(&intel_crtc->unpin_work_count);
12355unlock:
12332 mutex_unlock(&dev->struct_mutex); 12356 mutex_unlock(&dev->struct_mutex);
12333cleanup: 12357cleanup:
12334 crtc->primary->fb = old_fb; 12358 crtc->primary->fb = old_fb;
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 3581b5a7f716..bf344d08356a 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -4463,21 +4463,11 @@ static enum drm_connector_status
4463intel_dp_detect(struct drm_connector *connector, bool force) 4463intel_dp_detect(struct drm_connector *connector, bool force)
4464{ 4464{
4465 struct intel_dp *intel_dp = intel_attached_dp(connector); 4465 struct intel_dp *intel_dp = intel_attached_dp(connector);
4466 struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
4467 struct intel_encoder *intel_encoder = &intel_dig_port->base;
4468 enum drm_connector_status status = connector->status; 4466 enum drm_connector_status status = connector->status;
4469 4467
4470 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n", 4468 DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
4471 connector->base.id, connector->name); 4469 connector->base.id, connector->name);
4472 4470
4473 if (intel_dp->is_mst) {
4474 /* MST devices are disconnected from a monitor POV */
4475 intel_dp_unset_edid(intel_dp);
4476 if (intel_encoder->type != INTEL_OUTPUT_EDP)
4477 intel_encoder->type = INTEL_OUTPUT_DP;
4478 return connector_status_disconnected;
4479 }
4480
4481 /* If full detect is not performed yet, do a full detect */ 4471 /* If full detect is not performed yet, do a full detect */
4482 if (!intel_dp->detect_done) 4472 if (!intel_dp->detect_done)
4483 status = intel_dp_long_pulse(intel_dp->attached_connector); 4473 status = intel_dp_long_pulse(intel_dp->attached_connector);
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
index f40a35f2913a..13c306173f27 100644
--- a/drivers/gpu/drm/i915/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/intel_hdmi.c
@@ -1799,6 +1799,50 @@ intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *c
1799 intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE; 1799 intel_hdmi->aspect_ratio = HDMI_PICTURE_ASPECT_NONE;
1800} 1800}
1801 1801
1802static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv,
1803 enum port port)
1804{
1805 const struct ddi_vbt_port_info *info =
1806 &dev_priv->vbt.ddi_port_info[port];
1807 u8 ddc_pin;
1808
1809 if (info->alternate_ddc_pin) {
1810 DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (VBT)\n",
1811 info->alternate_ddc_pin, port_name(port));
1812 return info->alternate_ddc_pin;
1813 }
1814
1815 switch (port) {
1816 case PORT_B:
1817 if (IS_BROXTON(dev_priv))
1818 ddc_pin = GMBUS_PIN_1_BXT;
1819 else
1820 ddc_pin = GMBUS_PIN_DPB;
1821 break;
1822 case PORT_C:
1823 if (IS_BROXTON(dev_priv))
1824 ddc_pin = GMBUS_PIN_2_BXT;
1825 else
1826 ddc_pin = GMBUS_PIN_DPC;
1827 break;
1828 case PORT_D:
1829 if (IS_CHERRYVIEW(dev_priv))
1830 ddc_pin = GMBUS_PIN_DPD_CHV;
1831 else
1832 ddc_pin = GMBUS_PIN_DPD;
1833 break;
1834 default:
1835 MISSING_CASE(port);
1836 ddc_pin = GMBUS_PIN_DPB;
1837 break;
1838 }
1839
1840 DRM_DEBUG_KMS("Using DDC pin 0x%x for port %c (platform default)\n",
1841 ddc_pin, port_name(port));
1842
1843 return ddc_pin;
1844}
1845
1802void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port, 1846void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1803 struct intel_connector *intel_connector) 1847 struct intel_connector *intel_connector)
1804{ 1848{
@@ -1808,7 +1852,6 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1808 struct drm_device *dev = intel_encoder->base.dev; 1852 struct drm_device *dev = intel_encoder->base.dev;
1809 struct drm_i915_private *dev_priv = to_i915(dev); 1853 struct drm_i915_private *dev_priv = to_i915(dev);
1810 enum port port = intel_dig_port->port; 1854 enum port port = intel_dig_port->port;
1811 uint8_t alternate_ddc_pin;
1812 1855
1813 DRM_DEBUG_KMS("Adding HDMI connector on port %c\n", 1856 DRM_DEBUG_KMS("Adding HDMI connector on port %c\n",
1814 port_name(port)); 1857 port_name(port));
@@ -1826,12 +1869,10 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1826 connector->doublescan_allowed = 0; 1869 connector->doublescan_allowed = 0;
1827 connector->stereo_allowed = 1; 1870 connector->stereo_allowed = 1;
1828 1871
1872 intel_hdmi->ddc_bus = intel_hdmi_ddc_pin(dev_priv, port);
1873
1829 switch (port) { 1874 switch (port) {
1830 case PORT_B: 1875 case PORT_B:
1831 if (IS_BROXTON(dev_priv))
1832 intel_hdmi->ddc_bus = GMBUS_PIN_1_BXT;
1833 else
1834 intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1835 /* 1876 /*
1836 * On BXT A0/A1, sw needs to activate DDIA HPD logic and 1877 * On BXT A0/A1, sw needs to activate DDIA HPD logic and
1837 * interrupts to check the external panel connection. 1878 * interrupts to check the external panel connection.
@@ -1842,46 +1883,17 @@ void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1842 intel_encoder->hpd_pin = HPD_PORT_B; 1883 intel_encoder->hpd_pin = HPD_PORT_B;
1843 break; 1884 break;
1844 case PORT_C: 1885 case PORT_C:
1845 if (IS_BROXTON(dev_priv))
1846 intel_hdmi->ddc_bus = GMBUS_PIN_2_BXT;
1847 else
1848 intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
1849 intel_encoder->hpd_pin = HPD_PORT_C; 1886 intel_encoder->hpd_pin = HPD_PORT_C;
1850 break; 1887 break;
1851 case PORT_D: 1888 case PORT_D:
1852 if (WARN_ON(IS_BROXTON(dev_priv)))
1853 intel_hdmi->ddc_bus = GMBUS_PIN_DISABLED;
1854 else if (IS_CHERRYVIEW(dev_priv))
1855 intel_hdmi->ddc_bus = GMBUS_PIN_DPD_CHV;
1856 else
1857 intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
1858 intel_encoder->hpd_pin = HPD_PORT_D; 1889 intel_encoder->hpd_pin = HPD_PORT_D;
1859 break; 1890 break;
1860 case PORT_E: 1891 case PORT_E:
1861 /* On SKL PORT E doesn't have seperate GMBUS pin
1862 * We rely on VBT to set a proper alternate GMBUS pin. */
1863 alternate_ddc_pin =
1864 dev_priv->vbt.ddi_port_info[PORT_E].alternate_ddc_pin;
1865 switch (alternate_ddc_pin) {
1866 case DDC_PIN_B:
1867 intel_hdmi->ddc_bus = GMBUS_PIN_DPB;
1868 break;
1869 case DDC_PIN_C:
1870 intel_hdmi->ddc_bus = GMBUS_PIN_DPC;
1871 break;
1872 case DDC_PIN_D:
1873 intel_hdmi->ddc_bus = GMBUS_PIN_DPD;
1874 break;
1875 default:
1876 MISSING_CASE(alternate_ddc_pin);
1877 }
1878 intel_encoder->hpd_pin = HPD_PORT_E; 1892 intel_encoder->hpd_pin = HPD_PORT_E;
1879 break; 1893 break;
1880 case PORT_A:
1881 intel_encoder->hpd_pin = HPD_PORT_A;
1882 /* Internal port only for eDP. */
1883 default: 1894 default:
1884 BUG(); 1895 MISSING_CASE(port);
1896 return;
1885 } 1897 }
1886 1898
1887 if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) { 1899 if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) {
diff --git a/drivers/gpu/drm/i915/intel_runtime_pm.c b/drivers/gpu/drm/i915/intel_runtime_pm.c
index 6c11168facd6..a38c2fefe85a 100644
--- a/drivers/gpu/drm/i915/intel_runtime_pm.c
+++ b/drivers/gpu/drm/i915/intel_runtime_pm.c
@@ -1139,7 +1139,9 @@ static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv)
1139 1139
1140 intel_power_sequencer_reset(dev_priv); 1140 intel_power_sequencer_reset(dev_priv);
1141 1141
1142 intel_hpd_poll_init(dev_priv); 1142 /* Prevent us from re-enabling polling on accident in late suspend */
1143 if (!dev_priv->drm.dev->power.is_suspended)
1144 intel_hpd_poll_init(dev_priv);
1143} 1145}
1144 1146
1145static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv, 1147static void vlv_display_power_well_enable(struct drm_i915_private *dev_priv,
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
index 73a521fdf1bd..dbed12c484c9 100644
--- a/drivers/gpu/drm/i915/intel_sprite.c
+++ b/drivers/gpu/drm/i915/intel_sprite.c
@@ -358,7 +358,7 @@ vlv_update_plane(struct drm_plane *dplane,
358 int plane = intel_plane->plane; 358 int plane = intel_plane->plane;
359 u32 sprctl; 359 u32 sprctl;
360 u32 sprsurf_offset, linear_offset; 360 u32 sprsurf_offset, linear_offset;
361 unsigned int rotation = dplane->state->rotation; 361 unsigned int rotation = plane_state->base.rotation;
362 const struct drm_intel_sprite_colorkey *key = &plane_state->ckey; 362 const struct drm_intel_sprite_colorkey *key = &plane_state->ckey;
363 int crtc_x = plane_state->base.dst.x1; 363 int crtc_x = plane_state->base.dst.x1;
364 int crtc_y = plane_state->base.dst.y1; 364 int crtc_y = plane_state->base.dst.y1;
diff --git a/drivers/gpu/drm/i915/intel_vbt_defs.h b/drivers/gpu/drm/i915/intel_vbt_defs.h
index 68db9621f1f0..8886cab19f98 100644
--- a/drivers/gpu/drm/i915/intel_vbt_defs.h
+++ b/drivers/gpu/drm/i915/intel_vbt_defs.h
@@ -280,7 +280,8 @@ struct common_child_dev_config {
280 u8 dp_support:1; 280 u8 dp_support:1;
281 u8 tmds_support:1; 281 u8 tmds_support:1;
282 u8 support_reserved:5; 282 u8 support_reserved:5;
283 u8 not_common3[12]; 283 u8 aux_channel;
284 u8 not_common3[11];
284 u8 iboost_level; 285 u8 iboost_level;
285} __packed; 286} __packed;
286 287
diff --git a/drivers/gpu/drm/imx/ipuv3-crtc.c b/drivers/gpu/drm/imx/ipuv3-crtc.c
index 4e1ae3fc462d..6be515a9fb69 100644
--- a/drivers/gpu/drm/imx/ipuv3-crtc.c
+++ b/drivers/gpu/drm/imx/ipuv3-crtc.c
@@ -68,6 +68,12 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
68 68
69 ipu_dc_disable_channel(ipu_crtc->dc); 69 ipu_dc_disable_channel(ipu_crtc->dc);
70 ipu_di_disable(ipu_crtc->di); 70 ipu_di_disable(ipu_crtc->di);
71 /*
72 * Planes must be disabled before DC clock is removed, as otherwise the
73 * attached IDMACs will be left in undefined state, possibly hanging
74 * the IPU or even system.
75 */
76 drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, false);
71 ipu_dc_disable(ipu); 77 ipu_dc_disable(ipu);
72 78
73 spin_lock_irq(&crtc->dev->event_lock); 79 spin_lock_irq(&crtc->dev->event_lock);
@@ -77,9 +83,6 @@ static void ipu_crtc_atomic_disable(struct drm_crtc *crtc,
77 } 83 }
78 spin_unlock_irq(&crtc->dev->event_lock); 84 spin_unlock_irq(&crtc->dev->event_lock);
79 85
80 /* always disable planes on the CRTC */
81 drm_atomic_helper_disable_planes_on_crtc(old_crtc_state, true);
82
83 drm_crtc_vblank_off(crtc); 86 drm_crtc_vblank_off(crtc);
84} 87}
85 88
diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
index 019b7ca392d7..c70310206ac5 100644
--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
@@ -80,6 +80,7 @@ static void mtk_ovl_enable_vblank(struct mtk_ddp_comp *comp,
80 ddp_comp); 80 ddp_comp);
81 81
82 priv->crtc = crtc; 82 priv->crtc = crtc;
83 writel(0x0, comp->regs + DISP_REG_OVL_INTSTA);
83 writel_relaxed(OVL_FME_CPL_INT, comp->regs + DISP_REG_OVL_INTEN); 84 writel_relaxed(OVL_FME_CPL_INT, comp->regs + DISP_REG_OVL_INTEN);
84} 85}
85 86
@@ -250,13 +251,6 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
250 if (irq < 0) 251 if (irq < 0)
251 return irq; 252 return irq;
252 253
253 ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
254 IRQF_TRIGGER_NONE, dev_name(dev), priv);
255 if (ret < 0) {
256 dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
257 return ret;
258 }
259
260 comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL); 254 comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL);
261 if (comp_id < 0) { 255 if (comp_id < 0) {
262 dev_err(dev, "Failed to identify by alias: %d\n", comp_id); 256 dev_err(dev, "Failed to identify by alias: %d\n", comp_id);
@@ -272,6 +266,13 @@ static int mtk_disp_ovl_probe(struct platform_device *pdev)
272 266
273 platform_set_drvdata(pdev, priv); 267 platform_set_drvdata(pdev, priv);
274 268
269 ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler,
270 IRQF_TRIGGER_NONE, dev_name(dev), priv);
271 if (ret < 0) {
272 dev_err(dev, "Failed to request irq %d: %d\n", irq, ret);
273 return ret;
274 }
275
275 ret = component_add(dev, &mtk_disp_ovl_component_ops); 276 ret = component_add(dev, &mtk_disp_ovl_component_ops);
276 if (ret) 277 if (ret)
277 dev_err(dev, "Failed to add component: %d\n", ret); 278 dev_err(dev, "Failed to add component: %d\n", ret);
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
index 0186e500d2a5..90fb831ef031 100644
--- a/drivers/gpu/drm/mediatek/mtk_dpi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
@@ -432,11 +432,16 @@ static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi,
432 unsigned long pll_rate; 432 unsigned long pll_rate;
433 unsigned int factor; 433 unsigned int factor;
434 434
435 /* let pll_rate can fix the valid range of tvdpll (1G~2GHz) */
435 pix_rate = 1000UL * mode->clock; 436 pix_rate = 1000UL * mode->clock;
436 if (mode->clock <= 74000) 437 if (mode->clock <= 27000)
438 factor = 16 * 3;
439 else if (mode->clock <= 84000)
437 factor = 8 * 3; 440 factor = 8 * 3;
438 else 441 else if (mode->clock <= 167000)
439 factor = 4 * 3; 442 factor = 4 * 3;
443 else
444 factor = 2 * 3;
440 pll_rate = pix_rate * factor; 445 pll_rate = pix_rate * factor;
441 446
442 dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n", 447 dev_dbg(dpi->dev, "Want PLL %lu Hz, pixel clock %lu Hz\n",
diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
index df33b3ca6ffd..48cc01fd20c7 100644
--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
+++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c
@@ -123,7 +123,7 @@ static void mtk_od_config(struct mtk_ddp_comp *comp, unsigned int w,
123 unsigned int bpc) 123 unsigned int bpc)
124{ 124{
125 writel(w << 16 | h, comp->regs + DISP_OD_SIZE); 125 writel(w << 16 | h, comp->regs + DISP_OD_SIZE);
126 writel(OD_RELAYMODE, comp->regs + OD_RELAYMODE); 126 writel(OD_RELAYMODE, comp->regs + DISP_OD_CFG);
127 mtk_dither_set(comp, bpc, DISP_OD_CFG); 127 mtk_dither_set(comp, bpc, DISP_OD_CFG);
128} 128}
129 129
diff --git a/drivers/gpu/drm/mediatek/mtk_dsi.c b/drivers/gpu/drm/mediatek/mtk_dsi.c
index 28b2044ed9f2..eaa5a2240c0c 100644
--- a/drivers/gpu/drm/mediatek/mtk_dsi.c
+++ b/drivers/gpu/drm/mediatek/mtk_dsi.c
@@ -86,7 +86,7 @@
86 86
87#define DSI_PHY_TIMECON0 0x110 87#define DSI_PHY_TIMECON0 0x110
88#define LPX (0xff << 0) 88#define LPX (0xff << 0)
89#define HS_PRPR (0xff << 8) 89#define HS_PREP (0xff << 8)
90#define HS_ZERO (0xff << 16) 90#define HS_ZERO (0xff << 16)
91#define HS_TRAIL (0xff << 24) 91#define HS_TRAIL (0xff << 24)
92 92
@@ -102,10 +102,16 @@
102#define CLK_TRAIL (0xff << 24) 102#define CLK_TRAIL (0xff << 24)
103 103
104#define DSI_PHY_TIMECON3 0x11c 104#define DSI_PHY_TIMECON3 0x11c
105#define CLK_HS_PRPR (0xff << 0) 105#define CLK_HS_PREP (0xff << 0)
106#define CLK_HS_POST (0xff << 8) 106#define CLK_HS_POST (0xff << 8)
107#define CLK_HS_EXIT (0xff << 16) 107#define CLK_HS_EXIT (0xff << 16)
108 108
109#define T_LPX 5
110#define T_HS_PREP 6
111#define T_HS_TRAIL 8
112#define T_HS_EXIT 7
113#define T_HS_ZERO 10
114
109#define NS_TO_CYCLE(n, c) ((n) / (c) + (((n) % (c)) ? 1 : 0)) 115#define NS_TO_CYCLE(n, c) ((n) / (c) + (((n) % (c)) ? 1 : 0))
110 116
111struct phy; 117struct phy;
@@ -161,20 +167,18 @@ static void mtk_dsi_mask(struct mtk_dsi *dsi, u32 offset, u32 mask, u32 data)
161static void dsi_phy_timconfig(struct mtk_dsi *dsi) 167static void dsi_phy_timconfig(struct mtk_dsi *dsi)
162{ 168{
163 u32 timcon0, timcon1, timcon2, timcon3; 169 u32 timcon0, timcon1, timcon2, timcon3;
164 unsigned int ui, cycle_time; 170 u32 ui, cycle_time;
165 unsigned int lpx;
166 171
167 ui = 1000 / dsi->data_rate + 0x01; 172 ui = 1000 / dsi->data_rate + 0x01;
168 cycle_time = 8000 / dsi->data_rate + 0x01; 173 cycle_time = 8000 / dsi->data_rate + 0x01;
169 lpx = 5;
170 174
171 timcon0 = (8 << 24) | (0xa << 16) | (0x6 << 8) | lpx; 175 timcon0 = T_LPX | T_HS_PREP << 8 | T_HS_ZERO << 16 | T_HS_TRAIL << 24;
172 timcon1 = (7 << 24) | (5 * lpx << 16) | ((3 * lpx) / 2) << 8 | 176 timcon1 = 4 * T_LPX | (3 * T_LPX / 2) << 8 | 5 * T_LPX << 16 |
173 (4 * lpx); 177 T_HS_EXIT << 24;
174 timcon2 = ((NS_TO_CYCLE(0x64, cycle_time) + 0xa) << 24) | 178 timcon2 = ((NS_TO_CYCLE(0x64, cycle_time) + 0xa) << 24) |
175 (NS_TO_CYCLE(0x150, cycle_time) << 16); 179 (NS_TO_CYCLE(0x150, cycle_time) << 16);
176 timcon3 = (2 * lpx) << 16 | NS_TO_CYCLE(80 + 52 * ui, cycle_time) << 8 | 180 timcon3 = NS_TO_CYCLE(0x40, cycle_time) | (2 * T_LPX) << 16 |
177 NS_TO_CYCLE(0x40, cycle_time); 181 NS_TO_CYCLE(80 + 52 * ui, cycle_time) << 8;
178 182
179 writel(timcon0, dsi->regs + DSI_PHY_TIMECON0); 183 writel(timcon0, dsi->regs + DSI_PHY_TIMECON0);
180 writel(timcon1, dsi->regs + DSI_PHY_TIMECON1); 184 writel(timcon1, dsi->regs + DSI_PHY_TIMECON1);
@@ -202,19 +206,47 @@ static int mtk_dsi_poweron(struct mtk_dsi *dsi)
202{ 206{
203 struct device *dev = dsi->dev; 207 struct device *dev = dsi->dev;
204 int ret; 208 int ret;
209 u64 pixel_clock, total_bits;
210 u32 htotal, htotal_bits, bit_per_pixel, overhead_cycles, overhead_bits;
205 211
206 if (++dsi->refcount != 1) 212 if (++dsi->refcount != 1)
207 return 0; 213 return 0;
208 214
215 switch (dsi->format) {
216 case MIPI_DSI_FMT_RGB565:
217 bit_per_pixel = 16;
218 break;
219 case MIPI_DSI_FMT_RGB666_PACKED:
220 bit_per_pixel = 18;
221 break;
222 case MIPI_DSI_FMT_RGB666:
223 case MIPI_DSI_FMT_RGB888:
224 default:
225 bit_per_pixel = 24;
226 break;
227 }
228
209 /** 229 /**
210 * data_rate = (pixel_clock / 1000) * pixel_dipth * mipi_ratio; 230 * vm.pixelclock is in kHz, pixel_clock unit is Hz, so multiply by 1000
211 * pixel_clock unit is Khz, data_rata unit is MHz, so need divide 1000. 231 * htotal_time = htotal * byte_per_pixel / num_lanes
212 * mipi_ratio is mipi clk coefficient for balance the pixel clk in mipi. 232 * overhead_time = lpx + hs_prepare + hs_zero + hs_trail + hs_exit
213 * we set mipi_ratio is 1.05. 233 * mipi_ratio = (htotal_time + overhead_time) / htotal_time
234 * data_rate = pixel_clock * bit_per_pixel * mipi_ratio / num_lanes;
214 */ 235 */
215 dsi->data_rate = dsi->vm.pixelclock * 3 * 21 / (1 * 1000 * 10); 236 pixel_clock = dsi->vm.pixelclock * 1000;
237 htotal = dsi->vm.hactive + dsi->vm.hback_porch + dsi->vm.hfront_porch +
238 dsi->vm.hsync_len;
239 htotal_bits = htotal * bit_per_pixel;
240
241 overhead_cycles = T_LPX + T_HS_PREP + T_HS_ZERO + T_HS_TRAIL +
242 T_HS_EXIT;
243 overhead_bits = overhead_cycles * dsi->lanes * 8;
244 total_bits = htotal_bits + overhead_bits;
245
246 dsi->data_rate = DIV_ROUND_UP_ULL(pixel_clock * total_bits,
247 htotal * dsi->lanes);
216 248
217 ret = clk_set_rate(dsi->hs_clk, dsi->data_rate * 1000000); 249 ret = clk_set_rate(dsi->hs_clk, dsi->data_rate);
218 if (ret < 0) { 250 if (ret < 0) {
219 dev_err(dev, "Failed to set data rate: %d\n", ret); 251 dev_err(dev, "Failed to set data rate: %d\n", ret);
220 goto err_refcount; 252 goto err_refcount;
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 71227deef21b..0e8c4d9af340 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -1133,12 +1133,6 @@ static int mtk_hdmi_output_set_display_mode(struct mtk_hdmi *hdmi,
1133 phy_power_on(hdmi->phy); 1133 phy_power_on(hdmi->phy);
1134 mtk_hdmi_aud_output_config(hdmi, mode); 1134 mtk_hdmi_aud_output_config(hdmi, mode);
1135 1135
1136 mtk_hdmi_setup_audio_infoframe(hdmi);
1137 mtk_hdmi_setup_avi_infoframe(hdmi, mode);
1138 mtk_hdmi_setup_spd_infoframe(hdmi, "mediatek", "On-chip HDMI");
1139 if (mode->flags & DRM_MODE_FLAG_3D_MASK)
1140 mtk_hdmi_setup_vendor_specific_infoframe(hdmi, mode);
1141
1142 mtk_hdmi_hw_vid_black(hdmi, false); 1136 mtk_hdmi_hw_vid_black(hdmi, false);
1143 mtk_hdmi_hw_aud_unmute(hdmi); 1137 mtk_hdmi_hw_aud_unmute(hdmi);
1144 mtk_hdmi_hw_send_av_unmute(hdmi); 1138 mtk_hdmi_hw_send_av_unmute(hdmi);
@@ -1401,6 +1395,16 @@ static void mtk_hdmi_bridge_pre_enable(struct drm_bridge *bridge)
1401 hdmi->powered = true; 1395 hdmi->powered = true;
1402} 1396}
1403 1397
1398static void mtk_hdmi_send_infoframe(struct mtk_hdmi *hdmi,
1399 struct drm_display_mode *mode)
1400{
1401 mtk_hdmi_setup_audio_infoframe(hdmi);
1402 mtk_hdmi_setup_avi_infoframe(hdmi, mode);
1403 mtk_hdmi_setup_spd_infoframe(hdmi, "mediatek", "On-chip HDMI");
1404 if (mode->flags & DRM_MODE_FLAG_3D_MASK)
1405 mtk_hdmi_setup_vendor_specific_infoframe(hdmi, mode);
1406}
1407
1404static void mtk_hdmi_bridge_enable(struct drm_bridge *bridge) 1408static void mtk_hdmi_bridge_enable(struct drm_bridge *bridge)
1405{ 1409{
1406 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge); 1410 struct mtk_hdmi *hdmi = hdmi_ctx_from_bridge(bridge);
@@ -1409,6 +1413,7 @@ static void mtk_hdmi_bridge_enable(struct drm_bridge *bridge)
1409 clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_HDMI_PLL]); 1413 clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_HDMI_PLL]);
1410 clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_HDMI_PIXEL]); 1414 clk_prepare_enable(hdmi->clk[MTK_HDMI_CLK_HDMI_PIXEL]);
1411 phy_power_on(hdmi->phy); 1415 phy_power_on(hdmi->phy);
1416 mtk_hdmi_send_infoframe(hdmi, &hdmi->mode);
1412 1417
1413 hdmi->enabled = true; 1418 hdmi->enabled = true;
1414} 1419}
diff --git a/drivers/gpu/drm/mediatek/mtk_mt8173_hdmi_phy.c b/drivers/gpu/drm/mediatek/mtk_mt8173_hdmi_phy.c
index 8a24754b440f..51cb9cfb6646 100644
--- a/drivers/gpu/drm/mediatek/mtk_mt8173_hdmi_phy.c
+++ b/drivers/gpu/drm/mediatek/mtk_mt8173_hdmi_phy.c
@@ -265,6 +265,9 @@ static int mtk_hdmi_pll_set_rate(struct clk_hw *hw, unsigned long rate,
265 struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw); 265 struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw);
266 unsigned int pre_div; 266 unsigned int pre_div;
267 unsigned int div; 267 unsigned int div;
268 unsigned int pre_ibias;
269 unsigned int hdmi_ibias;
270 unsigned int imp_en;
268 271
269 dev_dbg(hdmi_phy->dev, "%s: %lu Hz, parent: %lu Hz\n", __func__, 272 dev_dbg(hdmi_phy->dev, "%s: %lu Hz, parent: %lu Hz\n", __func__,
270 rate, parent_rate); 273 rate, parent_rate);
@@ -298,18 +301,31 @@ static int mtk_hdmi_pll_set_rate(struct clk_hw *hw, unsigned long rate,
298 (0x1 << PLL_BR_SHIFT), 301 (0x1 << PLL_BR_SHIFT),
299 RG_HDMITX_PLL_BP | RG_HDMITX_PLL_BC | 302 RG_HDMITX_PLL_BP | RG_HDMITX_PLL_BC |
300 RG_HDMITX_PLL_BR); 303 RG_HDMITX_PLL_BR);
301 mtk_hdmi_phy_clear_bits(hdmi_phy, HDMI_CON3, RG_HDMITX_PRD_IMP_EN); 304 if (rate < 165000000) {
305 mtk_hdmi_phy_clear_bits(hdmi_phy, HDMI_CON3,
306 RG_HDMITX_PRD_IMP_EN);
307 pre_ibias = 0x3;
308 imp_en = 0x0;
309 hdmi_ibias = hdmi_phy->ibias;
310 } else {
311 mtk_hdmi_phy_set_bits(hdmi_phy, HDMI_CON3,
312 RG_HDMITX_PRD_IMP_EN);
313 pre_ibias = 0x6;
314 imp_en = 0xf;
315 hdmi_ibias = hdmi_phy->ibias_up;
316 }
302 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON4, 317 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON4,
303 (0x3 << PRD_IBIAS_CLK_SHIFT) | 318 (pre_ibias << PRD_IBIAS_CLK_SHIFT) |
304 (0x3 << PRD_IBIAS_D2_SHIFT) | 319 (pre_ibias << PRD_IBIAS_D2_SHIFT) |
305 (0x3 << PRD_IBIAS_D1_SHIFT) | 320 (pre_ibias << PRD_IBIAS_D1_SHIFT) |
306 (0x3 << PRD_IBIAS_D0_SHIFT), 321 (pre_ibias << PRD_IBIAS_D0_SHIFT),
307 RG_HDMITX_PRD_IBIAS_CLK | 322 RG_HDMITX_PRD_IBIAS_CLK |
308 RG_HDMITX_PRD_IBIAS_D2 | 323 RG_HDMITX_PRD_IBIAS_D2 |
309 RG_HDMITX_PRD_IBIAS_D1 | 324 RG_HDMITX_PRD_IBIAS_D1 |
310 RG_HDMITX_PRD_IBIAS_D0); 325 RG_HDMITX_PRD_IBIAS_D0);
311 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON3, 326 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON3,
312 (0x0 << DRV_IMP_EN_SHIFT), RG_HDMITX_DRV_IMP_EN); 327 (imp_en << DRV_IMP_EN_SHIFT),
328 RG_HDMITX_DRV_IMP_EN);
313 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON6, 329 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON6,
314 (hdmi_phy->drv_imp_clk << DRV_IMP_CLK_SHIFT) | 330 (hdmi_phy->drv_imp_clk << DRV_IMP_CLK_SHIFT) |
315 (hdmi_phy->drv_imp_d2 << DRV_IMP_D2_SHIFT) | 331 (hdmi_phy->drv_imp_d2 << DRV_IMP_D2_SHIFT) |
@@ -318,12 +334,14 @@ static int mtk_hdmi_pll_set_rate(struct clk_hw *hw, unsigned long rate,
318 RG_HDMITX_DRV_IMP_CLK | RG_HDMITX_DRV_IMP_D2 | 334 RG_HDMITX_DRV_IMP_CLK | RG_HDMITX_DRV_IMP_D2 |
319 RG_HDMITX_DRV_IMP_D1 | RG_HDMITX_DRV_IMP_D0); 335 RG_HDMITX_DRV_IMP_D1 | RG_HDMITX_DRV_IMP_D0);
320 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON5, 336 mtk_hdmi_phy_mask(hdmi_phy, HDMI_CON5,
321 (hdmi_phy->ibias << DRV_IBIAS_CLK_SHIFT) | 337 (hdmi_ibias << DRV_IBIAS_CLK_SHIFT) |
322 (hdmi_phy->ibias << DRV_IBIAS_D2_SHIFT) | 338 (hdmi_ibias << DRV_IBIAS_D2_SHIFT) |
323 (hdmi_phy->ibias << DRV_IBIAS_D1_SHIFT) | 339 (hdmi_ibias << DRV_IBIAS_D1_SHIFT) |
324 (hdmi_phy->ibias << DRV_IBIAS_D0_SHIFT), 340 (hdmi_ibias << DRV_IBIAS_D0_SHIFT),
325 RG_HDMITX_DRV_IBIAS_CLK | RG_HDMITX_DRV_IBIAS_D2 | 341 RG_HDMITX_DRV_IBIAS_CLK |
326 RG_HDMITX_DRV_IBIAS_D1 | RG_HDMITX_DRV_IBIAS_D0); 342 RG_HDMITX_DRV_IBIAS_D2 |
343 RG_HDMITX_DRV_IBIAS_D1 |
344 RG_HDMITX_DRV_IBIAS_D0);
327 return 0; 345 return 0;
328} 346}
329 347
diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
index f05ed0e1f3d6..6f240021705b 100644
--- a/drivers/gpu/drm/msm/dsi/dsi_host.c
+++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
@@ -139,6 +139,7 @@ struct msm_dsi_host {
139 139
140 u32 err_work_state; 140 u32 err_work_state;
141 struct work_struct err_work; 141 struct work_struct err_work;
142 struct work_struct hpd_work;
142 struct workqueue_struct *workqueue; 143 struct workqueue_struct *workqueue;
143 144
144 /* DSI 6G TX buffer*/ 145 /* DSI 6G TX buffer*/
@@ -1294,6 +1295,14 @@ static void dsi_sw_reset_restore(struct msm_dsi_host *msm_host)
1294 wmb(); /* make sure dsi controller enabled again */ 1295 wmb(); /* make sure dsi controller enabled again */
1295} 1296}
1296 1297
1298static void dsi_hpd_worker(struct work_struct *work)
1299{
1300 struct msm_dsi_host *msm_host =
1301 container_of(work, struct msm_dsi_host, hpd_work);
1302
1303 drm_helper_hpd_irq_event(msm_host->dev);
1304}
1305
1297static void dsi_err_worker(struct work_struct *work) 1306static void dsi_err_worker(struct work_struct *work)
1298{ 1307{
1299 struct msm_dsi_host *msm_host = 1308 struct msm_dsi_host *msm_host =
@@ -1480,7 +1489,7 @@ static int dsi_host_attach(struct mipi_dsi_host *host,
1480 1489
1481 DBG("id=%d", msm_host->id); 1490 DBG("id=%d", msm_host->id);
1482 if (msm_host->dev) 1491 if (msm_host->dev)
1483 drm_helper_hpd_irq_event(msm_host->dev); 1492 queue_work(msm_host->workqueue, &msm_host->hpd_work);
1484 1493
1485 return 0; 1494 return 0;
1486} 1495}
@@ -1494,7 +1503,7 @@ static int dsi_host_detach(struct mipi_dsi_host *host,
1494 1503
1495 DBG("id=%d", msm_host->id); 1504 DBG("id=%d", msm_host->id);
1496 if (msm_host->dev) 1505 if (msm_host->dev)
1497 drm_helper_hpd_irq_event(msm_host->dev); 1506 queue_work(msm_host->workqueue, &msm_host->hpd_work);
1498 1507
1499 return 0; 1508 return 0;
1500} 1509}
@@ -1748,6 +1757,7 @@ int msm_dsi_host_init(struct msm_dsi *msm_dsi)
1748 /* setup workqueue */ 1757 /* setup workqueue */
1749 msm_host->workqueue = alloc_ordered_workqueue("dsi_drm_work", 0); 1758 msm_host->workqueue = alloc_ordered_workqueue("dsi_drm_work", 0);
1750 INIT_WORK(&msm_host->err_work, dsi_err_worker); 1759 INIT_WORK(&msm_host->err_work, dsi_err_worker);
1760 INIT_WORK(&msm_host->hpd_work, dsi_hpd_worker);
1751 1761
1752 msm_dsi->host = &msm_host->base; 1762 msm_dsi->host = &msm_host->base;
1753 msm_dsi->id = msm_host->id; 1763 msm_dsi->id = msm_host->id;
diff --git a/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm.c b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm.c
index 598fdaff0a41..26e3a01a99c2 100644
--- a/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm.c
+++ b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm.c
@@ -521,6 +521,7 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
521 .parent_names = (const char *[]){ "xo" }, 521 .parent_names = (const char *[]){ "xo" },
522 .num_parents = 1, 522 .num_parents = 1,
523 .name = vco_name, 523 .name = vco_name,
524 .flags = CLK_IGNORE_UNUSED,
524 .ops = &clk_ops_dsi_pll_28nm_vco, 525 .ops = &clk_ops_dsi_pll_28nm_vco,
525 }; 526 };
526 struct device *dev = &pll_28nm->pdev->dev; 527 struct device *dev = &pll_28nm->pdev->dev;
diff --git a/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c
index 38c90e1eb002..49008451085b 100644
--- a/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c
+++ b/drivers/gpu/drm/msm/dsi/pll/dsi_pll_28nm_8960.c
@@ -412,6 +412,7 @@ static int pll_28nm_register(struct dsi_pll_28nm *pll_28nm)
412 struct clk_init_data vco_init = { 412 struct clk_init_data vco_init = {
413 .parent_names = (const char *[]){ "pxo" }, 413 .parent_names = (const char *[]){ "pxo" },
414 .num_parents = 1, 414 .num_parents = 1,
415 .flags = CLK_IGNORE_UNUSED,
415 .ops = &clk_ops_dsi_pll_28nm_vco, 416 .ops = &clk_ops_dsi_pll_28nm_vco,
416 }; 417 };
417 struct device *dev = &pll_28nm->pdev->dev; 418 struct device *dev = &pll_28nm->pdev->dev;
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c b/drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c
index aa94a553794f..143eab46ba68 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_phy_8996.c
@@ -702,6 +702,7 @@ static struct clk_init_data pll_init = {
702 .ops = &hdmi_8996_pll_ops, 702 .ops = &hdmi_8996_pll_ops,
703 .parent_names = hdmi_pll_parents, 703 .parent_names = hdmi_pll_parents,
704 .num_parents = ARRAY_SIZE(hdmi_pll_parents), 704 .num_parents = ARRAY_SIZE(hdmi_pll_parents),
705 .flags = CLK_IGNORE_UNUSED,
705}; 706};
706 707
707int msm_hdmi_pll_8996_init(struct platform_device *pdev) 708int msm_hdmi_pll_8996_init(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c b/drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c
index 92da69aa6187..99590758c68b 100644
--- a/drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c
+++ b/drivers/gpu/drm/msm/hdmi/hdmi_pll_8960.c
@@ -424,6 +424,7 @@ static struct clk_init_data pll_init = {
424 .ops = &hdmi_pll_ops, 424 .ops = &hdmi_pll_ops,
425 .parent_names = hdmi_pll_parents, 425 .parent_names = hdmi_pll_parents,
426 .num_parents = ARRAY_SIZE(hdmi_pll_parents), 426 .num_parents = ARRAY_SIZE(hdmi_pll_parents),
427 .flags = CLK_IGNORE_UNUSED,
427}; 428};
428 429
429int msm_hdmi_pll_8960_init(struct platform_device *pdev) 430int msm_hdmi_pll_8960_init(struct platform_device *pdev)
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c
index ac9e4cde1380..8b4e3004f451 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_cfg.c
@@ -272,7 +272,7 @@ const struct mdp5_cfg_hw msm8x16_config = {
272 .count = 2, 272 .count = 2,
273 .base = { 0x14000, 0x16000 }, 273 .base = { 0x14000, 0x16000 },
274 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP | 274 .caps = MDP_PIPE_CAP_HFLIP | MDP_PIPE_CAP_VFLIP |
275 MDP_PIPE_CAP_SCALE | MDP_PIPE_CAP_DECIMATION, 275 MDP_PIPE_CAP_DECIMATION,
276 }, 276 },
277 .pipe_dma = { 277 .pipe_dma = {
278 .count = 1, 278 .count = 1,
@@ -282,7 +282,7 @@ const struct mdp5_cfg_hw msm8x16_config = {
282 .lm = { 282 .lm = {
283 .count = 2, /* LM0 and LM3 */ 283 .count = 2, /* LM0 and LM3 */
284 .base = { 0x44000, 0x47000 }, 284 .base = { 0x44000, 0x47000 },
285 .nb_stages = 5, 285 .nb_stages = 8,
286 .max_width = 2048, 286 .max_width = 2048,
287 .max_height = 0xFFFF, 287 .max_height = 0xFFFF,
288 }, 288 },
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
index fa2be7ce9468..c205c360e16d 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c
@@ -223,12 +223,7 @@ static void blend_setup(struct drm_crtc *crtc)
223 plane_cnt++; 223 plane_cnt++;
224 } 224 }
225 225
226 /* 226 if (!pstates[STAGE_BASE]) {
227 * If there is no base layer, enable border color.
228 * Although it's not possbile in current blend logic,
229 * put it here as a reminder.
230 */
231 if (!pstates[STAGE_BASE] && plane_cnt) {
232 ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT; 227 ctl_blend_flags |= MDP5_CTL_BLEND_OP_FLAG_BORDER_OUT;
233 DBG("Border Color is enabled"); 228 DBG("Border Color is enabled");
234 } 229 }
@@ -365,6 +360,15 @@ static int pstate_cmp(const void *a, const void *b)
365 return pa->state->zpos - pb->state->zpos; 360 return pa->state->zpos - pb->state->zpos;
366} 361}
367 362
363/* is there a helper for this? */
364static bool is_fullscreen(struct drm_crtc_state *cstate,
365 struct drm_plane_state *pstate)
366{
367 return (pstate->crtc_x <= 0) && (pstate->crtc_y <= 0) &&
368 ((pstate->crtc_x + pstate->crtc_w) >= cstate->mode.hdisplay) &&
369 ((pstate->crtc_y + pstate->crtc_h) >= cstate->mode.vdisplay);
370}
371
368static int mdp5_crtc_atomic_check(struct drm_crtc *crtc, 372static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
369 struct drm_crtc_state *state) 373 struct drm_crtc_state *state)
370{ 374{
@@ -375,21 +379,11 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
375 struct plane_state pstates[STAGE_MAX + 1]; 379 struct plane_state pstates[STAGE_MAX + 1];
376 const struct mdp5_cfg_hw *hw_cfg; 380 const struct mdp5_cfg_hw *hw_cfg;
377 const struct drm_plane_state *pstate; 381 const struct drm_plane_state *pstate;
378 int cnt = 0, i; 382 int cnt = 0, base = 0, i;
379 383
380 DBG("%s: check", mdp5_crtc->name); 384 DBG("%s: check", mdp5_crtc->name);
381 385
382 /* verify that there are not too many planes attached to crtc
383 * and that we don't have conflicting mixer stages:
384 */
385 hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
386 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) { 386 drm_atomic_crtc_state_for_each_plane_state(plane, pstate, state) {
387 if (cnt >= (hw_cfg->lm.nb_stages)) {
388 dev_err(dev->dev, "too many planes!\n");
389 return -EINVAL;
390 }
391
392
393 pstates[cnt].plane = plane; 387 pstates[cnt].plane = plane;
394 pstates[cnt].state = to_mdp5_plane_state(pstate); 388 pstates[cnt].state = to_mdp5_plane_state(pstate);
395 389
@@ -399,8 +393,24 @@ static int mdp5_crtc_atomic_check(struct drm_crtc *crtc,
399 /* assign a stage based on sorted zpos property */ 393 /* assign a stage based on sorted zpos property */
400 sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL); 394 sort(pstates, cnt, sizeof(pstates[0]), pstate_cmp, NULL);
401 395
396 /* if the bottom-most layer is not fullscreen, we need to use
397 * it for solid-color:
398 */
399 if ((cnt > 0) && !is_fullscreen(state, &pstates[0].state->base))
400 base++;
401
402 /* verify that there are not too many planes attached to crtc
403 * and that we don't have conflicting mixer stages:
404 */
405 hw_cfg = mdp5_cfg_get_hw_config(mdp5_kms->cfg);
406
407 if ((cnt + base) >= hw_cfg->lm.nb_stages) {
408 dev_err(dev->dev, "too many planes!\n");
409 return -EINVAL;
410 }
411
402 for (i = 0; i < cnt; i++) { 412 for (i = 0; i < cnt; i++) {
403 pstates[i].state->stage = STAGE_BASE + i; 413 pstates[i].state->stage = STAGE_BASE + i + base;
404 DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name, 414 DBG("%s: assign pipe %s on stage=%d", mdp5_crtc->name,
405 pipe2name(mdp5_plane_pipe(pstates[i].plane)), 415 pipe2name(mdp5_plane_pipe(pstates[i].plane)),
406 pstates[i].state->stage); 416 pstates[i].state->stage);
diff --git a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
index 951c002b05df..83bf997dda03 100644
--- a/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
+++ b/drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c
@@ -292,8 +292,7 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
292 format = to_mdp_format(msm_framebuffer_format(state->fb)); 292 format = to_mdp_format(msm_framebuffer_format(state->fb));
293 if (MDP_FORMAT_IS_YUV(format) && 293 if (MDP_FORMAT_IS_YUV(format) &&
294 !pipe_supports_yuv(mdp5_plane->caps)) { 294 !pipe_supports_yuv(mdp5_plane->caps)) {
295 dev_err(plane->dev->dev, 295 DBG("Pipe doesn't support YUV\n");
296 "Pipe doesn't support YUV\n");
297 296
298 return -EINVAL; 297 return -EINVAL;
299 } 298 }
@@ -301,8 +300,7 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
301 if (!(mdp5_plane->caps & MDP_PIPE_CAP_SCALE) && 300 if (!(mdp5_plane->caps & MDP_PIPE_CAP_SCALE) &&
302 (((state->src_w >> 16) != state->crtc_w) || 301 (((state->src_w >> 16) != state->crtc_w) ||
303 ((state->src_h >> 16) != state->crtc_h))) { 302 ((state->src_h >> 16) != state->crtc_h))) {
304 dev_err(plane->dev->dev, 303 DBG("Pipe doesn't support scaling (%dx%d -> %dx%d)\n",
305 "Pipe doesn't support scaling (%dx%d -> %dx%d)\n",
306 state->src_w >> 16, state->src_h >> 16, 304 state->src_w >> 16, state->src_h >> 16,
307 state->crtc_w, state->crtc_h); 305 state->crtc_w, state->crtc_h);
308 306
@@ -313,8 +311,7 @@ static int mdp5_plane_atomic_check(struct drm_plane *plane,
313 vflip = !!(state->rotation & DRM_REFLECT_Y); 311 vflip = !!(state->rotation & DRM_REFLECT_Y);
314 if ((vflip && !(mdp5_plane->caps & MDP_PIPE_CAP_VFLIP)) || 312 if ((vflip && !(mdp5_plane->caps & MDP_PIPE_CAP_VFLIP)) ||
315 (hflip && !(mdp5_plane->caps & MDP_PIPE_CAP_HFLIP))) { 313 (hflip && !(mdp5_plane->caps & MDP_PIPE_CAP_HFLIP))) {
316 dev_err(plane->dev->dev, 314 DBG("Pipe doesn't support flip\n");
317 "Pipe doesn't support flip\n");
318 315
319 return -EINVAL; 316 return -EINVAL;
320 } 317 }
diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c
index fb5c0b0a7594..46568fc80848 100644
--- a/drivers/gpu/drm/msm/msm_drv.c
+++ b/drivers/gpu/drm/msm/msm_drv.c
@@ -228,7 +228,7 @@ static int msm_drm_uninit(struct device *dev)
228 flush_workqueue(priv->atomic_wq); 228 flush_workqueue(priv->atomic_wq);
229 destroy_workqueue(priv->atomic_wq); 229 destroy_workqueue(priv->atomic_wq);
230 230
231 if (kms) 231 if (kms && kms->funcs)
232 kms->funcs->destroy(kms); 232 kms->funcs->destroy(kms);
233 233
234 if (gpu) { 234 if (gpu) {
diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/msm_gem_shrinker.c
index 283d2841ba58..192b2d3a79cb 100644
--- a/drivers/gpu/drm/msm/msm_gem_shrinker.c
+++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c
@@ -163,6 +163,9 @@ void msm_gem_shrinker_init(struct drm_device *dev)
163void msm_gem_shrinker_cleanup(struct drm_device *dev) 163void msm_gem_shrinker_cleanup(struct drm_device *dev)
164{ 164{
165 struct msm_drm_private *priv = dev->dev_private; 165 struct msm_drm_private *priv = dev->dev_private;
166 WARN_ON(unregister_vmap_purge_notifier(&priv->vmap_notifier)); 166
167 unregister_shrinker(&priv->shrinker); 167 if (priv->shrinker.nr_deferred) {
168 WARN_ON(unregister_vmap_purge_notifier(&priv->vmap_notifier));
169 unregister_shrinker(&priv->shrinker);
170 }
168} 171}
diff --git a/drivers/gpu/drm/radeon/radeon_atpx_handler.c b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
index 2fdcd04bc93f..0ae13cd2adda 100644
--- a/drivers/gpu/drm/radeon/radeon_atpx_handler.c
+++ b/drivers/gpu/drm/radeon/radeon_atpx_handler.c
@@ -34,6 +34,7 @@ struct radeon_atpx {
34 34
35static struct radeon_atpx_priv { 35static struct radeon_atpx_priv {
36 bool atpx_detected; 36 bool atpx_detected;
37 bool bridge_pm_usable;
37 /* handle for device - and atpx */ 38 /* handle for device - and atpx */
38 acpi_handle dhandle; 39 acpi_handle dhandle;
39 struct radeon_atpx atpx; 40 struct radeon_atpx atpx;
@@ -203,7 +204,11 @@ static int radeon_atpx_validate(struct radeon_atpx *atpx)
203 atpx->is_hybrid = false; 204 atpx->is_hybrid = false;
204 if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) { 205 if (valid_bits & ATPX_MS_HYBRID_GFX_SUPPORTED) {
205 printk("ATPX Hybrid Graphics\n"); 206 printk("ATPX Hybrid Graphics\n");
206 atpx->functions.power_cntl = false; 207 /*
208 * Disable legacy PM methods only when pcie port PM is usable,
209 * otherwise the device might fail to power off or power on.
210 */
211 atpx->functions.power_cntl = !radeon_atpx_priv.bridge_pm_usable;
207 atpx->is_hybrid = true; 212 atpx->is_hybrid = true;
208 } 213 }
209 214
@@ -548,11 +553,16 @@ static bool radeon_atpx_detect(void)
548 struct pci_dev *pdev = NULL; 553 struct pci_dev *pdev = NULL;
549 bool has_atpx = false; 554 bool has_atpx = false;
550 int vga_count = 0; 555 int vga_count = 0;
556 bool d3_supported = false;
557 struct pci_dev *parent_pdev;
551 558
552 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { 559 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) {
553 vga_count++; 560 vga_count++;
554 561
555 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); 562 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
563
564 parent_pdev = pci_upstream_bridge(pdev);
565 d3_supported |= parent_pdev && parent_pdev->bridge_d3;
556 } 566 }
557 567
558 /* some newer PX laptops mark the dGPU as a non-VGA display device */ 568 /* some newer PX laptops mark the dGPU as a non-VGA display device */
@@ -560,6 +570,9 @@ static bool radeon_atpx_detect(void)
560 vga_count++; 570 vga_count++;
561 571
562 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true); 572 has_atpx |= (radeon_atpx_pci_probe_handle(pdev) == true);
573
574 parent_pdev = pci_upstream_bridge(pdev);
575 d3_supported |= parent_pdev && parent_pdev->bridge_d3;
563 } 576 }
564 577
565 if (has_atpx && vga_count == 2) { 578 if (has_atpx && vga_count == 2) {
@@ -567,6 +580,7 @@ static bool radeon_atpx_detect(void)
567 printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n", 580 printk(KERN_INFO "vga_switcheroo: detected switching method %s handle\n",
568 acpi_method_name); 581 acpi_method_name);
569 radeon_atpx_priv.atpx_detected = true; 582 radeon_atpx_priv.atpx_detected = true;
583 radeon_atpx_priv.bridge_pm_usable = d3_supported;
570 radeon_atpx_init(); 584 radeon_atpx_init();
571 return true; 585 return true;
572 } 586 }
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c
index e18839d52e3e..27affbde058c 100644
--- a/drivers/gpu/drm/radeon/radeon_connectors.c
+++ b/drivers/gpu/drm/radeon/radeon_connectors.c
@@ -931,7 +931,7 @@ static void radeon_connector_unregister(struct drm_connector *connector)
931{ 931{
932 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 932 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
933 933
934 if (radeon_connector->ddc_bus->has_aux) { 934 if (radeon_connector->ddc_bus && radeon_connector->ddc_bus->has_aux) {
935 drm_dp_aux_unregister(&radeon_connector->ddc_bus->aux); 935 drm_dp_aux_unregister(&radeon_connector->ddc_bus->aux);
936 radeon_connector->ddc_bus->has_aux = false; 936 radeon_connector->ddc_bus->has_aux = false;
937 } 937 }
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index eb92aef46e3c..621af069a3d2 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -104,6 +104,14 @@ static const char radeon_family_name[][16] = {
104 "LAST", 104 "LAST",
105}; 105};
106 106
107#if defined(CONFIG_VGA_SWITCHEROO)
108bool radeon_has_atpx_dgpu_power_cntl(void);
109bool radeon_is_atpx_hybrid(void);
110#else
111static inline bool radeon_has_atpx_dgpu_power_cntl(void) { return false; }
112static inline bool radeon_is_atpx_hybrid(void) { return false; }
113#endif
114
107#define RADEON_PX_QUIRK_DISABLE_PX (1 << 0) 115#define RADEON_PX_QUIRK_DISABLE_PX (1 << 0)
108#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1) 116#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
109 117
@@ -160,6 +168,11 @@ static void radeon_device_handle_px_quirks(struct radeon_device *rdev)
160 168
161 if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX) 169 if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX)
162 rdev->flags &= ~RADEON_IS_PX; 170 rdev->flags &= ~RADEON_IS_PX;
171
172 /* disable PX is the system doesn't support dGPU power control or hybrid gfx */
173 if (!radeon_is_atpx_hybrid() &&
174 !radeon_has_atpx_dgpu_power_cntl())
175 rdev->flags &= ~RADEON_IS_PX;
163} 176}
164 177
165/** 178/**
diff --git a/drivers/gpu/drm/sun4i/sun4i_drv.c b/drivers/gpu/drm/sun4i/sun4i_drv.c
index 0da9862ad8ed..70e9fd59c5a2 100644
--- a/drivers/gpu/drm/sun4i/sun4i_drv.c
+++ b/drivers/gpu/drm/sun4i/sun4i_drv.c
@@ -142,9 +142,9 @@ static int sun4i_drv_bind(struct device *dev)
142 142
143 /* Create our layers */ 143 /* Create our layers */
144 drv->layers = sun4i_layers_init(drm); 144 drv->layers = sun4i_layers_init(drm);
145 if (!drv->layers) { 145 if (IS_ERR(drv->layers)) {
146 dev_err(drm->dev, "Couldn't create the planes\n"); 146 dev_err(drm->dev, "Couldn't create the planes\n");
147 ret = -EINVAL; 147 ret = PTR_ERR(drv->layers);
148 goto free_drm; 148 goto free_drm;
149 } 149 }
150 150
diff --git a/drivers/gpu/drm/sun4i/sun4i_rgb.c b/drivers/gpu/drm/sun4i/sun4i_rgb.c
index c3ff10f559cc..d198ad7e5323 100644
--- a/drivers/gpu/drm/sun4i/sun4i_rgb.c
+++ b/drivers/gpu/drm/sun4i/sun4i_rgb.c
@@ -152,15 +152,13 @@ static void sun4i_rgb_encoder_enable(struct drm_encoder *encoder)
152 152
153 DRM_DEBUG_DRIVER("Enabling RGB output\n"); 153 DRM_DEBUG_DRIVER("Enabling RGB output\n");
154 154
155 if (!IS_ERR(tcon->panel)) { 155 if (!IS_ERR(tcon->panel))
156 drm_panel_prepare(tcon->panel); 156 drm_panel_prepare(tcon->panel);
157 drm_panel_enable(tcon->panel);
158 }
159
160 /* encoder->bridge can be NULL; drm_bridge_enable checks for it */
161 drm_bridge_enable(encoder->bridge);
162 157
163 sun4i_tcon_channel_enable(tcon, 0); 158 sun4i_tcon_channel_enable(tcon, 0);
159
160 if (!IS_ERR(tcon->panel))
161 drm_panel_enable(tcon->panel);
164} 162}
165 163
166static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder) 164static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
@@ -171,15 +169,13 @@ static void sun4i_rgb_encoder_disable(struct drm_encoder *encoder)
171 169
172 DRM_DEBUG_DRIVER("Disabling RGB output\n"); 170 DRM_DEBUG_DRIVER("Disabling RGB output\n");
173 171
174 sun4i_tcon_channel_disable(tcon, 0); 172 if (!IS_ERR(tcon->panel))
173 drm_panel_disable(tcon->panel);
175 174
176 /* encoder->bridge can be NULL; drm_bridge_disable checks for it */ 175 sun4i_tcon_channel_disable(tcon, 0);
177 drm_bridge_disable(encoder->bridge);
178 176
179 if (!IS_ERR(tcon->panel)) { 177 if (!IS_ERR(tcon->panel))
180 drm_panel_disable(tcon->panel);
181 drm_panel_unprepare(tcon->panel); 178 drm_panel_unprepare(tcon->panel);
182 }
183} 179}
184 180
185static void sun4i_rgb_encoder_mode_set(struct drm_encoder *encoder, 181static void sun4i_rgb_encoder_mode_set(struct drm_encoder *encoder,
diff --git a/drivers/gpu/drm/udl/udl_main.c b/drivers/gpu/drm/udl/udl_main.c
index 29f0207fa677..873f010d9616 100644
--- a/drivers/gpu/drm/udl/udl_main.c
+++ b/drivers/gpu/drm/udl/udl_main.c
@@ -98,17 +98,23 @@ success:
98static int udl_select_std_channel(struct udl_device *udl) 98static int udl_select_std_channel(struct udl_device *udl)
99{ 99{
100 int ret; 100 int ret;
101 u8 set_def_chn[] = {0x57, 0xCD, 0xDC, 0xA7, 101 static const u8 set_def_chn[] = {0x57, 0xCD, 0xDC, 0xA7,
102 0x1C, 0x88, 0x5E, 0x15, 102 0x1C, 0x88, 0x5E, 0x15,
103 0x60, 0xFE, 0xC6, 0x97, 103 0x60, 0xFE, 0xC6, 0x97,
104 0x16, 0x3D, 0x47, 0xF2}; 104 0x16, 0x3D, 0x47, 0xF2};
105 void *sendbuf;
106
107 sendbuf = kmemdup(set_def_chn, sizeof(set_def_chn), GFP_KERNEL);
108 if (!sendbuf)
109 return -ENOMEM;
105 110
106 ret = usb_control_msg(udl->udev, 111 ret = usb_control_msg(udl->udev,
107 usb_sndctrlpipe(udl->udev, 0), 112 usb_sndctrlpipe(udl->udev, 0),
108 NR_USB_REQUEST_CHANNEL, 113 NR_USB_REQUEST_CHANNEL,
109 (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0, 114 (USB_DIR_OUT | USB_TYPE_VENDOR), 0, 0,
110 set_def_chn, sizeof(set_def_chn), 115 sendbuf, sizeof(set_def_chn),
111 USB_CTRL_SET_TIMEOUT); 116 USB_CTRL_SET_TIMEOUT);
117 kfree(sendbuf);
112 return ret < 0 ? ret : 0; 118 return ret < 0 ? ret : 0;
113} 119}
114 120
diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
index 086d8a507157..60d30203a5fa 100644
--- a/drivers/hid/hid-cp2112.c
+++ b/drivers/hid/hid-cp2112.c
@@ -32,6 +32,11 @@
32#include <linux/usb/ch9.h> 32#include <linux/usb/ch9.h>
33#include "hid-ids.h" 33#include "hid-ids.h"
34 34
35#define CP2112_REPORT_MAX_LENGTH 64
36#define CP2112_GPIO_CONFIG_LENGTH 5
37#define CP2112_GPIO_GET_LENGTH 2
38#define CP2112_GPIO_SET_LENGTH 3
39
35enum { 40enum {
36 CP2112_GPIO_CONFIG = 0x02, 41 CP2112_GPIO_CONFIG = 0x02,
37 CP2112_GPIO_GET = 0x03, 42 CP2112_GPIO_GET = 0x03,
@@ -161,6 +166,8 @@ struct cp2112_device {
161 atomic_t read_avail; 166 atomic_t read_avail;
162 atomic_t xfer_avail; 167 atomic_t xfer_avail;
163 struct gpio_chip gc; 168 struct gpio_chip gc;
169 u8 *in_out_buffer;
170 spinlock_t lock;
164}; 171};
165 172
166static int gpio_push_pull = 0xFF; 173static int gpio_push_pull = 0xFF;
@@ -171,62 +178,86 @@ static int cp2112_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
171{ 178{
172 struct cp2112_device *dev = gpiochip_get_data(chip); 179 struct cp2112_device *dev = gpiochip_get_data(chip);
173 struct hid_device *hdev = dev->hdev; 180 struct hid_device *hdev = dev->hdev;
174 u8 buf[5]; 181 u8 *buf = dev->in_out_buffer;
182 unsigned long flags;
175 int ret; 183 int ret;
176 184
185 spin_lock_irqsave(&dev->lock, flags);
186
177 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, 187 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
178 sizeof(buf), HID_FEATURE_REPORT, 188 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
179 HID_REQ_GET_REPORT); 189 HID_REQ_GET_REPORT);
180 if (ret != sizeof(buf)) { 190 if (ret != CP2112_GPIO_CONFIG_LENGTH) {
181 hid_err(hdev, "error requesting GPIO config: %d\n", ret); 191 hid_err(hdev, "error requesting GPIO config: %d\n", ret);
182 return ret; 192 goto exit;
183 } 193 }
184 194
185 buf[1] &= ~(1 << offset); 195 buf[1] &= ~(1 << offset);
186 buf[2] = gpio_push_pull; 196 buf[2] = gpio_push_pull;
187 197
188 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, sizeof(buf), 198 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
189 HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 199 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
200 HID_REQ_SET_REPORT);
190 if (ret < 0) { 201 if (ret < 0) {
191 hid_err(hdev, "error setting GPIO config: %d\n", ret); 202 hid_err(hdev, "error setting GPIO config: %d\n", ret);
192 return ret; 203 goto exit;
193 } 204 }
194 205
195 return 0; 206 ret = 0;
207
208exit:
209 spin_unlock_irqrestore(&dev->lock, flags);
210 return ret <= 0 ? ret : -EIO;
196} 211}
197 212
198static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value) 213static void cp2112_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
199{ 214{
200 struct cp2112_device *dev = gpiochip_get_data(chip); 215 struct cp2112_device *dev = gpiochip_get_data(chip);
201 struct hid_device *hdev = dev->hdev; 216 struct hid_device *hdev = dev->hdev;
202 u8 buf[3]; 217 u8 *buf = dev->in_out_buffer;
218 unsigned long flags;
203 int ret; 219 int ret;
204 220
221 spin_lock_irqsave(&dev->lock, flags);
222
205 buf[0] = CP2112_GPIO_SET; 223 buf[0] = CP2112_GPIO_SET;
206 buf[1] = value ? 0xff : 0; 224 buf[1] = value ? 0xff : 0;
207 buf[2] = 1 << offset; 225 buf[2] = 1 << offset;
208 226
209 ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf, sizeof(buf), 227 ret = hid_hw_raw_request(hdev, CP2112_GPIO_SET, buf,
210 HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 228 CP2112_GPIO_SET_LENGTH, HID_FEATURE_REPORT,
229 HID_REQ_SET_REPORT);
211 if (ret < 0) 230 if (ret < 0)
212 hid_err(hdev, "error setting GPIO values: %d\n", ret); 231 hid_err(hdev, "error setting GPIO values: %d\n", ret);
232
233 spin_unlock_irqrestore(&dev->lock, flags);
213} 234}
214 235
215static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset) 236static int cp2112_gpio_get(struct gpio_chip *chip, unsigned offset)
216{ 237{
217 struct cp2112_device *dev = gpiochip_get_data(chip); 238 struct cp2112_device *dev = gpiochip_get_data(chip);
218 struct hid_device *hdev = dev->hdev; 239 struct hid_device *hdev = dev->hdev;
219 u8 buf[2]; 240 u8 *buf = dev->in_out_buffer;
241 unsigned long flags;
220 int ret; 242 int ret;
221 243
222 ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf, sizeof(buf), 244 spin_lock_irqsave(&dev->lock, flags);
223 HID_FEATURE_REPORT, HID_REQ_GET_REPORT); 245
224 if (ret != sizeof(buf)) { 246 ret = hid_hw_raw_request(hdev, CP2112_GPIO_GET, buf,
247 CP2112_GPIO_GET_LENGTH, HID_FEATURE_REPORT,
248 HID_REQ_GET_REPORT);
249 if (ret != CP2112_GPIO_GET_LENGTH) {
225 hid_err(hdev, "error requesting GPIO values: %d\n", ret); 250 hid_err(hdev, "error requesting GPIO values: %d\n", ret);
226 return ret; 251 ret = ret < 0 ? ret : -EIO;
252 goto exit;
227 } 253 }
228 254
229 return (buf[1] >> offset) & 1; 255 ret = (buf[1] >> offset) & 1;
256
257exit:
258 spin_unlock_irqrestore(&dev->lock, flags);
259
260 return ret;
230} 261}
231 262
232static int cp2112_gpio_direction_output(struct gpio_chip *chip, 263static int cp2112_gpio_direction_output(struct gpio_chip *chip,
@@ -234,27 +265,33 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
234{ 265{
235 struct cp2112_device *dev = gpiochip_get_data(chip); 266 struct cp2112_device *dev = gpiochip_get_data(chip);
236 struct hid_device *hdev = dev->hdev; 267 struct hid_device *hdev = dev->hdev;
237 u8 buf[5]; 268 u8 *buf = dev->in_out_buffer;
269 unsigned long flags;
238 int ret; 270 int ret;
239 271
272 spin_lock_irqsave(&dev->lock, flags);
273
240 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, 274 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
241 sizeof(buf), HID_FEATURE_REPORT, 275 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
242 HID_REQ_GET_REPORT); 276 HID_REQ_GET_REPORT);
243 if (ret != sizeof(buf)) { 277 if (ret != CP2112_GPIO_CONFIG_LENGTH) {
244 hid_err(hdev, "error requesting GPIO config: %d\n", ret); 278 hid_err(hdev, "error requesting GPIO config: %d\n", ret);
245 return ret; 279 goto fail;
246 } 280 }
247 281
248 buf[1] |= 1 << offset; 282 buf[1] |= 1 << offset;
249 buf[2] = gpio_push_pull; 283 buf[2] = gpio_push_pull;
250 284
251 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf, sizeof(buf), 285 ret = hid_hw_raw_request(hdev, CP2112_GPIO_CONFIG, buf,
252 HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 286 CP2112_GPIO_CONFIG_LENGTH, HID_FEATURE_REPORT,
287 HID_REQ_SET_REPORT);
253 if (ret < 0) { 288 if (ret < 0) {
254 hid_err(hdev, "error setting GPIO config: %d\n", ret); 289 hid_err(hdev, "error setting GPIO config: %d\n", ret);
255 return ret; 290 goto fail;
256 } 291 }
257 292
293 spin_unlock_irqrestore(&dev->lock, flags);
294
258 /* 295 /*
259 * Set gpio value when output direction is already set, 296 * Set gpio value when output direction is already set,
260 * as specified in AN495, Rev. 0.2, cpt. 4.4 297 * as specified in AN495, Rev. 0.2, cpt. 4.4
@@ -262,6 +299,10 @@ static int cp2112_gpio_direction_output(struct gpio_chip *chip,
262 cp2112_gpio_set(chip, offset, value); 299 cp2112_gpio_set(chip, offset, value);
263 300
264 return 0; 301 return 0;
302
303fail:
304 spin_unlock_irqrestore(&dev->lock, flags);
305 return ret < 0 ? ret : -EIO;
265} 306}
266 307
267static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number, 308static int cp2112_hid_get(struct hid_device *hdev, unsigned char report_number,
@@ -1007,6 +1048,17 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
1007 struct cp2112_smbus_config_report config; 1048 struct cp2112_smbus_config_report config;
1008 int ret; 1049 int ret;
1009 1050
1051 dev = devm_kzalloc(&hdev->dev, sizeof(*dev), GFP_KERNEL);
1052 if (!dev)
1053 return -ENOMEM;
1054
1055 dev->in_out_buffer = devm_kzalloc(&hdev->dev, CP2112_REPORT_MAX_LENGTH,
1056 GFP_KERNEL);
1057 if (!dev->in_out_buffer)
1058 return -ENOMEM;
1059
1060 spin_lock_init(&dev->lock);
1061
1010 ret = hid_parse(hdev); 1062 ret = hid_parse(hdev);
1011 if (ret) { 1063 if (ret) {
1012 hid_err(hdev, "parse failed\n"); 1064 hid_err(hdev, "parse failed\n");
@@ -1063,12 +1115,6 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
1063 goto err_power_normal; 1115 goto err_power_normal;
1064 } 1116 }
1065 1117
1066 dev = kzalloc(sizeof(*dev), GFP_KERNEL);
1067 if (!dev) {
1068 ret = -ENOMEM;
1069 goto err_power_normal;
1070 }
1071
1072 hid_set_drvdata(hdev, (void *)dev); 1118 hid_set_drvdata(hdev, (void *)dev);
1073 dev->hdev = hdev; 1119 dev->hdev = hdev;
1074 dev->adap.owner = THIS_MODULE; 1120 dev->adap.owner = THIS_MODULE;
@@ -1087,7 +1133,7 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
1087 1133
1088 if (ret) { 1134 if (ret) {
1089 hid_err(hdev, "error registering i2c adapter\n"); 1135 hid_err(hdev, "error registering i2c adapter\n");
1090 goto err_free_dev; 1136 goto err_power_normal;
1091 } 1137 }
1092 1138
1093 hid_dbg(hdev, "adapter registered\n"); 1139 hid_dbg(hdev, "adapter registered\n");
@@ -1123,8 +1169,6 @@ err_gpiochip_remove:
1123 gpiochip_remove(&dev->gc); 1169 gpiochip_remove(&dev->gc);
1124err_free_i2c: 1170err_free_i2c:
1125 i2c_del_adapter(&dev->adap); 1171 i2c_del_adapter(&dev->adap);
1126err_free_dev:
1127 kfree(dev);
1128err_power_normal: 1172err_power_normal:
1129 hid_hw_power(hdev, PM_HINT_NORMAL); 1173 hid_hw_power(hdev, PM_HINT_NORMAL);
1130err_hid_close: 1174err_hid_close:
@@ -1149,7 +1193,6 @@ static void cp2112_remove(struct hid_device *hdev)
1149 */ 1193 */
1150 hid_hw_close(hdev); 1194 hid_hw_close(hdev);
1151 hid_hw_stop(hdev); 1195 hid_hw_stop(hdev);
1152 kfree(dev);
1153} 1196}
1154 1197
1155static int cp2112_raw_event(struct hid_device *hdev, struct hid_report *report, 1198static int cp2112_raw_event(struct hid_device *hdev, struct hid_report *report,
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
index 6cfb5cacc253..575aa65436d1 100644
--- a/drivers/hid/hid-ids.h
+++ b/drivers/hid/hid-ids.h
@@ -179,6 +179,7 @@
179#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205 179#define USB_DEVICE_ID_ATEN_4PORTKVM 0x2205
180#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208 180#define USB_DEVICE_ID_ATEN_4PORTKVMC 0x2208
181#define USB_DEVICE_ID_ATEN_CS682 0x2213 181#define USB_DEVICE_ID_ATEN_CS682 0x2213
182#define USB_DEVICE_ID_ATEN_CS692 0x8021
182 183
183#define USB_VENDOR_ID_ATMEL 0x03eb 184#define USB_VENDOR_ID_ATMEL 0x03eb
184#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c 185#define USB_DEVICE_ID_ATMEL_MULTITOUCH 0x211c
diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
index 76f644deb0a7..c5c5fbe9d605 100644
--- a/drivers/hid/hid-lg.c
+++ b/drivers/hid/hid-lg.c
@@ -756,11 +756,16 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
756 756
757 /* Setup wireless link with Logitech Wii wheel */ 757 /* Setup wireless link with Logitech Wii wheel */
758 if (hdev->product == USB_DEVICE_ID_LOGITECH_WII_WHEEL) { 758 if (hdev->product == USB_DEVICE_ID_LOGITECH_WII_WHEEL) {
759 unsigned char buf[] = { 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; 759 const unsigned char cbuf[] = { 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
760 u8 *buf = kmemdup(cbuf, sizeof(cbuf), GFP_KERNEL);
760 761
761 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf), 762 if (!buf) {
762 HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 763 ret = -ENOMEM;
764 goto err_free;
765 }
763 766
767 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf),
768 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
764 if (ret >= 0) { 769 if (ret >= 0) {
765 /* insert a little delay of 10 jiffies ~ 40ms */ 770 /* insert a little delay of 10 jiffies ~ 40ms */
766 wait_queue_head_t wait; 771 wait_queue_head_t wait;
@@ -772,9 +777,10 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
772 buf[1] = 0xB2; 777 buf[1] = 0xB2;
773 get_random_bytes(&buf[2], 2); 778 get_random_bytes(&buf[2], 2);
774 779
775 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(buf), 780 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(cbuf),
776 HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 781 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
777 } 782 }
783 kfree(buf);
778 } 784 }
779 785
780 if (drv_data->quirks & LG_FF) 786 if (drv_data->quirks & LG_FF)
diff --git a/drivers/hid/hid-magicmouse.c b/drivers/hid/hid-magicmouse.c
index d6fa496d0ca2..20b40ad26325 100644
--- a/drivers/hid/hid-magicmouse.c
+++ b/drivers/hid/hid-magicmouse.c
@@ -493,7 +493,8 @@ static int magicmouse_input_configured(struct hid_device *hdev,
493static int magicmouse_probe(struct hid_device *hdev, 493static int magicmouse_probe(struct hid_device *hdev,
494 const struct hid_device_id *id) 494 const struct hid_device_id *id)
495{ 495{
496 __u8 feature[] = { 0xd7, 0x01 }; 496 const u8 feature[] = { 0xd7, 0x01 };
497 u8 *buf;
497 struct magicmouse_sc *msc; 498 struct magicmouse_sc *msc;
498 struct hid_report *report; 499 struct hid_report *report;
499 int ret; 500 int ret;
@@ -544,6 +545,12 @@ static int magicmouse_probe(struct hid_device *hdev,
544 } 545 }
545 report->size = 6; 546 report->size = 6;
546 547
548 buf = kmemdup(feature, sizeof(feature), GFP_KERNEL);
549 if (!buf) {
550 ret = -ENOMEM;
551 goto err_stop_hw;
552 }
553
547 /* 554 /*
548 * Some devices repond with 'invalid report id' when feature 555 * Some devices repond with 'invalid report id' when feature
549 * report switching it into multitouch mode is sent to it. 556 * report switching it into multitouch mode is sent to it.
@@ -552,8 +559,9 @@ static int magicmouse_probe(struct hid_device *hdev,
552 * but there seems to be no other way of switching the mode. 559 * but there seems to be no other way of switching the mode.
553 * Thus the super-ugly hacky success check below. 560 * Thus the super-ugly hacky success check below.
554 */ 561 */
555 ret = hid_hw_raw_request(hdev, feature[0], feature, sizeof(feature), 562 ret = hid_hw_raw_request(hdev, buf[0], buf, sizeof(feature),
556 HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 563 HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
564 kfree(buf);
557 if (ret != -EIO && ret != sizeof(feature)) { 565 if (ret != -EIO && ret != sizeof(feature)) {
558 hid_err(hdev, "unable to request touch data (%d)\n", ret); 566 hid_err(hdev, "unable to request touch data (%d)\n", ret);
559 goto err_stop_hw; 567 goto err_stop_hw;
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
index 9cd2ca34a6be..be89bcbf6a71 100644
--- a/drivers/hid/hid-rmi.c
+++ b/drivers/hid/hid-rmi.c
@@ -188,10 +188,16 @@ static int rmi_set_page(struct hid_device *hdev, u8 page)
188static int rmi_set_mode(struct hid_device *hdev, u8 mode) 188static int rmi_set_mode(struct hid_device *hdev, u8 mode)
189{ 189{
190 int ret; 190 int ret;
191 u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode}; 191 const u8 txbuf[2] = {RMI_SET_RMI_MODE_REPORT_ID, mode};
192 u8 *buf;
192 193
193 ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, txbuf, 194 buf = kmemdup(txbuf, sizeof(txbuf), GFP_KERNEL);
195 if (!buf)
196 return -ENOMEM;
197
198 ret = hid_hw_raw_request(hdev, RMI_SET_RMI_MODE_REPORT_ID, buf,
194 sizeof(txbuf), HID_FEATURE_REPORT, HID_REQ_SET_REPORT); 199 sizeof(txbuf), HID_FEATURE_REPORT, HID_REQ_SET_REPORT);
200 kfree(buf);
195 if (ret < 0) { 201 if (ret < 0) {
196 dev_err(&hdev->dev, "unable to set rmi mode to %d (%d)\n", mode, 202 dev_err(&hdev->dev, "unable to set rmi mode to %d (%d)\n", mode,
197 ret); 203 ret);
diff --git a/drivers/hid/hid-sensor-custom.c b/drivers/hid/hid-sensor-custom.c
index 5614fee82347..3a84aaf1418b 100644
--- a/drivers/hid/hid-sensor-custom.c
+++ b/drivers/hid/hid-sensor-custom.c
@@ -292,11 +292,11 @@ static ssize_t show_value(struct device *dev, struct device_attribute *attr,
292 bool input = false; 292 bool input = false;
293 int value = 0; 293 int value = 0;
294 294
295 if (sscanf(attr->attr.name, "feature-%d-%x-%s", &index, &usage, 295 if (sscanf(attr->attr.name, "feature-%x-%x-%s", &index, &usage,
296 name) == 3) { 296 name) == 3) {
297 feature = true; 297 feature = true;
298 field_index = index + sensor_inst->input_field_count; 298 field_index = index + sensor_inst->input_field_count;
299 } else if (sscanf(attr->attr.name, "input-%d-%x-%s", &index, &usage, 299 } else if (sscanf(attr->attr.name, "input-%x-%x-%s", &index, &usage,
300 name) == 3) { 300 name) == 3) {
301 input = true; 301 input = true;
302 field_index = index; 302 field_index = index;
@@ -398,7 +398,7 @@ static ssize_t store_value(struct device *dev, struct device_attribute *attr,
398 char name[HID_CUSTOM_NAME_LENGTH]; 398 char name[HID_CUSTOM_NAME_LENGTH];
399 int value; 399 int value;
400 400
401 if (sscanf(attr->attr.name, "feature-%d-%x-%s", &index, &usage, 401 if (sscanf(attr->attr.name, "feature-%x-%x-%s", &index, &usage,
402 name) == 3) { 402 name) == 3) {
403 field_index = index + sensor_inst->input_field_count; 403 field_index = index + sensor_inst->input_field_count;
404 } else 404 } else
diff --git a/drivers/hid/hid-sensor-hub.c b/drivers/hid/hid-sensor-hub.c
index 658a607dc6d9..60875625cbdf 100644
--- a/drivers/hid/hid-sensor-hub.c
+++ b/drivers/hid/hid-sensor-hub.c
@@ -212,6 +212,7 @@ int sensor_hub_set_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
212 __s32 value; 212 __s32 value;
213 int ret = 0; 213 int ret = 0;
214 214
215 memset(buffer, 0, buffer_size);
215 mutex_lock(&data->mutex); 216 mutex_lock(&data->mutex);
216 report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); 217 report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
217 if (!report || (field_index >= report->maxfield)) { 218 if (!report || (field_index >= report->maxfield)) {
@@ -251,6 +252,9 @@ int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
251 struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev); 252 struct sensor_hub_data *data = hid_get_drvdata(hsdev->hdev);
252 int report_size; 253 int report_size;
253 int ret = 0; 254 int ret = 0;
255 u8 *val_ptr;
256 int buffer_index = 0;
257 int i;
254 258
255 mutex_lock(&data->mutex); 259 mutex_lock(&data->mutex);
256 report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT); 260 report = sensor_hub_report(report_id, hsdev->hdev, HID_FEATURE_REPORT);
@@ -271,7 +275,17 @@ int sensor_hub_get_feature(struct hid_sensor_hub_device *hsdev, u32 report_id,
271 goto done_proc; 275 goto done_proc;
272 } 276 }
273 ret = min(report_size, buffer_size); 277 ret = min(report_size, buffer_size);
274 memcpy(buffer, report->field[field_index]->value, ret); 278
279 val_ptr = (u8 *)report->field[field_index]->value;
280 for (i = 0; i < report->field[field_index]->report_count; ++i) {
281 if (buffer_index >= ret)
282 break;
283
284 memcpy(&((u8 *)buffer)[buffer_index], val_ptr,
285 report->field[field_index]->report_size / 8);
286 val_ptr += sizeof(__s32);
287 buffer_index += (report->field[field_index]->report_size / 8);
288 }
275 289
276done_proc: 290done_proc:
277 mutex_unlock(&data->mutex); 291 mutex_unlock(&data->mutex);
diff --git a/drivers/hid/intel-ish-hid/ipc/ipc.c b/drivers/hid/intel-ish-hid/ipc/ipc.c
index e2517c11e0ee..0c9ac4d5d850 100644
--- a/drivers/hid/intel-ish-hid/ipc/ipc.c
+++ b/drivers/hid/intel-ish-hid/ipc/ipc.c
@@ -638,6 +638,58 @@ eoi:
638} 638}
639 639
640/** 640/**
641 * ish_disable_dma() - disable dma communication between host and ISHFW
642 * @dev: ishtp device pointer
643 *
644 * Clear the dma enable bit and wait for dma inactive.
645 *
646 * Return: 0 for success else error code.
647 */
648static int ish_disable_dma(struct ishtp_device *dev)
649{
650 unsigned int dma_delay;
651
652 /* Clear the dma enable bit */
653 ish_reg_write(dev, IPC_REG_ISH_RMP2, 0);
654
655 /* wait for dma inactive */
656 for (dma_delay = 0; dma_delay < MAX_DMA_DELAY &&
657 _ish_read_fw_sts_reg(dev) & (IPC_ISH_IN_DMA);
658 dma_delay += 5)
659 mdelay(5);
660
661 if (dma_delay >= MAX_DMA_DELAY) {
662 dev_err(dev->devc,
663 "Wait for DMA inactive timeout\n");
664 return -EBUSY;
665 }
666
667 return 0;
668}
669
670/**
671 * ish_wakeup() - wakeup ishfw from waiting-for-host state
672 * @dev: ishtp device pointer
673 *
674 * Set the dma enable bit and send a void message to FW,
675 * it wil wakeup FW from waiting-for-host state.
676 */
677static void ish_wakeup(struct ishtp_device *dev)
678{
679 /* Set dma enable bit */
680 ish_reg_write(dev, IPC_REG_ISH_RMP2, IPC_RMP2_DMA_ENABLED);
681
682 /*
683 * Send 0 IPC message so that ISH FW wakes up if it was already
684 * asleep.
685 */
686 ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, IPC_DRBL_BUSY_BIT);
687
688 /* Flush writes to doorbell and REMAP2 */
689 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
690}
691
692/**
641 * _ish_hw_reset() - HW reset 693 * _ish_hw_reset() - HW reset
642 * @dev: ishtp device pointer 694 * @dev: ishtp device pointer
643 * 695 *
@@ -649,7 +701,6 @@ static int _ish_hw_reset(struct ishtp_device *dev)
649{ 701{
650 struct pci_dev *pdev = dev->pdev; 702 struct pci_dev *pdev = dev->pdev;
651 int rv; 703 int rv;
652 unsigned int dma_delay;
653 uint16_t csr; 704 uint16_t csr;
654 705
655 if (!pdev) 706 if (!pdev)
@@ -664,15 +715,8 @@ static int _ish_hw_reset(struct ishtp_device *dev)
664 return -EINVAL; 715 return -EINVAL;
665 } 716 }
666 717
667 /* Now trigger reset to FW */ 718 /* Disable dma communication between FW and host */
668 ish_reg_write(dev, IPC_REG_ISH_RMP2, 0); 719 if (ish_disable_dma(dev)) {
669
670 for (dma_delay = 0; dma_delay < MAX_DMA_DELAY &&
671 _ish_read_fw_sts_reg(dev) & (IPC_ISH_IN_DMA);
672 dma_delay += 5)
673 mdelay(5);
674
675 if (dma_delay >= MAX_DMA_DELAY) {
676 dev_err(&pdev->dev, 720 dev_err(&pdev->dev,
677 "Can't reset - stuck with DMA in-progress\n"); 721 "Can't reset - stuck with DMA in-progress\n");
678 return -EBUSY; 722 return -EBUSY;
@@ -690,16 +734,8 @@ static int _ish_hw_reset(struct ishtp_device *dev)
690 csr |= PCI_D0; 734 csr |= PCI_D0;
691 pci_write_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, csr); 735 pci_write_config_word(pdev, pdev->pm_cap + PCI_PM_CTRL, csr);
692 736
693 ish_reg_write(dev, IPC_REG_ISH_RMP2, IPC_RMP2_DMA_ENABLED); 737 /* Now we can enable ISH DMA operation and wakeup ISHFW */
694 738 ish_wakeup(dev);
695 /*
696 * Send 0 IPC message so that ISH FW wakes up if it was already
697 * asleep
698 */
699 ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, IPC_DRBL_BUSY_BIT);
700
701 /* Flush writes to doorbell and REMAP2 */
702 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
703 739
704 return 0; 740 return 0;
705} 741}
@@ -758,16 +794,9 @@ static int _ish_ipc_reset(struct ishtp_device *dev)
758int ish_hw_start(struct ishtp_device *dev) 794int ish_hw_start(struct ishtp_device *dev)
759{ 795{
760 ish_set_host_rdy(dev); 796 ish_set_host_rdy(dev);
761 /* After that we can enable ISH DMA operation */
762 ish_reg_write(dev, IPC_REG_ISH_RMP2, IPC_RMP2_DMA_ENABLED);
763 797
764 /* 798 /* After that we can enable ISH DMA operation and wakeup ISHFW */
765 * Send 0 IPC message so that ISH FW wakes up if it was already 799 ish_wakeup(dev);
766 * asleep
767 */
768 ish_reg_write(dev, IPC_REG_HOST2ISH_DRBL, IPC_DRBL_BUSY_BIT);
769 /* Flush write to doorbell */
770 ish_reg_read(dev, IPC_REG_ISH_HOST_FWSTS);
771 800
772 set_host_ready(dev); 801 set_host_ready(dev);
773 802
@@ -876,6 +905,21 @@ struct ishtp_device *ish_dev_init(struct pci_dev *pdev)
876 */ 905 */
877void ish_device_disable(struct ishtp_device *dev) 906void ish_device_disable(struct ishtp_device *dev)
878{ 907{
908 struct pci_dev *pdev = dev->pdev;
909
910 if (!pdev)
911 return;
912
913 /* Disable dma communication between FW and host */
914 if (ish_disable_dma(dev)) {
915 dev_err(&pdev->dev,
916 "Can't reset - stuck with DMA in-progress\n");
917 return;
918 }
919
920 /* Put ISH to D3hot state for power saving */
921 pci_set_power_state(pdev, PCI_D3hot);
922
879 dev->dev_state = ISHTP_DEV_DISABLED; 923 dev->dev_state = ISHTP_DEV_DISABLED;
880 ish_clr_host_rdy(dev); 924 ish_clr_host_rdy(dev);
881} 925}
diff --git a/drivers/hid/intel-ish-hid/ipc/pci-ish.c b/drivers/hid/intel-ish-hid/ipc/pci-ish.c
index 42f0beeb09fd..20d647d2dd2c 100644
--- a/drivers/hid/intel-ish-hid/ipc/pci-ish.c
+++ b/drivers/hid/intel-ish-hid/ipc/pci-ish.c
@@ -146,7 +146,7 @@ static int ish_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
146 pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3; 146 pdev->dev_flags |= PCI_DEV_FLAGS_NO_D3;
147 147
148 /* request and enable interrupt */ 148 /* request and enable interrupt */
149 ret = request_irq(pdev->irq, ish_irq_handler, IRQF_NO_SUSPEND, 149 ret = request_irq(pdev->irq, ish_irq_handler, IRQF_SHARED,
150 KBUILD_MODNAME, dev); 150 KBUILD_MODNAME, dev);
151 if (ret) { 151 if (ret) {
152 dev_err(&pdev->dev, "ISH: request IRQ failure (%d)\n", 152 dev_err(&pdev->dev, "ISH: request IRQ failure (%d)\n",
@@ -202,6 +202,7 @@ static void ish_remove(struct pci_dev *pdev)
202 kfree(ishtp_dev); 202 kfree(ishtp_dev);
203} 203}
204 204
205#ifdef CONFIG_PM
205static struct device *ish_resume_device; 206static struct device *ish_resume_device;
206 207
207/** 208/**
@@ -293,7 +294,6 @@ static int ish_resume(struct device *device)
293 return 0; 294 return 0;
294} 295}
295 296
296#ifdef CONFIG_PM
297static const struct dev_pm_ops ish_pm_ops = { 297static const struct dev_pm_ops ish_pm_ops = {
298 .suspend = ish_suspend, 298 .suspend = ish_suspend,
299 .resume = ish_resume, 299 .resume = ish_resume,
@@ -301,7 +301,7 @@ static const struct dev_pm_ops ish_pm_ops = {
301#define ISHTP_ISH_PM_OPS (&ish_pm_ops) 301#define ISHTP_ISH_PM_OPS (&ish_pm_ops)
302#else 302#else
303#define ISHTP_ISH_PM_OPS NULL 303#define ISHTP_ISH_PM_OPS NULL
304#endif 304#endif /* CONFIG_PM */
305 305
306static struct pci_driver ish_driver = { 306static struct pci_driver ish_driver = {
307 .name = KBUILD_MODNAME, 307 .name = KBUILD_MODNAME,
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
index 354d49ea36dd..e6cfd323babc 100644
--- a/drivers/hid/usbhid/hid-quirks.c
+++ b/drivers/hid/usbhid/hid-quirks.c
@@ -63,6 +63,7 @@ static const struct hid_blacklist {
63 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET }, 63 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVM, HID_QUIRK_NOGET },
64 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET }, 64 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_4PORTKVMC, HID_QUIRK_NOGET },
65 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682, HID_QUIRK_NOGET }, 65 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS682, HID_QUIRK_NOGET },
66 { USB_VENDOR_ID_ATEN, USB_DEVICE_ID_ATEN_CS692, HID_QUIRK_NOGET },
66 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET }, 67 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FIGHTERSTICK, HID_QUIRK_NOGET },
67 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET }, 68 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_COMBATSTICK, HID_QUIRK_NOGET },
68 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET }, 69 { USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_FLIGHT_SIM_ECLIPSE_YOKE, HID_QUIRK_NOGET },
diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c
index a259e18d22d5..0276d2ef06ee 100644
--- a/drivers/hv/vmbus_drv.c
+++ b/drivers/hv/vmbus_drv.c
@@ -961,7 +961,7 @@ int vmbus_device_register(struct hv_device *child_device_obj)
961{ 961{
962 int ret = 0; 962 int ret = 0;
963 963
964 dev_set_name(&child_device_obj->device, "vmbus-%pUl", 964 dev_set_name(&child_device_obj->device, "%pUl",
965 child_device_obj->channel->offermsg.offer.if_instance.b); 965 child_device_obj->channel->offermsg.offer.if_instance.b);
966 966
967 child_device_obj->device.bus = &hv_bus; 967 child_device_obj->device.bus = &hv_bus;
diff --git a/drivers/hwmon/hwmon.c b/drivers/hwmon/hwmon.c
index adae6848ffb2..a74c075a30ec 100644
--- a/drivers/hwmon/hwmon.c
+++ b/drivers/hwmon/hwmon.c
@@ -536,8 +536,10 @@ __hwmon_device_register(struct device *dev, const char *name, void *drvdata,
536 536
537 hwdev->groups = devm_kcalloc(dev, ngroups, sizeof(*groups), 537 hwdev->groups = devm_kcalloc(dev, ngroups, sizeof(*groups),
538 GFP_KERNEL); 538 GFP_KERNEL);
539 if (!hwdev->groups) 539 if (!hwdev->groups) {
540 return ERR_PTR(-ENOMEM); 540 err = -ENOMEM;
541 goto free_hwmon;
542 }
541 543
542 attrs = __hwmon_create_attrs(dev, drvdata, chip); 544 attrs = __hwmon_create_attrs(dev, drvdata, chip);
543 if (IS_ERR(attrs)) { 545 if (IS_ERR(attrs)) {
diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig
index d223650a97e4..11edabf425ae 100644
--- a/drivers/i2c/Kconfig
+++ b/drivers/i2c/Kconfig
@@ -59,7 +59,6 @@ config I2C_CHARDEV
59 59
60config I2C_MUX 60config I2C_MUX
61 tristate "I2C bus multiplexing support" 61 tristate "I2C bus multiplexing support"
62 depends on HAS_IOMEM
63 help 62 help
64 Say Y here if you want the I2C core to support the ability to 63 Say Y here if you want the I2C core to support the ability to
65 handle multiplexed I2C bus topologies, by presenting each 64 handle multiplexed I2C bus topologies, by presenting each
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c
index 11e866d05368..b403fa5ecf49 100644
--- a/drivers/i2c/busses/i2c-designware-core.c
+++ b/drivers/i2c/busses/i2c-designware-core.c
@@ -91,9 +91,7 @@
91 DW_IC_INTR_TX_ABRT | \ 91 DW_IC_INTR_TX_ABRT | \
92 DW_IC_INTR_STOP_DET) 92 DW_IC_INTR_STOP_DET)
93 93
94#define DW_IC_STATUS_ACTIVITY 0x1 94#define DW_IC_STATUS_ACTIVITY 0x1
95#define DW_IC_STATUS_TFE BIT(2)
96#define DW_IC_STATUS_MST_ACTIVITY BIT(5)
97 95
98#define DW_IC_SDA_HOLD_RX_SHIFT 16 96#define DW_IC_SDA_HOLD_RX_SHIFT 16
99#define DW_IC_SDA_HOLD_RX_MASK GENMASK(23, DW_IC_SDA_HOLD_RX_SHIFT) 97#define DW_IC_SDA_HOLD_RX_MASK GENMASK(23, DW_IC_SDA_HOLD_RX_SHIFT)
@@ -478,25 +476,9 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
478{ 476{
479 struct i2c_msg *msgs = dev->msgs; 477 struct i2c_msg *msgs = dev->msgs;
480 u32 ic_tar = 0; 478 u32 ic_tar = 0;
481 bool enabled;
482 479
483 enabled = dw_readl(dev, DW_IC_ENABLE_STATUS) & 1; 480 /* Disable the adapter */
484 481 __i2c_dw_enable_and_wait(dev, false);
485 if (enabled) {
486 u32 ic_status;
487
488 /*
489 * Only disable adapter if ic_tar and ic_con can't be
490 * dynamically updated
491 */
492 ic_status = dw_readl(dev, DW_IC_STATUS);
493 if (!dev->dynamic_tar_update_enabled ||
494 (ic_status & DW_IC_STATUS_MST_ACTIVITY) ||
495 !(ic_status & DW_IC_STATUS_TFE)) {
496 __i2c_dw_enable_and_wait(dev, false);
497 enabled = false;
498 }
499 }
500 482
501 /* if the slave address is ten bit address, enable 10BITADDR */ 483 /* if the slave address is ten bit address, enable 10BITADDR */
502 if (dev->dynamic_tar_update_enabled) { 484 if (dev->dynamic_tar_update_enabled) {
@@ -526,8 +508,8 @@ static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
526 /* enforce disabled interrupts (due to HW issues) */ 508 /* enforce disabled interrupts (due to HW issues) */
527 i2c_dw_disable_int(dev); 509 i2c_dw_disable_int(dev);
528 510
529 if (!enabled) 511 /* Enable the adapter */
530 __i2c_dw_enable(dev, true); 512 __i2c_dw_enable(dev, true);
531 513
532 /* Clear and enable interrupts */ 514 /* Clear and enable interrupts */
533 dw_readl(dev, DW_IC_CLR_INTR); 515 dw_readl(dev, DW_IC_CLR_INTR);
@@ -611,7 +593,7 @@ i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
611 if (msgs[dev->msg_write_idx].flags & I2C_M_RD) { 593 if (msgs[dev->msg_write_idx].flags & I2C_M_RD) {
612 594
613 /* avoid rx buffer overrun */ 595 /* avoid rx buffer overrun */
614 if (rx_limit - dev->rx_outstanding <= 0) 596 if (dev->rx_outstanding >= dev->rx_fifo_depth)
615 break; 597 break;
616 598
617 dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD); 599 dw_writel(dev, cmd | 0x100, DW_IC_DATA_CMD);
@@ -708,8 +690,7 @@ static int i2c_dw_handle_tx_abort(struct dw_i2c_dev *dev)
708} 690}
709 691
710/* 692/*
711 * Prepare controller for a transaction and start transfer by calling 693 * Prepare controller for a transaction and call i2c_dw_xfer_msg
712 * i2c_dw_xfer_init()
713 */ 694 */
714static int 695static int
715i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) 696i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
@@ -752,13 +733,23 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
752 goto done; 733 goto done;
753 } 734 }
754 735
736 /*
737 * We must disable the adapter before returning and signaling the end
738 * of the current transfer. Otherwise the hardware might continue
739 * generating interrupts which in turn causes a race condition with
740 * the following transfer. Needs some more investigation if the
741 * additional interrupts are a hardware bug or this driver doesn't
742 * handle them correctly yet.
743 */
744 __i2c_dw_enable(dev, false);
745
755 if (dev->msg_err) { 746 if (dev->msg_err) {
756 ret = dev->msg_err; 747 ret = dev->msg_err;
757 goto done; 748 goto done;
758 } 749 }
759 750
760 /* no error */ 751 /* no error */
761 if (likely(!dev->cmd_err)) { 752 if (likely(!dev->cmd_err && !dev->status)) {
762 ret = num; 753 ret = num;
763 goto done; 754 goto done;
764 } 755 }
@@ -768,6 +759,11 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
768 ret = i2c_dw_handle_tx_abort(dev); 759 ret = i2c_dw_handle_tx_abort(dev);
769 goto done; 760 goto done;
770 } 761 }
762
763 if (dev->status)
764 dev_err(dev->dev,
765 "transfer terminated early - interrupt latency too high?\n");
766
771 ret = -EIO; 767 ret = -EIO;
772 768
773done: 769done:
@@ -888,19 +884,9 @@ static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
888 */ 884 */
889 885
890tx_aborted: 886tx_aborted:
891 if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) 887 if ((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err)
892 || dev->msg_err) {
893 /*
894 * We must disable interruts before returning and signaling
895 * the end of the current transfer. Otherwise the hardware
896 * might continue generating interrupts for non-existent
897 * transfers.
898 */
899 i2c_dw_disable_int(dev);
900 dw_readl(dev, DW_IC_CLR_INTR);
901
902 complete(&dev->cmd_complete); 888 complete(&dev->cmd_complete);
903 } else if (unlikely(dev->accessor_flags & ACCESS_INTR_MASK)) { 889 else if (unlikely(dev->accessor_flags & ACCESS_INTR_MASK)) {
904 /* workaround to trigger pending interrupt */ 890 /* workaround to trigger pending interrupt */
905 stat = dw_readl(dev, DW_IC_INTR_MASK); 891 stat = dw_readl(dev, DW_IC_INTR_MASK);
906 i2c_dw_disable_int(dev); 892 i2c_dw_disable_int(dev);
diff --git a/drivers/i2c/busses/i2c-digicolor.c b/drivers/i2c/busses/i2c-digicolor.c
index 49f2084f7bb5..50813a24c541 100644
--- a/drivers/i2c/busses/i2c-digicolor.c
+++ b/drivers/i2c/busses/i2c-digicolor.c
@@ -347,7 +347,7 @@ static int dc_i2c_probe(struct platform_device *pdev)
347 347
348 ret = i2c_add_adapter(&i2c->adap); 348 ret = i2c_add_adapter(&i2c->adap);
349 if (ret < 0) { 349 if (ret < 0) {
350 clk_unprepare(i2c->clk); 350 clk_disable_unprepare(i2c->clk);
351 return ret; 351 return ret;
352 } 352 }
353 353
diff --git a/drivers/i2c/busses/i2c-octeon-core.c b/drivers/i2c/busses/i2c-octeon-core.c
index 419b54bfc7c7..5e63b17f935d 100644
--- a/drivers/i2c/busses/i2c-octeon-core.c
+++ b/drivers/i2c/busses/i2c-octeon-core.c
@@ -381,9 +381,7 @@ static int octeon_i2c_read(struct octeon_i2c *i2c, int target,
381 if (result) 381 if (result)
382 return result; 382 return result;
383 383
384 data[i] = octeon_i2c_data_read(i2c, &result); 384 data[i] = octeon_i2c_data_read(i2c);
385 if (result)
386 return result;
387 if (recv_len && i == 0) { 385 if (recv_len && i == 0) {
388 if (data[i] > I2C_SMBUS_BLOCK_MAX + 1) 386 if (data[i] > I2C_SMBUS_BLOCK_MAX + 1)
389 return -EPROTO; 387 return -EPROTO;
diff --git a/drivers/i2c/busses/i2c-octeon-core.h b/drivers/i2c/busses/i2c-octeon-core.h
index 1db7c835a454..87151ea74acd 100644
--- a/drivers/i2c/busses/i2c-octeon-core.h
+++ b/drivers/i2c/busses/i2c-octeon-core.h
@@ -5,7 +5,6 @@
5#include <linux/i2c.h> 5#include <linux/i2c.h>
6#include <linux/i2c-smbus.h> 6#include <linux/i2c-smbus.h>
7#include <linux/io.h> 7#include <linux/io.h>
8#include <linux/iopoll.h>
9#include <linux/kernel.h> 8#include <linux/kernel.h>
10#include <linux/pci.h> 9#include <linux/pci.h>
11 10
@@ -145,9 +144,9 @@ static inline void octeon_i2c_reg_write(struct octeon_i2c *i2c, u64 eop_reg, u8
145 u64 tmp; 144 u64 tmp;
146 145
147 __raw_writeq(SW_TWSI_V | eop_reg | data, i2c->twsi_base + SW_TWSI(i2c)); 146 __raw_writeq(SW_TWSI_V | eop_reg | data, i2c->twsi_base + SW_TWSI(i2c));
148 147 do {
149 readq_poll_timeout(i2c->twsi_base + SW_TWSI(i2c), tmp, tmp & SW_TWSI_V, 148 tmp = __raw_readq(i2c->twsi_base + SW_TWSI(i2c));
150 I2C_OCTEON_EVENT_WAIT, i2c->adap.timeout); 149 } while ((tmp & SW_TWSI_V) != 0);
151} 150}
152 151
153#define octeon_i2c_ctl_write(i2c, val) \ 152#define octeon_i2c_ctl_write(i2c, val) \
@@ -164,28 +163,24 @@ static inline void octeon_i2c_reg_write(struct octeon_i2c *i2c, u64 eop_reg, u8
164 * 163 *
165 * The I2C core registers are accessed indirectly via the SW_TWSI CSR. 164 * The I2C core registers are accessed indirectly via the SW_TWSI CSR.
166 */ 165 */
167static inline int octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg, 166static inline u8 octeon_i2c_reg_read(struct octeon_i2c *i2c, u64 eop_reg)
168 int *error)
169{ 167{
170 u64 tmp; 168 u64 tmp;
171 int ret;
172 169
173 __raw_writeq(SW_TWSI_V | eop_reg | SW_TWSI_R, i2c->twsi_base + SW_TWSI(i2c)); 170 __raw_writeq(SW_TWSI_V | eop_reg | SW_TWSI_R, i2c->twsi_base + SW_TWSI(i2c));
171 do {
172 tmp = __raw_readq(i2c->twsi_base + SW_TWSI(i2c));
173 } while ((tmp & SW_TWSI_V) != 0);
174 174
175 ret = readq_poll_timeout(i2c->twsi_base + SW_TWSI(i2c), tmp,
176 tmp & SW_TWSI_V, I2C_OCTEON_EVENT_WAIT,
177 i2c->adap.timeout);
178 if (error)
179 *error = ret;
180 return tmp & 0xFF; 175 return tmp & 0xFF;
181} 176}
182 177
183#define octeon_i2c_ctl_read(i2c) \ 178#define octeon_i2c_ctl_read(i2c) \
184 octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL, NULL) 179 octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_CTL)
185#define octeon_i2c_data_read(i2c, error) \ 180#define octeon_i2c_data_read(i2c) \
186 octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA, error) 181 octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_DATA)
187#define octeon_i2c_stat_read(i2c) \ 182#define octeon_i2c_stat_read(i2c) \
188 octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_STAT, NULL) 183 octeon_i2c_reg_read(i2c, SW_TWSI_EOP_TWSI_STAT)
189 184
190/** 185/**
191 * octeon_i2c_read_int - read the TWSI_INT register 186 * octeon_i2c_read_int - read the TWSI_INT register
diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig
index e280c8ecc0b5..96de9ce5669b 100644
--- a/drivers/i2c/muxes/Kconfig
+++ b/drivers/i2c/muxes/Kconfig
@@ -63,6 +63,7 @@ config I2C_MUX_PINCTRL
63 63
64config I2C_MUX_REG 64config I2C_MUX_REG
65 tristate "Register-based I2C multiplexer" 65 tristate "Register-based I2C multiplexer"
66 depends on HAS_IOMEM
66 help 67 help
67 If you say yes to this option, support will be included for a 68 If you say yes to this option, support will be included for a
68 register based I2C multiplexer. This driver provides access to 69 register based I2C multiplexer. This driver provides access to
diff --git a/drivers/i2c/muxes/i2c-demux-pinctrl.c b/drivers/i2c/muxes/i2c-demux-pinctrl.c
index b3893f6282ba..3e6fe1760d82 100644
--- a/drivers/i2c/muxes/i2c-demux-pinctrl.c
+++ b/drivers/i2c/muxes/i2c-demux-pinctrl.c
@@ -69,10 +69,28 @@ static int i2c_demux_activate_master(struct i2c_demux_pinctrl_priv *priv, u32 ne
69 goto err_with_revert; 69 goto err_with_revert;
70 } 70 }
71 71
72 p = devm_pinctrl_get_select(adap->dev.parent, priv->bus_name); 72 /*
73 * Check if there are pinctrl states at all. Note: we cant' use
74 * devm_pinctrl_get_select() because we need to distinguish between
75 * the -ENODEV from devm_pinctrl_get() and pinctrl_lookup_state().
76 */
77 p = devm_pinctrl_get(adap->dev.parent);
73 if (IS_ERR(p)) { 78 if (IS_ERR(p)) {
74 ret = PTR_ERR(p); 79 ret = PTR_ERR(p);
75 goto err_with_put; 80 /* continue if just no pinctrl states (e.g. i2c-gpio), otherwise exit */
81 if (ret != -ENODEV)
82 goto err_with_put;
83 } else {
84 /* there are states. check and use them */
85 struct pinctrl_state *s = pinctrl_lookup_state(p, priv->bus_name);
86
87 if (IS_ERR(s)) {
88 ret = PTR_ERR(s);
89 goto err_with_put;
90 }
91 ret = pinctrl_select_state(p, s);
92 if (ret < 0)
93 goto err_with_put;
76 } 94 }
77 95
78 priv->chan[new_chan].parent_adap = adap; 96 priv->chan[new_chan].parent_adap = adap;
diff --git a/drivers/i2c/muxes/i2c-mux-pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c
index 1091346f2480..8bc3d36d2837 100644
--- a/drivers/i2c/muxes/i2c-mux-pca954x.c
+++ b/drivers/i2c/muxes/i2c-mux-pca954x.c
@@ -268,9 +268,9 @@ static int pca954x_probe(struct i2c_client *client,
268 /* discard unconfigured channels */ 268 /* discard unconfigured channels */
269 break; 269 break;
270 idle_disconnect_pd = pdata->modes[num].deselect_on_exit; 270 idle_disconnect_pd = pdata->modes[num].deselect_on_exit;
271 data->deselect |= (idle_disconnect_pd
272 || idle_disconnect_dt) << num;
273 } 271 }
272 data->deselect |= (idle_disconnect_pd ||
273 idle_disconnect_dt) << num;
274 274
275 ret = i2c_mux_add_adapter(muxc, force, num, class); 275 ret = i2c_mux_add_adapter(muxc, force, num, class);
276 276
diff --git a/drivers/iio/accel/st_accel_core.c b/drivers/iio/accel/st_accel_core.c
index da3fb069ec5c..ce69048c88e9 100644
--- a/drivers/iio/accel/st_accel_core.c
+++ b/drivers/iio/accel/st_accel_core.c
@@ -743,8 +743,8 @@ static int st_accel_read_raw(struct iio_dev *indio_dev,
743 743
744 return IIO_VAL_INT; 744 return IIO_VAL_INT;
745 case IIO_CHAN_INFO_SCALE: 745 case IIO_CHAN_INFO_SCALE:
746 *val = 0; 746 *val = adata->current_fullscale->gain / 1000000;
747 *val2 = adata->current_fullscale->gain; 747 *val2 = adata->current_fullscale->gain % 1000000;
748 return IIO_VAL_INT_PLUS_MICRO; 748 return IIO_VAL_INT_PLUS_MICRO;
749 case IIO_CHAN_INFO_SAMP_FREQ: 749 case IIO_CHAN_INFO_SAMP_FREQ:
750 *val = adata->odr; 750 *val = adata->odr;
@@ -763,9 +763,13 @@ static int st_accel_write_raw(struct iio_dev *indio_dev,
763 int err; 763 int err;
764 764
765 switch (mask) { 765 switch (mask) {
766 case IIO_CHAN_INFO_SCALE: 766 case IIO_CHAN_INFO_SCALE: {
767 err = st_sensors_set_fullscale_by_gain(indio_dev, val2); 767 int gain;
768
769 gain = val * 1000000 + val2;
770 err = st_sensors_set_fullscale_by_gain(indio_dev, gain);
768 break; 771 break;
772 }
769 case IIO_CHAN_INFO_SAMP_FREQ: 773 case IIO_CHAN_INFO_SAMP_FREQ:
770 if (val2) 774 if (val2)
771 return -EINVAL; 775 return -EINVAL;
diff --git a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c
index dc33c1dd5191..b5beea53d6f6 100644
--- a/drivers/iio/common/hid-sensors/hid-sensor-attributes.c
+++ b/drivers/iio/common/hid-sensors/hid-sensor-attributes.c
@@ -30,26 +30,26 @@ static struct {
30 u32 usage_id; 30 u32 usage_id;
31 int unit; /* 0 for default others from HID sensor spec */ 31 int unit; /* 0 for default others from HID sensor spec */
32 int scale_val0; /* scale, whole number */ 32 int scale_val0; /* scale, whole number */
33 int scale_val1; /* scale, fraction in micros */ 33 int scale_val1; /* scale, fraction in nanos */
34} unit_conversion[] = { 34} unit_conversion[] = {
35 {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650}, 35 {HID_USAGE_SENSOR_ACCEL_3D, 0, 9, 806650000},
36 {HID_USAGE_SENSOR_ACCEL_3D, 36 {HID_USAGE_SENSOR_ACCEL_3D,
37 HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0}, 37 HID_USAGE_SENSOR_UNITS_METERS_PER_SEC_SQRD, 1, 0},
38 {HID_USAGE_SENSOR_ACCEL_3D, 38 {HID_USAGE_SENSOR_ACCEL_3D,
39 HID_USAGE_SENSOR_UNITS_G, 9, 806650}, 39 HID_USAGE_SENSOR_UNITS_G, 9, 806650000},
40 40
41 {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453}, 41 {HID_USAGE_SENSOR_GYRO_3D, 0, 0, 17453293},
42 {HID_USAGE_SENSOR_GYRO_3D, 42 {HID_USAGE_SENSOR_GYRO_3D,
43 HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND, 1, 0}, 43 HID_USAGE_SENSOR_UNITS_RADIANS_PER_SECOND, 1, 0},
44 {HID_USAGE_SENSOR_GYRO_3D, 44 {HID_USAGE_SENSOR_GYRO_3D,
45 HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453}, 45 HID_USAGE_SENSOR_UNITS_DEGREES_PER_SECOND, 0, 17453293},
46 46
47 {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000}, 47 {HID_USAGE_SENSOR_COMPASS_3D, 0, 0, 1000000},
48 {HID_USAGE_SENSOR_COMPASS_3D, HID_USAGE_SENSOR_UNITS_GAUSS, 1, 0}, 48 {HID_USAGE_SENSOR_COMPASS_3D, HID_USAGE_SENSOR_UNITS_GAUSS, 1, 0},
49 49
50 {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453}, 50 {HID_USAGE_SENSOR_INCLINOMETER_3D, 0, 0, 17453293},
51 {HID_USAGE_SENSOR_INCLINOMETER_3D, 51 {HID_USAGE_SENSOR_INCLINOMETER_3D,
52 HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453}, 52 HID_USAGE_SENSOR_UNITS_DEGREES, 0, 17453293},
53 {HID_USAGE_SENSOR_INCLINOMETER_3D, 53 {HID_USAGE_SENSOR_INCLINOMETER_3D,
54 HID_USAGE_SENSOR_UNITS_RADIANS, 1, 0}, 54 HID_USAGE_SENSOR_UNITS_RADIANS, 1, 0},
55 55
@@ -57,7 +57,7 @@ static struct {
57 {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, 57 {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0},
58 58
59 {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0}, 59 {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0},
60 {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000}, 60 {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000000},
61}; 61};
62 62
63static int pow_10(unsigned power) 63static int pow_10(unsigned power)
@@ -266,15 +266,15 @@ EXPORT_SYMBOL(hid_sensor_write_raw_hyst_value);
266/* 266/*
267 * This fuction applies the unit exponent to the scale. 267 * This fuction applies the unit exponent to the scale.
268 * For example: 268 * For example:
269 * 9.806650 ->exp:2-> val0[980]val1[665000] 269 * 9.806650000 ->exp:2-> val0[980]val1[665000000]
270 * 9.000806 ->exp:2-> val0[900]val1[80600] 270 * 9.000806000 ->exp:2-> val0[900]val1[80600000]
271 * 0.174535 ->exp:2-> val0[17]val1[453500] 271 * 0.174535293 ->exp:2-> val0[17]val1[453529300]
272 * 1.001745 ->exp:0-> val0[1]val1[1745] 272 * 1.001745329 ->exp:0-> val0[1]val1[1745329]
273 * 1.001745 ->exp:2-> val0[100]val1[174500] 273 * 1.001745329 ->exp:2-> val0[100]val1[174532900]
274 * 1.001745 ->exp:4-> val0[10017]val1[450000] 274 * 1.001745329 ->exp:4-> val0[10017]val1[453290000]
275 * 9.806650 ->exp:-2-> val0[0]val1[98066] 275 * 9.806650000 ->exp:-2-> val0[0]val1[98066500]
276 */ 276 */
277static void adjust_exponent_micro(int *val0, int *val1, int scale0, 277static void adjust_exponent_nano(int *val0, int *val1, int scale0,
278 int scale1, int exp) 278 int scale1, int exp)
279{ 279{
280 int i; 280 int i;
@@ -285,32 +285,32 @@ static void adjust_exponent_micro(int *val0, int *val1, int scale0,
285 if (exp > 0) { 285 if (exp > 0) {
286 *val0 = scale0 * pow_10(exp); 286 *val0 = scale0 * pow_10(exp);
287 res = 0; 287 res = 0;
288 if (exp > 6) { 288 if (exp > 9) {
289 *val1 = 0; 289 *val1 = 0;
290 return; 290 return;
291 } 291 }
292 for (i = 0; i < exp; ++i) { 292 for (i = 0; i < exp; ++i) {
293 x = scale1 / pow_10(5 - i); 293 x = scale1 / pow_10(8 - i);
294 res += (pow_10(exp - 1 - i) * x); 294 res += (pow_10(exp - 1 - i) * x);
295 scale1 = scale1 % pow_10(5 - i); 295 scale1 = scale1 % pow_10(8 - i);
296 } 296 }
297 *val0 += res; 297 *val0 += res;
298 *val1 = scale1 * pow_10(exp); 298 *val1 = scale1 * pow_10(exp);
299 } else if (exp < 0) { 299 } else if (exp < 0) {
300 exp = abs(exp); 300 exp = abs(exp);
301 if (exp > 6) { 301 if (exp > 9) {
302 *val0 = *val1 = 0; 302 *val0 = *val1 = 0;
303 return; 303 return;
304 } 304 }
305 *val0 = scale0 / pow_10(exp); 305 *val0 = scale0 / pow_10(exp);
306 rem = scale0 % pow_10(exp); 306 rem = scale0 % pow_10(exp);
307 res = 0; 307 res = 0;
308 for (i = 0; i < (6 - exp); ++i) { 308 for (i = 0; i < (9 - exp); ++i) {
309 x = scale1 / pow_10(5 - i); 309 x = scale1 / pow_10(8 - i);
310 res += (pow_10(5 - exp - i) * x); 310 res += (pow_10(8 - exp - i) * x);
311 scale1 = scale1 % pow_10(5 - i); 311 scale1 = scale1 % pow_10(8 - i);
312 } 312 }
313 *val1 = rem * pow_10(6 - exp) + res; 313 *val1 = rem * pow_10(9 - exp) + res;
314 } else { 314 } else {
315 *val0 = scale0; 315 *val0 = scale0;
316 *val1 = scale1; 316 *val1 = scale1;
@@ -332,14 +332,14 @@ int hid_sensor_format_scale(u32 usage_id,
332 unit_conversion[i].unit == attr_info->units) { 332 unit_conversion[i].unit == attr_info->units) {
333 exp = hid_sensor_convert_exponent( 333 exp = hid_sensor_convert_exponent(
334 attr_info->unit_expo); 334 attr_info->unit_expo);
335 adjust_exponent_micro(val0, val1, 335 adjust_exponent_nano(val0, val1,
336 unit_conversion[i].scale_val0, 336 unit_conversion[i].scale_val0,
337 unit_conversion[i].scale_val1, exp); 337 unit_conversion[i].scale_val1, exp);
338 break; 338 break;
339 } 339 }
340 } 340 }
341 341
342 return IIO_VAL_INT_PLUS_MICRO; 342 return IIO_VAL_INT_PLUS_NANO;
343} 343}
344EXPORT_SYMBOL(hid_sensor_format_scale); 344EXPORT_SYMBOL(hid_sensor_format_scale);
345 345
diff --git a/drivers/iio/common/st_sensors/st_sensors_core.c b/drivers/iio/common/st_sensors/st_sensors_core.c
index 285a64a589d7..975a1f19f747 100644
--- a/drivers/iio/common/st_sensors/st_sensors_core.c
+++ b/drivers/iio/common/st_sensors/st_sensors_core.c
@@ -612,7 +612,7 @@ EXPORT_SYMBOL(st_sensors_sysfs_sampling_frequency_avail);
612ssize_t st_sensors_sysfs_scale_avail(struct device *dev, 612ssize_t st_sensors_sysfs_scale_avail(struct device *dev,
613 struct device_attribute *attr, char *buf) 613 struct device_attribute *attr, char *buf)
614{ 614{
615 int i, len = 0; 615 int i, len = 0, q, r;
616 struct iio_dev *indio_dev = dev_get_drvdata(dev); 616 struct iio_dev *indio_dev = dev_get_drvdata(dev);
617 struct st_sensor_data *sdata = iio_priv(indio_dev); 617 struct st_sensor_data *sdata = iio_priv(indio_dev);
618 618
@@ -621,8 +621,10 @@ ssize_t st_sensors_sysfs_scale_avail(struct device *dev,
621 if (sdata->sensor_settings->fs.fs_avl[i].num == 0) 621 if (sdata->sensor_settings->fs.fs_avl[i].num == 0)
622 break; 622 break;
623 623
624 len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06u ", 624 q = sdata->sensor_settings->fs.fs_avl[i].gain / 1000000;
625 sdata->sensor_settings->fs.fs_avl[i].gain); 625 r = sdata->sensor_settings->fs.fs_avl[i].gain % 1000000;
626
627 len += scnprintf(buf + len, PAGE_SIZE - len, "%u.%06u ", q, r);
626 } 628 }
627 mutex_unlock(&indio_dev->mlock); 629 mutex_unlock(&indio_dev->mlock);
628 buf[len - 1] = '\n'; 630 buf[len - 1] = '\n';
diff --git a/drivers/iio/orientation/hid-sensor-rotation.c b/drivers/iio/orientation/hid-sensor-rotation.c
index b98b9d94d184..a97e802ca523 100644
--- a/drivers/iio/orientation/hid-sensor-rotation.c
+++ b/drivers/iio/orientation/hid-sensor-rotation.c
@@ -335,6 +335,7 @@ static struct platform_driver hid_dev_rot_platform_driver = {
335 .id_table = hid_dev_rot_ids, 335 .id_table = hid_dev_rot_ids,
336 .driver = { 336 .driver = {
337 .name = KBUILD_MODNAME, 337 .name = KBUILD_MODNAME,
338 .pm = &hid_sensor_pm_ops,
338 }, 339 },
339 .probe = hid_dev_rot_probe, 340 .probe = hid_dev_rot_probe,
340 .remove = hid_dev_rot_remove, 341 .remove = hid_dev_rot_remove,
diff --git a/drivers/iio/temperature/maxim_thermocouple.c b/drivers/iio/temperature/maxim_thermocouple.c
index 066161a4bccd..f962f31a5eb2 100644
--- a/drivers/iio/temperature/maxim_thermocouple.c
+++ b/drivers/iio/temperature/maxim_thermocouple.c
@@ -136,6 +136,8 @@ static int maxim_thermocouple_read(struct maxim_thermocouple_data *data,
136 ret = spi_read(data->spi, (void *)&buf32, storage_bytes); 136 ret = spi_read(data->spi, (void *)&buf32, storage_bytes);
137 *val = be32_to_cpu(buf32); 137 *val = be32_to_cpu(buf32);
138 break; 138 break;
139 default:
140 ret = -EINVAL;
139 } 141 }
140 142
141 if (ret) 143 if (ret)
diff --git a/drivers/infiniband/core/addr.c b/drivers/infiniband/core/addr.c
index b136d3acc5bd..0f58f46dbad7 100644
--- a/drivers/infiniband/core/addr.c
+++ b/drivers/infiniband/core/addr.c
@@ -699,13 +699,16 @@ EXPORT_SYMBOL(rdma_addr_cancel);
699struct resolve_cb_context { 699struct resolve_cb_context {
700 struct rdma_dev_addr *addr; 700 struct rdma_dev_addr *addr;
701 struct completion comp; 701 struct completion comp;
702 int status;
702}; 703};
703 704
704static void resolve_cb(int status, struct sockaddr *src_addr, 705static void resolve_cb(int status, struct sockaddr *src_addr,
705 struct rdma_dev_addr *addr, void *context) 706 struct rdma_dev_addr *addr, void *context)
706{ 707{
707 memcpy(((struct resolve_cb_context *)context)->addr, addr, sizeof(struct 708 if (!status)
708 rdma_dev_addr)); 709 memcpy(((struct resolve_cb_context *)context)->addr,
710 addr, sizeof(struct rdma_dev_addr));
711 ((struct resolve_cb_context *)context)->status = status;
709 complete(&((struct resolve_cb_context *)context)->comp); 712 complete(&((struct resolve_cb_context *)context)->comp);
710} 713}
711 714
@@ -743,6 +746,10 @@ int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
743 746
744 wait_for_completion(&ctx.comp); 747 wait_for_completion(&ctx.comp);
745 748
749 ret = ctx.status;
750 if (ret)
751 return ret;
752
746 memcpy(dmac, dev_addr.dst_dev_addr, ETH_ALEN); 753 memcpy(dmac, dev_addr.dst_dev_addr, ETH_ALEN);
747 dev = dev_get_by_index(&init_net, dev_addr.bound_dev_if); 754 dev = dev_get_by_index(&init_net, dev_addr.bound_dev_if);
748 if (!dev) 755 if (!dev)
diff --git a/drivers/infiniband/core/cm.c b/drivers/infiniband/core/cm.c
index c99525512b34..71c7c4c328ef 100644
--- a/drivers/infiniband/core/cm.c
+++ b/drivers/infiniband/core/cm.c
@@ -80,6 +80,8 @@ static struct ib_cm {
80 __be32 random_id_operand; 80 __be32 random_id_operand;
81 struct list_head timewait_list; 81 struct list_head timewait_list;
82 struct workqueue_struct *wq; 82 struct workqueue_struct *wq;
83 /* Sync on cm change port state */
84 spinlock_t state_lock;
83} cm; 85} cm;
84 86
85/* Counter indexes ordered by attribute ID */ 87/* Counter indexes ordered by attribute ID */
@@ -161,6 +163,8 @@ struct cm_port {
161 struct ib_mad_agent *mad_agent; 163 struct ib_mad_agent *mad_agent;
162 struct kobject port_obj; 164 struct kobject port_obj;
163 u8 port_num; 165 u8 port_num;
166 struct list_head cm_priv_prim_list;
167 struct list_head cm_priv_altr_list;
164 struct cm_counter_group counter_group[CM_COUNTER_GROUPS]; 168 struct cm_counter_group counter_group[CM_COUNTER_GROUPS];
165}; 169};
166 170
@@ -241,6 +245,12 @@ struct cm_id_private {
241 u8 service_timeout; 245 u8 service_timeout;
242 u8 target_ack_delay; 246 u8 target_ack_delay;
243 247
248 struct list_head prim_list;
249 struct list_head altr_list;
250 /* Indicates that the send port mad is registered and av is set */
251 int prim_send_port_not_ready;
252 int altr_send_port_not_ready;
253
244 struct list_head work_list; 254 struct list_head work_list;
245 atomic_t work_count; 255 atomic_t work_count;
246}; 256};
@@ -259,20 +269,47 @@ static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
259 struct ib_mad_agent *mad_agent; 269 struct ib_mad_agent *mad_agent;
260 struct ib_mad_send_buf *m; 270 struct ib_mad_send_buf *m;
261 struct ib_ah *ah; 271 struct ib_ah *ah;
272 struct cm_av *av;
273 unsigned long flags, flags2;
274 int ret = 0;
262 275
276 /* don't let the port to be released till the agent is down */
277 spin_lock_irqsave(&cm.state_lock, flags2);
278 spin_lock_irqsave(&cm.lock, flags);
279 if (!cm_id_priv->prim_send_port_not_ready)
280 av = &cm_id_priv->av;
281 else if (!cm_id_priv->altr_send_port_not_ready &&
282 (cm_id_priv->alt_av.port))
283 av = &cm_id_priv->alt_av;
284 else {
285 pr_info("%s: not valid CM id\n", __func__);
286 ret = -ENODEV;
287 spin_unlock_irqrestore(&cm.lock, flags);
288 goto out;
289 }
290 spin_unlock_irqrestore(&cm.lock, flags);
291 /* Make sure the port haven't released the mad yet */
263 mad_agent = cm_id_priv->av.port->mad_agent; 292 mad_agent = cm_id_priv->av.port->mad_agent;
264 ah = ib_create_ah(mad_agent->qp->pd, &cm_id_priv->av.ah_attr); 293 if (!mad_agent) {
265 if (IS_ERR(ah)) 294 pr_info("%s: not a valid MAD agent\n", __func__);
266 return PTR_ERR(ah); 295 ret = -ENODEV;
296 goto out;
297 }
298 ah = ib_create_ah(mad_agent->qp->pd, &av->ah_attr);
299 if (IS_ERR(ah)) {
300 ret = PTR_ERR(ah);
301 goto out;
302 }
267 303
268 m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn, 304 m = ib_create_send_mad(mad_agent, cm_id_priv->id.remote_cm_qpn,
269 cm_id_priv->av.pkey_index, 305 av->pkey_index,
270 0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA, 306 0, IB_MGMT_MAD_HDR, IB_MGMT_MAD_DATA,
271 GFP_ATOMIC, 307 GFP_ATOMIC,
272 IB_MGMT_BASE_VERSION); 308 IB_MGMT_BASE_VERSION);
273 if (IS_ERR(m)) { 309 if (IS_ERR(m)) {
274 ib_destroy_ah(ah); 310 ib_destroy_ah(ah);
275 return PTR_ERR(m); 311 ret = PTR_ERR(m);
312 goto out;
276 } 313 }
277 314
278 /* Timeout set by caller if response is expected. */ 315 /* Timeout set by caller if response is expected. */
@@ -282,7 +319,10 @@ static int cm_alloc_msg(struct cm_id_private *cm_id_priv,
282 atomic_inc(&cm_id_priv->refcount); 319 atomic_inc(&cm_id_priv->refcount);
283 m->context[0] = cm_id_priv; 320 m->context[0] = cm_id_priv;
284 *msg = m; 321 *msg = m;
285 return 0; 322
323out:
324 spin_unlock_irqrestore(&cm.state_lock, flags2);
325 return ret;
286} 326}
287 327
288static int cm_alloc_response_msg(struct cm_port *port, 328static int cm_alloc_response_msg(struct cm_port *port,
@@ -352,7 +392,8 @@ static void cm_init_av_for_response(struct cm_port *port, struct ib_wc *wc,
352 grh, &av->ah_attr); 392 grh, &av->ah_attr);
353} 393}
354 394
355static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av) 395static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av,
396 struct cm_id_private *cm_id_priv)
356{ 397{
357 struct cm_device *cm_dev; 398 struct cm_device *cm_dev;
358 struct cm_port *port = NULL; 399 struct cm_port *port = NULL;
@@ -387,7 +428,17 @@ static int cm_init_av_by_path(struct ib_sa_path_rec *path, struct cm_av *av)
387 &av->ah_attr); 428 &av->ah_attr);
388 av->timeout = path->packet_life_time + 1; 429 av->timeout = path->packet_life_time + 1;
389 430
390 return 0; 431 spin_lock_irqsave(&cm.lock, flags);
432 if (&cm_id_priv->av == av)
433 list_add_tail(&cm_id_priv->prim_list, &port->cm_priv_prim_list);
434 else if (&cm_id_priv->alt_av == av)
435 list_add_tail(&cm_id_priv->altr_list, &port->cm_priv_altr_list);
436 else
437 ret = -EINVAL;
438
439 spin_unlock_irqrestore(&cm.lock, flags);
440
441 return ret;
391} 442}
392 443
393static int cm_alloc_id(struct cm_id_private *cm_id_priv) 444static int cm_alloc_id(struct cm_id_private *cm_id_priv)
@@ -677,6 +728,8 @@ struct ib_cm_id *ib_create_cm_id(struct ib_device *device,
677 spin_lock_init(&cm_id_priv->lock); 728 spin_lock_init(&cm_id_priv->lock);
678 init_completion(&cm_id_priv->comp); 729 init_completion(&cm_id_priv->comp);
679 INIT_LIST_HEAD(&cm_id_priv->work_list); 730 INIT_LIST_HEAD(&cm_id_priv->work_list);
731 INIT_LIST_HEAD(&cm_id_priv->prim_list);
732 INIT_LIST_HEAD(&cm_id_priv->altr_list);
680 atomic_set(&cm_id_priv->work_count, -1); 733 atomic_set(&cm_id_priv->work_count, -1);
681 atomic_set(&cm_id_priv->refcount, 1); 734 atomic_set(&cm_id_priv->refcount, 1);
682 return &cm_id_priv->id; 735 return &cm_id_priv->id;
@@ -892,6 +945,15 @@ retest:
892 break; 945 break;
893 } 946 }
894 947
948 spin_lock_irq(&cm.lock);
949 if (!list_empty(&cm_id_priv->altr_list) &&
950 (!cm_id_priv->altr_send_port_not_ready))
951 list_del(&cm_id_priv->altr_list);
952 if (!list_empty(&cm_id_priv->prim_list) &&
953 (!cm_id_priv->prim_send_port_not_ready))
954 list_del(&cm_id_priv->prim_list);
955 spin_unlock_irq(&cm.lock);
956
895 cm_free_id(cm_id->local_id); 957 cm_free_id(cm_id->local_id);
896 cm_deref_id(cm_id_priv); 958 cm_deref_id(cm_id_priv);
897 wait_for_completion(&cm_id_priv->comp); 959 wait_for_completion(&cm_id_priv->comp);
@@ -1192,12 +1254,13 @@ int ib_send_cm_req(struct ib_cm_id *cm_id,
1192 goto out; 1254 goto out;
1193 } 1255 }
1194 1256
1195 ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av); 1257 ret = cm_init_av_by_path(param->primary_path, &cm_id_priv->av,
1258 cm_id_priv);
1196 if (ret) 1259 if (ret)
1197 goto error1; 1260 goto error1;
1198 if (param->alternate_path) { 1261 if (param->alternate_path) {
1199 ret = cm_init_av_by_path(param->alternate_path, 1262 ret = cm_init_av_by_path(param->alternate_path,
1200 &cm_id_priv->alt_av); 1263 &cm_id_priv->alt_av, cm_id_priv);
1201 if (ret) 1264 if (ret)
1202 goto error1; 1265 goto error1;
1203 } 1266 }
@@ -1653,7 +1716,8 @@ static int cm_req_handler(struct cm_work *work)
1653 dev_put(gid_attr.ndev); 1716 dev_put(gid_attr.ndev);
1654 } 1717 }
1655 work->path[0].gid_type = gid_attr.gid_type; 1718 work->path[0].gid_type = gid_attr.gid_type;
1656 ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av); 1719 ret = cm_init_av_by_path(&work->path[0], &cm_id_priv->av,
1720 cm_id_priv);
1657 } 1721 }
1658 if (ret) { 1722 if (ret) {
1659 int err = ib_get_cached_gid(work->port->cm_dev->ib_device, 1723 int err = ib_get_cached_gid(work->port->cm_dev->ib_device,
@@ -1672,7 +1736,8 @@ static int cm_req_handler(struct cm_work *work)
1672 goto rejected; 1736 goto rejected;
1673 } 1737 }
1674 if (req_msg->alt_local_lid) { 1738 if (req_msg->alt_local_lid) {
1675 ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av); 1739 ret = cm_init_av_by_path(&work->path[1], &cm_id_priv->alt_av,
1740 cm_id_priv);
1676 if (ret) { 1741 if (ret) {
1677 ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID, 1742 ib_send_cm_rej(cm_id, IB_CM_REJ_INVALID_ALT_GID,
1678 &work->path[0].sgid, 1743 &work->path[0].sgid,
@@ -2727,7 +2792,8 @@ int ib_send_cm_lap(struct ib_cm_id *cm_id,
2727 goto out; 2792 goto out;
2728 } 2793 }
2729 2794
2730 ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av); 2795 ret = cm_init_av_by_path(alternate_path, &cm_id_priv->alt_av,
2796 cm_id_priv);
2731 if (ret) 2797 if (ret)
2732 goto out; 2798 goto out;
2733 cm_id_priv->alt_av.timeout = 2799 cm_id_priv->alt_av.timeout =
@@ -2839,7 +2905,8 @@ static int cm_lap_handler(struct cm_work *work)
2839 cm_init_av_for_response(work->port, work->mad_recv_wc->wc, 2905 cm_init_av_for_response(work->port, work->mad_recv_wc->wc,
2840 work->mad_recv_wc->recv_buf.grh, 2906 work->mad_recv_wc->recv_buf.grh,
2841 &cm_id_priv->av); 2907 &cm_id_priv->av);
2842 cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av); 2908 cm_init_av_by_path(param->alternate_path, &cm_id_priv->alt_av,
2909 cm_id_priv);
2843 ret = atomic_inc_and_test(&cm_id_priv->work_count); 2910 ret = atomic_inc_and_test(&cm_id_priv->work_count);
2844 if (!ret) 2911 if (!ret)
2845 list_add_tail(&work->list, &cm_id_priv->work_list); 2912 list_add_tail(&work->list, &cm_id_priv->work_list);
@@ -3031,7 +3098,7 @@ int ib_send_cm_sidr_req(struct ib_cm_id *cm_id,
3031 return -EINVAL; 3098 return -EINVAL;
3032 3099
3033 cm_id_priv = container_of(cm_id, struct cm_id_private, id); 3100 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
3034 ret = cm_init_av_by_path(param->path, &cm_id_priv->av); 3101 ret = cm_init_av_by_path(param->path, &cm_id_priv->av, cm_id_priv);
3035 if (ret) 3102 if (ret)
3036 goto out; 3103 goto out;
3037 3104
@@ -3468,7 +3535,9 @@ out:
3468static int cm_migrate(struct ib_cm_id *cm_id) 3535static int cm_migrate(struct ib_cm_id *cm_id)
3469{ 3536{
3470 struct cm_id_private *cm_id_priv; 3537 struct cm_id_private *cm_id_priv;
3538 struct cm_av tmp_av;
3471 unsigned long flags; 3539 unsigned long flags;
3540 int tmp_send_port_not_ready;
3472 int ret = 0; 3541 int ret = 0;
3473 3542
3474 cm_id_priv = container_of(cm_id, struct cm_id_private, id); 3543 cm_id_priv = container_of(cm_id, struct cm_id_private, id);
@@ -3477,7 +3546,14 @@ static int cm_migrate(struct ib_cm_id *cm_id)
3477 (cm_id->lap_state == IB_CM_LAP_UNINIT || 3546 (cm_id->lap_state == IB_CM_LAP_UNINIT ||
3478 cm_id->lap_state == IB_CM_LAP_IDLE)) { 3547 cm_id->lap_state == IB_CM_LAP_IDLE)) {
3479 cm_id->lap_state = IB_CM_LAP_IDLE; 3548 cm_id->lap_state = IB_CM_LAP_IDLE;
3549 /* Swap address vector */
3550 tmp_av = cm_id_priv->av;
3480 cm_id_priv->av = cm_id_priv->alt_av; 3551 cm_id_priv->av = cm_id_priv->alt_av;
3552 cm_id_priv->alt_av = tmp_av;
3553 /* Swap port send ready state */
3554 tmp_send_port_not_ready = cm_id_priv->prim_send_port_not_ready;
3555 cm_id_priv->prim_send_port_not_ready = cm_id_priv->altr_send_port_not_ready;
3556 cm_id_priv->altr_send_port_not_ready = tmp_send_port_not_ready;
3481 } else 3557 } else
3482 ret = -EINVAL; 3558 ret = -EINVAL;
3483 spin_unlock_irqrestore(&cm_id_priv->lock, flags); 3559 spin_unlock_irqrestore(&cm_id_priv->lock, flags);
@@ -3888,6 +3964,9 @@ static void cm_add_one(struct ib_device *ib_device)
3888 port->cm_dev = cm_dev; 3964 port->cm_dev = cm_dev;
3889 port->port_num = i; 3965 port->port_num = i;
3890 3966
3967 INIT_LIST_HEAD(&port->cm_priv_prim_list);
3968 INIT_LIST_HEAD(&port->cm_priv_altr_list);
3969
3891 ret = cm_create_port_fs(port); 3970 ret = cm_create_port_fs(port);
3892 if (ret) 3971 if (ret)
3893 goto error1; 3972 goto error1;
@@ -3945,6 +4024,8 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
3945{ 4024{
3946 struct cm_device *cm_dev = client_data; 4025 struct cm_device *cm_dev = client_data;
3947 struct cm_port *port; 4026 struct cm_port *port;
4027 struct cm_id_private *cm_id_priv;
4028 struct ib_mad_agent *cur_mad_agent;
3948 struct ib_port_modify port_modify = { 4029 struct ib_port_modify port_modify = {
3949 .clr_port_cap_mask = IB_PORT_CM_SUP 4030 .clr_port_cap_mask = IB_PORT_CM_SUP
3950 }; 4031 };
@@ -3968,15 +4049,27 @@ static void cm_remove_one(struct ib_device *ib_device, void *client_data)
3968 4049
3969 port = cm_dev->port[i-1]; 4050 port = cm_dev->port[i-1];
3970 ib_modify_port(ib_device, port->port_num, 0, &port_modify); 4051 ib_modify_port(ib_device, port->port_num, 0, &port_modify);
4052 /* Mark all the cm_id's as not valid */
4053 spin_lock_irq(&cm.lock);
4054 list_for_each_entry(cm_id_priv, &port->cm_priv_altr_list, altr_list)
4055 cm_id_priv->altr_send_port_not_ready = 1;
4056 list_for_each_entry(cm_id_priv, &port->cm_priv_prim_list, prim_list)
4057 cm_id_priv->prim_send_port_not_ready = 1;
4058 spin_unlock_irq(&cm.lock);
3971 /* 4059 /*
3972 * We flush the queue here after the going_down set, this 4060 * We flush the queue here after the going_down set, this
3973 * verify that no new works will be queued in the recv handler, 4061 * verify that no new works will be queued in the recv handler,
3974 * after that we can call the unregister_mad_agent 4062 * after that we can call the unregister_mad_agent
3975 */ 4063 */
3976 flush_workqueue(cm.wq); 4064 flush_workqueue(cm.wq);
3977 ib_unregister_mad_agent(port->mad_agent); 4065 spin_lock_irq(&cm.state_lock);
4066 cur_mad_agent = port->mad_agent;
4067 port->mad_agent = NULL;
4068 spin_unlock_irq(&cm.state_lock);
4069 ib_unregister_mad_agent(cur_mad_agent);
3978 cm_remove_port_fs(port); 4070 cm_remove_port_fs(port);
3979 } 4071 }
4072
3980 device_unregister(cm_dev->device); 4073 device_unregister(cm_dev->device);
3981 kfree(cm_dev); 4074 kfree(cm_dev);
3982} 4075}
@@ -3989,6 +4082,7 @@ static int __init ib_cm_init(void)
3989 INIT_LIST_HEAD(&cm.device_list); 4082 INIT_LIST_HEAD(&cm.device_list);
3990 rwlock_init(&cm.device_lock); 4083 rwlock_init(&cm.device_lock);
3991 spin_lock_init(&cm.lock); 4084 spin_lock_init(&cm.lock);
4085 spin_lock_init(&cm.state_lock);
3992 cm.listen_service_table = RB_ROOT; 4086 cm.listen_service_table = RB_ROOT;
3993 cm.listen_service_id = be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID); 4087 cm.listen_service_id = be64_to_cpu(IB_CM_ASSIGN_SERVICE_ID);
3994 cm.remote_id_table = RB_ROOT; 4088 cm.remote_id_table = RB_ROOT;
diff --git a/drivers/infiniband/core/cma.c b/drivers/infiniband/core/cma.c
index 36bf50ebb187..2a6fc47a1dfb 100644
--- a/drivers/infiniband/core/cma.c
+++ b/drivers/infiniband/core/cma.c
@@ -1094,47 +1094,47 @@ static void cma_save_ib_info(struct sockaddr *src_addr,
1094 } 1094 }
1095} 1095}
1096 1096
1097static void cma_save_ip4_info(struct sockaddr *src_addr, 1097static void cma_save_ip4_info(struct sockaddr_in *src_addr,
1098 struct sockaddr *dst_addr, 1098 struct sockaddr_in *dst_addr,
1099 struct cma_hdr *hdr, 1099 struct cma_hdr *hdr,
1100 __be16 local_port) 1100 __be16 local_port)
1101{ 1101{
1102 struct sockaddr_in *ip4;
1103
1104 if (src_addr) { 1102 if (src_addr) {
1105 ip4 = (struct sockaddr_in *)src_addr; 1103 *src_addr = (struct sockaddr_in) {
1106 ip4->sin_family = AF_INET; 1104 .sin_family = AF_INET,
1107 ip4->sin_addr.s_addr = hdr->dst_addr.ip4.addr; 1105 .sin_addr.s_addr = hdr->dst_addr.ip4.addr,
1108 ip4->sin_port = local_port; 1106 .sin_port = local_port,
1107 };
1109 } 1108 }
1110 1109
1111 if (dst_addr) { 1110 if (dst_addr) {
1112 ip4 = (struct sockaddr_in *)dst_addr; 1111 *dst_addr = (struct sockaddr_in) {
1113 ip4->sin_family = AF_INET; 1112 .sin_family = AF_INET,
1114 ip4->sin_addr.s_addr = hdr->src_addr.ip4.addr; 1113 .sin_addr.s_addr = hdr->src_addr.ip4.addr,
1115 ip4->sin_port = hdr->port; 1114 .sin_port = hdr->port,
1115 };
1116 } 1116 }
1117} 1117}
1118 1118
1119static void cma_save_ip6_info(struct sockaddr *src_addr, 1119static void cma_save_ip6_info(struct sockaddr_in6 *src_addr,
1120 struct sockaddr *dst_addr, 1120 struct sockaddr_in6 *dst_addr,
1121 struct cma_hdr *hdr, 1121 struct cma_hdr *hdr,
1122 __be16 local_port) 1122 __be16 local_port)
1123{ 1123{
1124 struct sockaddr_in6 *ip6;
1125
1126 if (src_addr) { 1124 if (src_addr) {
1127 ip6 = (struct sockaddr_in6 *)src_addr; 1125 *src_addr = (struct sockaddr_in6) {
1128 ip6->sin6_family = AF_INET6; 1126 .sin6_family = AF_INET6,
1129 ip6->sin6_addr = hdr->dst_addr.ip6; 1127 .sin6_addr = hdr->dst_addr.ip6,
1130 ip6->sin6_port = local_port; 1128 .sin6_port = local_port,
1129 };
1131 } 1130 }
1132 1131
1133 if (dst_addr) { 1132 if (dst_addr) {
1134 ip6 = (struct sockaddr_in6 *)dst_addr; 1133 *dst_addr = (struct sockaddr_in6) {
1135 ip6->sin6_family = AF_INET6; 1134 .sin6_family = AF_INET6,
1136 ip6->sin6_addr = hdr->src_addr.ip6; 1135 .sin6_addr = hdr->src_addr.ip6,
1137 ip6->sin6_port = hdr->port; 1136 .sin6_port = hdr->port,
1137 };
1138 } 1138 }
1139} 1139}
1140 1140
@@ -1159,10 +1159,12 @@ static int cma_save_ip_info(struct sockaddr *src_addr,
1159 1159
1160 switch (cma_get_ip_ver(hdr)) { 1160 switch (cma_get_ip_ver(hdr)) {
1161 case 4: 1161 case 4:
1162 cma_save_ip4_info(src_addr, dst_addr, hdr, port); 1162 cma_save_ip4_info((struct sockaddr_in *)src_addr,
1163 (struct sockaddr_in *)dst_addr, hdr, port);
1163 break; 1164 break;
1164 case 6: 1165 case 6:
1165 cma_save_ip6_info(src_addr, dst_addr, hdr, port); 1166 cma_save_ip6_info((struct sockaddr_in6 *)src_addr,
1167 (struct sockaddr_in6 *)dst_addr, hdr, port);
1166 break; 1168 break;
1167 default: 1169 default:
1168 return -EAFNOSUPPORT; 1170 return -EAFNOSUPPORT;
@@ -2436,6 +2438,18 @@ static int iboe_tos_to_sl(struct net_device *ndev, int tos)
2436 return 0; 2438 return 0;
2437} 2439}
2438 2440
2441static enum ib_gid_type cma_route_gid_type(enum rdma_network_type network_type,
2442 unsigned long supported_gids,
2443 enum ib_gid_type default_gid)
2444{
2445 if ((network_type == RDMA_NETWORK_IPV4 ||
2446 network_type == RDMA_NETWORK_IPV6) &&
2447 test_bit(IB_GID_TYPE_ROCE_UDP_ENCAP, &supported_gids))
2448 return IB_GID_TYPE_ROCE_UDP_ENCAP;
2449
2450 return default_gid;
2451}
2452
2439static int cma_resolve_iboe_route(struct rdma_id_private *id_priv) 2453static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
2440{ 2454{
2441 struct rdma_route *route = &id_priv->id.route; 2455 struct rdma_route *route = &id_priv->id.route;
@@ -2461,6 +2475,8 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
2461 route->num_paths = 1; 2475 route->num_paths = 1;
2462 2476
2463 if (addr->dev_addr.bound_dev_if) { 2477 if (addr->dev_addr.bound_dev_if) {
2478 unsigned long supported_gids;
2479
2464 ndev = dev_get_by_index(&init_net, addr->dev_addr.bound_dev_if); 2480 ndev = dev_get_by_index(&init_net, addr->dev_addr.bound_dev_if);
2465 if (!ndev) { 2481 if (!ndev) {
2466 ret = -ENODEV; 2482 ret = -ENODEV;
@@ -2484,7 +2500,12 @@ static int cma_resolve_iboe_route(struct rdma_id_private *id_priv)
2484 2500
2485 route->path_rec->net = &init_net; 2501 route->path_rec->net = &init_net;
2486 route->path_rec->ifindex = ndev->ifindex; 2502 route->path_rec->ifindex = ndev->ifindex;
2487 route->path_rec->gid_type = id_priv->gid_type; 2503 supported_gids = roce_gid_type_mask_support(id_priv->id.device,
2504 id_priv->id.port_num);
2505 route->path_rec->gid_type =
2506 cma_route_gid_type(addr->dev_addr.network,
2507 supported_gids,
2508 id_priv->gid_type);
2488 } 2509 }
2489 if (!ndev) { 2510 if (!ndev) {
2490 ret = -ENODEV; 2511 ret = -ENODEV;
diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
index 224ad274ea0b..84b4eff90395 100644
--- a/drivers/infiniband/core/umem.c
+++ b/drivers/infiniband/core/umem.c
@@ -175,7 +175,7 @@ struct ib_umem *ib_umem_get(struct ib_ucontext *context, unsigned long addr,
175 175
176 cur_base = addr & PAGE_MASK; 176 cur_base = addr & PAGE_MASK;
177 177
178 if (npages == 0) { 178 if (npages == 0 || npages > UINT_MAX) {
179 ret = -EINVAL; 179 ret = -EINVAL;
180 goto out; 180 goto out;
181 } 181 }
diff --git a/drivers/infiniband/core/uverbs_main.c b/drivers/infiniband/core/uverbs_main.c
index 0012fa58c105..44b1104eb168 100644
--- a/drivers/infiniband/core/uverbs_main.c
+++ b/drivers/infiniband/core/uverbs_main.c
@@ -262,12 +262,9 @@ static int ib_uverbs_cleanup_ucontext(struct ib_uverbs_file *file,
262 container_of(uobj, struct ib_uqp_object, uevent.uobject); 262 container_of(uobj, struct ib_uqp_object, uevent.uobject);
263 263
264 idr_remove_uobj(&ib_uverbs_qp_idr, uobj); 264 idr_remove_uobj(&ib_uverbs_qp_idr, uobj);
265 if (qp != qp->real_qp) { 265 if (qp == qp->real_qp)
266 ib_close_qp(qp);
267 } else {
268 ib_uverbs_detach_umcast(qp, uqp); 266 ib_uverbs_detach_umcast(qp, uqp);
269 ib_destroy_qp(qp); 267 ib_destroy_qp(qp);
270 }
271 ib_uverbs_release_uevent(file, &uqp->uevent); 268 ib_uverbs_release_uevent(file, &uqp->uevent);
272 kfree(uqp); 269 kfree(uqp);
273 } 270 }
diff --git a/drivers/infiniband/hw/cxgb4/cq.c b/drivers/infiniband/hw/cxgb4/cq.c
index 867b8cf82be8..19c6477af19f 100644
--- a/drivers/infiniband/hw/cxgb4/cq.c
+++ b/drivers/infiniband/hw/cxgb4/cq.c
@@ -666,18 +666,6 @@ skip_cqe:
666 return ret; 666 return ret;
667} 667}
668 668
669static void invalidate_mr(struct c4iw_dev *rhp, u32 rkey)
670{
671 struct c4iw_mr *mhp;
672 unsigned long flags;
673
674 spin_lock_irqsave(&rhp->lock, flags);
675 mhp = get_mhp(rhp, rkey >> 8);
676 if (mhp)
677 mhp->attr.state = 0;
678 spin_unlock_irqrestore(&rhp->lock, flags);
679}
680
681/* 669/*
682 * Get one cq entry from c4iw and map it to openib. 670 * Get one cq entry from c4iw and map it to openib.
683 * 671 *
@@ -733,7 +721,7 @@ static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
733 CQE_OPCODE(&cqe) == FW_RI_SEND_WITH_SE_INV) { 721 CQE_OPCODE(&cqe) == FW_RI_SEND_WITH_SE_INV) {
734 wc->ex.invalidate_rkey = CQE_WRID_STAG(&cqe); 722 wc->ex.invalidate_rkey = CQE_WRID_STAG(&cqe);
735 wc->wc_flags |= IB_WC_WITH_INVALIDATE; 723 wc->wc_flags |= IB_WC_WITH_INVALIDATE;
736 invalidate_mr(qhp->rhp, wc->ex.invalidate_rkey); 724 c4iw_invalidate_mr(qhp->rhp, wc->ex.invalidate_rkey);
737 } 725 }
738 } else { 726 } else {
739 switch (CQE_OPCODE(&cqe)) { 727 switch (CQE_OPCODE(&cqe)) {
@@ -762,7 +750,8 @@ static int c4iw_poll_cq_one(struct c4iw_cq *chp, struct ib_wc *wc)
762 750
763 /* Invalidate the MR if the fastreg failed */ 751 /* Invalidate the MR if the fastreg failed */
764 if (CQE_STATUS(&cqe) != T4_ERR_SUCCESS) 752 if (CQE_STATUS(&cqe) != T4_ERR_SUCCESS)
765 invalidate_mr(qhp->rhp, CQE_WRID_FR_STAG(&cqe)); 753 c4iw_invalidate_mr(qhp->rhp,
754 CQE_WRID_FR_STAG(&cqe));
766 break; 755 break;
767 default: 756 default:
768 printk(KERN_ERR MOD "Unexpected opcode %d " 757 printk(KERN_ERR MOD "Unexpected opcode %d "
diff --git a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
index 7e7f79e55006..4788e1a46fde 100644
--- a/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
+++ b/drivers/infiniband/hw/cxgb4/iw_cxgb4.h
@@ -999,6 +999,6 @@ extern int db_coalescing_threshold;
999extern int use_dsgl; 999extern int use_dsgl;
1000void c4iw_drain_rq(struct ib_qp *qp); 1000void c4iw_drain_rq(struct ib_qp *qp);
1001void c4iw_drain_sq(struct ib_qp *qp); 1001void c4iw_drain_sq(struct ib_qp *qp);
1002 1002void c4iw_invalidate_mr(struct c4iw_dev *rhp, u32 rkey);
1003 1003
1004#endif 1004#endif
diff --git a/drivers/infiniband/hw/cxgb4/mem.c b/drivers/infiniband/hw/cxgb4/mem.c
index 80e27749420a..410408f886c1 100644
--- a/drivers/infiniband/hw/cxgb4/mem.c
+++ b/drivers/infiniband/hw/cxgb4/mem.c
@@ -770,3 +770,15 @@ int c4iw_dereg_mr(struct ib_mr *ib_mr)
770 kfree(mhp); 770 kfree(mhp);
771 return 0; 771 return 0;
772} 772}
773
774void c4iw_invalidate_mr(struct c4iw_dev *rhp, u32 rkey)
775{
776 struct c4iw_mr *mhp;
777 unsigned long flags;
778
779 spin_lock_irqsave(&rhp->lock, flags);
780 mhp = get_mhp(rhp, rkey >> 8);
781 if (mhp)
782 mhp->attr.state = 0;
783 spin_unlock_irqrestore(&rhp->lock, flags);
784}
diff --git a/drivers/infiniband/hw/cxgb4/qp.c b/drivers/infiniband/hw/cxgb4/qp.c
index f57deba6717c..b7ac97b27c88 100644
--- a/drivers/infiniband/hw/cxgb4/qp.c
+++ b/drivers/infiniband/hw/cxgb4/qp.c
@@ -706,12 +706,8 @@ static int build_memreg(struct t4_sq *sq, union t4_wr *wqe,
706 return 0; 706 return 0;
707} 707}
708 708
709static int build_inv_stag(struct c4iw_dev *dev, union t4_wr *wqe, 709static int build_inv_stag(union t4_wr *wqe, struct ib_send_wr *wr, u8 *len16)
710 struct ib_send_wr *wr, u8 *len16)
711{ 710{
712 struct c4iw_mr *mhp = get_mhp(dev, wr->ex.invalidate_rkey >> 8);
713
714 mhp->attr.state = 0;
715 wqe->inv.stag_inv = cpu_to_be32(wr->ex.invalidate_rkey); 711 wqe->inv.stag_inv = cpu_to_be32(wr->ex.invalidate_rkey);
716 wqe->inv.r2 = 0; 712 wqe->inv.r2 = 0;
717 *len16 = DIV_ROUND_UP(sizeof wqe->inv, 16); 713 *len16 = DIV_ROUND_UP(sizeof wqe->inv, 16);
@@ -797,11 +793,13 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
797 spin_lock_irqsave(&qhp->lock, flag); 793 spin_lock_irqsave(&qhp->lock, flag);
798 if (t4_wq_in_error(&qhp->wq)) { 794 if (t4_wq_in_error(&qhp->wq)) {
799 spin_unlock_irqrestore(&qhp->lock, flag); 795 spin_unlock_irqrestore(&qhp->lock, flag);
796 *bad_wr = wr;
800 return -EINVAL; 797 return -EINVAL;
801 } 798 }
802 num_wrs = t4_sq_avail(&qhp->wq); 799 num_wrs = t4_sq_avail(&qhp->wq);
803 if (num_wrs == 0) { 800 if (num_wrs == 0) {
804 spin_unlock_irqrestore(&qhp->lock, flag); 801 spin_unlock_irqrestore(&qhp->lock, flag);
802 *bad_wr = wr;
805 return -ENOMEM; 803 return -ENOMEM;
806 } 804 }
807 while (wr) { 805 while (wr) {
@@ -840,10 +838,13 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
840 case IB_WR_RDMA_READ_WITH_INV: 838 case IB_WR_RDMA_READ_WITH_INV:
841 fw_opcode = FW_RI_RDMA_READ_WR; 839 fw_opcode = FW_RI_RDMA_READ_WR;
842 swsqe->opcode = FW_RI_READ_REQ; 840 swsqe->opcode = FW_RI_READ_REQ;
843 if (wr->opcode == IB_WR_RDMA_READ_WITH_INV) 841 if (wr->opcode == IB_WR_RDMA_READ_WITH_INV) {
842 c4iw_invalidate_mr(qhp->rhp,
843 wr->sg_list[0].lkey);
844 fw_flags = FW_RI_RDMA_READ_INVALIDATE; 844 fw_flags = FW_RI_RDMA_READ_INVALIDATE;
845 else 845 } else {
846 fw_flags = 0; 846 fw_flags = 0;
847 }
847 err = build_rdma_read(wqe, wr, &len16); 848 err = build_rdma_read(wqe, wr, &len16);
848 if (err) 849 if (err)
849 break; 850 break;
@@ -876,7 +877,8 @@ int c4iw_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
876 fw_flags |= FW_RI_LOCAL_FENCE_FLAG; 877 fw_flags |= FW_RI_LOCAL_FENCE_FLAG;
877 fw_opcode = FW_RI_INV_LSTAG_WR; 878 fw_opcode = FW_RI_INV_LSTAG_WR;
878 swsqe->opcode = FW_RI_LOCAL_INV; 879 swsqe->opcode = FW_RI_LOCAL_INV;
879 err = build_inv_stag(qhp->rhp, wqe, wr, &len16); 880 err = build_inv_stag(wqe, wr, &len16);
881 c4iw_invalidate_mr(qhp->rhp, wr->ex.invalidate_rkey);
880 break; 882 break;
881 default: 883 default:
882 PDBG("%s post of type=%d TBD!\n", __func__, 884 PDBG("%s post of type=%d TBD!\n", __func__,
@@ -934,11 +936,13 @@ int c4iw_post_receive(struct ib_qp *ibqp, struct ib_recv_wr *wr,
934 spin_lock_irqsave(&qhp->lock, flag); 936 spin_lock_irqsave(&qhp->lock, flag);
935 if (t4_wq_in_error(&qhp->wq)) { 937 if (t4_wq_in_error(&qhp->wq)) {
936 spin_unlock_irqrestore(&qhp->lock, flag); 938 spin_unlock_irqrestore(&qhp->lock, flag);
939 *bad_wr = wr;
937 return -EINVAL; 940 return -EINVAL;
938 } 941 }
939 num_wrs = t4_rq_avail(&qhp->wq); 942 num_wrs = t4_rq_avail(&qhp->wq);
940 if (num_wrs == 0) { 943 if (num_wrs == 0) {
941 spin_unlock_irqrestore(&qhp->lock, flag); 944 spin_unlock_irqrestore(&qhp->lock, flag);
945 *bad_wr = wr;
942 return -ENOMEM; 946 return -ENOMEM;
943 } 947 }
944 while (wr) { 948 while (wr) {
diff --git a/drivers/infiniband/hw/hfi1/affinity.c b/drivers/infiniband/hw/hfi1/affinity.c
index a26a9a0bfc41..67ea85a56945 100644
--- a/drivers/infiniband/hw/hfi1/affinity.c
+++ b/drivers/infiniband/hw/hfi1/affinity.c
@@ -775,75 +775,3 @@ void hfi1_put_proc_affinity(int cpu)
775 } 775 }
776 mutex_unlock(&affinity->lock); 776 mutex_unlock(&affinity->lock);
777} 777}
778
779int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
780 size_t count)
781{
782 struct hfi1_affinity_node *entry;
783 cpumask_var_t mask;
784 int ret, i;
785
786 mutex_lock(&node_affinity.lock);
787 entry = node_affinity_lookup(dd->node);
788
789 if (!entry) {
790 ret = -EINVAL;
791 goto unlock;
792 }
793
794 ret = zalloc_cpumask_var(&mask, GFP_KERNEL);
795 if (!ret) {
796 ret = -ENOMEM;
797 goto unlock;
798 }
799
800 ret = cpulist_parse(buf, mask);
801 if (ret)
802 goto out;
803
804 if (!cpumask_subset(mask, cpu_online_mask) || cpumask_empty(mask)) {
805 dd_dev_warn(dd, "Invalid CPU mask\n");
806 ret = -EINVAL;
807 goto out;
808 }
809
810 /* reset the SDMA interrupt affinity details */
811 init_cpu_mask_set(&entry->def_intr);
812 cpumask_copy(&entry->def_intr.mask, mask);
813
814 /* Reassign the affinity for each SDMA interrupt. */
815 for (i = 0; i < dd->num_msix_entries; i++) {
816 struct hfi1_msix_entry *msix;
817
818 msix = &dd->msix_entries[i];
819 if (msix->type != IRQ_SDMA)
820 continue;
821
822 ret = get_irq_affinity(dd, msix);
823
824 if (ret)
825 break;
826 }
827out:
828 free_cpumask_var(mask);
829unlock:
830 mutex_unlock(&node_affinity.lock);
831 return ret ? ret : strnlen(buf, PAGE_SIZE);
832}
833
834int hfi1_get_sdma_affinity(struct hfi1_devdata *dd, char *buf)
835{
836 struct hfi1_affinity_node *entry;
837
838 mutex_lock(&node_affinity.lock);
839 entry = node_affinity_lookup(dd->node);
840
841 if (!entry) {
842 mutex_unlock(&node_affinity.lock);
843 return -EINVAL;
844 }
845
846 cpumap_print_to_pagebuf(true, buf, &entry->def_intr.mask);
847 mutex_unlock(&node_affinity.lock);
848 return strnlen(buf, PAGE_SIZE);
849}
diff --git a/drivers/infiniband/hw/hfi1/affinity.h b/drivers/infiniband/hw/hfi1/affinity.h
index b89ea3c0ee1a..42e63316afd1 100644
--- a/drivers/infiniband/hw/hfi1/affinity.h
+++ b/drivers/infiniband/hw/hfi1/affinity.h
@@ -102,10 +102,6 @@ int hfi1_get_proc_affinity(int);
102/* Release a CPU used by a user process. */ 102/* Release a CPU used by a user process. */
103void hfi1_put_proc_affinity(int); 103void hfi1_put_proc_affinity(int);
104 104
105int hfi1_get_sdma_affinity(struct hfi1_devdata *dd, char *buf);
106int hfi1_set_sdma_affinity(struct hfi1_devdata *dd, const char *buf,
107 size_t count);
108
109struct hfi1_affinity_node { 105struct hfi1_affinity_node {
110 int node; 106 int node;
111 struct cpu_mask_set def_intr; 107 struct cpu_mask_set def_intr;
diff --git a/drivers/infiniband/hw/hfi1/chip.c b/drivers/infiniband/hw/hfi1/chip.c
index 9bf5f23544d4..24d0820873cf 100644
--- a/drivers/infiniband/hw/hfi1/chip.c
+++ b/drivers/infiniband/hw/hfi1/chip.c
@@ -6301,19 +6301,8 @@ void set_up_vl15(struct hfi1_devdata *dd, u8 vau, u16 vl15buf)
6301 /* leave shared count at zero for both global and VL15 */ 6301 /* leave shared count at zero for both global and VL15 */
6302 write_global_credit(dd, vau, vl15buf, 0); 6302 write_global_credit(dd, vau, vl15buf, 0);
6303 6303
6304 /* We may need some credits for another VL when sending packets 6304 write_csr(dd, SEND_CM_CREDIT_VL15, (u64)vl15buf
6305 * with the snoop interface. Dividing it down the middle for VL15 6305 << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
6306 * and VL0 should suffice.
6307 */
6308 if (unlikely(dd->hfi1_snoop.mode_flag == HFI1_PORT_SNOOP_MODE)) {
6309 write_csr(dd, SEND_CM_CREDIT_VL15, (u64)(vl15buf >> 1)
6310 << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
6311 write_csr(dd, SEND_CM_CREDIT_VL, (u64)(vl15buf >> 1)
6312 << SEND_CM_CREDIT_VL_DEDICATED_LIMIT_VL_SHIFT);
6313 } else {
6314 write_csr(dd, SEND_CM_CREDIT_VL15, (u64)vl15buf
6315 << SEND_CM_CREDIT_VL15_DEDICATED_LIMIT_VL_SHIFT);
6316 }
6317} 6306}
6318 6307
6319/* 6308/*
@@ -9915,9 +9904,6 @@ static void set_lidlmc(struct hfi1_pportdata *ppd)
9915 u32 mask = ~((1U << ppd->lmc) - 1); 9904 u32 mask = ~((1U << ppd->lmc) - 1);
9916 u64 c1 = read_csr(ppd->dd, DCC_CFG_PORT_CONFIG1); 9905 u64 c1 = read_csr(ppd->dd, DCC_CFG_PORT_CONFIG1);
9917 9906
9918 if (dd->hfi1_snoop.mode_flag)
9919 dd_dev_info(dd, "Set lid/lmc while snooping");
9920
9921 c1 &= ~(DCC_CFG_PORT_CONFIG1_TARGET_DLID_SMASK 9907 c1 &= ~(DCC_CFG_PORT_CONFIG1_TARGET_DLID_SMASK
9922 | DCC_CFG_PORT_CONFIG1_DLID_MASK_SMASK); 9908 | DCC_CFG_PORT_CONFIG1_DLID_MASK_SMASK);
9923 c1 |= ((ppd->lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK) 9909 c1 |= ((ppd->lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK)
@@ -12112,7 +12098,7 @@ static void update_synth_timer(unsigned long opaque)
12112 mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME); 12098 mod_timer(&dd->synth_stats_timer, jiffies + HZ * SYNTH_CNT_TIME);
12113} 12099}
12114 12100
12115#define C_MAX_NAME 13 /* 12 chars + one for /0 */ 12101#define C_MAX_NAME 16 /* 15 chars + one for /0 */
12116static int init_cntrs(struct hfi1_devdata *dd) 12102static int init_cntrs(struct hfi1_devdata *dd)
12117{ 12103{
12118 int i, rcv_ctxts, j; 12104 int i, rcv_ctxts, j;
@@ -14463,7 +14449,7 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
14463 * Any error printing is already done by the init code. 14449 * Any error printing is already done by the init code.
14464 * On return, we have the chip mapped. 14450 * On return, we have the chip mapped.
14465 */ 14451 */
14466 ret = hfi1_pcie_ddinit(dd, pdev, ent); 14452 ret = hfi1_pcie_ddinit(dd, pdev);
14467 if (ret < 0) 14453 if (ret < 0)
14468 goto bail_free; 14454 goto bail_free;
14469 14455
@@ -14691,6 +14677,11 @@ struct hfi1_devdata *hfi1_init_dd(struct pci_dev *pdev,
14691 if (ret) 14677 if (ret)
14692 goto bail_free_cntrs; 14678 goto bail_free_cntrs;
14693 14679
14680 init_completion(&dd->user_comp);
14681
14682 /* The user refcount starts with one to inidicate an active device */
14683 atomic_set(&dd->user_refcount, 1);
14684
14694 goto bail; 14685 goto bail;
14695 14686
14696bail_free_rcverr: 14687bail_free_rcverr:
diff --git a/drivers/infiniband/hw/hfi1/chip.h b/drivers/infiniband/hw/hfi1/chip.h
index 92345259a8f4..043fd21dc5f3 100644
--- a/drivers/infiniband/hw/hfi1/chip.h
+++ b/drivers/infiniband/hw/hfi1/chip.h
@@ -320,6 +320,9 @@
320/* DC_DC8051_CFG_MODE.GENERAL bits */ 320/* DC_DC8051_CFG_MODE.GENERAL bits */
321#define DISABLE_SELF_GUID_CHECK 0x2 321#define DISABLE_SELF_GUID_CHECK 0x2
322 322
323/* Bad L2 frame error code */
324#define BAD_L2_ERR 0x6
325
323/* 326/*
324 * Eager buffer minimum and maximum sizes supported by the hardware. 327 * Eager buffer minimum and maximum sizes supported by the hardware.
325 * All power-of-two sizes in between are supported as well. 328 * All power-of-two sizes in between are supported as well.
diff --git a/drivers/infiniband/hw/hfi1/driver.c b/drivers/infiniband/hw/hfi1/driver.c
index 6563e4d38b80..c5efff29c147 100644
--- a/drivers/infiniband/hw/hfi1/driver.c
+++ b/drivers/infiniband/hw/hfi1/driver.c
@@ -599,7 +599,6 @@ static void __prescan_rxq(struct hfi1_packet *packet)
599 dd->rhf_offset; 599 dd->rhf_offset;
600 struct rvt_qp *qp; 600 struct rvt_qp *qp;
601 struct ib_header *hdr; 601 struct ib_header *hdr;
602 struct ib_other_headers *ohdr;
603 struct rvt_dev_info *rdi = &dd->verbs_dev.rdi; 602 struct rvt_dev_info *rdi = &dd->verbs_dev.rdi;
604 u64 rhf = rhf_to_cpu(rhf_addr); 603 u64 rhf = rhf_to_cpu(rhf_addr);
605 u32 etype = rhf_rcv_type(rhf), qpn, bth1; 604 u32 etype = rhf_rcv_type(rhf), qpn, bth1;
@@ -615,18 +614,21 @@ static void __prescan_rxq(struct hfi1_packet *packet)
615 if (etype != RHF_RCV_TYPE_IB) 614 if (etype != RHF_RCV_TYPE_IB)
616 goto next; 615 goto next;
617 616
618 hdr = hfi1_get_msgheader(dd, rhf_addr); 617 packet->hdr = hfi1_get_msgheader(dd, rhf_addr);
618 hdr = packet->hdr;
619 619
620 lnh = be16_to_cpu(hdr->lrh[0]) & 3; 620 lnh = be16_to_cpu(hdr->lrh[0]) & 3;
621 621
622 if (lnh == HFI1_LRH_BTH) 622 if (lnh == HFI1_LRH_BTH) {
623 ohdr = &hdr->u.oth; 623 packet->ohdr = &hdr->u.oth;
624 else if (lnh == HFI1_LRH_GRH) 624 } else if (lnh == HFI1_LRH_GRH) {
625 ohdr = &hdr->u.l.oth; 625 packet->ohdr = &hdr->u.l.oth;
626 else 626 packet->rcv_flags |= HFI1_HAS_GRH;
627 } else {
627 goto next; /* just in case */ 628 goto next; /* just in case */
629 }
628 630
629 bth1 = be32_to_cpu(ohdr->bth[1]); 631 bth1 = be32_to_cpu(packet->ohdr->bth[1]);
630 is_ecn = !!(bth1 & (HFI1_FECN_SMASK | HFI1_BECN_SMASK)); 632 is_ecn = !!(bth1 & (HFI1_FECN_SMASK | HFI1_BECN_SMASK));
631 633
632 if (!is_ecn) 634 if (!is_ecn)
@@ -646,7 +648,7 @@ static void __prescan_rxq(struct hfi1_packet *packet)
646 648
647 /* turn off BECN, FECN */ 649 /* turn off BECN, FECN */
648 bth1 &= ~(HFI1_FECN_SMASK | HFI1_BECN_SMASK); 650 bth1 &= ~(HFI1_FECN_SMASK | HFI1_BECN_SMASK);
649 ohdr->bth[1] = cpu_to_be32(bth1); 651 packet->ohdr->bth[1] = cpu_to_be32(bth1);
650next: 652next:
651 update_ps_mdata(&mdata, rcd); 653 update_ps_mdata(&mdata, rcd);
652 } 654 }
@@ -1360,12 +1362,25 @@ int process_receive_ib(struct hfi1_packet *packet)
1360 1362
1361int process_receive_bypass(struct hfi1_packet *packet) 1363int process_receive_bypass(struct hfi1_packet *packet)
1362{ 1364{
1365 struct hfi1_devdata *dd = packet->rcd->dd;
1366
1363 if (unlikely(rhf_err_flags(packet->rhf))) 1367 if (unlikely(rhf_err_flags(packet->rhf)))
1364 handle_eflags(packet); 1368 handle_eflags(packet);
1365 1369
1366 dd_dev_err(packet->rcd->dd, 1370 dd_dev_err(dd,
1367 "Bypass packets are not supported in normal operation. Dropping\n"); 1371 "Bypass packets are not supported in normal operation. Dropping\n");
1368 incr_cntr64(&packet->rcd->dd->sw_rcv_bypass_packet_errors); 1372 incr_cntr64(&dd->sw_rcv_bypass_packet_errors);
1373 if (!(dd->err_info_rcvport.status_and_code & OPA_EI_STATUS_SMASK)) {
1374 u64 *flits = packet->ebuf;
1375
1376 if (flits && !(packet->rhf & RHF_LEN_ERR)) {
1377 dd->err_info_rcvport.packet_flit1 = flits[0];
1378 dd->err_info_rcvport.packet_flit2 =
1379 packet->tlen > sizeof(flits[0]) ? flits[1] : 0;
1380 }
1381 dd->err_info_rcvport.status_and_code |=
1382 (OPA_EI_STATUS_SMASK | BAD_L2_ERR);
1383 }
1369 return RHF_RCV_CONTINUE; 1384 return RHF_RCV_CONTINUE;
1370} 1385}
1371 1386
diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
index 677efa0e8cd6..bd786b7bd30b 100644
--- a/drivers/infiniband/hw/hfi1/file_ops.c
+++ b/drivers/infiniband/hw/hfi1/file_ops.c
@@ -172,6 +172,9 @@ static int hfi1_file_open(struct inode *inode, struct file *fp)
172 struct hfi1_devdata, 172 struct hfi1_devdata,
173 user_cdev); 173 user_cdev);
174 174
175 if (!atomic_inc_not_zero(&dd->user_refcount))
176 return -ENXIO;
177
175 /* Just take a ref now. Not all opens result in a context assign */ 178 /* Just take a ref now. Not all opens result in a context assign */
176 kobject_get(&dd->kobj); 179 kobject_get(&dd->kobj);
177 180
@@ -183,11 +186,17 @@ static int hfi1_file_open(struct inode *inode, struct file *fp)
183 fd->rec_cpu_num = -1; /* no cpu affinity by default */ 186 fd->rec_cpu_num = -1; /* no cpu affinity by default */
184 fd->mm = current->mm; 187 fd->mm = current->mm;
185 atomic_inc(&fd->mm->mm_count); 188 atomic_inc(&fd->mm->mm_count);
186 } 189 fp->private_data = fd;
190 } else {
191 fp->private_data = NULL;
192
193 if (atomic_dec_and_test(&dd->user_refcount))
194 complete(&dd->user_comp);
187 195
188 fp->private_data = fd; 196 return -ENOMEM;
197 }
189 198
190 return fd ? 0 : -ENOMEM; 199 return 0;
191} 200}
192 201
193static long hfi1_file_ioctl(struct file *fp, unsigned int cmd, 202static long hfi1_file_ioctl(struct file *fp, unsigned int cmd,
@@ -798,6 +807,10 @@ static int hfi1_file_close(struct inode *inode, struct file *fp)
798done: 807done:
799 mmdrop(fdata->mm); 808 mmdrop(fdata->mm);
800 kobject_put(&dd->kobj); 809 kobject_put(&dd->kobj);
810
811 if (atomic_dec_and_test(&dd->user_refcount))
812 complete(&dd->user_comp);
813
801 kfree(fdata); 814 kfree(fdata);
802 return 0; 815 return 0;
803} 816}
diff --git a/drivers/infiniband/hw/hfi1/hfi.h b/drivers/infiniband/hw/hfi1/hfi.h
index 7eef11b316ff..cc87fd4e534b 100644
--- a/drivers/infiniband/hw/hfi1/hfi.h
+++ b/drivers/infiniband/hw/hfi1/hfi.h
@@ -367,26 +367,6 @@ struct hfi1_packet {
367 u8 etype; 367 u8 etype;
368}; 368};
369 369
370/*
371 * Private data for snoop/capture support.
372 */
373struct hfi1_snoop_data {
374 int mode_flag;
375 struct cdev cdev;
376 struct device *class_dev;
377 /* protect snoop data */
378 spinlock_t snoop_lock;
379 struct list_head queue;
380 wait_queue_head_t waitq;
381 void *filter_value;
382 int (*filter_callback)(void *hdr, void *data, void *value);
383 u64 dcc_cfg; /* saved value of DCC Cfg register */
384};
385
386/* snoop mode_flag values */
387#define HFI1_PORT_SNOOP_MODE 1U
388#define HFI1_PORT_CAPTURE_MODE 2U
389
390struct rvt_sge_state; 370struct rvt_sge_state;
391 371
392/* 372/*
@@ -613,8 +593,6 @@ struct hfi1_pportdata {
613 struct mutex hls_lock; 593 struct mutex hls_lock;
614 u32 host_link_state; 594 u32 host_link_state;
615 595
616 spinlock_t sdma_alllock ____cacheline_aligned_in_smp;
617
618 u32 lstate; /* logical link state */ 596 u32 lstate; /* logical link state */
619 597
620 /* these are the "32 bit" regs */ 598 /* these are the "32 bit" regs */
@@ -1104,8 +1082,6 @@ struct hfi1_devdata {
1104 char *portcntrnames; 1082 char *portcntrnames;
1105 size_t portcntrnameslen; 1083 size_t portcntrnameslen;
1106 1084
1107 struct hfi1_snoop_data hfi1_snoop;
1108
1109 struct err_info_rcvport err_info_rcvport; 1085 struct err_info_rcvport err_info_rcvport;
1110 struct err_info_constraint err_info_rcv_constraint; 1086 struct err_info_constraint err_info_rcv_constraint;
1111 struct err_info_constraint err_info_xmit_constraint; 1087 struct err_info_constraint err_info_xmit_constraint;
@@ -1141,8 +1117,8 @@ struct hfi1_devdata {
1141 rhf_rcv_function_ptr normal_rhf_rcv_functions[8]; 1117 rhf_rcv_function_ptr normal_rhf_rcv_functions[8];
1142 1118
1143 /* 1119 /*
1144 * Handlers for outgoing data so that snoop/capture does not 1120 * Capability to have different send engines simply by changing a
1145 * have to have its hooks in the send path 1121 * pointer value.
1146 */ 1122 */
1147 send_routine process_pio_send; 1123 send_routine process_pio_send;
1148 send_routine process_dma_send; 1124 send_routine process_dma_send;
@@ -1174,6 +1150,10 @@ struct hfi1_devdata {
1174 spinlock_t aspm_lock; 1150 spinlock_t aspm_lock;
1175 /* Number of verbs contexts which have disabled ASPM */ 1151 /* Number of verbs contexts which have disabled ASPM */
1176 atomic_t aspm_disabled_cnt; 1152 atomic_t aspm_disabled_cnt;
1153 /* Keeps track of user space clients */
1154 atomic_t user_refcount;
1155 /* Used to wait for outstanding user space clients before dev removal */
1156 struct completion user_comp;
1177 1157
1178 struct hfi1_affinity *affinity; 1158 struct hfi1_affinity *affinity;
1179 struct rhashtable sdma_rht; 1159 struct rhashtable sdma_rht;
@@ -1221,8 +1201,6 @@ struct hfi1_devdata *hfi1_lookup(int unit);
1221extern u32 hfi1_cpulist_count; 1201extern u32 hfi1_cpulist_count;
1222extern unsigned long *hfi1_cpulist; 1202extern unsigned long *hfi1_cpulist;
1223 1203
1224extern unsigned int snoop_drop_send;
1225extern unsigned int snoop_force_capture;
1226int hfi1_init(struct hfi1_devdata *, int); 1204int hfi1_init(struct hfi1_devdata *, int);
1227int hfi1_count_units(int *npresentp, int *nupp); 1205int hfi1_count_units(int *npresentp, int *nupp);
1228int hfi1_count_active_units(void); 1206int hfi1_count_active_units(void);
@@ -1557,13 +1535,6 @@ void set_up_vl15(struct hfi1_devdata *dd, u8 vau, u16 vl15buf);
1557void reset_link_credits(struct hfi1_devdata *dd); 1535void reset_link_credits(struct hfi1_devdata *dd);
1558void assign_remote_cm_au_table(struct hfi1_devdata *dd, u8 vcu); 1536void assign_remote_cm_au_table(struct hfi1_devdata *dd, u8 vcu);
1559 1537
1560int snoop_recv_handler(struct hfi1_packet *packet);
1561int snoop_send_dma_handler(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
1562 u64 pbc);
1563int snoop_send_pio_handler(struct rvt_qp *qp, struct hfi1_pkt_state *ps,
1564 u64 pbc);
1565void snoop_inline_pio_send(struct hfi1_devdata *dd, struct pio_buf *pbuf,
1566 u64 pbc, const void *from, size_t count);
1567int set_buffer_control(struct hfi1_pportdata *ppd, struct buffer_control *bc); 1538int set_buffer_control(struct hfi1_pportdata *ppd, struct buffer_control *bc);
1568 1539
1569static inline struct hfi1_devdata *dd_from_ppd(struct hfi1_pportdata *ppd) 1540static inline struct hfi1_devdata *dd_from_ppd(struct hfi1_pportdata *ppd)
@@ -1763,8 +1734,7 @@ int qsfp_dump(struct hfi1_pportdata *ppd, char *buf, int len);
1763 1734
1764int hfi1_pcie_init(struct pci_dev *, const struct pci_device_id *); 1735int hfi1_pcie_init(struct pci_dev *, const struct pci_device_id *);
1765void hfi1_pcie_cleanup(struct pci_dev *); 1736void hfi1_pcie_cleanup(struct pci_dev *);
1766int hfi1_pcie_ddinit(struct hfi1_devdata *, struct pci_dev *, 1737int hfi1_pcie_ddinit(struct hfi1_devdata *, struct pci_dev *);
1767 const struct pci_device_id *);
1768void hfi1_pcie_ddcleanup(struct hfi1_devdata *); 1738void hfi1_pcie_ddcleanup(struct hfi1_devdata *);
1769void hfi1_pcie_flr(struct hfi1_devdata *); 1739void hfi1_pcie_flr(struct hfi1_devdata *);
1770int pcie_speeds(struct hfi1_devdata *); 1740int pcie_speeds(struct hfi1_devdata *);
@@ -1799,8 +1769,6 @@ int kdeth_process_expected(struct hfi1_packet *packet);
1799int kdeth_process_eager(struct hfi1_packet *packet); 1769int kdeth_process_eager(struct hfi1_packet *packet);
1800int process_receive_invalid(struct hfi1_packet *packet); 1770int process_receive_invalid(struct hfi1_packet *packet);
1801 1771
1802extern rhf_rcv_function_ptr snoop_rhf_rcv_functions[8];
1803
1804void update_sge(struct rvt_sge_state *ss, u32 length); 1772void update_sge(struct rvt_sge_state *ss, u32 length);
1805 1773
1806/* global module parameter variables */ 1774/* global module parameter variables */
@@ -1827,9 +1795,6 @@ extern struct mutex hfi1_mutex;
1827#define DRIVER_NAME "hfi1" 1795#define DRIVER_NAME "hfi1"
1828#define HFI1_USER_MINOR_BASE 0 1796#define HFI1_USER_MINOR_BASE 0
1829#define HFI1_TRACE_MINOR 127 1797#define HFI1_TRACE_MINOR 127
1830#define HFI1_DIAGPKT_MINOR 128
1831#define HFI1_DIAG_MINOR_BASE 129
1832#define HFI1_SNOOP_CAPTURE_BASE 200
1833#define HFI1_NMINORS 255 1798#define HFI1_NMINORS 255
1834 1799
1835#define PCI_VENDOR_ID_INTEL 0x8086 1800#define PCI_VENDOR_ID_INTEL 0x8086
@@ -1848,7 +1813,13 @@ extern struct mutex hfi1_mutex;
1848static inline u64 hfi1_pkt_default_send_ctxt_mask(struct hfi1_devdata *dd, 1813static inline u64 hfi1_pkt_default_send_ctxt_mask(struct hfi1_devdata *dd,
1849 u16 ctxt_type) 1814 u16 ctxt_type)
1850{ 1815{
1851 u64 base_sc_integrity = 1816 u64 base_sc_integrity;
1817
1818 /* No integrity checks if HFI1_CAP_NO_INTEGRITY is set */
1819 if (HFI1_CAP_IS_KSET(NO_INTEGRITY))
1820 return 0;
1821
1822 base_sc_integrity =
1852 SEND_CTXT_CHECK_ENABLE_DISALLOW_BYPASS_BAD_PKT_LEN_SMASK 1823 SEND_CTXT_CHECK_ENABLE_DISALLOW_BYPASS_BAD_PKT_LEN_SMASK
1853 | SEND_CTXT_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK 1824 | SEND_CTXT_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK
1854 | SEND_CTXT_CHECK_ENABLE_DISALLOW_TOO_LONG_BYPASS_PACKETS_SMASK 1825 | SEND_CTXT_CHECK_ENABLE_DISALLOW_TOO_LONG_BYPASS_PACKETS_SMASK
@@ -1863,7 +1834,6 @@ static inline u64 hfi1_pkt_default_send_ctxt_mask(struct hfi1_devdata *dd,
1863 | SEND_CTXT_CHECK_ENABLE_CHECK_VL_MAPPING_SMASK 1834 | SEND_CTXT_CHECK_ENABLE_CHECK_VL_MAPPING_SMASK
1864 | SEND_CTXT_CHECK_ENABLE_CHECK_OPCODE_SMASK 1835 | SEND_CTXT_CHECK_ENABLE_CHECK_OPCODE_SMASK
1865 | SEND_CTXT_CHECK_ENABLE_CHECK_SLID_SMASK 1836 | SEND_CTXT_CHECK_ENABLE_CHECK_SLID_SMASK
1866 | SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK
1867 | SEND_CTXT_CHECK_ENABLE_CHECK_VL_SMASK 1837 | SEND_CTXT_CHECK_ENABLE_CHECK_VL_SMASK
1868 | SEND_CTXT_CHECK_ENABLE_CHECK_ENABLE_SMASK; 1838 | SEND_CTXT_CHECK_ENABLE_CHECK_ENABLE_SMASK;
1869 1839
@@ -1872,18 +1842,23 @@ static inline u64 hfi1_pkt_default_send_ctxt_mask(struct hfi1_devdata *dd,
1872 else 1842 else
1873 base_sc_integrity |= HFI1_PKT_KERNEL_SC_INTEGRITY; 1843 base_sc_integrity |= HFI1_PKT_KERNEL_SC_INTEGRITY;
1874 1844
1875 if (is_ax(dd)) 1845 /* turn on send-side job key checks if !A0 */
1876 /* turn off send-side job key checks - A0 */ 1846 if (!is_ax(dd))
1877 return base_sc_integrity & 1847 base_sc_integrity |= SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
1878 ~SEND_CTXT_CHECK_ENABLE_CHECK_JOB_KEY_SMASK; 1848
1879 return base_sc_integrity; 1849 return base_sc_integrity;
1880} 1850}
1881 1851
1882static inline u64 hfi1_pkt_base_sdma_integrity(struct hfi1_devdata *dd) 1852static inline u64 hfi1_pkt_base_sdma_integrity(struct hfi1_devdata *dd)
1883{ 1853{
1884 u64 base_sdma_integrity = 1854 u64 base_sdma_integrity;
1855
1856 /* No integrity checks if HFI1_CAP_NO_INTEGRITY is set */
1857 if (HFI1_CAP_IS_KSET(NO_INTEGRITY))
1858 return 0;
1859
1860 base_sdma_integrity =
1885 SEND_DMA_CHECK_ENABLE_DISALLOW_BYPASS_BAD_PKT_LEN_SMASK 1861 SEND_DMA_CHECK_ENABLE_DISALLOW_BYPASS_BAD_PKT_LEN_SMASK
1886 | SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK
1887 | SEND_DMA_CHECK_ENABLE_DISALLOW_TOO_LONG_BYPASS_PACKETS_SMASK 1862 | SEND_DMA_CHECK_ENABLE_DISALLOW_TOO_LONG_BYPASS_PACKETS_SMASK
1888 | SEND_DMA_CHECK_ENABLE_DISALLOW_TOO_LONG_IB_PACKETS_SMASK 1863 | SEND_DMA_CHECK_ENABLE_DISALLOW_TOO_LONG_IB_PACKETS_SMASK
1889 | SEND_DMA_CHECK_ENABLE_DISALLOW_BAD_PKT_LEN_SMASK 1864 | SEND_DMA_CHECK_ENABLE_DISALLOW_BAD_PKT_LEN_SMASK
@@ -1895,14 +1870,18 @@ static inline u64 hfi1_pkt_base_sdma_integrity(struct hfi1_devdata *dd)
1895 | SEND_DMA_CHECK_ENABLE_CHECK_VL_MAPPING_SMASK 1870 | SEND_DMA_CHECK_ENABLE_CHECK_VL_MAPPING_SMASK
1896 | SEND_DMA_CHECK_ENABLE_CHECK_OPCODE_SMASK 1871 | SEND_DMA_CHECK_ENABLE_CHECK_OPCODE_SMASK
1897 | SEND_DMA_CHECK_ENABLE_CHECK_SLID_SMASK 1872 | SEND_DMA_CHECK_ENABLE_CHECK_SLID_SMASK
1898 | SEND_DMA_CHECK_ENABLE_CHECK_JOB_KEY_SMASK
1899 | SEND_DMA_CHECK_ENABLE_CHECK_VL_SMASK 1873 | SEND_DMA_CHECK_ENABLE_CHECK_VL_SMASK
1900 | SEND_DMA_CHECK_ENABLE_CHECK_ENABLE_SMASK; 1874 | SEND_DMA_CHECK_ENABLE_CHECK_ENABLE_SMASK;
1901 1875
1902 if (is_ax(dd)) 1876 if (!HFI1_CAP_IS_KSET(STATIC_RATE_CTRL))
1903 /* turn off send-side job key checks - A0 */ 1877 base_sdma_integrity |=
1904 return base_sdma_integrity & 1878 SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK;
1905 ~SEND_DMA_CHECK_ENABLE_CHECK_JOB_KEY_SMASK; 1879
1880 /* turn on send-side job key checks if !A0 */
1881 if (!is_ax(dd))
1882 base_sdma_integrity |=
1883 SEND_DMA_CHECK_ENABLE_CHECK_JOB_KEY_SMASK;
1884
1906 return base_sdma_integrity; 1885 return base_sdma_integrity;
1907} 1886}
1908 1887
diff --git a/drivers/infiniband/hw/hfi1/init.c b/drivers/infiniband/hw/hfi1/init.c
index 60db61536fed..e3b5bc93bc70 100644
--- a/drivers/infiniband/hw/hfi1/init.c
+++ b/drivers/infiniband/hw/hfi1/init.c
@@ -144,6 +144,8 @@ int hfi1_create_ctxts(struct hfi1_devdata *dd)
144 struct hfi1_ctxtdata *rcd; 144 struct hfi1_ctxtdata *rcd;
145 145
146 ppd = dd->pport + (i % dd->num_pports); 146 ppd = dd->pport + (i % dd->num_pports);
147
148 /* dd->rcd[i] gets assigned inside the callee */
147 rcd = hfi1_create_ctxtdata(ppd, i, dd->node); 149 rcd = hfi1_create_ctxtdata(ppd, i, dd->node);
148 if (!rcd) { 150 if (!rcd) {
149 dd_dev_err(dd, 151 dd_dev_err(dd,
@@ -169,8 +171,6 @@ int hfi1_create_ctxts(struct hfi1_devdata *dd)
169 if (!rcd->sc) { 171 if (!rcd->sc) {
170 dd_dev_err(dd, 172 dd_dev_err(dd,
171 "Unable to allocate kernel send context, failing\n"); 173 "Unable to allocate kernel send context, failing\n");
172 dd->rcd[rcd->ctxt] = NULL;
173 hfi1_free_ctxtdata(dd, rcd);
174 goto nomem; 174 goto nomem;
175 } 175 }
176 176
@@ -178,9 +178,6 @@ int hfi1_create_ctxts(struct hfi1_devdata *dd)
178 if (ret < 0) { 178 if (ret < 0) {
179 dd_dev_err(dd, 179 dd_dev_err(dd,
180 "Failed to setup kernel receive context, failing\n"); 180 "Failed to setup kernel receive context, failing\n");
181 sc_free(rcd->sc);
182 dd->rcd[rcd->ctxt] = NULL;
183 hfi1_free_ctxtdata(dd, rcd);
184 ret = -EFAULT; 181 ret = -EFAULT;
185 goto bail; 182 goto bail;
186 } 183 }
@@ -196,6 +193,10 @@ int hfi1_create_ctxts(struct hfi1_devdata *dd)
196nomem: 193nomem:
197 ret = -ENOMEM; 194 ret = -ENOMEM;
198bail: 195bail:
196 if (dd->rcd) {
197 for (i = 0; i < dd->num_rcv_contexts; ++i)
198 hfi1_free_ctxtdata(dd, dd->rcd[i]);
199 }
199 kfree(dd->rcd); 200 kfree(dd->rcd);
200 dd->rcd = NULL; 201 dd->rcd = NULL;
201 return ret; 202 return ret;
@@ -216,7 +217,7 @@ struct hfi1_ctxtdata *hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, u32 ctxt,
216 dd->num_rcv_contexts - dd->first_user_ctxt) 217 dd->num_rcv_contexts - dd->first_user_ctxt)
217 kctxt_ngroups = (dd->rcv_entries.nctxt_extra - 218 kctxt_ngroups = (dd->rcv_entries.nctxt_extra -
218 (dd->num_rcv_contexts - dd->first_user_ctxt)); 219 (dd->num_rcv_contexts - dd->first_user_ctxt));
219 rcd = kzalloc(sizeof(*rcd), GFP_KERNEL); 220 rcd = kzalloc_node(sizeof(*rcd), GFP_KERNEL, numa);
220 if (rcd) { 221 if (rcd) {
221 u32 rcvtids, max_entries; 222 u32 rcvtids, max_entries;
222 223
@@ -261,13 +262,6 @@ struct hfi1_ctxtdata *hfi1_create_ctxtdata(struct hfi1_pportdata *ppd, u32 ctxt,
261 } 262 }
262 rcd->eager_base = base * dd->rcv_entries.group_size; 263 rcd->eager_base = base * dd->rcv_entries.group_size;
263 264
264 /* Validate and initialize Rcv Hdr Q variables */
265 if (rcvhdrcnt % HDRQ_INCREMENT) {
266 dd_dev_err(dd,
267 "ctxt%u: header queue count %d must be divisible by %lu\n",
268 rcd->ctxt, rcvhdrcnt, HDRQ_INCREMENT);
269 goto bail;
270 }
271 rcd->rcvhdrq_cnt = rcvhdrcnt; 265 rcd->rcvhdrq_cnt = rcvhdrcnt;
272 rcd->rcvhdrqentsize = hfi1_hdrq_entsize; 266 rcd->rcvhdrqentsize = hfi1_hdrq_entsize;
273 /* 267 /*
@@ -506,7 +500,6 @@ void hfi1_init_pportdata(struct pci_dev *pdev, struct hfi1_pportdata *ppd,
506 INIT_WORK(&ppd->qsfp_info.qsfp_work, qsfp_event); 500 INIT_WORK(&ppd->qsfp_info.qsfp_work, qsfp_event);
507 501
508 mutex_init(&ppd->hls_lock); 502 mutex_init(&ppd->hls_lock);
509 spin_lock_init(&ppd->sdma_alllock);
510 spin_lock_init(&ppd->qsfp_info.qsfp_lock); 503 spin_lock_init(&ppd->qsfp_info.qsfp_lock);
511 504
512 ppd->qsfp_info.ppd = ppd; 505 ppd->qsfp_info.ppd = ppd;
@@ -1399,28 +1392,43 @@ static void postinit_cleanup(struct hfi1_devdata *dd)
1399 hfi1_free_devdata(dd); 1392 hfi1_free_devdata(dd);
1400} 1393}
1401 1394
1395static int init_validate_rcvhdrcnt(struct device *dev, uint thecnt)
1396{
1397 if (thecnt <= HFI1_MIN_HDRQ_EGRBUF_CNT) {
1398 hfi1_early_err(dev, "Receive header queue count too small\n");
1399 return -EINVAL;
1400 }
1401
1402 if (thecnt > HFI1_MAX_HDRQ_EGRBUF_CNT) {
1403 hfi1_early_err(dev,
1404 "Receive header queue count cannot be greater than %u\n",
1405 HFI1_MAX_HDRQ_EGRBUF_CNT);
1406 return -EINVAL;
1407 }
1408
1409 if (thecnt % HDRQ_INCREMENT) {
1410 hfi1_early_err(dev, "Receive header queue count %d must be divisible by %lu\n",
1411 thecnt, HDRQ_INCREMENT);
1412 return -EINVAL;
1413 }
1414
1415 return 0;
1416}
1417
1402static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent) 1418static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1403{ 1419{
1404 int ret = 0, j, pidx, initfail; 1420 int ret = 0, j, pidx, initfail;
1405 struct hfi1_devdata *dd = ERR_PTR(-EINVAL); 1421 struct hfi1_devdata *dd;
1406 struct hfi1_pportdata *ppd; 1422 struct hfi1_pportdata *ppd;
1407 1423
1408 /* First, lock the non-writable module parameters */ 1424 /* First, lock the non-writable module parameters */
1409 HFI1_CAP_LOCK(); 1425 HFI1_CAP_LOCK();
1410 1426
1411 /* Validate some global module parameters */ 1427 /* Validate some global module parameters */
1412 if (rcvhdrcnt <= HFI1_MIN_HDRQ_EGRBUF_CNT) { 1428 ret = init_validate_rcvhdrcnt(&pdev->dev, rcvhdrcnt);
1413 hfi1_early_err(&pdev->dev, "Header queue count too small\n"); 1429 if (ret)
1414 ret = -EINVAL;
1415 goto bail;
1416 }
1417 if (rcvhdrcnt > HFI1_MAX_HDRQ_EGRBUF_CNT) {
1418 hfi1_early_err(&pdev->dev,
1419 "Receive header queue count cannot be greater than %u\n",
1420 HFI1_MAX_HDRQ_EGRBUF_CNT);
1421 ret = -EINVAL;
1422 goto bail; 1430 goto bail;
1423 } 1431
1424 /* use the encoding function as a sanitization check */ 1432 /* use the encoding function as a sanitization check */
1425 if (!encode_rcv_header_entry_size(hfi1_hdrq_entsize)) { 1433 if (!encode_rcv_header_entry_size(hfi1_hdrq_entsize)) {
1426 hfi1_early_err(&pdev->dev, "Invalid HdrQ Entry size %u\n", 1434 hfi1_early_err(&pdev->dev, "Invalid HdrQ Entry size %u\n",
@@ -1461,26 +1469,25 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1461 if (ret) 1469 if (ret)
1462 goto bail; 1470 goto bail;
1463 1471
1464 /* 1472 if (!(ent->device == PCI_DEVICE_ID_INTEL0 ||
1465 * Do device-specific initialization, function table setup, dd 1473 ent->device == PCI_DEVICE_ID_INTEL1)) {
1466 * allocation, etc.
1467 */
1468 switch (ent->device) {
1469 case PCI_DEVICE_ID_INTEL0:
1470 case PCI_DEVICE_ID_INTEL1:
1471 dd = hfi1_init_dd(pdev, ent);
1472 break;
1473 default:
1474 hfi1_early_err(&pdev->dev, 1474 hfi1_early_err(&pdev->dev,
1475 "Failing on unknown Intel deviceid 0x%x\n", 1475 "Failing on unknown Intel deviceid 0x%x\n",
1476 ent->device); 1476 ent->device);
1477 ret = -ENODEV; 1477 ret = -ENODEV;
1478 goto clean_bail;
1478 } 1479 }
1479 1480
1480 if (IS_ERR(dd)) 1481 /*
1482 * Do device-specific initialization, function table setup, dd
1483 * allocation, etc.
1484 */
1485 dd = hfi1_init_dd(pdev, ent);
1486
1487 if (IS_ERR(dd)) {
1481 ret = PTR_ERR(dd); 1488 ret = PTR_ERR(dd);
1482 if (ret)
1483 goto clean_bail; /* error already printed */ 1489 goto clean_bail; /* error already printed */
1490 }
1484 1491
1485 ret = create_workqueues(dd); 1492 ret = create_workqueues(dd);
1486 if (ret) 1493 if (ret)
@@ -1538,12 +1545,31 @@ bail:
1538 return ret; 1545 return ret;
1539} 1546}
1540 1547
1548static void wait_for_clients(struct hfi1_devdata *dd)
1549{
1550 /*
1551 * Remove the device init value and complete the device if there is
1552 * no clients or wait for active clients to finish.
1553 */
1554 if (atomic_dec_and_test(&dd->user_refcount))
1555 complete(&dd->user_comp);
1556
1557 wait_for_completion(&dd->user_comp);
1558}
1559
1541static void remove_one(struct pci_dev *pdev) 1560static void remove_one(struct pci_dev *pdev)
1542{ 1561{
1543 struct hfi1_devdata *dd = pci_get_drvdata(pdev); 1562 struct hfi1_devdata *dd = pci_get_drvdata(pdev);
1544 1563
1545 /* close debugfs files before ib unregister */ 1564 /* close debugfs files before ib unregister */
1546 hfi1_dbg_ibdev_exit(&dd->verbs_dev); 1565 hfi1_dbg_ibdev_exit(&dd->verbs_dev);
1566
1567 /* remove the /dev hfi1 interface */
1568 hfi1_device_remove(dd);
1569
1570 /* wait for existing user space clients to finish */
1571 wait_for_clients(dd);
1572
1547 /* unregister from IB core */ 1573 /* unregister from IB core */
1548 hfi1_unregister_ib_device(dd); 1574 hfi1_unregister_ib_device(dd);
1549 1575
@@ -1558,8 +1584,6 @@ static void remove_one(struct pci_dev *pdev)
1558 /* wait until all of our (qsfp) queue_work() calls complete */ 1584 /* wait until all of our (qsfp) queue_work() calls complete */
1559 flush_workqueue(ib_wq); 1585 flush_workqueue(ib_wq);
1560 1586
1561 hfi1_device_remove(dd);
1562
1563 postinit_cleanup(dd); 1587 postinit_cleanup(dd);
1564} 1588}
1565 1589
diff --git a/drivers/infiniband/hw/hfi1/pcie.c b/drivers/infiniband/hw/hfi1/pcie.c
index 89c68da1c273..4ac8f330c5cb 100644
--- a/drivers/infiniband/hw/hfi1/pcie.c
+++ b/drivers/infiniband/hw/hfi1/pcie.c
@@ -157,8 +157,7 @@ void hfi1_pcie_cleanup(struct pci_dev *pdev)
157 * fields required to re-initialize after a chip reset, or for 157 * fields required to re-initialize after a chip reset, or for
158 * various other purposes 158 * various other purposes
159 */ 159 */
160int hfi1_pcie_ddinit(struct hfi1_devdata *dd, struct pci_dev *pdev, 160int hfi1_pcie_ddinit(struct hfi1_devdata *dd, struct pci_dev *pdev)
161 const struct pci_device_id *ent)
162{ 161{
163 unsigned long len; 162 unsigned long len;
164 resource_size_t addr; 163 resource_size_t addr;
diff --git a/drivers/infiniband/hw/hfi1/pio.c b/drivers/infiniband/hw/hfi1/pio.c
index 50a3a36d9363..d89b8745d4c1 100644
--- a/drivers/infiniband/hw/hfi1/pio.c
+++ b/drivers/infiniband/hw/hfi1/pio.c
@@ -668,19 +668,12 @@ void sc_set_cr_threshold(struct send_context *sc, u32 new_threshold)
668void set_pio_integrity(struct send_context *sc) 668void set_pio_integrity(struct send_context *sc)
669{ 669{
670 struct hfi1_devdata *dd = sc->dd; 670 struct hfi1_devdata *dd = sc->dd;
671 u64 reg = 0;
672 u32 hw_context = sc->hw_context; 671 u32 hw_context = sc->hw_context;
673 int type = sc->type; 672 int type = sc->type;
674 673
675 /* 674 write_kctxt_csr(dd, hw_context,
676 * No integrity checks if HFI1_CAP_NO_INTEGRITY is set, or if 675 SC(CHECK_ENABLE),
677 * we're snooping. 676 hfi1_pkt_default_send_ctxt_mask(dd, type));
678 */
679 if (likely(!HFI1_CAP_IS_KSET(NO_INTEGRITY)) &&
680 dd->hfi1_snoop.mode_flag != HFI1_PORT_SNOOP_MODE)
681 reg = hfi1_pkt_default_send_ctxt_mask(dd, type);
682
683 write_kctxt_csr(dd, hw_context, SC(CHECK_ENABLE), reg);
684} 677}
685 678
686static u32 get_buffers_allocated(struct send_context *sc) 679static u32 get_buffers_allocated(struct send_context *sc)
diff --git a/drivers/infiniband/hw/hfi1/rc.c b/drivers/infiniband/hw/hfi1/rc.c
index 8bc5013f39a1..83198a8a8797 100644
--- a/drivers/infiniband/hw/hfi1/rc.c
+++ b/drivers/infiniband/hw/hfi1/rc.c
@@ -89,7 +89,7 @@ void hfi1_add_rnr_timer(struct rvt_qp *qp, u32 to)
89 89
90 lockdep_assert_held(&qp->s_lock); 90 lockdep_assert_held(&qp->s_lock);
91 qp->s_flags |= RVT_S_WAIT_RNR; 91 qp->s_flags |= RVT_S_WAIT_RNR;
92 qp->s_timer.expires = jiffies + usecs_to_jiffies(to); 92 priv->s_rnr_timer.expires = jiffies + usecs_to_jiffies(to);
93 add_timer(&priv->s_rnr_timer); 93 add_timer(&priv->s_rnr_timer);
94} 94}
95 95
diff --git a/drivers/infiniband/hw/hfi1/sdma.c b/drivers/infiniband/hw/hfi1/sdma.c
index fd39bcaa062d..9cbe52d21077 100644
--- a/drivers/infiniband/hw/hfi1/sdma.c
+++ b/drivers/infiniband/hw/hfi1/sdma.c
@@ -2009,11 +2009,6 @@ static void sdma_hw_start_up(struct sdma_engine *sde)
2009 write_sde_csr(sde, SD(ENG_ERR_CLEAR), reg); 2009 write_sde_csr(sde, SD(ENG_ERR_CLEAR), reg);
2010} 2010}
2011 2011
2012#define CLEAR_STATIC_RATE_CONTROL_SMASK(r) \
2013(r &= ~SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
2014
2015#define SET_STATIC_RATE_CONTROL_SMASK(r) \
2016(r |= SEND_DMA_CHECK_ENABLE_DISALLOW_PBC_STATIC_RATE_CONTROL_SMASK)
2017/* 2012/*
2018 * set_sdma_integrity 2013 * set_sdma_integrity
2019 * 2014 *
@@ -2022,19 +2017,9 @@ static void sdma_hw_start_up(struct sdma_engine *sde)
2022static void set_sdma_integrity(struct sdma_engine *sde) 2017static void set_sdma_integrity(struct sdma_engine *sde)
2023{ 2018{
2024 struct hfi1_devdata *dd = sde->dd; 2019 struct hfi1_devdata *dd = sde->dd;
2025 u64 reg;
2026
2027 if (unlikely(HFI1_CAP_IS_KSET(NO_INTEGRITY)))
2028 return;
2029
2030 reg = hfi1_pkt_base_sdma_integrity(dd);
2031
2032 if (HFI1_CAP_IS_KSET(STATIC_RATE_CTRL))
2033 CLEAR_STATIC_RATE_CONTROL_SMASK(reg);
2034 else
2035 SET_STATIC_RATE_CONTROL_SMASK(reg);
2036 2020
2037 write_sde_csr(sde, SD(CHECK_ENABLE), reg); 2021 write_sde_csr(sde, SD(CHECK_ENABLE),
2022 hfi1_pkt_base_sdma_integrity(dd));
2038} 2023}
2039 2024
2040static void init_sdma_regs( 2025static void init_sdma_regs(
diff --git a/drivers/infiniband/hw/hfi1/sysfs.c b/drivers/infiniband/hw/hfi1/sysfs.c
index edba22461a9c..919a5474e651 100644
--- a/drivers/infiniband/hw/hfi1/sysfs.c
+++ b/drivers/infiniband/hw/hfi1/sysfs.c
@@ -49,7 +49,6 @@
49#include "hfi.h" 49#include "hfi.h"
50#include "mad.h" 50#include "mad.h"
51#include "trace.h" 51#include "trace.h"
52#include "affinity.h"
53 52
54/* 53/*
55 * Start of per-port congestion control structures and support code 54 * Start of per-port congestion control structures and support code
@@ -623,27 +622,6 @@ static ssize_t show_tempsense(struct device *device,
623 return ret; 622 return ret;
624} 623}
625 624
626static ssize_t show_sdma_affinity(struct device *device,
627 struct device_attribute *attr, char *buf)
628{
629 struct hfi1_ibdev *dev =
630 container_of(device, struct hfi1_ibdev, rdi.ibdev.dev);
631 struct hfi1_devdata *dd = dd_from_dev(dev);
632
633 return hfi1_get_sdma_affinity(dd, buf);
634}
635
636static ssize_t store_sdma_affinity(struct device *device,
637 struct device_attribute *attr,
638 const char *buf, size_t count)
639{
640 struct hfi1_ibdev *dev =
641 container_of(device, struct hfi1_ibdev, rdi.ibdev.dev);
642 struct hfi1_devdata *dd = dd_from_dev(dev);
643
644 return hfi1_set_sdma_affinity(dd, buf, count);
645}
646
647/* 625/*
648 * end of per-unit (or driver, in some cases, but replicated 626 * end of per-unit (or driver, in some cases, but replicated
649 * per unit) functions 627 * per unit) functions
@@ -658,8 +636,6 @@ static DEVICE_ATTR(serial, S_IRUGO, show_serial, NULL);
658static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL); 636static DEVICE_ATTR(boardversion, S_IRUGO, show_boardversion, NULL);
659static DEVICE_ATTR(tempsense, S_IRUGO, show_tempsense, NULL); 637static DEVICE_ATTR(tempsense, S_IRUGO, show_tempsense, NULL);
660static DEVICE_ATTR(chip_reset, S_IWUSR, NULL, store_chip_reset); 638static DEVICE_ATTR(chip_reset, S_IWUSR, NULL, store_chip_reset);
661static DEVICE_ATTR(sdma_affinity, S_IWUSR | S_IRUGO, show_sdma_affinity,
662 store_sdma_affinity);
663 639
664static struct device_attribute *hfi1_attributes[] = { 640static struct device_attribute *hfi1_attributes[] = {
665 &dev_attr_hw_rev, 641 &dev_attr_hw_rev,
@@ -670,7 +646,6 @@ static struct device_attribute *hfi1_attributes[] = {
670 &dev_attr_boardversion, 646 &dev_attr_boardversion,
671 &dev_attr_tempsense, 647 &dev_attr_tempsense,
672 &dev_attr_chip_reset, 648 &dev_attr_chip_reset,
673 &dev_attr_sdma_affinity,
674}; 649};
675 650
676int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num, 651int hfi1_create_port_files(struct ib_device *ibdev, u8 port_num,
diff --git a/drivers/infiniband/hw/hfi1/trace_rx.h b/drivers/infiniband/hw/hfi1/trace_rx.h
index 11e02b228922..f77e59fb43fe 100644
--- a/drivers/infiniband/hw/hfi1/trace_rx.h
+++ b/drivers/infiniband/hw/hfi1/trace_rx.h
@@ -253,66 +253,6 @@ TRACE_EVENT(hfi1_mmu_invalidate,
253 ) 253 )
254 ); 254 );
255 255
256#define SNOOP_PRN \
257 "slid %.4x dlid %.4x qpn 0x%.6x opcode 0x%.2x,%s " \
258 "svc lvl %d pkey 0x%.4x [header = %d bytes] [data = %d bytes]"
259
260TRACE_EVENT(snoop_capture,
261 TP_PROTO(struct hfi1_devdata *dd,
262 int hdr_len,
263 struct ib_header *hdr,
264 int data_len,
265 void *data),
266 TP_ARGS(dd, hdr_len, hdr, data_len, data),
267 TP_STRUCT__entry(
268 DD_DEV_ENTRY(dd)
269 __field(u16, slid)
270 __field(u16, dlid)
271 __field(u32, qpn)
272 __field(u8, opcode)
273 __field(u8, sl)
274 __field(u16, pkey)
275 __field(u32, hdr_len)
276 __field(u32, data_len)
277 __field(u8, lnh)
278 __dynamic_array(u8, raw_hdr, hdr_len)
279 __dynamic_array(u8, raw_pkt, data_len)
280 ),
281 TP_fast_assign(
282 struct ib_other_headers *ohdr;
283
284 __entry->lnh = (u8)(be16_to_cpu(hdr->lrh[0]) & 3);
285 if (__entry->lnh == HFI1_LRH_BTH)
286 ohdr = &hdr->u.oth;
287 else
288 ohdr = &hdr->u.l.oth;
289 DD_DEV_ASSIGN(dd);
290 __entry->slid = be16_to_cpu(hdr->lrh[3]);
291 __entry->dlid = be16_to_cpu(hdr->lrh[1]);
292 __entry->qpn = be32_to_cpu(ohdr->bth[1]) & RVT_QPN_MASK;
293 __entry->opcode = (be32_to_cpu(ohdr->bth[0]) >> 24) & 0xff;
294 __entry->sl = (u8)(be16_to_cpu(hdr->lrh[0]) >> 4) & 0xf;
295 __entry->pkey = be32_to_cpu(ohdr->bth[0]) & 0xffff;
296 __entry->hdr_len = hdr_len;
297 __entry->data_len = data_len;
298 memcpy(__get_dynamic_array(raw_hdr), hdr, hdr_len);
299 memcpy(__get_dynamic_array(raw_pkt), data, data_len);
300 ),
301 TP_printk(
302 "[%s] " SNOOP_PRN,
303 __get_str(dev),
304 __entry->slid,
305 __entry->dlid,
306 __entry->qpn,
307 __entry->opcode,
308 show_ib_opcode(__entry->opcode),
309 __entry->sl,
310 __entry->pkey,
311 __entry->hdr_len,
312 __entry->data_len
313 )
314);
315
316#endif /* __HFI1_TRACE_RX_H */ 256#endif /* __HFI1_TRACE_RX_H */
317 257
318#undef TRACE_INCLUDE_PATH 258#undef TRACE_INCLUDE_PATH
diff --git a/drivers/infiniband/hw/hfi1/user_sdma.c b/drivers/infiniband/hw/hfi1/user_sdma.c
index a761f804111e..77697d690f3e 100644
--- a/drivers/infiniband/hw/hfi1/user_sdma.c
+++ b/drivers/infiniband/hw/hfi1/user_sdma.c
@@ -1144,7 +1144,7 @@ static int pin_vector_pages(struct user_sdma_request *req,
1144 rb_node = hfi1_mmu_rb_extract(pq->handler, 1144 rb_node = hfi1_mmu_rb_extract(pq->handler,
1145 (unsigned long)iovec->iov.iov_base, 1145 (unsigned long)iovec->iov.iov_base,
1146 iovec->iov.iov_len); 1146 iovec->iov.iov_len);
1147 if (rb_node && !IS_ERR(rb_node)) 1147 if (rb_node)
1148 node = container_of(rb_node, struct sdma_mmu_node, rb); 1148 node = container_of(rb_node, struct sdma_mmu_node, rb);
1149 else 1149 else
1150 rb_node = NULL; 1150 rb_node = NULL;
diff --git a/drivers/infiniband/hw/mlx4/ah.c b/drivers/infiniband/hw/mlx4/ah.c
index 5fc623362731..b9bf0759f10a 100644
--- a/drivers/infiniband/hw/mlx4/ah.c
+++ b/drivers/infiniband/hw/mlx4/ah.c
@@ -102,7 +102,10 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd, struct ib_ah_attr *ah_attr
102 if (vlan_tag < 0x1000) 102 if (vlan_tag < 0x1000)
103 vlan_tag |= (ah_attr->sl & 7) << 13; 103 vlan_tag |= (ah_attr->sl & 7) << 13;
104 ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24)); 104 ah->av.eth.port_pd = cpu_to_be32(to_mpd(pd)->pdn | (ah_attr->port_num << 24));
105 ah->av.eth.gid_index = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index); 105 ret = mlx4_ib_gid_index_to_real_index(ibdev, ah_attr->port_num, ah_attr->grh.sgid_index);
106 if (ret < 0)
107 return ERR_PTR(ret);
108 ah->av.eth.gid_index = ret;
106 ah->av.eth.vlan = cpu_to_be16(vlan_tag); 109 ah->av.eth.vlan = cpu_to_be16(vlan_tag);
107 ah->av.eth.hop_limit = ah_attr->grh.hop_limit; 110 ah->av.eth.hop_limit = ah_attr->grh.hop_limit;
108 if (ah_attr->static_rate) { 111 if (ah_attr->static_rate) {
diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
index 1ea686b9e0f9..6a0fec357dae 100644
--- a/drivers/infiniband/hw/mlx4/cq.c
+++ b/drivers/infiniband/hw/mlx4/cq.c
@@ -253,11 +253,14 @@ struct ib_cq *mlx4_ib_create_cq(struct ib_device *ibdev,
253 if (context) 253 if (context)
254 if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) { 254 if (ib_copy_to_udata(udata, &cq->mcq.cqn, sizeof (__u32))) {
255 err = -EFAULT; 255 err = -EFAULT;
256 goto err_dbmap; 256 goto err_cq_free;
257 } 257 }
258 258
259 return &cq->ibcq; 259 return &cq->ibcq;
260 260
261err_cq_free:
262 mlx4_cq_free(dev->dev, &cq->mcq);
263
261err_dbmap: 264err_dbmap:
262 if (context) 265 if (context)
263 mlx4_ib_db_unmap_user(to_mucontext(context), &cq->db); 266 mlx4_ib_db_unmap_user(to_mucontext(context), &cq->db);
diff --git a/drivers/infiniband/hw/mlx5/cq.c b/drivers/infiniband/hw/mlx5/cq.c
index 79d017baf6f4..fcd04b881ec1 100644
--- a/drivers/infiniband/hw/mlx5/cq.c
+++ b/drivers/infiniband/hw/mlx5/cq.c
@@ -932,8 +932,7 @@ struct ib_cq *mlx5_ib_create_cq(struct ib_device *ibdev,
932 if (err) 932 if (err)
933 goto err_create; 933 goto err_create;
934 } else { 934 } else {
935 /* for now choose 64 bytes till we have a proper interface */ 935 cqe_size = cache_line_size() == 128 ? 128 : 64;
936 cqe_size = 64;
937 err = create_cq_kernel(dev, cq, entries, cqe_size, &cqb, 936 err = create_cq_kernel(dev, cq, entries, cqe_size, &cqb,
938 &index, &inlen); 937 &index, &inlen);
939 if (err) 938 if (err)
diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
index 63036c731626..32b09f059c84 100644
--- a/drivers/infiniband/hw/mlx5/main.c
+++ b/drivers/infiniband/hw/mlx5/main.c
@@ -2311,14 +2311,14 @@ static void mlx5_ib_event(struct mlx5_core_dev *dev, void *context,
2311{ 2311{
2312 struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context; 2312 struct mlx5_ib_dev *ibdev = (struct mlx5_ib_dev *)context;
2313 struct ib_event ibev; 2313 struct ib_event ibev;
2314 2314 bool fatal = false;
2315 u8 port = 0; 2315 u8 port = 0;
2316 2316
2317 switch (event) { 2317 switch (event) {
2318 case MLX5_DEV_EVENT_SYS_ERROR: 2318 case MLX5_DEV_EVENT_SYS_ERROR:
2319 ibdev->ib_active = false;
2320 ibev.event = IB_EVENT_DEVICE_FATAL; 2319 ibev.event = IB_EVENT_DEVICE_FATAL;
2321 mlx5_ib_handle_internal_error(ibdev); 2320 mlx5_ib_handle_internal_error(ibdev);
2321 fatal = true;
2322 break; 2322 break;
2323 2323
2324 case MLX5_DEV_EVENT_PORT_UP: 2324 case MLX5_DEV_EVENT_PORT_UP:
@@ -2370,6 +2370,9 @@ static void mlx5_ib_event(struct mlx5_core_dev *dev, void *context,
2370 2370
2371 if (ibdev->ib_active) 2371 if (ibdev->ib_active)
2372 ib_dispatch_event(&ibev); 2372 ib_dispatch_event(&ibev);
2373
2374 if (fatal)
2375 ibdev->ib_active = false;
2373} 2376}
2374 2377
2375static void get_ext_port_caps(struct mlx5_ib_dev *dev) 2378static void get_ext_port_caps(struct mlx5_ib_dev *dev)
@@ -3115,7 +3118,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
3115 } 3118 }
3116 err = init_node_data(dev); 3119 err = init_node_data(dev);
3117 if (err) 3120 if (err)
3118 goto err_dealloc; 3121 goto err_free_port;
3119 3122
3120 mutex_init(&dev->flow_db.lock); 3123 mutex_init(&dev->flow_db.lock);
3121 mutex_init(&dev->cap_mask_mutex); 3124 mutex_init(&dev->cap_mask_mutex);
@@ -3125,7 +3128,7 @@ static void *mlx5_ib_add(struct mlx5_core_dev *mdev)
3125 if (ll == IB_LINK_LAYER_ETHERNET) { 3128 if (ll == IB_LINK_LAYER_ETHERNET) {
3126 err = mlx5_enable_roce(dev); 3129 err = mlx5_enable_roce(dev);
3127 if (err) 3130 if (err)
3128 goto err_dealloc; 3131 goto err_free_port;
3129 } 3132 }
3130 3133
3131 err = create_dev_resources(&dev->devr); 3134 err = create_dev_resources(&dev->devr);
diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
index dcdcd195fe53..7d689903c87c 100644
--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
+++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
@@ -626,6 +626,8 @@ struct mlx5_ib_dev {
626 struct mlx5_ib_resources devr; 626 struct mlx5_ib_resources devr;
627 struct mlx5_mr_cache cache; 627 struct mlx5_mr_cache cache;
628 struct timer_list delay_timer; 628 struct timer_list delay_timer;
629 /* Prevents soft lock on massive reg MRs */
630 struct mutex slow_path_mutex;
629 int fill_delay; 631 int fill_delay;
630#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING 632#ifdef CONFIG_INFINIBAND_ON_DEMAND_PAGING
631 struct ib_odp_caps odp_caps; 633 struct ib_odp_caps odp_caps;
diff --git a/drivers/infiniband/hw/mlx5/mr.c b/drivers/infiniband/hw/mlx5/mr.c
index d4ad672b905b..4e9012463c37 100644
--- a/drivers/infiniband/hw/mlx5/mr.c
+++ b/drivers/infiniband/hw/mlx5/mr.c
@@ -610,6 +610,7 @@ int mlx5_mr_cache_init(struct mlx5_ib_dev *dev)
610 int err; 610 int err;
611 int i; 611 int i;
612 612
613 mutex_init(&dev->slow_path_mutex);
613 cache->wq = alloc_ordered_workqueue("mkey_cache", WQ_MEM_RECLAIM); 614 cache->wq = alloc_ordered_workqueue("mkey_cache", WQ_MEM_RECLAIM);
614 if (!cache->wq) { 615 if (!cache->wq) {
615 mlx5_ib_warn(dev, "failed to create work queue\n"); 616 mlx5_ib_warn(dev, "failed to create work queue\n");
@@ -1182,9 +1183,12 @@ struct ib_mr *mlx5_ib_reg_user_mr(struct ib_pd *pd, u64 start, u64 length,
1182 goto error; 1183 goto error;
1183 } 1184 }
1184 1185
1185 if (!mr) 1186 if (!mr) {
1187 mutex_lock(&dev->slow_path_mutex);
1186 mr = reg_create(NULL, pd, virt_addr, length, umem, ncont, 1188 mr = reg_create(NULL, pd, virt_addr, length, umem, ncont,
1187 page_shift, access_flags); 1189 page_shift, access_flags);
1190 mutex_unlock(&dev->slow_path_mutex);
1191 }
1188 1192
1189 if (IS_ERR(mr)) { 1193 if (IS_ERR(mr)) {
1190 err = PTR_ERR(mr); 1194 err = PTR_ERR(mr);
diff --git a/drivers/infiniband/hw/mlx5/qp.c b/drivers/infiniband/hw/mlx5/qp.c
index 7ce97daf26c6..d1e921816bfe 100644
--- a/drivers/infiniband/hw/mlx5/qp.c
+++ b/drivers/infiniband/hw/mlx5/qp.c
@@ -2051,8 +2051,8 @@ struct ib_qp *mlx5_ib_create_qp(struct ib_pd *pd,
2051 2051
2052 mlx5_ib_dbg(dev, "ib qpnum 0x%x, mlx qpn 0x%x, rcqn 0x%x, scqn 0x%x\n", 2052 mlx5_ib_dbg(dev, "ib qpnum 0x%x, mlx qpn 0x%x, rcqn 0x%x, scqn 0x%x\n",
2053 qp->ibqp.qp_num, qp->trans_qp.base.mqp.qpn, 2053 qp->ibqp.qp_num, qp->trans_qp.base.mqp.qpn,
2054 to_mcq(init_attr->recv_cq)->mcq.cqn, 2054 init_attr->recv_cq ? to_mcq(init_attr->recv_cq)->mcq.cqn : -1,
2055 to_mcq(init_attr->send_cq)->mcq.cqn); 2055 init_attr->send_cq ? to_mcq(init_attr->send_cq)->mcq.cqn : -1);
2056 2056
2057 qp->trans_qp.xrcdn = xrcdn; 2057 qp->trans_qp.xrcdn = xrcdn;
2058 2058
@@ -4814,6 +4814,14 @@ struct ib_rwq_ind_table *mlx5_ib_create_rwq_ind_table(struct ib_device *device,
4814 udata->inlen)) 4814 udata->inlen))
4815 return ERR_PTR(-EOPNOTSUPP); 4815 return ERR_PTR(-EOPNOTSUPP);
4816 4816
4817 if (init_attr->log_ind_tbl_size >
4818 MLX5_CAP_GEN(dev->mdev, log_max_rqt_size)) {
4819 mlx5_ib_dbg(dev, "log_ind_tbl_size = %d is bigger than supported = %d\n",
4820 init_attr->log_ind_tbl_size,
4821 MLX5_CAP_GEN(dev->mdev, log_max_rqt_size));
4822 return ERR_PTR(-EINVAL);
4823 }
4824
4817 min_resp_len = offsetof(typeof(resp), reserved) + sizeof(resp.reserved); 4825 min_resp_len = offsetof(typeof(resp), reserved) + sizeof(resp.reserved);
4818 if (udata->outlen && udata->outlen < min_resp_len) 4826 if (udata->outlen && udata->outlen < min_resp_len)
4819 return ERR_PTR(-EINVAL); 4827 return ERR_PTR(-EINVAL);
diff --git a/drivers/infiniband/sw/rdmavt/dma.c b/drivers/infiniband/sw/rdmavt/dma.c
index 01f71caa3ac4..f2cefb0d9180 100644
--- a/drivers/infiniband/sw/rdmavt/dma.c
+++ b/drivers/infiniband/sw/rdmavt/dma.c
@@ -90,9 +90,6 @@ static u64 rvt_dma_map_page(struct ib_device *dev, struct page *page,
90 if (WARN_ON(!valid_dma_direction(direction))) 90 if (WARN_ON(!valid_dma_direction(direction)))
91 return BAD_DMA_ADDRESS; 91 return BAD_DMA_ADDRESS;
92 92
93 if (offset + size > PAGE_SIZE)
94 return BAD_DMA_ADDRESS;
95
96 addr = (u64)page_address(page); 93 addr = (u64)page_address(page);
97 if (addr) 94 if (addr)
98 addr += offset; 95 addr += offset;
diff --git a/drivers/infiniband/sw/rxe/rxe_net.c b/drivers/infiniband/sw/rxe/rxe_net.c
index b8258e4f0aea..ffff5a54cb34 100644
--- a/drivers/infiniband/sw/rxe/rxe_net.c
+++ b/drivers/infiniband/sw/rxe/rxe_net.c
@@ -243,10 +243,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
243{ 243{
244 int err; 244 int err;
245 struct socket *sock; 245 struct socket *sock;
246 struct udp_port_cfg udp_cfg; 246 struct udp_port_cfg udp_cfg = {0};
247 struct udp_tunnel_sock_cfg tnl_cfg; 247 struct udp_tunnel_sock_cfg tnl_cfg = {0};
248
249 memset(&udp_cfg, 0, sizeof(udp_cfg));
250 248
251 if (ipv6) { 249 if (ipv6) {
252 udp_cfg.family = AF_INET6; 250 udp_cfg.family = AF_INET6;
@@ -264,10 +262,8 @@ static struct socket *rxe_setup_udp_tunnel(struct net *net, __be16 port,
264 return ERR_PTR(err); 262 return ERR_PTR(err);
265 } 263 }
266 264
267 tnl_cfg.sk_user_data = NULL;
268 tnl_cfg.encap_type = 1; 265 tnl_cfg.encap_type = 1;
269 tnl_cfg.encap_rcv = rxe_udp_encap_recv; 266 tnl_cfg.encap_rcv = rxe_udp_encap_recv;
270 tnl_cfg.encap_destroy = NULL;
271 267
272 /* Setup UDP tunnel */ 268 /* Setup UDP tunnel */
273 setup_udp_tunnel_sock(net, sock, &tnl_cfg); 269 setup_udp_tunnel_sock(net, sock, &tnl_cfg);
diff --git a/drivers/infiniband/sw/rxe/rxe_qp.c b/drivers/infiniband/sw/rxe/rxe_qp.c
index b8036cfbce04..c3e60e4bde6e 100644
--- a/drivers/infiniband/sw/rxe/rxe_qp.c
+++ b/drivers/infiniband/sw/rxe/rxe_qp.c
@@ -522,6 +522,7 @@ static void rxe_qp_reset(struct rxe_qp *qp)
522 if (qp->sq.queue) { 522 if (qp->sq.queue) {
523 __rxe_do_task(&qp->comp.task); 523 __rxe_do_task(&qp->comp.task);
524 __rxe_do_task(&qp->req.task); 524 __rxe_do_task(&qp->req.task);
525 rxe_queue_reset(qp->sq.queue);
525 } 526 }
526 527
527 /* cleanup attributes */ 528 /* cleanup attributes */
@@ -573,6 +574,7 @@ void rxe_qp_error(struct rxe_qp *qp)
573{ 574{
574 qp->req.state = QP_STATE_ERROR; 575 qp->req.state = QP_STATE_ERROR;
575 qp->resp.state = QP_STATE_ERROR; 576 qp->resp.state = QP_STATE_ERROR;
577 qp->attr.qp_state = IB_QPS_ERR;
576 578
577 /* drain work and packet queues */ 579 /* drain work and packet queues */
578 rxe_run_task(&qp->resp.task, 1); 580 rxe_run_task(&qp->resp.task, 1);
diff --git a/drivers/infiniband/sw/rxe/rxe_queue.c b/drivers/infiniband/sw/rxe/rxe_queue.c
index 08274254eb88..d14bf496d62d 100644
--- a/drivers/infiniband/sw/rxe/rxe_queue.c
+++ b/drivers/infiniband/sw/rxe/rxe_queue.c
@@ -84,6 +84,15 @@ err1:
84 return -EINVAL; 84 return -EINVAL;
85} 85}
86 86
87inline void rxe_queue_reset(struct rxe_queue *q)
88{
89 /* queue is comprised from header and the memory
90 * of the actual queue. See "struct rxe_queue_buf" in rxe_queue.h
91 * reset only the queue itself and not the management header
92 */
93 memset(q->buf->data, 0, q->buf_size - sizeof(struct rxe_queue_buf));
94}
95
87struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe, 96struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe,
88 int *num_elem, 97 int *num_elem,
89 unsigned int elem_size) 98 unsigned int elem_size)
diff --git a/drivers/infiniband/sw/rxe/rxe_queue.h b/drivers/infiniband/sw/rxe/rxe_queue.h
index 239fd609c31e..8c8641c87817 100644
--- a/drivers/infiniband/sw/rxe/rxe_queue.h
+++ b/drivers/infiniband/sw/rxe/rxe_queue.h
@@ -84,6 +84,8 @@ int do_mmap_info(struct rxe_dev *rxe,
84 size_t buf_size, 84 size_t buf_size,
85 struct rxe_mmap_info **ip_p); 85 struct rxe_mmap_info **ip_p);
86 86
87void rxe_queue_reset(struct rxe_queue *q);
88
87struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe, 89struct rxe_queue *rxe_queue_init(struct rxe_dev *rxe,
88 int *num_elem, 90 int *num_elem,
89 unsigned int elem_size); 91 unsigned int elem_size);
diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c
index 832846b73ea0..22bd9630dcd9 100644
--- a/drivers/infiniband/sw/rxe/rxe_req.c
+++ b/drivers/infiniband/sw/rxe/rxe_req.c
@@ -696,7 +696,8 @@ next_wqe:
696 qp->req.wqe_index); 696 qp->req.wqe_index);
697 wqe->state = wqe_state_done; 697 wqe->state = wqe_state_done;
698 wqe->status = IB_WC_SUCCESS; 698 wqe->status = IB_WC_SUCCESS;
699 goto complete; 699 __rxe_do_task(&qp->comp.task);
700 return 0;
700 } 701 }
701 payload = mtu; 702 payload = mtu;
702 } 703 }
@@ -745,13 +746,17 @@ err:
745 wqe->status = IB_WC_LOC_PROT_ERR; 746 wqe->status = IB_WC_LOC_PROT_ERR;
746 wqe->state = wqe_state_error; 747 wqe->state = wqe_state_error;
747 748
748complete: 749 /*
749 if (qp_type(qp) != IB_QPT_RC) { 750 * IBA Spec. Section 10.7.3.1 SIGNALED COMPLETIONS
750 while (rxe_completer(qp) == 0) 751 * ---------8<---------8<-------------
751 ; 752 * ...Note that if a completion error occurs, a Work Completion
752 } 753 * will always be generated, even if the signaling
753 754 * indicator requests an Unsignaled Completion.
754 return 0; 755 * ---------8<---------8<-------------
756 */
757 wqe->wr.send_flags |= IB_SEND_SIGNALED;
758 __rxe_do_task(&qp->comp.task);
759 return -EAGAIN;
755 760
756exit: 761exit:
757 return -EAGAIN; 762 return -EAGAIN;
diff --git a/drivers/input/misc/arizona-haptics.c b/drivers/input/misc/arizona-haptics.c
index 982936334537..07ec465f1095 100644
--- a/drivers/input/misc/arizona-haptics.c
+++ b/drivers/input/misc/arizona-haptics.c
@@ -37,6 +37,8 @@ static void arizona_haptics_work(struct work_struct *work)
37 struct arizona_haptics, 37 struct arizona_haptics,
38 work); 38 work);
39 struct arizona *arizona = haptics->arizona; 39 struct arizona *arizona = haptics->arizona;
40 struct snd_soc_component *component =
41 snd_soc_dapm_to_component(arizona->dapm);
40 int ret; 42 int ret;
41 43
42 if (!haptics->arizona->dapm) { 44 if (!haptics->arizona->dapm) {
@@ -66,7 +68,7 @@ static void arizona_haptics_work(struct work_struct *work)
66 return; 68 return;
67 } 69 }
68 70
69 ret = snd_soc_dapm_enable_pin(arizona->dapm, "HAPTICS"); 71 ret = snd_soc_component_enable_pin(component, "HAPTICS");
70 if (ret != 0) { 72 if (ret != 0) {
71 dev_err(arizona->dev, "Failed to start HAPTICS: %d\n", 73 dev_err(arizona->dev, "Failed to start HAPTICS: %d\n",
72 ret); 74 ret);
@@ -81,7 +83,7 @@ static void arizona_haptics_work(struct work_struct *work)
81 } 83 }
82 } else { 84 } else {
83 /* This disable sequence will be a noop if already enabled */ 85 /* This disable sequence will be a noop if already enabled */
84 ret = snd_soc_dapm_disable_pin(arizona->dapm, "HAPTICS"); 86 ret = snd_soc_component_disable_pin(component, "HAPTICS");
85 if (ret != 0) { 87 if (ret != 0) {
86 dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n", 88 dev_err(arizona->dev, "Failed to disable HAPTICS: %d\n",
87 ret); 89 ret);
@@ -140,11 +142,14 @@ static int arizona_haptics_play(struct input_dev *input, void *data,
140static void arizona_haptics_close(struct input_dev *input) 142static void arizona_haptics_close(struct input_dev *input)
141{ 143{
142 struct arizona_haptics *haptics = input_get_drvdata(input); 144 struct arizona_haptics *haptics = input_get_drvdata(input);
145 struct snd_soc_component *component;
143 146
144 cancel_work_sync(&haptics->work); 147 cancel_work_sync(&haptics->work);
145 148
146 if (haptics->arizona->dapm) 149 if (haptics->arizona->dapm) {
147 snd_soc_dapm_disable_pin(haptics->arizona->dapm, "HAPTICS"); 150 component = snd_soc_dapm_to_component(haptics->arizona->dapm);
151 snd_soc_component_disable_pin(component, "HAPTICS");
152 }
148} 153}
149 154
150static int arizona_haptics_probe(struct platform_device *pdev) 155static int arizona_haptics_probe(struct platform_device *pdev)
diff --git a/drivers/input/mouse/psmouse-base.c b/drivers/input/mouse/psmouse-base.c
index fb4b185dea96..bee267424972 100644
--- a/drivers/input/mouse/psmouse-base.c
+++ b/drivers/input/mouse/psmouse-base.c
@@ -1115,10 +1115,6 @@ static int psmouse_extensions(struct psmouse *psmouse,
1115 if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2, 1115 if (psmouse_try_protocol(psmouse, PSMOUSE_TOUCHKIT_PS2,
1116 &max_proto, set_properties, true)) 1116 &max_proto, set_properties, true))
1117 return PSMOUSE_TOUCHKIT_PS2; 1117 return PSMOUSE_TOUCHKIT_PS2;
1118
1119 if (psmouse_try_protocol(psmouse, PSMOUSE_BYD,
1120 &max_proto, set_properties, true))
1121 return PSMOUSE_BYD;
1122 } 1118 }
1123 1119
1124 /* 1120 /*
diff --git a/drivers/iommu/arm-smmu-v3.c b/drivers/iommu/arm-smmu-v3.c
index 15c01c3cd540..e6f9b2d745ca 100644
--- a/drivers/iommu/arm-smmu-v3.c
+++ b/drivers/iommu/arm-smmu-v3.c
@@ -2636,17 +2636,26 @@ static int arm_smmu_device_dt_probe(struct platform_device *pdev)
2636 /* And we're up. Go go go! */ 2636 /* And we're up. Go go go! */
2637 of_iommu_set_ops(dev->of_node, &arm_smmu_ops); 2637 of_iommu_set_ops(dev->of_node, &arm_smmu_ops);
2638#ifdef CONFIG_PCI 2638#ifdef CONFIG_PCI
2639 pci_request_acs(); 2639 if (pci_bus_type.iommu_ops != &arm_smmu_ops) {
2640 ret = bus_set_iommu(&pci_bus_type, &arm_smmu_ops); 2640 pci_request_acs();
2641 if (ret) 2641 ret = bus_set_iommu(&pci_bus_type, &arm_smmu_ops);
2642 return ret; 2642 if (ret)
2643 return ret;
2644 }
2643#endif 2645#endif
2644#ifdef CONFIG_ARM_AMBA 2646#ifdef CONFIG_ARM_AMBA
2645 ret = bus_set_iommu(&amba_bustype, &arm_smmu_ops); 2647 if (amba_bustype.iommu_ops != &arm_smmu_ops) {
2646 if (ret) 2648 ret = bus_set_iommu(&amba_bustype, &arm_smmu_ops);
2647 return ret; 2649 if (ret)
2650 return ret;
2651 }
2648#endif 2652#endif
2649 return bus_set_iommu(&platform_bus_type, &arm_smmu_ops); 2653 if (platform_bus_type.iommu_ops != &arm_smmu_ops) {
2654 ret = bus_set_iommu(&platform_bus_type, &arm_smmu_ops);
2655 if (ret)
2656 return ret;
2657 }
2658 return 0;
2650} 2659}
2651 2660
2652static int arm_smmu_device_remove(struct platform_device *pdev) 2661static int arm_smmu_device_remove(struct platform_device *pdev)
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index c841eb7a1a74..8f7281444551 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -324,8 +324,10 @@ struct arm_smmu_master_cfg {
324#define INVALID_SMENDX -1 324#define INVALID_SMENDX -1
325#define __fwspec_cfg(fw) ((struct arm_smmu_master_cfg *)fw->iommu_priv) 325#define __fwspec_cfg(fw) ((struct arm_smmu_master_cfg *)fw->iommu_priv)
326#define fwspec_smmu(fw) (__fwspec_cfg(fw)->smmu) 326#define fwspec_smmu(fw) (__fwspec_cfg(fw)->smmu)
327#define fwspec_smendx(fw, i) \
328 (i >= fw->num_ids ? INVALID_SMENDX : __fwspec_cfg(fw)->smendx[i])
327#define for_each_cfg_sme(fw, i, idx) \ 329#define for_each_cfg_sme(fw, i, idx) \
328 for (i = 0; idx = __fwspec_cfg(fw)->smendx[i], i < fw->num_ids; ++i) 330 for (i = 0; idx = fwspec_smendx(fw, i), i < fw->num_ids; ++i)
329 331
330struct arm_smmu_device { 332struct arm_smmu_device {
331 struct device *dev; 333 struct device *dev;
@@ -1228,6 +1230,16 @@ static int arm_smmu_attach_dev(struct iommu_domain *domain, struct device *dev)
1228 return -ENXIO; 1230 return -ENXIO;
1229 } 1231 }
1230 1232
1233 /*
1234 * FIXME: The arch/arm DMA API code tries to attach devices to its own
1235 * domains between of_xlate() and add_device() - we have no way to cope
1236 * with that, so until ARM gets converted to rely on groups and default
1237 * domains, just say no (but more politely than by dereferencing NULL).
1238 * This should be at least a WARN_ON once that's sorted.
1239 */
1240 if (!fwspec->iommu_priv)
1241 return -ENODEV;
1242
1231 smmu = fwspec_smmu(fwspec); 1243 smmu = fwspec_smmu(fwspec);
1232 /* Ensure that the domain is finalised */ 1244 /* Ensure that the domain is finalised */
1233 ret = arm_smmu_init_domain_context(domain, smmu); 1245 ret = arm_smmu_init_domain_context(domain, smmu);
@@ -1390,7 +1402,7 @@ static int arm_smmu_add_device(struct device *dev)
1390 fwspec = dev->iommu_fwspec; 1402 fwspec = dev->iommu_fwspec;
1391 if (ret) 1403 if (ret)
1392 goto out_free; 1404 goto out_free;
1393 } else if (fwspec) { 1405 } else if (fwspec && fwspec->ops == &arm_smmu_ops) {
1394 smmu = arm_smmu_get_by_node(to_of_node(fwspec->iommu_fwnode)); 1406 smmu = arm_smmu_get_by_node(to_of_node(fwspec->iommu_fwnode));
1395 } else { 1407 } else {
1396 return -ENODEV; 1408 return -ENODEV;
diff --git a/drivers/iommu/dmar.c b/drivers/iommu/dmar.c
index 58470f5ced04..8c53748a769d 100644
--- a/drivers/iommu/dmar.c
+++ b/drivers/iommu/dmar.c
@@ -338,7 +338,9 @@ static int dmar_pci_bus_notifier(struct notifier_block *nb,
338 struct pci_dev *pdev = to_pci_dev(data); 338 struct pci_dev *pdev = to_pci_dev(data);
339 struct dmar_pci_notify_info *info; 339 struct dmar_pci_notify_info *info;
340 340
341 /* Only care about add/remove events for physical functions */ 341 /* Only care about add/remove events for physical functions.
342 * For VFs we actually do the lookup based on the corresponding
343 * PF in device_to_iommu() anyway. */
342 if (pdev->is_virtfn) 344 if (pdev->is_virtfn)
343 return NOTIFY_DONE; 345 return NOTIFY_DONE;
344 if (action != BUS_NOTIFY_ADD_DEVICE && 346 if (action != BUS_NOTIFY_ADD_DEVICE &&
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index a4407eabf0e6..d8376c2d18b3 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -892,7 +892,13 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
892 return NULL; 892 return NULL;
893 893
894 if (dev_is_pci(dev)) { 894 if (dev_is_pci(dev)) {
895 struct pci_dev *pf_pdev;
896
895 pdev = to_pci_dev(dev); 897 pdev = to_pci_dev(dev);
898 /* VFs aren't listed in scope tables; we need to look up
899 * the PF instead to find the IOMMU. */
900 pf_pdev = pci_physfn(pdev);
901 dev = &pf_pdev->dev;
896 segment = pci_domain_nr(pdev->bus); 902 segment = pci_domain_nr(pdev->bus);
897 } else if (has_acpi_companion(dev)) 903 } else if (has_acpi_companion(dev))
898 dev = &ACPI_COMPANION(dev)->dev; 904 dev = &ACPI_COMPANION(dev)->dev;
@@ -905,6 +911,13 @@ static struct intel_iommu *device_to_iommu(struct device *dev, u8 *bus, u8 *devf
905 for_each_active_dev_scope(drhd->devices, 911 for_each_active_dev_scope(drhd->devices,
906 drhd->devices_cnt, i, tmp) { 912 drhd->devices_cnt, i, tmp) {
907 if (tmp == dev) { 913 if (tmp == dev) {
914 /* For a VF use its original BDF# not that of the PF
915 * which we used for the IOMMU lookup. Strictly speaking
916 * we could do this for all PCI devices; we only need to
917 * get the BDF# from the scope table for ACPI matches. */
918 if (pdev->is_virtfn)
919 goto got_pdev;
920
908 *bus = drhd->devices[i].bus; 921 *bus = drhd->devices[i].bus;
909 *devfn = drhd->devices[i].devfn; 922 *devfn = drhd->devices[i].devfn;
910 goto out; 923 goto out;
@@ -1711,6 +1724,7 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)
1711 if (!iommu->domains || !iommu->domain_ids) 1724 if (!iommu->domains || !iommu->domain_ids)
1712 return; 1725 return;
1713 1726
1727again:
1714 spin_lock_irqsave(&device_domain_lock, flags); 1728 spin_lock_irqsave(&device_domain_lock, flags);
1715 list_for_each_entry_safe(info, tmp, &device_domain_list, global) { 1729 list_for_each_entry_safe(info, tmp, &device_domain_list, global) {
1716 struct dmar_domain *domain; 1730 struct dmar_domain *domain;
@@ -1723,10 +1737,19 @@ static void disable_dmar_iommu(struct intel_iommu *iommu)
1723 1737
1724 domain = info->domain; 1738 domain = info->domain;
1725 1739
1726 dmar_remove_one_dev_info(domain, info->dev); 1740 __dmar_remove_one_dev_info(info);
1727 1741
1728 if (!domain_type_is_vm_or_si(domain)) 1742 if (!domain_type_is_vm_or_si(domain)) {
1743 /*
1744 * The domain_exit() function can't be called under
1745 * device_domain_lock, as it takes this lock itself.
1746 * So release the lock here and re-run the loop
1747 * afterwards.
1748 */
1749 spin_unlock_irqrestore(&device_domain_lock, flags);
1729 domain_exit(domain); 1750 domain_exit(domain);
1751 goto again;
1752 }
1730 } 1753 }
1731 spin_unlock_irqrestore(&device_domain_lock, flags); 1754 spin_unlock_irqrestore(&device_domain_lock, flags);
1732 1755
diff --git a/drivers/iommu/intel-svm.c b/drivers/iommu/intel-svm.c
index 8ebb3530afa7..cb72e0011310 100644
--- a/drivers/iommu/intel-svm.c
+++ b/drivers/iommu/intel-svm.c
@@ -39,10 +39,18 @@ int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu)
39 struct page *pages; 39 struct page *pages;
40 int order; 40 int order;
41 41
42 order = ecap_pss(iommu->ecap) + 7 - PAGE_SHIFT; 42 /* Start at 2 because it's defined as 2^(1+PSS) */
43 if (order < 0) 43 iommu->pasid_max = 2 << ecap_pss(iommu->ecap);
44 order = 0; 44
45 45 /* Eventually I'm promised we will get a multi-level PASID table
46 * and it won't have to be physically contiguous. Until then,
47 * limit the size because 8MiB contiguous allocations can be hard
48 * to come by. The limit of 0x20000, which is 1MiB for each of
49 * the PASID and PASID-state tables, is somewhat arbitrary. */
50 if (iommu->pasid_max > 0x20000)
51 iommu->pasid_max = 0x20000;
52
53 order = get_order(sizeof(struct pasid_entry) * iommu->pasid_max);
46 pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); 54 pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
47 if (!pages) { 55 if (!pages) {
48 pr_warn("IOMMU: %s: Failed to allocate PASID table\n", 56 pr_warn("IOMMU: %s: Failed to allocate PASID table\n",
@@ -53,6 +61,8 @@ int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu)
53 pr_info("%s: Allocated order %d PASID table.\n", iommu->name, order); 61 pr_info("%s: Allocated order %d PASID table.\n", iommu->name, order);
54 62
55 if (ecap_dis(iommu->ecap)) { 63 if (ecap_dis(iommu->ecap)) {
64 /* Just making it explicit... */
65 BUILD_BUG_ON(sizeof(struct pasid_entry) != sizeof(struct pasid_state_entry));
56 pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order); 66 pages = alloc_pages(GFP_KERNEL | __GFP_ZERO, order);
57 if (pages) 67 if (pages)
58 iommu->pasid_state_table = page_address(pages); 68 iommu->pasid_state_table = page_address(pages);
@@ -68,11 +78,7 @@ int intel_svm_alloc_pasid_tables(struct intel_iommu *iommu)
68 78
69int intel_svm_free_pasid_tables(struct intel_iommu *iommu) 79int intel_svm_free_pasid_tables(struct intel_iommu *iommu)
70{ 80{
71 int order; 81 int order = get_order(sizeof(struct pasid_entry) * iommu->pasid_max);
72
73 order = ecap_pss(iommu->ecap) + 7 - PAGE_SHIFT;
74 if (order < 0)
75 order = 0;
76 82
77 if (iommu->pasid_table) { 83 if (iommu->pasid_table) {
78 free_pages((unsigned long)iommu->pasid_table, order); 84 free_pages((unsigned long)iommu->pasid_table, order);
@@ -371,8 +377,8 @@ int intel_svm_bind_mm(struct device *dev, int *pasid, int flags, struct svm_dev_
371 } 377 }
372 svm->iommu = iommu; 378 svm->iommu = iommu;
373 379
374 if (pasid_max > 2 << ecap_pss(iommu->ecap)) 380 if (pasid_max > iommu->pasid_max)
375 pasid_max = 2 << ecap_pss(iommu->ecap); 381 pasid_max = iommu->pasid_max;
376 382
377 /* Do not use PASID 0 in caching mode (virtualised IOMMU) */ 383 /* Do not use PASID 0 in caching mode (virtualised IOMMU) */
378 ret = idr_alloc(&iommu->pasid_idr, svm, 384 ret = idr_alloc(&iommu->pasid_idr, svm,
diff --git a/drivers/isdn/gigaset/ser-gigaset.c b/drivers/isdn/gigaset/ser-gigaset.c
index d1f8ab915b15..b90776ef56ec 100644
--- a/drivers/isdn/gigaset/ser-gigaset.c
+++ b/drivers/isdn/gigaset/ser-gigaset.c
@@ -755,8 +755,10 @@ static int __init ser_gigaset_init(void)
755 driver = gigaset_initdriver(GIGASET_MINOR, GIGASET_MINORS, 755 driver = gigaset_initdriver(GIGASET_MINOR, GIGASET_MINORS,
756 GIGASET_MODULENAME, GIGASET_DEVNAME, 756 GIGASET_MODULENAME, GIGASET_DEVNAME,
757 &ops, THIS_MODULE); 757 &ops, THIS_MODULE);
758 if (!driver) 758 if (!driver) {
759 rc = -ENOMEM;
759 goto error; 760 goto error;
761 }
760 762
761 rc = tty_register_ldisc(N_GIGASET_M101, &gigaset_ldisc); 763 rc = tty_register_ldisc(N_GIGASET_M101, &gigaset_ldisc);
762 if (rc != 0) { 764 if (rc != 0) {
diff --git a/drivers/isdn/hisax/hfc4s8s_l1.c b/drivers/isdn/hisax/hfc4s8s_l1.c
index 9600cd771f1a..e034ed847ff3 100644
--- a/drivers/isdn/hisax/hfc4s8s_l1.c
+++ b/drivers/isdn/hisax/hfc4s8s_l1.c
@@ -1499,6 +1499,7 @@ hfc4s8s_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1499 printk(KERN_INFO 1499 printk(KERN_INFO
1500 "HFC-4S/8S: failed to request address space at 0x%04x\n", 1500 "HFC-4S/8S: failed to request address space at 0x%04x\n",
1501 hw->iobase); 1501 hw->iobase);
1502 err = -EBUSY;
1502 goto out; 1503 goto out;
1503 } 1504 }
1504 1505
diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c
index 08c87fadca8c..1f32688c312d 100644
--- a/drivers/mailbox/pcc.c
+++ b/drivers/mailbox/pcc.c
@@ -65,6 +65,7 @@
65#include <linux/mailbox_controller.h> 65#include <linux/mailbox_controller.h>
66#include <linux/mailbox_client.h> 66#include <linux/mailbox_client.h>
67#include <linux/io-64-nonatomic-lo-hi.h> 67#include <linux/io-64-nonatomic-lo-hi.h>
68#include <acpi/pcc.h>
68 69
69#include "mailbox.h" 70#include "mailbox.h"
70 71
@@ -267,6 +268,8 @@ struct mbox_chan *pcc_mbox_request_channel(struct mbox_client *cl,
267 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone) 268 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone)
268 chan->txdone_method |= TXDONE_BY_ACK; 269 chan->txdone_method |= TXDONE_BY_ACK;
269 270
271 spin_unlock_irqrestore(&chan->lock, flags);
272
270 if (pcc_doorbell_irq[subspace_id] > 0) { 273 if (pcc_doorbell_irq[subspace_id] > 0) {
271 int rc; 274 int rc;
272 275
@@ -275,12 +278,11 @@ struct mbox_chan *pcc_mbox_request_channel(struct mbox_client *cl,
275 if (unlikely(rc)) { 278 if (unlikely(rc)) {
276 dev_err(dev, "failed to register PCC interrupt %d\n", 279 dev_err(dev, "failed to register PCC interrupt %d\n",
277 pcc_doorbell_irq[subspace_id]); 280 pcc_doorbell_irq[subspace_id]);
281 pcc_mbox_free_channel(chan);
278 chan = ERR_PTR(rc); 282 chan = ERR_PTR(rc);
279 } 283 }
280 } 284 }
281 285
282 spin_unlock_irqrestore(&chan->lock, flags);
283
284 return chan; 286 return chan;
285} 287}
286EXPORT_SYMBOL_GPL(pcc_mbox_request_channel); 288EXPORT_SYMBOL_GPL(pcc_mbox_request_channel);
@@ -304,20 +306,19 @@ void pcc_mbox_free_channel(struct mbox_chan *chan)
304 return; 306 return;
305 } 307 }
306 308
309 if (pcc_doorbell_irq[id] > 0)
310 devm_free_irq(chan->mbox->dev, pcc_doorbell_irq[id], chan);
311
307 spin_lock_irqsave(&chan->lock, flags); 312 spin_lock_irqsave(&chan->lock, flags);
308 chan->cl = NULL; 313 chan->cl = NULL;
309 chan->active_req = NULL; 314 chan->active_req = NULL;
310 if (chan->txdone_method == (TXDONE_BY_POLL | TXDONE_BY_ACK)) 315 if (chan->txdone_method == (TXDONE_BY_POLL | TXDONE_BY_ACK))
311 chan->txdone_method = TXDONE_BY_POLL; 316 chan->txdone_method = TXDONE_BY_POLL;
312 317
313 if (pcc_doorbell_irq[id] > 0)
314 devm_free_irq(chan->mbox->dev, pcc_doorbell_irq[id], chan);
315
316 spin_unlock_irqrestore(&chan->lock, flags); 318 spin_unlock_irqrestore(&chan->lock, flags);
317} 319}
318EXPORT_SYMBOL_GPL(pcc_mbox_free_channel); 320EXPORT_SYMBOL_GPL(pcc_mbox_free_channel);
319 321
320
321/** 322/**
322 * pcc_send_data - Called from Mailbox Controller code. Used 323 * pcc_send_data - Called from Mailbox Controller code. Used
323 * here only to ring the channel doorbell. The PCC client 324 * here only to ring the channel doorbell. The PCC client
diff --git a/drivers/media/dvb-frontends/Kconfig b/drivers/media/dvb-frontends/Kconfig
index 012225587c25..b71b747ee0ba 100644
--- a/drivers/media/dvb-frontends/Kconfig
+++ b/drivers/media/dvb-frontends/Kconfig
@@ -513,6 +513,11 @@ config DVB_AS102_FE
513 depends on DVB_CORE 513 depends on DVB_CORE
514 default DVB_AS102 514 default DVB_AS102
515 515
516config DVB_GP8PSK_FE
517 tristate
518 depends on DVB_CORE
519 default DVB_USB_GP8PSK
520
516comment "DVB-C (cable) frontends" 521comment "DVB-C (cable) frontends"
517 depends on DVB_CORE 522 depends on DVB_CORE
518 523
diff --git a/drivers/media/dvb-frontends/Makefile b/drivers/media/dvb-frontends/Makefile
index e90165ad361b..93921a4eaa27 100644
--- a/drivers/media/dvb-frontends/Makefile
+++ b/drivers/media/dvb-frontends/Makefile
@@ -121,6 +121,7 @@ obj-$(CONFIG_DVB_RTL2832_SDR) += rtl2832_sdr.o
121obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o 121obj-$(CONFIG_DVB_M88RS2000) += m88rs2000.o
122obj-$(CONFIG_DVB_AF9033) += af9033.o 122obj-$(CONFIG_DVB_AF9033) += af9033.o
123obj-$(CONFIG_DVB_AS102_FE) += as102_fe.o 123obj-$(CONFIG_DVB_AS102_FE) += as102_fe.o
124obj-$(CONFIG_DVB_GP8PSK_FE) += gp8psk-fe.o
124obj-$(CONFIG_DVB_TC90522) += tc90522.o 125obj-$(CONFIG_DVB_TC90522) += tc90522.o
125obj-$(CONFIG_DVB_HORUS3A) += horus3a.o 126obj-$(CONFIG_DVB_HORUS3A) += horus3a.o
126obj-$(CONFIG_DVB_ASCOT2E) += ascot2e.o 127obj-$(CONFIG_DVB_ASCOT2E) += ascot2e.o
diff --git a/drivers/media/usb/dvb-usb/gp8psk-fe.c b/drivers/media/dvb-frontends/gp8psk-fe.c
index db6eb79cde07..93f59bfea092 100644
--- a/drivers/media/usb/dvb-usb/gp8psk-fe.c
+++ b/drivers/media/dvb-frontends/gp8psk-fe.c
@@ -1,5 +1,5 @@
1/* DVB USB compliant Linux driver for the 1/*
2 * - GENPIX 8pks/qpsk/DCII USB2.0 DVB-S module 2 * Frontend driver for the GENPIX 8pks/qpsk/DCII USB2.0 DVB-S module
3 * 3 *
4 * Copyright (C) 2006,2007 Alan Nisota (alannisota@gmail.com) 4 * Copyright (C) 2006,2007 Alan Nisota (alannisota@gmail.com)
5 * Copyright (C) 2006,2007 Genpix Electronics (genpix@genpix-electronics.com) 5 * Copyright (C) 2006,2007 Genpix Electronics (genpix@genpix-electronics.com)
@@ -8,17 +8,31 @@
8 * 8 *
9 * This module is based off the vp7045 and vp702x modules 9 * This module is based off the vp7045 and vp702x modules
10 * 10 *
11 * This program is free software; you can redistribute it and/or modify it 11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms of the GNU General Public License as published by the Free 12 * under the terms of the GNU General Public License as published by the Free
13 * Software Foundation, version 2. 13 * Software Foundation, version 2.
14 *
15 * see Documentation/dvb/README.dvb-usb for more information
16 */ 14 */
17#include "gp8psk.h" 15
16#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
17
18#include "gp8psk-fe.h"
19#include "dvb_frontend.h"
20
21static int debug;
22module_param(debug, int, 0644);
23MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off).");
24
25#define dprintk(fmt, arg...) do { \
26 if (debug) \
27 printk(KERN_DEBUG pr_fmt("%s: " fmt), \
28 __func__, ##arg); \
29} while (0)
18 30
19struct gp8psk_fe_state { 31struct gp8psk_fe_state {
20 struct dvb_frontend fe; 32 struct dvb_frontend fe;
21 struct dvb_usb_device *d; 33 void *priv;
34 const struct gp8psk_fe_ops *ops;
35 bool is_rev1;
22 u8 lock; 36 u8 lock;
23 u16 snr; 37 u16 snr;
24 unsigned long next_status_check; 38 unsigned long next_status_check;
@@ -29,22 +43,24 @@ static int gp8psk_tuned_to_DCII(struct dvb_frontend *fe)
29{ 43{
30 struct gp8psk_fe_state *st = fe->demodulator_priv; 44 struct gp8psk_fe_state *st = fe->demodulator_priv;
31 u8 status; 45 u8 status;
32 gp8psk_usb_in_op(st->d, GET_8PSK_CONFIG, 0, 0, &status, 1); 46
47 st->ops->in(st->priv, GET_8PSK_CONFIG, 0, 0, &status, 1);
33 return status & bmDCtuned; 48 return status & bmDCtuned;
34} 49}
35 50
36static int gp8psk_set_tuner_mode(struct dvb_frontend *fe, int mode) 51static int gp8psk_set_tuner_mode(struct dvb_frontend *fe, int mode)
37{ 52{
38 struct gp8psk_fe_state *state = fe->demodulator_priv; 53 struct gp8psk_fe_state *st = fe->demodulator_priv;
39 return gp8psk_usb_out_op(state->d, SET_8PSK_CONFIG, mode, 0, NULL, 0); 54
55 return st->ops->out(st->priv, SET_8PSK_CONFIG, mode, 0, NULL, 0);
40} 56}
41 57
42static int gp8psk_fe_update_status(struct gp8psk_fe_state *st) 58static int gp8psk_fe_update_status(struct gp8psk_fe_state *st)
43{ 59{
44 u8 buf[6]; 60 u8 buf[6];
45 if (time_after(jiffies,st->next_status_check)) { 61 if (time_after(jiffies,st->next_status_check)) {
46 gp8psk_usb_in_op(st->d, GET_SIGNAL_LOCK, 0,0,&st->lock,1); 62 st->ops->in(st->priv, GET_SIGNAL_LOCK, 0, 0, &st->lock, 1);
47 gp8psk_usb_in_op(st->d, GET_SIGNAL_STRENGTH, 0,0,buf,6); 63 st->ops->in(st->priv, GET_SIGNAL_STRENGTH, 0, 0, buf, 6);
48 st->snr = (buf[1]) << 8 | buf[0]; 64 st->snr = (buf[1]) << 8 | buf[0];
49 st->next_status_check = jiffies + (st->status_check_interval*HZ)/1000; 65 st->next_status_check = jiffies + (st->status_check_interval*HZ)/1000;
50 } 66 }
@@ -116,13 +132,12 @@ static int gp8psk_fe_get_tune_settings(struct dvb_frontend* fe, struct dvb_front
116 132
117static int gp8psk_fe_set_frontend(struct dvb_frontend *fe) 133static int gp8psk_fe_set_frontend(struct dvb_frontend *fe)
118{ 134{
119 struct gp8psk_fe_state *state = fe->demodulator_priv; 135 struct gp8psk_fe_state *st = fe->demodulator_priv;
120 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 136 struct dtv_frontend_properties *c = &fe->dtv_property_cache;
121 u8 cmd[10]; 137 u8 cmd[10];
122 u32 freq = c->frequency * 1000; 138 u32 freq = c->frequency * 1000;
123 int gp_product_id = le16_to_cpu(state->d->udev->descriptor.idProduct);
124 139
125 deb_fe("%s()\n", __func__); 140 dprintk("%s()\n", __func__);
126 141
127 cmd[4] = freq & 0xff; 142 cmd[4] = freq & 0xff;
128 cmd[5] = (freq >> 8) & 0xff; 143 cmd[5] = (freq >> 8) & 0xff;
@@ -136,21 +151,21 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend *fe)
136 switch (c->delivery_system) { 151 switch (c->delivery_system) {
137 case SYS_DVBS: 152 case SYS_DVBS:
138 if (c->modulation != QPSK) { 153 if (c->modulation != QPSK) {
139 deb_fe("%s: unsupported modulation selected (%d)\n", 154 dprintk("%s: unsupported modulation selected (%d)\n",
140 __func__, c->modulation); 155 __func__, c->modulation);
141 return -EOPNOTSUPP; 156 return -EOPNOTSUPP;
142 } 157 }
143 c->fec_inner = FEC_AUTO; 158 c->fec_inner = FEC_AUTO;
144 break; 159 break;
145 case SYS_DVBS2: /* kept for backwards compatibility */ 160 case SYS_DVBS2: /* kept for backwards compatibility */
146 deb_fe("%s: DVB-S2 delivery system selected\n", __func__); 161 dprintk("%s: DVB-S2 delivery system selected\n", __func__);
147 break; 162 break;
148 case SYS_TURBO: 163 case SYS_TURBO:
149 deb_fe("%s: Turbo-FEC delivery system selected\n", __func__); 164 dprintk("%s: Turbo-FEC delivery system selected\n", __func__);
150 break; 165 break;
151 166
152 default: 167 default:
153 deb_fe("%s: unsupported delivery system selected (%d)\n", 168 dprintk("%s: unsupported delivery system selected (%d)\n",
154 __func__, c->delivery_system); 169 __func__, c->delivery_system);
155 return -EOPNOTSUPP; 170 return -EOPNOTSUPP;
156 } 171 }
@@ -161,9 +176,9 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend *fe)
161 cmd[3] = (c->symbol_rate >> 24) & 0xff; 176 cmd[3] = (c->symbol_rate >> 24) & 0xff;
162 switch (c->modulation) { 177 switch (c->modulation) {
163 case QPSK: 178 case QPSK:
164 if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) 179 if (st->is_rev1)
165 if (gp8psk_tuned_to_DCII(fe)) 180 if (gp8psk_tuned_to_DCII(fe))
166 gp8psk_bcm4500_reload(state->d); 181 st->ops->reload(st->priv);
167 switch (c->fec_inner) { 182 switch (c->fec_inner) {
168 case FEC_1_2: 183 case FEC_1_2:
169 cmd[9] = 0; break; 184 cmd[9] = 0; break;
@@ -207,18 +222,18 @@ static int gp8psk_fe_set_frontend(struct dvb_frontend *fe)
207 cmd[9] = 0; 222 cmd[9] = 0;
208 break; 223 break;
209 default: /* Unknown modulation */ 224 default: /* Unknown modulation */
210 deb_fe("%s: unsupported modulation selected (%d)\n", 225 dprintk("%s: unsupported modulation selected (%d)\n",
211 __func__, c->modulation); 226 __func__, c->modulation);
212 return -EOPNOTSUPP; 227 return -EOPNOTSUPP;
213 } 228 }
214 229
215 if (gp_product_id == USB_PID_GENPIX_8PSK_REV_1_WARM) 230 if (st->is_rev1)
216 gp8psk_set_tuner_mode(fe, 0); 231 gp8psk_set_tuner_mode(fe, 0);
217 gp8psk_usb_out_op(state->d, TUNE_8PSK, 0, 0, cmd, 10); 232 st->ops->out(st->priv, TUNE_8PSK, 0, 0, cmd, 10);
218 233
219 state->lock = 0; 234 st->lock = 0;
220 state->next_status_check = jiffies; 235 st->next_status_check = jiffies;
221 state->status_check_interval = 200; 236 st->status_check_interval = 200;
222 237
223 return 0; 238 return 0;
224} 239}
@@ -228,9 +243,9 @@ static int gp8psk_fe_send_diseqc_msg (struct dvb_frontend* fe,
228{ 243{
229 struct gp8psk_fe_state *st = fe->demodulator_priv; 244 struct gp8psk_fe_state *st = fe->demodulator_priv;
230 245
231 deb_fe("%s\n",__func__); 246 dprintk("%s\n", __func__);
232 247
233 if (gp8psk_usb_out_op(st->d,SEND_DISEQC_COMMAND, m->msg[0], 0, 248 if (st->ops->out(st->priv, SEND_DISEQC_COMMAND, m->msg[0], 0,
234 m->msg, m->msg_len)) { 249 m->msg, m->msg_len)) {
235 return -EINVAL; 250 return -EINVAL;
236 } 251 }
@@ -243,12 +258,12 @@ static int gp8psk_fe_send_diseqc_burst(struct dvb_frontend *fe,
243 struct gp8psk_fe_state *st = fe->demodulator_priv; 258 struct gp8psk_fe_state *st = fe->demodulator_priv;
244 u8 cmd; 259 u8 cmd;
245 260
246 deb_fe("%s\n",__func__); 261 dprintk("%s\n", __func__);
247 262
248 /* These commands are certainly wrong */ 263 /* These commands are certainly wrong */
249 cmd = (burst == SEC_MINI_A) ? 0x00 : 0x01; 264 cmd = (burst == SEC_MINI_A) ? 0x00 : 0x01;
250 265
251 if (gp8psk_usb_out_op(st->d,SEND_DISEQC_COMMAND, cmd, 0, 266 if (st->ops->out(st->priv, SEND_DISEQC_COMMAND, cmd, 0,
252 &cmd, 0)) { 267 &cmd, 0)) {
253 return -EINVAL; 268 return -EINVAL;
254 } 269 }
@@ -258,10 +273,10 @@ static int gp8psk_fe_send_diseqc_burst(struct dvb_frontend *fe,
258static int gp8psk_fe_set_tone(struct dvb_frontend *fe, 273static int gp8psk_fe_set_tone(struct dvb_frontend *fe,
259 enum fe_sec_tone_mode tone) 274 enum fe_sec_tone_mode tone)
260{ 275{
261 struct gp8psk_fe_state* state = fe->demodulator_priv; 276 struct gp8psk_fe_state *st = fe->demodulator_priv;
262 277
263 if (gp8psk_usb_out_op(state->d,SET_22KHZ_TONE, 278 if (st->ops->out(st->priv, SET_22KHZ_TONE,
264 (tone == SEC_TONE_ON), 0, NULL, 0)) { 279 (tone == SEC_TONE_ON), 0, NULL, 0)) {
265 return -EINVAL; 280 return -EINVAL;
266 } 281 }
267 return 0; 282 return 0;
@@ -270,9 +285,9 @@ static int gp8psk_fe_set_tone(struct dvb_frontend *fe,
270static int gp8psk_fe_set_voltage(struct dvb_frontend *fe, 285static int gp8psk_fe_set_voltage(struct dvb_frontend *fe,
271 enum fe_sec_voltage voltage) 286 enum fe_sec_voltage voltage)
272{ 287{
273 struct gp8psk_fe_state* state = fe->demodulator_priv; 288 struct gp8psk_fe_state *st = fe->demodulator_priv;
274 289
275 if (gp8psk_usb_out_op(state->d,SET_LNB_VOLTAGE, 290 if (st->ops->out(st->priv, SET_LNB_VOLTAGE,
276 voltage == SEC_VOLTAGE_18, 0, NULL, 0)) { 291 voltage == SEC_VOLTAGE_18, 0, NULL, 0)) {
277 return -EINVAL; 292 return -EINVAL;
278 } 293 }
@@ -281,52 +296,60 @@ static int gp8psk_fe_set_voltage(struct dvb_frontend *fe,
281 296
282static int gp8psk_fe_enable_high_lnb_voltage(struct dvb_frontend* fe, long onoff) 297static int gp8psk_fe_enable_high_lnb_voltage(struct dvb_frontend* fe, long onoff)
283{ 298{
284 struct gp8psk_fe_state* state = fe->demodulator_priv; 299 struct gp8psk_fe_state *st = fe->demodulator_priv;
285 return gp8psk_usb_out_op(state->d, USE_EXTRA_VOLT, onoff, 0,NULL,0); 300
301 return st->ops->out(st->priv, USE_EXTRA_VOLT, onoff, 0, NULL, 0);
286} 302}
287 303
288static int gp8psk_fe_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long sw_cmd) 304static int gp8psk_fe_send_legacy_dish_cmd (struct dvb_frontend* fe, unsigned long sw_cmd)
289{ 305{
290 struct gp8psk_fe_state* state = fe->demodulator_priv; 306 struct gp8psk_fe_state *st = fe->demodulator_priv;
291 u8 cmd = sw_cmd & 0x7f; 307 u8 cmd = sw_cmd & 0x7f;
292 308
293 if (gp8psk_usb_out_op(state->d,SET_DN_SWITCH, cmd, 0, 309 if (st->ops->out(st->priv, SET_DN_SWITCH, cmd, 0, NULL, 0))
294 NULL, 0)) {
295 return -EINVAL; 310 return -EINVAL;
296 } 311
297 if (gp8psk_usb_out_op(state->d,SET_LNB_VOLTAGE, !!(sw_cmd & 0x80), 312 if (st->ops->out(st->priv, SET_LNB_VOLTAGE, !!(sw_cmd & 0x80),
298 0, NULL, 0)) { 313 0, NULL, 0))
299 return -EINVAL; 314 return -EINVAL;
300 }
301 315
302 return 0; 316 return 0;
303} 317}
304 318
305static void gp8psk_fe_release(struct dvb_frontend* fe) 319static void gp8psk_fe_release(struct dvb_frontend* fe)
306{ 320{
307 struct gp8psk_fe_state *state = fe->demodulator_priv; 321 struct gp8psk_fe_state *st = fe->demodulator_priv;
308 kfree(state); 322
323 kfree(st);
309} 324}
310 325
311static struct dvb_frontend_ops gp8psk_fe_ops; 326static struct dvb_frontend_ops gp8psk_fe_ops;
312 327
313struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d) 328struct dvb_frontend *gp8psk_fe_attach(const struct gp8psk_fe_ops *ops,
329 void *priv, bool is_rev1)
314{ 330{
315 struct gp8psk_fe_state *s = kzalloc(sizeof(struct gp8psk_fe_state), GFP_KERNEL); 331 struct gp8psk_fe_state *st;
316 if (s == NULL)
317 goto error;
318
319 s->d = d;
320 memcpy(&s->fe.ops, &gp8psk_fe_ops, sizeof(struct dvb_frontend_ops));
321 s->fe.demodulator_priv = s;
322
323 goto success;
324error:
325 return NULL;
326success:
327 return &s->fe;
328}
329 332
333 if (!ops || !ops->in || !ops->out || !ops->reload) {
334 pr_err("Error! gp8psk-fe ops not defined.\n");
335 return NULL;
336 }
337
338 st = kzalloc(sizeof(struct gp8psk_fe_state), GFP_KERNEL);
339 if (!st)
340 return NULL;
341
342 memcpy(&st->fe.ops, &gp8psk_fe_ops, sizeof(struct dvb_frontend_ops));
343 st->fe.demodulator_priv = st;
344 st->ops = ops;
345 st->priv = priv;
346 st->is_rev1 = is_rev1;
347
348 pr_info("Frontend %sattached\n", is_rev1 ? "revision 1 " : "");
349
350 return &st->fe;
351}
352EXPORT_SYMBOL_GPL(gp8psk_fe_attach);
330 353
331static struct dvb_frontend_ops gp8psk_fe_ops = { 354static struct dvb_frontend_ops gp8psk_fe_ops = {
332 .delsys = { SYS_DVBS }, 355 .delsys = { SYS_DVBS },
@@ -370,3 +393,8 @@ static struct dvb_frontend_ops gp8psk_fe_ops = {
370 .dishnetwork_send_legacy_command = gp8psk_fe_send_legacy_dish_cmd, 393 .dishnetwork_send_legacy_command = gp8psk_fe_send_legacy_dish_cmd,
371 .enable_high_lnb_voltage = gp8psk_fe_enable_high_lnb_voltage 394 .enable_high_lnb_voltage = gp8psk_fe_enable_high_lnb_voltage
372}; 395};
396
397MODULE_AUTHOR("Alan Nisota <alannisota@gamil.com>");
398MODULE_DESCRIPTION("Frontend Driver for Genpix DVB-S");
399MODULE_VERSION("1.1");
400MODULE_LICENSE("GPL");
diff --git a/drivers/media/dvb-frontends/gp8psk-fe.h b/drivers/media/dvb-frontends/gp8psk-fe.h
new file mode 100644
index 000000000000..6c7944b1ecd6
--- /dev/null
+++ b/drivers/media/dvb-frontends/gp8psk-fe.h
@@ -0,0 +1,82 @@
1/*
2 * gp8psk_fe driver
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14
15#ifndef GP8PSK_FE_H
16#define GP8PSK_FE_H
17
18#include <linux/types.h>
19
20/* gp8psk commands */
21
22#define GET_8PSK_CONFIG 0x80 /* in */
23#define SET_8PSK_CONFIG 0x81
24#define I2C_WRITE 0x83
25#define I2C_READ 0x84
26#define ARM_TRANSFER 0x85
27#define TUNE_8PSK 0x86
28#define GET_SIGNAL_STRENGTH 0x87 /* in */
29#define LOAD_BCM4500 0x88
30#define BOOT_8PSK 0x89 /* in */
31#define START_INTERSIL 0x8A /* in */
32#define SET_LNB_VOLTAGE 0x8B
33#define SET_22KHZ_TONE 0x8C
34#define SEND_DISEQC_COMMAND 0x8D
35#define SET_DVB_MODE 0x8E
36#define SET_DN_SWITCH 0x8F
37#define GET_SIGNAL_LOCK 0x90 /* in */
38#define GET_FW_VERS 0x92
39#define GET_SERIAL_NUMBER 0x93 /* in */
40#define USE_EXTRA_VOLT 0x94
41#define GET_FPGA_VERS 0x95
42#define CW3K_INIT 0x9d
43
44/* PSK_configuration bits */
45#define bm8pskStarted 0x01
46#define bm8pskFW_Loaded 0x02
47#define bmIntersilOn 0x04
48#define bmDVBmode 0x08
49#define bm22kHz 0x10
50#define bmSEL18V 0x20
51#define bmDCtuned 0x40
52#define bmArmed 0x80
53
54/* Satellite modulation modes */
55#define ADV_MOD_DVB_QPSK 0 /* DVB-S QPSK */
56#define ADV_MOD_TURBO_QPSK 1 /* Turbo QPSK */
57#define ADV_MOD_TURBO_8PSK 2 /* Turbo 8PSK (also used for Trellis 8PSK) */
58#define ADV_MOD_TURBO_16QAM 3 /* Turbo 16QAM (also used for Trellis 8PSK) */
59
60#define ADV_MOD_DCII_C_QPSK 4 /* Digicipher II Combo */
61#define ADV_MOD_DCII_I_QPSK 5 /* Digicipher II I-stream */
62#define ADV_MOD_DCII_Q_QPSK 6 /* Digicipher II Q-stream */
63#define ADV_MOD_DCII_C_OQPSK 7 /* Digicipher II offset QPSK */
64#define ADV_MOD_DSS_QPSK 8 /* DSS (DIRECTV) QPSK */
65#define ADV_MOD_DVB_BPSK 9 /* DVB-S BPSK */
66
67/* firmware revision id's */
68#define GP8PSK_FW_REV1 0x020604
69#define GP8PSK_FW_REV2 0x020704
70#define GP8PSK_FW_VERS(_fw_vers) \
71 ((_fw_vers)[2]<<0x10 | (_fw_vers)[1]<<0x08 | (_fw_vers)[0])
72
73struct gp8psk_fe_ops {
74 int (*in)(void *priv, u8 req, u16 value, u16 index, u8 *b, int blen);
75 int (*out)(void *priv, u8 req, u16 value, u16 index, u8 *b, int blen);
76 int (*reload)(void *priv);
77};
78
79struct dvb_frontend *gp8psk_fe_attach(const struct gp8psk_fe_ops *ops,
80 void *priv, bool is_rev1);
81
82#endif
diff --git a/drivers/media/i2c/ir-kbd-i2c.c b/drivers/media/i2c/ir-kbd-i2c.c
index f95a6bc839d5..cede3975d04b 100644
--- a/drivers/media/i2c/ir-kbd-i2c.c
+++ b/drivers/media/i2c/ir-kbd-i2c.c
@@ -118,7 +118,7 @@ static int get_key_haup_common(struct IR_i2c *ir, enum rc_type *protocol,
118 *protocol = RC_TYPE_RC6_MCE; 118 *protocol = RC_TYPE_RC6_MCE;
119 dev &= 0x7f; 119 dev &= 0x7f;
120 dprintk(1, "ir hauppauge (rc6-mce): t%d vendor=%d dev=%d code=%d\n", 120 dprintk(1, "ir hauppauge (rc6-mce): t%d vendor=%d dev=%d code=%d\n",
121 toggle, vendor, dev, code); 121 *ptoggle, vendor, dev, code);
122 } else { 122 } else {
123 *ptoggle = 0; 123 *ptoggle = 0;
124 *protocol = RC_TYPE_RC6_6A_32; 124 *protocol = RC_TYPE_RC6_6A_32;
diff --git a/drivers/media/tuners/tuner-xc2028.c b/drivers/media/tuners/tuner-xc2028.c
index 317ef63ee789..8d96a22647b3 100644
--- a/drivers/media/tuners/tuner-xc2028.c
+++ b/drivers/media/tuners/tuner-xc2028.c
@@ -281,6 +281,14 @@ static void free_firmware(struct xc2028_data *priv)
281 int i; 281 int i;
282 tuner_dbg("%s called\n", __func__); 282 tuner_dbg("%s called\n", __func__);
283 283
284 /* free allocated f/w string */
285 if (priv->fname != firmware_name)
286 kfree(priv->fname);
287 priv->fname = NULL;
288
289 priv->state = XC2028_NO_FIRMWARE;
290 memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));
291
284 if (!priv->firm) 292 if (!priv->firm)
285 return; 293 return;
286 294
@@ -291,9 +299,6 @@ static void free_firmware(struct xc2028_data *priv)
291 299
292 priv->firm = NULL; 300 priv->firm = NULL;
293 priv->firm_size = 0; 301 priv->firm_size = 0;
294 priv->state = XC2028_NO_FIRMWARE;
295
296 memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));
297} 302}
298 303
299static int load_all_firmwares(struct dvb_frontend *fe, 304static int load_all_firmwares(struct dvb_frontend *fe,
@@ -884,9 +889,8 @@ read_not_reliable:
884 return 0; 889 return 0;
885 890
886fail: 891fail:
887 priv->state = XC2028_NO_FIRMWARE; 892 free_firmware(priv);
888 893
889 memset(&priv->cur_fw, 0, sizeof(priv->cur_fw));
890 if (retry_count < 8) { 894 if (retry_count < 8) {
891 msleep(50); 895 msleep(50);
892 retry_count++; 896 retry_count++;
@@ -1332,11 +1336,8 @@ static int xc2028_dvb_release(struct dvb_frontend *fe)
1332 mutex_lock(&xc2028_list_mutex); 1336 mutex_lock(&xc2028_list_mutex);
1333 1337
1334 /* only perform final cleanup if this is the last instance */ 1338 /* only perform final cleanup if this is the last instance */
1335 if (hybrid_tuner_report_instance_count(priv) == 1) { 1339 if (hybrid_tuner_report_instance_count(priv) == 1)
1336 free_firmware(priv); 1340 free_firmware(priv);
1337 kfree(priv->ctrl.fname);
1338 priv->ctrl.fname = NULL;
1339 }
1340 1341
1341 if (priv) 1342 if (priv)
1342 hybrid_tuner_release_state(priv); 1343 hybrid_tuner_release_state(priv);
@@ -1399,19 +1400,8 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg)
1399 1400
1400 /* 1401 /*
1401 * Copy the config data. 1402 * Copy the config data.
1402 * For the firmware name, keep a local copy of the string,
1403 * in order to avoid troubles during device release.
1404 */ 1403 */
1405 kfree(priv->ctrl.fname);
1406 priv->ctrl.fname = NULL;
1407 memcpy(&priv->ctrl, p, sizeof(priv->ctrl)); 1404 memcpy(&priv->ctrl, p, sizeof(priv->ctrl));
1408 if (p->fname) {
1409 priv->ctrl.fname = kstrdup(p->fname, GFP_KERNEL);
1410 if (priv->ctrl.fname == NULL) {
1411 rc = -ENOMEM;
1412 goto unlock;
1413 }
1414 }
1415 1405
1416 /* 1406 /*
1417 * If firmware name changed, frees firmware. As free_firmware will 1407 * If firmware name changed, frees firmware. As free_firmware will
@@ -1426,10 +1416,15 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg)
1426 1416
1427 if (priv->state == XC2028_NO_FIRMWARE) { 1417 if (priv->state == XC2028_NO_FIRMWARE) {
1428 if (!firmware_name[0]) 1418 if (!firmware_name[0])
1429 priv->fname = priv->ctrl.fname; 1419 priv->fname = kstrdup(p->fname, GFP_KERNEL);
1430 else 1420 else
1431 priv->fname = firmware_name; 1421 priv->fname = firmware_name;
1432 1422
1423 if (!priv->fname) {
1424 rc = -ENOMEM;
1425 goto unlock;
1426 }
1427
1433 rc = request_firmware_nowait(THIS_MODULE, 1, 1428 rc = request_firmware_nowait(THIS_MODULE, 1,
1434 priv->fname, 1429 priv->fname,
1435 priv->i2c_props.adap->dev.parent, 1430 priv->i2c_props.adap->dev.parent,
diff --git a/drivers/media/usb/dvb-usb/Makefile b/drivers/media/usb/dvb-usb/Makefile
index 2a7b5a963acf..3b3f32b426d1 100644
--- a/drivers/media/usb/dvb-usb/Makefile
+++ b/drivers/media/usb/dvb-usb/Makefile
@@ -8,7 +8,7 @@ obj-$(CONFIG_DVB_USB_VP7045) += dvb-usb-vp7045.o
8dvb-usb-vp702x-objs := vp702x.o vp702x-fe.o 8dvb-usb-vp702x-objs := vp702x.o vp702x-fe.o
9obj-$(CONFIG_DVB_USB_VP702X) += dvb-usb-vp702x.o 9obj-$(CONFIG_DVB_USB_VP702X) += dvb-usb-vp702x.o
10 10
11dvb-usb-gp8psk-objs := gp8psk.o gp8psk-fe.o 11dvb-usb-gp8psk-objs := gp8psk.o
12obj-$(CONFIG_DVB_USB_GP8PSK) += dvb-usb-gp8psk.o 12obj-$(CONFIG_DVB_USB_GP8PSK) += dvb-usb-gp8psk.o
13 13
14dvb-usb-dtt200u-objs := dtt200u.o dtt200u-fe.o 14dvb-usb-dtt200u-objs := dtt200u.o dtt200u-fe.o
diff --git a/drivers/media/usb/dvb-usb/af9005.c b/drivers/media/usb/dvb-usb/af9005.c
index b257780fb380..7853261906b1 100644
--- a/drivers/media/usb/dvb-usb/af9005.c
+++ b/drivers/media/usb/dvb-usb/af9005.c
@@ -53,7 +53,6 @@ struct af9005_device_state {
53 u8 sequence; 53 u8 sequence;
54 int led_state; 54 int led_state;
55 unsigned char data[256]; 55 unsigned char data[256];
56 struct mutex data_mutex;
57}; 56};
58 57
59static int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg, 58static int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg,
@@ -72,7 +71,7 @@ static int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg,
72 return -EINVAL; 71 return -EINVAL;
73 } 72 }
74 73
75 mutex_lock(&st->data_mutex); 74 mutex_lock(&d->data_mutex);
76 st->data[0] = 14; /* rest of buffer length low */ 75 st->data[0] = 14; /* rest of buffer length low */
77 st->data[1] = 0; /* rest of buffer length high */ 76 st->data[1] = 0; /* rest of buffer length high */
78 77
@@ -140,7 +139,7 @@ static int af9005_generic_read_write(struct dvb_usb_device *d, u16 reg,
140 values[i] = st->data[8 + i]; 139 values[i] = st->data[8 + i];
141 140
142ret: 141ret:
143 mutex_unlock(&st->data_mutex); 142 mutex_unlock(&d->data_mutex);
144 return ret; 143 return ret;
145 144
146} 145}
@@ -481,7 +480,7 @@ int af9005_send_command(struct dvb_usb_device *d, u8 command, u8 * wbuf,
481 } 480 }
482 packet_len = wlen + 5; 481 packet_len = wlen + 5;
483 482
484 mutex_lock(&st->data_mutex); 483 mutex_lock(&d->data_mutex);
485 484
486 st->data[0] = (u8) (packet_len & 0xff); 485 st->data[0] = (u8) (packet_len & 0xff);
487 st->data[1] = (u8) ((packet_len & 0xff00) >> 8); 486 st->data[1] = (u8) ((packet_len & 0xff00) >> 8);
@@ -512,7 +511,7 @@ int af9005_send_command(struct dvb_usb_device *d, u8 command, u8 * wbuf,
512 rbuf[i] = st->data[i + 7]; 511 rbuf[i] = st->data[i + 7];
513 } 512 }
514 513
515 mutex_unlock(&st->data_mutex); 514 mutex_unlock(&d->data_mutex);
516 return ret; 515 return ret;
517} 516}
518 517
@@ -523,7 +522,7 @@ int af9005_read_eeprom(struct dvb_usb_device *d, u8 address, u8 * values,
523 u8 seq; 522 u8 seq;
524 int ret, i; 523 int ret, i;
525 524
526 mutex_lock(&st->data_mutex); 525 mutex_lock(&d->data_mutex);
527 526
528 memset(st->data, 0, sizeof(st->data)); 527 memset(st->data, 0, sizeof(st->data));
529 528
@@ -559,7 +558,7 @@ int af9005_read_eeprom(struct dvb_usb_device *d, u8 address, u8 * values,
559 for (i = 0; i < len; i++) 558 for (i = 0; i < len; i++)
560 values[i] = st->data[6 + i]; 559 values[i] = st->data[6 + i];
561 } 560 }
562 mutex_unlock(&st->data_mutex); 561 mutex_unlock(&d->data_mutex);
563 562
564 return ret; 563 return ret;
565} 564}
@@ -847,7 +846,7 @@ static int af9005_rc_query(struct dvb_usb_device *d, u32 * event, int *state)
847 return 0; 846 return 0;
848 } 847 }
849 848
850 mutex_lock(&st->data_mutex); 849 mutex_lock(&d->data_mutex);
851 850
852 /* deb_info("rc_query\n"); */ 851 /* deb_info("rc_query\n"); */
853 st->data[0] = 3; /* rest of packet length low */ 852 st->data[0] = 3; /* rest of packet length low */
@@ -890,7 +889,7 @@ static int af9005_rc_query(struct dvb_usb_device *d, u32 * event, int *state)
890 } 889 }
891 890
892ret: 891ret:
893 mutex_unlock(&st->data_mutex); 892 mutex_unlock(&d->data_mutex);
894 return ret; 893 return ret;
895} 894}
896 895
@@ -1004,20 +1003,8 @@ static struct dvb_usb_device_properties af9005_properties;
1004static int af9005_usb_probe(struct usb_interface *intf, 1003static int af9005_usb_probe(struct usb_interface *intf,
1005 const struct usb_device_id *id) 1004 const struct usb_device_id *id)
1006{ 1005{
1007 struct dvb_usb_device *d; 1006 return dvb_usb_device_init(intf, &af9005_properties,
1008 struct af9005_device_state *st; 1007 THIS_MODULE, NULL, adapter_nr);
1009 int ret;
1010
1011 ret = dvb_usb_device_init(intf, &af9005_properties,
1012 THIS_MODULE, &d, adapter_nr);
1013
1014 if (ret < 0)
1015 return ret;
1016
1017 st = d->priv;
1018 mutex_init(&st->data_mutex);
1019
1020 return 0;
1021} 1008}
1022 1009
1023enum af9005_usb_table_entry { 1010enum af9005_usb_table_entry {
diff --git a/drivers/media/usb/dvb-usb/cinergyT2-core.c b/drivers/media/usb/dvb-usb/cinergyT2-core.c
index 8ac825413d5a..290275bc7fde 100644
--- a/drivers/media/usb/dvb-usb/cinergyT2-core.c
+++ b/drivers/media/usb/dvb-usb/cinergyT2-core.c
@@ -42,7 +42,6 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
42struct cinergyt2_state { 42struct cinergyt2_state {
43 u8 rc_counter; 43 u8 rc_counter;
44 unsigned char data[64]; 44 unsigned char data[64];
45 struct mutex data_mutex;
46}; 45};
47 46
48/* We are missing a release hook with usb_device data */ 47/* We are missing a release hook with usb_device data */
@@ -56,12 +55,12 @@ static int cinergyt2_streaming_ctrl(struct dvb_usb_adapter *adap, int enable)
56 struct cinergyt2_state *st = d->priv; 55 struct cinergyt2_state *st = d->priv;
57 int ret; 56 int ret;
58 57
59 mutex_lock(&st->data_mutex); 58 mutex_lock(&d->data_mutex);
60 st->data[0] = CINERGYT2_EP1_CONTROL_STREAM_TRANSFER; 59 st->data[0] = CINERGYT2_EP1_CONTROL_STREAM_TRANSFER;
61 st->data[1] = enable ? 1 : 0; 60 st->data[1] = enable ? 1 : 0;
62 61
63 ret = dvb_usb_generic_rw(d, st->data, 2, st->data, 64, 0); 62 ret = dvb_usb_generic_rw(d, st->data, 2, st->data, 64, 0);
64 mutex_unlock(&st->data_mutex); 63 mutex_unlock(&d->data_mutex);
65 64
66 return ret; 65 return ret;
67} 66}
@@ -71,12 +70,12 @@ static int cinergyt2_power_ctrl(struct dvb_usb_device *d, int enable)
71 struct cinergyt2_state *st = d->priv; 70 struct cinergyt2_state *st = d->priv;
72 int ret; 71 int ret;
73 72
74 mutex_lock(&st->data_mutex); 73 mutex_lock(&d->data_mutex);
75 st->data[0] = CINERGYT2_EP1_SLEEP_MODE; 74 st->data[0] = CINERGYT2_EP1_SLEEP_MODE;
76 st->data[1] = enable ? 0 : 1; 75 st->data[1] = enable ? 0 : 1;
77 76
78 ret = dvb_usb_generic_rw(d, st->data, 2, st->data, 3, 0); 77 ret = dvb_usb_generic_rw(d, st->data, 2, st->data, 3, 0);
79 mutex_unlock(&st->data_mutex); 78 mutex_unlock(&d->data_mutex);
80 79
81 return ret; 80 return ret;
82} 81}
@@ -89,7 +88,7 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
89 88
90 adap->fe_adap[0].fe = cinergyt2_fe_attach(adap->dev); 89 adap->fe_adap[0].fe = cinergyt2_fe_attach(adap->dev);
91 90
92 mutex_lock(&st->data_mutex); 91 mutex_lock(&d->data_mutex);
93 st->data[0] = CINERGYT2_EP1_GET_FIRMWARE_VERSION; 92 st->data[0] = CINERGYT2_EP1_GET_FIRMWARE_VERSION;
94 93
95 ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 3, 0); 94 ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 3, 0);
@@ -97,7 +96,7 @@ static int cinergyt2_frontend_attach(struct dvb_usb_adapter *adap)
97 deb_rc("cinergyt2_power_ctrl() Failed to retrieve sleep " 96 deb_rc("cinergyt2_power_ctrl() Failed to retrieve sleep "
98 "state info\n"); 97 "state info\n");
99 } 98 }
100 mutex_unlock(&st->data_mutex); 99 mutex_unlock(&d->data_mutex);
101 100
102 /* Copy this pointer as we are gonna need it in the release phase */ 101 /* Copy this pointer as we are gonna need it in the release phase */
103 cinergyt2_usb_device = adap->dev; 102 cinergyt2_usb_device = adap->dev;
@@ -166,7 +165,7 @@ static int cinergyt2_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
166 165
167 *state = REMOTE_NO_KEY_PRESSED; 166 *state = REMOTE_NO_KEY_PRESSED;
168 167
169 mutex_lock(&st->data_mutex); 168 mutex_lock(&d->data_mutex);
170 st->data[0] = CINERGYT2_EP1_GET_RC_EVENTS; 169 st->data[0] = CINERGYT2_EP1_GET_RC_EVENTS;
171 170
172 ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 5, 0); 171 ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 5, 0);
@@ -202,29 +201,17 @@ static int cinergyt2_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
202 } 201 }
203 202
204ret: 203ret:
205 mutex_unlock(&st->data_mutex); 204 mutex_unlock(&d->data_mutex);
206 return ret; 205 return ret;
207} 206}
208 207
209static int cinergyt2_usb_probe(struct usb_interface *intf, 208static int cinergyt2_usb_probe(struct usb_interface *intf,
210 const struct usb_device_id *id) 209 const struct usb_device_id *id)
211{ 210{
212 struct dvb_usb_device *d; 211 return dvb_usb_device_init(intf, &cinergyt2_properties,
213 struct cinergyt2_state *st; 212 THIS_MODULE, NULL, adapter_nr);
214 int ret;
215
216 ret = dvb_usb_device_init(intf, &cinergyt2_properties,
217 THIS_MODULE, &d, adapter_nr);
218 if (ret < 0)
219 return ret;
220
221 st = d->priv;
222 mutex_init(&st->data_mutex);
223
224 return 0;
225} 213}
226 214
227
228static struct usb_device_id cinergyt2_usb_table[] = { 215static struct usb_device_id cinergyt2_usb_table[] = {
229 { USB_DEVICE(USB_VID_TERRATEC, 0x0038) }, 216 { USB_DEVICE(USB_VID_TERRATEC, 0x0038) },
230 { 0 } 217 { 0 }
diff --git a/drivers/media/usb/dvb-usb/cxusb.c b/drivers/media/usb/dvb-usb/cxusb.c
index 39772812269d..243403081fa5 100644
--- a/drivers/media/usb/dvb-usb/cxusb.c
+++ b/drivers/media/usb/dvb-usb/cxusb.c
@@ -68,7 +68,7 @@ static int cxusb_ctrl_msg(struct dvb_usb_device *d,
68 68
69 wo = (rbuf == NULL || rlen == 0); /* write-only */ 69 wo = (rbuf == NULL || rlen == 0); /* write-only */
70 70
71 mutex_lock(&st->data_mutex); 71 mutex_lock(&d->data_mutex);
72 st->data[0] = cmd; 72 st->data[0] = cmd;
73 memcpy(&st->data[1], wbuf, wlen); 73 memcpy(&st->data[1], wbuf, wlen);
74 if (wo) 74 if (wo)
@@ -77,7 +77,7 @@ static int cxusb_ctrl_msg(struct dvb_usb_device *d,
77 ret = dvb_usb_generic_rw(d, st->data, 1 + wlen, 77 ret = dvb_usb_generic_rw(d, st->data, 1 + wlen,
78 rbuf, rlen, 0); 78 rbuf, rlen, 0);
79 79
80 mutex_unlock(&st->data_mutex); 80 mutex_unlock(&d->data_mutex);
81 return ret; 81 return ret;
82} 82}
83 83
@@ -1461,43 +1461,36 @@ static struct dvb_usb_device_properties cxusb_mygica_t230_properties;
1461static int cxusb_probe(struct usb_interface *intf, 1461static int cxusb_probe(struct usb_interface *intf,
1462 const struct usb_device_id *id) 1462 const struct usb_device_id *id)
1463{ 1463{
1464 struct dvb_usb_device *d;
1465 struct cxusb_state *st;
1466
1467 if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties, 1464 if (0 == dvb_usb_device_init(intf, &cxusb_medion_properties,
1468 THIS_MODULE, &d, adapter_nr) || 1465 THIS_MODULE, NULL, adapter_nr) ||
1469 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties, 1466 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgh064f_properties,
1470 THIS_MODULE, &d, adapter_nr) || 1467 THIS_MODULE, NULL, adapter_nr) ||
1471 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties, 1468 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dee1601_properties,
1472 THIS_MODULE, &d, adapter_nr) || 1469 THIS_MODULE, NULL, adapter_nr) ||
1473 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties, 1470 0 == dvb_usb_device_init(intf, &cxusb_bluebird_lgz201_properties,
1474 THIS_MODULE, &d, adapter_nr) || 1471 THIS_MODULE, NULL, adapter_nr) ||
1475 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties, 1472 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dtt7579_properties,
1476 THIS_MODULE, &d, adapter_nr) || 1473 THIS_MODULE, NULL, adapter_nr) ||
1477 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties, 1474 0 == dvb_usb_device_init(intf, &cxusb_bluebird_dualdig4_properties,
1478 THIS_MODULE, &d, adapter_nr) || 1475 THIS_MODULE, NULL, adapter_nr) ||
1479 0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties, 1476 0 == dvb_usb_device_init(intf, &cxusb_bluebird_nano2_properties,
1480 THIS_MODULE, &d, adapter_nr) || 1477 THIS_MODULE, NULL, adapter_nr) ||
1481 0 == dvb_usb_device_init(intf, 1478 0 == dvb_usb_device_init(intf,
1482 &cxusb_bluebird_nano2_needsfirmware_properties, 1479 &cxusb_bluebird_nano2_needsfirmware_properties,
1483 THIS_MODULE, &d, adapter_nr) || 1480 THIS_MODULE, NULL, adapter_nr) ||
1484 0 == dvb_usb_device_init(intf, &cxusb_aver_a868r_properties, 1481 0 == dvb_usb_device_init(intf, &cxusb_aver_a868r_properties,
1485 THIS_MODULE, &d, adapter_nr) || 1482 THIS_MODULE, NULL, adapter_nr) ||
1486 0 == dvb_usb_device_init(intf, 1483 0 == dvb_usb_device_init(intf,
1487 &cxusb_bluebird_dualdig4_rev2_properties, 1484 &cxusb_bluebird_dualdig4_rev2_properties,
1488 THIS_MODULE, &d, adapter_nr) || 1485 THIS_MODULE, NULL, adapter_nr) ||
1489 0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties, 1486 0 == dvb_usb_device_init(intf, &cxusb_d680_dmb_properties,
1490 THIS_MODULE, &d, adapter_nr) || 1487 THIS_MODULE, NULL, adapter_nr) ||
1491 0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties, 1488 0 == dvb_usb_device_init(intf, &cxusb_mygica_d689_properties,
1492 THIS_MODULE, &d, adapter_nr) || 1489 THIS_MODULE, NULL, adapter_nr) ||
1493 0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties, 1490 0 == dvb_usb_device_init(intf, &cxusb_mygica_t230_properties,
1494 THIS_MODULE, &d, adapter_nr) || 1491 THIS_MODULE, NULL, adapter_nr) ||
1495 0) { 1492 0)
1496 st = d->priv;
1497 mutex_init(&st->data_mutex);
1498
1499 return 0; 1493 return 0;
1500 }
1501 1494
1502 return -EINVAL; 1495 return -EINVAL;
1503} 1496}
diff --git a/drivers/media/usb/dvb-usb/cxusb.h b/drivers/media/usb/dvb-usb/cxusb.h
index 9f3ee0e47d5c..18acda19527a 100644
--- a/drivers/media/usb/dvb-usb/cxusb.h
+++ b/drivers/media/usb/dvb-usb/cxusb.h
@@ -37,7 +37,6 @@ struct cxusb_state {
37 struct i2c_client *i2c_client_tuner; 37 struct i2c_client *i2c_client_tuner;
38 38
39 unsigned char data[MAX_XFER_SIZE]; 39 unsigned char data[MAX_XFER_SIZE];
40 struct mutex data_mutex;
41}; 40};
42 41
43#endif 42#endif
diff --git a/drivers/media/usb/dvb-usb/dib0700_core.c b/drivers/media/usb/dvb-usb/dib0700_core.c
index 92d5408684ac..47ce9d5de4c6 100644
--- a/drivers/media/usb/dvb-usb/dib0700_core.c
+++ b/drivers/media/usb/dvb-usb/dib0700_core.c
@@ -704,7 +704,7 @@ static void dib0700_rc_urb_completion(struct urb *purb)
704 struct dvb_usb_device *d = purb->context; 704 struct dvb_usb_device *d = purb->context;
705 struct dib0700_rc_response *poll_reply; 705 struct dib0700_rc_response *poll_reply;
706 enum rc_type protocol; 706 enum rc_type protocol;
707 u32 uninitialized_var(keycode); 707 u32 keycode;
708 u8 toggle; 708 u8 toggle;
709 709
710 deb_info("%s()\n", __func__); 710 deb_info("%s()\n", __func__);
@@ -745,7 +745,8 @@ static void dib0700_rc_urb_completion(struct urb *purb)
745 poll_reply->nec.data == 0x00 && 745 poll_reply->nec.data == 0x00 &&
746 poll_reply->nec.not_data == 0xff) { 746 poll_reply->nec.not_data == 0xff) {
747 poll_reply->data_state = 2; 747 poll_reply->data_state = 2;
748 break; 748 rc_repeat(d->rc_dev);
749 goto resubmit;
749 } 750 }
750 751
751 if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) { 752 if ((poll_reply->nec.data ^ poll_reply->nec.not_data) != 0xff) {
diff --git a/drivers/media/usb/dvb-usb/dtt200u.c b/drivers/media/usb/dvb-usb/dtt200u.c
index f88572c7ae7c..fcbff7fb0c4e 100644
--- a/drivers/media/usb/dvb-usb/dtt200u.c
+++ b/drivers/media/usb/dvb-usb/dtt200u.c
@@ -22,7 +22,6 @@ DVB_DEFINE_MOD_OPT_ADAPTER_NR(adapter_nr);
22 22
23struct dtt200u_state { 23struct dtt200u_state {
24 unsigned char data[80]; 24 unsigned char data[80];
25 struct mutex data_mutex;
26}; 25};
27 26
28static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff) 27static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff)
@@ -30,23 +29,24 @@ static int dtt200u_power_ctrl(struct dvb_usb_device *d, int onoff)
30 struct dtt200u_state *st = d->priv; 29 struct dtt200u_state *st = d->priv;
31 int ret = 0; 30 int ret = 0;
32 31
33 mutex_lock(&st->data_mutex); 32 mutex_lock(&d->data_mutex);
34 33
35 st->data[0] = SET_INIT; 34 st->data[0] = SET_INIT;
36 35
37 if (onoff) 36 if (onoff)
38 ret = dvb_usb_generic_write(d, st->data, 2); 37 ret = dvb_usb_generic_write(d, st->data, 2);
39 38
40 mutex_unlock(&st->data_mutex); 39 mutex_unlock(&d->data_mutex);
41 return ret; 40 return ret;
42} 41}
43 42
44static int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff) 43static int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
45{ 44{
46 struct dtt200u_state *st = adap->dev->priv; 45 struct dvb_usb_device *d = adap->dev;
46 struct dtt200u_state *st = d->priv;
47 int ret; 47 int ret;
48 48
49 mutex_lock(&st->data_mutex); 49 mutex_lock(&d->data_mutex);
50 st->data[0] = SET_STREAMING; 50 st->data[0] = SET_STREAMING;
51 st->data[1] = onoff; 51 st->data[1] = onoff;
52 52
@@ -61,26 +61,27 @@ static int dtt200u_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
61 ret = dvb_usb_generic_write(adap->dev, st->data, 1); 61 ret = dvb_usb_generic_write(adap->dev, st->data, 1);
62 62
63ret: 63ret:
64 mutex_unlock(&st->data_mutex); 64 mutex_unlock(&d->data_mutex);
65 65
66 return ret; 66 return ret;
67} 67}
68 68
69static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff) 69static int dtt200u_pid_filter(struct dvb_usb_adapter *adap, int index, u16 pid, int onoff)
70{ 70{
71 struct dtt200u_state *st = adap->dev->priv; 71 struct dvb_usb_device *d = adap->dev;
72 struct dtt200u_state *st = d->priv;
72 int ret; 73 int ret;
73 74
74 pid = onoff ? pid : 0; 75 pid = onoff ? pid : 0;
75 76
76 mutex_lock(&st->data_mutex); 77 mutex_lock(&d->data_mutex);
77 st->data[0] = SET_PID_FILTER; 78 st->data[0] = SET_PID_FILTER;
78 st->data[1] = index; 79 st->data[1] = index;
79 st->data[2] = pid & 0xff; 80 st->data[2] = pid & 0xff;
80 st->data[3] = (pid >> 8) & 0x1f; 81 st->data[3] = (pid >> 8) & 0x1f;
81 82
82 ret = dvb_usb_generic_write(adap->dev, st->data, 4); 83 ret = dvb_usb_generic_write(adap->dev, st->data, 4);
83 mutex_unlock(&st->data_mutex); 84 mutex_unlock(&d->data_mutex);
84 85
85 return ret; 86 return ret;
86} 87}
@@ -91,7 +92,7 @@ static int dtt200u_rc_query(struct dvb_usb_device *d)
91 u32 scancode; 92 u32 scancode;
92 int ret; 93 int ret;
93 94
94 mutex_lock(&st->data_mutex); 95 mutex_lock(&d->data_mutex);
95 st->data[0] = GET_RC_CODE; 96 st->data[0] = GET_RC_CODE;
96 97
97 ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 5, 0); 98 ret = dvb_usb_generic_rw(d, st->data, 1, st->data, 5, 0);
@@ -126,7 +127,7 @@ static int dtt200u_rc_query(struct dvb_usb_device *d)
126 deb_info("st->data: %*ph\n", 5, st->data); 127 deb_info("st->data: %*ph\n", 5, st->data);
127 128
128ret: 129ret:
129 mutex_unlock(&st->data_mutex); 130 mutex_unlock(&d->data_mutex);
130 return ret; 131 return ret;
131} 132}
132 133
@@ -145,24 +146,17 @@ static struct dvb_usb_device_properties wt220u_miglia_properties;
145static int dtt200u_usb_probe(struct usb_interface *intf, 146static int dtt200u_usb_probe(struct usb_interface *intf,
146 const struct usb_device_id *id) 147 const struct usb_device_id *id)
147{ 148{
148 struct dvb_usb_device *d;
149 struct dtt200u_state *st;
150
151 if (0 == dvb_usb_device_init(intf, &dtt200u_properties, 149 if (0 == dvb_usb_device_init(intf, &dtt200u_properties,
152 THIS_MODULE, &d, adapter_nr) || 150 THIS_MODULE, NULL, adapter_nr) ||
153 0 == dvb_usb_device_init(intf, &wt220u_properties, 151 0 == dvb_usb_device_init(intf, &wt220u_properties,
154 THIS_MODULE, &d, adapter_nr) || 152 THIS_MODULE, NULL, adapter_nr) ||
155 0 == dvb_usb_device_init(intf, &wt220u_fc_properties, 153 0 == dvb_usb_device_init(intf, &wt220u_fc_properties,
156 THIS_MODULE, &d, adapter_nr) || 154 THIS_MODULE, NULL, adapter_nr) ||
157 0 == dvb_usb_device_init(intf, &wt220u_zl0353_properties, 155 0 == dvb_usb_device_init(intf, &wt220u_zl0353_properties,
158 THIS_MODULE, &d, adapter_nr) || 156 THIS_MODULE, NULL, adapter_nr) ||
159 0 == dvb_usb_device_init(intf, &wt220u_miglia_properties, 157 0 == dvb_usb_device_init(intf, &wt220u_miglia_properties,
160 THIS_MODULE, &d, adapter_nr)) { 158 THIS_MODULE, NULL, adapter_nr))
161 st = d->priv;
162 mutex_init(&st->data_mutex);
163
164 return 0; 159 return 0;
165 }
166 160
167 return -ENODEV; 161 return -ENODEV;
168} 162}
diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c
index 3896ba9a4179..84308569e7dc 100644
--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
+++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
@@ -142,6 +142,7 @@ static int dvb_usb_init(struct dvb_usb_device *d, short *adapter_nums)
142{ 142{
143 int ret = 0; 143 int ret = 0;
144 144
145 mutex_init(&d->data_mutex);
145 mutex_init(&d->usb_mutex); 146 mutex_init(&d->usb_mutex);
146 mutex_init(&d->i2c_mutex); 147 mutex_init(&d->i2c_mutex);
147 148
diff --git a/drivers/media/usb/dvb-usb/dvb-usb.h b/drivers/media/usb/dvb-usb/dvb-usb.h
index 639c4678c65b..107255b08b2b 100644
--- a/drivers/media/usb/dvb-usb/dvb-usb.h
+++ b/drivers/media/usb/dvb-usb/dvb-usb.h
@@ -404,8 +404,12 @@ struct dvb_usb_adapter {
404 * Powered is in/decremented for each call to modify the state. 404 * Powered is in/decremented for each call to modify the state.
405 * @udev: pointer to the device's struct usb_device. 405 * @udev: pointer to the device's struct usb_device.
406 * 406 *
407 * @usb_mutex: semaphore of USB control messages (reading needs two messages) 407 * @data_mutex: mutex to protect the data structure used to store URB data
408 * @i2c_mutex: semaphore for i2c-transfers 408 * @usb_mutex: mutex of USB control messages (reading needs two messages).
409 * Please notice that this mutex is used internally at the generic
410 * URB control functions. So, drivers using dvb_usb_generic_rw() and
411 * derivated functions should not lock it internally.
412 * @i2c_mutex: mutex for i2c-transfers
409 * 413 *
410 * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB 414 * @i2c_adap: device's i2c_adapter if it uses I2CoverUSB
411 * 415 *
@@ -433,6 +437,7 @@ struct dvb_usb_device {
433 int powered; 437 int powered;
434 438
435 /* locking */ 439 /* locking */
440 struct mutex data_mutex;
436 struct mutex usb_mutex; 441 struct mutex usb_mutex;
437 442
438 /* i2c */ 443 /* i2c */
diff --git a/drivers/media/usb/dvb-usb/gp8psk.c b/drivers/media/usb/dvb-usb/gp8psk.c
index adfd76491451..993bb7a72985 100644
--- a/drivers/media/usb/dvb-usb/gp8psk.c
+++ b/drivers/media/usb/dvb-usb/gp8psk.c
@@ -15,6 +15,7 @@
15 * see Documentation/dvb/README.dvb-usb for more information 15 * see Documentation/dvb/README.dvb-usb for more information
16 */ 16 */
17#include "gp8psk.h" 17#include "gp8psk.h"
18#include "gp8psk-fe.h"
18 19
19/* debug */ 20/* debug */
20static char bcm4500_firmware[] = "dvb-usb-gp8psk-02.fw"; 21static char bcm4500_firmware[] = "dvb-usb-gp8psk-02.fw";
@@ -28,34 +29,8 @@ struct gp8psk_state {
28 unsigned char data[80]; 29 unsigned char data[80];
29}; 30};
30 31
31static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers) 32static int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value,
32{ 33 u16 index, u8 *b, int blen)
33 return (gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6));
34}
35
36static int gp8psk_get_fpga_version(struct dvb_usb_device *d, u8 *fpga_vers)
37{
38 return (gp8psk_usb_in_op(d, GET_FPGA_VERS, 0, 0, fpga_vers, 1));
39}
40
41static void gp8psk_info(struct dvb_usb_device *d)
42{
43 u8 fpga_vers, fw_vers[6];
44
45 if (!gp8psk_get_fw_version(d, fw_vers))
46 info("FW Version = %i.%02i.%i (0x%x) Build %4i/%02i/%02i",
47 fw_vers[2], fw_vers[1], fw_vers[0], GP8PSK_FW_VERS(fw_vers),
48 2000 + fw_vers[5], fw_vers[4], fw_vers[3]);
49 else
50 info("failed to get FW version");
51
52 if (!gp8psk_get_fpga_version(d, &fpga_vers))
53 info("FPGA Version = %i", fpga_vers);
54 else
55 info("failed to get FPGA version");
56}
57
58int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen)
59{ 34{
60 struct gp8psk_state *st = d->priv; 35 struct gp8psk_state *st = d->priv;
61 int ret = 0,try = 0; 36 int ret = 0,try = 0;
@@ -67,7 +42,6 @@ int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8
67 return ret; 42 return ret;
68 43
69 while (ret >= 0 && ret != blen && try < 3) { 44 while (ret >= 0 && ret != blen && try < 3) {
70 memcpy(st->data, b, blen);
71 ret = usb_control_msg(d->udev, 45 ret = usb_control_msg(d->udev,
72 usb_rcvctrlpipe(d->udev,0), 46 usb_rcvctrlpipe(d->udev,0),
73 req, 47 req,
@@ -81,8 +55,10 @@ int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8
81 if (ret < 0 || ret != blen) { 55 if (ret < 0 || ret != blen) {
82 warn("usb in %d operation failed.", req); 56 warn("usb in %d operation failed.", req);
83 ret = -EIO; 57 ret = -EIO;
84 } else 58 } else {
85 ret = 0; 59 ret = 0;
60 memcpy(b, st->data, blen);
61 }
86 62
87 deb_xfer("in: req. %x, val: %x, ind: %x, buffer: ",req,value,index); 63 deb_xfer("in: req. %x, val: %x, ind: %x, buffer: ",req,value,index);
88 debug_dump(b,blen,deb_xfer); 64 debug_dump(b,blen,deb_xfer);
@@ -92,7 +68,7 @@ int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8
92 return ret; 68 return ret;
93} 69}
94 70
95int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value, 71static int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
96 u16 index, u8 *b, int blen) 72 u16 index, u8 *b, int blen)
97{ 73{
98 struct gp8psk_state *st = d->priv; 74 struct gp8psk_state *st = d->priv;
@@ -123,6 +99,34 @@ int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
123 return ret; 99 return ret;
124} 100}
125 101
102
103static int gp8psk_get_fw_version(struct dvb_usb_device *d, u8 *fw_vers)
104{
105 return gp8psk_usb_in_op(d, GET_FW_VERS, 0, 0, fw_vers, 6);
106}
107
108static int gp8psk_get_fpga_version(struct dvb_usb_device *d, u8 *fpga_vers)
109{
110 return gp8psk_usb_in_op(d, GET_FPGA_VERS, 0, 0, fpga_vers, 1);
111}
112
113static void gp8psk_info(struct dvb_usb_device *d)
114{
115 u8 fpga_vers, fw_vers[6];
116
117 if (!gp8psk_get_fw_version(d, fw_vers))
118 info("FW Version = %i.%02i.%i (0x%x) Build %4i/%02i/%02i",
119 fw_vers[2], fw_vers[1], fw_vers[0], GP8PSK_FW_VERS(fw_vers),
120 2000 + fw_vers[5], fw_vers[4], fw_vers[3]);
121 else
122 info("failed to get FW version");
123
124 if (!gp8psk_get_fpga_version(d, &fpga_vers))
125 info("FPGA Version = %i", fpga_vers);
126 else
127 info("failed to get FPGA version");
128}
129
126static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d) 130static int gp8psk_load_bcm4500fw(struct dvb_usb_device *d)
127{ 131{
128 int ret; 132 int ret;
@@ -225,10 +229,13 @@ static int gp8psk_power_ctrl(struct dvb_usb_device *d, int onoff)
225 return 0; 229 return 0;
226} 230}
227 231
228int gp8psk_bcm4500_reload(struct dvb_usb_device *d) 232static int gp8psk_bcm4500_reload(struct dvb_usb_device *d)
229{ 233{
230 u8 buf; 234 u8 buf;
231 int gp_product_id = le16_to_cpu(d->udev->descriptor.idProduct); 235 int gp_product_id = le16_to_cpu(d->udev->descriptor.idProduct);
236
237 deb_xfer("reloading firmware\n");
238
232 /* Turn off 8psk power */ 239 /* Turn off 8psk power */
233 if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1)) 240 if (gp8psk_usb_in_op(d, BOOT_8PSK, 0, 0, &buf, 1))
234 return -EINVAL; 241 return -EINVAL;
@@ -247,9 +254,47 @@ static int gp8psk_streaming_ctrl(struct dvb_usb_adapter *adap, int onoff)
247 return gp8psk_usb_out_op(adap->dev, ARM_TRANSFER, onoff, 0 , NULL, 0); 254 return gp8psk_usb_out_op(adap->dev, ARM_TRANSFER, onoff, 0 , NULL, 0);
248} 255}
249 256
257/* Callbacks for gp8psk-fe.c */
258
259static int gp8psk_fe_in(void *priv, u8 req, u16 value,
260 u16 index, u8 *b, int blen)
261{
262 struct dvb_usb_device *d = priv;
263
264 return gp8psk_usb_in_op(d, req, value, index, b, blen);
265}
266
267static int gp8psk_fe_out(void *priv, u8 req, u16 value,
268 u16 index, u8 *b, int blen)
269{
270 struct dvb_usb_device *d = priv;
271
272 return gp8psk_usb_out_op(d, req, value, index, b, blen);
273}
274
275static int gp8psk_fe_reload(void *priv)
276{
277 struct dvb_usb_device *d = priv;
278
279 return gp8psk_bcm4500_reload(d);
280}
281
282const struct gp8psk_fe_ops gp8psk_fe_ops = {
283 .in = gp8psk_fe_in,
284 .out = gp8psk_fe_out,
285 .reload = gp8psk_fe_reload,
286};
287
250static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap) 288static int gp8psk_frontend_attach(struct dvb_usb_adapter *adap)
251{ 289{
252 adap->fe_adap[0].fe = gp8psk_fe_attach(adap->dev); 290 struct dvb_usb_device *d = adap->dev;
291 int id = le16_to_cpu(d->udev->descriptor.idProduct);
292 int is_rev1;
293
294 is_rev1 = (id == USB_PID_GENPIX_8PSK_REV_1_WARM) ? true : false;
295
296 adap->fe_adap[0].fe = dvb_attach(gp8psk_fe_attach,
297 &gp8psk_fe_ops, d, is_rev1);
253 return 0; 298 return 0;
254} 299}
255 300
diff --git a/drivers/media/usb/dvb-usb/gp8psk.h b/drivers/media/usb/dvb-usb/gp8psk.h
index ed32b9da4843..d8975b866dee 100644
--- a/drivers/media/usb/dvb-usb/gp8psk.h
+++ b/drivers/media/usb/dvb-usb/gp8psk.h
@@ -24,58 +24,6 @@ extern int dvb_usb_gp8psk_debug;
24#define deb_info(args...) dprintk(dvb_usb_gp8psk_debug,0x01,args) 24#define deb_info(args...) dprintk(dvb_usb_gp8psk_debug,0x01,args)
25#define deb_xfer(args...) dprintk(dvb_usb_gp8psk_debug,0x02,args) 25#define deb_xfer(args...) dprintk(dvb_usb_gp8psk_debug,0x02,args)
26#define deb_rc(args...) dprintk(dvb_usb_gp8psk_debug,0x04,args) 26#define deb_rc(args...) dprintk(dvb_usb_gp8psk_debug,0x04,args)
27#define deb_fe(args...) dprintk(dvb_usb_gp8psk_debug,0x08,args)
28
29/* Twinhan Vendor requests */
30#define TH_COMMAND_IN 0xC0
31#define TH_COMMAND_OUT 0xC1
32
33/* gp8psk commands */
34
35#define GET_8PSK_CONFIG 0x80 /* in */
36#define SET_8PSK_CONFIG 0x81
37#define I2C_WRITE 0x83
38#define I2C_READ 0x84
39#define ARM_TRANSFER 0x85
40#define TUNE_8PSK 0x86
41#define GET_SIGNAL_STRENGTH 0x87 /* in */
42#define LOAD_BCM4500 0x88
43#define BOOT_8PSK 0x89 /* in */
44#define START_INTERSIL 0x8A /* in */
45#define SET_LNB_VOLTAGE 0x8B
46#define SET_22KHZ_TONE 0x8C
47#define SEND_DISEQC_COMMAND 0x8D
48#define SET_DVB_MODE 0x8E
49#define SET_DN_SWITCH 0x8F
50#define GET_SIGNAL_LOCK 0x90 /* in */
51#define GET_FW_VERS 0x92
52#define GET_SERIAL_NUMBER 0x93 /* in */
53#define USE_EXTRA_VOLT 0x94
54#define GET_FPGA_VERS 0x95
55#define CW3K_INIT 0x9d
56
57/* PSK_configuration bits */
58#define bm8pskStarted 0x01
59#define bm8pskFW_Loaded 0x02
60#define bmIntersilOn 0x04
61#define bmDVBmode 0x08
62#define bm22kHz 0x10
63#define bmSEL18V 0x20
64#define bmDCtuned 0x40
65#define bmArmed 0x80
66
67/* Satellite modulation modes */
68#define ADV_MOD_DVB_QPSK 0 /* DVB-S QPSK */
69#define ADV_MOD_TURBO_QPSK 1 /* Turbo QPSK */
70#define ADV_MOD_TURBO_8PSK 2 /* Turbo 8PSK (also used for Trellis 8PSK) */
71#define ADV_MOD_TURBO_16QAM 3 /* Turbo 16QAM (also used for Trellis 8PSK) */
72
73#define ADV_MOD_DCII_C_QPSK 4 /* Digicipher II Combo */
74#define ADV_MOD_DCII_I_QPSK 5 /* Digicipher II I-stream */
75#define ADV_MOD_DCII_Q_QPSK 6 /* Digicipher II Q-stream */
76#define ADV_MOD_DCII_C_OQPSK 7 /* Digicipher II offset QPSK */
77#define ADV_MOD_DSS_QPSK 8 /* DSS (DIRECTV) QPSK */
78#define ADV_MOD_DVB_BPSK 9 /* DVB-S BPSK */
79 27
80#define GET_USB_SPEED 0x07 28#define GET_USB_SPEED 0x07
81 29
@@ -86,15 +34,4 @@ extern int dvb_usb_gp8psk_debug;
86#define PRODUCT_STRING_READ 0x0D 34#define PRODUCT_STRING_READ 0x0D
87#define FW_BCD_VERSION_READ 0x14 35#define FW_BCD_VERSION_READ 0x14
88 36
89/* firmware revision id's */
90#define GP8PSK_FW_REV1 0x020604
91#define GP8PSK_FW_REV2 0x020704
92#define GP8PSK_FW_VERS(_fw_vers) ((_fw_vers)[2]<<0x10 | (_fw_vers)[1]<<0x08 | (_fw_vers)[0])
93
94extern struct dvb_frontend * gp8psk_fe_attach(struct dvb_usb_device *d);
95extern int gp8psk_usb_in_op(struct dvb_usb_device *d, u8 req, u16 value, u16 index, u8 *b, int blen);
96extern int gp8psk_usb_out_op(struct dvb_usb_device *d, u8 req, u16 value,
97 u16 index, u8 *b, int blen);
98extern int gp8psk_bcm4500_reload(struct dvb_usb_device *d);
99
100#endif 37#endif
diff --git a/drivers/mfd/intel-lpss-pci.c b/drivers/mfd/intel-lpss-pci.c
index 3228fd182a99..9ff243970e93 100644
--- a/drivers/mfd/intel-lpss-pci.c
+++ b/drivers/mfd/intel-lpss-pci.c
@@ -123,19 +123,6 @@ static const struct intel_lpss_platform_info apl_i2c_info = {
123 .properties = apl_i2c_properties, 123 .properties = apl_i2c_properties,
124}; 124};
125 125
126static const struct intel_lpss_platform_info kbl_info = {
127 .clk_rate = 120000000,
128};
129
130static const struct intel_lpss_platform_info kbl_uart_info = {
131 .clk_rate = 120000000,
132 .clk_con_id = "baudclk",
133};
134
135static const struct intel_lpss_platform_info kbl_i2c_info = {
136 .clk_rate = 133000000,
137};
138
139static const struct pci_device_id intel_lpss_pci_ids[] = { 126static const struct pci_device_id intel_lpss_pci_ids[] = {
140 /* BXT A-Step */ 127 /* BXT A-Step */
141 { PCI_VDEVICE(INTEL, 0x0aac), (kernel_ulong_t)&bxt_i2c_info }, 128 { PCI_VDEVICE(INTEL, 0x0aac), (kernel_ulong_t)&bxt_i2c_info },
@@ -207,15 +194,15 @@ static const struct pci_device_id intel_lpss_pci_ids[] = {
207 { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info }, 194 { PCI_VDEVICE(INTEL, 0xa161), (kernel_ulong_t)&spt_i2c_info },
208 { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info }, 195 { PCI_VDEVICE(INTEL, 0xa166), (kernel_ulong_t)&spt_uart_info },
209 /* KBL-H */ 196 /* KBL-H */
210 { PCI_VDEVICE(INTEL, 0xa2a7), (kernel_ulong_t)&kbl_uart_info }, 197 { PCI_VDEVICE(INTEL, 0xa2a7), (kernel_ulong_t)&spt_uart_info },
211 { PCI_VDEVICE(INTEL, 0xa2a8), (kernel_ulong_t)&kbl_uart_info }, 198 { PCI_VDEVICE(INTEL, 0xa2a8), (kernel_ulong_t)&spt_uart_info },
212 { PCI_VDEVICE(INTEL, 0xa2a9), (kernel_ulong_t)&kbl_info }, 199 { PCI_VDEVICE(INTEL, 0xa2a9), (kernel_ulong_t)&spt_info },
213 { PCI_VDEVICE(INTEL, 0xa2aa), (kernel_ulong_t)&kbl_info }, 200 { PCI_VDEVICE(INTEL, 0xa2aa), (kernel_ulong_t)&spt_info },
214 { PCI_VDEVICE(INTEL, 0xa2e0), (kernel_ulong_t)&kbl_i2c_info }, 201 { PCI_VDEVICE(INTEL, 0xa2e0), (kernel_ulong_t)&spt_i2c_info },
215 { PCI_VDEVICE(INTEL, 0xa2e1), (kernel_ulong_t)&kbl_i2c_info }, 202 { PCI_VDEVICE(INTEL, 0xa2e1), (kernel_ulong_t)&spt_i2c_info },
216 { PCI_VDEVICE(INTEL, 0xa2e2), (kernel_ulong_t)&kbl_i2c_info }, 203 { PCI_VDEVICE(INTEL, 0xa2e2), (kernel_ulong_t)&spt_i2c_info },
217 { PCI_VDEVICE(INTEL, 0xa2e3), (kernel_ulong_t)&kbl_i2c_info }, 204 { PCI_VDEVICE(INTEL, 0xa2e3), (kernel_ulong_t)&spt_i2c_info },
218 { PCI_VDEVICE(INTEL, 0xa2e6), (kernel_ulong_t)&kbl_uart_info }, 205 { PCI_VDEVICE(INTEL, 0xa2e6), (kernel_ulong_t)&spt_uart_info },
219 { } 206 { }
220}; 207};
221MODULE_DEVICE_TABLE(pci, intel_lpss_pci_ids); 208MODULE_DEVICE_TABLE(pci, intel_lpss_pci_ids);
diff --git a/drivers/mfd/intel-lpss.c b/drivers/mfd/intel-lpss.c
index 41b113875d64..70c646b0097d 100644
--- a/drivers/mfd/intel-lpss.c
+++ b/drivers/mfd/intel-lpss.c
@@ -502,9 +502,6 @@ int intel_lpss_suspend(struct device *dev)
502 for (i = 0; i < LPSS_PRIV_REG_COUNT; i++) 502 for (i = 0; i < LPSS_PRIV_REG_COUNT; i++)
503 lpss->priv_ctx[i] = readl(lpss->priv + i * 4); 503 lpss->priv_ctx[i] = readl(lpss->priv + i * 4);
504 504
505 /* Put the device into reset state */
506 writel(0, lpss->priv + LPSS_PRIV_RESETS);
507
508 return 0; 505 return 0;
509} 506}
510EXPORT_SYMBOL_GPL(intel_lpss_suspend); 507EXPORT_SYMBOL_GPL(intel_lpss_suspend);
diff --git a/drivers/mfd/intel_soc_pmic_bxtwc.c b/drivers/mfd/intel_soc_pmic_bxtwc.c
index 43e54b7e908f..f9a8c5203873 100644
--- a/drivers/mfd/intel_soc_pmic_bxtwc.c
+++ b/drivers/mfd/intel_soc_pmic_bxtwc.c
@@ -86,6 +86,7 @@ enum bxtwc_irqs_level2 {
86 BXTWC_THRM2_IRQ, 86 BXTWC_THRM2_IRQ,
87 BXTWC_BCU_IRQ, 87 BXTWC_BCU_IRQ,
88 BXTWC_ADC_IRQ, 88 BXTWC_ADC_IRQ,
89 BXTWC_USBC_IRQ,
89 BXTWC_CHGR0_IRQ, 90 BXTWC_CHGR0_IRQ,
90 BXTWC_CHGR1_IRQ, 91 BXTWC_CHGR1_IRQ,
91 BXTWC_GPIO0_IRQ, 92 BXTWC_GPIO0_IRQ,
@@ -111,7 +112,8 @@ static const struct regmap_irq bxtwc_regmap_irqs_level2[] = {
111 REGMAP_IRQ_REG(BXTWC_THRM2_IRQ, 2, 0xff), 112 REGMAP_IRQ_REG(BXTWC_THRM2_IRQ, 2, 0xff),
112 REGMAP_IRQ_REG(BXTWC_BCU_IRQ, 3, 0x1f), 113 REGMAP_IRQ_REG(BXTWC_BCU_IRQ, 3, 0x1f),
113 REGMAP_IRQ_REG(BXTWC_ADC_IRQ, 4, 0xff), 114 REGMAP_IRQ_REG(BXTWC_ADC_IRQ, 4, 0xff),
114 REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 5, 0x3f), 115 REGMAP_IRQ_REG(BXTWC_USBC_IRQ, 5, BIT(5)),
116 REGMAP_IRQ_REG(BXTWC_CHGR0_IRQ, 5, 0x1f),
115 REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 6, 0x1f), 117 REGMAP_IRQ_REG(BXTWC_CHGR1_IRQ, 6, 0x1f),
116 REGMAP_IRQ_REG(BXTWC_GPIO0_IRQ, 7, 0xff), 118 REGMAP_IRQ_REG(BXTWC_GPIO0_IRQ, 7, 0xff),
117 REGMAP_IRQ_REG(BXTWC_GPIO1_IRQ, 8, 0x3f), 119 REGMAP_IRQ_REG(BXTWC_GPIO1_IRQ, 8, 0x3f),
@@ -146,7 +148,7 @@ static struct resource adc_resources[] = {
146}; 148};
147 149
148static struct resource usbc_resources[] = { 150static struct resource usbc_resources[] = {
149 DEFINE_RES_IRQ_NAMED(BXTWC_CHGR0_IRQ, "USBC"), 151 DEFINE_RES_IRQ(BXTWC_USBC_IRQ),
150}; 152};
151 153
152static struct resource charger_resources[] = { 154static struct resource charger_resources[] = {
diff --git a/drivers/mfd/mfd-core.c b/drivers/mfd/mfd-core.c
index 3ac486a597f3..c57e407020f1 100644
--- a/drivers/mfd/mfd-core.c
+++ b/drivers/mfd/mfd-core.c
@@ -399,6 +399,8 @@ int mfd_clone_cell(const char *cell, const char **clones, size_t n_clones)
399 clones[i]); 399 clones[i]);
400 } 400 }
401 401
402 put_device(dev);
403
402 return 0; 404 return 0;
403} 405}
404EXPORT_SYMBOL(mfd_clone_cell); 406EXPORT_SYMBOL(mfd_clone_cell);
diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c
index cfdae8a3d779..b0c7bcdaf5df 100644
--- a/drivers/mfd/stmpe.c
+++ b/drivers/mfd/stmpe.c
@@ -851,6 +851,8 @@ static int stmpe_reset(struct stmpe *stmpe)
851 if (ret < 0) 851 if (ret < 0)
852 return ret; 852 return ret;
853 853
854 msleep(10);
855
854 timeout = jiffies + msecs_to_jiffies(100); 856 timeout = jiffies + msecs_to_jiffies(100);
855 while (time_before(jiffies, timeout)) { 857 while (time_before(jiffies, timeout)) {
856 ret = __stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL]); 858 ret = __stmpe_reg_read(stmpe, stmpe->regs[STMPE_IDX_SYS_CTRL]);
diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c
index 2f2225e845ef..b93fe4c4957a 100644
--- a/drivers/mfd/syscon.c
+++ b/drivers/mfd/syscon.c
@@ -73,8 +73,10 @@ static struct syscon *of_syscon_register(struct device_node *np)
73 /* Parse the device's DT node for an endianness specification */ 73 /* Parse the device's DT node for an endianness specification */
74 if (of_property_read_bool(np, "big-endian")) 74 if (of_property_read_bool(np, "big-endian"))
75 syscon_config.val_format_endian = REGMAP_ENDIAN_BIG; 75 syscon_config.val_format_endian = REGMAP_ENDIAN_BIG;
76 else if (of_property_read_bool(np, "little-endian")) 76 else if (of_property_read_bool(np, "little-endian"))
77 syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE; 77 syscon_config.val_format_endian = REGMAP_ENDIAN_LITTLE;
78 else if (of_property_read_bool(np, "native-endian"))
79 syscon_config.val_format_endian = REGMAP_ENDIAN_NATIVE;
78 80
79 /* 81 /*
80 * search for reg-io-width property in DT. If it is not provided, 82 * search for reg-io-width property in DT. If it is not provided,
diff --git a/drivers/mfd/wm8994-core.c b/drivers/mfd/wm8994-core.c
index 7eec619a6023..8588dbad3301 100644
--- a/drivers/mfd/wm8994-core.c
+++ b/drivers/mfd/wm8994-core.c
@@ -393,8 +393,13 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
393 BUG(); 393 BUG();
394 goto err; 394 goto err;
395 } 395 }
396 396
397 ret = devm_regulator_bulk_get(wm8994->dev, wm8994->num_supplies, 397 /*
398 * Can't use devres helper here as some of the supplies are provided by
399 * wm8994->dev's children (regulators) and those regulators are
400 * unregistered by the devres core before the supplies are freed.
401 */
402 ret = regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
398 wm8994->supplies); 403 wm8994->supplies);
399 if (ret != 0) { 404 if (ret != 0) {
400 dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret); 405 dev_err(wm8994->dev, "Failed to get supplies: %d\n", ret);
@@ -405,7 +410,7 @@ static int wm8994_device_init(struct wm8994 *wm8994, int irq)
405 wm8994->supplies); 410 wm8994->supplies);
406 if (ret != 0) { 411 if (ret != 0) {
407 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret); 412 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
408 goto err; 413 goto err_regulator_free;
409 } 414 }
410 415
411 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET); 416 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
@@ -596,6 +601,8 @@ err_irq:
596err_enable: 601err_enable:
597 regulator_bulk_disable(wm8994->num_supplies, 602 regulator_bulk_disable(wm8994->num_supplies,
598 wm8994->supplies); 603 wm8994->supplies);
604err_regulator_free:
605 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
599err: 606err:
600 mfd_remove_devices(wm8994->dev); 607 mfd_remove_devices(wm8994->dev);
601 return ret; 608 return ret;
@@ -604,10 +611,11 @@ err:
604static void wm8994_device_exit(struct wm8994 *wm8994) 611static void wm8994_device_exit(struct wm8994 *wm8994)
605{ 612{
606 pm_runtime_disable(wm8994->dev); 613 pm_runtime_disable(wm8994->dev);
607 mfd_remove_devices(wm8994->dev);
608 wm8994_irq_exit(wm8994); 614 wm8994_irq_exit(wm8994);
609 regulator_bulk_disable(wm8994->num_supplies, 615 regulator_bulk_disable(wm8994->num_supplies,
610 wm8994->supplies); 616 wm8994->supplies);
617 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
618 mfd_remove_devices(wm8994->dev);
611} 619}
612 620
613static const struct of_device_id wm8994_of_match[] = { 621static const struct of_device_id wm8994_of_match[] = {
diff --git a/drivers/misc/mei/bus-fixup.c b/drivers/misc/mei/bus-fixup.c
index e9e6ea3ab73c..75b9d4ac8b1e 100644
--- a/drivers/misc/mei/bus-fixup.c
+++ b/drivers/misc/mei/bus-fixup.c
@@ -178,7 +178,7 @@ static int mei_nfc_if_version(struct mei_cl *cl,
178 178
179 ret = 0; 179 ret = 0;
180 bytes_recv = __mei_cl_recv(cl, (u8 *)reply, if_version_length); 180 bytes_recv = __mei_cl_recv(cl, (u8 *)reply, if_version_length);
181 if (bytes_recv < 0 || bytes_recv < sizeof(struct mei_nfc_reply)) { 181 if (bytes_recv < if_version_length) {
182 dev_err(bus->dev, "Could not read IF version\n"); 182 dev_err(bus->dev, "Could not read IF version\n");
183 ret = -EIO; 183 ret = -EIO;
184 goto err; 184 goto err;
diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
index 5a8dc5a76e0d..3678220964fe 100644
--- a/drivers/mmc/card/mmc_test.c
+++ b/drivers/mmc/card/mmc_test.c
@@ -2347,7 +2347,7 @@ static int mmc_test_ongoing_transfer(struct mmc_test_card *test,
2347 struct mmc_test_req *rq = mmc_test_req_alloc(); 2347 struct mmc_test_req *rq = mmc_test_req_alloc();
2348 struct mmc_host *host = test->card->host; 2348 struct mmc_host *host = test->card->host;
2349 struct mmc_test_area *t = &test->area; 2349 struct mmc_test_area *t = &test->area;
2350 struct mmc_async_req areq; 2350 struct mmc_test_async_req test_areq = { .test = test };
2351 struct mmc_request *mrq; 2351 struct mmc_request *mrq;
2352 unsigned long timeout; 2352 unsigned long timeout;
2353 bool expired = false; 2353 bool expired = false;
@@ -2363,8 +2363,8 @@ static int mmc_test_ongoing_transfer(struct mmc_test_card *test,
2363 mrq->sbc = &rq->sbc; 2363 mrq->sbc = &rq->sbc;
2364 mrq->cap_cmd_during_tfr = true; 2364 mrq->cap_cmd_during_tfr = true;
2365 2365
2366 areq.mrq = mrq; 2366 test_areq.areq.mrq = mrq;
2367 areq.err_check = mmc_test_check_result_async; 2367 test_areq.areq.err_check = mmc_test_check_result_async;
2368 2368
2369 mmc_test_prepare_mrq(test, mrq, t->sg, t->sg_len, dev_addr, t->blocks, 2369 mmc_test_prepare_mrq(test, mrq, t->sg, t->sg_len, dev_addr, t->blocks,
2370 512, write); 2370 512, write);
@@ -2378,7 +2378,7 @@ static int mmc_test_ongoing_transfer(struct mmc_test_card *test,
2378 2378
2379 /* Start ongoing data request */ 2379 /* Start ongoing data request */
2380 if (use_areq) { 2380 if (use_areq) {
2381 mmc_start_req(host, &areq, &ret); 2381 mmc_start_req(host, &test_areq.areq, &ret);
2382 if (ret) 2382 if (ret)
2383 goto out_free; 2383 goto out_free;
2384 } else { 2384 } else {
diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c
index 39fc5b2b96c5..df19777068a6 100644
--- a/drivers/mmc/core/mmc.c
+++ b/drivers/mmc/core/mmc.c
@@ -26,6 +26,8 @@
26#include "mmc_ops.h" 26#include "mmc_ops.h"
27#include "sd_ops.h" 27#include "sd_ops.h"
28 28
29#define DEFAULT_CMD6_TIMEOUT_MS 500
30
29static const unsigned int tran_exp[] = { 31static const unsigned int tran_exp[] = {
30 10000, 100000, 1000000, 10000000, 32 10000, 100000, 1000000, 10000000,
31 0, 0, 0, 0 33 0, 0, 0, 0
@@ -571,6 +573,7 @@ static int mmc_decode_ext_csd(struct mmc_card *card, u8 *ext_csd)
571 card->erased_byte = 0x0; 573 card->erased_byte = 0x0;
572 574
573 /* eMMC v4.5 or later */ 575 /* eMMC v4.5 or later */
576 card->ext_csd.generic_cmd6_time = DEFAULT_CMD6_TIMEOUT_MS;
574 if (card->ext_csd.rev >= 6) { 577 if (card->ext_csd.rev >= 6) {
575 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE; 578 card->ext_csd.feature_support |= MMC_DISCARD_FEATURE;
576 579
diff --git a/drivers/mmc/host/dw_mmc.c b/drivers/mmc/host/dw_mmc.c
index 4fcbc4012ed0..df478ae72e23 100644
--- a/drivers/mmc/host/dw_mmc.c
+++ b/drivers/mmc/host/dw_mmc.c
@@ -1058,6 +1058,7 @@ static int dw_mci_submit_data_dma(struct dw_mci *host, struct mmc_data *data)
1058 spin_unlock_irqrestore(&host->irq_lock, irqflags); 1058 spin_unlock_irqrestore(&host->irq_lock, irqflags);
1059 1059
1060 if (host->dma_ops->start(host, sg_len)) { 1060 if (host->dma_ops->start(host, sg_len)) {
1061 host->dma_ops->stop(host);
1061 /* We can't do DMA, try PIO for this one */ 1062 /* We can't do DMA, try PIO for this one */
1062 dev_dbg(host->dev, 1063 dev_dbg(host->dev,
1063 "%s: fall back to PIO mode for current transfer\n", 1064 "%s: fall back to PIO mode for current transfer\n",
@@ -2940,7 +2941,7 @@ static struct dw_mci_board *dw_mci_parse_dt(struct dw_mci *host)
2940 return ERR_PTR(-ENOMEM); 2941 return ERR_PTR(-ENOMEM);
2941 2942
2942 /* find reset controller when exist */ 2943 /* find reset controller when exist */
2943 pdata->rstc = devm_reset_control_get_optional(dev, NULL); 2944 pdata->rstc = devm_reset_control_get_optional(dev, "reset");
2944 if (IS_ERR(pdata->rstc)) { 2945 if (IS_ERR(pdata->rstc)) {
2945 if (PTR_ERR(pdata->rstc) == -EPROBE_DEFER) 2946 if (PTR_ERR(pdata->rstc) == -EPROBE_DEFER)
2946 return ERR_PTR(-EPROBE_DEFER); 2947 return ERR_PTR(-EPROBE_DEFER);
diff --git a/drivers/mmc/host/mxs-mmc.c b/drivers/mmc/host/mxs-mmc.c
index d839147e591d..44ecebd1ea8c 100644
--- a/drivers/mmc/host/mxs-mmc.c
+++ b/drivers/mmc/host/mxs-mmc.c
@@ -661,13 +661,13 @@ static int mxs_mmc_probe(struct platform_device *pdev)
661 661
662 platform_set_drvdata(pdev, mmc); 662 platform_set_drvdata(pdev, mmc);
663 663
664 spin_lock_init(&host->lock);
665
664 ret = devm_request_irq(&pdev->dev, irq_err, mxs_mmc_irq_handler, 0, 666 ret = devm_request_irq(&pdev->dev, irq_err, mxs_mmc_irq_handler, 0,
665 dev_name(&pdev->dev), host); 667 dev_name(&pdev->dev), host);
666 if (ret) 668 if (ret)
667 goto out_free_dma; 669 goto out_free_dma;
668 670
669 spin_lock_init(&host->lock);
670
671 ret = mmc_add_host(mmc); 671 ret = mmc_add_host(mmc);
672 if (ret) 672 if (ret)
673 goto out_free_dma; 673 goto out_free_dma;
diff --git a/drivers/mmc/host/sdhci-of-esdhc.c b/drivers/mmc/host/sdhci-of-esdhc.c
index fb71c866eacc..1bb11e4a9fe5 100644
--- a/drivers/mmc/host/sdhci-of-esdhc.c
+++ b/drivers/mmc/host/sdhci-of-esdhc.c
@@ -66,6 +66,20 @@ static u32 esdhc_readl_fixup(struct sdhci_host *host,
66 return ret; 66 return ret;
67 } 67 }
68 } 68 }
69 /*
70 * The DAT[3:0] line signal levels and the CMD line signal level are
71 * not compatible with standard SDHC register. The line signal levels
72 * DAT[7:0] are at bits 31:24 and the command line signal level is at
73 * bit 23. All other bits are the same as in the standard SDHC
74 * register.
75 */
76 if (spec_reg == SDHCI_PRESENT_STATE) {
77 ret = value & 0x000fffff;
78 ret |= (value >> 4) & SDHCI_DATA_LVL_MASK;
79 ret |= (value << 1) & SDHCI_CMD_LVL;
80 return ret;
81 }
82
69 ret = value; 83 ret = value;
70 return ret; 84 return ret;
71} 85}
diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
index 71654b90227f..42ef3ebb1d8c 100644
--- a/drivers/mmc/host/sdhci.c
+++ b/drivers/mmc/host/sdhci.c
@@ -2086,6 +2086,10 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
2086 2086
2087 if (!host->tuning_done) { 2087 if (!host->tuning_done) {
2088 pr_info(DRIVER_NAME ": Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock\n"); 2088 pr_info(DRIVER_NAME ": Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock\n");
2089
2090 sdhci_do_reset(host, SDHCI_RESET_CMD);
2091 sdhci_do_reset(host, SDHCI_RESET_DATA);
2092
2089 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2); 2093 ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
2090 ctrl &= ~SDHCI_CTRL_TUNED_CLK; 2094 ctrl &= ~SDHCI_CTRL_TUNED_CLK;
2091 ctrl &= ~SDHCI_CTRL_EXEC_TUNING; 2095 ctrl &= ~SDHCI_CTRL_EXEC_TUNING;
@@ -2286,10 +2290,8 @@ static bool sdhci_request_done(struct sdhci_host *host)
2286 2290
2287 for (i = 0; i < SDHCI_MAX_MRQS; i++) { 2291 for (i = 0; i < SDHCI_MAX_MRQS; i++) {
2288 mrq = host->mrqs_done[i]; 2292 mrq = host->mrqs_done[i];
2289 if (mrq) { 2293 if (mrq)
2290 host->mrqs_done[i] = NULL;
2291 break; 2294 break;
2292 }
2293 } 2295 }
2294 2296
2295 if (!mrq) { 2297 if (!mrq) {
@@ -2320,6 +2322,17 @@ static bool sdhci_request_done(struct sdhci_host *host)
2320 * upon error conditions. 2322 * upon error conditions.
2321 */ 2323 */
2322 if (sdhci_needs_reset(host, mrq)) { 2324 if (sdhci_needs_reset(host, mrq)) {
2325 /*
2326 * Do not finish until command and data lines are available for
2327 * reset. Note there can only be one other mrq, so it cannot
2328 * also be in mrqs_done, otherwise host->cmd and host->data_cmd
2329 * would both be null.
2330 */
2331 if (host->cmd || host->data_cmd) {
2332 spin_unlock_irqrestore(&host->lock, flags);
2333 return true;
2334 }
2335
2323 /* Some controllers need this kick or reset won't work here */ 2336 /* Some controllers need this kick or reset won't work here */
2324 if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET) 2337 if (host->quirks & SDHCI_QUIRK_CLOCK_BEFORE_RESET)
2325 /* This is to force an update */ 2338 /* This is to force an update */
@@ -2327,10 +2340,8 @@ static bool sdhci_request_done(struct sdhci_host *host)
2327 2340
2328 /* Spec says we should do both at the same time, but Ricoh 2341 /* Spec says we should do both at the same time, but Ricoh
2329 controllers do not like that. */ 2342 controllers do not like that. */
2330 if (!host->cmd) 2343 sdhci_do_reset(host, SDHCI_RESET_CMD);
2331 sdhci_do_reset(host, SDHCI_RESET_CMD); 2344 sdhci_do_reset(host, SDHCI_RESET_DATA);
2332 if (!host->data_cmd)
2333 sdhci_do_reset(host, SDHCI_RESET_DATA);
2334 2345
2335 host->pending_reset = false; 2346 host->pending_reset = false;
2336 } 2347 }
@@ -2338,6 +2349,8 @@ static bool sdhci_request_done(struct sdhci_host *host)
2338 if (!sdhci_has_requests(host)) 2349 if (!sdhci_has_requests(host))
2339 sdhci_led_deactivate(host); 2350 sdhci_led_deactivate(host);
2340 2351
2352 host->mrqs_done[i] = NULL;
2353
2341 mmiowb(); 2354 mmiowb();
2342 spin_unlock_irqrestore(&host->lock, flags); 2355 spin_unlock_irqrestore(&host->lock, flags);
2343 2356
@@ -2512,9 +2525,6 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
2512 if (!host->data) { 2525 if (!host->data) {
2513 struct mmc_command *data_cmd = host->data_cmd; 2526 struct mmc_command *data_cmd = host->data_cmd;
2514 2527
2515 if (data_cmd)
2516 host->data_cmd = NULL;
2517
2518 /* 2528 /*
2519 * The "data complete" interrupt is also used to 2529 * The "data complete" interrupt is also used to
2520 * indicate that a busy state has ended. See comment 2530 * indicate that a busy state has ended. See comment
@@ -2522,11 +2532,13 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask)
2522 */ 2532 */
2523 if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) { 2533 if (data_cmd && (data_cmd->flags & MMC_RSP_BUSY)) {
2524 if (intmask & SDHCI_INT_DATA_TIMEOUT) { 2534 if (intmask & SDHCI_INT_DATA_TIMEOUT) {
2535 host->data_cmd = NULL;
2525 data_cmd->error = -ETIMEDOUT; 2536 data_cmd->error = -ETIMEDOUT;
2526 sdhci_finish_mrq(host, data_cmd->mrq); 2537 sdhci_finish_mrq(host, data_cmd->mrq);
2527 return; 2538 return;
2528 } 2539 }
2529 if (intmask & SDHCI_INT_DATA_END) { 2540 if (intmask & SDHCI_INT_DATA_END) {
2541 host->data_cmd = NULL;
2530 /* 2542 /*
2531 * Some cards handle busy-end interrupt 2543 * Some cards handle busy-end interrupt
2532 * before the command completed, so make 2544 * before the command completed, so make
@@ -2912,6 +2924,10 @@ int sdhci_runtime_resume_host(struct sdhci_host *host)
2912 spin_unlock_irqrestore(&host->lock, flags); 2924 spin_unlock_irqrestore(&host->lock, flags);
2913 } 2925 }
2914 2926
2927 if ((mmc->caps2 & MMC_CAP2_HS400_ES) &&
2928 mmc->ops->hs400_enhanced_strobe)
2929 mmc->ops->hs400_enhanced_strobe(mmc, &mmc->ios);
2930
2915 spin_lock_irqsave(&host->lock, flags); 2931 spin_lock_irqsave(&host->lock, flags);
2916 2932
2917 host->runtime_suspended = false; 2933 host->runtime_suspended = false;
diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
index 766df17fb7eb..2570455b219a 100644
--- a/drivers/mmc/host/sdhci.h
+++ b/drivers/mmc/host/sdhci.h
@@ -73,6 +73,7 @@
73#define SDHCI_DATA_LVL_MASK 0x00F00000 73#define SDHCI_DATA_LVL_MASK 0x00F00000
74#define SDHCI_DATA_LVL_SHIFT 20 74#define SDHCI_DATA_LVL_SHIFT 20
75#define SDHCI_DATA_0_LVL_MASK 0x00100000 75#define SDHCI_DATA_0_LVL_MASK 0x00100000
76#define SDHCI_CMD_LVL 0x01000000
76 77
77#define SDHCI_HOST_CONTROL 0x28 78#define SDHCI_HOST_CONTROL 0x28
78#define SDHCI_CTRL_LED 0x01 79#define SDHCI_CTRL_LED 0x01
diff --git a/drivers/net/can/sja1000/plx_pci.c b/drivers/net/can/sja1000/plx_pci.c
index 3eb7430dffbf..f8ff25c8ee2e 100644
--- a/drivers/net/can/sja1000/plx_pci.c
+++ b/drivers/net/can/sja1000/plx_pci.c
@@ -142,6 +142,9 @@ struct plx_pci_card {
142#define CTI_PCI_VENDOR_ID 0x12c4 142#define CTI_PCI_VENDOR_ID 0x12c4
143#define CTI_PCI_DEVICE_ID_CRG001 0x0900 143#define CTI_PCI_DEVICE_ID_CRG001 0x0900
144 144
145#define MOXA_PCI_VENDOR_ID 0x1393
146#define MOXA_PCI_DEVICE_ID 0x0100
147
145static void plx_pci_reset_common(struct pci_dev *pdev); 148static void plx_pci_reset_common(struct pci_dev *pdev);
146static void plx9056_pci_reset_common(struct pci_dev *pdev); 149static void plx9056_pci_reset_common(struct pci_dev *pdev);
147static void plx_pci_reset_marathon_pci(struct pci_dev *pdev); 150static void plx_pci_reset_marathon_pci(struct pci_dev *pdev);
@@ -258,6 +261,14 @@ static struct plx_pci_card_info plx_pci_card_info_elcus = {
258 /* based on PLX9030 */ 261 /* based on PLX9030 */
259}; 262};
260 263
264static struct plx_pci_card_info plx_pci_card_info_moxa = {
265 "MOXA", 2,
266 PLX_PCI_CAN_CLOCK, PLX_PCI_OCR, PLX_PCI_CDR,
267 {0, 0x00, 0x00}, { {0, 0x00, 0x80}, {1, 0x00, 0x80} },
268 &plx_pci_reset_common
269 /* based on PLX9052 */
270};
271
261static const struct pci_device_id plx_pci_tbl[] = { 272static const struct pci_device_id plx_pci_tbl[] = {
262 { 273 {
263 /* Adlink PCI-7841/cPCI-7841 */ 274 /* Adlink PCI-7841/cPCI-7841 */
@@ -357,6 +368,13 @@ static const struct pci_device_id plx_pci_tbl[] = {
357 0, 0, 368 0, 0,
358 (kernel_ulong_t)&plx_pci_card_info_elcus 369 (kernel_ulong_t)&plx_pci_card_info_elcus
359 }, 370 },
371 {
372 /* moxa */
373 MOXA_PCI_VENDOR_ID, MOXA_PCI_DEVICE_ID,
374 PCI_ANY_ID, PCI_ANY_ID,
375 0, 0,
376 (kernel_ulong_t)&plx_pci_card_info_moxa
377 },
360 { 0,} 378 { 0,}
361}; 379};
362MODULE_DEVICE_TABLE(pci, plx_pci_tbl); 380MODULE_DEVICE_TABLE(pci, plx_pci_tbl);
diff --git a/drivers/net/can/usb/peak_usb/pcan_ucan.h b/drivers/net/can/usb/peak_usb/pcan_ucan.h
index e8fc4952c6b0..2147678f0225 100644
--- a/drivers/net/can/usb/peak_usb/pcan_ucan.h
+++ b/drivers/net/can/usb/peak_usb/pcan_ucan.h
@@ -43,11 +43,22 @@ struct __packed pucan_command {
43 u16 args[3]; 43 u16 args[3];
44}; 44};
45 45
46#define PUCAN_TSLOW_BRP_BITS 10
47#define PUCAN_TSLOW_TSGEG1_BITS 8
48#define PUCAN_TSLOW_TSGEG2_BITS 7
49#define PUCAN_TSLOW_SJW_BITS 7
50
51#define PUCAN_TSLOW_BRP_MASK ((1 << PUCAN_TSLOW_BRP_BITS) - 1)
52#define PUCAN_TSLOW_TSEG1_MASK ((1 << PUCAN_TSLOW_TSGEG1_BITS) - 1)
53#define PUCAN_TSLOW_TSEG2_MASK ((1 << PUCAN_TSLOW_TSGEG2_BITS) - 1)
54#define PUCAN_TSLOW_SJW_MASK ((1 << PUCAN_TSLOW_SJW_BITS) - 1)
55
46/* uCAN TIMING_SLOW command fields */ 56/* uCAN TIMING_SLOW command fields */
47#define PUCAN_TSLOW_SJW_T(s, t) (((s) & 0xf) | ((!!(t)) << 7)) 57#define PUCAN_TSLOW_SJW_T(s, t) (((s) & PUCAN_TSLOW_SJW_MASK) | \
48#define PUCAN_TSLOW_TSEG2(t) ((t) & 0xf) 58 ((!!(t)) << 7))
49#define PUCAN_TSLOW_TSEG1(t) ((t) & 0x3f) 59#define PUCAN_TSLOW_TSEG2(t) ((t) & PUCAN_TSLOW_TSEG2_MASK)
50#define PUCAN_TSLOW_BRP(b) ((b) & 0x3ff) 60#define PUCAN_TSLOW_TSEG1(t) ((t) & PUCAN_TSLOW_TSEG1_MASK)
61#define PUCAN_TSLOW_BRP(b) ((b) & PUCAN_TSLOW_BRP_MASK)
51 62
52struct __packed pucan_timing_slow { 63struct __packed pucan_timing_slow {
53 __le16 opcode_channel; 64 __le16 opcode_channel;
@@ -60,11 +71,21 @@ struct __packed pucan_timing_slow {
60 __le16 brp; /* BaudRate Prescaler */ 71 __le16 brp; /* BaudRate Prescaler */
61}; 72};
62 73
74#define PUCAN_TFAST_BRP_BITS 10
75#define PUCAN_TFAST_TSGEG1_BITS 5
76#define PUCAN_TFAST_TSGEG2_BITS 4
77#define PUCAN_TFAST_SJW_BITS 4
78
79#define PUCAN_TFAST_BRP_MASK ((1 << PUCAN_TFAST_BRP_BITS) - 1)
80#define PUCAN_TFAST_TSEG1_MASK ((1 << PUCAN_TFAST_TSGEG1_BITS) - 1)
81#define PUCAN_TFAST_TSEG2_MASK ((1 << PUCAN_TFAST_TSGEG2_BITS) - 1)
82#define PUCAN_TFAST_SJW_MASK ((1 << PUCAN_TFAST_SJW_BITS) - 1)
83
63/* uCAN TIMING_FAST command fields */ 84/* uCAN TIMING_FAST command fields */
64#define PUCAN_TFAST_SJW(s) ((s) & 0x3) 85#define PUCAN_TFAST_SJW(s) ((s) & PUCAN_TFAST_SJW_MASK)
65#define PUCAN_TFAST_TSEG2(t) ((t) & 0x7) 86#define PUCAN_TFAST_TSEG2(t) ((t) & PUCAN_TFAST_TSEG2_MASK)
66#define PUCAN_TFAST_TSEG1(t) ((t) & 0xf) 87#define PUCAN_TFAST_TSEG1(t) ((t) & PUCAN_TFAST_TSEG1_MASK)
67#define PUCAN_TFAST_BRP(b) ((b) & 0x3ff) 88#define PUCAN_TFAST_BRP(b) ((b) & PUCAN_TFAST_BRP_MASK)
68 89
69struct __packed pucan_timing_fast { 90struct __packed pucan_timing_fast {
70 __le16 opcode_channel; 91 __le16 opcode_channel;
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
index c06382cdfdfe..0b0302af3bd2 100644
--- a/drivers/net/can/usb/peak_usb/pcan_usb_core.c
+++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.c
@@ -39,6 +39,7 @@ static struct usb_device_id peak_usb_table[] = {
39 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)}, 39 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPRO_PRODUCT_ID)},
40 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)}, 40 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBFD_PRODUCT_ID)},
41 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)}, 41 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBPROFD_PRODUCT_ID)},
42 {USB_DEVICE(PCAN_USB_VENDOR_ID, PCAN_USBX6_PRODUCT_ID)},
42 {} /* Terminating entry */ 43 {} /* Terminating entry */
43}; 44};
44 45
@@ -50,6 +51,7 @@ static const struct peak_usb_adapter *const peak_usb_adapters_list[] = {
50 &pcan_usb_pro, 51 &pcan_usb_pro,
51 &pcan_usb_fd, 52 &pcan_usb_fd,
52 &pcan_usb_pro_fd, 53 &pcan_usb_pro_fd,
54 &pcan_usb_x6,
53}; 55};
54 56
55/* 57/*
@@ -868,23 +870,25 @@ lbl_free_candev:
868static void peak_usb_disconnect(struct usb_interface *intf) 870static void peak_usb_disconnect(struct usb_interface *intf)
869{ 871{
870 struct peak_usb_device *dev; 872 struct peak_usb_device *dev;
873 struct peak_usb_device *dev_prev_siblings;
871 874
872 /* unregister as many netdev devices as siblings */ 875 /* unregister as many netdev devices as siblings */
873 for (dev = usb_get_intfdata(intf); dev; dev = dev->prev_siblings) { 876 for (dev = usb_get_intfdata(intf); dev; dev = dev_prev_siblings) {
874 struct net_device *netdev = dev->netdev; 877 struct net_device *netdev = dev->netdev;
875 char name[IFNAMSIZ]; 878 char name[IFNAMSIZ];
876 879
880 dev_prev_siblings = dev->prev_siblings;
877 dev->state &= ~PCAN_USB_STATE_CONNECTED; 881 dev->state &= ~PCAN_USB_STATE_CONNECTED;
878 strncpy(name, netdev->name, IFNAMSIZ); 882 strncpy(name, netdev->name, IFNAMSIZ);
879 883
880 unregister_netdev(netdev); 884 unregister_netdev(netdev);
881 free_candev(netdev);
882 885
883 kfree(dev->cmd_buf); 886 kfree(dev->cmd_buf);
884 dev->next_siblings = NULL; 887 dev->next_siblings = NULL;
885 if (dev->adapter->dev_free) 888 if (dev->adapter->dev_free)
886 dev->adapter->dev_free(dev); 889 dev->adapter->dev_free(dev);
887 890
891 free_candev(netdev);
888 dev_info(&intf->dev, "%s removed\n", name); 892 dev_info(&intf->dev, "%s removed\n", name);
889 } 893 }
890 894
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_core.h b/drivers/net/can/usb/peak_usb/pcan_usb_core.h
index 506fe506c9d3..3cbfb069893d 100644
--- a/drivers/net/can/usb/peak_usb/pcan_usb_core.h
+++ b/drivers/net/can/usb/peak_usb/pcan_usb_core.h
@@ -27,6 +27,7 @@
27#define PCAN_USBPRO_PRODUCT_ID 0x000d 27#define PCAN_USBPRO_PRODUCT_ID 0x000d
28#define PCAN_USBPROFD_PRODUCT_ID 0x0011 28#define PCAN_USBPROFD_PRODUCT_ID 0x0011
29#define PCAN_USBFD_PRODUCT_ID 0x0012 29#define PCAN_USBFD_PRODUCT_ID 0x0012
30#define PCAN_USBX6_PRODUCT_ID 0x0014
30 31
31#define PCAN_USB_DRIVER_NAME "peak_usb" 32#define PCAN_USB_DRIVER_NAME "peak_usb"
32 33
@@ -90,6 +91,7 @@ extern const struct peak_usb_adapter pcan_usb;
90extern const struct peak_usb_adapter pcan_usb_pro; 91extern const struct peak_usb_adapter pcan_usb_pro;
91extern const struct peak_usb_adapter pcan_usb_fd; 92extern const struct peak_usb_adapter pcan_usb_fd;
92extern const struct peak_usb_adapter pcan_usb_pro_fd; 93extern const struct peak_usb_adapter pcan_usb_pro_fd;
94extern const struct peak_usb_adapter pcan_usb_x6;
93 95
94struct peak_time_ref { 96struct peak_time_ref {
95 struct timeval tv_host_0, tv_host; 97 struct timeval tv_host_0, tv_host;
diff --git a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c
index ce44a033f63b..304732550f0a 100644
--- a/drivers/net/can/usb/peak_usb/pcan_usb_fd.c
+++ b/drivers/net/can/usb/peak_usb/pcan_usb_fd.c
@@ -993,24 +993,24 @@ static void pcan_usb_fd_free(struct peak_usb_device *dev)
993static const struct can_bittiming_const pcan_usb_fd_const = { 993static const struct can_bittiming_const pcan_usb_fd_const = {
994 .name = "pcan_usb_fd", 994 .name = "pcan_usb_fd",
995 .tseg1_min = 1, 995 .tseg1_min = 1,
996 .tseg1_max = 64, 996 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
997 .tseg2_min = 1, 997 .tseg2_min = 1,
998 .tseg2_max = 16, 998 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
999 .sjw_max = 16, 999 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1000 .brp_min = 1, 1000 .brp_min = 1,
1001 .brp_max = 1024, 1001 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1002 .brp_inc = 1, 1002 .brp_inc = 1,
1003}; 1003};
1004 1004
1005static const struct can_bittiming_const pcan_usb_fd_data_const = { 1005static const struct can_bittiming_const pcan_usb_fd_data_const = {
1006 .name = "pcan_usb_fd", 1006 .name = "pcan_usb_fd",
1007 .tseg1_min = 1, 1007 .tseg1_min = 1,
1008 .tseg1_max = 16, 1008 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1009 .tseg2_min = 1, 1009 .tseg2_min = 1,
1010 .tseg2_max = 8, 1010 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1011 .sjw_max = 4, 1011 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1012 .brp_min = 1, 1012 .brp_min = 1,
1013 .brp_max = 1024, 1013 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1014 .brp_inc = 1, 1014 .brp_inc = 1,
1015}; 1015};
1016 1016
@@ -1065,24 +1065,24 @@ const struct peak_usb_adapter pcan_usb_fd = {
1065static const struct can_bittiming_const pcan_usb_pro_fd_const = { 1065static const struct can_bittiming_const pcan_usb_pro_fd_const = {
1066 .name = "pcan_usb_pro_fd", 1066 .name = "pcan_usb_pro_fd",
1067 .tseg1_min = 1, 1067 .tseg1_min = 1,
1068 .tseg1_max = 64, 1068 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
1069 .tseg2_min = 1, 1069 .tseg2_min = 1,
1070 .tseg2_max = 16, 1070 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
1071 .sjw_max = 16, 1071 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1072 .brp_min = 1, 1072 .brp_min = 1,
1073 .brp_max = 1024, 1073 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1074 .brp_inc = 1, 1074 .brp_inc = 1,
1075}; 1075};
1076 1076
1077static const struct can_bittiming_const pcan_usb_pro_fd_data_const = { 1077static const struct can_bittiming_const pcan_usb_pro_fd_data_const = {
1078 .name = "pcan_usb_pro_fd", 1078 .name = "pcan_usb_pro_fd",
1079 .tseg1_min = 1, 1079 .tseg1_min = 1,
1080 .tseg1_max = 16, 1080 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1081 .tseg2_min = 1, 1081 .tseg2_min = 1,
1082 .tseg2_max = 8, 1082 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1083 .sjw_max = 4, 1083 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1084 .brp_min = 1, 1084 .brp_min = 1,
1085 .brp_max = 1024, 1085 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1086 .brp_inc = 1, 1086 .brp_inc = 1,
1087}; 1087};
1088 1088
@@ -1132,3 +1132,75 @@ const struct peak_usb_adapter pcan_usb_pro_fd = {
1132 1132
1133 .do_get_berr_counter = pcan_usb_fd_get_berr_counter, 1133 .do_get_berr_counter = pcan_usb_fd_get_berr_counter,
1134}; 1134};
1135
1136/* describes the PCAN-USB X6 adapter */
1137static const struct can_bittiming_const pcan_usb_x6_const = {
1138 .name = "pcan_usb_x6",
1139 .tseg1_min = 1,
1140 .tseg1_max = (1 << PUCAN_TSLOW_TSGEG1_BITS),
1141 .tseg2_min = 1,
1142 .tseg2_max = (1 << PUCAN_TSLOW_TSGEG2_BITS),
1143 .sjw_max = (1 << PUCAN_TSLOW_SJW_BITS),
1144 .brp_min = 1,
1145 .brp_max = (1 << PUCAN_TSLOW_BRP_BITS),
1146 .brp_inc = 1,
1147};
1148
1149static const struct can_bittiming_const pcan_usb_x6_data_const = {
1150 .name = "pcan_usb_x6",
1151 .tseg1_min = 1,
1152 .tseg1_max = (1 << PUCAN_TFAST_TSGEG1_BITS),
1153 .tseg2_min = 1,
1154 .tseg2_max = (1 << PUCAN_TFAST_TSGEG2_BITS),
1155 .sjw_max = (1 << PUCAN_TFAST_SJW_BITS),
1156 .brp_min = 1,
1157 .brp_max = (1 << PUCAN_TFAST_BRP_BITS),
1158 .brp_inc = 1,
1159};
1160
1161const struct peak_usb_adapter pcan_usb_x6 = {
1162 .name = "PCAN-USB X6",
1163 .device_id = PCAN_USBX6_PRODUCT_ID,
1164 .ctrl_count = PCAN_USBPROFD_CHANNEL_COUNT,
1165 .ctrlmode_supported = CAN_CTRLMODE_FD |
1166 CAN_CTRLMODE_3_SAMPLES | CAN_CTRLMODE_LISTENONLY,
1167 .clock = {
1168 .freq = PCAN_UFD_CRYSTAL_HZ,
1169 },
1170 .bittiming_const = &pcan_usb_x6_const,
1171 .data_bittiming_const = &pcan_usb_x6_data_const,
1172
1173 /* size of device private data */
1174 .sizeof_dev_private = sizeof(struct pcan_usb_fd_device),
1175
1176 /* timestamps usage */
1177 .ts_used_bits = 32,
1178 .ts_period = 1000000, /* calibration period in ts. */
1179 .us_per_ts_scale = 1, /* us = (ts * scale) >> shift */
1180 .us_per_ts_shift = 0,
1181
1182 /* give here messages in/out endpoints */
1183 .ep_msg_in = PCAN_USBPRO_EP_MSGIN,
1184 .ep_msg_out = {PCAN_USBPRO_EP_MSGOUT_0, PCAN_USBPRO_EP_MSGOUT_1},
1185
1186 /* size of rx/tx usb buffers */
1187 .rx_buffer_size = PCAN_UFD_RX_BUFFER_SIZE,
1188 .tx_buffer_size = PCAN_UFD_TX_BUFFER_SIZE,
1189
1190 /* device callbacks */
1191 .intf_probe = pcan_usb_pro_probe, /* same as PCAN-USB Pro */
1192 .dev_init = pcan_usb_fd_init,
1193
1194 .dev_exit = pcan_usb_fd_exit,
1195 .dev_free = pcan_usb_fd_free,
1196 .dev_set_bus = pcan_usb_fd_set_bus,
1197 .dev_set_bittiming = pcan_usb_fd_set_bittiming_slow,
1198 .dev_set_data_bittiming = pcan_usb_fd_set_bittiming_fast,
1199 .dev_decode_buf = pcan_usb_fd_decode_buf,
1200 .dev_start = pcan_usb_fd_start,
1201 .dev_stop = pcan_usb_fd_stop,
1202 .dev_restart_async = pcan_usb_fd_restart_async,
1203 .dev_encode_msg = pcan_usb_fd_encode_msg,
1204
1205 .do_get_berr_counter = pcan_usb_fd_get_berr_counter,
1206};
diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
index 7717b19dc806..947adda3397d 100644
--- a/drivers/net/dsa/b53/b53_common.c
+++ b/drivers/net/dsa/b53/b53_common.c
@@ -962,9 +962,10 @@ static void b53_vlan_add(struct dsa_switch *ds, int port,
962 962
963 vl->members |= BIT(port) | BIT(cpu_port); 963 vl->members |= BIT(port) | BIT(cpu_port);
964 if (untagged) 964 if (untagged)
965 vl->untag |= BIT(port) | BIT(cpu_port); 965 vl->untag |= BIT(port);
966 else 966 else
967 vl->untag &= ~(BIT(port) | BIT(cpu_port)); 967 vl->untag &= ~BIT(port);
968 vl->untag &= ~BIT(cpu_port);
968 969
969 b53_set_vlan_entry(dev, vid, vl); 970 b53_set_vlan_entry(dev, vid, vl);
970 b53_fast_age_vlan(dev, vid); 971 b53_fast_age_vlan(dev, vid);
@@ -973,8 +974,6 @@ static void b53_vlan_add(struct dsa_switch *ds, int port,
973 if (pvid) { 974 if (pvid) {
974 b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), 975 b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port),
975 vlan->vid_end); 976 vlan->vid_end);
976 b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(cpu_port),
977 vlan->vid_end);
978 b53_fast_age_vlan(dev, vid); 977 b53_fast_age_vlan(dev, vid);
979 } 978 }
980} 979}
@@ -984,7 +983,6 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
984{ 983{
985 struct b53_device *dev = ds->priv; 984 struct b53_device *dev = ds->priv;
986 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED; 985 bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
987 unsigned int cpu_port = dev->cpu_port;
988 struct b53_vlan *vl; 986 struct b53_vlan *vl;
989 u16 vid; 987 u16 vid;
990 u16 pvid; 988 u16 pvid;
@@ -997,8 +995,6 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
997 b53_get_vlan_entry(dev, vid, vl); 995 b53_get_vlan_entry(dev, vid, vl);
998 996
999 vl->members &= ~BIT(port); 997 vl->members &= ~BIT(port);
1000 if ((vl->members & BIT(cpu_port)) == BIT(cpu_port))
1001 vl->members = 0;
1002 998
1003 if (pvid == vid) { 999 if (pvid == vid) {
1004 if (is5325(dev) || is5365(dev)) 1000 if (is5325(dev) || is5365(dev))
@@ -1007,18 +1003,14 @@ static int b53_vlan_del(struct dsa_switch *ds, int port,
1007 pvid = 0; 1003 pvid = 0;
1008 } 1004 }
1009 1005
1010 if (untagged) { 1006 if (untagged)
1011 vl->untag &= ~(BIT(port)); 1007 vl->untag &= ~(BIT(port));
1012 if ((vl->untag & BIT(cpu_port)) == BIT(cpu_port))
1013 vl->untag = 0;
1014 }
1015 1008
1016 b53_set_vlan_entry(dev, vid, vl); 1009 b53_set_vlan_entry(dev, vid, vl);
1017 b53_fast_age_vlan(dev, vid); 1010 b53_fast_age_vlan(dev, vid);
1018 } 1011 }
1019 1012
1020 b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), pvid); 1013 b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(port), pvid);
1021 b53_write16(dev, B53_VLAN_PAGE, B53_VLAN_PORT_DEF_TAG(cpu_port), pvid);
1022 b53_fast_age_vlan(dev, pvid); 1014 b53_fast_age_vlan(dev, pvid);
1023 1015
1024 return 0; 1016 return 0;
diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
index e3ee27ce13dd..9ec33b51a0ed 100644
--- a/drivers/net/dsa/bcm_sf2.c
+++ b/drivers/net/dsa/bcm_sf2.c
@@ -588,6 +588,7 @@ static void bcm_sf2_sw_adjust_link(struct dsa_switch *ds, int port,
588 struct phy_device *phydev) 588 struct phy_device *phydev)
589{ 589{
590 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds); 590 struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
591 struct ethtool_eee *p = &priv->port_sts[port].eee;
591 u32 id_mode_dis = 0, port_mode; 592 u32 id_mode_dis = 0, port_mode;
592 const char *str = NULL; 593 const char *str = NULL;
593 u32 reg; 594 u32 reg;
@@ -662,6 +663,9 @@ force_link:
662 reg |= DUPLX_MODE; 663 reg |= DUPLX_MODE;
663 664
664 core_writel(priv, reg, CORE_STS_OVERRIDE_GMIIP_PORT(port)); 665 core_writel(priv, reg, CORE_STS_OVERRIDE_GMIIP_PORT(port));
666
667 if (!phydev->is_pseudo_fixed_link)
668 p->eee_enabled = bcm_sf2_eee_init(ds, port, phydev);
665} 669}
666 670
667static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port, 671static void bcm_sf2_sw_fixed_link_update(struct dsa_switch *ds, int port,
diff --git a/drivers/net/ethernet/altera/altera_tse_main.c b/drivers/net/ethernet/altera/altera_tse_main.c
index bda31f308cc2..a0eee7218695 100644
--- a/drivers/net/ethernet/altera/altera_tse_main.c
+++ b/drivers/net/ethernet/altera/altera_tse_main.c
@@ -400,12 +400,6 @@ static int tse_rx(struct altera_tse_private *priv, int limit)
400 400
401 skb_put(skb, pktlength); 401 skb_put(skb, pktlength);
402 402
403 /* make cache consistent with receive packet buffer */
404 dma_sync_single_for_cpu(priv->device,
405 priv->rx_ring[entry].dma_addr,
406 priv->rx_ring[entry].len,
407 DMA_FROM_DEVICE);
408
409 dma_unmap_single(priv->device, priv->rx_ring[entry].dma_addr, 403 dma_unmap_single(priv->device, priv->rx_ring[entry].dma_addr,
410 priv->rx_ring[entry].len, DMA_FROM_DEVICE); 404 priv->rx_ring[entry].len, DMA_FROM_DEVICE);
411 405
@@ -469,7 +463,6 @@ static int tse_tx_complete(struct altera_tse_private *priv)
469 463
470 if (unlikely(netif_queue_stopped(priv->dev) && 464 if (unlikely(netif_queue_stopped(priv->dev) &&
471 tse_tx_avail(priv) > TSE_TX_THRESH(priv))) { 465 tse_tx_avail(priv) > TSE_TX_THRESH(priv))) {
472 netif_tx_lock(priv->dev);
473 if (netif_queue_stopped(priv->dev) && 466 if (netif_queue_stopped(priv->dev) &&
474 tse_tx_avail(priv) > TSE_TX_THRESH(priv)) { 467 tse_tx_avail(priv) > TSE_TX_THRESH(priv)) {
475 if (netif_msg_tx_done(priv)) 468 if (netif_msg_tx_done(priv))
@@ -477,7 +470,6 @@ static int tse_tx_complete(struct altera_tse_private *priv)
477 __func__); 470 __func__);
478 netif_wake_queue(priv->dev); 471 netif_wake_queue(priv->dev);
479 } 472 }
480 netif_tx_unlock(priv->dev);
481 } 473 }
482 474
483 spin_unlock(&priv->tx_lock); 475 spin_unlock(&priv->tx_lock);
@@ -592,10 +584,6 @@ static int tse_start_xmit(struct sk_buff *skb, struct net_device *dev)
592 buffer->dma_addr = dma_addr; 584 buffer->dma_addr = dma_addr;
593 buffer->len = nopaged_len; 585 buffer->len = nopaged_len;
594 586
595 /* Push data out of the cache hierarchy into main memory */
596 dma_sync_single_for_device(priv->device, buffer->dma_addr,
597 buffer->len, DMA_TO_DEVICE);
598
599 priv->dmaops->tx_buffer(priv, buffer); 587 priv->dmaops->tx_buffer(priv, buffer);
600 588
601 skb_tx_timestamp(skb); 589 skb_tx_timestamp(skb);
@@ -819,6 +807,8 @@ static int init_phy(struct net_device *dev)
819 807
820 if (!phydev) { 808 if (!phydev) {
821 netdev_err(dev, "Could not find the PHY\n"); 809 netdev_err(dev, "Could not find the PHY\n");
810 if (fixed_link)
811 of_phy_deregister_fixed_link(priv->device->of_node);
822 return -ENODEV; 812 return -ENODEV;
823 } 813 }
824 814
@@ -1545,10 +1535,15 @@ err_free_netdev:
1545static int altera_tse_remove(struct platform_device *pdev) 1535static int altera_tse_remove(struct platform_device *pdev)
1546{ 1536{
1547 struct net_device *ndev = platform_get_drvdata(pdev); 1537 struct net_device *ndev = platform_get_drvdata(pdev);
1538 struct altera_tse_private *priv = netdev_priv(ndev);
1548 1539
1549 if (ndev->phydev) 1540 if (ndev->phydev) {
1550 phy_disconnect(ndev->phydev); 1541 phy_disconnect(ndev->phydev);
1551 1542
1543 if (of_phy_is_fixed_link(priv->device->of_node))
1544 of_phy_deregister_fixed_link(priv->device->of_node);
1545 }
1546
1552 platform_set_drvdata(pdev, NULL); 1547 platform_set_drvdata(pdev, NULL);
1553 altera_tse_mdio_destroy(ndev); 1548 altera_tse_mdio_destroy(ndev);
1554 unregister_netdev(ndev); 1549 unregister_netdev(ndev);
diff --git a/drivers/net/ethernet/amd/xgbe/xgbe-main.c b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
index 9de078819aa6..4f7635178200 100644
--- a/drivers/net/ethernet/amd/xgbe/xgbe-main.c
+++ b/drivers/net/ethernet/amd/xgbe/xgbe-main.c
@@ -829,7 +829,7 @@ static int xgbe_remove(struct platform_device *pdev)
829 return 0; 829 return 0;
830} 830}
831 831
832#ifdef CONFIG_PM 832#ifdef CONFIG_PM_SLEEP
833static int xgbe_suspend(struct device *dev) 833static int xgbe_suspend(struct device *dev)
834{ 834{
835 struct net_device *netdev = dev_get_drvdata(dev); 835 struct net_device *netdev = dev_get_drvdata(dev);
@@ -874,7 +874,7 @@ static int xgbe_resume(struct device *dev)
874 874
875 return ret; 875 return ret;
876} 876}
877#endif /* CONFIG_PM */ 877#endif /* CONFIG_PM_SLEEP */
878 878
879#ifdef CONFIG_ACPI 879#ifdef CONFIG_ACPI
880static const struct acpi_device_id xgbe_acpi_match[] = { 880static const struct acpi_device_id xgbe_acpi_match[] = {
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
index c481f104a8fe..5390ae89136c 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.c
@@ -204,17 +204,6 @@ static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring)
204 return num_msgs; 204 return num_msgs;
205} 205}
206 206
207static void xgene_enet_setup_coalescing(struct xgene_enet_desc_ring *ring)
208{
209 u32 data = 0x7777;
210
211 xgene_enet_ring_wr32(ring, CSR_PBM_COAL, 0x8e);
212 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK1, data);
213 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK2, data << 16);
214 xgene_enet_ring_wr32(ring, CSR_THRESHOLD0_SET1, 0x40);
215 xgene_enet_ring_wr32(ring, CSR_THRESHOLD1_SET1, 0x80);
216}
217
218void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring, 207void xgene_enet_parse_error(struct xgene_enet_desc_ring *ring,
219 struct xgene_enet_pdata *pdata, 208 struct xgene_enet_pdata *pdata,
220 enum xgene_enet_err_code status) 209 enum xgene_enet_err_code status)
@@ -929,5 +918,4 @@ struct xgene_ring_ops xgene_ring1_ops = {
929 .clear = xgene_enet_clear_ring, 918 .clear = xgene_enet_clear_ring,
930 .wr_cmd = xgene_enet_wr_cmd, 919 .wr_cmd = xgene_enet_wr_cmd,
931 .len = xgene_enet_ring_len, 920 .len = xgene_enet_ring_len,
932 .coalesce = xgene_enet_setup_coalescing,
933}; 921};
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
index 8456337a237d..06e598c8bc16 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_hw.h
@@ -55,8 +55,10 @@ enum xgene_enet_rm {
55#define PREFETCH_BUF_EN BIT(21) 55#define PREFETCH_BUF_EN BIT(21)
56#define CSR_RING_ID_BUF 0x000c 56#define CSR_RING_ID_BUF 0x000c
57#define CSR_PBM_COAL 0x0014 57#define CSR_PBM_COAL 0x0014
58#define CSR_PBM_CTICK0 0x0018
58#define CSR_PBM_CTICK1 0x001c 59#define CSR_PBM_CTICK1 0x001c
59#define CSR_PBM_CTICK2 0x0020 60#define CSR_PBM_CTICK2 0x0020
61#define CSR_PBM_CTICK3 0x0024
60#define CSR_THRESHOLD0_SET1 0x0030 62#define CSR_THRESHOLD0_SET1 0x0030
61#define CSR_THRESHOLD1_SET1 0x0034 63#define CSR_THRESHOLD1_SET1 0x0034
62#define CSR_RING_NE_INT_MODE 0x017c 64#define CSR_RING_NE_INT_MODE 0x017c
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
index 429f18fc5503..8158d4698734 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_main.c
@@ -1188,7 +1188,8 @@ static int xgene_enet_create_desc_rings(struct net_device *ndev)
1188 tx_ring->dst_ring_num = xgene_enet_dst_ring_num(cp_ring); 1188 tx_ring->dst_ring_num = xgene_enet_dst_ring_num(cp_ring);
1189 } 1189 }
1190 1190
1191 pdata->ring_ops->coalesce(pdata->tx_ring[0]); 1191 if (pdata->ring_ops->coalesce)
1192 pdata->ring_ops->coalesce(pdata->tx_ring[0]);
1192 pdata->tx_qcnt_hi = pdata->tx_ring[0]->slots - 128; 1193 pdata->tx_qcnt_hi = pdata->tx_ring[0]->slots - 128;
1193 1194
1194 return 0; 1195 return 0;
diff --git a/drivers/net/ethernet/apm/xgene/xgene_enet_ring2.c b/drivers/net/ethernet/apm/xgene/xgene_enet_ring2.c
index 2b76732add5d..af51dd5844ce 100644
--- a/drivers/net/ethernet/apm/xgene/xgene_enet_ring2.c
+++ b/drivers/net/ethernet/apm/xgene/xgene_enet_ring2.c
@@ -30,7 +30,7 @@ static void xgene_enet_ring_init(struct xgene_enet_desc_ring *ring)
30 ring_cfg[0] |= SET_VAL(X2_INTLINE, ring->id & RING_BUFNUM_MASK); 30 ring_cfg[0] |= SET_VAL(X2_INTLINE, ring->id & RING_BUFNUM_MASK);
31 ring_cfg[3] |= SET_BIT(X2_DEQINTEN); 31 ring_cfg[3] |= SET_BIT(X2_DEQINTEN);
32 } 32 }
33 ring_cfg[0] |= SET_VAL(X2_CFGCRID, 1); 33 ring_cfg[0] |= SET_VAL(X2_CFGCRID, 2);
34 34
35 addr >>= 8; 35 addr >>= 8;
36 ring_cfg[2] |= QCOHERENT | SET_VAL(RINGADDRL, addr); 36 ring_cfg[2] |= QCOHERENT | SET_VAL(RINGADDRL, addr);
@@ -192,13 +192,15 @@ static u32 xgene_enet_ring_len(struct xgene_enet_desc_ring *ring)
192 192
193static void xgene_enet_setup_coalescing(struct xgene_enet_desc_ring *ring) 193static void xgene_enet_setup_coalescing(struct xgene_enet_desc_ring *ring)
194{ 194{
195 u32 data = 0x7777; 195 u32 data = 0x77777777;
196 196
197 xgene_enet_ring_wr32(ring, CSR_PBM_COAL, 0x8e); 197 xgene_enet_ring_wr32(ring, CSR_PBM_COAL, 0x8e);
198 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK0, data);
198 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK1, data); 199 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK1, data);
199 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK2, data << 16); 200 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK2, data);
200 xgene_enet_ring_wr32(ring, CSR_THRESHOLD0_SET1, 0x40); 201 xgene_enet_ring_wr32(ring, CSR_PBM_CTICK3, data);
201 xgene_enet_ring_wr32(ring, CSR_THRESHOLD1_SET1, 0x80); 202 xgene_enet_ring_wr32(ring, CSR_THRESHOLD0_SET1, 0x08);
203 xgene_enet_ring_wr32(ring, CSR_THRESHOLD1_SET1, 0x10);
202} 204}
203 205
204struct xgene_ring_ops xgene_ring2_ops = { 206struct xgene_ring_ops xgene_ring2_ops = {
diff --git a/drivers/net/ethernet/arc/emac_main.c b/drivers/net/ethernet/arc/emac_main.c
index b0da9693f28a..be865b4dada2 100644
--- a/drivers/net/ethernet/arc/emac_main.c
+++ b/drivers/net/ethernet/arc/emac_main.c
@@ -460,7 +460,7 @@ static void arc_emac_set_rx_mode(struct net_device *ndev)
460 if (ndev->flags & IFF_ALLMULTI) { 460 if (ndev->flags & IFF_ALLMULTI) {
461 arc_reg_set(priv, R_LAFL, ~0); 461 arc_reg_set(priv, R_LAFL, ~0);
462 arc_reg_set(priv, R_LAFH, ~0); 462 arc_reg_set(priv, R_LAFH, ~0);
463 } else { 463 } else if (ndev->flags & IFF_MULTICAST) {
464 struct netdev_hw_addr *ha; 464 struct netdev_hw_addr *ha;
465 unsigned int filter[2] = { 0, 0 }; 465 unsigned int filter[2] = { 0, 0 };
466 int bit; 466 int bit;
@@ -472,6 +472,9 @@ static void arc_emac_set_rx_mode(struct net_device *ndev)
472 472
473 arc_reg_set(priv, R_LAFL, filter[0]); 473 arc_reg_set(priv, R_LAFL, filter[0]);
474 arc_reg_set(priv, R_LAFH, filter[1]); 474 arc_reg_set(priv, R_LAFH, filter[1]);
475 } else {
476 arc_reg_set(priv, R_LAFL, 0);
477 arc_reg_set(priv, R_LAFH, 0);
475 } 478 }
476 } 479 }
477} 480}
@@ -764,8 +767,6 @@ int arc_emac_probe(struct net_device *ndev, int interface)
764 ndev->netdev_ops = &arc_emac_netdev_ops; 767 ndev->netdev_ops = &arc_emac_netdev_ops;
765 ndev->ethtool_ops = &arc_emac_ethtool_ops; 768 ndev->ethtool_ops = &arc_emac_ethtool_ops;
766 ndev->watchdog_timeo = TX_TIMEOUT; 769 ndev->watchdog_timeo = TX_TIMEOUT;
767 /* FIXME :: no multicast support yet */
768 ndev->flags &= ~IFF_MULTICAST;
769 770
770 priv = netdev_priv(ndev); 771 priv = netdev_priv(ndev);
771 priv->dev = dev; 772 priv->dev = dev;
diff --git a/drivers/net/ethernet/aurora/nb8800.c b/drivers/net/ethernet/aurora/nb8800.c
index 00c38bf151e6..e078d8da978c 100644
--- a/drivers/net/ethernet/aurora/nb8800.c
+++ b/drivers/net/ethernet/aurora/nb8800.c
@@ -1466,12 +1466,12 @@ static int nb8800_probe(struct platform_device *pdev)
1466 1466
1467 ret = nb8800_hw_init(dev); 1467 ret = nb8800_hw_init(dev);
1468 if (ret) 1468 if (ret)
1469 goto err_free_bus; 1469 goto err_deregister_fixed_link;
1470 1470
1471 if (ops && ops->init) { 1471 if (ops && ops->init) {
1472 ret = ops->init(dev); 1472 ret = ops->init(dev);
1473 if (ret) 1473 if (ret)
1474 goto err_free_bus; 1474 goto err_deregister_fixed_link;
1475 } 1475 }
1476 1476
1477 dev->netdev_ops = &nb8800_netdev_ops; 1477 dev->netdev_ops = &nb8800_netdev_ops;
@@ -1504,6 +1504,9 @@ static int nb8800_probe(struct platform_device *pdev)
1504 1504
1505err_free_dma: 1505err_free_dma:
1506 nb8800_dma_free(dev); 1506 nb8800_dma_free(dev);
1507err_deregister_fixed_link:
1508 if (of_phy_is_fixed_link(pdev->dev.of_node))
1509 of_phy_deregister_fixed_link(pdev->dev.of_node);
1507err_free_bus: 1510err_free_bus:
1508 of_node_put(priv->phy_node); 1511 of_node_put(priv->phy_node);
1509 mdiobus_unregister(bus); 1512 mdiobus_unregister(bus);
@@ -1521,6 +1524,8 @@ static int nb8800_remove(struct platform_device *pdev)
1521 struct nb8800_priv *priv = netdev_priv(ndev); 1524 struct nb8800_priv *priv = netdev_priv(ndev);
1522 1525
1523 unregister_netdev(ndev); 1526 unregister_netdev(ndev);
1527 if (of_phy_is_fixed_link(pdev->dev.of_node))
1528 of_phy_deregister_fixed_link(pdev->dev.of_node);
1524 of_node_put(priv->phy_node); 1529 of_node_put(priv->phy_node);
1525 1530
1526 mdiobus_unregister(priv->mii_bus); 1531 mdiobus_unregister(priv->mii_bus);
diff --git a/drivers/net/ethernet/broadcom/bcmsysport.c b/drivers/net/ethernet/broadcom/bcmsysport.c
index c3354b9941d1..25d1eb4933d0 100644
--- a/drivers/net/ethernet/broadcom/bcmsysport.c
+++ b/drivers/net/ethernet/broadcom/bcmsysport.c
@@ -1755,13 +1755,13 @@ static int bcm_sysport_probe(struct platform_device *pdev)
1755 if (priv->irq0 <= 0 || priv->irq1 <= 0) { 1755 if (priv->irq0 <= 0 || priv->irq1 <= 0) {
1756 dev_err(&pdev->dev, "invalid interrupts\n"); 1756 dev_err(&pdev->dev, "invalid interrupts\n");
1757 ret = -EINVAL; 1757 ret = -EINVAL;
1758 goto err; 1758 goto err_free_netdev;
1759 } 1759 }
1760 1760
1761 priv->base = devm_ioremap_resource(&pdev->dev, r); 1761 priv->base = devm_ioremap_resource(&pdev->dev, r);
1762 if (IS_ERR(priv->base)) { 1762 if (IS_ERR(priv->base)) {
1763 ret = PTR_ERR(priv->base); 1763 ret = PTR_ERR(priv->base);
1764 goto err; 1764 goto err_free_netdev;
1765 } 1765 }
1766 1766
1767 priv->netdev = dev; 1767 priv->netdev = dev;
@@ -1779,7 +1779,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
1779 ret = of_phy_register_fixed_link(dn); 1779 ret = of_phy_register_fixed_link(dn);
1780 if (ret) { 1780 if (ret) {
1781 dev_err(&pdev->dev, "failed to register fixed PHY\n"); 1781 dev_err(&pdev->dev, "failed to register fixed PHY\n");
1782 goto err; 1782 goto err_free_netdev;
1783 } 1783 }
1784 1784
1785 priv->phy_dn = dn; 1785 priv->phy_dn = dn;
@@ -1821,7 +1821,7 @@ static int bcm_sysport_probe(struct platform_device *pdev)
1821 ret = register_netdev(dev); 1821 ret = register_netdev(dev);
1822 if (ret) { 1822 if (ret) {
1823 dev_err(&pdev->dev, "failed to register net_device\n"); 1823 dev_err(&pdev->dev, "failed to register net_device\n");
1824 goto err; 1824 goto err_deregister_fixed_link;
1825 } 1825 }
1826 1826
1827 priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK; 1827 priv->rev = topctrl_readl(priv, REV_CNTL) & REV_MASK;
@@ -1832,7 +1832,11 @@ static int bcm_sysport_probe(struct platform_device *pdev)
1832 priv->base, priv->irq0, priv->irq1, txq, rxq); 1832 priv->base, priv->irq0, priv->irq1, txq, rxq);
1833 1833
1834 return 0; 1834 return 0;
1835err: 1835
1836err_deregister_fixed_link:
1837 if (of_phy_is_fixed_link(dn))
1838 of_phy_deregister_fixed_link(dn);
1839err_free_netdev:
1836 free_netdev(dev); 1840 free_netdev(dev);
1837 return ret; 1841 return ret;
1838} 1842}
@@ -1840,11 +1844,14 @@ err:
1840static int bcm_sysport_remove(struct platform_device *pdev) 1844static int bcm_sysport_remove(struct platform_device *pdev)
1841{ 1845{
1842 struct net_device *dev = dev_get_drvdata(&pdev->dev); 1846 struct net_device *dev = dev_get_drvdata(&pdev->dev);
1847 struct device_node *dn = pdev->dev.of_node;
1843 1848
1844 /* Not much to do, ndo_close has been called 1849 /* Not much to do, ndo_close has been called
1845 * and we use managed allocations 1850 * and we use managed allocations
1846 */ 1851 */
1847 unregister_netdev(dev); 1852 unregister_netdev(dev);
1853 if (of_phy_is_fixed_link(dn))
1854 of_phy_deregister_fixed_link(dn);
1848 free_netdev(dev); 1855 free_netdev(dev);
1849 dev_set_drvdata(&pdev->dev, NULL); 1856 dev_set_drvdata(&pdev->dev, NULL);
1850 1857
diff --git a/drivers/net/ethernet/broadcom/bgmac.c b/drivers/net/ethernet/broadcom/bgmac.c
index 31ca204b38d2..49f4cafe5438 100644
--- a/drivers/net/ethernet/broadcom/bgmac.c
+++ b/drivers/net/ethernet/broadcom/bgmac.c
@@ -307,6 +307,10 @@ static void bgmac_dma_rx_enable(struct bgmac *bgmac,
307 u32 ctl; 307 u32 ctl;
308 308
309 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL); 309 ctl = bgmac_read(bgmac, ring->mmio_base + BGMAC_DMA_RX_CTL);
310
311 /* preserve ONLY bits 16-17 from current hardware value */
312 ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
313
310 if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) { 314 if (bgmac->feature_flags & BGMAC_FEAT_RX_MASK_SETUP) {
311 ctl &= ~BGMAC_DMA_RX_BL_MASK; 315 ctl &= ~BGMAC_DMA_RX_BL_MASK;
312 ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT; 316 ctl |= BGMAC_DMA_RX_BL_128 << BGMAC_DMA_RX_BL_SHIFT;
@@ -317,7 +321,6 @@ static void bgmac_dma_rx_enable(struct bgmac *bgmac,
317 ctl &= ~BGMAC_DMA_RX_PT_MASK; 321 ctl &= ~BGMAC_DMA_RX_PT_MASK;
318 ctl |= BGMAC_DMA_RX_PT_1 << BGMAC_DMA_RX_PT_SHIFT; 322 ctl |= BGMAC_DMA_RX_PT_1 << BGMAC_DMA_RX_PT_SHIFT;
319 } 323 }
320 ctl &= BGMAC_DMA_RX_ADDREXT_MASK;
321 ctl |= BGMAC_DMA_RX_ENABLE; 324 ctl |= BGMAC_DMA_RX_ENABLE;
322 ctl |= BGMAC_DMA_RX_PARITY_DISABLE; 325 ctl |= BGMAC_DMA_RX_PARITY_DISABLE;
323 ctl |= BGMAC_DMA_RX_OVERFLOW_CONT; 326 ctl |= BGMAC_DMA_RX_OVERFLOW_CONT;
@@ -1046,9 +1049,9 @@ static void bgmac_enable(struct bgmac *bgmac)
1046 1049
1047 mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >> 1050 mode = (bgmac_read(bgmac, BGMAC_DEV_STATUS) & BGMAC_DS_MM_MASK) >>
1048 BGMAC_DS_MM_SHIFT; 1051 BGMAC_DS_MM_SHIFT;
1049 if (!(bgmac->feature_flags & BGMAC_FEAT_CLKCTLST) || mode != 0) 1052 if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST || mode != 0)
1050 bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT); 1053 bgmac_set(bgmac, BCMA_CLKCTLST, BCMA_CLKCTLST_FORCEHT);
1051 if (bgmac->feature_flags & BGMAC_FEAT_CLKCTLST && mode == 2) 1054 if (!(bgmac->feature_flags & BGMAC_FEAT_CLKCTLST) && mode == 2)
1052 bgmac_cco_ctl_maskset(bgmac, 1, ~0, 1055 bgmac_cco_ctl_maskset(bgmac, 1, ~0,
1053 BGMAC_CHIPCTL_1_RXC_DLL_BYPASS); 1056 BGMAC_CHIPCTL_1_RXC_DLL_BYPASS);
1054 1057
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c
index b3791b394715..1f7034d739b0 100644
--- a/drivers/net/ethernet/broadcom/bnx2.c
+++ b/drivers/net/ethernet/broadcom/bnx2.c
@@ -49,6 +49,7 @@
49#include <linux/firmware.h> 49#include <linux/firmware.h>
50#include <linux/log2.h> 50#include <linux/log2.h>
51#include <linux/aer.h> 51#include <linux/aer.h>
52#include <linux/crash_dump.h>
52 53
53#if IS_ENABLED(CONFIG_CNIC) 54#if IS_ENABLED(CONFIG_CNIC)
54#define BCM_CNIC 1 55#define BCM_CNIC 1
@@ -4764,15 +4765,16 @@ bnx2_setup_msix_tbl(struct bnx2 *bp)
4764 BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR); 4765 BNX2_WR(bp, BNX2_PCI_GRC_WINDOW3_ADDR, BNX2_MSIX_PBA_ADDR);
4765} 4766}
4766 4767
4767static int 4768static void
4768bnx2_reset_chip(struct bnx2 *bp, u32 reset_code) 4769bnx2_wait_dma_complete(struct bnx2 *bp)
4769{ 4770{
4770 u32 val; 4771 u32 val;
4771 int i, rc = 0; 4772 int i;
4772 u8 old_port;
4773 4773
4774 /* Wait for the current PCI transaction to complete before 4774 /*
4775 * issuing a reset. */ 4775 * Wait for the current PCI transaction to complete before
4776 * issuing a reset.
4777 */
4776 if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) || 4778 if ((BNX2_CHIP(bp) == BNX2_CHIP_5706) ||
4777 (BNX2_CHIP(bp) == BNX2_CHIP_5708)) { 4779 (BNX2_CHIP(bp) == BNX2_CHIP_5708)) {
4778 BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS, 4780 BNX2_WR(bp, BNX2_MISC_ENABLE_CLR_BITS,
@@ -4796,6 +4798,21 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
4796 } 4798 }
4797 } 4799 }
4798 4800
4801 return;
4802}
4803
4804
4805static int
4806bnx2_reset_chip(struct bnx2 *bp, u32 reset_code)
4807{
4808 u32 val;
4809 int i, rc = 0;
4810 u8 old_port;
4811
4812 /* Wait for the current PCI transaction to complete before
4813 * issuing a reset. */
4814 bnx2_wait_dma_complete(bp);
4815
4799 /* Wait for the firmware to tell us it is ok to issue a reset. */ 4816 /* Wait for the firmware to tell us it is ok to issue a reset. */
4800 bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1); 4817 bnx2_fw_sync(bp, BNX2_DRV_MSG_DATA_WAIT0 | reset_code, 1, 1);
4801 4818
@@ -6361,6 +6378,10 @@ bnx2_open(struct net_device *dev)
6361 struct bnx2 *bp = netdev_priv(dev); 6378 struct bnx2 *bp = netdev_priv(dev);
6362 int rc; 6379 int rc;
6363 6380
6381 rc = bnx2_request_firmware(bp);
6382 if (rc < 0)
6383 goto out;
6384
6364 netif_carrier_off(dev); 6385 netif_carrier_off(dev);
6365 6386
6366 bnx2_disable_int(bp); 6387 bnx2_disable_int(bp);
@@ -6429,6 +6450,7 @@ open_err:
6429 bnx2_free_irq(bp); 6450 bnx2_free_irq(bp);
6430 bnx2_free_mem(bp); 6451 bnx2_free_mem(bp);
6431 bnx2_del_napi(bp); 6452 bnx2_del_napi(bp);
6453 bnx2_release_firmware(bp);
6432 goto out; 6454 goto out;
6433} 6455}
6434 6456
@@ -8575,12 +8597,15 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8575 8597
8576 pci_set_drvdata(pdev, dev); 8598 pci_set_drvdata(pdev, dev);
8577 8599
8578 rc = bnx2_request_firmware(bp); 8600 /*
8579 if (rc < 0) 8601 * In-flight DMA from 1st kernel could continue going in kdump kernel.
8580 goto error; 8602 * New io-page table has been created before bnx2 does reset at open stage.
8581 8603 * We have to wait for the in-flight DMA to complete to avoid it look up
8604 * into the newly created io-page table.
8605 */
8606 if (is_kdump_kernel())
8607 bnx2_wait_dma_complete(bp);
8582 8608
8583 bnx2_reset_chip(bp, BNX2_DRV_MSG_CODE_RESET);
8584 memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN); 8609 memcpy(dev->dev_addr, bp->mac_addr, ETH_ALEN);
8585 8610
8586 dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG | 8611 dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
@@ -8613,7 +8638,6 @@ bnx2_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
8613 return 0; 8638 return 0;
8614 8639
8615error: 8640error:
8616 bnx2_release_firmware(bp);
8617 pci_iounmap(pdev, bp->regview); 8641 pci_iounmap(pdev, bp->regview);
8618 pci_release_regions(pdev); 8642 pci_release_regions(pdev);
8619 pci_disable_device(pdev); 8643 pci_disable_device(pdev);
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
index 85a7800bfc12..5f19427c7b27 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
@@ -1872,8 +1872,16 @@ static void bnx2x_get_ringparam(struct net_device *dev,
1872 1872
1873 ering->rx_max_pending = MAX_RX_AVAIL; 1873 ering->rx_max_pending = MAX_RX_AVAIL;
1874 1874
1875 /* If size isn't already set, we give an estimation of the number
1876 * of buffers we'll have. We're neglecting some possible conditions
1877 * [we couldn't know for certain at this point if number of queues
1878 * might shrink] but the number would be correct for the likely
1879 * scenario.
1880 */
1875 if (bp->rx_ring_size) 1881 if (bp->rx_ring_size)
1876 ering->rx_pending = bp->rx_ring_size; 1882 ering->rx_pending = bp->rx_ring_size;
1883 else if (BNX2X_NUM_RX_QUEUES(bp))
1884 ering->rx_pending = MAX_RX_AVAIL / BNX2X_NUM_RX_QUEUES(bp);
1877 else 1885 else
1878 ering->rx_pending = MAX_RX_AVAIL; 1886 ering->rx_pending = MAX_RX_AVAIL;
1879 1887
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
index 0cee4c0283f9..4febe60eadc2 100644
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
@@ -10138,7 +10138,7 @@ static void __bnx2x_add_udp_port(struct bnx2x *bp, u16 port,
10138{ 10138{
10139 struct bnx2x_udp_tunnel *udp_port = &bp->udp_tunnel_ports[type]; 10139 struct bnx2x_udp_tunnel *udp_port = &bp->udp_tunnel_ports[type];
10140 10140
10141 if (!netif_running(bp->dev) || !IS_PF(bp)) 10141 if (!netif_running(bp->dev) || !IS_PF(bp) || CHIP_IS_E1x(bp))
10142 return; 10142 return;
10143 10143
10144 if (udp_port->count && udp_port->dst_port == port) { 10144 if (udp_port->count && udp_port->dst_port == port) {
@@ -10163,7 +10163,7 @@ static void __bnx2x_del_udp_port(struct bnx2x *bp, u16 port,
10163{ 10163{
10164 struct bnx2x_udp_tunnel *udp_port = &bp->udp_tunnel_ports[type]; 10164 struct bnx2x_udp_tunnel *udp_port = &bp->udp_tunnel_ports[type];
10165 10165
10166 if (!IS_PF(bp)) 10166 if (!IS_PF(bp) || CHIP_IS_E1x(bp))
10167 return; 10167 return;
10168 10168
10169 if (!udp_port->count || udp_port->dst_port != port) { 10169 if (!udp_port->count || udp_port->dst_port != port) {
@@ -13505,6 +13505,7 @@ static int bnx2x_init_firmware(struct bnx2x *bp)
13505 13505
13506 /* Initialize the pointers to the init arrays */ 13506 /* Initialize the pointers to the init arrays */
13507 /* Blob */ 13507 /* Blob */
13508 rc = -ENOMEM;
13508 BNX2X_ALLOC_AND_SET(init_data, request_firmware_exit, be32_to_cpu_n); 13509 BNX2X_ALLOC_AND_SET(init_data, request_firmware_exit, be32_to_cpu_n);
13509 13510
13510 /* Opcodes */ 13511 /* Opcodes */
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
index a9f9f3738022..f08a20b921e7 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
@@ -1811,6 +1811,9 @@ static int bnxt_busy_poll(struct napi_struct *napi)
1811 if (atomic_read(&bp->intr_sem) != 0) 1811 if (atomic_read(&bp->intr_sem) != 0)
1812 return LL_FLUSH_FAILED; 1812 return LL_FLUSH_FAILED;
1813 1813
1814 if (!bp->link_info.link_up)
1815 return LL_FLUSH_FAILED;
1816
1814 if (!bnxt_lock_poll(bnapi)) 1817 if (!bnxt_lock_poll(bnapi))
1815 return LL_FLUSH_BUSY; 1818 return LL_FLUSH_BUSY;
1816 1819
@@ -3210,11 +3213,17 @@ static int bnxt_hwrm_tunnel_dst_port_alloc(struct bnxt *bp, __be16 port,
3210 goto err_out; 3213 goto err_out;
3211 } 3214 }
3212 3215
3213 if (tunnel_type & TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN) 3216 switch (tunnel_type) {
3217 case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_VXLAN:
3214 bp->vxlan_fw_dst_port_id = resp->tunnel_dst_port_id; 3218 bp->vxlan_fw_dst_port_id = resp->tunnel_dst_port_id;
3215 3219 break;
3216 else if (tunnel_type & TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE) 3220 case TUNNEL_DST_PORT_ALLOC_REQ_TUNNEL_TYPE_GENEVE:
3217 bp->nge_fw_dst_port_id = resp->tunnel_dst_port_id; 3221 bp->nge_fw_dst_port_id = resp->tunnel_dst_port_id;
3222 break;
3223 default:
3224 break;
3225 }
3226
3218err_out: 3227err_out:
3219 mutex_unlock(&bp->hwrm_cmd_lock); 3228 mutex_unlock(&bp->hwrm_cmd_lock);
3220 return rc; 3229 return rc;
@@ -4111,7 +4120,7 @@ static int bnxt_hwrm_stat_ctx_alloc(struct bnxt *bp)
4111 bp->grp_info[i].fw_stats_ctx = cpr->hw_stats_ctx_id; 4120 bp->grp_info[i].fw_stats_ctx = cpr->hw_stats_ctx_id;
4112 } 4121 }
4113 mutex_unlock(&bp->hwrm_cmd_lock); 4122 mutex_unlock(&bp->hwrm_cmd_lock);
4114 return 0; 4123 return rc;
4115} 4124}
4116 4125
4117static int bnxt_hwrm_func_qcfg(struct bnxt *bp) 4126static int bnxt_hwrm_func_qcfg(struct bnxt *bp)
@@ -4934,6 +4943,10 @@ static void bnxt_del_napi(struct bnxt *bp)
4934 napi_hash_del(&bnapi->napi); 4943 napi_hash_del(&bnapi->napi);
4935 netif_napi_del(&bnapi->napi); 4944 netif_napi_del(&bnapi->napi);
4936 } 4945 }
4946 /* We called napi_hash_del() before netif_napi_del(), we need
4947 * to respect an RCU grace period before freeing napi structures.
4948 */
4949 synchronize_net();
4937} 4950}
4938 4951
4939static void bnxt_init_napi(struct bnxt *bp) 4952static void bnxt_init_napi(struct bnxt *bp)
@@ -6309,6 +6322,7 @@ static int bnxt_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
6309 struct tc_to_netdev *ntc) 6322 struct tc_to_netdev *ntc)
6310{ 6323{
6311 struct bnxt *bp = netdev_priv(dev); 6324 struct bnxt *bp = netdev_priv(dev);
6325 bool sh = false;
6312 u8 tc; 6326 u8 tc;
6313 6327
6314 if (ntc->type != TC_SETUP_MQPRIO) 6328 if (ntc->type != TC_SETUP_MQPRIO)
@@ -6325,12 +6339,11 @@ static int bnxt_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
6325 if (netdev_get_num_tc(dev) == tc) 6339 if (netdev_get_num_tc(dev) == tc)
6326 return 0; 6340 return 0;
6327 6341
6342 if (bp->flags & BNXT_FLAG_SHARED_RINGS)
6343 sh = true;
6344
6328 if (tc) { 6345 if (tc) {
6329 int max_rx_rings, max_tx_rings, rc; 6346 int max_rx_rings, max_tx_rings, rc;
6330 bool sh = false;
6331
6332 if (bp->flags & BNXT_FLAG_SHARED_RINGS)
6333 sh = true;
6334 6347
6335 rc = bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh); 6348 rc = bnxt_get_max_rings(bp, &max_rx_rings, &max_tx_rings, sh);
6336 if (rc || bp->tx_nr_rings_per_tc * tc > max_tx_rings) 6349 if (rc || bp->tx_nr_rings_per_tc * tc > max_tx_rings)
@@ -6348,7 +6361,8 @@ static int bnxt_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
6348 bp->tx_nr_rings = bp->tx_nr_rings_per_tc; 6361 bp->tx_nr_rings = bp->tx_nr_rings_per_tc;
6349 netdev_reset_tc(dev); 6362 netdev_reset_tc(dev);
6350 } 6363 }
6351 bp->cp_nr_rings = max_t(int, bp->tx_nr_rings, bp->rx_nr_rings); 6364 bp->cp_nr_rings = sh ? max_t(int, bp->tx_nr_rings, bp->rx_nr_rings) :
6365 bp->tx_nr_rings + bp->rx_nr_rings;
6352 bp->num_stat_ctxs = bp->cp_nr_rings; 6366 bp->num_stat_ctxs = bp->cp_nr_rings;
6353 6367
6354 if (netif_running(bp->dev)) 6368 if (netif_running(bp->dev))
diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
index ec6cd18842c3..60e2af8678bd 100644
--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
+++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_sriov.c
@@ -774,8 +774,8 @@ static int bnxt_vf_set_link(struct bnxt *bp, struct bnxt_vf_info *vf)
774 774
775 if (vf->flags & BNXT_VF_LINK_UP) { 775 if (vf->flags & BNXT_VF_LINK_UP) {
776 /* if physical link is down, force link up on VF */ 776 /* if physical link is down, force link up on VF */
777 if (phy_qcfg_resp.link == 777 if (phy_qcfg_resp.link !=
778 PORT_PHY_QCFG_RESP_LINK_NO_LINK) { 778 PORT_PHY_QCFG_RESP_LINK_LINK) {
779 phy_qcfg_resp.link = 779 phy_qcfg_resp.link =
780 PORT_PHY_QCFG_RESP_LINK_LINK; 780 PORT_PHY_QCFG_RESP_LINK_LINK;
781 phy_qcfg_resp.link_speed = cpu_to_le16( 781 phy_qcfg_resp.link_speed = cpu_to_le16(
diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
index 4464bc5db934..a4e60e56c14f 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -1172,6 +1172,7 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
1172 struct bcmgenet_tx_ring *ring) 1172 struct bcmgenet_tx_ring *ring)
1173{ 1173{
1174 struct bcmgenet_priv *priv = netdev_priv(dev); 1174 struct bcmgenet_priv *priv = netdev_priv(dev);
1175 struct device *kdev = &priv->pdev->dev;
1175 struct enet_cb *tx_cb_ptr; 1176 struct enet_cb *tx_cb_ptr;
1176 struct netdev_queue *txq; 1177 struct netdev_queue *txq;
1177 unsigned int pkts_compl = 0; 1178 unsigned int pkts_compl = 0;
@@ -1199,13 +1200,13 @@ static unsigned int __bcmgenet_tx_reclaim(struct net_device *dev,
1199 if (tx_cb_ptr->skb) { 1200 if (tx_cb_ptr->skb) {
1200 pkts_compl++; 1201 pkts_compl++;
1201 bytes_compl += GENET_CB(tx_cb_ptr->skb)->bytes_sent; 1202 bytes_compl += GENET_CB(tx_cb_ptr->skb)->bytes_sent;
1202 dma_unmap_single(&dev->dev, 1203 dma_unmap_single(kdev,
1203 dma_unmap_addr(tx_cb_ptr, dma_addr), 1204 dma_unmap_addr(tx_cb_ptr, dma_addr),
1204 dma_unmap_len(tx_cb_ptr, dma_len), 1205 dma_unmap_len(tx_cb_ptr, dma_len),
1205 DMA_TO_DEVICE); 1206 DMA_TO_DEVICE);
1206 bcmgenet_free_cb(tx_cb_ptr); 1207 bcmgenet_free_cb(tx_cb_ptr);
1207 } else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) { 1208 } else if (dma_unmap_addr(tx_cb_ptr, dma_addr)) {
1208 dma_unmap_page(&dev->dev, 1209 dma_unmap_page(kdev,
1209 dma_unmap_addr(tx_cb_ptr, dma_addr), 1210 dma_unmap_addr(tx_cb_ptr, dma_addr),
1210 dma_unmap_len(tx_cb_ptr, dma_len), 1211 dma_unmap_len(tx_cb_ptr, dma_len),
1211 DMA_TO_DEVICE); 1212 DMA_TO_DEVICE);
@@ -1775,6 +1776,7 @@ static int bcmgenet_alloc_rx_buffers(struct bcmgenet_priv *priv,
1775 1776
1776static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv) 1777static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
1777{ 1778{
1779 struct device *kdev = &priv->pdev->dev;
1778 struct enet_cb *cb; 1780 struct enet_cb *cb;
1779 int i; 1781 int i;
1780 1782
@@ -1782,7 +1784,7 @@ static void bcmgenet_free_rx_buffers(struct bcmgenet_priv *priv)
1782 cb = &priv->rx_cbs[i]; 1784 cb = &priv->rx_cbs[i];
1783 1785
1784 if (dma_unmap_addr(cb, dma_addr)) { 1786 if (dma_unmap_addr(cb, dma_addr)) {
1785 dma_unmap_single(&priv->dev->dev, 1787 dma_unmap_single(kdev,
1786 dma_unmap_addr(cb, dma_addr), 1788 dma_unmap_addr(cb, dma_addr),
1787 priv->rx_buf_len, DMA_FROM_DEVICE); 1789 priv->rx_buf_len, DMA_FROM_DEVICE);
1788 dma_unmap_addr_set(cb, dma_addr, 0); 1790 dma_unmap_addr_set(cb, dma_addr, 0);
diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c
index 457c3bc8cfff..e87607621e62 100644
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -542,8 +542,10 @@ static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
542 /* Make sure we initialize MoCA PHYs with a link down */ 542 /* Make sure we initialize MoCA PHYs with a link down */
543 if (phy_mode == PHY_INTERFACE_MODE_MOCA) { 543 if (phy_mode == PHY_INTERFACE_MODE_MOCA) {
544 phydev = of_phy_find_device(dn); 544 phydev = of_phy_find_device(dn);
545 if (phydev) 545 if (phydev) {
546 phydev->link = 0; 546 phydev->link = 0;
547 put_device(&phydev->mdio.dev);
548 }
547 } 549 }
548 550
549 return 0; 551 return 0;
@@ -625,6 +627,7 @@ static int bcmgenet_mii_bus_init(struct bcmgenet_priv *priv)
625int bcmgenet_mii_init(struct net_device *dev) 627int bcmgenet_mii_init(struct net_device *dev)
626{ 628{
627 struct bcmgenet_priv *priv = netdev_priv(dev); 629 struct bcmgenet_priv *priv = netdev_priv(dev);
630 struct device_node *dn = priv->pdev->dev.of_node;
628 int ret; 631 int ret;
629 632
630 ret = bcmgenet_mii_alloc(priv); 633 ret = bcmgenet_mii_alloc(priv);
@@ -638,6 +641,8 @@ int bcmgenet_mii_init(struct net_device *dev)
638 return 0; 641 return 0;
639 642
640out: 643out:
644 if (of_phy_is_fixed_link(dn))
645 of_phy_deregister_fixed_link(dn);
641 of_node_put(priv->phy_dn); 646 of_node_put(priv->phy_dn);
642 mdiobus_unregister(priv->mii_bus); 647 mdiobus_unregister(priv->mii_bus);
643 mdiobus_free(priv->mii_bus); 648 mdiobus_free(priv->mii_bus);
@@ -647,7 +652,10 @@ out:
647void bcmgenet_mii_exit(struct net_device *dev) 652void bcmgenet_mii_exit(struct net_device *dev)
648{ 653{
649 struct bcmgenet_priv *priv = netdev_priv(dev); 654 struct bcmgenet_priv *priv = netdev_priv(dev);
655 struct device_node *dn = priv->pdev->dev.of_node;
650 656
657 if (of_phy_is_fixed_link(dn))
658 of_phy_deregister_fixed_link(dn);
651 of_node_put(priv->phy_dn); 659 of_node_put(priv->phy_dn);
652 mdiobus_unregister(priv->mii_bus); 660 mdiobus_unregister(priv->mii_bus);
653 mdiobus_free(priv->mii_bus); 661 mdiobus_free(priv->mii_bus);
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
index f9df4b5ae90e..f42f672b0e7e 100644
--- a/drivers/net/ethernet/brocade/bna/bnad.c
+++ b/drivers/net/ethernet/brocade/bna/bnad.c
@@ -177,6 +177,7 @@ bnad_txcmpl_process(struct bnad *bnad, struct bna_tcb *tcb)
177 return 0; 177 return 0;
178 178
179 hw_cons = *(tcb->hw_consumer_index); 179 hw_cons = *(tcb->hw_consumer_index);
180 rmb();
180 cons = tcb->consumer_index; 181 cons = tcb->consumer_index;
181 q_depth = tcb->q_depth; 182 q_depth = tcb->q_depth;
182 183
@@ -3094,7 +3095,7 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
3094 BNA_QE_INDX_INC(prod, q_depth); 3095 BNA_QE_INDX_INC(prod, q_depth);
3095 tcb->producer_index = prod; 3096 tcb->producer_index = prod;
3096 3097
3097 smp_mb(); 3098 wmb();
3098 3099
3099 if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED, &tcb->flags))) 3100 if (unlikely(!test_bit(BNAD_TXQ_TX_STARTED, &tcb->flags)))
3100 return NETDEV_TX_OK; 3101 return NETDEV_TX_OK;
@@ -3102,7 +3103,6 @@ bnad_start_xmit(struct sk_buff *skb, struct net_device *netdev)
3102 skb_tx_timestamp(skb); 3103 skb_tx_timestamp(skb);
3103 3104
3104 bna_txq_prod_indx_doorbell(tcb); 3105 bna_txq_prod_indx_doorbell(tcb);
3105 smp_mb();
3106 3106
3107 return NETDEV_TX_OK; 3107 return NETDEV_TX_OK;
3108} 3108}
diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
index b32444a3ed79..ec09fcece711 100644
--- a/drivers/net/ethernet/cadence/macb.c
+++ b/drivers/net/ethernet/cadence/macb.c
@@ -975,6 +975,7 @@ static inline void macb_init_rx_ring(struct macb *bp)
975 addr += bp->rx_buffer_size; 975 addr += bp->rx_buffer_size;
976 } 976 }
977 bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP); 977 bp->rx_ring[RX_RING_SIZE - 1].addr |= MACB_BIT(RX_WRAP);
978 bp->rx_tail = 0;
978} 979}
979 980
980static int macb_rx(struct macb *bp, int budget) 981static int macb_rx(struct macb *bp, int budget)
@@ -1156,6 +1157,7 @@ static irqreturn_t macb_interrupt(int irq, void *dev_id)
1156 if (status & MACB_BIT(RXUBR)) { 1157 if (status & MACB_BIT(RXUBR)) {
1157 ctrl = macb_readl(bp, NCR); 1158 ctrl = macb_readl(bp, NCR);
1158 macb_writel(bp, NCR, ctrl & ~MACB_BIT(RE)); 1159 macb_writel(bp, NCR, ctrl & ~MACB_BIT(RE));
1160 wmb();
1159 macb_writel(bp, NCR, ctrl | MACB_BIT(RE)); 1161 macb_writel(bp, NCR, ctrl | MACB_BIT(RE));
1160 1162
1161 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE) 1163 if (bp->caps & MACB_CAPS_ISR_CLEAR_ON_WRITE)
@@ -1616,8 +1618,6 @@ static void macb_init_rings(struct macb *bp)
1616 bp->queues[0].tx_head = 0; 1618 bp->queues[0].tx_head = 0;
1617 bp->queues[0].tx_tail = 0; 1619 bp->queues[0].tx_tail = 0;
1618 bp->queues[0].tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP); 1620 bp->queues[0].tx_ring[TX_RING_SIZE - 1].ctrl |= MACB_BIT(TX_WRAP);
1619
1620 bp->rx_tail = 0;
1621} 1621}
1622 1622
1623static void macb_reset_hw(struct macb *bp) 1623static void macb_reset_hw(struct macb *bp)
@@ -2673,6 +2673,12 @@ static int at91ether_start_xmit(struct sk_buff *skb, struct net_device *dev)
2673 lp->skb_length = skb->len; 2673 lp->skb_length = skb->len;
2674 lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len, 2674 lp->skb_physaddr = dma_map_single(NULL, skb->data, skb->len,
2675 DMA_TO_DEVICE); 2675 DMA_TO_DEVICE);
2676 if (dma_mapping_error(NULL, lp->skb_physaddr)) {
2677 dev_kfree_skb_any(skb);
2678 dev->stats.tx_dropped++;
2679 netdev_err(dev, "%s: DMA mapping error\n", __func__);
2680 return NETDEV_TX_OK;
2681 }
2676 2682
2677 /* Set address of the data in the Transmit Address register */ 2683 /* Set address of the data in the Transmit Address register */
2678 macb_writel(lp, TAR, lp->skb_physaddr); 2684 macb_writel(lp, TAR, lp->skb_physaddr);
@@ -2764,6 +2770,7 @@ static irqreturn_t at91ether_interrupt(int irq, void *dev_id)
2764 if (intstatus & MACB_BIT(RXUBR)) { 2770 if (intstatus & MACB_BIT(RXUBR)) {
2765 ctl = macb_readl(lp, NCR); 2771 ctl = macb_readl(lp, NCR);
2766 macb_writel(lp, NCR, ctl & ~MACB_BIT(RE)); 2772 macb_writel(lp, NCR, ctl & ~MACB_BIT(RE));
2773 wmb();
2767 macb_writel(lp, NCR, ctl | MACB_BIT(RE)); 2774 macb_writel(lp, NCR, ctl | MACB_BIT(RE));
2768 } 2775 }
2769 2776
diff --git a/drivers/net/ethernet/cavium/thunder/nic.h b/drivers/net/ethernet/cavium/thunder/nic.h
index 30426109711c..86bd93ce2ea3 100644
--- a/drivers/net/ethernet/cavium/thunder/nic.h
+++ b/drivers/net/ethernet/cavium/thunder/nic.h
@@ -47,7 +47,7 @@
47 47
48/* Min/Max packet size */ 48/* Min/Max packet size */
49#define NIC_HW_MIN_FRS 64 49#define NIC_HW_MIN_FRS 64
50#define NIC_HW_MAX_FRS 9200 /* 9216 max packet including FCS */ 50#define NIC_HW_MAX_FRS 9190 /* Excluding L2 header and FCS */
51 51
52/* Max pkinds */ 52/* Max pkinds */
53#define NIC_MAX_PKIND 16 53#define NIC_MAX_PKIND 16
@@ -178,11 +178,11 @@ enum tx_stats_reg_offset {
178 178
179struct nicvf_hw_stats { 179struct nicvf_hw_stats {
180 u64 rx_bytes; 180 u64 rx_bytes;
181 u64 rx_frames;
181 u64 rx_ucast_frames; 182 u64 rx_ucast_frames;
182 u64 rx_bcast_frames; 183 u64 rx_bcast_frames;
183 u64 rx_mcast_frames; 184 u64 rx_mcast_frames;
184 u64 rx_fcs_errors; 185 u64 rx_drops;
185 u64 rx_l2_errors;
186 u64 rx_drop_red; 186 u64 rx_drop_red;
187 u64 rx_drop_red_bytes; 187 u64 rx_drop_red_bytes;
188 u64 rx_drop_overrun; 188 u64 rx_drop_overrun;
@@ -191,6 +191,19 @@ struct nicvf_hw_stats {
191 u64 rx_drop_mcast; 191 u64 rx_drop_mcast;
192 u64 rx_drop_l3_bcast; 192 u64 rx_drop_l3_bcast;
193 u64 rx_drop_l3_mcast; 193 u64 rx_drop_l3_mcast;
194 u64 rx_fcs_errors;
195 u64 rx_l2_errors;
196
197 u64 tx_bytes;
198 u64 tx_frames;
199 u64 tx_ucast_frames;
200 u64 tx_bcast_frames;
201 u64 tx_mcast_frames;
202 u64 tx_drops;
203};
204
205struct nicvf_drv_stats {
206 /* CQE Rx errs */
194 u64 rx_bgx_truncated_pkts; 207 u64 rx_bgx_truncated_pkts;
195 u64 rx_jabber_errs; 208 u64 rx_jabber_errs;
196 u64 rx_fcs_errs; 209 u64 rx_fcs_errs;
@@ -216,34 +229,30 @@ struct nicvf_hw_stats {
216 u64 rx_l4_pclp; 229 u64 rx_l4_pclp;
217 u64 rx_truncated_pkts; 230 u64 rx_truncated_pkts;
218 231
219 u64 tx_bytes_ok; 232 /* CQE Tx errs */
220 u64 tx_ucast_frames_ok; 233 u64 tx_desc_fault;
221 u64 tx_bcast_frames_ok; 234 u64 tx_hdr_cons_err;
222 u64 tx_mcast_frames_ok; 235 u64 tx_subdesc_err;
223 u64 tx_drops; 236 u64 tx_max_size_exceeded;
224}; 237 u64 tx_imm_size_oflow;
225 238 u64 tx_data_seq_err;
226struct nicvf_drv_stats { 239 u64 tx_mem_seq_err;
227 /* Rx */ 240 u64 tx_lock_viol;
228 u64 rx_frames_ok; 241 u64 tx_data_fault;
229 u64 rx_frames_64; 242 u64 tx_tstmp_conflict;
230 u64 rx_frames_127; 243 u64 tx_tstmp_timeout;
231 u64 rx_frames_255; 244 u64 tx_mem_fault;
232 u64 rx_frames_511; 245 u64 tx_csum_overlap;
233 u64 rx_frames_1023; 246 u64 tx_csum_overflow;
234 u64 rx_frames_1518; 247
235 u64 rx_frames_jumbo; 248 /* driver debug stats */
236 u64 rx_drops;
237
238 u64 rcv_buffer_alloc_failures; 249 u64 rcv_buffer_alloc_failures;
239
240 /* Tx */
241 u64 tx_frames_ok;
242 u64 tx_drops;
243 u64 tx_tso; 250 u64 tx_tso;
244 u64 tx_timeout; 251 u64 tx_timeout;
245 u64 txq_stop; 252 u64 txq_stop;
246 u64 txq_wake; 253 u64 txq_wake;
254
255 struct u64_stats_sync syncp;
247}; 256};
248 257
249struct nicvf { 258struct nicvf {
@@ -282,7 +291,6 @@ struct nicvf {
282 291
283 u8 node; 292 u8 node;
284 u8 cpi_alg; 293 u8 cpi_alg;
285 u16 mtu;
286 bool link_up; 294 bool link_up;
287 u8 duplex; 295 u8 duplex;
288 u32 speed; 296 u32 speed;
@@ -298,7 +306,7 @@ struct nicvf {
298 306
299 /* Stats */ 307 /* Stats */
300 struct nicvf_hw_stats hw_stats; 308 struct nicvf_hw_stats hw_stats;
301 struct nicvf_drv_stats drv_stats; 309 struct nicvf_drv_stats __percpu *drv_stats;
302 struct bgx_stats bgx_stats; 310 struct bgx_stats bgx_stats;
303 311
304 /* MSI-X */ 312 /* MSI-X */
diff --git a/drivers/net/ethernet/cavium/thunder/nic_main.c b/drivers/net/ethernet/cavium/thunder/nic_main.c
index 2bbf4cbf08b2..6677b96e1f3f 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nic_main.c
@@ -11,6 +11,7 @@
11#include <linux/pci.h> 11#include <linux/pci.h>
12#include <linux/etherdevice.h> 12#include <linux/etherdevice.h>
13#include <linux/of.h> 13#include <linux/of.h>
14#include <linux/if_vlan.h>
14 15
15#include "nic_reg.h" 16#include "nic_reg.h"
16#include "nic.h" 17#include "nic.h"
@@ -260,18 +261,31 @@ static void nic_get_bgx_stats(struct nicpf *nic, struct bgx_stats_msg *bgx)
260/* Update hardware min/max frame size */ 261/* Update hardware min/max frame size */
261static int nic_update_hw_frs(struct nicpf *nic, int new_frs, int vf) 262static int nic_update_hw_frs(struct nicpf *nic, int new_frs, int vf)
262{ 263{
263 if ((new_frs > NIC_HW_MAX_FRS) || (new_frs < NIC_HW_MIN_FRS)) { 264 int bgx, lmac, lmac_cnt;
264 dev_err(&nic->pdev->dev, 265 u64 lmac_credits;
265 "Invalid MTU setting from VF%d rejected, should be between %d and %d\n", 266
266 vf, NIC_HW_MIN_FRS, NIC_HW_MAX_FRS); 267 if ((new_frs > NIC_HW_MAX_FRS) || (new_frs < NIC_HW_MIN_FRS))
267 return 1; 268 return 1;
268 }
269 new_frs += ETH_HLEN;
270 if (new_frs <= nic->pkind.maxlen)
271 return 0;
272 269
273 nic->pkind.maxlen = new_frs; 270 bgx = NIC_GET_BGX_FROM_VF_LMAC_MAP(nic->vf_lmac_map[vf]);
274 nic_reg_write(nic, NIC_PF_PKIND_0_15_CFG, *(u64 *)&nic->pkind); 271 lmac = NIC_GET_LMAC_FROM_VF_LMAC_MAP(nic->vf_lmac_map[vf]);
272 lmac += bgx * MAX_LMAC_PER_BGX;
273
274 new_frs += VLAN_ETH_HLEN + ETH_FCS_LEN + 4;
275
276 /* Update corresponding LMAC credits */
277 lmac_cnt = bgx_get_lmac_count(nic->node, bgx);
278 lmac_credits = nic_reg_read(nic, NIC_PF_LMAC_0_7_CREDIT + (lmac * 8));
279 lmac_credits &= ~(0xFFFFFULL << 12);
280 lmac_credits |= (((((48 * 1024) / lmac_cnt) - new_frs) / 16) << 12);
281 nic_reg_write(nic, NIC_PF_LMAC_0_7_CREDIT + (lmac * 8), lmac_credits);
282
283 /* Enforce MTU in HW
284 * This config is supported only from 88xx pass 2.0 onwards.
285 */
286 if (!pass1_silicon(nic->pdev))
287 nic_reg_write(nic,
288 NIC_PF_LMAC_0_7_CFG2 + (lmac * 8), new_frs);
275 return 0; 289 return 0;
276} 290}
277 291
@@ -464,7 +478,7 @@ static int nic_init_hw(struct nicpf *nic)
464 478
465 /* PKIND configuration */ 479 /* PKIND configuration */
466 nic->pkind.minlen = 0; 480 nic->pkind.minlen = 0;
467 nic->pkind.maxlen = NIC_HW_MAX_FRS + ETH_HLEN; 481 nic->pkind.maxlen = NIC_HW_MAX_FRS + VLAN_ETH_HLEN + ETH_FCS_LEN + 4;
468 nic->pkind.lenerr_en = 1; 482 nic->pkind.lenerr_en = 1;
469 nic->pkind.rx_hdr = 0; 483 nic->pkind.rx_hdr = 0;
470 nic->pkind.hdr_sl = 0; 484 nic->pkind.hdr_sl = 0;
@@ -837,6 +851,7 @@ static int nic_reset_stat_counters(struct nicpf *nic,
837 nic_reg_write(nic, reg_addr, 0); 851 nic_reg_write(nic, reg_addr, 0);
838 } 852 }
839 } 853 }
854
840 return 0; 855 return 0;
841} 856}
842 857
diff --git a/drivers/net/ethernet/cavium/thunder/nic_reg.h b/drivers/net/ethernet/cavium/thunder/nic_reg.h
index edf779f5a227..80d46337cf29 100644
--- a/drivers/net/ethernet/cavium/thunder/nic_reg.h
+++ b/drivers/net/ethernet/cavium/thunder/nic_reg.h
@@ -106,6 +106,7 @@
106#define NIC_PF_MPI_0_2047_CFG (0x210000) 106#define NIC_PF_MPI_0_2047_CFG (0x210000)
107#define NIC_PF_RSSI_0_4097_RQ (0x220000) 107#define NIC_PF_RSSI_0_4097_RQ (0x220000)
108#define NIC_PF_LMAC_0_7_CFG (0x240000) 108#define NIC_PF_LMAC_0_7_CFG (0x240000)
109#define NIC_PF_LMAC_0_7_CFG2 (0x240100)
109#define NIC_PF_LMAC_0_7_SW_XOFF (0x242000) 110#define NIC_PF_LMAC_0_7_SW_XOFF (0x242000)
110#define NIC_PF_LMAC_0_7_CREDIT (0x244000) 111#define NIC_PF_LMAC_0_7_CREDIT (0x244000)
111#define NIC_PF_CHAN_0_255_TX_CFG (0x400000) 112#define NIC_PF_CHAN_0_255_TX_CFG (0x400000)
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
index ad4fddb55421..432bf6be57cb 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c
@@ -36,11 +36,11 @@ struct nicvf_stat {
36 36
37static const struct nicvf_stat nicvf_hw_stats[] = { 37static const struct nicvf_stat nicvf_hw_stats[] = {
38 NICVF_HW_STAT(rx_bytes), 38 NICVF_HW_STAT(rx_bytes),
39 NICVF_HW_STAT(rx_frames),
39 NICVF_HW_STAT(rx_ucast_frames), 40 NICVF_HW_STAT(rx_ucast_frames),
40 NICVF_HW_STAT(rx_bcast_frames), 41 NICVF_HW_STAT(rx_bcast_frames),
41 NICVF_HW_STAT(rx_mcast_frames), 42 NICVF_HW_STAT(rx_mcast_frames),
42 NICVF_HW_STAT(rx_fcs_errors), 43 NICVF_HW_STAT(rx_drops),
43 NICVF_HW_STAT(rx_l2_errors),
44 NICVF_HW_STAT(rx_drop_red), 44 NICVF_HW_STAT(rx_drop_red),
45 NICVF_HW_STAT(rx_drop_red_bytes), 45 NICVF_HW_STAT(rx_drop_red_bytes),
46 NICVF_HW_STAT(rx_drop_overrun), 46 NICVF_HW_STAT(rx_drop_overrun),
@@ -49,50 +49,59 @@ static const struct nicvf_stat nicvf_hw_stats[] = {
49 NICVF_HW_STAT(rx_drop_mcast), 49 NICVF_HW_STAT(rx_drop_mcast),
50 NICVF_HW_STAT(rx_drop_l3_bcast), 50 NICVF_HW_STAT(rx_drop_l3_bcast),
51 NICVF_HW_STAT(rx_drop_l3_mcast), 51 NICVF_HW_STAT(rx_drop_l3_mcast),
52 NICVF_HW_STAT(rx_bgx_truncated_pkts), 52 NICVF_HW_STAT(rx_fcs_errors),
53 NICVF_HW_STAT(rx_jabber_errs), 53 NICVF_HW_STAT(rx_l2_errors),
54 NICVF_HW_STAT(rx_fcs_errs), 54 NICVF_HW_STAT(tx_bytes),
55 NICVF_HW_STAT(rx_bgx_errs), 55 NICVF_HW_STAT(tx_frames),
56 NICVF_HW_STAT(rx_prel2_errs), 56 NICVF_HW_STAT(tx_ucast_frames),
57 NICVF_HW_STAT(rx_l2_hdr_malformed), 57 NICVF_HW_STAT(tx_bcast_frames),
58 NICVF_HW_STAT(rx_oversize), 58 NICVF_HW_STAT(tx_mcast_frames),
59 NICVF_HW_STAT(rx_undersize), 59 NICVF_HW_STAT(tx_drops),
60 NICVF_HW_STAT(rx_l2_len_mismatch),
61 NICVF_HW_STAT(rx_l2_pclp),
62 NICVF_HW_STAT(rx_ip_ver_errs),
63 NICVF_HW_STAT(rx_ip_csum_errs),
64 NICVF_HW_STAT(rx_ip_hdr_malformed),
65 NICVF_HW_STAT(rx_ip_payload_malformed),
66 NICVF_HW_STAT(rx_ip_ttl_errs),
67 NICVF_HW_STAT(rx_l3_pclp),
68 NICVF_HW_STAT(rx_l4_malformed),
69 NICVF_HW_STAT(rx_l4_csum_errs),
70 NICVF_HW_STAT(rx_udp_len_errs),
71 NICVF_HW_STAT(rx_l4_port_errs),
72 NICVF_HW_STAT(rx_tcp_flag_errs),
73 NICVF_HW_STAT(rx_tcp_offset_errs),
74 NICVF_HW_STAT(rx_l4_pclp),
75 NICVF_HW_STAT(rx_truncated_pkts),
76 NICVF_HW_STAT(tx_bytes_ok),
77 NICVF_HW_STAT(tx_ucast_frames_ok),
78 NICVF_HW_STAT(tx_bcast_frames_ok),
79 NICVF_HW_STAT(tx_mcast_frames_ok),
80}; 60};
81 61
82static const struct nicvf_stat nicvf_drv_stats[] = { 62static const struct nicvf_stat nicvf_drv_stats[] = {
83 NICVF_DRV_STAT(rx_frames_ok), 63 NICVF_DRV_STAT(rx_bgx_truncated_pkts),
84 NICVF_DRV_STAT(rx_frames_64), 64 NICVF_DRV_STAT(rx_jabber_errs),
85 NICVF_DRV_STAT(rx_frames_127), 65 NICVF_DRV_STAT(rx_fcs_errs),
86 NICVF_DRV_STAT(rx_frames_255), 66 NICVF_DRV_STAT(rx_bgx_errs),
87 NICVF_DRV_STAT(rx_frames_511), 67 NICVF_DRV_STAT(rx_prel2_errs),
88 NICVF_DRV_STAT(rx_frames_1023), 68 NICVF_DRV_STAT(rx_l2_hdr_malformed),
89 NICVF_DRV_STAT(rx_frames_1518), 69 NICVF_DRV_STAT(rx_oversize),
90 NICVF_DRV_STAT(rx_frames_jumbo), 70 NICVF_DRV_STAT(rx_undersize),
91 NICVF_DRV_STAT(rx_drops), 71 NICVF_DRV_STAT(rx_l2_len_mismatch),
72 NICVF_DRV_STAT(rx_l2_pclp),
73 NICVF_DRV_STAT(rx_ip_ver_errs),
74 NICVF_DRV_STAT(rx_ip_csum_errs),
75 NICVF_DRV_STAT(rx_ip_hdr_malformed),
76 NICVF_DRV_STAT(rx_ip_payload_malformed),
77 NICVF_DRV_STAT(rx_ip_ttl_errs),
78 NICVF_DRV_STAT(rx_l3_pclp),
79 NICVF_DRV_STAT(rx_l4_malformed),
80 NICVF_DRV_STAT(rx_l4_csum_errs),
81 NICVF_DRV_STAT(rx_udp_len_errs),
82 NICVF_DRV_STAT(rx_l4_port_errs),
83 NICVF_DRV_STAT(rx_tcp_flag_errs),
84 NICVF_DRV_STAT(rx_tcp_offset_errs),
85 NICVF_DRV_STAT(rx_l4_pclp),
86 NICVF_DRV_STAT(rx_truncated_pkts),
87
88 NICVF_DRV_STAT(tx_desc_fault),
89 NICVF_DRV_STAT(tx_hdr_cons_err),
90 NICVF_DRV_STAT(tx_subdesc_err),
91 NICVF_DRV_STAT(tx_max_size_exceeded),
92 NICVF_DRV_STAT(tx_imm_size_oflow),
93 NICVF_DRV_STAT(tx_data_seq_err),
94 NICVF_DRV_STAT(tx_mem_seq_err),
95 NICVF_DRV_STAT(tx_lock_viol),
96 NICVF_DRV_STAT(tx_data_fault),
97 NICVF_DRV_STAT(tx_tstmp_conflict),
98 NICVF_DRV_STAT(tx_tstmp_timeout),
99 NICVF_DRV_STAT(tx_mem_fault),
100 NICVF_DRV_STAT(tx_csum_overlap),
101 NICVF_DRV_STAT(tx_csum_overflow),
102
92 NICVF_DRV_STAT(rcv_buffer_alloc_failures), 103 NICVF_DRV_STAT(rcv_buffer_alloc_failures),
93 NICVF_DRV_STAT(tx_frames_ok),
94 NICVF_DRV_STAT(tx_tso), 104 NICVF_DRV_STAT(tx_tso),
95 NICVF_DRV_STAT(tx_drops),
96 NICVF_DRV_STAT(tx_timeout), 105 NICVF_DRV_STAT(tx_timeout),
97 NICVF_DRV_STAT(txq_stop), 106 NICVF_DRV_STAT(txq_stop),
98 NICVF_DRV_STAT(txq_wake), 107 NICVF_DRV_STAT(txq_wake),
@@ -278,8 +287,8 @@ static void nicvf_get_ethtool_stats(struct net_device *netdev,
278 struct ethtool_stats *stats, u64 *data) 287 struct ethtool_stats *stats, u64 *data)
279{ 288{
280 struct nicvf *nic = netdev_priv(netdev); 289 struct nicvf *nic = netdev_priv(netdev);
281 int stat; 290 int stat, tmp_stats;
282 int sqs; 291 int sqs, cpu;
283 292
284 nicvf_update_stats(nic); 293 nicvf_update_stats(nic);
285 294
@@ -289,9 +298,13 @@ static void nicvf_get_ethtool_stats(struct net_device *netdev,
289 for (stat = 0; stat < nicvf_n_hw_stats; stat++) 298 for (stat = 0; stat < nicvf_n_hw_stats; stat++)
290 *(data++) = ((u64 *)&nic->hw_stats) 299 *(data++) = ((u64 *)&nic->hw_stats)
291 [nicvf_hw_stats[stat].index]; 300 [nicvf_hw_stats[stat].index];
292 for (stat = 0; stat < nicvf_n_drv_stats; stat++) 301 for (stat = 0; stat < nicvf_n_drv_stats; stat++) {
293 *(data++) = ((u64 *)&nic->drv_stats) 302 tmp_stats = 0;
294 [nicvf_drv_stats[stat].index]; 303 for_each_possible_cpu(cpu)
304 tmp_stats += ((u64 *)per_cpu_ptr(nic->drv_stats, cpu))
305 [nicvf_drv_stats[stat].index];
306 *(data++) = tmp_stats;
307 }
295 308
296 nicvf_get_qset_stats(nic, stats, &data); 309 nicvf_get_qset_stats(nic, stats, &data);
297 310
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_main.c b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
index 45a13f718863..8a37012c9c89 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_main.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_main.c
@@ -69,25 +69,6 @@ static inline u8 nicvf_netdev_qidx(struct nicvf *nic, u8 qidx)
69 return qidx; 69 return qidx;
70} 70}
71 71
72static inline void nicvf_set_rx_frame_cnt(struct nicvf *nic,
73 struct sk_buff *skb)
74{
75 if (skb->len <= 64)
76 nic->drv_stats.rx_frames_64++;
77 else if (skb->len <= 127)
78 nic->drv_stats.rx_frames_127++;
79 else if (skb->len <= 255)
80 nic->drv_stats.rx_frames_255++;
81 else if (skb->len <= 511)
82 nic->drv_stats.rx_frames_511++;
83 else if (skb->len <= 1023)
84 nic->drv_stats.rx_frames_1023++;
85 else if (skb->len <= 1518)
86 nic->drv_stats.rx_frames_1518++;
87 else
88 nic->drv_stats.rx_frames_jumbo++;
89}
90
91/* The Cavium ThunderX network controller can *only* be found in SoCs 72/* The Cavium ThunderX network controller can *only* be found in SoCs
92 * containing the ThunderX ARM64 CPU implementation. All accesses to the device 73 * containing the ThunderX ARM64 CPU implementation. All accesses to the device
93 * registers on this platform are implicitly strongly ordered with respect 74 * registers on this platform are implicitly strongly ordered with respect
@@ -492,9 +473,6 @@ int nicvf_set_real_num_queues(struct net_device *netdev,
492static int nicvf_init_resources(struct nicvf *nic) 473static int nicvf_init_resources(struct nicvf *nic)
493{ 474{
494 int err; 475 int err;
495 union nic_mbx mbx = {};
496
497 mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
498 476
499 /* Enable Qset */ 477 /* Enable Qset */
500 nicvf_qset_config(nic, true); 478 nicvf_qset_config(nic, true);
@@ -507,14 +485,10 @@ static int nicvf_init_resources(struct nicvf *nic)
507 return err; 485 return err;
508 } 486 }
509 487
510 /* Send VF config done msg to PF */
511 nicvf_write_to_mbx(nic, &mbx);
512
513 return 0; 488 return 0;
514} 489}
515 490
516static void nicvf_snd_pkt_handler(struct net_device *netdev, 491static void nicvf_snd_pkt_handler(struct net_device *netdev,
517 struct cmp_queue *cq,
518 struct cqe_send_t *cqe_tx, 492 struct cqe_send_t *cqe_tx,
519 int cqe_type, int budget, 493 int cqe_type, int budget,
520 unsigned int *tx_pkts, unsigned int *tx_bytes) 494 unsigned int *tx_pkts, unsigned int *tx_bytes)
@@ -536,7 +510,7 @@ static void nicvf_snd_pkt_handler(struct net_device *netdev,
536 __func__, cqe_tx->sq_qs, cqe_tx->sq_idx, 510 __func__, cqe_tx->sq_qs, cqe_tx->sq_idx,
537 cqe_tx->sqe_ptr, hdr->subdesc_cnt); 511 cqe_tx->sqe_ptr, hdr->subdesc_cnt);
538 512
539 nicvf_check_cqe_tx_errs(nic, cq, cqe_tx); 513 nicvf_check_cqe_tx_errs(nic, cqe_tx);
540 skb = (struct sk_buff *)sq->skbuff[cqe_tx->sqe_ptr]; 514 skb = (struct sk_buff *)sq->skbuff[cqe_tx->sqe_ptr];
541 if (skb) { 515 if (skb) {
542 /* Check for dummy descriptor used for HW TSO offload on 88xx */ 516 /* Check for dummy descriptor used for HW TSO offload on 88xx */
@@ -630,8 +604,6 @@ static void nicvf_rcv_pkt_handler(struct net_device *netdev,
630 return; 604 return;
631 } 605 }
632 606
633 nicvf_set_rx_frame_cnt(nic, skb);
634
635 nicvf_set_rxhash(netdev, cqe_rx, skb); 607 nicvf_set_rxhash(netdev, cqe_rx, skb);
636 608
637 skb_record_rx_queue(skb, rq_idx); 609 skb_record_rx_queue(skb, rq_idx);
@@ -703,7 +675,7 @@ loop:
703 work_done++; 675 work_done++;
704 break; 676 break;
705 case CQE_TYPE_SEND: 677 case CQE_TYPE_SEND:
706 nicvf_snd_pkt_handler(netdev, cq, 678 nicvf_snd_pkt_handler(netdev,
707 (void *)cq_desc, CQE_TYPE_SEND, 679 (void *)cq_desc, CQE_TYPE_SEND,
708 budget, &tx_pkts, &tx_bytes); 680 budget, &tx_pkts, &tx_bytes);
709 tx_done++; 681 tx_done++;
@@ -740,7 +712,7 @@ done:
740 nic = nic->pnicvf; 712 nic = nic->pnicvf;
741 if (netif_tx_queue_stopped(txq) && netif_carrier_ok(netdev)) { 713 if (netif_tx_queue_stopped(txq) && netif_carrier_ok(netdev)) {
742 netif_tx_start_queue(txq); 714 netif_tx_start_queue(txq);
743 nic->drv_stats.txq_wake++; 715 this_cpu_inc(nic->drv_stats->txq_wake);
744 if (netif_msg_tx_err(nic)) 716 if (netif_msg_tx_err(nic))
745 netdev_warn(netdev, 717 netdev_warn(netdev,
746 "%s: Transmit queue wakeup SQ%d\n", 718 "%s: Transmit queue wakeup SQ%d\n",
@@ -1084,7 +1056,7 @@ static netdev_tx_t nicvf_xmit(struct sk_buff *skb, struct net_device *netdev)
1084 1056
1085 if (!netif_tx_queue_stopped(txq) && !nicvf_sq_append_skb(nic, skb)) { 1057 if (!netif_tx_queue_stopped(txq) && !nicvf_sq_append_skb(nic, skb)) {
1086 netif_tx_stop_queue(txq); 1058 netif_tx_stop_queue(txq);
1087 nic->drv_stats.txq_stop++; 1059 this_cpu_inc(nic->drv_stats->txq_stop);
1088 if (netif_msg_tx_err(nic)) 1060 if (netif_msg_tx_err(nic))
1089 netdev_warn(netdev, 1061 netdev_warn(netdev,
1090 "%s: Transmit ring full, stopping SQ%d\n", 1062 "%s: Transmit ring full, stopping SQ%d\n",
@@ -1189,14 +1161,24 @@ int nicvf_stop(struct net_device *netdev)
1189 return 0; 1161 return 0;
1190} 1162}
1191 1163
1164static int nicvf_update_hw_max_frs(struct nicvf *nic, int mtu)
1165{
1166 union nic_mbx mbx = {};
1167
1168 mbx.frs.msg = NIC_MBOX_MSG_SET_MAX_FRS;
1169 mbx.frs.max_frs = mtu;
1170 mbx.frs.vf_id = nic->vf_id;
1171
1172 return nicvf_send_msg_to_pf(nic, &mbx);
1173}
1174
1192int nicvf_open(struct net_device *netdev) 1175int nicvf_open(struct net_device *netdev)
1193{ 1176{
1194 int err, qidx; 1177 int cpu, err, qidx;
1195 struct nicvf *nic = netdev_priv(netdev); 1178 struct nicvf *nic = netdev_priv(netdev);
1196 struct queue_set *qs = nic->qs; 1179 struct queue_set *qs = nic->qs;
1197 struct nicvf_cq_poll *cq_poll = NULL; 1180 struct nicvf_cq_poll *cq_poll = NULL;
1198 1181 union nic_mbx mbx = {};
1199 nic->mtu = netdev->mtu;
1200 1182
1201 netif_carrier_off(netdev); 1183 netif_carrier_off(netdev);
1202 1184
@@ -1248,9 +1230,17 @@ int nicvf_open(struct net_device *netdev)
1248 if (nic->sqs_mode) 1230 if (nic->sqs_mode)
1249 nicvf_get_primary_vf_struct(nic); 1231 nicvf_get_primary_vf_struct(nic);
1250 1232
1251 /* Configure receive side scaling */ 1233 /* Configure receive side scaling and MTU */
1252 if (!nic->sqs_mode) 1234 if (!nic->sqs_mode) {
1253 nicvf_rss_init(nic); 1235 nicvf_rss_init(nic);
1236 if (nicvf_update_hw_max_frs(nic, netdev->mtu))
1237 goto cleanup;
1238
1239 /* Clear percpu stats */
1240 for_each_possible_cpu(cpu)
1241 memset(per_cpu_ptr(nic->drv_stats, cpu), 0,
1242 sizeof(struct nicvf_drv_stats));
1243 }
1254 1244
1255 err = nicvf_register_interrupts(nic); 1245 err = nicvf_register_interrupts(nic);
1256 if (err) 1246 if (err)
@@ -1276,8 +1266,9 @@ int nicvf_open(struct net_device *netdev)
1276 for (qidx = 0; qidx < qs->rbdr_cnt; qidx++) 1266 for (qidx = 0; qidx < qs->rbdr_cnt; qidx++)
1277 nicvf_enable_intr(nic, NICVF_INTR_RBDR, qidx); 1267 nicvf_enable_intr(nic, NICVF_INTR_RBDR, qidx);
1278 1268
1279 nic->drv_stats.txq_stop = 0; 1269 /* Send VF config done msg to PF */
1280 nic->drv_stats.txq_wake = 0; 1270 mbx.msg.msg = NIC_MBOX_MSG_CFG_DONE;
1271 nicvf_write_to_mbx(nic, &mbx);
1281 1272
1282 return 0; 1273 return 0;
1283cleanup: 1274cleanup:
@@ -1297,17 +1288,6 @@ napi_del:
1297 return err; 1288 return err;
1298} 1289}
1299 1290
1300static int nicvf_update_hw_max_frs(struct nicvf *nic, int mtu)
1301{
1302 union nic_mbx mbx = {};
1303
1304 mbx.frs.msg = NIC_MBOX_MSG_SET_MAX_FRS;
1305 mbx.frs.max_frs = mtu;
1306 mbx.frs.vf_id = nic->vf_id;
1307
1308 return nicvf_send_msg_to_pf(nic, &mbx);
1309}
1310
1311static int nicvf_change_mtu(struct net_device *netdev, int new_mtu) 1291static int nicvf_change_mtu(struct net_device *netdev, int new_mtu)
1312{ 1292{
1313 struct nicvf *nic = netdev_priv(netdev); 1293 struct nicvf *nic = netdev_priv(netdev);
@@ -1318,10 +1298,13 @@ static int nicvf_change_mtu(struct net_device *netdev, int new_mtu)
1318 if (new_mtu < NIC_HW_MIN_FRS) 1298 if (new_mtu < NIC_HW_MIN_FRS)
1319 return -EINVAL; 1299 return -EINVAL;
1320 1300
1301 netdev->mtu = new_mtu;
1302
1303 if (!netif_running(netdev))
1304 return 0;
1305
1321 if (nicvf_update_hw_max_frs(nic, new_mtu)) 1306 if (nicvf_update_hw_max_frs(nic, new_mtu))
1322 return -EINVAL; 1307 return -EINVAL;
1323 netdev->mtu = new_mtu;
1324 nic->mtu = new_mtu;
1325 1308
1326 return 0; 1309 return 0;
1327} 1310}
@@ -1379,9 +1362,10 @@ void nicvf_update_lmac_stats(struct nicvf *nic)
1379 1362
1380void nicvf_update_stats(struct nicvf *nic) 1363void nicvf_update_stats(struct nicvf *nic)
1381{ 1364{
1382 int qidx; 1365 int qidx, cpu;
1366 u64 tmp_stats = 0;
1383 struct nicvf_hw_stats *stats = &nic->hw_stats; 1367 struct nicvf_hw_stats *stats = &nic->hw_stats;
1384 struct nicvf_drv_stats *drv_stats = &nic->drv_stats; 1368 struct nicvf_drv_stats *drv_stats;
1385 struct queue_set *qs = nic->qs; 1369 struct queue_set *qs = nic->qs;
1386 1370
1387#define GET_RX_STATS(reg) \ 1371#define GET_RX_STATS(reg) \
@@ -1404,21 +1388,33 @@ void nicvf_update_stats(struct nicvf *nic)
1404 stats->rx_drop_l3_bcast = GET_RX_STATS(RX_DRP_L3BCAST); 1388 stats->rx_drop_l3_bcast = GET_RX_STATS(RX_DRP_L3BCAST);
1405 stats->rx_drop_l3_mcast = GET_RX_STATS(RX_DRP_L3MCAST); 1389 stats->rx_drop_l3_mcast = GET_RX_STATS(RX_DRP_L3MCAST);
1406 1390
1407 stats->tx_bytes_ok = GET_TX_STATS(TX_OCTS); 1391 stats->tx_bytes = GET_TX_STATS(TX_OCTS);
1408 stats->tx_ucast_frames_ok = GET_TX_STATS(TX_UCAST); 1392 stats->tx_ucast_frames = GET_TX_STATS(TX_UCAST);
1409 stats->tx_bcast_frames_ok = GET_TX_STATS(TX_BCAST); 1393 stats->tx_bcast_frames = GET_TX_STATS(TX_BCAST);
1410 stats->tx_mcast_frames_ok = GET_TX_STATS(TX_MCAST); 1394 stats->tx_mcast_frames = GET_TX_STATS(TX_MCAST);
1411 stats->tx_drops = GET_TX_STATS(TX_DROP); 1395 stats->tx_drops = GET_TX_STATS(TX_DROP);
1412 1396
1413 drv_stats->tx_frames_ok = stats->tx_ucast_frames_ok + 1397 /* On T88 pass 2.0, the dummy SQE added for TSO notification
1414 stats->tx_bcast_frames_ok + 1398 * via CQE has 'dont_send' set. Hence HW drops the pkt pointed
1415 stats->tx_mcast_frames_ok; 1399 * pointed by dummy SQE and results in tx_drops counter being
1416 drv_stats->rx_frames_ok = stats->rx_ucast_frames + 1400 * incremented. Subtracting it from tx_tso counter will give
1417 stats->rx_bcast_frames + 1401 * exact tx_drops counter.
1418 stats->rx_mcast_frames; 1402 */
1419 drv_stats->rx_drops = stats->rx_drop_red + 1403 if (nic->t88 && nic->hw_tso) {
1420 stats->rx_drop_overrun; 1404 for_each_possible_cpu(cpu) {
1421 drv_stats->tx_drops = stats->tx_drops; 1405 drv_stats = per_cpu_ptr(nic->drv_stats, cpu);
1406 tmp_stats += drv_stats->tx_tso;
1407 }
1408 stats->tx_drops = tmp_stats - stats->tx_drops;
1409 }
1410 stats->tx_frames = stats->tx_ucast_frames +
1411 stats->tx_bcast_frames +
1412 stats->tx_mcast_frames;
1413 stats->rx_frames = stats->rx_ucast_frames +
1414 stats->rx_bcast_frames +
1415 stats->rx_mcast_frames;
1416 stats->rx_drops = stats->rx_drop_red +
1417 stats->rx_drop_overrun;
1422 1418
1423 /* Update RQ and SQ stats */ 1419 /* Update RQ and SQ stats */
1424 for (qidx = 0; qidx < qs->rq_cnt; qidx++) 1420 for (qidx = 0; qidx < qs->rq_cnt; qidx++)
@@ -1432,18 +1428,17 @@ static struct rtnl_link_stats64 *nicvf_get_stats64(struct net_device *netdev,
1432{ 1428{
1433 struct nicvf *nic = netdev_priv(netdev); 1429 struct nicvf *nic = netdev_priv(netdev);
1434 struct nicvf_hw_stats *hw_stats = &nic->hw_stats; 1430 struct nicvf_hw_stats *hw_stats = &nic->hw_stats;
1435 struct nicvf_drv_stats *drv_stats = &nic->drv_stats;
1436 1431
1437 nicvf_update_stats(nic); 1432 nicvf_update_stats(nic);
1438 1433
1439 stats->rx_bytes = hw_stats->rx_bytes; 1434 stats->rx_bytes = hw_stats->rx_bytes;
1440 stats->rx_packets = drv_stats->rx_frames_ok; 1435 stats->rx_packets = hw_stats->rx_frames;
1441 stats->rx_dropped = drv_stats->rx_drops; 1436 stats->rx_dropped = hw_stats->rx_drops;
1442 stats->multicast = hw_stats->rx_mcast_frames; 1437 stats->multicast = hw_stats->rx_mcast_frames;
1443 1438
1444 stats->tx_bytes = hw_stats->tx_bytes_ok; 1439 stats->tx_bytes = hw_stats->tx_bytes;
1445 stats->tx_packets = drv_stats->tx_frames_ok; 1440 stats->tx_packets = hw_stats->tx_frames;
1446 stats->tx_dropped = drv_stats->tx_drops; 1441 stats->tx_dropped = hw_stats->tx_drops;
1447 1442
1448 return stats; 1443 return stats;
1449} 1444}
@@ -1456,7 +1451,7 @@ static void nicvf_tx_timeout(struct net_device *dev)
1456 netdev_warn(dev, "%s: Transmit timed out, resetting\n", 1451 netdev_warn(dev, "%s: Transmit timed out, resetting\n",
1457 dev->name); 1452 dev->name);
1458 1453
1459 nic->drv_stats.tx_timeout++; 1454 this_cpu_inc(nic->drv_stats->tx_timeout);
1460 schedule_work(&nic->reset_task); 1455 schedule_work(&nic->reset_task);
1461} 1456}
1462 1457
@@ -1590,6 +1585,12 @@ static int nicvf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1590 goto err_free_netdev; 1585 goto err_free_netdev;
1591 } 1586 }
1592 1587
1588 nic->drv_stats = netdev_alloc_pcpu_stats(struct nicvf_drv_stats);
1589 if (!nic->drv_stats) {
1590 err = -ENOMEM;
1591 goto err_free_netdev;
1592 }
1593
1593 err = nicvf_set_qset_resources(nic); 1594 err = nicvf_set_qset_resources(nic);
1594 if (err) 1595 if (err)
1595 goto err_free_netdev; 1596 goto err_free_netdev;
@@ -1648,6 +1649,8 @@ err_unregister_interrupts:
1648 nicvf_unregister_interrupts(nic); 1649 nicvf_unregister_interrupts(nic);
1649err_free_netdev: 1650err_free_netdev:
1650 pci_set_drvdata(pdev, NULL); 1651 pci_set_drvdata(pdev, NULL);
1652 if (nic->drv_stats)
1653 free_percpu(nic->drv_stats);
1651 free_netdev(netdev); 1654 free_netdev(netdev);
1652err_release_regions: 1655err_release_regions:
1653 pci_release_regions(pdev); 1656 pci_release_regions(pdev);
@@ -1675,6 +1678,8 @@ static void nicvf_remove(struct pci_dev *pdev)
1675 unregister_netdev(pnetdev); 1678 unregister_netdev(pnetdev);
1676 nicvf_unregister_interrupts(nic); 1679 nicvf_unregister_interrupts(nic);
1677 pci_set_drvdata(pdev, NULL); 1680 pci_set_drvdata(pdev, NULL);
1681 if (nic->drv_stats)
1682 free_percpu(nic->drv_stats);
1678 free_netdev(netdev); 1683 free_netdev(netdev);
1679 pci_release_regions(pdev); 1684 pci_release_regions(pdev);
1680 pci_disable_device(pdev); 1685 pci_disable_device(pdev);
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
index a4fc50155881..747ef0882976 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.c
@@ -104,7 +104,8 @@ static inline int nicvf_alloc_rcv_buffer(struct nicvf *nic, gfp_t gfp,
104 nic->rb_page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN, 104 nic->rb_page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN,
105 order); 105 order);
106 if (!nic->rb_page) { 106 if (!nic->rb_page) {
107 nic->drv_stats.rcv_buffer_alloc_failures++; 107 this_cpu_inc(nic->pnicvf->drv_stats->
108 rcv_buffer_alloc_failures);
108 return -ENOMEM; 109 return -ENOMEM;
109 } 110 }
110 nic->rb_page_offset = 0; 111 nic->rb_page_offset = 0;
@@ -270,7 +271,8 @@ refill:
270 rbdr_idx, new_rb); 271 rbdr_idx, new_rb);
271next_rbdr: 272next_rbdr:
272 /* Re-enable RBDR interrupts only if buffer allocation is success */ 273 /* Re-enable RBDR interrupts only if buffer allocation is success */
273 if (!nic->rb_alloc_fail && rbdr->enable) 274 if (!nic->rb_alloc_fail && rbdr->enable &&
275 netif_running(nic->pnicvf->netdev))
274 nicvf_enable_intr(nic, NICVF_INTR_RBDR, rbdr_idx); 276 nicvf_enable_intr(nic, NICVF_INTR_RBDR, rbdr_idx);
275 277
276 if (rbdr_idx) 278 if (rbdr_idx)
@@ -361,6 +363,8 @@ static int nicvf_init_snd_queue(struct nicvf *nic,
361 363
362static void nicvf_free_snd_queue(struct nicvf *nic, struct snd_queue *sq) 364static void nicvf_free_snd_queue(struct nicvf *nic, struct snd_queue *sq)
363{ 365{
366 struct sk_buff *skb;
367
364 if (!sq) 368 if (!sq)
365 return; 369 return;
366 if (!sq->dmem.base) 370 if (!sq->dmem.base)
@@ -371,6 +375,15 @@ static void nicvf_free_snd_queue(struct nicvf *nic, struct snd_queue *sq)
371 sq->dmem.q_len * TSO_HEADER_SIZE, 375 sq->dmem.q_len * TSO_HEADER_SIZE,
372 sq->tso_hdrs, sq->tso_hdrs_phys); 376 sq->tso_hdrs, sq->tso_hdrs_phys);
373 377
378 /* Free pending skbs in the queue */
379 smp_rmb();
380 while (sq->head != sq->tail) {
381 skb = (struct sk_buff *)sq->skbuff[sq->head];
382 if (skb)
383 dev_kfree_skb_any(skb);
384 sq->head++;
385 sq->head &= (sq->dmem.q_len - 1);
386 }
374 kfree(sq->skbuff); 387 kfree(sq->skbuff);
375 nicvf_free_q_desc_mem(nic, &sq->dmem); 388 nicvf_free_q_desc_mem(nic, &sq->dmem);
376} 389}
@@ -483,9 +496,12 @@ static void nicvf_reset_rcv_queue_stats(struct nicvf *nic)
483{ 496{
484 union nic_mbx mbx = {}; 497 union nic_mbx mbx = {};
485 498
486 /* Reset all RXQ's stats */ 499 /* Reset all RQ/SQ and VF stats */
487 mbx.reset_stat.msg = NIC_MBOX_MSG_RESET_STAT_COUNTER; 500 mbx.reset_stat.msg = NIC_MBOX_MSG_RESET_STAT_COUNTER;
501 mbx.reset_stat.rx_stat_mask = 0x3FFF;
502 mbx.reset_stat.tx_stat_mask = 0x1F;
488 mbx.reset_stat.rq_stat_mask = 0xFFFF; 503 mbx.reset_stat.rq_stat_mask = 0xFFFF;
504 mbx.reset_stat.sq_stat_mask = 0xFFFF;
489 nicvf_send_msg_to_pf(nic, &mbx); 505 nicvf_send_msg_to_pf(nic, &mbx);
490} 506}
491 507
@@ -538,9 +554,12 @@ static void nicvf_rcv_queue_config(struct nicvf *nic, struct queue_set *qs,
538 mbx.rq.cfg = (1ULL << 62) | (RQ_CQ_DROP << 8); 554 mbx.rq.cfg = (1ULL << 62) | (RQ_CQ_DROP << 8);
539 nicvf_send_msg_to_pf(nic, &mbx); 555 nicvf_send_msg_to_pf(nic, &mbx);
540 556
541 nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0, 0x00); 557 if (!nic->sqs_mode && (qidx == 0)) {
542 if (!nic->sqs_mode) 558 /* Enable checking L3/L4 length and TCP/UDP checksums */
559 nicvf_queue_reg_write(nic, NIC_QSET_RQ_GEN_CFG, 0,
560 (BIT(24) | BIT(23) | BIT(21)));
543 nicvf_config_vlan_stripping(nic, nic->netdev->features); 561 nicvf_config_vlan_stripping(nic, nic->netdev->features);
562 }
544 563
545 /* Enable Receive queue */ 564 /* Enable Receive queue */
546 memset(&rq_cfg, 0, sizeof(struct rq_cfg)); 565 memset(&rq_cfg, 0, sizeof(struct rq_cfg));
@@ -1029,7 +1048,7 @@ nicvf_sq_add_hdr_subdesc(struct nicvf *nic, struct snd_queue *sq, int qentry,
1029 hdr->tso_max_paysize = skb_shinfo(skb)->gso_size; 1048 hdr->tso_max_paysize = skb_shinfo(skb)->gso_size;
1030 /* For non-tunneled pkts, point this to L2 ethertype */ 1049 /* For non-tunneled pkts, point this to L2 ethertype */
1031 hdr->inner_l3_offset = skb_network_offset(skb) - 2; 1050 hdr->inner_l3_offset = skb_network_offset(skb) - 2;
1032 nic->drv_stats.tx_tso++; 1051 this_cpu_inc(nic->pnicvf->drv_stats->tx_tso);
1033 } 1052 }
1034} 1053}
1035 1054
@@ -1161,7 +1180,7 @@ static int nicvf_sq_append_tso(struct nicvf *nic, struct snd_queue *sq,
1161 1180
1162 nicvf_sq_doorbell(nic, skb, sq_num, desc_cnt); 1181 nicvf_sq_doorbell(nic, skb, sq_num, desc_cnt);
1163 1182
1164 nic->drv_stats.tx_tso++; 1183 this_cpu_inc(nic->pnicvf->drv_stats->tx_tso);
1165 return 1; 1184 return 1;
1166} 1185}
1167 1186
@@ -1422,8 +1441,6 @@ void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx)
1422/* Check for errors in the receive cmp.queue entry */ 1441/* Check for errors in the receive cmp.queue entry */
1423int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx) 1442int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx)
1424{ 1443{
1425 struct nicvf_hw_stats *stats = &nic->hw_stats;
1426
1427 if (!cqe_rx->err_level && !cqe_rx->err_opcode) 1444 if (!cqe_rx->err_level && !cqe_rx->err_opcode)
1428 return 0; 1445 return 0;
1429 1446
@@ -1435,76 +1452,76 @@ int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx)
1435 1452
1436 switch (cqe_rx->err_opcode) { 1453 switch (cqe_rx->err_opcode) {
1437 case CQ_RX_ERROP_RE_PARTIAL: 1454 case CQ_RX_ERROP_RE_PARTIAL:
1438 stats->rx_bgx_truncated_pkts++; 1455 this_cpu_inc(nic->drv_stats->rx_bgx_truncated_pkts);
1439 break; 1456 break;
1440 case CQ_RX_ERROP_RE_JABBER: 1457 case CQ_RX_ERROP_RE_JABBER:
1441 stats->rx_jabber_errs++; 1458 this_cpu_inc(nic->drv_stats->rx_jabber_errs);
1442 break; 1459 break;
1443 case CQ_RX_ERROP_RE_FCS: 1460 case CQ_RX_ERROP_RE_FCS:
1444 stats->rx_fcs_errs++; 1461 this_cpu_inc(nic->drv_stats->rx_fcs_errs);
1445 break; 1462 break;
1446 case CQ_RX_ERROP_RE_RX_CTL: 1463 case CQ_RX_ERROP_RE_RX_CTL:
1447 stats->rx_bgx_errs++; 1464 this_cpu_inc(nic->drv_stats->rx_bgx_errs);
1448 break; 1465 break;
1449 case CQ_RX_ERROP_PREL2_ERR: 1466 case CQ_RX_ERROP_PREL2_ERR:
1450 stats->rx_prel2_errs++; 1467 this_cpu_inc(nic->drv_stats->rx_prel2_errs);
1451 break; 1468 break;
1452 case CQ_RX_ERROP_L2_MAL: 1469 case CQ_RX_ERROP_L2_MAL:
1453 stats->rx_l2_hdr_malformed++; 1470 this_cpu_inc(nic->drv_stats->rx_l2_hdr_malformed);
1454 break; 1471 break;
1455 case CQ_RX_ERROP_L2_OVERSIZE: 1472 case CQ_RX_ERROP_L2_OVERSIZE:
1456 stats->rx_oversize++; 1473 this_cpu_inc(nic->drv_stats->rx_oversize);
1457 break; 1474 break;
1458 case CQ_RX_ERROP_L2_UNDERSIZE: 1475 case CQ_RX_ERROP_L2_UNDERSIZE:
1459 stats->rx_undersize++; 1476 this_cpu_inc(nic->drv_stats->rx_undersize);
1460 break; 1477 break;
1461 case CQ_RX_ERROP_L2_LENMISM: 1478 case CQ_RX_ERROP_L2_LENMISM:
1462 stats->rx_l2_len_mismatch++; 1479 this_cpu_inc(nic->drv_stats->rx_l2_len_mismatch);
1463 break; 1480 break;
1464 case CQ_RX_ERROP_L2_PCLP: 1481 case CQ_RX_ERROP_L2_PCLP:
1465 stats->rx_l2_pclp++; 1482 this_cpu_inc(nic->drv_stats->rx_l2_pclp);
1466 break; 1483 break;
1467 case CQ_RX_ERROP_IP_NOT: 1484 case CQ_RX_ERROP_IP_NOT:
1468 stats->rx_ip_ver_errs++; 1485 this_cpu_inc(nic->drv_stats->rx_ip_ver_errs);
1469 break; 1486 break;
1470 case CQ_RX_ERROP_IP_CSUM_ERR: 1487 case CQ_RX_ERROP_IP_CSUM_ERR:
1471 stats->rx_ip_csum_errs++; 1488 this_cpu_inc(nic->drv_stats->rx_ip_csum_errs);
1472 break; 1489 break;
1473 case CQ_RX_ERROP_IP_MAL: 1490 case CQ_RX_ERROP_IP_MAL:
1474 stats->rx_ip_hdr_malformed++; 1491 this_cpu_inc(nic->drv_stats->rx_ip_hdr_malformed);
1475 break; 1492 break;
1476 case CQ_RX_ERROP_IP_MALD: 1493 case CQ_RX_ERROP_IP_MALD:
1477 stats->rx_ip_payload_malformed++; 1494 this_cpu_inc(nic->drv_stats->rx_ip_payload_malformed);
1478 break; 1495 break;
1479 case CQ_RX_ERROP_IP_HOP: 1496 case CQ_RX_ERROP_IP_HOP:
1480 stats->rx_ip_ttl_errs++; 1497 this_cpu_inc(nic->drv_stats->rx_ip_ttl_errs);
1481 break; 1498 break;
1482 case CQ_RX_ERROP_L3_PCLP: 1499 case CQ_RX_ERROP_L3_PCLP:
1483 stats->rx_l3_pclp++; 1500 this_cpu_inc(nic->drv_stats->rx_l3_pclp);
1484 break; 1501 break;
1485 case CQ_RX_ERROP_L4_MAL: 1502 case CQ_RX_ERROP_L4_MAL:
1486 stats->rx_l4_malformed++; 1503 this_cpu_inc(nic->drv_stats->rx_l4_malformed);
1487 break; 1504 break;
1488 case CQ_RX_ERROP_L4_CHK: 1505 case CQ_RX_ERROP_L4_CHK:
1489 stats->rx_l4_csum_errs++; 1506 this_cpu_inc(nic->drv_stats->rx_l4_csum_errs);
1490 break; 1507 break;
1491 case CQ_RX_ERROP_UDP_LEN: 1508 case CQ_RX_ERROP_UDP_LEN:
1492 stats->rx_udp_len_errs++; 1509 this_cpu_inc(nic->drv_stats->rx_udp_len_errs);
1493 break; 1510 break;
1494 case CQ_RX_ERROP_L4_PORT: 1511 case CQ_RX_ERROP_L4_PORT:
1495 stats->rx_l4_port_errs++; 1512 this_cpu_inc(nic->drv_stats->rx_l4_port_errs);
1496 break; 1513 break;
1497 case CQ_RX_ERROP_TCP_FLAG: 1514 case CQ_RX_ERROP_TCP_FLAG:
1498 stats->rx_tcp_flag_errs++; 1515 this_cpu_inc(nic->drv_stats->rx_tcp_flag_errs);
1499 break; 1516 break;
1500 case CQ_RX_ERROP_TCP_OFFSET: 1517 case CQ_RX_ERROP_TCP_OFFSET:
1501 stats->rx_tcp_offset_errs++; 1518 this_cpu_inc(nic->drv_stats->rx_tcp_offset_errs);
1502 break; 1519 break;
1503 case CQ_RX_ERROP_L4_PCLP: 1520 case CQ_RX_ERROP_L4_PCLP:
1504 stats->rx_l4_pclp++; 1521 this_cpu_inc(nic->drv_stats->rx_l4_pclp);
1505 break; 1522 break;
1506 case CQ_RX_ERROP_RBDR_TRUNC: 1523 case CQ_RX_ERROP_RBDR_TRUNC:
1507 stats->rx_truncated_pkts++; 1524 this_cpu_inc(nic->drv_stats->rx_truncated_pkts);
1508 break; 1525 break;
1509 } 1526 }
1510 1527
@@ -1512,53 +1529,52 @@ int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx)
1512} 1529}
1513 1530
1514/* Check for errors in the send cmp.queue entry */ 1531/* Check for errors in the send cmp.queue entry */
1515int nicvf_check_cqe_tx_errs(struct nicvf *nic, 1532int nicvf_check_cqe_tx_errs(struct nicvf *nic, struct cqe_send_t *cqe_tx)
1516 struct cmp_queue *cq, struct cqe_send_t *cqe_tx)
1517{ 1533{
1518 struct cmp_queue_stats *stats = &cq->stats;
1519
1520 switch (cqe_tx->send_status) { 1534 switch (cqe_tx->send_status) {
1521 case CQ_TX_ERROP_GOOD: 1535 case CQ_TX_ERROP_GOOD:
1522 stats->tx.good++;
1523 return 0; 1536 return 0;
1524 case CQ_TX_ERROP_DESC_FAULT: 1537 case CQ_TX_ERROP_DESC_FAULT:
1525 stats->tx.desc_fault++; 1538 this_cpu_inc(nic->drv_stats->tx_desc_fault);
1526 break; 1539 break;
1527 case CQ_TX_ERROP_HDR_CONS_ERR: 1540 case CQ_TX_ERROP_HDR_CONS_ERR:
1528 stats->tx.hdr_cons_err++; 1541 this_cpu_inc(nic->drv_stats->tx_hdr_cons_err);
1529 break; 1542 break;
1530 case CQ_TX_ERROP_SUBDC_ERR: 1543 case CQ_TX_ERROP_SUBDC_ERR:
1531 stats->tx.subdesc_err++; 1544 this_cpu_inc(nic->drv_stats->tx_subdesc_err);
1545 break;
1546 case CQ_TX_ERROP_MAX_SIZE_VIOL:
1547 this_cpu_inc(nic->drv_stats->tx_max_size_exceeded);
1532 break; 1548 break;
1533 case CQ_TX_ERROP_IMM_SIZE_OFLOW: 1549 case CQ_TX_ERROP_IMM_SIZE_OFLOW:
1534 stats->tx.imm_size_oflow++; 1550 this_cpu_inc(nic->drv_stats->tx_imm_size_oflow);
1535 break; 1551 break;
1536 case CQ_TX_ERROP_DATA_SEQUENCE_ERR: 1552 case CQ_TX_ERROP_DATA_SEQUENCE_ERR:
1537 stats->tx.data_seq_err++; 1553 this_cpu_inc(nic->drv_stats->tx_data_seq_err);
1538 break; 1554 break;
1539 case CQ_TX_ERROP_MEM_SEQUENCE_ERR: 1555 case CQ_TX_ERROP_MEM_SEQUENCE_ERR:
1540 stats->tx.mem_seq_err++; 1556 this_cpu_inc(nic->drv_stats->tx_mem_seq_err);
1541 break; 1557 break;
1542 case CQ_TX_ERROP_LOCK_VIOL: 1558 case CQ_TX_ERROP_LOCK_VIOL:
1543 stats->tx.lock_viol++; 1559 this_cpu_inc(nic->drv_stats->tx_lock_viol);
1544 break; 1560 break;
1545 case CQ_TX_ERROP_DATA_FAULT: 1561 case CQ_TX_ERROP_DATA_FAULT:
1546 stats->tx.data_fault++; 1562 this_cpu_inc(nic->drv_stats->tx_data_fault);
1547 break; 1563 break;
1548 case CQ_TX_ERROP_TSTMP_CONFLICT: 1564 case CQ_TX_ERROP_TSTMP_CONFLICT:
1549 stats->tx.tstmp_conflict++; 1565 this_cpu_inc(nic->drv_stats->tx_tstmp_conflict);
1550 break; 1566 break;
1551 case CQ_TX_ERROP_TSTMP_TIMEOUT: 1567 case CQ_TX_ERROP_TSTMP_TIMEOUT:
1552 stats->tx.tstmp_timeout++; 1568 this_cpu_inc(nic->drv_stats->tx_tstmp_timeout);
1553 break; 1569 break;
1554 case CQ_TX_ERROP_MEM_FAULT: 1570 case CQ_TX_ERROP_MEM_FAULT:
1555 stats->tx.mem_fault++; 1571 this_cpu_inc(nic->drv_stats->tx_mem_fault);
1556 break; 1572 break;
1557 case CQ_TX_ERROP_CK_OVERLAP: 1573 case CQ_TX_ERROP_CK_OVERLAP:
1558 stats->tx.csum_overlap++; 1574 this_cpu_inc(nic->drv_stats->tx_csum_overlap);
1559 break; 1575 break;
1560 case CQ_TX_ERROP_CK_OFLOW: 1576 case CQ_TX_ERROP_CK_OFLOW:
1561 stats->tx.csum_overflow++; 1577 this_cpu_inc(nic->drv_stats->tx_csum_overflow);
1562 break; 1578 break;
1563 } 1579 }
1564 1580
diff --git a/drivers/net/ethernet/cavium/thunder/nicvf_queues.h b/drivers/net/ethernet/cavium/thunder/nicvf_queues.h
index 869f3386028b..2e3c940c1093 100644
--- a/drivers/net/ethernet/cavium/thunder/nicvf_queues.h
+++ b/drivers/net/ethernet/cavium/thunder/nicvf_queues.h
@@ -158,6 +158,7 @@ enum CQ_TX_ERROP_E {
158 CQ_TX_ERROP_DESC_FAULT = 0x10, 158 CQ_TX_ERROP_DESC_FAULT = 0x10,
159 CQ_TX_ERROP_HDR_CONS_ERR = 0x11, 159 CQ_TX_ERROP_HDR_CONS_ERR = 0x11,
160 CQ_TX_ERROP_SUBDC_ERR = 0x12, 160 CQ_TX_ERROP_SUBDC_ERR = 0x12,
161 CQ_TX_ERROP_MAX_SIZE_VIOL = 0x13,
161 CQ_TX_ERROP_IMM_SIZE_OFLOW = 0x80, 162 CQ_TX_ERROP_IMM_SIZE_OFLOW = 0x80,
162 CQ_TX_ERROP_DATA_SEQUENCE_ERR = 0x81, 163 CQ_TX_ERROP_DATA_SEQUENCE_ERR = 0x81,
163 CQ_TX_ERROP_MEM_SEQUENCE_ERR = 0x82, 164 CQ_TX_ERROP_MEM_SEQUENCE_ERR = 0x82,
@@ -171,25 +172,6 @@ enum CQ_TX_ERROP_E {
171 CQ_TX_ERROP_ENUM_LAST = 0x8a, 172 CQ_TX_ERROP_ENUM_LAST = 0x8a,
172}; 173};
173 174
174struct cmp_queue_stats {
175 struct tx_stats {
176 u64 good;
177 u64 desc_fault;
178 u64 hdr_cons_err;
179 u64 subdesc_err;
180 u64 imm_size_oflow;
181 u64 data_seq_err;
182 u64 mem_seq_err;
183 u64 lock_viol;
184 u64 data_fault;
185 u64 tstmp_conflict;
186 u64 tstmp_timeout;
187 u64 mem_fault;
188 u64 csum_overlap;
189 u64 csum_overflow;
190 } tx;
191} ____cacheline_aligned_in_smp;
192
193enum RQ_SQ_STATS { 175enum RQ_SQ_STATS {
194 RQ_SQ_STATS_OCTS, 176 RQ_SQ_STATS_OCTS,
195 RQ_SQ_STATS_PKTS, 177 RQ_SQ_STATS_PKTS,
@@ -241,7 +223,6 @@ struct cmp_queue {
241 spinlock_t lock; /* lock to serialize processing CQEs */ 223 spinlock_t lock; /* lock to serialize processing CQEs */
242 void *desc; 224 void *desc;
243 struct q_desc_mem dmem; 225 struct q_desc_mem dmem;
244 struct cmp_queue_stats stats;
245 int irq; 226 int irq;
246} ____cacheline_aligned_in_smp; 227} ____cacheline_aligned_in_smp;
247 228
@@ -336,6 +317,5 @@ u64 nicvf_queue_reg_read(struct nicvf *nic,
336void nicvf_update_rq_stats(struct nicvf *nic, int rq_idx); 317void nicvf_update_rq_stats(struct nicvf *nic, int rq_idx);
337void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx); 318void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx);
338int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx); 319int nicvf_check_cqe_rx_errs(struct nicvf *nic, struct cqe_rx_t *cqe_rx);
339int nicvf_check_cqe_tx_errs(struct nicvf *nic, 320int nicvf_check_cqe_tx_errs(struct nicvf *nic, struct cqe_send_t *cqe_tx);
340 struct cmp_queue *cq, struct cqe_send_t *cqe_tx);
341#endif /* NICVF_QUEUES_H */ 321#endif /* NICVF_QUEUES_H */
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
index 8bbaedbb7b94..050e21fbb147 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.c
@@ -1242,8 +1242,8 @@ static int bgx_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1242 1242
1243 pci_read_config_word(pdev, PCI_DEVICE_ID, &sdevid); 1243 pci_read_config_word(pdev, PCI_DEVICE_ID, &sdevid);
1244 if (sdevid != PCI_DEVICE_ID_THUNDER_RGX) { 1244 if (sdevid != PCI_DEVICE_ID_THUNDER_RGX) {
1245 bgx->bgx_id = 1245 bgx->bgx_id = (pci_resource_start(pdev,
1246 (pci_resource_start(pdev, PCI_CFG_REG_BAR_NUM) >> 24) & 1; 1246 PCI_CFG_REG_BAR_NUM) >> 24) & BGX_ID_MASK;
1247 bgx->bgx_id += nic_get_node_id(pdev) * MAX_BGX_PER_NODE; 1247 bgx->bgx_id += nic_get_node_id(pdev) * MAX_BGX_PER_NODE;
1248 bgx->max_lmac = MAX_LMAC_PER_BGX; 1248 bgx->max_lmac = MAX_LMAC_PER_BGX;
1249 bgx_vnic[bgx->bgx_id] = bgx; 1249 bgx_vnic[bgx->bgx_id] = bgx;
diff --git a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
index d59c71e4a000..01cc7c859131 100644
--- a/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
+++ b/drivers/net/ethernet/cavium/thunder/thunder_bgx.h
@@ -28,6 +28,8 @@
28#define MAX_DMAC_PER_LMAC 8 28#define MAX_DMAC_PER_LMAC 8
29#define MAX_FRAME_SIZE 9216 29#define MAX_FRAME_SIZE 9216
30 30
31#define BGX_ID_MASK 0x3
32
31#define MAX_DMAC_PER_LMAC_TNS_BYPASS_MODE 2 33#define MAX_DMAC_PER_LMAC_TNS_BYPASS_MODE 2
32 34
33/* Registers */ 35/* Registers */
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 57eb4e1345cb..19dc9e25aa72 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -4931,6 +4931,7 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
4931 */ 4931 */
4932 for_each_port(adapter, i) { 4932 for_each_port(adapter, i) {
4933 pi = adap2pinfo(adapter, i); 4933 pi = adap2pinfo(adapter, i);
4934 adapter->port[i]->dev_port = pi->lport;
4934 netif_set_real_num_tx_queues(adapter->port[i], pi->nqsets); 4935 netif_set_real_num_tx_queues(adapter->port[i], pi->nqsets);
4935 netif_set_real_num_rx_queues(adapter->port[i], pi->nqsets); 4936 netif_set_real_num_rx_queues(adapter->port[i], pi->nqsets);
4936 4937
diff --git a/drivers/net/ethernet/chelsio/cxgb4/sge.c b/drivers/net/ethernet/chelsio/cxgb4/sge.c
index 1e74fd6085df..e19a0ca8e5dd 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/sge.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/sge.c
@@ -2951,7 +2951,6 @@ void free_rspq_fl(struct adapter *adap, struct sge_rspq *rq,
2951 rq->cntxt_id, fl_id, 0xffff); 2951 rq->cntxt_id, fl_id, 0xffff);
2952 dma_free_coherent(adap->pdev_dev, (rq->size + 1) * rq->iqe_len, 2952 dma_free_coherent(adap->pdev_dev, (rq->size + 1) * rq->iqe_len,
2953 rq->desc, rq->phys_addr); 2953 rq->desc, rq->phys_addr);
2954 napi_hash_del(&rq->napi);
2955 netif_napi_del(&rq->napi); 2954 netif_napi_del(&rq->napi);
2956 rq->netdev = NULL; 2955 rq->netdev = NULL;
2957 rq->cntxt_id = rq->abs_id = 0; 2956 rq->cntxt_id = rq->abs_id = 0;
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
index 20dec85da63d..e8139514d32c 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
@@ -7851,7 +7851,6 @@ int t4_port_init(struct adapter *adap, int mbox, int pf, int vf)
7851 return ret; 7851 return ret;
7852 7852
7853 memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN); 7853 memcpy(adap->port[i]->dev_addr, addr, ETH_ALEN);
7854 adap->port[i]->dev_port = j;
7855 j++; 7854 j++;
7856 } 7855 }
7857 return 0; 7856 return 0;
diff --git a/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h b/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h
index 50812a1d67bd..ecf3ccc257bc 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h
+++ b/drivers/net/ethernet/chelsio/cxgb4/t4_pci_id_tbl.h
@@ -168,6 +168,7 @@ CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN
168 CH_PCI_ID_TABLE_FENTRY(0x509a), /* Custom T520-CR */ 168 CH_PCI_ID_TABLE_FENTRY(0x509a), /* Custom T520-CR */
169 CH_PCI_ID_TABLE_FENTRY(0x509b), /* Custom T540-CR LOM */ 169 CH_PCI_ID_TABLE_FENTRY(0x509b), /* Custom T540-CR LOM */
170 CH_PCI_ID_TABLE_FENTRY(0x509c), /* Custom T520-CR*/ 170 CH_PCI_ID_TABLE_FENTRY(0x509c), /* Custom T520-CR*/
171 CH_PCI_ID_TABLE_FENTRY(0x509d), /* Custom T540-CR*/
171 172
172 /* T6 adapters: 173 /* T6 adapters:
173 */ 174 */
@@ -178,9 +179,9 @@ CH_PCI_DEVICE_ID_TABLE_DEFINE_BEGIN
178 CH_PCI_ID_TABLE_FENTRY(0x6005), 179 CH_PCI_ID_TABLE_FENTRY(0x6005),
179 CH_PCI_ID_TABLE_FENTRY(0x6006), 180 CH_PCI_ID_TABLE_FENTRY(0x6006),
180 CH_PCI_ID_TABLE_FENTRY(0x6007), 181 CH_PCI_ID_TABLE_FENTRY(0x6007),
182 CH_PCI_ID_TABLE_FENTRY(0x6008),
181 CH_PCI_ID_TABLE_FENTRY(0x6009), 183 CH_PCI_ID_TABLE_FENTRY(0x6009),
182 CH_PCI_ID_TABLE_FENTRY(0x600d), 184 CH_PCI_ID_TABLE_FENTRY(0x600d),
183 CH_PCI_ID_TABLE_FENTRY(0x6010),
184 CH_PCI_ID_TABLE_FENTRY(0x6011), 185 CH_PCI_ID_TABLE_FENTRY(0x6011),
185 CH_PCI_ID_TABLE_FENTRY(0x6014), 186 CH_PCI_ID_TABLE_FENTRY(0x6014),
186 CH_PCI_ID_TABLE_FENTRY(0x6015), 187 CH_PCI_ID_TABLE_FENTRY(0x6015),
diff --git a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
index 100b2cc064a3..a37481c04a87 100644
--- a/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
@@ -2969,6 +2969,7 @@ static int cxgb4vf_pci_probe(struct pci_dev *pdev,
2969 2969
2970 netdev->netdev_ops = &cxgb4vf_netdev_ops; 2970 netdev->netdev_ops = &cxgb4vf_netdev_ops;
2971 netdev->ethtool_ops = &cxgb4vf_ethtool_ops; 2971 netdev->ethtool_ops = &cxgb4vf_ethtool_ops;
2972 netdev->dev_port = pi->port_id;
2972 2973
2973 /* 2974 /*
2974 * Initialize the hardware/software state for the port. 2975 * Initialize the hardware/software state for the port.
diff --git a/drivers/net/ethernet/cirrus/ep93xx_eth.c b/drivers/net/ethernet/cirrus/ep93xx_eth.c
index de9f7c97d916..9a161e981529 100644
--- a/drivers/net/ethernet/cirrus/ep93xx_eth.c
+++ b/drivers/net/ethernet/cirrus/ep93xx_eth.c
@@ -468,6 +468,9 @@ static void ep93xx_free_buffers(struct ep93xx_priv *ep)
468 struct device *dev = ep->dev->dev.parent; 468 struct device *dev = ep->dev->dev.parent;
469 int i; 469 int i;
470 470
471 if (!ep->descs)
472 return;
473
471 for (i = 0; i < RX_QUEUE_ENTRIES; i++) { 474 for (i = 0; i < RX_QUEUE_ENTRIES; i++) {
472 dma_addr_t d; 475 dma_addr_t d;
473 476
@@ -490,6 +493,7 @@ static void ep93xx_free_buffers(struct ep93xx_priv *ep)
490 493
491 dma_free_coherent(dev, sizeof(struct ep93xx_descs), ep->descs, 494 dma_free_coherent(dev, sizeof(struct ep93xx_descs), ep->descs,
492 ep->descs_dma_addr); 495 ep->descs_dma_addr);
496 ep->descs = NULL;
493} 497}
494 498
495static int ep93xx_alloc_buffers(struct ep93xx_priv *ep) 499static int ep93xx_alloc_buffers(struct ep93xx_priv *ep)
diff --git a/drivers/net/ethernet/emulex/benet/be_cmds.c b/drivers/net/ethernet/emulex/benet/be_cmds.c
index 1fb5d7239254..0e74529a4209 100644
--- a/drivers/net/ethernet/emulex/benet/be_cmds.c
+++ b/drivers/net/ethernet/emulex/benet/be_cmds.c
@@ -90,7 +90,8 @@ static struct be_cmd_priv_map cmd_priv_map[] = {
90 { 90 {
91 OPCODE_COMMON_SET_HSW_CONFIG, 91 OPCODE_COMMON_SET_HSW_CONFIG,
92 CMD_SUBSYSTEM_COMMON, 92 CMD_SUBSYSTEM_COMMON,
93 BE_PRIV_DEVCFG | BE_PRIV_VHADM 93 BE_PRIV_DEVCFG | BE_PRIV_VHADM |
94 BE_PRIV_DEVSEC
94 }, 95 },
95 { 96 {
96 OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES, 97 OPCODE_COMMON_GET_EXT_FAT_CAPABILITIES,
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c
index cece8a08edca..93aa2939142a 100644
--- a/drivers/net/ethernet/emulex/benet/be_main.c
+++ b/drivers/net/ethernet/emulex/benet/be_main.c
@@ -2813,7 +2813,6 @@ static void be_evt_queues_destroy(struct be_adapter *adapter)
2813 if (eqo->q.created) { 2813 if (eqo->q.created) {
2814 be_eq_clean(eqo); 2814 be_eq_clean(eqo);
2815 be_cmd_q_destroy(adapter, &eqo->q, QTYPE_EQ); 2815 be_cmd_q_destroy(adapter, &eqo->q, QTYPE_EQ);
2816 napi_hash_del(&eqo->napi);
2817 netif_napi_del(&eqo->napi); 2816 netif_napi_del(&eqo->napi);
2818 free_cpumask_var(eqo->affinity_mask); 2817 free_cpumask_var(eqo->affinity_mask);
2819 } 2818 }
diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h
index c865135f3cb9..5ea740b4cf14 100644
--- a/drivers/net/ethernet/freescale/fec.h
+++ b/drivers/net/ethernet/freescale/fec.h
@@ -574,6 +574,8 @@ struct fec_enet_private {
574 unsigned int reload_period; 574 unsigned int reload_period;
575 int pps_enable; 575 int pps_enable;
576 unsigned int next_counter; 576 unsigned int next_counter;
577
578 u64 ethtool_stats[0];
577}; 579};
578 580
579void fec_ptp_init(struct platform_device *pdev); 581void fec_ptp_init(struct platform_device *pdev);
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
index 5aa9d4ded214..12aef1b15356 100644
--- a/drivers/net/ethernet/freescale/fec_main.c
+++ b/drivers/net/ethernet/freescale/fec_main.c
@@ -2313,14 +2313,26 @@ static const struct fec_stat {
2313 { "IEEE_rx_octets_ok", IEEE_R_OCTETS_OK }, 2313 { "IEEE_rx_octets_ok", IEEE_R_OCTETS_OK },
2314}; 2314};
2315 2315
2316static void fec_enet_get_ethtool_stats(struct net_device *dev, 2316#define FEC_STATS_SIZE (ARRAY_SIZE(fec_stats) * sizeof(u64))
2317 struct ethtool_stats *stats, u64 *data) 2317
2318static void fec_enet_update_ethtool_stats(struct net_device *dev)
2318{ 2319{
2319 struct fec_enet_private *fep = netdev_priv(dev); 2320 struct fec_enet_private *fep = netdev_priv(dev);
2320 int i; 2321 int i;
2321 2322
2322 for (i = 0; i < ARRAY_SIZE(fec_stats); i++) 2323 for (i = 0; i < ARRAY_SIZE(fec_stats); i++)
2323 data[i] = readl(fep->hwp + fec_stats[i].offset); 2324 fep->ethtool_stats[i] = readl(fep->hwp + fec_stats[i].offset);
2325}
2326
2327static void fec_enet_get_ethtool_stats(struct net_device *dev,
2328 struct ethtool_stats *stats, u64 *data)
2329{
2330 struct fec_enet_private *fep = netdev_priv(dev);
2331
2332 if (netif_running(dev))
2333 fec_enet_update_ethtool_stats(dev);
2334
2335 memcpy(data, fep->ethtool_stats, FEC_STATS_SIZE);
2324} 2336}
2325 2337
2326static void fec_enet_get_strings(struct net_device *netdev, 2338static void fec_enet_get_strings(struct net_device *netdev,
@@ -2345,6 +2357,12 @@ static int fec_enet_get_sset_count(struct net_device *dev, int sset)
2345 return -EOPNOTSUPP; 2357 return -EOPNOTSUPP;
2346 } 2358 }
2347} 2359}
2360
2361#else /* !defined(CONFIG_M5272) */
2362#define FEC_STATS_SIZE 0
2363static inline void fec_enet_update_ethtool_stats(struct net_device *dev)
2364{
2365}
2348#endif /* !defined(CONFIG_M5272) */ 2366#endif /* !defined(CONFIG_M5272) */
2349 2367
2350static int fec_enet_nway_reset(struct net_device *dev) 2368static int fec_enet_nway_reset(struct net_device *dev)
@@ -2874,6 +2892,8 @@ fec_enet_close(struct net_device *ndev)
2874 if (fep->quirks & FEC_QUIRK_ERR006687) 2892 if (fep->quirks & FEC_QUIRK_ERR006687)
2875 imx6q_cpuidle_fec_irqs_unused(); 2893 imx6q_cpuidle_fec_irqs_unused();
2876 2894
2895 fec_enet_update_ethtool_stats(ndev);
2896
2877 fec_enet_clk_enable(ndev, false); 2897 fec_enet_clk_enable(ndev, false);
2878 pinctrl_pm_select_sleep_state(&fep->pdev->dev); 2898 pinctrl_pm_select_sleep_state(&fep->pdev->dev);
2879 pm_runtime_mark_last_busy(&fep->pdev->dev); 2899 pm_runtime_mark_last_busy(&fep->pdev->dev);
@@ -3180,6 +3200,8 @@ static int fec_enet_init(struct net_device *ndev)
3180 3200
3181 fec_restart(ndev); 3201 fec_restart(ndev);
3182 3202
3203 fec_enet_update_ethtool_stats(ndev);
3204
3183 return 0; 3205 return 0;
3184} 3206}
3185 3207
@@ -3278,8 +3300,8 @@ fec_probe(struct platform_device *pdev)
3278 fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs); 3300 fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs);
3279 3301
3280 /* Init network device */ 3302 /* Init network device */
3281 ndev = alloc_etherdev_mqs(sizeof(struct fec_enet_private), 3303 ndev = alloc_etherdev_mqs(sizeof(struct fec_enet_private) +
3282 num_tx_qs, num_rx_qs); 3304 FEC_STATS_SIZE, num_tx_qs, num_rx_qs);
3283 if (!ndev) 3305 if (!ndev)
3284 return -ENOMEM; 3306 return -ENOMEM;
3285 3307
@@ -3475,6 +3497,8 @@ failed_regulator:
3475failed_clk_ipg: 3497failed_clk_ipg:
3476 fec_enet_clk_enable(ndev, false); 3498 fec_enet_clk_enable(ndev, false);
3477failed_clk: 3499failed_clk:
3500 if (of_phy_is_fixed_link(np))
3501 of_phy_deregister_fixed_link(np);
3478failed_phy: 3502failed_phy:
3479 of_node_put(phy_node); 3503 of_node_put(phy_node);
3480failed_ioremap: 3504failed_ioremap:
@@ -3488,6 +3512,7 @@ fec_drv_remove(struct platform_device *pdev)
3488{ 3512{
3489 struct net_device *ndev = platform_get_drvdata(pdev); 3513 struct net_device *ndev = platform_get_drvdata(pdev);
3490 struct fec_enet_private *fep = netdev_priv(ndev); 3514 struct fec_enet_private *fep = netdev_priv(ndev);
3515 struct device_node *np = pdev->dev.of_node;
3491 3516
3492 cancel_work_sync(&fep->tx_timeout_work); 3517 cancel_work_sync(&fep->tx_timeout_work);
3493 fec_ptp_stop(pdev); 3518 fec_ptp_stop(pdev);
@@ -3495,6 +3520,8 @@ fec_drv_remove(struct platform_device *pdev)
3495 fec_enet_mii_remove(fep); 3520 fec_enet_mii_remove(fep);
3496 if (fep->reg_phy) 3521 if (fep->reg_phy)
3497 regulator_disable(fep->reg_phy); 3522 regulator_disable(fep->reg_phy);
3523 if (of_phy_is_fixed_link(np))
3524 of_phy_deregister_fixed_link(np);
3498 of_node_put(fep->phy_node); 3525 of_node_put(fep->phy_node);
3499 free_netdev(ndev); 3526 free_netdev(ndev);
3500 3527
diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c b/drivers/net/ethernet/freescale/fman/fman_memac.c
index 53ef51e3bd9e..71a5ded9d1de 100644
--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
+++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
@@ -1107,6 +1107,9 @@ int memac_free(struct fman_mac *memac)
1107{ 1107{
1108 free_init_resources(memac); 1108 free_init_resources(memac);
1109 1109
1110 if (memac->pcsphy)
1111 put_device(&memac->pcsphy->mdio.dev);
1112
1110 kfree(memac->memac_drv_param); 1113 kfree(memac->memac_drv_param);
1111 kfree(memac); 1114 kfree(memac);
1112 1115
diff --git a/drivers/net/ethernet/freescale/fman/fman_tgec.c b/drivers/net/ethernet/freescale/fman/fman_tgec.c
index efabb04a1ae8..4b0f3a50b293 100644
--- a/drivers/net/ethernet/freescale/fman/fman_tgec.c
+++ b/drivers/net/ethernet/freescale/fman/fman_tgec.c
@@ -722,9 +722,6 @@ int tgec_free(struct fman_mac *tgec)
722{ 722{
723 free_init_resources(tgec); 723 free_init_resources(tgec);
724 724
725 if (tgec->cfg)
726 tgec->cfg = NULL;
727
728 kfree(tgec->cfg); 725 kfree(tgec->cfg);
729 kfree(tgec); 726 kfree(tgec);
730 727
diff --git a/drivers/net/ethernet/freescale/fman/mac.c b/drivers/net/ethernet/freescale/fman/mac.c
index 8fe6b3e253fa..736db9d9b0ad 100644
--- a/drivers/net/ethernet/freescale/fman/mac.c
+++ b/drivers/net/ethernet/freescale/fman/mac.c
@@ -892,6 +892,8 @@ static int mac_probe(struct platform_device *_of_dev)
892 priv->fixed_link->duplex = phy->duplex; 892 priv->fixed_link->duplex = phy->duplex;
893 priv->fixed_link->pause = phy->pause; 893 priv->fixed_link->pause = phy->pause;
894 priv->fixed_link->asym_pause = phy->asym_pause; 894 priv->fixed_link->asym_pause = phy->asym_pause;
895
896 put_device(&phy->mdio.dev);
895 } 897 }
896 898
897 err = mac_dev->init(mac_dev); 899 err = mac_dev->init(mac_dev);
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
index dc120c148d97..4b86260584a0 100644
--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
@@ -980,7 +980,7 @@ static int fs_enet_probe(struct platform_device *ofdev)
980 err = clk_prepare_enable(clk); 980 err = clk_prepare_enable(clk);
981 if (err) { 981 if (err) {
982 ret = err; 982 ret = err;
983 goto out_free_fpi; 983 goto out_deregister_fixed_link;
984 } 984 }
985 fpi->clk_per = clk; 985 fpi->clk_per = clk;
986 } 986 }
@@ -1061,6 +1061,9 @@ out_put:
1061 of_node_put(fpi->phy_node); 1061 of_node_put(fpi->phy_node);
1062 if (fpi->clk_per) 1062 if (fpi->clk_per)
1063 clk_disable_unprepare(fpi->clk_per); 1063 clk_disable_unprepare(fpi->clk_per);
1064out_deregister_fixed_link:
1065 if (of_phy_is_fixed_link(ofdev->dev.of_node))
1066 of_phy_deregister_fixed_link(ofdev->dev.of_node);
1064out_free_fpi: 1067out_free_fpi:
1065 kfree(fpi); 1068 kfree(fpi);
1066 return ret; 1069 return ret;
@@ -1079,6 +1082,8 @@ static int fs_enet_remove(struct platform_device *ofdev)
1079 of_node_put(fep->fpi->phy_node); 1082 of_node_put(fep->fpi->phy_node);
1080 if (fep->fpi->clk_per) 1083 if (fep->fpi->clk_per)
1081 clk_disable_unprepare(fep->fpi->clk_per); 1084 clk_disable_unprepare(fep->fpi->clk_per);
1085 if (of_phy_is_fixed_link(ofdev->dev.of_node))
1086 of_phy_deregister_fixed_link(ofdev->dev.of_node);
1082 free_netdev(ndev); 1087 free_netdev(ndev);
1083 return 0; 1088 return 0;
1084} 1089}
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index 4b4f5bc0e279..9061c2f82b9c 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -1312,6 +1312,7 @@ static void gfar_init_addr_hash_table(struct gfar_private *priv)
1312 */ 1312 */
1313static int gfar_probe(struct platform_device *ofdev) 1313static int gfar_probe(struct platform_device *ofdev)
1314{ 1314{
1315 struct device_node *np = ofdev->dev.of_node;
1315 struct net_device *dev = NULL; 1316 struct net_device *dev = NULL;
1316 struct gfar_private *priv = NULL; 1317 struct gfar_private *priv = NULL;
1317 int err = 0, i; 1318 int err = 0, i;
@@ -1462,6 +1463,8 @@ static int gfar_probe(struct platform_device *ofdev)
1462 return 0; 1463 return 0;
1463 1464
1464register_fail: 1465register_fail:
1466 if (of_phy_is_fixed_link(np))
1467 of_phy_deregister_fixed_link(np);
1465 unmap_group_regs(priv); 1468 unmap_group_regs(priv);
1466 gfar_free_rx_queues(priv); 1469 gfar_free_rx_queues(priv);
1467 gfar_free_tx_queues(priv); 1470 gfar_free_tx_queues(priv);
@@ -1474,11 +1477,16 @@ register_fail:
1474static int gfar_remove(struct platform_device *ofdev) 1477static int gfar_remove(struct platform_device *ofdev)
1475{ 1478{
1476 struct gfar_private *priv = platform_get_drvdata(ofdev); 1479 struct gfar_private *priv = platform_get_drvdata(ofdev);
1480 struct device_node *np = ofdev->dev.of_node;
1477 1481
1478 of_node_put(priv->phy_node); 1482 of_node_put(priv->phy_node);
1479 of_node_put(priv->tbi_node); 1483 of_node_put(priv->tbi_node);
1480 1484
1481 unregister_netdev(priv->ndev); 1485 unregister_netdev(priv->ndev);
1486
1487 if (of_phy_is_fixed_link(np))
1488 of_phy_deregister_fixed_link(np);
1489
1482 unmap_group_regs(priv); 1490 unmap_group_regs(priv);
1483 gfar_free_rx_queues(priv); 1491 gfar_free_rx_queues(priv);
1484 gfar_free_tx_queues(priv); 1492 gfar_free_tx_queues(priv);
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
index 186ef8f16c80..f76d33279454 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -3868,9 +3868,8 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3868 dev = alloc_etherdev(sizeof(*ugeth)); 3868 dev = alloc_etherdev(sizeof(*ugeth));
3869 3869
3870 if (dev == NULL) { 3870 if (dev == NULL) {
3871 of_node_put(ug_info->tbi_node); 3871 err = -ENOMEM;
3872 of_node_put(ug_info->phy_node); 3872 goto err_deregister_fixed_link;
3873 return -ENOMEM;
3874 } 3873 }
3875 3874
3876 ugeth = netdev_priv(dev); 3875 ugeth = netdev_priv(dev);
@@ -3907,10 +3906,7 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3907 if (netif_msg_probe(ugeth)) 3906 if (netif_msg_probe(ugeth))
3908 pr_err("%s: Cannot register net device, aborting\n", 3907 pr_err("%s: Cannot register net device, aborting\n",
3909 dev->name); 3908 dev->name);
3910 free_netdev(dev); 3909 goto err_free_netdev;
3911 of_node_put(ug_info->tbi_node);
3912 of_node_put(ug_info->phy_node);
3913 return err;
3914 } 3910 }
3915 3911
3916 mac_addr = of_get_mac_address(np); 3912 mac_addr = of_get_mac_address(np);
@@ -3923,16 +3919,29 @@ static int ucc_geth_probe(struct platform_device* ofdev)
3923 ugeth->node = np; 3919 ugeth->node = np;
3924 3920
3925 return 0; 3921 return 0;
3922
3923err_free_netdev:
3924 free_netdev(dev);
3925err_deregister_fixed_link:
3926 if (of_phy_is_fixed_link(np))
3927 of_phy_deregister_fixed_link(np);
3928 of_node_put(ug_info->tbi_node);
3929 of_node_put(ug_info->phy_node);
3930
3931 return err;
3926} 3932}
3927 3933
3928static int ucc_geth_remove(struct platform_device* ofdev) 3934static int ucc_geth_remove(struct platform_device* ofdev)
3929{ 3935{
3930 struct net_device *dev = platform_get_drvdata(ofdev); 3936 struct net_device *dev = platform_get_drvdata(ofdev);
3931 struct ucc_geth_private *ugeth = netdev_priv(dev); 3937 struct ucc_geth_private *ugeth = netdev_priv(dev);
3938 struct device_node *np = ofdev->dev.of_node;
3932 3939
3933 unregister_netdev(dev); 3940 unregister_netdev(dev);
3934 free_netdev(dev); 3941 free_netdev(dev);
3935 ucc_geth_memclean(ugeth); 3942 ucc_geth_memclean(ugeth);
3943 if (of_phy_is_fixed_link(np))
3944 of_phy_deregister_fixed_link(np);
3936 of_node_put(ugeth->ug_info->tbi_node); 3945 of_node_put(ugeth->ug_info->tbi_node);
3937 of_node_put(ugeth->ug_info->phy_node); 3946 of_node_put(ugeth->ug_info->phy_node);
3938 3947
diff --git a/drivers/net/ethernet/hisilicon/hns/hnae.c b/drivers/net/ethernet/hisilicon/hns/hnae.c
index c54c6fac0d1d..b6ed818f78ff 100644
--- a/drivers/net/ethernet/hisilicon/hns/hnae.c
+++ b/drivers/net/ethernet/hisilicon/hns/hnae.c
@@ -332,8 +332,10 @@ struct hnae_handle *hnae_get_handle(struct device *owner_dev,
332 return ERR_PTR(-ENODEV); 332 return ERR_PTR(-ENODEV);
333 333
334 handle = dev->ops->get_handle(dev, port_id); 334 handle = dev->ops->get_handle(dev, port_id);
335 if (IS_ERR(handle)) 335 if (IS_ERR(handle)) {
336 put_device(&dev->cls_dev);
336 return handle; 337 return handle;
338 }
337 339
338 handle->dev = dev; 340 handle->dev = dev;
339 handle->owner_dev = owner_dev; 341 handle->owner_dev = owner_dev;
@@ -356,6 +358,8 @@ out_when_init_queue:
356 for (j = i - 1; j >= 0; j--) 358 for (j = i - 1; j >= 0; j--)
357 hnae_fini_queue(handle->qs[j]); 359 hnae_fini_queue(handle->qs[j]);
358 360
361 put_device(&dev->cls_dev);
362
359 return ERR_PTR(-ENOMEM); 363 return ERR_PTR(-ENOMEM);
360} 364}
361EXPORT_SYMBOL(hnae_get_handle); 365EXPORT_SYMBOL(hnae_get_handle);
@@ -377,6 +381,8 @@ void hnae_put_handle(struct hnae_handle *h)
377 dev->ops->put_handle(h); 381 dev->ops->put_handle(h);
378 382
379 module_put(dev->owner); 383 module_put(dev->owner);
384
385 put_device(&dev->cls_dev);
380} 386}
381EXPORT_SYMBOL(hnae_put_handle); 387EXPORT_SYMBOL(hnae_put_handle);
382 388
diff --git a/drivers/net/ethernet/ibm/ehea/ehea_main.c b/drivers/net/ethernet/ibm/ehea/ehea_main.c
index 54efa9a5167b..bd719e25dd76 100644
--- a/drivers/net/ethernet/ibm/ehea/ehea_main.c
+++ b/drivers/net/ethernet/ibm/ehea/ehea_main.c
@@ -2446,6 +2446,8 @@ static int ehea_open(struct net_device *dev)
2446 2446
2447 netif_info(port, ifup, dev, "enabling port\n"); 2447 netif_info(port, ifup, dev, "enabling port\n");
2448 2448
2449 netif_carrier_off(dev);
2450
2449 ret = ehea_up(dev); 2451 ret = ehea_up(dev);
2450 if (!ret) { 2452 if (!ret) {
2451 port_napi_enable(port); 2453 port_napi_enable(port);
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
index ebe60719e489..a36022ba4e42 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c
@@ -58,7 +58,7 @@ static struct kobj_type ktype_veth_pool;
58 58
59static const char ibmveth_driver_name[] = "ibmveth"; 59static const char ibmveth_driver_name[] = "ibmveth";
60static const char ibmveth_driver_string[] = "IBM Power Virtual Ethernet Driver"; 60static const char ibmveth_driver_string[] = "IBM Power Virtual Ethernet Driver";
61#define ibmveth_driver_version "1.05" 61#define ibmveth_driver_version "1.06"
62 62
63MODULE_AUTHOR("Santiago Leon <santil@linux.vnet.ibm.com>"); 63MODULE_AUTHOR("Santiago Leon <santil@linux.vnet.ibm.com>");
64MODULE_DESCRIPTION("IBM Power Virtual Ethernet Driver"); 64MODULE_DESCRIPTION("IBM Power Virtual Ethernet Driver");
@@ -137,6 +137,11 @@ static inline int ibmveth_rxq_frame_offset(struct ibmveth_adapter *adapter)
137 return ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_OFF_MASK; 137 return ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_OFF_MASK;
138} 138}
139 139
140static inline int ibmveth_rxq_large_packet(struct ibmveth_adapter *adapter)
141{
142 return ibmveth_rxq_flags(adapter) & IBMVETH_RXQ_LRG_PKT;
143}
144
140static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter) 145static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter)
141{ 146{
142 return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].length); 147 return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].length);
@@ -1174,6 +1179,45 @@ map_failed:
1174 goto retry_bounce; 1179 goto retry_bounce;
1175} 1180}
1176 1181
1182static void ibmveth_rx_mss_helper(struct sk_buff *skb, u16 mss, int lrg_pkt)
1183{
1184 int offset = 0;
1185
1186 /* only TCP packets will be aggregated */
1187 if (skb->protocol == htons(ETH_P_IP)) {
1188 struct iphdr *iph = (struct iphdr *)skb->data;
1189
1190 if (iph->protocol == IPPROTO_TCP) {
1191 offset = iph->ihl * 4;
1192 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
1193 } else {
1194 return;
1195 }
1196 } else if (skb->protocol == htons(ETH_P_IPV6)) {
1197 struct ipv6hdr *iph6 = (struct ipv6hdr *)skb->data;
1198
1199 if (iph6->nexthdr == IPPROTO_TCP) {
1200 offset = sizeof(struct ipv6hdr);
1201 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
1202 } else {
1203 return;
1204 }
1205 } else {
1206 return;
1207 }
1208 /* if mss is not set through Large Packet bit/mss in rx buffer,
1209 * expect that the mss will be written to the tcp header checksum.
1210 */
1211 if (lrg_pkt) {
1212 skb_shinfo(skb)->gso_size = mss;
1213 } else if (offset) {
1214 struct tcphdr *tcph = (struct tcphdr *)(skb->data + offset);
1215
1216 skb_shinfo(skb)->gso_size = ntohs(tcph->check);
1217 tcph->check = 0;
1218 }
1219}
1220
1177static int ibmveth_poll(struct napi_struct *napi, int budget) 1221static int ibmveth_poll(struct napi_struct *napi, int budget)
1178{ 1222{
1179 struct ibmveth_adapter *adapter = 1223 struct ibmveth_adapter *adapter =
@@ -1182,6 +1226,7 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
1182 int frames_processed = 0; 1226 int frames_processed = 0;
1183 unsigned long lpar_rc; 1227 unsigned long lpar_rc;
1184 struct iphdr *iph; 1228 struct iphdr *iph;
1229 u16 mss = 0;
1185 1230
1186restart_poll: 1231restart_poll:
1187 while (frames_processed < budget) { 1232 while (frames_processed < budget) {
@@ -1199,9 +1244,21 @@ restart_poll:
1199 int length = ibmveth_rxq_frame_length(adapter); 1244 int length = ibmveth_rxq_frame_length(adapter);
1200 int offset = ibmveth_rxq_frame_offset(adapter); 1245 int offset = ibmveth_rxq_frame_offset(adapter);
1201 int csum_good = ibmveth_rxq_csum_good(adapter); 1246 int csum_good = ibmveth_rxq_csum_good(adapter);
1247 int lrg_pkt = ibmveth_rxq_large_packet(adapter);
1202 1248
1203 skb = ibmveth_rxq_get_buffer(adapter); 1249 skb = ibmveth_rxq_get_buffer(adapter);
1204 1250
1251 /* if the large packet bit is set in the rx queue
1252 * descriptor, the mss will be written by PHYP eight
1253 * bytes from the start of the rx buffer, which is
1254 * skb->data at this stage
1255 */
1256 if (lrg_pkt) {
1257 __be64 *rxmss = (__be64 *)(skb->data + 8);
1258
1259 mss = (u16)be64_to_cpu(*rxmss);
1260 }
1261
1205 new_skb = NULL; 1262 new_skb = NULL;
1206 if (length < rx_copybreak) 1263 if (length < rx_copybreak)
1207 new_skb = netdev_alloc_skb(netdev, length); 1264 new_skb = netdev_alloc_skb(netdev, length);
@@ -1235,11 +1292,15 @@ restart_poll:
1235 if (iph->check == 0xffff) { 1292 if (iph->check == 0xffff) {
1236 iph->check = 0; 1293 iph->check = 0;
1237 iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl); 1294 iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
1238 adapter->rx_large_packets++;
1239 } 1295 }
1240 } 1296 }
1241 } 1297 }
1242 1298
1299 if (length > netdev->mtu + ETH_HLEN) {
1300 ibmveth_rx_mss_helper(skb, mss, lrg_pkt);
1301 adapter->rx_large_packets++;
1302 }
1303
1243 napi_gro_receive(napi, skb); /* send it up */ 1304 napi_gro_receive(napi, skb); /* send it up */
1244 1305
1245 netdev->stats.rx_packets++; 1306 netdev->stats.rx_packets++;
diff --git a/drivers/net/ethernet/ibm/ibmveth.h b/drivers/net/ethernet/ibm/ibmveth.h
index 4eade67fe30c..7acda04d034e 100644
--- a/drivers/net/ethernet/ibm/ibmveth.h
+++ b/drivers/net/ethernet/ibm/ibmveth.h
@@ -209,6 +209,7 @@ struct ibmveth_rx_q_entry {
209#define IBMVETH_RXQ_TOGGLE 0x80000000 209#define IBMVETH_RXQ_TOGGLE 0x80000000
210#define IBMVETH_RXQ_TOGGLE_SHIFT 31 210#define IBMVETH_RXQ_TOGGLE_SHIFT 31
211#define IBMVETH_RXQ_VALID 0x40000000 211#define IBMVETH_RXQ_VALID 0x40000000
212#define IBMVETH_RXQ_LRG_PKT 0x04000000
212#define IBMVETH_RXQ_NO_CSUM 0x02000000 213#define IBMVETH_RXQ_NO_CSUM 0x02000000
213#define IBMVETH_RXQ_CSUM_GOOD 0x01000000 214#define IBMVETH_RXQ_CSUM_GOOD 0x01000000
214#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF 215#define IBMVETH_RXQ_OFF_MASK 0x0000FFFF
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
index 5f44c5520fbc..0fbf686f5e7c 100644
--- a/drivers/net/ethernet/ibm/ibmvnic.c
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
@@ -74,7 +74,6 @@
74#include <asm/iommu.h> 74#include <asm/iommu.h>
75#include <linux/uaccess.h> 75#include <linux/uaccess.h>
76#include <asm/firmware.h> 76#include <asm/firmware.h>
77#include <linux/seq_file.h>
78#include <linux/workqueue.h> 77#include <linux/workqueue.h>
79 78
80#include "ibmvnic.h" 79#include "ibmvnic.h"
@@ -1505,9 +1504,8 @@ static void init_sub_crqs(struct ibmvnic_adapter *adapter, int retry)
1505 adapter->max_rx_add_entries_per_subcrq > entries_page ? 1504 adapter->max_rx_add_entries_per_subcrq > entries_page ?
1506 entries_page : adapter->max_rx_add_entries_per_subcrq; 1505 entries_page : adapter->max_rx_add_entries_per_subcrq;
1507 1506
1508 /* Choosing the maximum number of queues supported by firmware*/ 1507 adapter->req_tx_queues = adapter->opt_tx_comp_sub_queues;
1509 adapter->req_tx_queues = adapter->max_tx_queues; 1508 adapter->req_rx_queues = adapter->opt_rx_comp_queues;
1510 adapter->req_rx_queues = adapter->max_rx_queues;
1511 adapter->req_rx_add_queues = adapter->max_rx_add_queues; 1509 adapter->req_rx_add_queues = adapter->max_rx_add_queues;
1512 1510
1513 adapter->req_mtu = adapter->max_mtu; 1511 adapter->req_mtu = adapter->max_mtu;
@@ -3706,7 +3704,7 @@ static int ibmvnic_probe(struct vio_dev *dev, const struct vio_device_id *id)
3706 struct net_device *netdev; 3704 struct net_device *netdev;
3707 unsigned char *mac_addr_p; 3705 unsigned char *mac_addr_p;
3708 struct dentry *ent; 3706 struct dentry *ent;
3709 char buf[16]; /* debugfs name buf */ 3707 char buf[17]; /* debugfs name buf */
3710 int rc; 3708 int rc;
3711 3709
3712 dev_dbg(&dev->dev, "entering ibmvnic_probe for UA 0x%x\n", 3710 dev_dbg(&dev->dev, "entering ibmvnic_probe for UA 0x%x\n",
@@ -3845,6 +3843,9 @@ static int ibmvnic_remove(struct vio_dev *dev)
3845 if (adapter->debugfs_dir && !IS_ERR(adapter->debugfs_dir)) 3843 if (adapter->debugfs_dir && !IS_ERR(adapter->debugfs_dir))
3846 debugfs_remove_recursive(adapter->debugfs_dir); 3844 debugfs_remove_recursive(adapter->debugfs_dir);
3847 3845
3846 dma_unmap_single(&dev->dev, adapter->stats_token,
3847 sizeof(struct ibmvnic_statistics), DMA_FROM_DEVICE);
3848
3848 if (adapter->ras_comps) 3849 if (adapter->ras_comps)
3849 dma_free_coherent(&dev->dev, 3850 dma_free_coherent(&dev->dev,
3850 adapter->ras_comp_num * 3851 adapter->ras_comp_num *
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index edc9a6ac5169..9affd7c198bd 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -4931,11 +4931,15 @@ static int igb_tso(struct igb_ring *tx_ring,
4931 4931
4932 /* initialize outer IP header fields */ 4932 /* initialize outer IP header fields */
4933 if (ip.v4->version == 4) { 4933 if (ip.v4->version == 4) {
4934 unsigned char *csum_start = skb_checksum_start(skb);
4935 unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
4936
4934 /* IP header will have to cancel out any data that 4937 /* IP header will have to cancel out any data that
4935 * is not a part of the outer IP header 4938 * is not a part of the outer IP header
4936 */ 4939 */
4937 ip.v4->check = csum_fold(csum_add(lco_csum(skb), 4940 ip.v4->check = csum_fold(csum_partial(trans_start,
4938 csum_unfold(l4.tcp->check))); 4941 csum_start - trans_start,
4942 0));
4939 type_tucmd |= E1000_ADVTXD_TUCMD_IPV4; 4943 type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
4940 4944
4941 ip.v4->tot_len = 0; 4945 ip.v4->tot_len = 0;
diff --git a/drivers/net/ethernet/intel/igbvf/netdev.c b/drivers/net/ethernet/intel/igbvf/netdev.c
index 12bb877df860..7dff7f6239cd 100644
--- a/drivers/net/ethernet/intel/igbvf/netdev.c
+++ b/drivers/net/ethernet/intel/igbvf/netdev.c
@@ -1965,11 +1965,15 @@ static int igbvf_tso(struct igbvf_ring *tx_ring,
1965 1965
1966 /* initialize outer IP header fields */ 1966 /* initialize outer IP header fields */
1967 if (ip.v4->version == 4) { 1967 if (ip.v4->version == 4) {
1968 unsigned char *csum_start = skb_checksum_start(skb);
1969 unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
1970
1968 /* IP header will have to cancel out any data that 1971 /* IP header will have to cancel out any data that
1969 * is not a part of the outer IP header 1972 * is not a part of the outer IP header
1970 */ 1973 */
1971 ip.v4->check = csum_fold(csum_add(lco_csum(skb), 1974 ip.v4->check = csum_fold(csum_partial(trans_start,
1972 csum_unfold(l4.tcp->check))); 1975 csum_start - trans_start,
1976 0));
1973 type_tucmd |= E1000_ADVTXD_TUCMD_IPV4; 1977 type_tucmd |= E1000_ADVTXD_TUCMD_IPV4;
1974 1978
1975 ip.v4->tot_len = 0; 1979 ip.v4->tot_len = 0;
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
index bd93d823cc25..fee1f2918ead 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
@@ -7277,11 +7277,15 @@ static int ixgbe_tso(struct ixgbe_ring *tx_ring,
7277 7277
7278 /* initialize outer IP header fields */ 7278 /* initialize outer IP header fields */
7279 if (ip.v4->version == 4) { 7279 if (ip.v4->version == 4) {
7280 unsigned char *csum_start = skb_checksum_start(skb);
7281 unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
7282
7280 /* IP header will have to cancel out any data that 7283 /* IP header will have to cancel out any data that
7281 * is not a part of the outer IP header 7284 * is not a part of the outer IP header
7282 */ 7285 */
7283 ip.v4->check = csum_fold(csum_add(lco_csum(skb), 7286 ip.v4->check = csum_fold(csum_partial(trans_start,
7284 csum_unfold(l4.tcp->check))); 7287 csum_start - trans_start,
7288 0));
7285 type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4; 7289 type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
7286 7290
7287 ip.v4->tot_len = 0; 7291 ip.v4->tot_len = 0;
diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
index 7eaac3234049..cbf70fe4028a 100644
--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
@@ -3329,11 +3329,15 @@ static int ixgbevf_tso(struct ixgbevf_ring *tx_ring,
3329 3329
3330 /* initialize outer IP header fields */ 3330 /* initialize outer IP header fields */
3331 if (ip.v4->version == 4) { 3331 if (ip.v4->version == 4) {
3332 unsigned char *csum_start = skb_checksum_start(skb);
3333 unsigned char *trans_start = ip.hdr + (ip.v4->ihl * 4);
3334
3332 /* IP header will have to cancel out any data that 3335 /* IP header will have to cancel out any data that
3333 * is not a part of the outer IP header 3336 * is not a part of the outer IP header
3334 */ 3337 */
3335 ip.v4->check = csum_fold(csum_add(lco_csum(skb), 3338 ip.v4->check = csum_fold(csum_partial(trans_start,
3336 csum_unfold(l4.tcp->check))); 3339 csum_start - trans_start,
3340 0));
3337 type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4; 3341 type_tucmd |= IXGBE_ADVTXD_TUCMD_IPV4;
3338 3342
3339 ip.v4->tot_len = 0; 3343 ip.v4->tot_len = 0;
diff --git a/drivers/net/ethernet/lantiq_etop.c b/drivers/net/ethernet/lantiq_etop.c
index 91e09d68b7e2..a167fd7ee13e 100644
--- a/drivers/net/ethernet/lantiq_etop.c
+++ b/drivers/net/ethernet/lantiq_etop.c
@@ -704,6 +704,7 @@ ltq_etop_probe(struct platform_device *pdev)
704 priv->pldata = dev_get_platdata(&pdev->dev); 704 priv->pldata = dev_get_platdata(&pdev->dev);
705 priv->netdev = dev; 705 priv->netdev = dev;
706 spin_lock_init(&priv->lock); 706 spin_lock_init(&priv->lock);
707 SET_NETDEV_DEV(dev, &pdev->dev);
707 708
708 for (i = 0; i < MAX_DMA_CHAN; i++) { 709 for (i = 0; i < MAX_DMA_CHAN; i++) {
709 if (IS_TX(i)) 710 if (IS_TX(i))
diff --git a/drivers/net/ethernet/marvell/mv643xx_eth.c b/drivers/net/ethernet/marvell/mv643xx_eth.c
index bf5cc55ba24c..5b12022adf1f 100644
--- a/drivers/net/ethernet/marvell/mv643xx_eth.c
+++ b/drivers/net/ethernet/marvell/mv643xx_eth.c
@@ -1381,6 +1381,7 @@ static unsigned int get_rx_coal(struct mv643xx_eth_private *mp)
1381 temp = (val & 0x003fff00) >> 8; 1381 temp = (val & 0x003fff00) >> 8;
1382 1382
1383 temp *= 64000000; 1383 temp *= 64000000;
1384 temp += mp->t_clk / 2;
1384 do_div(temp, mp->t_clk); 1385 do_div(temp, mp->t_clk);
1385 1386
1386 return (unsigned int)temp; 1387 return (unsigned int)temp;
@@ -1417,6 +1418,7 @@ static unsigned int get_tx_coal(struct mv643xx_eth_private *mp)
1417 1418
1418 temp = (rdlp(mp, TX_FIFO_URGENT_THRESHOLD) & 0x3fff0) >> 4; 1419 temp = (rdlp(mp, TX_FIFO_URGENT_THRESHOLD) & 0x3fff0) >> 4;
1419 temp *= 64000000; 1420 temp *= 64000000;
1421 temp += mp->t_clk / 2;
1420 do_div(temp, mp->t_clk); 1422 do_div(temp, mp->t_clk);
1421 1423
1422 return (unsigned int)temp; 1424 return (unsigned int)temp;
diff --git a/drivers/net/ethernet/marvell/mvneta.c b/drivers/net/ethernet/marvell/mvneta.c
index 5cb07c2017bf..707bc4680b9b 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -4151,7 +4151,7 @@ static int mvneta_probe(struct platform_device *pdev)
4151 dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO; 4151 dev->features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO;
4152 dev->hw_features |= dev->features; 4152 dev->hw_features |= dev->features;
4153 dev->vlan_features |= dev->features; 4153 dev->vlan_features |= dev->features;
4154 dev->priv_flags |= IFF_UNICAST_FLT | IFF_LIVE_ADDR_CHANGE; 4154 dev->priv_flags |= IFF_LIVE_ADDR_CHANGE;
4155 dev->gso_max_segs = MVNETA_MAX_TSO_SEGS; 4155 dev->gso_max_segs = MVNETA_MAX_TSO_SEGS;
4156 4156
4157 err = register_netdev(dev); 4157 err = register_netdev(dev);
@@ -4191,6 +4191,8 @@ err_clk:
4191 clk_disable_unprepare(pp->clk); 4191 clk_disable_unprepare(pp->clk);
4192err_put_phy_node: 4192err_put_phy_node:
4193 of_node_put(phy_node); 4193 of_node_put(phy_node);
4194 if (of_phy_is_fixed_link(dn))
4195 of_phy_deregister_fixed_link(dn);
4194err_free_irq: 4196err_free_irq:
4195 irq_dispose_mapping(dev->irq); 4197 irq_dispose_mapping(dev->irq);
4196err_free_netdev: 4198err_free_netdev:
@@ -4202,6 +4204,7 @@ err_free_netdev:
4202static int mvneta_remove(struct platform_device *pdev) 4204static int mvneta_remove(struct platform_device *pdev)
4203{ 4205{
4204 struct net_device *dev = platform_get_drvdata(pdev); 4206 struct net_device *dev = platform_get_drvdata(pdev);
4207 struct device_node *dn = pdev->dev.of_node;
4205 struct mvneta_port *pp = netdev_priv(dev); 4208 struct mvneta_port *pp = netdev_priv(dev);
4206 4209
4207 unregister_netdev(dev); 4210 unregister_netdev(dev);
@@ -4209,6 +4212,8 @@ static int mvneta_remove(struct platform_device *pdev)
4209 clk_disable_unprepare(pp->clk); 4212 clk_disable_unprepare(pp->clk);
4210 free_percpu(pp->ports); 4213 free_percpu(pp->ports);
4211 free_percpu(pp->stats); 4214 free_percpu(pp->stats);
4215 if (of_phy_is_fixed_link(dn))
4216 of_phy_deregister_fixed_link(dn);
4212 irq_dispose_mapping(dev->irq); 4217 irq_dispose_mapping(dev->irq);
4213 of_node_put(pp->phy_node); 4218 of_node_put(pp->phy_node);
4214 free_netdev(dev); 4219 free_netdev(dev);
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index 60227a3452a4..1026c452e39d 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -3293,7 +3293,7 @@ static void mvpp2_cls_init(struct mvpp2 *priv)
3293 mvpp2_write(priv, MVPP2_CLS_MODE_REG, MVPP2_CLS_MODE_ACTIVE_MASK); 3293 mvpp2_write(priv, MVPP2_CLS_MODE_REG, MVPP2_CLS_MODE_ACTIVE_MASK);
3294 3294
3295 /* Clear classifier flow table */ 3295 /* Clear classifier flow table */
3296 memset(&fe.data, 0, MVPP2_CLS_FLOWS_TBL_DATA_WORDS); 3296 memset(&fe.data, 0, sizeof(fe.data));
3297 for (index = 0; index < MVPP2_CLS_FLOWS_TBL_SIZE; index++) { 3297 for (index = 0; index < MVPP2_CLS_FLOWS_TBL_SIZE; index++) {
3298 fe.index = index; 3298 fe.index = index;
3299 mvpp2_cls_flow_write(priv, &fe); 3299 mvpp2_cls_flow_write(priv, &fe);
diff --git a/drivers/net/ethernet/marvell/sky2.c b/drivers/net/ethernet/marvell/sky2.c
index f05ea56dcff2..941c8e2c944e 100644
--- a/drivers/net/ethernet/marvell/sky2.c
+++ b/drivers/net/ethernet/marvell/sky2.c
@@ -5220,6 +5220,19 @@ static SIMPLE_DEV_PM_OPS(sky2_pm_ops, sky2_suspend, sky2_resume);
5220 5220
5221static void sky2_shutdown(struct pci_dev *pdev) 5221static void sky2_shutdown(struct pci_dev *pdev)
5222{ 5222{
5223 struct sky2_hw *hw = pci_get_drvdata(pdev);
5224 int port;
5225
5226 for (port = 0; port < hw->ports; port++) {
5227 struct net_device *ndev = hw->dev[port];
5228
5229 rtnl_lock();
5230 if (netif_running(ndev)) {
5231 dev_close(ndev);
5232 netif_device_detach(ndev);
5233 }
5234 rtnl_unlock();
5235 }
5223 sky2_suspend(&pdev->dev); 5236 sky2_suspend(&pdev->dev);
5224 pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev)); 5237 pci_wake_from_d3(pdev, device_may_wakeup(&pdev->dev));
5225 pci_set_power_state(pdev, PCI_D3hot); 5238 pci_set_power_state(pdev, PCI_D3hot);
diff --git a/drivers/net/ethernet/mediatek/mtk_eth_soc.c b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
index 4a62ffd7729d..86a89cbd3ec9 100644
--- a/drivers/net/ethernet/mediatek/mtk_eth_soc.c
+++ b/drivers/net/ethernet/mediatek/mtk_eth_soc.c
@@ -318,6 +318,8 @@ static int mtk_phy_connect(struct net_device *dev)
318 return 0; 318 return 0;
319 319
320err_phy: 320err_phy:
321 if (of_phy_is_fixed_link(mac->of_node))
322 of_phy_deregister_fixed_link(mac->of_node);
321 of_node_put(np); 323 of_node_put(np);
322 dev_err(eth->dev, "%s: invalid phy\n", __func__); 324 dev_err(eth->dev, "%s: invalid phy\n", __func__);
323 return -EINVAL; 325 return -EINVAL;
@@ -1923,6 +1925,8 @@ static void mtk_uninit(struct net_device *dev)
1923 struct mtk_eth *eth = mac->hw; 1925 struct mtk_eth *eth = mac->hw;
1924 1926
1925 phy_disconnect(dev->phydev); 1927 phy_disconnect(dev->phydev);
1928 if (of_phy_is_fixed_link(mac->of_node))
1929 of_phy_deregister_fixed_link(mac->of_node);
1926 mtk_irq_disable(eth, MTK_QDMA_INT_MASK, ~0); 1930 mtk_irq_disable(eth, MTK_QDMA_INT_MASK, ~0);
1927 mtk_irq_disable(eth, MTK_PDMA_INT_MASK, ~0); 1931 mtk_irq_disable(eth, MTK_PDMA_INT_MASK, ~0);
1928} 1932}
diff --git a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
index 12c99a2655f2..fb8bb027b69c 100644
--- a/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
+++ b/drivers/net/ethernet/mellanox/mlx4/en_netdev.c
@@ -129,6 +129,9 @@ static enum mlx4_net_trans_rule_id mlx4_ip_proto_to_trans_rule_id(u8 ip_proto)
129 } 129 }
130}; 130};
131 131
132/* Must not acquire state_lock, as its corresponding work_sync
133 * is done under it.
134 */
132static void mlx4_en_filter_work(struct work_struct *work) 135static void mlx4_en_filter_work(struct work_struct *work)
133{ 136{
134 struct mlx4_en_filter *filter = container_of(work, 137 struct mlx4_en_filter *filter = container_of(work,
@@ -2076,13 +2079,6 @@ err:
2076 return -ENOMEM; 2079 return -ENOMEM;
2077} 2080}
2078 2081
2079static void mlx4_en_shutdown(struct net_device *dev)
2080{
2081 rtnl_lock();
2082 netif_device_detach(dev);
2083 mlx4_en_close(dev);
2084 rtnl_unlock();
2085}
2086 2082
2087static int mlx4_en_copy_priv(struct mlx4_en_priv *dst, 2083static int mlx4_en_copy_priv(struct mlx4_en_priv *dst,
2088 struct mlx4_en_priv *src, 2084 struct mlx4_en_priv *src,
@@ -2159,8 +2155,6 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
2159{ 2155{
2160 struct mlx4_en_priv *priv = netdev_priv(dev); 2156 struct mlx4_en_priv *priv = netdev_priv(dev);
2161 struct mlx4_en_dev *mdev = priv->mdev; 2157 struct mlx4_en_dev *mdev = priv->mdev;
2162 bool shutdown = mdev->dev->persist->interface_state &
2163 MLX4_INTERFACE_STATE_SHUTDOWN;
2164 2158
2165 en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port); 2159 en_dbg(DRV, priv, "Destroying netdev on port:%d\n", priv->port);
2166 2160
@@ -2168,10 +2162,7 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
2168 if (priv->registered) { 2162 if (priv->registered) {
2169 devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev, 2163 devlink_port_type_clear(mlx4_get_devlink_port(mdev->dev,
2170 priv->port)); 2164 priv->port));
2171 if (shutdown) 2165 unregister_netdev(dev);
2172 mlx4_en_shutdown(dev);
2173 else
2174 unregister_netdev(dev);
2175 } 2166 }
2176 2167
2177 if (priv->allocated) 2168 if (priv->allocated)
@@ -2189,20 +2180,18 @@ void mlx4_en_destroy_netdev(struct net_device *dev)
2189 mutex_lock(&mdev->state_lock); 2180 mutex_lock(&mdev->state_lock);
2190 mdev->pndev[priv->port] = NULL; 2181 mdev->pndev[priv->port] = NULL;
2191 mdev->upper[priv->port] = NULL; 2182 mdev->upper[priv->port] = NULL;
2192 mutex_unlock(&mdev->state_lock);
2193 2183
2194#ifdef CONFIG_RFS_ACCEL 2184#ifdef CONFIG_RFS_ACCEL
2195 mlx4_en_cleanup_filters(priv); 2185 mlx4_en_cleanup_filters(priv);
2196#endif 2186#endif
2197 2187
2198 mlx4_en_free_resources(priv); 2188 mlx4_en_free_resources(priv);
2189 mutex_unlock(&mdev->state_lock);
2199 2190
2200 kfree(priv->tx_ring); 2191 kfree(priv->tx_ring);
2201 kfree(priv->tx_cq); 2192 kfree(priv->tx_cq);
2202 2193
2203 if (!shutdown) 2194 free_netdev(dev);
2204 free_netdev(dev);
2205 dev->ethtool_ops = NULL;
2206} 2195}
2207 2196
2208static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu) 2197static int mlx4_en_change_mtu(struct net_device *dev, int new_mtu)
diff --git a/drivers/net/ethernet/mellanox/mlx4/main.c b/drivers/net/ethernet/mellanox/mlx4/main.c
index 6f4e67bc3538..75d07fa9d0b1 100644
--- a/drivers/net/ethernet/mellanox/mlx4/main.c
+++ b/drivers/net/ethernet/mellanox/mlx4/main.c
@@ -4147,11 +4147,8 @@ static void mlx4_shutdown(struct pci_dev *pdev)
4147 4147
4148 mlx4_info(persist->dev, "mlx4_shutdown was called\n"); 4148 mlx4_info(persist->dev, "mlx4_shutdown was called\n");
4149 mutex_lock(&persist->interface_state_mutex); 4149 mutex_lock(&persist->interface_state_mutex);
4150 if (persist->interface_state & MLX4_INTERFACE_STATE_UP) { 4150 if (persist->interface_state & MLX4_INTERFACE_STATE_UP)
4151 /* Notify mlx4 clients that the kernel is being shut down */
4152 persist->interface_state |= MLX4_INTERFACE_STATE_SHUTDOWN;
4153 mlx4_unload_one(pdev); 4151 mlx4_unload_one(pdev);
4154 }
4155 mutex_unlock(&persist->interface_state_mutex); 4152 mutex_unlock(&persist->interface_state_mutex);
4156} 4153}
4157 4154
diff --git a/drivers/net/ethernet/mellanox/mlx4/mcg.c b/drivers/net/ethernet/mellanox/mlx4/mcg.c
index 94b891c118c1..1a670b681555 100644
--- a/drivers/net/ethernet/mellanox/mlx4/mcg.c
+++ b/drivers/net/ethernet/mellanox/mlx4/mcg.c
@@ -1457,7 +1457,12 @@ EXPORT_SYMBOL_GPL(mlx4_multicast_detach);
1457int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port, 1457int mlx4_flow_steer_promisc_add(struct mlx4_dev *dev, u8 port,
1458 u32 qpn, enum mlx4_net_trans_promisc_mode mode) 1458 u32 qpn, enum mlx4_net_trans_promisc_mode mode)
1459{ 1459{
1460 struct mlx4_net_trans_rule rule; 1460 struct mlx4_net_trans_rule rule = {
1461 .queue_mode = MLX4_NET_TRANS_Q_FIFO,
1462 .exclusive = 0,
1463 .allow_loopback = 1,
1464 };
1465
1461 u64 *regid_p; 1466 u64 *regid_p;
1462 1467
1463 switch (mode) { 1468 switch (mode) {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
index aae46884bf93..521cfdb7d11e 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
+++ b/drivers/net/ethernet/mellanox/mlx5/core/Kconfig
@@ -18,8 +18,6 @@ config MLX5_CORE_EN
18 default n 18 default n
19 ---help--- 19 ---help---
20 Ethernet support in Mellanox Technologies ConnectX-4 NIC. 20 Ethernet support in Mellanox Technologies ConnectX-4 NIC.
21 Ethernet and Infiniband support in ConnectX-4 are currently mutually
22 exclusive.
23 21
24config MLX5_CORE_EN_DCB 22config MLX5_CORE_EN_DCB
25 bool "Data Center Bridging (DCB) Support" 23 bool "Data Center Bridging (DCB) Support"
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
index 1e639f886021..bfe410e8a469 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/cmd.c
@@ -268,11 +268,6 @@ static void dump_buf(void *buf, int size, int data_only, int offset)
268 pr_debug("\n"); 268 pr_debug("\n");
269} 269}
270 270
271enum {
272 MLX5_DRIVER_STATUS_ABORTED = 0xfe,
273 MLX5_DRIVER_SYND = 0xbadd00de,
274};
275
276static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op, 271static int mlx5_internal_err_ret_value(struct mlx5_core_dev *dev, u16 op,
277 u32 *synd, u8 *status) 272 u32 *synd, u8 *status)
278{ 273{
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 7a43502a89cc..71382df59fc0 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -241,7 +241,7 @@ struct mlx5e_tstamp {
241}; 241};
242 242
243enum { 243enum {
244 MLX5E_RQ_STATE_FLUSH, 244 MLX5E_RQ_STATE_ENABLED,
245 MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, 245 MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS,
246 MLX5E_RQ_STATE_AM, 246 MLX5E_RQ_STATE_AM,
247}; 247};
@@ -394,7 +394,7 @@ struct mlx5e_sq_dma {
394}; 394};
395 395
396enum { 396enum {
397 MLX5E_SQ_STATE_FLUSH, 397 MLX5E_SQ_STATE_ENABLED,
398 MLX5E_SQ_STATE_BF_ENABLE, 398 MLX5E_SQ_STATE_BF_ENABLE,
399}; 399};
400 400
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index f4c687ce4c59..246d98ebb588 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -759,6 +759,7 @@ static int mlx5e_open_rq(struct mlx5e_channel *c,
759 if (err) 759 if (err)
760 goto err_destroy_rq; 760 goto err_destroy_rq;
761 761
762 set_bit(MLX5E_RQ_STATE_ENABLED, &rq->state);
762 err = mlx5e_modify_rq_state(rq, MLX5_RQC_STATE_RST, MLX5_RQC_STATE_RDY); 763 err = mlx5e_modify_rq_state(rq, MLX5_RQC_STATE_RST, MLX5_RQC_STATE_RDY);
763 if (err) 764 if (err)
764 goto err_disable_rq; 765 goto err_disable_rq;
@@ -773,6 +774,7 @@ static int mlx5e_open_rq(struct mlx5e_channel *c,
773 return 0; 774 return 0;
774 775
775err_disable_rq: 776err_disable_rq:
777 clear_bit(MLX5E_RQ_STATE_ENABLED, &rq->state);
776 mlx5e_disable_rq(rq); 778 mlx5e_disable_rq(rq);
777err_destroy_rq: 779err_destroy_rq:
778 mlx5e_destroy_rq(rq); 780 mlx5e_destroy_rq(rq);
@@ -782,7 +784,7 @@ err_destroy_rq:
782 784
783static void mlx5e_close_rq(struct mlx5e_rq *rq) 785static void mlx5e_close_rq(struct mlx5e_rq *rq)
784{ 786{
785 set_bit(MLX5E_RQ_STATE_FLUSH, &rq->state); 787 clear_bit(MLX5E_RQ_STATE_ENABLED, &rq->state);
786 napi_synchronize(&rq->channel->napi); /* prevent mlx5e_post_rx_wqes */ 788 napi_synchronize(&rq->channel->napi); /* prevent mlx5e_post_rx_wqes */
787 cancel_work_sync(&rq->am.work); 789 cancel_work_sync(&rq->am.work);
788 790
@@ -1006,7 +1008,6 @@ static int mlx5e_enable_sq(struct mlx5e_sq *sq, struct mlx5e_sq_param *param)
1006 MLX5_SET(sqc, sqc, min_wqe_inline_mode, sq->min_inline_mode); 1008 MLX5_SET(sqc, sqc, min_wqe_inline_mode, sq->min_inline_mode);
1007 MLX5_SET(sqc, sqc, state, MLX5_SQC_STATE_RST); 1009 MLX5_SET(sqc, sqc, state, MLX5_SQC_STATE_RST);
1008 MLX5_SET(sqc, sqc, tis_lst_sz, param->type == MLX5E_SQ_ICO ? 0 : 1); 1010 MLX5_SET(sqc, sqc, tis_lst_sz, param->type == MLX5E_SQ_ICO ? 0 : 1);
1009 MLX5_SET(sqc, sqc, flush_in_error_en, 1);
1010 1011
1011 MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC); 1012 MLX5_SET(wq, wq, wq_type, MLX5_WQ_TYPE_CYCLIC);
1012 MLX5_SET(wq, wq, uar_page, sq->uar.index); 1013 MLX5_SET(wq, wq, uar_page, sq->uar.index);
@@ -1083,6 +1084,7 @@ static int mlx5e_open_sq(struct mlx5e_channel *c,
1083 if (err) 1084 if (err)
1084 goto err_destroy_sq; 1085 goto err_destroy_sq;
1085 1086
1087 set_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
1086 err = mlx5e_modify_sq(sq, MLX5_SQC_STATE_RST, MLX5_SQC_STATE_RDY, 1088 err = mlx5e_modify_sq(sq, MLX5_SQC_STATE_RST, MLX5_SQC_STATE_RDY,
1087 false, 0); 1089 false, 0);
1088 if (err) 1090 if (err)
@@ -1096,6 +1098,7 @@ static int mlx5e_open_sq(struct mlx5e_channel *c,
1096 return 0; 1098 return 0;
1097 1099
1098err_disable_sq: 1100err_disable_sq:
1101 clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
1099 mlx5e_disable_sq(sq); 1102 mlx5e_disable_sq(sq);
1100err_destroy_sq: 1103err_destroy_sq:
1101 mlx5e_destroy_sq(sq); 1104 mlx5e_destroy_sq(sq);
@@ -1112,7 +1115,7 @@ static inline void netif_tx_disable_queue(struct netdev_queue *txq)
1112 1115
1113static void mlx5e_close_sq(struct mlx5e_sq *sq) 1116static void mlx5e_close_sq(struct mlx5e_sq *sq)
1114{ 1117{
1115 set_bit(MLX5E_SQ_STATE_FLUSH, &sq->state); 1118 clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
1116 /* prevent netif_tx_wake_queue */ 1119 /* prevent netif_tx_wake_queue */
1117 napi_synchronize(&sq->channel->napi); 1120 napi_synchronize(&sq->channel->napi);
1118 1121
@@ -1445,6 +1448,7 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1445 c->netdev = priv->netdev; 1448 c->netdev = priv->netdev;
1446 c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.mkey.key); 1449 c->mkey_be = cpu_to_be32(priv->mdev->mlx5e_res.mkey.key);
1447 c->num_tc = priv->params.num_tc; 1450 c->num_tc = priv->params.num_tc;
1451 c->xdp = !!priv->xdp_prog;
1448 1452
1449 if (priv->params.rx_am_enabled) 1453 if (priv->params.rx_am_enabled)
1450 rx_cq_profile = mlx5e_am_get_def_profile(priv->params.rx_cq_period_mode); 1454 rx_cq_profile = mlx5e_am_get_def_profile(priv->params.rx_cq_period_mode);
@@ -1468,6 +1472,12 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1468 if (err) 1472 if (err)
1469 goto err_close_tx_cqs; 1473 goto err_close_tx_cqs;
1470 1474
1475 /* XDP SQ CQ params are same as normal TXQ sq CQ params */
1476 err = c->xdp ? mlx5e_open_cq(c, &cparam->tx_cq, &c->xdp_sq.cq,
1477 priv->params.tx_cq_moderation) : 0;
1478 if (err)
1479 goto err_close_rx_cq;
1480
1471 napi_enable(&c->napi); 1481 napi_enable(&c->napi);
1472 1482
1473 err = mlx5e_open_sq(c, 0, &cparam->icosq, &c->icosq); 1483 err = mlx5e_open_sq(c, 0, &cparam->icosq, &c->icosq);
@@ -1488,21 +1498,10 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1488 } 1498 }
1489 } 1499 }
1490 1500
1491 if (priv->xdp_prog) { 1501 err = c->xdp ? mlx5e_open_sq(c, 0, &cparam->xdp_sq, &c->xdp_sq) : 0;
1492 /* XDP SQ CQ params are same as normal TXQ sq CQ params */ 1502 if (err)
1493 err = mlx5e_open_cq(c, &cparam->tx_cq, &c->xdp_sq.cq, 1503 goto err_close_sqs;
1494 priv->params.tx_cq_moderation);
1495 if (err)
1496 goto err_close_sqs;
1497
1498 err = mlx5e_open_sq(c, 0, &cparam->xdp_sq, &c->xdp_sq);
1499 if (err) {
1500 mlx5e_close_cq(&c->xdp_sq.cq);
1501 goto err_close_sqs;
1502 }
1503 }
1504 1504
1505 c->xdp = !!priv->xdp_prog;
1506 err = mlx5e_open_rq(c, &cparam->rq, &c->rq); 1505 err = mlx5e_open_rq(c, &cparam->rq, &c->rq);
1507 if (err) 1506 if (err)
1508 goto err_close_xdp_sq; 1507 goto err_close_xdp_sq;
@@ -1512,7 +1511,8 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
1512 1511
1513 return 0; 1512 return 0;
1514err_close_xdp_sq: 1513err_close_xdp_sq:
1515 mlx5e_close_sq(&c->xdp_sq); 1514 if (c->xdp)
1515 mlx5e_close_sq(&c->xdp_sq);
1516 1516
1517err_close_sqs: 1517err_close_sqs:
1518 mlx5e_close_sqs(c); 1518 mlx5e_close_sqs(c);
@@ -1522,6 +1522,10 @@ err_close_icosq:
1522 1522
1523err_disable_napi: 1523err_disable_napi:
1524 napi_disable(&c->napi); 1524 napi_disable(&c->napi);
1525 if (c->xdp)
1526 mlx5e_close_cq(&c->xdp_sq.cq);
1527
1528err_close_rx_cq:
1525 mlx5e_close_cq(&c->rq.cq); 1529 mlx5e_close_cq(&c->rq.cq);
1526 1530
1527err_close_tx_cqs: 1531err_close_tx_cqs:
@@ -3091,7 +3095,7 @@ static void mlx5e_tx_timeout(struct net_device *dev)
3091 if (!netif_xmit_stopped(netdev_get_tx_queue(dev, i))) 3095 if (!netif_xmit_stopped(netdev_get_tx_queue(dev, i)))
3092 continue; 3096 continue;
3093 sched_work = true; 3097 sched_work = true;
3094 set_bit(MLX5E_SQ_STATE_FLUSH, &sq->state); 3098 clear_bit(MLX5E_SQ_STATE_ENABLED, &sq->state);
3095 netdev_err(dev, "TX timeout on queue: %d, SQ: 0x%x, CQ: 0x%x, SQ Cons: 0x%x SQ Prod: 0x%x\n", 3099 netdev_err(dev, "TX timeout on queue: %d, SQ: 0x%x, CQ: 0x%x, SQ Cons: 0x%x SQ Prod: 0x%x\n",
3096 i, sq->sqn, sq->cq.mcq.cqn, sq->cc, sq->pc); 3100 i, sq->sqn, sq->cq.mcq.cqn, sq->cc, sq->pc);
3097 } 3101 }
@@ -3146,13 +3150,13 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
3146 for (i = 0; i < priv->params.num_channels; i++) { 3150 for (i = 0; i < priv->params.num_channels; i++) {
3147 struct mlx5e_channel *c = priv->channel[i]; 3151 struct mlx5e_channel *c = priv->channel[i];
3148 3152
3149 set_bit(MLX5E_RQ_STATE_FLUSH, &c->rq.state); 3153 clear_bit(MLX5E_RQ_STATE_ENABLED, &c->rq.state);
3150 napi_synchronize(&c->napi); 3154 napi_synchronize(&c->napi);
3151 /* prevent mlx5e_poll_rx_cq from accessing rq->xdp_prog */ 3155 /* prevent mlx5e_poll_rx_cq from accessing rq->xdp_prog */
3152 3156
3153 old_prog = xchg(&c->rq.xdp_prog, prog); 3157 old_prog = xchg(&c->rq.xdp_prog, prog);
3154 3158
3155 clear_bit(MLX5E_RQ_STATE_FLUSH, &c->rq.state); 3159 set_bit(MLX5E_RQ_STATE_ENABLED, &c->rq.state);
3156 /* napi_schedule in case we have missed anything */ 3160 /* napi_schedule in case we have missed anything */
3157 set_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags); 3161 set_bit(MLX5E_CHANNEL_NAPI_SCHED, &c->flags);
3158 napi_schedule(&c->napi); 3162 napi_schedule(&c->napi);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
index 7fe6559e4ab3..bf1c09ca73c0 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
@@ -308,7 +308,7 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
308 netdev->switchdev_ops = &mlx5e_rep_switchdev_ops; 308 netdev->switchdev_ops = &mlx5e_rep_switchdev_ops;
309#endif 309#endif
310 310
311 netdev->features |= NETIF_F_VLAN_CHALLENGED | NETIF_F_HW_TC; 311 netdev->features |= NETIF_F_VLAN_CHALLENGED | NETIF_F_HW_TC | NETIF_F_NETNS_LOCAL;
312 netdev->hw_features |= NETIF_F_HW_TC; 312 netdev->hw_features |= NETIF_F_HW_TC;
313 313
314 eth_hw_addr_random(netdev); 314 eth_hw_addr_random(netdev);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index c6de6fba5843..33495d88aeb2 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -340,7 +340,7 @@ static inline void mlx5e_post_umr_wqe(struct mlx5e_rq *rq, u16 ix)
340 while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) { 340 while ((pi = (sq->pc & wq->sz_m1)) > sq->edge) {
341 sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_NOP; 341 sq->db.ico_wqe[pi].opcode = MLX5_OPCODE_NOP;
342 sq->db.ico_wqe[pi].num_wqebbs = 1; 342 sq->db.ico_wqe[pi].num_wqebbs = 1;
343 mlx5e_send_nop(sq, true); 343 mlx5e_send_nop(sq, false);
344 } 344 }
345 345
346 wqe = mlx5_wq_cyc_get_wqe(wq, pi); 346 wqe = mlx5_wq_cyc_get_wqe(wq, pi);
@@ -412,7 +412,7 @@ void mlx5e_post_rx_mpwqe(struct mlx5e_rq *rq)
412 412
413 clear_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state); 413 clear_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state);
414 414
415 if (unlikely(test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state))) { 415 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state))) {
416 mlx5e_free_rx_mpwqe(rq, &rq->mpwqe.info[wq->head]); 416 mlx5e_free_rx_mpwqe(rq, &rq->mpwqe.info[wq->head]);
417 return; 417 return;
418 } 418 }
@@ -445,7 +445,7 @@ void mlx5e_dealloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
445} 445}
446 446
447#define RQ_CANNOT_POST(rq) \ 447#define RQ_CANNOT_POST(rq) \
448 (test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state) || \ 448 (!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state) || \
449 test_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state)) 449 test_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state))
450 450
451bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq) 451bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq)
@@ -924,7 +924,7 @@ int mlx5e_poll_rx_cq(struct mlx5e_cq *cq, int budget)
924 struct mlx5e_sq *xdp_sq = &rq->channel->xdp_sq; 924 struct mlx5e_sq *xdp_sq = &rq->channel->xdp_sq;
925 int work_done = 0; 925 int work_done = 0;
926 926
927 if (unlikely(test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state))) 927 if (unlikely(!test_bit(MLX5E_RQ_STATE_ENABLED, &rq->state)))
928 return 0; 928 return 0;
929 929
930 if (cq->decmprs_left) 930 if (cq->decmprs_left)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
index ce8c54d18906..6bb21b31cfeb 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tc.c
@@ -237,12 +237,15 @@ static int parse_cls_flower(struct mlx5e_priv *priv, struct mlx5_flow_spec *spec
237 skb_flow_dissector_target(f->dissector, 237 skb_flow_dissector_target(f->dissector,
238 FLOW_DISSECTOR_KEY_VLAN, 238 FLOW_DISSECTOR_KEY_VLAN,
239 f->mask); 239 f->mask);
240 if (mask->vlan_id) { 240 if (mask->vlan_id || mask->vlan_priority) {
241 MLX5_SET(fte_match_set_lyr_2_4, headers_c, vlan_tag, 1); 241 MLX5_SET(fte_match_set_lyr_2_4, headers_c, vlan_tag, 1);
242 MLX5_SET(fte_match_set_lyr_2_4, headers_v, vlan_tag, 1); 242 MLX5_SET(fte_match_set_lyr_2_4, headers_v, vlan_tag, 1);
243 243
244 MLX5_SET(fte_match_set_lyr_2_4, headers_c, first_vid, mask->vlan_id); 244 MLX5_SET(fte_match_set_lyr_2_4, headers_c, first_vid, mask->vlan_id);
245 MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_vid, key->vlan_id); 245 MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_vid, key->vlan_id);
246
247 MLX5_SET(fte_match_set_lyr_2_4, headers_c, first_prio, mask->vlan_priority);
248 MLX5_SET(fte_match_set_lyr_2_4, headers_v, first_prio, key->vlan_priority);
246 } 249 }
247 } 250 }
248 251
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
index 70a717382357..cfb68371c397 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c
@@ -409,7 +409,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)
409 409
410 sq = container_of(cq, struct mlx5e_sq, cq); 410 sq = container_of(cq, struct mlx5e_sq, cq);
411 411
412 if (unlikely(test_bit(MLX5E_SQ_STATE_FLUSH, &sq->state))) 412 if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state)))
413 return false; 413 return false;
414 414
415 npkts = 0; 415 npkts = 0;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
index 5703f19a6a24..e5c12a732aa1 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_txrx.c
@@ -56,7 +56,7 @@ static void mlx5e_poll_ico_cq(struct mlx5e_cq *cq)
56 struct mlx5_cqe64 *cqe; 56 struct mlx5_cqe64 *cqe;
57 u16 sqcc; 57 u16 sqcc;
58 58
59 if (unlikely(test_bit(MLX5E_SQ_STATE_FLUSH, &sq->state))) 59 if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state)))
60 return; 60 return;
61 61
62 cqe = mlx5e_get_cqe(cq); 62 cqe = mlx5e_get_cqe(cq);
@@ -113,7 +113,7 @@ static inline bool mlx5e_poll_xdp_tx_cq(struct mlx5e_cq *cq)
113 113
114 sq = container_of(cq, struct mlx5e_sq, cq); 114 sq = container_of(cq, struct mlx5e_sq, cq);
115 115
116 if (unlikely(test_bit(MLX5E_SQ_STATE_FLUSH, &sq->state))) 116 if (unlikely(!test_bit(MLX5E_SQ_STATE_ENABLED, &sq->state)))
117 return false; 117 return false;
118 118
119 /* sq->cc must be updated only after mlx5_cqwq_update_db_record(), 119 /* sq->cc must be updated only after mlx5_cqwq_update_db_record(),
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
index c55ad8d00c05..d239f5d0ea36 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
@@ -57,7 +57,8 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
57 if (esw->mode != SRIOV_OFFLOADS) 57 if (esw->mode != SRIOV_OFFLOADS)
58 return ERR_PTR(-EOPNOTSUPP); 58 return ERR_PTR(-EOPNOTSUPP);
59 59
60 action = attr->action; 60 /* per flow vlan pop/push is emulated, don't set that into the firmware */
61 action = attr->action & ~(MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH | MLX5_FLOW_CONTEXT_ACTION_VLAN_POP);
61 62
62 if (action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) { 63 if (action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
63 dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT; 64 dest.type = MLX5_FLOW_DESTINATION_TYPE_VPORT;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
index 89696048b045..914e5466f729 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
@@ -1690,7 +1690,7 @@ static int init_root_ns(struct mlx5_flow_steering *steering)
1690{ 1690{
1691 1691
1692 steering->root_ns = create_root_ns(steering, FS_FT_NIC_RX); 1692 steering->root_ns = create_root_ns(steering, FS_FT_NIC_RX);
1693 if (IS_ERR_OR_NULL(steering->root_ns)) 1693 if (!steering->root_ns)
1694 goto cleanup; 1694 goto cleanup;
1695 1695
1696 if (init_root_tree(steering, &root_fs, &steering->root_ns->ns.node)) 1696 if (init_root_tree(steering, &root_fs, &steering->root_ns->ns.node))
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c
index d5433c49b2b0..ada24e103b02 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c
@@ -46,7 +46,6 @@
46#include <linux/mlx5/srq.h> 46#include <linux/mlx5/srq.h>
47#include <linux/debugfs.h> 47#include <linux/debugfs.h>
48#include <linux/kmod.h> 48#include <linux/kmod.h>
49#include <linux/delay.h>
50#include <linux/mlx5/mlx5_ifc.h> 49#include <linux/mlx5/mlx5_ifc.h>
51#ifdef CONFIG_RFS_ACCEL 50#ifdef CONFIG_RFS_ACCEL
52#include <linux/cpu_rmap.h> 51#include <linux/cpu_rmap.h>
@@ -63,13 +62,13 @@ MODULE_DESCRIPTION("Mellanox Connect-IB, ConnectX-4 core driver");
63MODULE_LICENSE("Dual BSD/GPL"); 62MODULE_LICENSE("Dual BSD/GPL");
64MODULE_VERSION(DRIVER_VERSION); 63MODULE_VERSION(DRIVER_VERSION);
65 64
66int mlx5_core_debug_mask; 65unsigned int mlx5_core_debug_mask;
67module_param_named(debug_mask, mlx5_core_debug_mask, int, 0644); 66module_param_named(debug_mask, mlx5_core_debug_mask, uint, 0644);
68MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0"); 67MODULE_PARM_DESC(debug_mask, "debug mask: 1 = dump cmd data, 2 = dump cmd exec time, 3 = both. Default=0");
69 68
70#define MLX5_DEFAULT_PROF 2 69#define MLX5_DEFAULT_PROF 2
71static int prof_sel = MLX5_DEFAULT_PROF; 70static unsigned int prof_sel = MLX5_DEFAULT_PROF;
72module_param_named(prof_sel, prof_sel, int, 0444); 71module_param_named(prof_sel, prof_sel, uint, 0444);
73MODULE_PARM_DESC(prof_sel, "profile selector. Valid range 0 - 2"); 72MODULE_PARM_DESC(prof_sel, "profile selector. Valid range 0 - 2");
74 73
75enum { 74enum {
@@ -733,13 +732,15 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
733 u8 status; 732 u8 status;
734 733
735 mlx5_cmd_mbox_status(query_out, &status, &syndrome); 734 mlx5_cmd_mbox_status(query_out, &status, &syndrome);
736 if (status == MLX5_CMD_STAT_BAD_OP_ERR) { 735 if (!status || syndrome == MLX5_DRIVER_SYND) {
737 pr_debug("Only ISSI 0 is supported\n"); 736 mlx5_core_err(dev, "Failed to query ISSI err(%d) status(%d) synd(%d)\n",
738 return 0; 737 err, status, syndrome);
738 return err;
739 } 739 }
740 740
741 pr_err("failed to query ISSI err(%d)\n", err); 741 mlx5_core_warn(dev, "Query ISSI is not supported by FW, ISSI is 0\n");
742 return err; 742 dev->issi = 0;
743 return 0;
743 } 744 }
744 745
745 sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0); 746 sup_issi = MLX5_GET(query_issi_out, query_out, supported_issi_dw0);
@@ -753,7 +754,8 @@ static int mlx5_core_set_issi(struct mlx5_core_dev *dev)
753 err = mlx5_cmd_exec(dev, set_in, sizeof(set_in), 754 err = mlx5_cmd_exec(dev, set_in, sizeof(set_in),
754 set_out, sizeof(set_out)); 755 set_out, sizeof(set_out));
755 if (err) { 756 if (err) {
756 pr_err("failed to set ISSI=1 err(%d)\n", err); 757 mlx5_core_err(dev, "Failed to set ISSI to 1 err(%d)\n",
758 err);
757 return err; 759 return err;
758 } 760 }
759 761
@@ -1226,15 +1228,9 @@ static int init_one(struct pci_dev *pdev,
1226 1228
1227 pci_set_drvdata(pdev, dev); 1229 pci_set_drvdata(pdev, dev);
1228 1230
1229 if (prof_sel < 0 || prof_sel >= ARRAY_SIZE(profile)) {
1230 mlx5_core_warn(dev,
1231 "selected profile out of range, selecting default (%d)\n",
1232 MLX5_DEFAULT_PROF);
1233 prof_sel = MLX5_DEFAULT_PROF;
1234 }
1235 dev->profile = &profile[prof_sel];
1236 dev->pdev = pdev; 1231 dev->pdev = pdev;
1237 dev->event = mlx5_core_event; 1232 dev->event = mlx5_core_event;
1233 dev->profile = &profile[prof_sel];
1238 1234
1239 INIT_LIST_HEAD(&priv->ctx_list); 1235 INIT_LIST_HEAD(&priv->ctx_list);
1240 spin_lock_init(&priv->ctx_lock); 1236 spin_lock_init(&priv->ctx_lock);
@@ -1450,10 +1446,22 @@ static struct pci_driver mlx5_core_driver = {
1450 .sriov_configure = mlx5_core_sriov_configure, 1446 .sriov_configure = mlx5_core_sriov_configure,
1451}; 1447};
1452 1448
1449static void mlx5_core_verify_params(void)
1450{
1451 if (prof_sel >= ARRAY_SIZE(profile)) {
1452 pr_warn("mlx5_core: WARNING: Invalid module parameter prof_sel %d, valid range 0-%zu, changing back to default(%d)\n",
1453 prof_sel,
1454 ARRAY_SIZE(profile) - 1,
1455 MLX5_DEFAULT_PROF);
1456 prof_sel = MLX5_DEFAULT_PROF;
1457 }
1458}
1459
1453static int __init init(void) 1460static int __init init(void)
1454{ 1461{
1455 int err; 1462 int err;
1456 1463
1464 mlx5_core_verify_params();
1457 mlx5_register_debugfs(); 1465 mlx5_register_debugfs();
1458 1466
1459 err = pci_register_driver(&mlx5_core_driver); 1467 err = pci_register_driver(&mlx5_core_driver);
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
index 187662c8ea96..63b9a0dba885 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
@@ -44,11 +44,11 @@
44 44
45#define MLX5_TOTAL_VPORTS(mdev) (1 + pci_sriov_get_totalvfs(mdev->pdev)) 45#define MLX5_TOTAL_VPORTS(mdev) (1 + pci_sriov_get_totalvfs(mdev->pdev))
46 46
47extern int mlx5_core_debug_mask; 47extern uint mlx5_core_debug_mask;
48 48
49#define mlx5_core_dbg(__dev, format, ...) \ 49#define mlx5_core_dbg(__dev, format, ...) \
50 dev_dbg(&(__dev)->pdev->dev, "%s:%s:%d:(pid %d): " format, \ 50 dev_dbg(&(__dev)->pdev->dev, "%s:%d:(pid %d): " format, \
51 (__dev)->priv.name, __func__, __LINE__, current->pid, \ 51 __func__, __LINE__, current->pid, \
52 ##__VA_ARGS__) 52 ##__VA_ARGS__)
53 53
54#define mlx5_core_dbg_mask(__dev, mask, format, ...) \ 54#define mlx5_core_dbg_mask(__dev, mask, format, ...) \
@@ -63,8 +63,8 @@ do { \
63 ##__VA_ARGS__) 63 ##__VA_ARGS__)
64 64
65#define mlx5_core_warn(__dev, format, ...) \ 65#define mlx5_core_warn(__dev, format, ...) \
66 dev_warn(&(__dev)->pdev->dev, "%s:%s:%d:(pid %d): " format, \ 66 dev_warn(&(__dev)->pdev->dev, "%s:%d:(pid %d): " format, \
67 (__dev)->priv.name, __func__, __LINE__, current->pid, \ 67 __func__, __LINE__, current->pid, \
68 ##__VA_ARGS__) 68 ##__VA_ARGS__)
69 69
70#define mlx5_core_info(__dev, format, ...) \ 70#define mlx5_core_info(__dev, format, ...) \
@@ -75,6 +75,11 @@ enum {
75 MLX5_CMD_TIME, /* print command execution time */ 75 MLX5_CMD_TIME, /* print command execution time */
76}; 76};
77 77
78enum {
79 MLX5_DRIVER_STATUS_ABORTED = 0xfe,
80 MLX5_DRIVER_SYND = 0xbadd00de,
81};
82
78int mlx5_query_hca_caps(struct mlx5_core_dev *dev); 83int mlx5_query_hca_caps(struct mlx5_core_dev *dev);
79int mlx5_query_board_id(struct mlx5_core_dev *dev); 84int mlx5_query_board_id(struct mlx5_core_dev *dev);
80int mlx5_cmd_init_hca(struct mlx5_core_dev *dev); 85int mlx5_cmd_init_hca(struct mlx5_core_dev *dev);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
index 1ec0a4ce3c46..dda5761e91bc 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.c
@@ -231,7 +231,7 @@ mlxsw_sp_span_entry_create(struct mlxsw_sp_port *port)
231 231
232 span_entry->used = true; 232 span_entry->used = true;
233 span_entry->id = index; 233 span_entry->id = index;
234 span_entry->ref_count = 0; 234 span_entry->ref_count = 1;
235 span_entry->local_port = local_port; 235 span_entry->local_port = local_port;
236 return span_entry; 236 return span_entry;
237} 237}
@@ -270,6 +270,7 @@ static struct mlxsw_sp_span_entry
270 270
271 span_entry = mlxsw_sp_span_entry_find(port); 271 span_entry = mlxsw_sp_span_entry_find(port);
272 if (span_entry) { 272 if (span_entry) {
273 /* Already exists, just take a reference */
273 span_entry->ref_count++; 274 span_entry->ref_count++;
274 return span_entry; 275 return span_entry;
275 } 276 }
@@ -280,6 +281,7 @@ static struct mlxsw_sp_span_entry
280static int mlxsw_sp_span_entry_put(struct mlxsw_sp *mlxsw_sp, 281static int mlxsw_sp_span_entry_put(struct mlxsw_sp *mlxsw_sp,
281 struct mlxsw_sp_span_entry *span_entry) 282 struct mlxsw_sp_span_entry *span_entry)
282{ 283{
284 WARN_ON(!span_entry->ref_count);
283 if (--span_entry->ref_count == 0) 285 if (--span_entry->ref_count == 0)
284 mlxsw_sp_span_entry_destroy(mlxsw_sp, span_entry); 286 mlxsw_sp_span_entry_destroy(mlxsw_sp, span_entry);
285 return 0; 287 return 0;
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
index 9b22863a924b..97bbc1d21df8 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum.h
@@ -115,7 +115,7 @@ struct mlxsw_sp_rif {
115struct mlxsw_sp_mid { 115struct mlxsw_sp_mid {
116 struct list_head list; 116 struct list_head list;
117 unsigned char addr[ETH_ALEN]; 117 unsigned char addr[ETH_ALEN];
118 u16 vid; 118 u16 fid;
119 u16 mid; 119 u16 mid;
120 unsigned int ref_count; 120 unsigned int ref_count;
121}; 121};
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
index 4573da2c5560..e83072da6272 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c
@@ -594,21 +594,22 @@ static int mlxsw_sp_vrs_init(struct mlxsw_sp *mlxsw_sp)
594 return 0; 594 return 0;
595} 595}
596 596
597static void mlxsw_sp_router_fib_flush(struct mlxsw_sp *mlxsw_sp);
598
597static void mlxsw_sp_vrs_fini(struct mlxsw_sp *mlxsw_sp) 599static void mlxsw_sp_vrs_fini(struct mlxsw_sp *mlxsw_sp)
598{ 600{
601 mlxsw_sp_router_fib_flush(mlxsw_sp);
599 kfree(mlxsw_sp->router.vrs); 602 kfree(mlxsw_sp->router.vrs);
600} 603}
601 604
602struct mlxsw_sp_neigh_key { 605struct mlxsw_sp_neigh_key {
603 unsigned char addr[sizeof(struct in6_addr)]; 606 struct neighbour *n;
604 struct net_device *dev;
605}; 607};
606 608
607struct mlxsw_sp_neigh_entry { 609struct mlxsw_sp_neigh_entry {
608 struct rhash_head ht_node; 610 struct rhash_head ht_node;
609 struct mlxsw_sp_neigh_key key; 611 struct mlxsw_sp_neigh_key key;
610 u16 rif; 612 u16 rif;
611 struct neighbour *n;
612 bool offloaded; 613 bool offloaded;
613 struct delayed_work dw; 614 struct delayed_work dw;
614 struct mlxsw_sp_port *mlxsw_sp_port; 615 struct mlxsw_sp_port *mlxsw_sp_port;
@@ -646,19 +647,15 @@ mlxsw_sp_neigh_entry_remove(struct mlxsw_sp *mlxsw_sp,
646static void mlxsw_sp_router_neigh_update_hw(struct work_struct *work); 647static void mlxsw_sp_router_neigh_update_hw(struct work_struct *work);
647 648
648static struct mlxsw_sp_neigh_entry * 649static struct mlxsw_sp_neigh_entry *
649mlxsw_sp_neigh_entry_create(const void *addr, size_t addr_len, 650mlxsw_sp_neigh_entry_create(struct neighbour *n, u16 rif)
650 struct net_device *dev, u16 rif,
651 struct neighbour *n)
652{ 651{
653 struct mlxsw_sp_neigh_entry *neigh_entry; 652 struct mlxsw_sp_neigh_entry *neigh_entry;
654 653
655 neigh_entry = kzalloc(sizeof(*neigh_entry), GFP_ATOMIC); 654 neigh_entry = kzalloc(sizeof(*neigh_entry), GFP_ATOMIC);
656 if (!neigh_entry) 655 if (!neigh_entry)
657 return NULL; 656 return NULL;
658 memcpy(neigh_entry->key.addr, addr, addr_len); 657 neigh_entry->key.n = n;
659 neigh_entry->key.dev = dev;
660 neigh_entry->rif = rif; 658 neigh_entry->rif = rif;
661 neigh_entry->n = n;
662 INIT_DELAYED_WORK(&neigh_entry->dw, mlxsw_sp_router_neigh_update_hw); 659 INIT_DELAYED_WORK(&neigh_entry->dw, mlxsw_sp_router_neigh_update_hw);
663 INIT_LIST_HEAD(&neigh_entry->nexthop_list); 660 INIT_LIST_HEAD(&neigh_entry->nexthop_list);
664 return neigh_entry; 661 return neigh_entry;
@@ -671,13 +668,11 @@ mlxsw_sp_neigh_entry_destroy(struct mlxsw_sp_neigh_entry *neigh_entry)
671} 668}
672 669
673static struct mlxsw_sp_neigh_entry * 670static struct mlxsw_sp_neigh_entry *
674mlxsw_sp_neigh_entry_lookup(struct mlxsw_sp *mlxsw_sp, const void *addr, 671mlxsw_sp_neigh_entry_lookup(struct mlxsw_sp *mlxsw_sp, struct neighbour *n)
675 size_t addr_len, struct net_device *dev)
676{ 672{
677 struct mlxsw_sp_neigh_key key = {{ 0 } }; 673 struct mlxsw_sp_neigh_key key;
678 674
679 memcpy(key.addr, addr, addr_len); 675 key.n = n;
680 key.dev = dev;
681 return rhashtable_lookup_fast(&mlxsw_sp->router.neigh_ht, 676 return rhashtable_lookup_fast(&mlxsw_sp->router.neigh_ht,
682 &key, mlxsw_sp_neigh_ht_params); 677 &key, mlxsw_sp_neigh_ht_params);
683} 678}
@@ -689,26 +684,20 @@ int mlxsw_sp_router_neigh_construct(struct net_device *dev,
689 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; 684 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
690 struct mlxsw_sp_neigh_entry *neigh_entry; 685 struct mlxsw_sp_neigh_entry *neigh_entry;
691 struct mlxsw_sp_rif *r; 686 struct mlxsw_sp_rif *r;
692 u32 dip;
693 int err; 687 int err;
694 688
695 if (n->tbl != &arp_tbl) 689 if (n->tbl != &arp_tbl)
696 return 0; 690 return 0;
697 691
698 dip = ntohl(*((__be32 *) n->primary_key)); 692 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n);
699 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, &dip, sizeof(dip), 693 if (neigh_entry)
700 n->dev);
701 if (neigh_entry) {
702 WARN_ON(neigh_entry->n != n);
703 return 0; 694 return 0;
704 }
705 695
706 r = mlxsw_sp_rif_find_by_dev(mlxsw_sp, n->dev); 696 r = mlxsw_sp_rif_find_by_dev(mlxsw_sp, n->dev);
707 if (WARN_ON(!r)) 697 if (WARN_ON(!r))
708 return -EINVAL; 698 return -EINVAL;
709 699
710 neigh_entry = mlxsw_sp_neigh_entry_create(&dip, sizeof(dip), n->dev, 700 neigh_entry = mlxsw_sp_neigh_entry_create(n, r->rif);
711 r->rif, n);
712 if (!neigh_entry) 701 if (!neigh_entry)
713 return -ENOMEM; 702 return -ENOMEM;
714 err = mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry); 703 err = mlxsw_sp_neigh_entry_insert(mlxsw_sp, neigh_entry);
@@ -727,14 +716,11 @@ void mlxsw_sp_router_neigh_destroy(struct net_device *dev,
727 struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev); 716 struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
728 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; 717 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
729 struct mlxsw_sp_neigh_entry *neigh_entry; 718 struct mlxsw_sp_neigh_entry *neigh_entry;
730 u32 dip;
731 719
732 if (n->tbl != &arp_tbl) 720 if (n->tbl != &arp_tbl)
733 return; 721 return;
734 722
735 dip = ntohl(*((__be32 *) n->primary_key)); 723 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n);
736 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, &dip, sizeof(dip),
737 n->dev);
738 if (!neigh_entry) 724 if (!neigh_entry)
739 return; 725 return;
740 mlxsw_sp_neigh_entry_remove(mlxsw_sp, neigh_entry); 726 mlxsw_sp_neigh_entry_remove(mlxsw_sp, neigh_entry);
@@ -817,6 +803,26 @@ static void mlxsw_sp_router_neigh_rec_process(struct mlxsw_sp *mlxsw_sp,
817 } 803 }
818} 804}
819 805
806static bool mlxsw_sp_router_rauhtd_is_full(char *rauhtd_pl)
807{
808 u8 num_rec, last_rec_index, num_entries;
809
810 num_rec = mlxsw_reg_rauhtd_num_rec_get(rauhtd_pl);
811 last_rec_index = num_rec - 1;
812
813 if (num_rec < MLXSW_REG_RAUHTD_REC_MAX_NUM)
814 return false;
815 if (mlxsw_reg_rauhtd_rec_type_get(rauhtd_pl, last_rec_index) ==
816 MLXSW_REG_RAUHTD_TYPE_IPV6)
817 return true;
818
819 num_entries = mlxsw_reg_rauhtd_ipv4_rec_num_entries_get(rauhtd_pl,
820 last_rec_index);
821 if (++num_entries == MLXSW_REG_RAUHTD_IPV4_ENT_PER_REC)
822 return true;
823 return false;
824}
825
820static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp) 826static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp)
821{ 827{
822 char *rauhtd_pl; 828 char *rauhtd_pl;
@@ -843,7 +849,7 @@ static int mlxsw_sp_router_neighs_update_rauhtd(struct mlxsw_sp *mlxsw_sp)
843 for (i = 0; i < num_rec; i++) 849 for (i = 0; i < num_rec; i++)
844 mlxsw_sp_router_neigh_rec_process(mlxsw_sp, rauhtd_pl, 850 mlxsw_sp_router_neigh_rec_process(mlxsw_sp, rauhtd_pl,
845 i); 851 i);
846 } while (num_rec); 852 } while (mlxsw_sp_router_rauhtd_is_full(rauhtd_pl));
847 rtnl_unlock(); 853 rtnl_unlock();
848 854
849 kfree(rauhtd_pl); 855 kfree(rauhtd_pl);
@@ -862,7 +868,7 @@ static void mlxsw_sp_router_neighs_update_nh(struct mlxsw_sp *mlxsw_sp)
862 * is active regardless of the traffic. 868 * is active regardless of the traffic.
863 */ 869 */
864 if (!list_empty(&neigh_entry->nexthop_list)) 870 if (!list_empty(&neigh_entry->nexthop_list))
865 neigh_event_send(neigh_entry->n, NULL); 871 neigh_event_send(neigh_entry->key.n, NULL);
866 } 872 }
867 rtnl_unlock(); 873 rtnl_unlock();
868} 874}
@@ -908,9 +914,9 @@ static void mlxsw_sp_router_probe_unresolved_nexthops(struct work_struct *work)
908 rtnl_lock(); 914 rtnl_lock();
909 list_for_each_entry(neigh_entry, &mlxsw_sp->router.nexthop_neighs_list, 915 list_for_each_entry(neigh_entry, &mlxsw_sp->router.nexthop_neighs_list,
910 nexthop_neighs_list_node) { 916 nexthop_neighs_list_node) {
911 if (!(neigh_entry->n->nud_state & NUD_VALID) && 917 if (!(neigh_entry->key.n->nud_state & NUD_VALID) &&
912 !list_empty(&neigh_entry->nexthop_list)) 918 !list_empty(&neigh_entry->nexthop_list))
913 neigh_event_send(neigh_entry->n, NULL); 919 neigh_event_send(neigh_entry->key.n, NULL);
914 } 920 }
915 rtnl_unlock(); 921 rtnl_unlock();
916 922
@@ -927,7 +933,7 @@ static void mlxsw_sp_router_neigh_update_hw(struct work_struct *work)
927{ 933{
928 struct mlxsw_sp_neigh_entry *neigh_entry = 934 struct mlxsw_sp_neigh_entry *neigh_entry =
929 container_of(work, struct mlxsw_sp_neigh_entry, dw.work); 935 container_of(work, struct mlxsw_sp_neigh_entry, dw.work);
930 struct neighbour *n = neigh_entry->n; 936 struct neighbour *n = neigh_entry->key.n;
931 struct mlxsw_sp_port *mlxsw_sp_port = neigh_entry->mlxsw_sp_port; 937 struct mlxsw_sp_port *mlxsw_sp_port = neigh_entry->mlxsw_sp_port;
932 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp; 938 struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
933 char rauht_pl[MLXSW_REG_RAUHT_LEN]; 939 char rauht_pl[MLXSW_REG_RAUHT_LEN];
@@ -1030,11 +1036,8 @@ int mlxsw_sp_router_netevent_event(struct notifier_block *unused,
1030 1036
1031 mlxsw_sp = mlxsw_sp_port->mlxsw_sp; 1037 mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1032 dip = ntohl(*((__be32 *) n->primary_key)); 1038 dip = ntohl(*((__be32 *) n->primary_key));
1033 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, 1039 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n);
1034 &dip, 1040 if (WARN_ON(!neigh_entry)) {
1035 sizeof(__be32),
1036 dev);
1037 if (WARN_ON(!neigh_entry) || WARN_ON(neigh_entry->n != n)) {
1038 mlxsw_sp_port_dev_put(mlxsw_sp_port); 1041 mlxsw_sp_port_dev_put(mlxsw_sp_port);
1039 return NOTIFY_DONE; 1042 return NOTIFY_DONE;
1040 } 1043 }
@@ -1343,33 +1346,26 @@ static int mlxsw_sp_nexthop_init(struct mlxsw_sp *mlxsw_sp,
1343 struct fib_nh *fib_nh) 1346 struct fib_nh *fib_nh)
1344{ 1347{
1345 struct mlxsw_sp_neigh_entry *neigh_entry; 1348 struct mlxsw_sp_neigh_entry *neigh_entry;
1346 u32 gwip = ntohl(fib_nh->nh_gw);
1347 struct net_device *dev = fib_nh->nh_dev; 1349 struct net_device *dev = fib_nh->nh_dev;
1348 struct neighbour *n; 1350 struct neighbour *n;
1349 u8 nud_state; 1351 u8 nud_state;
1350 1352
1351 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, &gwip, 1353 /* Take a reference of neigh here ensuring that neigh would
1352 sizeof(gwip), dev); 1354 * not be detructed before the nexthop entry is finished.
1353 if (!neigh_entry) { 1355 * The reference is taken either in neigh_lookup() or
1354 __be32 gwipn = htonl(gwip); 1356 * in neith_create() in case n is not found.
1355 1357 */
1356 n = neigh_create(&arp_tbl, &gwipn, dev); 1358 n = neigh_lookup(&arp_tbl, &fib_nh->nh_gw, dev);
1359 if (!n) {
1360 n = neigh_create(&arp_tbl, &fib_nh->nh_gw, dev);
1357 if (IS_ERR(n)) 1361 if (IS_ERR(n))
1358 return PTR_ERR(n); 1362 return PTR_ERR(n);
1359 neigh_event_send(n, NULL); 1363 neigh_event_send(n, NULL);
1360 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, &gwip, 1364 }
1361 sizeof(gwip), dev); 1365 neigh_entry = mlxsw_sp_neigh_entry_lookup(mlxsw_sp, n);
1362 if (!neigh_entry) { 1366 if (!neigh_entry) {
1363 neigh_release(n); 1367 neigh_release(n);
1364 return -EINVAL; 1368 return -EINVAL;
1365 }
1366 } else {
1367 /* Take a reference of neigh here ensuring that neigh would
1368 * not be detructed before the nexthop entry is finished.
1369 * The second branch takes the reference in neith_create()
1370 */
1371 n = neigh_entry->n;
1372 neigh_clone(n);
1373 } 1369 }
1374 1370
1375 /* If that is the first nexthop connected to that neigh, add to 1371 /* If that is the first nexthop connected to that neigh, add to
@@ -1403,7 +1399,7 @@ static void mlxsw_sp_nexthop_fini(struct mlxsw_sp *mlxsw_sp,
1403 if (list_empty(&nh->neigh_entry->nexthop_list)) 1399 if (list_empty(&nh->neigh_entry->nexthop_list))
1404 list_del(&nh->neigh_entry->nexthop_neighs_list_node); 1400 list_del(&nh->neigh_entry->nexthop_neighs_list_node);
1405 1401
1406 neigh_release(neigh_entry->n); 1402 neigh_release(neigh_entry->key.n);
1407} 1403}
1408 1404
1409static struct mlxsw_sp_nexthop_group * 1405static struct mlxsw_sp_nexthop_group *
@@ -1463,11 +1459,11 @@ static bool mlxsw_sp_nexthop_match(struct mlxsw_sp_nexthop *nh,
1463 1459
1464 for (i = 0; i < fi->fib_nhs; i++) { 1460 for (i = 0; i < fi->fib_nhs; i++) {
1465 struct fib_nh *fib_nh = &fi->fib_nh[i]; 1461 struct fib_nh *fib_nh = &fi->fib_nh[i];
1466 u32 gwip = ntohl(fib_nh->nh_gw); 1462 struct neighbour *n = nh->neigh_entry->key.n;
1467 1463
1468 if (memcmp(nh->neigh_entry->key.addr, 1464 if (memcmp(n->primary_key, &fib_nh->nh_gw,
1469 &gwip, sizeof(u32)) == 0 && 1465 sizeof(fib_nh->nh_gw)) == 0 &&
1470 nh->neigh_entry->key.dev == fib_nh->nh_dev) 1466 n->dev == fib_nh->nh_dev)
1471 return true; 1467 return true;
1472 } 1468 }
1473 return false; 1469 return false;
@@ -1874,18 +1870,18 @@ static int mlxsw_sp_router_set_abort_trap(struct mlxsw_sp *mlxsw_sp)
1874 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl); 1870 return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl);
1875} 1871}
1876 1872
1877static void mlxsw_sp_router_fib4_abort(struct mlxsw_sp *mlxsw_sp) 1873static void mlxsw_sp_router_fib_flush(struct mlxsw_sp *mlxsw_sp)
1878{ 1874{
1879 struct mlxsw_resources *resources; 1875 struct mlxsw_resources *resources;
1880 struct mlxsw_sp_fib_entry *fib_entry; 1876 struct mlxsw_sp_fib_entry *fib_entry;
1881 struct mlxsw_sp_fib_entry *tmp; 1877 struct mlxsw_sp_fib_entry *tmp;
1882 struct mlxsw_sp_vr *vr; 1878 struct mlxsw_sp_vr *vr;
1883 int i; 1879 int i;
1884 int err;
1885 1880
1886 resources = mlxsw_core_resources_get(mlxsw_sp->core); 1881 resources = mlxsw_core_resources_get(mlxsw_sp->core);
1887 for (i = 0; i < resources->max_virtual_routers; i++) { 1882 for (i = 0; i < resources->max_virtual_routers; i++) {
1888 vr = &mlxsw_sp->router.vrs[i]; 1883 vr = &mlxsw_sp->router.vrs[i];
1884
1889 if (!vr->used) 1885 if (!vr->used)
1890 continue; 1886 continue;
1891 1887
@@ -1901,6 +1897,13 @@ static void mlxsw_sp_router_fib4_abort(struct mlxsw_sp *mlxsw_sp)
1901 break; 1897 break;
1902 } 1898 }
1903 } 1899 }
1900}
1901
1902static void mlxsw_sp_router_fib4_abort(struct mlxsw_sp *mlxsw_sp)
1903{
1904 int err;
1905
1906 mlxsw_sp_router_fib_flush(mlxsw_sp);
1904 mlxsw_sp->router.aborted = true; 1907 mlxsw_sp->router.aborted = true;
1905 err = mlxsw_sp_router_set_abort_trap(mlxsw_sp); 1908 err = mlxsw_sp_router_set_abort_trap(mlxsw_sp);
1906 if (err) 1909 if (err)
@@ -1958,6 +1961,9 @@ static int mlxsw_sp_router_fib_event(struct notifier_block *nb,
1958 struct fib_entry_notifier_info *fen_info = ptr; 1961 struct fib_entry_notifier_info *fen_info = ptr;
1959 int err; 1962 int err;
1960 1963
1964 if (!net_eq(fen_info->info.net, &init_net))
1965 return NOTIFY_DONE;
1966
1961 switch (event) { 1967 switch (event) {
1962 case FIB_EVENT_ENTRY_ADD: 1968 case FIB_EVENT_ENTRY_ADD:
1963 err = mlxsw_sp_router_fib4_add(mlxsw_sp, fen_info); 1969 err = mlxsw_sp_router_fib4_add(mlxsw_sp, fen_info);
diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
index 5e00c79e8133..1e2c8eca3af1 100644
--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c
@@ -929,12 +929,12 @@ static int mlxsw_sp_port_smid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 mid,
929 929
930static struct mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp *mlxsw_sp, 930static struct mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp *mlxsw_sp,
931 const unsigned char *addr, 931 const unsigned char *addr,
932 u16 vid) 932 u16 fid)
933{ 933{
934 struct mlxsw_sp_mid *mid; 934 struct mlxsw_sp_mid *mid;
935 935
936 list_for_each_entry(mid, &mlxsw_sp->br_mids.list, list) { 936 list_for_each_entry(mid, &mlxsw_sp->br_mids.list, list) {
937 if (ether_addr_equal(mid->addr, addr) && mid->vid == vid) 937 if (ether_addr_equal(mid->addr, addr) && mid->fid == fid)
938 return mid; 938 return mid;
939 } 939 }
940 return NULL; 940 return NULL;
@@ -942,7 +942,7 @@ static struct mlxsw_sp_mid *__mlxsw_sp_mc_get(struct mlxsw_sp *mlxsw_sp,
942 942
943static struct mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp, 943static struct mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp,
944 const unsigned char *addr, 944 const unsigned char *addr,
945 u16 vid) 945 u16 fid)
946{ 946{
947 struct mlxsw_sp_mid *mid; 947 struct mlxsw_sp_mid *mid;
948 u16 mid_idx; 948 u16 mid_idx;
@@ -958,7 +958,7 @@ static struct mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp,
958 958
959 set_bit(mid_idx, mlxsw_sp->br_mids.mapped); 959 set_bit(mid_idx, mlxsw_sp->br_mids.mapped);
960 ether_addr_copy(mid->addr, addr); 960 ether_addr_copy(mid->addr, addr);
961 mid->vid = vid; 961 mid->fid = fid;
962 mid->mid = mid_idx; 962 mid->mid = mid_idx;
963 mid->ref_count = 0; 963 mid->ref_count = 0;
964 list_add_tail(&mid->list, &mlxsw_sp->br_mids.list); 964 list_add_tail(&mid->list, &mlxsw_sp->br_mids.list);
@@ -991,9 +991,9 @@ static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
991 if (switchdev_trans_ph_prepare(trans)) 991 if (switchdev_trans_ph_prepare(trans))
992 return 0; 992 return 0;
993 993
994 mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, mdb->vid); 994 mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, fid);
995 if (!mid) { 995 if (!mid) {
996 mid = __mlxsw_sp_mc_alloc(mlxsw_sp, mdb->addr, mdb->vid); 996 mid = __mlxsw_sp_mc_alloc(mlxsw_sp, mdb->addr, fid);
997 if (!mid) { 997 if (!mid) {
998 netdev_err(dev, "Unable to allocate MC group\n"); 998 netdev_err(dev, "Unable to allocate MC group\n");
999 return -ENOMEM; 999 return -ENOMEM;
@@ -1137,7 +1137,7 @@ static int mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
1137 u16 mid_idx; 1137 u16 mid_idx;
1138 int err = 0; 1138 int err = 0;
1139 1139
1140 mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, mdb->vid); 1140 mid = __mlxsw_sp_mc_get(mlxsw_sp, mdb->addr, fid);
1141 if (!mid) { 1141 if (!mid) {
1142 netdev_err(dev, "Unable to remove port from MC DB\n"); 1142 netdev_err(dev, "Unable to remove port from MC DB\n");
1143 return -EINVAL; 1143 return -EINVAL;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_hsi.h b/drivers/net/ethernet/qlogic/qed/qed_hsi.h
index 72eee29c677f..2777d5bb4380 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_hsi.h
+++ b/drivers/net/ethernet/qlogic/qed/qed_hsi.h
@@ -727,9 +727,6 @@ struct core_tx_bd_flags {
727#define CORE_TX_BD_FLAGS_L4_PROTOCOL_SHIFT 6 727#define CORE_TX_BD_FLAGS_L4_PROTOCOL_SHIFT 6
728#define CORE_TX_BD_FLAGS_L4_PSEUDO_CSUM_MODE_MASK 0x1 728#define CORE_TX_BD_FLAGS_L4_PSEUDO_CSUM_MODE_MASK 0x1
729#define CORE_TX_BD_FLAGS_L4_PSEUDO_CSUM_MODE_SHIFT 7 729#define CORE_TX_BD_FLAGS_L4_PSEUDO_CSUM_MODE_SHIFT 7
730#define CORE_TX_BD_FLAGS_ROCE_FLAV_MASK 0x1
731#define CORE_TX_BD_FLAGS_ROCE_FLAV_SHIFT 12
732
733}; 730};
734 731
735struct core_tx_bd { 732struct core_tx_bd {
diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
index 63e1a1b0ef8e..62ae55bd81b8 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
@@ -1119,6 +1119,7 @@ static void qed_ll2_prepare_tx_packet_set_bd(struct qed_hwfn *p_hwfn,
1119 start_bd->bd_flags.as_bitfield |= CORE_TX_BD_FLAGS_START_BD_MASK << 1119 start_bd->bd_flags.as_bitfield |= CORE_TX_BD_FLAGS_START_BD_MASK <<
1120 CORE_TX_BD_FLAGS_START_BD_SHIFT; 1120 CORE_TX_BD_FLAGS_START_BD_SHIFT;
1121 SET_FIELD(start_bd->bitfield0, CORE_TX_BD_NBDS, num_of_bds); 1121 SET_FIELD(start_bd->bitfield0, CORE_TX_BD_NBDS, num_of_bds);
1122 SET_FIELD(start_bd->bitfield0, CORE_TX_BD_ROCE_FLAV, type);
1122 DMA_REGPAIR_LE(start_bd->addr, first_frag); 1123 DMA_REGPAIR_LE(start_bd->addr, first_frag);
1123 start_bd->nbytes = cpu_to_le16(first_frag_len); 1124 start_bd->nbytes = cpu_to_le16(first_frag_len);
1124 1125
@@ -1729,6 +1730,7 @@ static int qed_ll2_start_xmit(struct qed_dev *cdev, struct sk_buff *skb)
1729 mapping))) { 1730 mapping))) {
1730 DP_NOTICE(cdev, 1731 DP_NOTICE(cdev,
1731 "Unable to map frag - dropping packet\n"); 1732 "Unable to map frag - dropping packet\n");
1733 rc = -ENOMEM;
1732 goto err; 1734 goto err;
1733 } 1735 }
1734 } else { 1736 } else {
diff --git a/drivers/net/ethernet/qlogic/qed/qed_main.c b/drivers/net/ethernet/qlogic/qed/qed_main.c
index c418360ba02a..333c7442e48a 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_main.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_main.c
@@ -839,20 +839,19 @@ static void qed_update_pf_params(struct qed_dev *cdev,
839{ 839{
840 int i; 840 int i;
841 841
842 if (IS_ENABLED(CONFIG_QED_RDMA)) {
843 params->rdma_pf_params.num_qps = QED_ROCE_QPS;
844 params->rdma_pf_params.min_dpis = QED_ROCE_DPIS;
845 /* divide by 3 the MRs to avoid MF ILT overflow */
846 params->rdma_pf_params.num_mrs = RDMA_MAX_TIDS;
847 params->rdma_pf_params.gl_pi = QED_ROCE_PROTOCOL_INDEX;
848 }
849
842 for (i = 0; i < cdev->num_hwfns; i++) { 850 for (i = 0; i < cdev->num_hwfns; i++) {
843 struct qed_hwfn *p_hwfn = &cdev->hwfns[i]; 851 struct qed_hwfn *p_hwfn = &cdev->hwfns[i];
844 852
845 p_hwfn->pf_params = *params; 853 p_hwfn->pf_params = *params;
846 } 854 }
847
848 if (!IS_ENABLED(CONFIG_QED_RDMA))
849 return;
850
851 params->rdma_pf_params.num_qps = QED_ROCE_QPS;
852 params->rdma_pf_params.min_dpis = QED_ROCE_DPIS;
853 /* divide by 3 the MRs to avoid MF ILT overflow */
854 params->rdma_pf_params.num_mrs = RDMA_MAX_TIDS;
855 params->rdma_pf_params.gl_pi = QED_ROCE_PROTOCOL_INDEX;
856} 855}
857 856
858static int qed_slowpath_start(struct qed_dev *cdev, 857static int qed_slowpath_start(struct qed_dev *cdev,
diff --git a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
index 12251a1032d1..7567cc464b88 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_ethtool.c
@@ -175,16 +175,23 @@ static void qede_get_strings_stats(struct qede_dev *edev, u8 *buf)
175 for (i = 0, k = 0; i < QEDE_QUEUE_CNT(edev); i++) { 175 for (i = 0, k = 0; i < QEDE_QUEUE_CNT(edev); i++) {
176 int tc; 176 int tc;
177 177
178 for (j = 0; j < QEDE_NUM_RQSTATS; j++) 178 if (edev->fp_array[i].type & QEDE_FASTPATH_RX) {
179 sprintf(buf + (k + j) * ETH_GSTRING_LEN, 179 for (j = 0; j < QEDE_NUM_RQSTATS; j++)
180 "%d: %s", i, qede_rqstats_arr[j].string);
181 k += QEDE_NUM_RQSTATS;
182 for (tc = 0; tc < edev->num_tc; tc++) {
183 for (j = 0; j < QEDE_NUM_TQSTATS; j++)
184 sprintf(buf + (k + j) * ETH_GSTRING_LEN, 180 sprintf(buf + (k + j) * ETH_GSTRING_LEN,
185 "%d.%d: %s", i, tc, 181 "%d: %s", i,
186 qede_tqstats_arr[j].string); 182 qede_rqstats_arr[j].string);
187 k += QEDE_NUM_TQSTATS; 183 k += QEDE_NUM_RQSTATS;
184 }
185
186 if (edev->fp_array[i].type & QEDE_FASTPATH_TX) {
187 for (tc = 0; tc < edev->num_tc; tc++) {
188 for (j = 0; j < QEDE_NUM_TQSTATS; j++)
189 sprintf(buf + (k + j) *
190 ETH_GSTRING_LEN,
191 "%d.%d: %s", i, tc,
192 qede_tqstats_arr[j].string);
193 k += QEDE_NUM_TQSTATS;
194 }
188 } 195 }
189 } 196 }
190 197
diff --git a/drivers/net/ethernet/qlogic/qede/qede_main.c b/drivers/net/ethernet/qlogic/qede/qede_main.c
index 7def29aaf65c..85f46dbecd5b 100644
--- a/drivers/net/ethernet/qlogic/qede/qede_main.c
+++ b/drivers/net/ethernet/qlogic/qede/qede_main.c
@@ -2839,7 +2839,7 @@ static int qede_alloc_sge_mem(struct qede_dev *edev, struct qede_rx_queue *rxq)
2839 } 2839 }
2840 2840
2841 mapping = dma_map_page(&edev->pdev->dev, replace_buf->data, 0, 2841 mapping = dma_map_page(&edev->pdev->dev, replace_buf->data, 0,
2842 rxq->rx_buf_size, DMA_FROM_DEVICE); 2842 PAGE_SIZE, DMA_FROM_DEVICE);
2843 if (unlikely(dma_mapping_error(&edev->pdev->dev, mapping))) { 2843 if (unlikely(dma_mapping_error(&edev->pdev->dev, mapping))) {
2844 DP_NOTICE(edev, 2844 DP_NOTICE(edev,
2845 "Failed to map TPA replacement buffer\n"); 2845 "Failed to map TPA replacement buffer\n");
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-mac.c b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
index 6fb3bee904d3..0b4deb31e742 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-mac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-mac.c
@@ -575,10 +575,11 @@ void emac_mac_start(struct emac_adapter *adpt)
575 575
576 mac |= TXEN | RXEN; /* enable RX/TX */ 576 mac |= TXEN | RXEN; /* enable RX/TX */
577 577
578 /* We don't have ethtool support yet, so force flow-control mode 578 /* Configure MAC flow control to match the PHY's settings. */
579 * to 'full' always. 579 if (phydev->pause)
580 */ 580 mac |= RXFC;
581 mac |= TXFC | RXFC; 581 if (phydev->pause != phydev->asym_pause)
582 mac |= TXFC;
582 583
583 /* setup link speed */ 584 /* setup link speed */
584 mac &= ~SPEED_MASK; 585 mac &= ~SPEED_MASK;
@@ -1003,6 +1004,12 @@ int emac_mac_up(struct emac_adapter *adpt)
1003 writel((u32)~DIS_INT, adpt->base + EMAC_INT_STATUS); 1004 writel((u32)~DIS_INT, adpt->base + EMAC_INT_STATUS);
1004 writel(adpt->irq.mask, adpt->base + EMAC_INT_MASK); 1005 writel(adpt->irq.mask, adpt->base + EMAC_INT_MASK);
1005 1006
1007 /* Enable pause frames. Without this feature, the EMAC has been shown
1008 * to receive (and drop) frames with FCS errors at gigabit connections.
1009 */
1010 adpt->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1011 adpt->phydev->advertising |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
1012
1006 adpt->phydev->irq = PHY_IGNORE_INTERRUPT; 1013 adpt->phydev->irq = PHY_IGNORE_INTERRUPT;
1007 phy_start(adpt->phydev); 1014 phy_start(adpt->phydev);
1008 1015
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-phy.c b/drivers/net/ethernet/qualcomm/emac/emac-phy.c
index da4e90db4d98..99a14df28b96 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-phy.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-phy.c
@@ -212,6 +212,7 @@ int emac_phy_config(struct platform_device *pdev, struct emac_adapter *adpt)
212 212
213 phy_np = of_parse_phandle(np, "phy-handle", 0); 213 phy_np = of_parse_phandle(np, "phy-handle", 0);
214 adpt->phydev = of_phy_find_device(phy_np); 214 adpt->phydev = of_phy_find_device(phy_np);
215 of_node_put(phy_np);
215 } 216 }
216 217
217 if (!adpt->phydev) { 218 if (!adpt->phydev) {
diff --git a/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c b/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c
index 75c1b530e39e..72fe343c7a36 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac-sgmii.c
@@ -421,7 +421,7 @@ static const struct emac_reg_write sgmii_v2_laned[] = {
421 /* CDR Settings */ 421 /* CDR Settings */
422 {EMAC_SGMII_LN_UCDR_FO_GAIN_MODE0, 422 {EMAC_SGMII_LN_UCDR_FO_GAIN_MODE0,
423 UCDR_STEP_BY_TWO_MODE0 | UCDR_xO_GAIN_MODE(10)}, 423 UCDR_STEP_BY_TWO_MODE0 | UCDR_xO_GAIN_MODE(10)},
424 {EMAC_SGMII_LN_UCDR_SO_GAIN_MODE0, UCDR_xO_GAIN_MODE(6)}, 424 {EMAC_SGMII_LN_UCDR_SO_GAIN_MODE0, UCDR_xO_GAIN_MODE(0)},
425 {EMAC_SGMII_LN_UCDR_SO_CONFIG, UCDR_ENABLE | UCDR_SO_SATURATION(12)}, 425 {EMAC_SGMII_LN_UCDR_SO_CONFIG, UCDR_ENABLE | UCDR_SO_SATURATION(12)},
426 426
427 /* TX/RX Settings */ 427 /* TX/RX Settings */
diff --git a/drivers/net/ethernet/qualcomm/emac/emac.c b/drivers/net/ethernet/qualcomm/emac/emac.c
index 4fede4b86538..57b35aeac51a 100644
--- a/drivers/net/ethernet/qualcomm/emac/emac.c
+++ b/drivers/net/ethernet/qualcomm/emac/emac.c
@@ -711,6 +711,8 @@ static int emac_probe(struct platform_device *pdev)
711err_undo_napi: 711err_undo_napi:
712 netif_napi_del(&adpt->rx_q.napi); 712 netif_napi_del(&adpt->rx_q.napi);
713err_undo_mdiobus: 713err_undo_mdiobus:
714 if (!has_acpi_companion(&pdev->dev))
715 put_device(&adpt->phydev->mdio.dev);
714 mdiobus_unregister(adpt->mii_bus); 716 mdiobus_unregister(adpt->mii_bus);
715err_undo_clocks: 717err_undo_clocks:
716 emac_clks_teardown(adpt); 718 emac_clks_teardown(adpt);
@@ -730,6 +732,8 @@ static int emac_remove(struct platform_device *pdev)
730 732
731 emac_clks_teardown(adpt); 733 emac_clks_teardown(adpt);
732 734
735 if (!has_acpi_companion(&pdev->dev))
736 put_device(&adpt->phydev->mdio.dev);
733 mdiobus_unregister(adpt->mii_bus); 737 mdiobus_unregister(adpt->mii_bus);
734 free_netdev(netdev); 738 free_netdev(netdev);
735 739
diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c
index 630536bc72f9..d6a217874a8b 100644
--- a/drivers/net/ethernet/renesas/ravb_main.c
+++ b/drivers/net/ethernet/renesas/ravb_main.c
@@ -1008,20 +1008,18 @@ static int ravb_phy_init(struct net_device *ndev)
1008 of_node_put(pn); 1008 of_node_put(pn);
1009 if (!phydev) { 1009 if (!phydev) {
1010 netdev_err(ndev, "failed to connect PHY\n"); 1010 netdev_err(ndev, "failed to connect PHY\n");
1011 return -ENOENT; 1011 err = -ENOENT;
1012 goto err_deregister_fixed_link;
1012 } 1013 }
1013 1014
1014 /* This driver only support 10/100Mbit speeds on Gen3 1015 /* This driver only support 10/100Mbit speeds on Gen3
1015 * at this time. 1016 * at this time.
1016 */ 1017 */
1017 if (priv->chip_id == RCAR_GEN3) { 1018 if (priv->chip_id == RCAR_GEN3) {
1018 int err;
1019
1020 err = phy_set_max_speed(phydev, SPEED_100); 1019 err = phy_set_max_speed(phydev, SPEED_100);
1021 if (err) { 1020 if (err) {
1022 netdev_err(ndev, "failed to limit PHY to 100Mbit/s\n"); 1021 netdev_err(ndev, "failed to limit PHY to 100Mbit/s\n");
1023 phy_disconnect(phydev); 1022 goto err_phy_disconnect;
1024 return err;
1025 } 1023 }
1026 1024
1027 netdev_info(ndev, "limited PHY to 100Mbit/s\n"); 1025 netdev_info(ndev, "limited PHY to 100Mbit/s\n");
@@ -1033,6 +1031,14 @@ static int ravb_phy_init(struct net_device *ndev)
1033 phy_attached_info(phydev); 1031 phy_attached_info(phydev);
1034 1032
1035 return 0; 1033 return 0;
1034
1035err_phy_disconnect:
1036 phy_disconnect(phydev);
1037err_deregister_fixed_link:
1038 if (of_phy_is_fixed_link(np))
1039 of_phy_deregister_fixed_link(np);
1040
1041 return err;
1036} 1042}
1037 1043
1038/* PHY control start function */ 1044/* PHY control start function */
@@ -1634,6 +1640,7 @@ static void ravb_set_rx_mode(struct net_device *ndev)
1634/* Device close function for Ethernet AVB */ 1640/* Device close function for Ethernet AVB */
1635static int ravb_close(struct net_device *ndev) 1641static int ravb_close(struct net_device *ndev)
1636{ 1642{
1643 struct device_node *np = ndev->dev.parent->of_node;
1637 struct ravb_private *priv = netdev_priv(ndev); 1644 struct ravb_private *priv = netdev_priv(ndev);
1638 struct ravb_tstamp_skb *ts_skb, *ts_skb2; 1645 struct ravb_tstamp_skb *ts_skb, *ts_skb2;
1639 1646
@@ -1663,6 +1670,8 @@ static int ravb_close(struct net_device *ndev)
1663 if (ndev->phydev) { 1670 if (ndev->phydev) {
1664 phy_stop(ndev->phydev); 1671 phy_stop(ndev->phydev);
1665 phy_disconnect(ndev->phydev); 1672 phy_disconnect(ndev->phydev);
1673 if (of_phy_is_fixed_link(np))
1674 of_phy_deregister_fixed_link(np);
1666 } 1675 }
1667 1676
1668 if (priv->chip_id != RCAR_GEN2) { 1677 if (priv->chip_id != RCAR_GEN2) {
diff --git a/drivers/net/ethernet/renesas/sh_eth.c b/drivers/net/ethernet/renesas/sh_eth.c
index 05b0dc55de77..1a92de705199 100644
--- a/drivers/net/ethernet/renesas/sh_eth.c
+++ b/drivers/net/ethernet/renesas/sh_eth.c
@@ -518,7 +518,7 @@ static struct sh_eth_cpu_data r7s72100_data = {
518 518
519 .ecsr_value = ECSR_ICD, 519 .ecsr_value = ECSR_ICD,
520 .ecsipr_value = ECSIPR_ICDIP, 520 .ecsipr_value = ECSIPR_ICDIP,
521 .eesipr_value = 0xff7f009f, 521 .eesipr_value = 0xe77f009f,
522 522
523 .tx_check = EESR_TC1 | EESR_FTC, 523 .tx_check = EESR_TC1 | EESR_FTC,
524 .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT | 524 .eesr_err_check = EESR_TWB1 | EESR_TWB | EESR_TABT | EESR_RABT |
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index 3cf3557106c2..6b89e4a7b164 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -485,6 +485,9 @@ efx_copy_channel(const struct efx_channel *old_channel)
485 *channel = *old_channel; 485 *channel = *old_channel;
486 486
487 channel->napi_dev = NULL; 487 channel->napi_dev = NULL;
488 INIT_HLIST_NODE(&channel->napi_str.napi_hash_node);
489 channel->napi_str.napi_id = 0;
490 channel->napi_str.state = 0;
488 memset(&channel->eventq, 0, sizeof(channel->eventq)); 491 memset(&channel->eventq, 0, sizeof(channel->eventq));
489 492
490 for (j = 0; j < EFX_TXQ_TYPES; j++) { 493 for (j = 0; j < EFX_TXQ_TYPES; j++) {
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c
index e9b8579e6241..8b0016a785c0 100644
--- a/drivers/net/ethernet/smsc/smsc911x.c
+++ b/drivers/net/ethernet/smsc/smsc911x.c
@@ -438,9 +438,16 @@ static int smsc911x_request_resources(struct platform_device *pdev)
438 ret = regulator_bulk_get(&pdev->dev, 438 ret = regulator_bulk_get(&pdev->dev,
439 ARRAY_SIZE(pdata->supplies), 439 ARRAY_SIZE(pdata->supplies),
440 pdata->supplies); 440 pdata->supplies);
441 if (ret) 441 if (ret) {
442 /*
443 * Retry on deferrals, else just report the error
444 * and try to continue.
445 */
446 if (ret == -EPROBE_DEFER)
447 return ret;
442 netdev_err(ndev, "couldn't get regulators %d\n", 448 netdev_err(ndev, "couldn't get regulators %d\n",
443 ret); 449 ret);
450 }
444 451
445 /* Request optional RESET GPIO */ 452 /* Request optional RESET GPIO */
446 pdata->reset_gpiod = devm_gpiod_get_optional(&pdev->dev, 453 pdata->reset_gpiod = devm_gpiod_get_optional(&pdev->dev,
diff --git a/drivers/net/ethernet/stmicro/stmmac/Kconfig b/drivers/net/ethernet/stmicro/stmmac/Kconfig
index 3818c5e06eba..4b78168a5f3c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/Kconfig
+++ b/drivers/net/ethernet/stmicro/stmmac/Kconfig
@@ -107,7 +107,7 @@ config DWMAC_STI
107config DWMAC_STM32 107config DWMAC_STM32
108 tristate "STM32 DWMAC support" 108 tristate "STM32 DWMAC support"
109 default ARCH_STM32 109 default ARCH_STM32
110 depends on OF && HAS_IOMEM 110 depends on OF && HAS_IOMEM && (ARCH_STM32 || COMPILE_TEST)
111 select MFD_SYSCON 111 select MFD_SYSCON
112 ---help--- 112 ---help---
113 Support for ethernet controller on STM32 SOCs. 113 Support for ethernet controller on STM32 SOCs.
diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
index 2920e2ee3864..489ef146201e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
+++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
@@ -63,8 +63,8 @@
63#define TSE_PCS_SGMII_LINK_TIMER_0 0x0D40 63#define TSE_PCS_SGMII_LINK_TIMER_0 0x0D40
64#define TSE_PCS_SGMII_LINK_TIMER_1 0x0003 64#define TSE_PCS_SGMII_LINK_TIMER_1 0x0003
65#define TSE_PCS_SW_RESET_TIMEOUT 100 65#define TSE_PCS_SW_RESET_TIMEOUT 100
66#define TSE_PCS_USE_SGMII_AN_MASK BIT(2) 66#define TSE_PCS_USE_SGMII_AN_MASK BIT(1)
67#define TSE_PCS_USE_SGMII_ENA BIT(1) 67#define TSE_PCS_USE_SGMII_ENA BIT(0)
68 68
69#define SGMII_ADAPTER_CTRL_REG 0x00 69#define SGMII_ADAPTER_CTRL_REG 0x00
70#define SGMII_ADAPTER_DISABLE 0x0001 70#define SGMII_ADAPTER_DISABLE 0x0001
diff --git a/drivers/net/ethernet/stmicro/stmmac/common.h b/drivers/net/ethernet/stmicro/stmmac/common.h
index d3292c4a6eda..6d2de4e01f6d 100644
--- a/drivers/net/ethernet/stmicro/stmmac/common.h
+++ b/drivers/net/ethernet/stmicro/stmmac/common.h
@@ -120,14 +120,17 @@ struct stmmac_extra_stats {
120 unsigned long ip_csum_bypassed; 120 unsigned long ip_csum_bypassed;
121 unsigned long ipv4_pkt_rcvd; 121 unsigned long ipv4_pkt_rcvd;
122 unsigned long ipv6_pkt_rcvd; 122 unsigned long ipv6_pkt_rcvd;
123 unsigned long rx_msg_type_ext_no_ptp; 123 unsigned long no_ptp_rx_msg_type_ext;
124 unsigned long rx_msg_type_sync; 124 unsigned long ptp_rx_msg_type_sync;
125 unsigned long rx_msg_type_follow_up; 125 unsigned long ptp_rx_msg_type_follow_up;
126 unsigned long rx_msg_type_delay_req; 126 unsigned long ptp_rx_msg_type_delay_req;
127 unsigned long rx_msg_type_delay_resp; 127 unsigned long ptp_rx_msg_type_delay_resp;
128 unsigned long rx_msg_type_pdelay_req; 128 unsigned long ptp_rx_msg_type_pdelay_req;
129 unsigned long rx_msg_type_pdelay_resp; 129 unsigned long ptp_rx_msg_type_pdelay_resp;
130 unsigned long rx_msg_type_pdelay_follow_up; 130 unsigned long ptp_rx_msg_type_pdelay_follow_up;
131 unsigned long ptp_rx_msg_type_announce;
132 unsigned long ptp_rx_msg_type_management;
133 unsigned long ptp_rx_msg_pkt_reserved_type;
131 unsigned long ptp_frame_type; 134 unsigned long ptp_frame_type;
132 unsigned long ptp_ver; 135 unsigned long ptp_ver;
133 unsigned long timestamp_dropped; 136 unsigned long timestamp_dropped;
@@ -482,11 +485,12 @@ struct stmmac_ops {
482/* PTP and HW Timer helpers */ 485/* PTP and HW Timer helpers */
483struct stmmac_hwtimestamp { 486struct stmmac_hwtimestamp {
484 void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data); 487 void (*config_hw_tstamping) (void __iomem *ioaddr, u32 data);
485 u32 (*config_sub_second_increment) (void __iomem *ioaddr, u32 clk_rate); 488 u32 (*config_sub_second_increment)(void __iomem *ioaddr, u32 ptp_clock,
489 int gmac4);
486 int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec); 490 int (*init_systime) (void __iomem *ioaddr, u32 sec, u32 nsec);
487 int (*config_addend) (void __iomem *ioaddr, u32 addend); 491 int (*config_addend) (void __iomem *ioaddr, u32 addend);
488 int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec, 492 int (*adjust_systime) (void __iomem *ioaddr, u32 sec, u32 nsec,
489 int add_sub); 493 int add_sub, int gmac4);
490 u64(*get_systime) (void __iomem *ioaddr); 494 u64(*get_systime) (void __iomem *ioaddr);
491}; 495};
492 496
diff --git a/drivers/net/ethernet/stmicro/stmmac/descs.h b/drivers/net/ethernet/stmicro/stmmac/descs.h
index 2e4c171a2b41..e3c86d422109 100644
--- a/drivers/net/ethernet/stmicro/stmmac/descs.h
+++ b/drivers/net/ethernet/stmicro/stmmac/descs.h
@@ -155,14 +155,18 @@
155#define ERDES4_L3_L4_FILT_NO_MATCH_MASK GENMASK(27, 26) 155#define ERDES4_L3_L4_FILT_NO_MATCH_MASK GENMASK(27, 26)
156 156
157/* Extended RDES4 message type definitions */ 157/* Extended RDES4 message type definitions */
158#define RDES_EXT_NO_PTP 0 158#define RDES_EXT_NO_PTP 0x0
159#define RDES_EXT_SYNC 1 159#define RDES_EXT_SYNC 0x1
160#define RDES_EXT_FOLLOW_UP 2 160#define RDES_EXT_FOLLOW_UP 0x2
161#define RDES_EXT_DELAY_REQ 3 161#define RDES_EXT_DELAY_REQ 0x3
162#define RDES_EXT_DELAY_RESP 4 162#define RDES_EXT_DELAY_RESP 0x4
163#define RDES_EXT_PDELAY_REQ 5 163#define RDES_EXT_PDELAY_REQ 0x5
164#define RDES_EXT_PDELAY_RESP 6 164#define RDES_EXT_PDELAY_RESP 0x6
165#define RDES_EXT_PDELAY_FOLLOW_UP 7 165#define RDES_EXT_PDELAY_FOLLOW_UP 0x7
166#define RDES_PTP_ANNOUNCE 0x8
167#define RDES_PTP_MANAGEMENT 0x9
168#define RDES_PTP_SIGNALING 0xa
169#define RDES_PTP_PKT_RESERVED_TYPE 0xf
166 170
167/* Basic descriptor structure for normal and alternate descriptors */ 171/* Basic descriptor structure for normal and alternate descriptors */
168struct dma_desc { 172struct dma_desc {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
index b1e5f24708c9..e6e6c2fcc4b7 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-generic.c
@@ -50,10 +50,23 @@ static int dwmac_generic_probe(struct platform_device *pdev)
50 if (plat_dat->init) { 50 if (plat_dat->init) {
51 ret = plat_dat->init(pdev, plat_dat->bsp_priv); 51 ret = plat_dat->init(pdev, plat_dat->bsp_priv);
52 if (ret) 52 if (ret)
53 return ret; 53 goto err_remove_config_dt;
54 } 54 }
55 55
56 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 56 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
57 if (ret)
58 goto err_exit;
59
60 return 0;
61
62err_exit:
63 if (plat_dat->exit)
64 plat_dat->exit(pdev, plat_dat->bsp_priv);
65err_remove_config_dt:
66 if (pdev->dev.of_node)
67 stmmac_remove_config_dt(pdev, plat_dat);
68
69 return ret;
57} 70}
58 71
59static const struct of_device_id dwmac_generic_match[] = { 72static const struct of_device_id dwmac_generic_match[] = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
index 36d3355f2fb0..866444b6c82f 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-ipq806x.c
@@ -271,15 +271,17 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
271 return PTR_ERR(plat_dat); 271 return PTR_ERR(plat_dat);
272 272
273 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL); 273 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
274 if (!gmac) 274 if (!gmac) {
275 return -ENOMEM; 275 err = -ENOMEM;
276 goto err_remove_config_dt;
277 }
276 278
277 gmac->pdev = pdev; 279 gmac->pdev = pdev;
278 280
279 err = ipq806x_gmac_of_parse(gmac); 281 err = ipq806x_gmac_of_parse(gmac);
280 if (err) { 282 if (err) {
281 dev_err(dev, "device tree parsing error\n"); 283 dev_err(dev, "device tree parsing error\n");
282 return err; 284 goto err_remove_config_dt;
283 } 285 }
284 286
285 regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL, 287 regmap_write(gmac->qsgmii_csr, QSGMII_PCS_CAL_LCKDT_CTL,
@@ -300,7 +302,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
300 default: 302 default:
301 dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n", 303 dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
302 phy_modes(gmac->phy_mode)); 304 phy_modes(gmac->phy_mode));
303 return -EINVAL; 305 err = -EINVAL;
306 goto err_remove_config_dt;
304 } 307 }
305 regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val); 308 regmap_write(gmac->nss_common, NSS_COMMON_GMAC_CTL(gmac->id), val);
306 309
@@ -319,7 +322,8 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
319 default: 322 default:
320 dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n", 323 dev_err(&pdev->dev, "Unsupported PHY mode: \"%s\"\n",
321 phy_modes(gmac->phy_mode)); 324 phy_modes(gmac->phy_mode));
322 return -EINVAL; 325 err = -EINVAL;
326 goto err_remove_config_dt;
323 } 327 }
324 regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val); 328 regmap_write(gmac->nss_common, NSS_COMMON_CLK_SRC_CTRL, val);
325 329
@@ -346,7 +350,16 @@ static int ipq806x_gmac_probe(struct platform_device *pdev)
346 plat_dat->bsp_priv = gmac; 350 plat_dat->bsp_priv = gmac;
347 plat_dat->fix_mac_speed = ipq806x_gmac_fix_mac_speed; 351 plat_dat->fix_mac_speed = ipq806x_gmac_fix_mac_speed;
348 352
349 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 353 err = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
354 if (err)
355 goto err_remove_config_dt;
356
357 return 0;
358
359err_remove_config_dt:
360 stmmac_remove_config_dt(pdev, plat_dat);
361
362 return err;
350} 363}
351 364
352static const struct of_device_id ipq806x_gmac_dwmac_match[] = { 365static const struct of_device_id ipq806x_gmac_dwmac_match[] = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
index 78e9d1861896..3d3f43d91b98 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-lpc18xx.c
@@ -46,7 +46,8 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
46 reg = syscon_regmap_lookup_by_compatible("nxp,lpc1850-creg"); 46 reg = syscon_regmap_lookup_by_compatible("nxp,lpc1850-creg");
47 if (IS_ERR(reg)) { 47 if (IS_ERR(reg)) {
48 dev_err(&pdev->dev, "syscon lookup failed\n"); 48 dev_err(&pdev->dev, "syscon lookup failed\n");
49 return PTR_ERR(reg); 49 ret = PTR_ERR(reg);
50 goto err_remove_config_dt;
50 } 51 }
51 52
52 if (plat_dat->interface == PHY_INTERFACE_MODE_MII) { 53 if (plat_dat->interface == PHY_INTERFACE_MODE_MII) {
@@ -55,13 +56,23 @@ static int lpc18xx_dwmac_probe(struct platform_device *pdev)
55 ethmode = LPC18XX_CREG_CREG6_ETHMODE_RMII; 56 ethmode = LPC18XX_CREG_CREG6_ETHMODE_RMII;
56 } else { 57 } else {
57 dev_err(&pdev->dev, "Only MII and RMII mode supported\n"); 58 dev_err(&pdev->dev, "Only MII and RMII mode supported\n");
58 return -EINVAL; 59 ret = -EINVAL;
60 goto err_remove_config_dt;
59 } 61 }
60 62
61 regmap_update_bits(reg, LPC18XX_CREG_CREG6, 63 regmap_update_bits(reg, LPC18XX_CREG_CREG6,
62 LPC18XX_CREG_CREG6_ETHMODE_MASK, ethmode); 64 LPC18XX_CREG_CREG6_ETHMODE_MASK, ethmode);
63 65
64 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 66 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
67 if (ret)
68 goto err_remove_config_dt;
69
70 return 0;
71
72err_remove_config_dt:
73 stmmac_remove_config_dt(pdev, plat_dat);
74
75 return ret;
65} 76}
66 77
67static const struct of_device_id lpc18xx_dwmac_match[] = { 78static const struct of_device_id lpc18xx_dwmac_match[] = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
index 309d99536a2c..7fdd1760a74c 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson.c
@@ -64,18 +64,31 @@ static int meson6_dwmac_probe(struct platform_device *pdev)
64 return PTR_ERR(plat_dat); 64 return PTR_ERR(plat_dat);
65 65
66 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); 66 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
67 if (!dwmac) 67 if (!dwmac) {
68 return -ENOMEM; 68 ret = -ENOMEM;
69 goto err_remove_config_dt;
70 }
69 71
70 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 72 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
71 dwmac->reg = devm_ioremap_resource(&pdev->dev, res); 73 dwmac->reg = devm_ioremap_resource(&pdev->dev, res);
72 if (IS_ERR(dwmac->reg)) 74 if (IS_ERR(dwmac->reg)) {
73 return PTR_ERR(dwmac->reg); 75 ret = PTR_ERR(dwmac->reg);
76 goto err_remove_config_dt;
77 }
74 78
75 plat_dat->bsp_priv = dwmac; 79 plat_dat->bsp_priv = dwmac;
76 plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed; 80 plat_dat->fix_mac_speed = meson6_dwmac_fix_mac_speed;
77 81
78 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 82 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
83 if (ret)
84 goto err_remove_config_dt;
85
86 return 0;
87
88err_remove_config_dt:
89 stmmac_remove_config_dt(pdev, plat_dat);
90
91 return ret;
79} 92}
80 93
81static const struct of_device_id meson6_dwmac_match[] = { 94static const struct of_device_id meson6_dwmac_match[] = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
index 250e4ceafc8d..ffaed1f35efe 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-meson8b.c
@@ -264,32 +264,48 @@ static int meson8b_dwmac_probe(struct platform_device *pdev)
264 return PTR_ERR(plat_dat); 264 return PTR_ERR(plat_dat);
265 265
266 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); 266 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
267 if (!dwmac) 267 if (!dwmac) {
268 return -ENOMEM; 268 ret = -ENOMEM;
269 goto err_remove_config_dt;
270 }
269 271
270 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 272 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
271 dwmac->regs = devm_ioremap_resource(&pdev->dev, res); 273 dwmac->regs = devm_ioremap_resource(&pdev->dev, res);
272 if (IS_ERR(dwmac->regs)) 274 if (IS_ERR(dwmac->regs)) {
273 return PTR_ERR(dwmac->regs); 275 ret = PTR_ERR(dwmac->regs);
276 goto err_remove_config_dt;
277 }
274 278
275 dwmac->pdev = pdev; 279 dwmac->pdev = pdev;
276 dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node); 280 dwmac->phy_mode = of_get_phy_mode(pdev->dev.of_node);
277 if (dwmac->phy_mode < 0) { 281 if (dwmac->phy_mode < 0) {
278 dev_err(&pdev->dev, "missing phy-mode property\n"); 282 dev_err(&pdev->dev, "missing phy-mode property\n");
279 return -EINVAL; 283 ret = -EINVAL;
284 goto err_remove_config_dt;
280 } 285 }
281 286
282 ret = meson8b_init_clk(dwmac); 287 ret = meson8b_init_clk(dwmac);
283 if (ret) 288 if (ret)
284 return ret; 289 goto err_remove_config_dt;
285 290
286 ret = meson8b_init_prg_eth(dwmac); 291 ret = meson8b_init_prg_eth(dwmac);
287 if (ret) 292 if (ret)
288 return ret; 293 goto err_remove_config_dt;
289 294
290 plat_dat->bsp_priv = dwmac; 295 plat_dat->bsp_priv = dwmac;
291 296
292 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 297 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
298 if (ret)
299 goto err_clk_disable;
300
301 return 0;
302
303err_clk_disable:
304 clk_disable_unprepare(dwmac->m25_div_clk);
305err_remove_config_dt:
306 stmmac_remove_config_dt(pdev, plat_dat);
307
308 return ret;
293} 309}
294 310
295static int meson8b_dwmac_remove(struct platform_device *pdev) 311static int meson8b_dwmac_remove(struct platform_device *pdev)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 3740a4417fa0..d80c88bd2bba 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -981,14 +981,27 @@ static int rk_gmac_probe(struct platform_device *pdev)
981 plat_dat->resume = rk_gmac_resume; 981 plat_dat->resume = rk_gmac_resume;
982 982
983 plat_dat->bsp_priv = rk_gmac_setup(pdev, data); 983 plat_dat->bsp_priv = rk_gmac_setup(pdev, data);
984 if (IS_ERR(plat_dat->bsp_priv)) 984 if (IS_ERR(plat_dat->bsp_priv)) {
985 return PTR_ERR(plat_dat->bsp_priv); 985 ret = PTR_ERR(plat_dat->bsp_priv);
986 goto err_remove_config_dt;
987 }
986 988
987 ret = rk_gmac_init(pdev, plat_dat->bsp_priv); 989 ret = rk_gmac_init(pdev, plat_dat->bsp_priv);
988 if (ret) 990 if (ret)
989 return ret; 991 goto err_remove_config_dt;
992
993 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
994 if (ret)
995 goto err_gmac_exit;
996
997 return 0;
998
999err_gmac_exit:
1000 rk_gmac_exit(pdev, plat_dat->bsp_priv);
1001err_remove_config_dt:
1002 stmmac_remove_config_dt(pdev, plat_dat);
990 1003
991 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 1004 return ret;
992} 1005}
993 1006
994static const struct of_device_id rk_gmac_dwmac_match[] = { 1007static const struct of_device_id rk_gmac_dwmac_match[] = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
index bec6963ac71e..0c420e97de1e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
@@ -304,6 +304,8 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
304 struct device *dev = &pdev->dev; 304 struct device *dev = &pdev->dev;
305 int ret; 305 int ret;
306 struct socfpga_dwmac *dwmac; 306 struct socfpga_dwmac *dwmac;
307 struct net_device *ndev;
308 struct stmmac_priv *stpriv;
307 309
308 ret = stmmac_get_platform_resources(pdev, &stmmac_res); 310 ret = stmmac_get_platform_resources(pdev, &stmmac_res);
309 if (ret) 311 if (ret)
@@ -314,32 +316,43 @@ static int socfpga_dwmac_probe(struct platform_device *pdev)
314 return PTR_ERR(plat_dat); 316 return PTR_ERR(plat_dat);
315 317
316 dwmac = devm_kzalloc(dev, sizeof(*dwmac), GFP_KERNEL); 318 dwmac = devm_kzalloc(dev, sizeof(*dwmac), GFP_KERNEL);
317 if (!dwmac) 319 if (!dwmac) {
318 return -ENOMEM; 320 ret = -ENOMEM;
321 goto err_remove_config_dt;
322 }
319 323
320 ret = socfpga_dwmac_parse_data(dwmac, dev); 324 ret = socfpga_dwmac_parse_data(dwmac, dev);
321 if (ret) { 325 if (ret) {
322 dev_err(dev, "Unable to parse OF data\n"); 326 dev_err(dev, "Unable to parse OF data\n");
323 return ret; 327 goto err_remove_config_dt;
324 } 328 }
325 329
326 plat_dat->bsp_priv = dwmac; 330 plat_dat->bsp_priv = dwmac;
327 plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed; 331 plat_dat->fix_mac_speed = socfpga_dwmac_fix_mac_speed;
328 332
329 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 333 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
334 if (ret)
335 goto err_remove_config_dt;
330 336
331 if (!ret) { 337 ndev = platform_get_drvdata(pdev);
332 struct net_device *ndev = platform_get_drvdata(pdev); 338 stpriv = netdev_priv(ndev);
333 struct stmmac_priv *stpriv = netdev_priv(ndev);
334 339
335 /* The socfpga driver needs to control the stmmac reset to 340 /* The socfpga driver needs to control the stmmac reset to set the phy
336 * set the phy mode. Create a copy of the core reset handel 341 * mode. Create a copy of the core reset handle so it can be used by
337 * so it can be used by the driver later. 342 * the driver later.
338 */ 343 */
339 dwmac->stmmac_rst = stpriv->stmmac_rst; 344 dwmac->stmmac_rst = stpriv->stmmac_rst;
340 345
341 ret = socfpga_dwmac_set_phy_mode(dwmac); 346 ret = socfpga_dwmac_set_phy_mode(dwmac);
342 } 347 if (ret)
348 goto err_dvr_remove;
349
350 return 0;
351
352err_dvr_remove:
353 stmmac_dvr_remove(&pdev->dev);
354err_remove_config_dt:
355 stmmac_remove_config_dt(pdev, plat_dat);
343 356
344 return ret; 357 return ret;
345} 358}
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
index 58c05acc2aab..060b98c37a85 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sti.c
@@ -345,13 +345,15 @@ static int sti_dwmac_probe(struct platform_device *pdev)
345 return PTR_ERR(plat_dat); 345 return PTR_ERR(plat_dat);
346 346
347 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); 347 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
348 if (!dwmac) 348 if (!dwmac) {
349 return -ENOMEM; 349 ret = -ENOMEM;
350 goto err_remove_config_dt;
351 }
350 352
351 ret = sti_dwmac_parse_data(dwmac, pdev); 353 ret = sti_dwmac_parse_data(dwmac, pdev);
352 if (ret) { 354 if (ret) {
353 dev_err(&pdev->dev, "Unable to parse OF data\n"); 355 dev_err(&pdev->dev, "Unable to parse OF data\n");
354 return ret; 356 goto err_remove_config_dt;
355 } 357 }
356 358
357 dwmac->fix_retime_src = data->fix_retime_src; 359 dwmac->fix_retime_src = data->fix_retime_src;
@@ -363,9 +365,20 @@ static int sti_dwmac_probe(struct platform_device *pdev)
363 365
364 ret = sti_dwmac_init(pdev, plat_dat->bsp_priv); 366 ret = sti_dwmac_init(pdev, plat_dat->bsp_priv);
365 if (ret) 367 if (ret)
366 return ret; 368 goto err_remove_config_dt;
369
370 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
371 if (ret)
372 goto err_dwmac_exit;
373
374 return 0;
375
376err_dwmac_exit:
377 sti_dwmac_exit(pdev, plat_dat->bsp_priv);
378err_remove_config_dt:
379 stmmac_remove_config_dt(pdev, plat_dat);
367 380
368 return stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 381 return ret;
369} 382}
370 383
371static const struct sti_dwmac_of_data stih4xx_dwmac_data = { 384static const struct sti_dwmac_of_data stih4xx_dwmac_data = {
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
index e5a926b8bee7..61cb24810d10 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-stm32.c
@@ -107,24 +107,33 @@ static int stm32_dwmac_probe(struct platform_device *pdev)
107 return PTR_ERR(plat_dat); 107 return PTR_ERR(plat_dat);
108 108
109 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL); 109 dwmac = devm_kzalloc(&pdev->dev, sizeof(*dwmac), GFP_KERNEL);
110 if (!dwmac) 110 if (!dwmac) {
111 return -ENOMEM; 111 ret = -ENOMEM;
112 goto err_remove_config_dt;
113 }
112 114
113 ret = stm32_dwmac_parse_data(dwmac, &pdev->dev); 115 ret = stm32_dwmac_parse_data(dwmac, &pdev->dev);
114 if (ret) { 116 if (ret) {
115 dev_err(&pdev->dev, "Unable to parse OF data\n"); 117 dev_err(&pdev->dev, "Unable to parse OF data\n");
116 return ret; 118 goto err_remove_config_dt;
117 } 119 }
118 120
119 plat_dat->bsp_priv = dwmac; 121 plat_dat->bsp_priv = dwmac;
120 122
121 ret = stm32_dwmac_init(plat_dat); 123 ret = stm32_dwmac_init(plat_dat);
122 if (ret) 124 if (ret)
123 return ret; 125 goto err_remove_config_dt;
124 126
125 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 127 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
126 if (ret) 128 if (ret)
127 stm32_dwmac_clk_disable(dwmac); 129 goto err_clk_disable;
130
131 return 0;
132
133err_clk_disable:
134 stm32_dwmac_clk_disable(dwmac);
135err_remove_config_dt:
136 stmmac_remove_config_dt(pdev, plat_dat);
128 137
129 return ret; 138 return ret;
130} 139}
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
index adff46375a32..d07520fb969e 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
@@ -120,22 +120,27 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
120 return PTR_ERR(plat_dat); 120 return PTR_ERR(plat_dat);
121 121
122 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL); 122 gmac = devm_kzalloc(dev, sizeof(*gmac), GFP_KERNEL);
123 if (!gmac) 123 if (!gmac) {
124 return -ENOMEM; 124 ret = -ENOMEM;
125 goto err_remove_config_dt;
126 }
125 127
126 gmac->interface = of_get_phy_mode(dev->of_node); 128 gmac->interface = of_get_phy_mode(dev->of_node);
127 129
128 gmac->tx_clk = devm_clk_get(dev, "allwinner_gmac_tx"); 130 gmac->tx_clk = devm_clk_get(dev, "allwinner_gmac_tx");
129 if (IS_ERR(gmac->tx_clk)) { 131 if (IS_ERR(gmac->tx_clk)) {
130 dev_err(dev, "could not get tx clock\n"); 132 dev_err(dev, "could not get tx clock\n");
131 return PTR_ERR(gmac->tx_clk); 133 ret = PTR_ERR(gmac->tx_clk);
134 goto err_remove_config_dt;
132 } 135 }
133 136
134 /* Optional regulator for PHY */ 137 /* Optional regulator for PHY */
135 gmac->regulator = devm_regulator_get_optional(dev, "phy"); 138 gmac->regulator = devm_regulator_get_optional(dev, "phy");
136 if (IS_ERR(gmac->regulator)) { 139 if (IS_ERR(gmac->regulator)) {
137 if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER) 140 if (PTR_ERR(gmac->regulator) == -EPROBE_DEFER) {
138 return -EPROBE_DEFER; 141 ret = -EPROBE_DEFER;
142 goto err_remove_config_dt;
143 }
139 dev_info(dev, "no regulator found\n"); 144 dev_info(dev, "no regulator found\n");
140 gmac->regulator = NULL; 145 gmac->regulator = NULL;
141 } 146 }
@@ -151,11 +156,18 @@ static int sun7i_gmac_probe(struct platform_device *pdev)
151 156
152 ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv); 157 ret = sun7i_gmac_init(pdev, plat_dat->bsp_priv);
153 if (ret) 158 if (ret)
154 return ret; 159 goto err_remove_config_dt;
155 160
156 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res); 161 ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
157 if (ret) 162 if (ret)
158 sun7i_gmac_exit(pdev, plat_dat->bsp_priv); 163 goto err_gmac_exit;
164
165 return 0;
166
167err_gmac_exit:
168 sun7i_gmac_exit(pdev, plat_dat->bsp_priv);
169err_remove_config_dt:
170 stmmac_remove_config_dt(pdev, plat_dat);
159 171
160 return ret; 172 return ret;
161} 173}
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c
index 990746955216..f35385266fbf 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac1000_dma.c
@@ -43,9 +43,11 @@ static void dwmac1000_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
43 if (axi->axi_xit_frm) 43 if (axi->axi_xit_frm)
44 value |= DMA_AXI_LPI_XIT_FRM; 44 value |= DMA_AXI_LPI_XIT_FRM;
45 45
46 value &= ~DMA_AXI_WR_OSR_LMT;
46 value |= (axi->axi_wr_osr_lmt & DMA_AXI_WR_OSR_LMT_MASK) << 47 value |= (axi->axi_wr_osr_lmt & DMA_AXI_WR_OSR_LMT_MASK) <<
47 DMA_AXI_WR_OSR_LMT_SHIFT; 48 DMA_AXI_WR_OSR_LMT_SHIFT;
48 49
50 value &= ~DMA_AXI_RD_OSR_LMT;
49 value |= (axi->axi_rd_osr_lmt & DMA_AXI_RD_OSR_LMT_MASK) << 51 value |= (axi->axi_rd_osr_lmt & DMA_AXI_RD_OSR_LMT_MASK) <<
50 DMA_AXI_RD_OSR_LMT_SHIFT; 52 DMA_AXI_RD_OSR_LMT_SHIFT;
51 53
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
index a1b17cd7886b..a601f8d43b75 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.c
@@ -123,22 +123,29 @@ static int dwmac4_wrback_get_rx_status(void *data, struct stmmac_extra_stats *x,
123 x->ipv4_pkt_rcvd++; 123 x->ipv4_pkt_rcvd++;
124 if (rdes1 & RDES1_IPV6_HEADER) 124 if (rdes1 & RDES1_IPV6_HEADER)
125 x->ipv6_pkt_rcvd++; 125 x->ipv6_pkt_rcvd++;
126 if (message_type == RDES_EXT_SYNC) 126
127 x->rx_msg_type_sync++; 127 if (message_type == RDES_EXT_NO_PTP)
128 x->no_ptp_rx_msg_type_ext++;
129 else if (message_type == RDES_EXT_SYNC)
130 x->ptp_rx_msg_type_sync++;
128 else if (message_type == RDES_EXT_FOLLOW_UP) 131 else if (message_type == RDES_EXT_FOLLOW_UP)
129 x->rx_msg_type_follow_up++; 132 x->ptp_rx_msg_type_follow_up++;
130 else if (message_type == RDES_EXT_DELAY_REQ) 133 else if (message_type == RDES_EXT_DELAY_REQ)
131 x->rx_msg_type_delay_req++; 134 x->ptp_rx_msg_type_delay_req++;
132 else if (message_type == RDES_EXT_DELAY_RESP) 135 else if (message_type == RDES_EXT_DELAY_RESP)
133 x->rx_msg_type_delay_resp++; 136 x->ptp_rx_msg_type_delay_resp++;
134 else if (message_type == RDES_EXT_PDELAY_REQ) 137 else if (message_type == RDES_EXT_PDELAY_REQ)
135 x->rx_msg_type_pdelay_req++; 138 x->ptp_rx_msg_type_pdelay_req++;
136 else if (message_type == RDES_EXT_PDELAY_RESP) 139 else if (message_type == RDES_EXT_PDELAY_RESP)
137 x->rx_msg_type_pdelay_resp++; 140 x->ptp_rx_msg_type_pdelay_resp++;
138 else if (message_type == RDES_EXT_PDELAY_FOLLOW_UP) 141 else if (message_type == RDES_EXT_PDELAY_FOLLOW_UP)
139 x->rx_msg_type_pdelay_follow_up++; 142 x->ptp_rx_msg_type_pdelay_follow_up++;
140 else 143 else if (message_type == RDES_PTP_ANNOUNCE)
141 x->rx_msg_type_ext_no_ptp++; 144 x->ptp_rx_msg_type_announce++;
145 else if (message_type == RDES_PTP_MANAGEMENT)
146 x->ptp_rx_msg_type_management++;
147 else if (message_type == RDES_PTP_PKT_RESERVED_TYPE)
148 x->ptp_rx_msg_pkt_reserved_type++;
142 149
143 if (rdes1 & RDES1_PTP_PACKET_TYPE) 150 if (rdes1 & RDES1_PTP_PACKET_TYPE)
144 x->ptp_frame_type++; 151 x->ptp_frame_type++;
@@ -204,14 +211,18 @@ static void dwmac4_rd_enable_tx_timestamp(struct dma_desc *p)
204 211
205static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p) 212static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p)
206{ 213{
207 return (p->des3 & TDES3_TIMESTAMP_STATUS) 214 /* Context type from W/B descriptor must be zero */
208 >> TDES3_TIMESTAMP_STATUS_SHIFT; 215 if (p->des3 & TDES3_CONTEXT_TYPE)
216 return -EINVAL;
217
218 /* Tx Timestamp Status is 1 so des0 and des1'll have valid values */
219 if (p->des3 & TDES3_TIMESTAMP_STATUS)
220 return 0;
221
222 return 1;
209} 223}
210 224
211/* NOTE: For RX CTX bit has to be checked before 225static inline u64 dwmac4_get_timestamp(void *desc, u32 ats)
212 * HAVE a specific function for TX and another one for RX
213 */
214static u64 dwmac4_wrback_get_timestamp(void *desc, u32 ats)
215{ 226{
216 struct dma_desc *p = (struct dma_desc *)desc; 227 struct dma_desc *p = (struct dma_desc *)desc;
217 u64 ns; 228 u64 ns;
@@ -223,12 +234,54 @@ static u64 dwmac4_wrback_get_timestamp(void *desc, u32 ats)
223 return ns; 234 return ns;
224} 235}
225 236
226static int dwmac4_context_get_rx_timestamp_status(void *desc, u32 ats) 237static int dwmac4_rx_check_timestamp(void *desc)
238{
239 struct dma_desc *p = (struct dma_desc *)desc;
240 u32 own, ctxt;
241 int ret = 1;
242
243 own = p->des3 & RDES3_OWN;
244 ctxt = ((p->des3 & RDES3_CONTEXT_DESCRIPTOR)
245 >> RDES3_CONTEXT_DESCRIPTOR_SHIFT);
246
247 if (likely(!own && ctxt)) {
248 if ((p->des0 == 0xffffffff) && (p->des1 == 0xffffffff))
249 /* Corrupted value */
250 ret = -EINVAL;
251 else
252 /* A valid Timestamp is ready to be read */
253 ret = 0;
254 }
255
256 /* Timestamp not ready */
257 return ret;
258}
259
260static int dwmac4_wrback_get_rx_timestamp_status(void *desc, u32 ats)
227{ 261{
228 struct dma_desc *p = (struct dma_desc *)desc; 262 struct dma_desc *p = (struct dma_desc *)desc;
263 int ret = -EINVAL;
264
265 /* Get the status from normal w/b descriptor */
266 if (likely(p->des3 & TDES3_RS1V)) {
267 if (likely(p->des1 & RDES1_TIMESTAMP_AVAILABLE)) {
268 int i = 0;
269
270 /* Check if timestamp is OK from context descriptor */
271 do {
272 ret = dwmac4_rx_check_timestamp(desc);
273 if (ret < 0)
274 goto exit;
275 i++;
229 276
230 return (p->des1 & RDES1_TIMESTAMP_AVAILABLE) 277 } while ((ret == 1) || (i < 10));
231 >> RDES1_TIMESTAMP_AVAILABLE_SHIFT; 278
279 if (i == 10)
280 ret = -EBUSY;
281 }
282 }
283exit:
284 return ret;
232} 285}
233 286
234static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic, 287static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
@@ -373,8 +426,8 @@ const struct stmmac_desc_ops dwmac4_desc_ops = {
373 .get_rx_frame_len = dwmac4_wrback_get_rx_frame_len, 426 .get_rx_frame_len = dwmac4_wrback_get_rx_frame_len,
374 .enable_tx_timestamp = dwmac4_rd_enable_tx_timestamp, 427 .enable_tx_timestamp = dwmac4_rd_enable_tx_timestamp,
375 .get_tx_timestamp_status = dwmac4_wrback_get_tx_timestamp_status, 428 .get_tx_timestamp_status = dwmac4_wrback_get_tx_timestamp_status,
376 .get_timestamp = dwmac4_wrback_get_timestamp, 429 .get_rx_timestamp_status = dwmac4_wrback_get_rx_timestamp_status,
377 .get_rx_timestamp_status = dwmac4_context_get_rx_timestamp_status, 430 .get_timestamp = dwmac4_get_timestamp,
378 .set_tx_ic = dwmac4_rd_set_tx_ic, 431 .set_tx_ic = dwmac4_rd_set_tx_ic,
379 .prepare_tx_desc = dwmac4_rd_prepare_tx_desc, 432 .prepare_tx_desc = dwmac4_rd_prepare_tx_desc,
380 .prepare_tso_tx_desc = dwmac4_rd_prepare_tso_tx_desc, 433 .prepare_tso_tx_desc = dwmac4_rd_prepare_tso_tx_desc,
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h
index 0902a2edeaa9..9736c505211a 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_descs.h
@@ -59,10 +59,13 @@
59#define TDES3_CTXT_TCMSSV BIT(26) 59#define TDES3_CTXT_TCMSSV BIT(26)
60 60
61/* TDES3 Common */ 61/* TDES3 Common */
62#define TDES3_RS1V BIT(26)
63#define TDES3_RS1V_SHIFT 26
62#define TDES3_LAST_DESCRIPTOR BIT(28) 64#define TDES3_LAST_DESCRIPTOR BIT(28)
63#define TDES3_LAST_DESCRIPTOR_SHIFT 28 65#define TDES3_LAST_DESCRIPTOR_SHIFT 28
64#define TDES3_FIRST_DESCRIPTOR BIT(29) 66#define TDES3_FIRST_DESCRIPTOR BIT(29)
65#define TDES3_CONTEXT_TYPE BIT(30) 67#define TDES3_CONTEXT_TYPE BIT(30)
68#define TDES3_CONTEXT_TYPE_SHIFT 30
66 69
67/* TDS3 use for both format (read and write back) */ 70/* TDS3 use for both format (read and write back) */
68#define TDES3_OWN BIT(31) 71#define TDES3_OWN BIT(31)
@@ -117,6 +120,7 @@
117#define RDES3_LAST_DESCRIPTOR BIT(28) 120#define RDES3_LAST_DESCRIPTOR BIT(28)
118#define RDES3_FIRST_DESCRIPTOR BIT(29) 121#define RDES3_FIRST_DESCRIPTOR BIT(29)
119#define RDES3_CONTEXT_DESCRIPTOR BIT(30) 122#define RDES3_CONTEXT_DESCRIPTOR BIT(30)
123#define RDES3_CONTEXT_DESCRIPTOR_SHIFT 30
120 124
121/* RDES3 (read format) */ 125/* RDES3 (read format) */
122#define RDES3_BUFFER1_VALID_ADDR BIT(24) 126#define RDES3_BUFFER1_VALID_ADDR BIT(24)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
index 116151cd6a95..32bc2fc73cdc 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac4_dma.c
@@ -30,9 +30,11 @@ static void dwmac4_dma_axi(void __iomem *ioaddr, struct stmmac_axi *axi)
30 if (axi->axi_xit_frm) 30 if (axi->axi_xit_frm)
31 value |= DMA_AXI_LPI_XIT_FRM; 31 value |= DMA_AXI_LPI_XIT_FRM;
32 32
33 value &= ~DMA_AXI_WR_OSR_LMT;
33 value |= (axi->axi_wr_osr_lmt & DMA_AXI_OSR_MAX) << 34 value |= (axi->axi_wr_osr_lmt & DMA_AXI_OSR_MAX) <<
34 DMA_AXI_WR_OSR_LMT_SHIFT; 35 DMA_AXI_WR_OSR_LMT_SHIFT;
35 36
37 value &= ~DMA_AXI_RD_OSR_LMT;
36 value |= (axi->axi_rd_osr_lmt & DMA_AXI_OSR_MAX) << 38 value |= (axi->axi_rd_osr_lmt & DMA_AXI_OSR_MAX) <<
37 DMA_AXI_RD_OSR_LMT_SHIFT; 39 DMA_AXI_RD_OSR_LMT_SHIFT;
38 40
diff --git a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
index 38f19c99cf59..e75549327c34 100644
--- a/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
+++ b/drivers/net/ethernet/stmicro/stmmac/enh_desc.c
@@ -150,22 +150,30 @@ static void enh_desc_get_ext_status(void *data, struct stmmac_extra_stats *x,
150 x->ipv4_pkt_rcvd++; 150 x->ipv4_pkt_rcvd++;
151 if (rdes4 & ERDES4_IPV6_PKT_RCVD) 151 if (rdes4 & ERDES4_IPV6_PKT_RCVD)
152 x->ipv6_pkt_rcvd++; 152 x->ipv6_pkt_rcvd++;
153 if (message_type == RDES_EXT_SYNC) 153
154 x->rx_msg_type_sync++; 154 if (message_type == RDES_EXT_NO_PTP)
155 x->no_ptp_rx_msg_type_ext++;
156 else if (message_type == RDES_EXT_SYNC)
157 x->ptp_rx_msg_type_sync++;
155 else if (message_type == RDES_EXT_FOLLOW_UP) 158 else if (message_type == RDES_EXT_FOLLOW_UP)
156 x->rx_msg_type_follow_up++; 159 x->ptp_rx_msg_type_follow_up++;
157 else if (message_type == RDES_EXT_DELAY_REQ) 160 else if (message_type == RDES_EXT_DELAY_REQ)
158 x->rx_msg_type_delay_req++; 161 x->ptp_rx_msg_type_delay_req++;
159 else if (message_type == RDES_EXT_DELAY_RESP) 162 else if (message_type == RDES_EXT_DELAY_RESP)
160 x->rx_msg_type_delay_resp++; 163 x->ptp_rx_msg_type_delay_resp++;
161 else if (message_type == RDES_EXT_PDELAY_REQ) 164 else if (message_type == RDES_EXT_PDELAY_REQ)
162 x->rx_msg_type_pdelay_req++; 165 x->ptp_rx_msg_type_pdelay_req++;
163 else if (message_type == RDES_EXT_PDELAY_RESP) 166 else if (message_type == RDES_EXT_PDELAY_RESP)
164 x->rx_msg_type_pdelay_resp++; 167 x->ptp_rx_msg_type_pdelay_resp++;
165 else if (message_type == RDES_EXT_PDELAY_FOLLOW_UP) 168 else if (message_type == RDES_EXT_PDELAY_FOLLOW_UP)
166 x->rx_msg_type_pdelay_follow_up++; 169 x->ptp_rx_msg_type_pdelay_follow_up++;
167 else 170 else if (message_type == RDES_PTP_ANNOUNCE)
168 x->rx_msg_type_ext_no_ptp++; 171 x->ptp_rx_msg_type_announce++;
172 else if (message_type == RDES_PTP_MANAGEMENT)
173 x->ptp_rx_msg_type_management++;
174 else if (message_type == RDES_PTP_PKT_RESERVED_TYPE)
175 x->ptp_rx_msg_pkt_reserved_type++;
176
169 if (rdes4 & ERDES4_PTP_FRAME_TYPE) 177 if (rdes4 & ERDES4_PTP_FRAME_TYPE)
170 x->ptp_frame_type++; 178 x->ptp_frame_type++;
171 if (rdes4 & ERDES4_PTP_VER) 179 if (rdes4 & ERDES4_PTP_VER)
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
index b15fc55f1b96..4d2a759b8465 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
@@ -129,6 +129,7 @@ struct stmmac_priv {
129 int irq_wake; 129 int irq_wake;
130 spinlock_t ptp_lock; 130 spinlock_t ptp_lock;
131 void __iomem *mmcaddr; 131 void __iomem *mmcaddr;
132 void __iomem *ptpaddr;
132 u32 rx_tail_addr; 133 u32 rx_tail_addr;
133 u32 tx_tail_addr; 134 u32 tx_tail_addr;
134 u32 mss; 135 u32 mss;
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
index 1e06173fc9d7..c5d0142adda2 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ethtool.c
@@ -115,14 +115,17 @@ static const struct stmmac_stats stmmac_gstrings_stats[] = {
115 STMMAC_STAT(ip_csum_bypassed), 115 STMMAC_STAT(ip_csum_bypassed),
116 STMMAC_STAT(ipv4_pkt_rcvd), 116 STMMAC_STAT(ipv4_pkt_rcvd),
117 STMMAC_STAT(ipv6_pkt_rcvd), 117 STMMAC_STAT(ipv6_pkt_rcvd),
118 STMMAC_STAT(rx_msg_type_ext_no_ptp), 118 STMMAC_STAT(no_ptp_rx_msg_type_ext),
119 STMMAC_STAT(rx_msg_type_sync), 119 STMMAC_STAT(ptp_rx_msg_type_sync),
120 STMMAC_STAT(rx_msg_type_follow_up), 120 STMMAC_STAT(ptp_rx_msg_type_follow_up),
121 STMMAC_STAT(rx_msg_type_delay_req), 121 STMMAC_STAT(ptp_rx_msg_type_delay_req),
122 STMMAC_STAT(rx_msg_type_delay_resp), 122 STMMAC_STAT(ptp_rx_msg_type_delay_resp),
123 STMMAC_STAT(rx_msg_type_pdelay_req), 123 STMMAC_STAT(ptp_rx_msg_type_pdelay_req),
124 STMMAC_STAT(rx_msg_type_pdelay_resp), 124 STMMAC_STAT(ptp_rx_msg_type_pdelay_resp),
125 STMMAC_STAT(rx_msg_type_pdelay_follow_up), 125 STMMAC_STAT(ptp_rx_msg_type_pdelay_follow_up),
126 STMMAC_STAT(ptp_rx_msg_type_announce),
127 STMMAC_STAT(ptp_rx_msg_type_management),
128 STMMAC_STAT(ptp_rx_msg_pkt_reserved_type),
126 STMMAC_STAT(ptp_frame_type), 129 STMMAC_STAT(ptp_frame_type),
127 STMMAC_STAT(ptp_ver), 130 STMMAC_STAT(ptp_ver),
128 STMMAC_STAT(timestamp_dropped), 131 STMMAC_STAT(timestamp_dropped),
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
index a77f68918010..10d6059b2f26 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_hwtstamp.c
@@ -34,21 +34,29 @@ static void stmmac_config_hw_tstamping(void __iomem *ioaddr, u32 data)
34} 34}
35 35
36static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr, 36static u32 stmmac_config_sub_second_increment(void __iomem *ioaddr,
37 u32 ptp_clock) 37 u32 ptp_clock, int gmac4)
38{ 38{
39 u32 value = readl(ioaddr + PTP_TCR); 39 u32 value = readl(ioaddr + PTP_TCR);
40 unsigned long data; 40 unsigned long data;
41 41
42 /* Convert the ptp_clock to nano second 42 /* For GMAC3.x, 4.x versions, convert the ptp_clock to nano second
43 * formula = (2/ptp_clock) * 1000000000 43 * formula = (1/ptp_clock) * 1000000000
44 * where, ptp_clock = 50MHz. 44 * where ptp_clock is 50MHz if fine method is used to update system
45 */ 45 */
46 data = (2000000000ULL / ptp_clock); 46 if (value & PTP_TCR_TSCFUPDT)
47 data = (1000000000ULL / 50000000);
48 else
49 data = (1000000000ULL / ptp_clock);
47 50
48 /* 0.465ns accuracy */ 51 /* 0.465ns accuracy */
49 if (!(value & PTP_TCR_TSCTRLSSR)) 52 if (!(value & PTP_TCR_TSCTRLSSR))
50 data = (data * 1000) / 465; 53 data = (data * 1000) / 465;
51 54
55 data &= PTP_SSIR_SSINC_MASK;
56
57 if (gmac4)
58 data = data << GMAC4_PTP_SSIR_SSINC_SHIFT;
59
52 writel(data, ioaddr + PTP_SSIR); 60 writel(data, ioaddr + PTP_SSIR);
53 61
54 return data; 62 return data;
@@ -104,14 +112,30 @@ static int stmmac_config_addend(void __iomem *ioaddr, u32 addend)
104} 112}
105 113
106static int stmmac_adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec, 114static int stmmac_adjust_systime(void __iomem *ioaddr, u32 sec, u32 nsec,
107 int add_sub) 115 int add_sub, int gmac4)
108{ 116{
109 u32 value; 117 u32 value;
110 int limit; 118 int limit;
111 119
120 if (add_sub) {
121 /* If the new sec value needs to be subtracted with
122 * the system time, then MAC_STSUR reg should be
123 * programmed with (2^32 – <new_sec_value>)
124 */
125 if (gmac4)
126 sec = (100000000ULL - sec);
127
128 value = readl(ioaddr + PTP_TCR);
129 if (value & PTP_TCR_TSCTRLSSR)
130 nsec = (PTP_DIGITAL_ROLLOVER_MODE - nsec);
131 else
132 nsec = (PTP_BINARY_ROLLOVER_MODE - nsec);
133 }
134
112 writel(sec, ioaddr + PTP_STSUR); 135 writel(sec, ioaddr + PTP_STSUR);
113 writel(((add_sub << PTP_STNSUR_ADDSUB_SHIFT) | nsec), 136 value = (add_sub << PTP_STNSUR_ADDSUB_SHIFT) | nsec;
114 ioaddr + PTP_STNSUR); 137 writel(value, ioaddr + PTP_STNSUR);
138
115 /* issue command to initialize the system time value */ 139 /* issue command to initialize the system time value */
116 value = readl(ioaddr + PTP_TCR); 140 value = readl(ioaddr + PTP_TCR);
117 value |= PTP_TCR_TSUPDT; 141 value |= PTP_TCR_TSUPDT;
@@ -134,8 +158,9 @@ static u64 stmmac_get_systime(void __iomem *ioaddr)
134{ 158{
135 u64 ns; 159 u64 ns;
136 160
161 /* Get the TSSS value */
137 ns = readl(ioaddr + PTP_STNSR); 162 ns = readl(ioaddr + PTP_STNSR);
138 /* convert sec time value to nanosecond */ 163 /* Get the TSS and convert sec time value to nanosecond */
139 ns += readl(ioaddr + PTP_STSR) * 1000000000ULL; 164 ns += readl(ioaddr + PTP_STSR) * 1000000000ULL;
140 165
141 return ns; 166 return ns;
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 48e71fad4210..caf069a465f2 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -340,18 +340,17 @@ out:
340 340
341/* stmmac_get_tx_hwtstamp - get HW TX timestamps 341/* stmmac_get_tx_hwtstamp - get HW TX timestamps
342 * @priv: driver private structure 342 * @priv: driver private structure
343 * @entry : descriptor index to be used. 343 * @p : descriptor pointer
344 * @skb : the socket buffer 344 * @skb : the socket buffer
345 * Description : 345 * Description :
346 * This function will read timestamp from the descriptor & pass it to stack. 346 * This function will read timestamp from the descriptor & pass it to stack.
347 * and also perform some sanity checks. 347 * and also perform some sanity checks.
348 */ 348 */
349static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv, 349static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
350 unsigned int entry, struct sk_buff *skb) 350 struct dma_desc *p, struct sk_buff *skb)
351{ 351{
352 struct skb_shared_hwtstamps shhwtstamp; 352 struct skb_shared_hwtstamps shhwtstamp;
353 u64 ns; 353 u64 ns;
354 void *desc = NULL;
355 354
356 if (!priv->hwts_tx_en) 355 if (!priv->hwts_tx_en)
357 return; 356 return;
@@ -360,58 +359,55 @@ static void stmmac_get_tx_hwtstamp(struct stmmac_priv *priv,
360 if (likely(!skb || !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS))) 359 if (likely(!skb || !(skb_shinfo(skb)->tx_flags & SKBTX_IN_PROGRESS)))
361 return; 360 return;
362 361
363 if (priv->adv_ts)
364 desc = (priv->dma_etx + entry);
365 else
366 desc = (priv->dma_tx + entry);
367
368 /* check tx tstamp status */ 362 /* check tx tstamp status */
369 if (!priv->hw->desc->get_tx_timestamp_status((struct dma_desc *)desc)) 363 if (!priv->hw->desc->get_tx_timestamp_status(p)) {
370 return; 364 /* get the valid tstamp */
365 ns = priv->hw->desc->get_timestamp(p, priv->adv_ts);
371 366
372 /* get the valid tstamp */ 367 memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
373 ns = priv->hw->desc->get_timestamp(desc, priv->adv_ts); 368 shhwtstamp.hwtstamp = ns_to_ktime(ns);
374 369
375 memset(&shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); 370 netdev_info(priv->dev, "get valid TX hw timestamp %llu\n", ns);
376 shhwtstamp.hwtstamp = ns_to_ktime(ns); 371 /* pass tstamp to stack */
377 /* pass tstamp to stack */ 372 skb_tstamp_tx(skb, &shhwtstamp);
378 skb_tstamp_tx(skb, &shhwtstamp); 373 }
379 374
380 return; 375 return;
381} 376}
382 377
383/* stmmac_get_rx_hwtstamp - get HW RX timestamps 378/* stmmac_get_rx_hwtstamp - get HW RX timestamps
384 * @priv: driver private structure 379 * @priv: driver private structure
385 * @entry : descriptor index to be used. 380 * @p : descriptor pointer
381 * @np : next descriptor pointer
386 * @skb : the socket buffer 382 * @skb : the socket buffer
387 * Description : 383 * Description :
388 * This function will read received packet's timestamp from the descriptor 384 * This function will read received packet's timestamp from the descriptor
389 * and pass it to stack. It also perform some sanity checks. 385 * and pass it to stack. It also perform some sanity checks.
390 */ 386 */
391static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, 387static void stmmac_get_rx_hwtstamp(struct stmmac_priv *priv, struct dma_desc *p,
392 unsigned int entry, struct sk_buff *skb) 388 struct dma_desc *np, struct sk_buff *skb)
393{ 389{
394 struct skb_shared_hwtstamps *shhwtstamp = NULL; 390 struct skb_shared_hwtstamps *shhwtstamp = NULL;
395 u64 ns; 391 u64 ns;
396 void *desc = NULL;
397 392
398 if (!priv->hwts_rx_en) 393 if (!priv->hwts_rx_en)
399 return; 394 return;
400 395
401 if (priv->adv_ts) 396 /* Check if timestamp is available */
402 desc = (priv->dma_erx + entry); 397 if (!priv->hw->desc->get_rx_timestamp_status(p, priv->adv_ts)) {
403 else 398 /* For GMAC4, the valid timestamp is from CTX next desc. */
404 desc = (priv->dma_rx + entry); 399 if (priv->plat->has_gmac4)
405 400 ns = priv->hw->desc->get_timestamp(np, priv->adv_ts);
406 /* exit if rx tstamp is not valid */ 401 else
407 if (!priv->hw->desc->get_rx_timestamp_status(desc, priv->adv_ts)) 402 ns = priv->hw->desc->get_timestamp(p, priv->adv_ts);
408 return;
409 403
410 /* get valid tstamp */ 404 netdev_info(priv->dev, "get valid RX hw timestamp %llu\n", ns);
411 ns = priv->hw->desc->get_timestamp(desc, priv->adv_ts); 405 shhwtstamp = skb_hwtstamps(skb);
412 shhwtstamp = skb_hwtstamps(skb); 406 memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps));
413 memset(shhwtstamp, 0, sizeof(struct skb_shared_hwtstamps)); 407 shhwtstamp->hwtstamp = ns_to_ktime(ns);
414 shhwtstamp->hwtstamp = ns_to_ktime(ns); 408 } else {
409 netdev_err(priv->dev, "cannot get RX hw timestamp\n");
410 }
415} 411}
416 412
417/** 413/**
@@ -598,17 +594,18 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)
598 priv->hwts_tx_en = config.tx_type == HWTSTAMP_TX_ON; 594 priv->hwts_tx_en = config.tx_type == HWTSTAMP_TX_ON;
599 595
600 if (!priv->hwts_tx_en && !priv->hwts_rx_en) 596 if (!priv->hwts_tx_en && !priv->hwts_rx_en)
601 priv->hw->ptp->config_hw_tstamping(priv->ioaddr, 0); 597 priv->hw->ptp->config_hw_tstamping(priv->ptpaddr, 0);
602 else { 598 else {
603 value = (PTP_TCR_TSENA | PTP_TCR_TSCFUPDT | PTP_TCR_TSCTRLSSR | 599 value = (PTP_TCR_TSENA | PTP_TCR_TSCFUPDT | PTP_TCR_TSCTRLSSR |
604 tstamp_all | ptp_v2 | ptp_over_ethernet | 600 tstamp_all | ptp_v2 | ptp_over_ethernet |
605 ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en | 601 ptp_over_ipv6_udp | ptp_over_ipv4_udp | ts_event_en |
606 ts_master_en | snap_type_sel); 602 ts_master_en | snap_type_sel);
607 priv->hw->ptp->config_hw_tstamping(priv->ioaddr, value); 603 priv->hw->ptp->config_hw_tstamping(priv->ptpaddr, value);
608 604
609 /* program Sub Second Increment reg */ 605 /* program Sub Second Increment reg */
610 sec_inc = priv->hw->ptp->config_sub_second_increment( 606 sec_inc = priv->hw->ptp->config_sub_second_increment(
611 priv->ioaddr, priv->clk_ptp_rate); 607 priv->ptpaddr, priv->clk_ptp_rate,
608 priv->plat->has_gmac4);
612 temp = div_u64(1000000000ULL, sec_inc); 609 temp = div_u64(1000000000ULL, sec_inc);
613 610
614 /* calculate default added value: 611 /* calculate default added value:
@@ -618,14 +615,14 @@ static int stmmac_hwtstamp_ioctl(struct net_device *dev, struct ifreq *ifr)
618 */ 615 */
619 temp = (u64)(temp << 32); 616 temp = (u64)(temp << 32);
620 priv->default_addend = div_u64(temp, priv->clk_ptp_rate); 617 priv->default_addend = div_u64(temp, priv->clk_ptp_rate);
621 priv->hw->ptp->config_addend(priv->ioaddr, 618 priv->hw->ptp->config_addend(priv->ptpaddr,
622 priv->default_addend); 619 priv->default_addend);
623 620
624 /* initialize system time */ 621 /* initialize system time */
625 ktime_get_real_ts64(&now); 622 ktime_get_real_ts64(&now);
626 623
627 /* lower 32 bits of tv_sec are safe until y2106 */ 624 /* lower 32 bits of tv_sec are safe until y2106 */
628 priv->hw->ptp->init_systime(priv->ioaddr, (u32)now.tv_sec, 625 priv->hw->ptp->init_systime(priv->ptpaddr, (u32)now.tv_sec,
629 now.tv_nsec); 626 now.tv_nsec);
630 } 627 }
631 628
@@ -880,6 +877,13 @@ static int stmmac_init_phy(struct net_device *dev)
880 return -ENODEV; 877 return -ENODEV;
881 } 878 }
882 879
880 /* stmmac_adjust_link will change this to PHY_IGNORE_INTERRUPT to avoid
881 * subsequent PHY polling, make sure we force a link transition if
882 * we have a UP/DOWN/UP transition
883 */
884 if (phydev->is_pseudo_fixed_link)
885 phydev->irq = PHY_POLL;
886
883 pr_debug("stmmac_init_phy: %s: attached to PHY (UID 0x%x)" 887 pr_debug("stmmac_init_phy: %s: attached to PHY (UID 0x%x)"
884 " Link = %d\n", dev->name, phydev->phy_id, phydev->link); 888 " Link = %d\n", dev->name, phydev->phy_id, phydev->link);
885 889
@@ -1333,7 +1337,7 @@ static void stmmac_tx_clean(struct stmmac_priv *priv)
1333 priv->dev->stats.tx_packets++; 1337 priv->dev->stats.tx_packets++;
1334 priv->xstats.tx_pkt_n++; 1338 priv->xstats.tx_pkt_n++;
1335 } 1339 }
1336 stmmac_get_tx_hwtstamp(priv, entry, skb); 1340 stmmac_get_tx_hwtstamp(priv, p, skb);
1337 } 1341 }
1338 1342
1339 if (likely(priv->tx_skbuff_dma[entry].buf)) { 1343 if (likely(priv->tx_skbuff_dma[entry].buf)) {
@@ -1479,10 +1483,13 @@ static void stmmac_mmc_setup(struct stmmac_priv *priv)
1479 unsigned int mode = MMC_CNTRL_RESET_ON_READ | MMC_CNTRL_COUNTER_RESET | 1483 unsigned int mode = MMC_CNTRL_RESET_ON_READ | MMC_CNTRL_COUNTER_RESET |
1480 MMC_CNTRL_PRESET | MMC_CNTRL_FULL_HALF_PRESET; 1484 MMC_CNTRL_PRESET | MMC_CNTRL_FULL_HALF_PRESET;
1481 1485
1482 if (priv->synopsys_id >= DWMAC_CORE_4_00) 1486 if (priv->synopsys_id >= DWMAC_CORE_4_00) {
1487 priv->ptpaddr = priv->ioaddr + PTP_GMAC4_OFFSET;
1483 priv->mmcaddr = priv->ioaddr + MMC_GMAC4_OFFSET; 1488 priv->mmcaddr = priv->ioaddr + MMC_GMAC4_OFFSET;
1484 else 1489 } else {
1490 priv->ptpaddr = priv->ioaddr + PTP_GMAC3_X_OFFSET;
1485 priv->mmcaddr = priv->ioaddr + MMC_GMAC3_X_OFFSET; 1491 priv->mmcaddr = priv->ioaddr + MMC_GMAC3_X_OFFSET;
1492 }
1486 1493
1487 dwmac_mmc_intr_all_mask(priv->mmcaddr); 1494 dwmac_mmc_intr_all_mask(priv->mmcaddr);
1488 1495
@@ -2477,7 +2484,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
2477 if (netif_msg_rx_status(priv)) { 2484 if (netif_msg_rx_status(priv)) {
2478 void *rx_head; 2485 void *rx_head;
2479 2486
2480 pr_debug("%s: descriptor ring:\n", __func__); 2487 pr_info(">>>>>> %s: descriptor ring:\n", __func__);
2481 if (priv->extend_desc) 2488 if (priv->extend_desc)
2482 rx_head = (void *)priv->dma_erx; 2489 rx_head = (void *)priv->dma_erx;
2483 else 2490 else
@@ -2488,6 +2495,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
2488 while (count < limit) { 2495 while (count < limit) {
2489 int status; 2496 int status;
2490 struct dma_desc *p; 2497 struct dma_desc *p;
2498 struct dma_desc *np;
2491 2499
2492 if (priv->extend_desc) 2500 if (priv->extend_desc)
2493 p = (struct dma_desc *)(priv->dma_erx + entry); 2501 p = (struct dma_desc *)(priv->dma_erx + entry);
@@ -2507,9 +2515,11 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
2507 next_entry = priv->cur_rx; 2515 next_entry = priv->cur_rx;
2508 2516
2509 if (priv->extend_desc) 2517 if (priv->extend_desc)
2510 prefetch(priv->dma_erx + next_entry); 2518 np = (struct dma_desc *)(priv->dma_erx + next_entry);
2511 else 2519 else
2512 prefetch(priv->dma_rx + next_entry); 2520 np = priv->dma_rx + next_entry;
2521
2522 prefetch(np);
2513 2523
2514 if ((priv->extend_desc) && (priv->hw->desc->rx_extended_status)) 2524 if ((priv->extend_desc) && (priv->hw->desc->rx_extended_status))
2515 priv->hw->desc->rx_extended_status(&priv->dev->stats, 2525 priv->hw->desc->rx_extended_status(&priv->dev->stats,
@@ -2561,7 +2571,7 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
2561 frame_len -= ETH_FCS_LEN; 2571 frame_len -= ETH_FCS_LEN;
2562 2572
2563 if (netif_msg_rx_status(priv)) { 2573 if (netif_msg_rx_status(priv)) {
2564 pr_debug("\tdesc: %p [entry %d] buff=0x%x\n", 2574 pr_info("\tdesc: %p [entry %d] buff=0x%x\n",
2565 p, entry, des); 2575 p, entry, des);
2566 if (frame_len > ETH_FRAME_LEN) 2576 if (frame_len > ETH_FRAME_LEN)
2567 pr_debug("\tframe size %d, COE: %d\n", 2577 pr_debug("\tframe size %d, COE: %d\n",
@@ -2618,13 +2628,13 @@ static int stmmac_rx(struct stmmac_priv *priv, int limit)
2618 DMA_FROM_DEVICE); 2628 DMA_FROM_DEVICE);
2619 } 2629 }
2620 2630
2621 stmmac_get_rx_hwtstamp(priv, entry, skb);
2622
2623 if (netif_msg_pktdata(priv)) { 2631 if (netif_msg_pktdata(priv)) {
2624 pr_debug("frame received (%dbytes)", frame_len); 2632 pr_debug("frame received (%dbytes)", frame_len);
2625 print_pkt(skb->data, frame_len); 2633 print_pkt(skb->data, frame_len);
2626 } 2634 }
2627 2635
2636 stmmac_get_rx_hwtstamp(priv, p, np, skb);
2637
2628 stmmac_rx_vlan(priv->dev, skb); 2638 stmmac_rx_vlan(priv->dev, skb);
2629 2639
2630 skb->protocol = eth_type_trans(skb, priv->dev); 2640 skb->protocol = eth_type_trans(skb, priv->dev);
@@ -3406,7 +3416,6 @@ int stmmac_dvr_remove(struct device *dev)
3406 stmmac_set_mac(priv->ioaddr, false); 3416 stmmac_set_mac(priv->ioaddr, false);
3407 netif_carrier_off(ndev); 3417 netif_carrier_off(ndev);
3408 unregister_netdev(ndev); 3418 unregister_netdev(ndev);
3409 of_node_put(priv->plat->phy_node);
3410 if (priv->stmmac_rst) 3419 if (priv->stmmac_rst)
3411 reset_control_assert(priv->stmmac_rst); 3420 reset_control_assert(priv->stmmac_rst);
3412 clk_disable_unprepare(priv->pclk); 3421 clk_disable_unprepare(priv->pclk);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
index 0a0d6a86f397..ac3d39c69509 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.c
@@ -126,8 +126,10 @@ static struct stmmac_axi *stmmac_axi_setup(struct platform_device *pdev)
126 axi->axi_mb = of_property_read_bool(np, "snps,axi_mb"); 126 axi->axi_mb = of_property_read_bool(np, "snps,axi_mb");
127 axi->axi_rb = of_property_read_bool(np, "snps,axi_rb"); 127 axi->axi_rb = of_property_read_bool(np, "snps,axi_rb");
128 128
129 of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt); 129 if (of_property_read_u32(np, "snps,wr_osr_lmt", &axi->axi_wr_osr_lmt))
130 of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt); 130 axi->axi_wr_osr_lmt = 1;
131 if (of_property_read_u32(np, "snps,rd_osr_lmt", &axi->axi_rd_osr_lmt))
132 axi->axi_rd_osr_lmt = 1;
131 of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN); 133 of_property_read_u32_array(np, "snps,blen", axi->axi_blen, AXI_BLEN);
132 of_node_put(np); 134 of_node_put(np);
133 135
@@ -200,7 +202,6 @@ static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,
200/** 202/**
201 * stmmac_probe_config_dt - parse device-tree driver parameters 203 * stmmac_probe_config_dt - parse device-tree driver parameters
202 * @pdev: platform_device structure 204 * @pdev: platform_device structure
203 * @plat: driver data platform structure
204 * @mac: MAC address to use 205 * @mac: MAC address to use
205 * Description: 206 * Description:
206 * this function is to read the driver parameters from device-tree and 207 * this function is to read the driver parameters from device-tree and
@@ -306,7 +307,7 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
306 dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg), 307 dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*dma_cfg),
307 GFP_KERNEL); 308 GFP_KERNEL);
308 if (!dma_cfg) { 309 if (!dma_cfg) {
309 of_node_put(plat->phy_node); 310 stmmac_remove_config_dt(pdev, plat);
310 return ERR_PTR(-ENOMEM); 311 return ERR_PTR(-ENOMEM);
311 } 312 }
312 plat->dma_cfg = dma_cfg; 313 plat->dma_cfg = dma_cfg;
@@ -329,14 +330,37 @@ stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
329 330
330 return plat; 331 return plat;
331} 332}
333
334/**
335 * stmmac_remove_config_dt - undo the effects of stmmac_probe_config_dt()
336 * @pdev: platform_device structure
337 * @plat: driver data platform structure
338 *
339 * Release resources claimed by stmmac_probe_config_dt().
340 */
341void stmmac_remove_config_dt(struct platform_device *pdev,
342 struct plat_stmmacenet_data *plat)
343{
344 struct device_node *np = pdev->dev.of_node;
345
346 if (of_phy_is_fixed_link(np))
347 of_phy_deregister_fixed_link(np);
348 of_node_put(plat->phy_node);
349}
332#else 350#else
333struct plat_stmmacenet_data * 351struct plat_stmmacenet_data *
334stmmac_probe_config_dt(struct platform_device *pdev, const char **mac) 352stmmac_probe_config_dt(struct platform_device *pdev, const char **mac)
335{ 353{
336 return ERR_PTR(-ENOSYS); 354 return ERR_PTR(-ENOSYS);
337} 355}
356
357void stmmac_remove_config_dt(struct platform_device *pdev,
358 struct plat_stmmacenet_data *plat)
359{
360}
338#endif /* CONFIG_OF */ 361#endif /* CONFIG_OF */
339EXPORT_SYMBOL_GPL(stmmac_probe_config_dt); 362EXPORT_SYMBOL_GPL(stmmac_probe_config_dt);
363EXPORT_SYMBOL_GPL(stmmac_remove_config_dt);
340 364
341int stmmac_get_platform_resources(struct platform_device *pdev, 365int stmmac_get_platform_resources(struct platform_device *pdev,
342 struct stmmac_resources *stmmac_res) 366 struct stmmac_resources *stmmac_res)
@@ -392,10 +416,13 @@ int stmmac_pltfr_remove(struct platform_device *pdev)
392{ 416{
393 struct net_device *ndev = platform_get_drvdata(pdev); 417 struct net_device *ndev = platform_get_drvdata(pdev);
394 struct stmmac_priv *priv = netdev_priv(ndev); 418 struct stmmac_priv *priv = netdev_priv(ndev);
419 struct plat_stmmacenet_data *plat = priv->plat;
395 int ret = stmmac_dvr_remove(&pdev->dev); 420 int ret = stmmac_dvr_remove(&pdev->dev);
396 421
397 if (priv->plat->exit) 422 if (plat->exit)
398 priv->plat->exit(pdev, priv->plat->bsp_priv); 423 plat->exit(pdev, plat->bsp_priv);
424
425 stmmac_remove_config_dt(pdev, plat);
399 426
400 return ret; 427 return ret;
401} 428}
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
index 64e147f53a9c..b72eb0de57b7 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_platform.h
@@ -23,6 +23,8 @@
23 23
24struct plat_stmmacenet_data * 24struct plat_stmmacenet_data *
25stmmac_probe_config_dt(struct platform_device *pdev, const char **mac); 25stmmac_probe_config_dt(struct platform_device *pdev, const char **mac);
26void stmmac_remove_config_dt(struct platform_device *pdev,
27 struct plat_stmmacenet_data *plat);
26 28
27int stmmac_get_platform_resources(struct platform_device *pdev, 29int stmmac_get_platform_resources(struct platform_device *pdev,
28 struct stmmac_resources *stmmac_res); 30 struct stmmac_resources *stmmac_res);
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
index 1477471f8d44..3eb281d1db08 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.c
@@ -54,7 +54,7 @@ static int stmmac_adjust_freq(struct ptp_clock_info *ptp, s32 ppb)
54 54
55 spin_lock_irqsave(&priv->ptp_lock, flags); 55 spin_lock_irqsave(&priv->ptp_lock, flags);
56 56
57 priv->hw->ptp->config_addend(priv->ioaddr, addend); 57 priv->hw->ptp->config_addend(priv->ptpaddr, addend);
58 58
59 spin_unlock_irqrestore(&priv->ptp_lock, flags); 59 spin_unlock_irqrestore(&priv->ptp_lock, flags);
60 60
@@ -89,7 +89,8 @@ static int stmmac_adjust_time(struct ptp_clock_info *ptp, s64 delta)
89 89
90 spin_lock_irqsave(&priv->ptp_lock, flags); 90 spin_lock_irqsave(&priv->ptp_lock, flags);
91 91
92 priv->hw->ptp->adjust_systime(priv->ioaddr, sec, nsec, neg_adj); 92 priv->hw->ptp->adjust_systime(priv->ptpaddr, sec, nsec, neg_adj,
93 priv->plat->has_gmac4);
93 94
94 spin_unlock_irqrestore(&priv->ptp_lock, flags); 95 spin_unlock_irqrestore(&priv->ptp_lock, flags);
95 96
@@ -114,7 +115,7 @@ static int stmmac_get_time(struct ptp_clock_info *ptp, struct timespec64 *ts)
114 115
115 spin_lock_irqsave(&priv->ptp_lock, flags); 116 spin_lock_irqsave(&priv->ptp_lock, flags);
116 117
117 ns = priv->hw->ptp->get_systime(priv->ioaddr); 118 ns = priv->hw->ptp->get_systime(priv->ptpaddr);
118 119
119 spin_unlock_irqrestore(&priv->ptp_lock, flags); 120 spin_unlock_irqrestore(&priv->ptp_lock, flags);
120 121
@@ -141,7 +142,7 @@ static int stmmac_set_time(struct ptp_clock_info *ptp,
141 142
142 spin_lock_irqsave(&priv->ptp_lock, flags); 143 spin_lock_irqsave(&priv->ptp_lock, flags);
143 144
144 priv->hw->ptp->init_systime(priv->ioaddr, ts->tv_sec, ts->tv_nsec); 145 priv->hw->ptp->init_systime(priv->ptpaddr, ts->tv_sec, ts->tv_nsec);
145 146
146 spin_unlock_irqrestore(&priv->ptp_lock, flags); 147 spin_unlock_irqrestore(&priv->ptp_lock, flags);
147 148
diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h
index 4535df37c227..c06938c47af5 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_ptp.h
@@ -22,51 +22,53 @@
22 Author: Rayagond Kokatanur <rayagond@vayavyalabs.com> 22 Author: Rayagond Kokatanur <rayagond@vayavyalabs.com>
23******************************************************************************/ 23******************************************************************************/
24 24
25#ifndef __STMMAC_PTP_H__ 25#ifndef __STMMAC_PTP_H__
26#define __STMMAC_PTP_H__ 26#define __STMMAC_PTP_H__
27 27
28/* IEEE 1588 PTP register offsets */ 28#define PTP_GMAC4_OFFSET 0xb00
29#define PTP_TCR 0x0700 /* Timestamp Control Reg */ 29#define PTP_GMAC3_X_OFFSET 0x700
30#define PTP_SSIR 0x0704 /* Sub-Second Increment Reg */
31#define PTP_STSR 0x0708 /* System Time – Seconds Regr */
32#define PTP_STNSR 0x070C /* System Time – Nanoseconds Reg */
33#define PTP_STSUR 0x0710 /* System Time – Seconds Update Reg */
34#define PTP_STNSUR 0x0714 /* System Time – Nanoseconds Update Reg */
35#define PTP_TAR 0x0718 /* Timestamp Addend Reg */
36#define PTP_TTSR 0x071C /* Target Time Seconds Reg */
37#define PTP_TTNSR 0x0720 /* Target Time Nanoseconds Reg */
38#define PTP_STHWSR 0x0724 /* System Time - Higher Word Seconds Reg */
39#define PTP_TSR 0x0728 /* Timestamp Status */
40 30
41#define PTP_STNSUR_ADDSUB_SHIFT 31 31/* IEEE 1588 PTP register offsets */
32#define PTP_TCR 0x00 /* Timestamp Control Reg */
33#define PTP_SSIR 0x04 /* Sub-Second Increment Reg */
34#define PTP_STSR 0x08 /* System Time – Seconds Regr */
35#define PTP_STNSR 0x0c /* System Time – Nanoseconds Reg */
36#define PTP_STSUR 0x10 /* System Time – Seconds Update Reg */
37#define PTP_STNSUR 0x14 /* System Time – Nanoseconds Update Reg */
38#define PTP_TAR 0x18 /* Timestamp Addend Reg */
42 39
43/* PTP TCR defines */ 40#define PTP_STNSUR_ADDSUB_SHIFT 31
44#define PTP_TCR_TSENA 0x00000001 /* Timestamp Enable */ 41#define PTP_DIGITAL_ROLLOVER_MODE 0x3B9ACA00 /* 10e9-1 ns */
45#define PTP_TCR_TSCFUPDT 0x00000002 /* Timestamp Fine/Coarse Update */ 42#define PTP_BINARY_ROLLOVER_MODE 0x80000000 /* ~0.466 ns */
46#define PTP_TCR_TSINIT 0x00000004 /* Timestamp Initialize */
47#define PTP_TCR_TSUPDT 0x00000008 /* Timestamp Update */
48/* Timestamp Interrupt Trigger Enable */
49#define PTP_TCR_TSTRIG 0x00000010
50#define PTP_TCR_TSADDREG 0x00000020 /* Addend Reg Update */
51#define PTP_TCR_TSENALL 0x00000100 /* Enable Timestamp for All Frames */
52/* Timestamp Digital or Binary Rollover Control */
53#define PTP_TCR_TSCTRLSSR 0x00000200
54 43
44/* PTP Timestamp control register defines */
45#define PTP_TCR_TSENA BIT(0) /* Timestamp Enable */
46#define PTP_TCR_TSCFUPDT BIT(1) /* Timestamp Fine/Coarse Update */
47#define PTP_TCR_TSINIT BIT(2) /* Timestamp Initialize */
48#define PTP_TCR_TSUPDT BIT(3) /* Timestamp Update */
49#define PTP_TCR_TSTRIG BIT(4) /* Timestamp Interrupt Trigger Enable */
50#define PTP_TCR_TSADDREG BIT(5) /* Addend Reg Update */
51#define PTP_TCR_TSENALL BIT(8) /* Enable Timestamp for All Frames */
52#define PTP_TCR_TSCTRLSSR BIT(9) /* Digital or Binary Rollover Control */
55/* Enable PTP packet Processing for Version 2 Format */ 53/* Enable PTP packet Processing for Version 2 Format */
56#define PTP_TCR_TSVER2ENA 0x00000400 54#define PTP_TCR_TSVER2ENA BIT(10)
57/* Enable Processing of PTP over Ethernet Frames */ 55/* Enable Processing of PTP over Ethernet Frames */
58#define PTP_TCR_TSIPENA 0x00000800 56#define PTP_TCR_TSIPENA BIT(11)
59/* Enable Processing of PTP Frames Sent over IPv6-UDP */ 57/* Enable Processing of PTP Frames Sent over IPv6-UDP */
60#define PTP_TCR_TSIPV6ENA 0x00001000 58#define PTP_TCR_TSIPV6ENA BIT(12)
61/* Enable Processing of PTP Frames Sent over IPv4-UDP */ 59/* Enable Processing of PTP Frames Sent over IPv4-UDP */
62#define PTP_TCR_TSIPV4ENA 0x00002000 60#define PTP_TCR_TSIPV4ENA BIT(13)
63/* Enable Timestamp Snapshot for Event Messages */ 61/* Enable Timestamp Snapshot for Event Messages */
64#define PTP_TCR_TSEVNTENA 0x00004000 62#define PTP_TCR_TSEVNTENA BIT(14)
65/* Enable Snapshot for Messages Relevant to Master */ 63/* Enable Snapshot for Messages Relevant to Master */
66#define PTP_TCR_TSMSTRENA 0x00008000 64#define PTP_TCR_TSMSTRENA BIT(15)
67/* Select PTP packets for Taking Snapshots */ 65/* Select PTP packets for Taking Snapshots */
68#define PTP_TCR_SNAPTYPSEL_1 0x00010000 66#define PTP_TCR_SNAPTYPSEL_1 GENMASK(17, 16)
69/* Enable MAC address for PTP Frame Filtering */ 67/* Enable MAC address for PTP Frame Filtering */
70#define PTP_TCR_TSENMACADDR 0x00040000 68#define PTP_TCR_TSENMACADDR BIT(18)
69
70/* SSIR defines */
71#define PTP_SSIR_SSINC_MASK 0xff
72#define GMAC4_PTP_SSIR_SSINC_SHIFT 16
71 73
72#endif /* __STMMAC_PTP_H__ */ 74#endif /* __STMMAC_PTP_H__ */
diff --git a/drivers/net/ethernet/sun/sunbmac.c b/drivers/net/ethernet/sun/sunbmac.c
index aa4f9d2d8fa9..02f452730d52 100644
--- a/drivers/net/ethernet/sun/sunbmac.c
+++ b/drivers/net/ethernet/sun/sunbmac.c
@@ -623,6 +623,7 @@ static int bigmac_init_hw(struct bigmac *bp, int from_irq)
623 void __iomem *gregs = bp->gregs; 623 void __iomem *gregs = bp->gregs;
624 void __iomem *cregs = bp->creg; 624 void __iomem *cregs = bp->creg;
625 void __iomem *bregs = bp->bregs; 625 void __iomem *bregs = bp->bregs;
626 __u32 bblk_dvma = (__u32)bp->bblock_dvma;
626 unsigned char *e = &bp->dev->dev_addr[0]; 627 unsigned char *e = &bp->dev->dev_addr[0];
627 628
628 /* Latch current counters into statistics. */ 629 /* Latch current counters into statistics. */
@@ -671,9 +672,9 @@ static int bigmac_init_hw(struct bigmac *bp, int from_irq)
671 bregs + BMAC_XIFCFG); 672 bregs + BMAC_XIFCFG);
672 673
673 /* Tell the QEC where the ring descriptors are. */ 674 /* Tell the QEC where the ring descriptors are. */
674 sbus_writel(bp->bblock_dvma + bib_offset(be_rxd, 0), 675 sbus_writel(bblk_dvma + bib_offset(be_rxd, 0),
675 cregs + CREG_RXDS); 676 cregs + CREG_RXDS);
676 sbus_writel(bp->bblock_dvma + bib_offset(be_txd, 0), 677 sbus_writel(bblk_dvma + bib_offset(be_txd, 0),
677 cregs + CREG_TXDS); 678 cregs + CREG_TXDS);
678 679
679 /* Setup the FIFO pointers into QEC local memory. */ 680 /* Setup the FIFO pointers into QEC local memory. */
diff --git a/drivers/net/ethernet/sun/sunbmac.h b/drivers/net/ethernet/sun/sunbmac.h
index 06dd21707353..532fc56830cf 100644
--- a/drivers/net/ethernet/sun/sunbmac.h
+++ b/drivers/net/ethernet/sun/sunbmac.h
@@ -291,7 +291,7 @@ struct bigmac {
291 void __iomem *bregs; /* BigMAC Registers */ 291 void __iomem *bregs; /* BigMAC Registers */
292 void __iomem *tregs; /* BigMAC Transceiver */ 292 void __iomem *tregs; /* BigMAC Transceiver */
293 struct bmac_init_block *bmac_block; /* RX and TX descriptors */ 293 struct bmac_init_block *bmac_block; /* RX and TX descriptors */
294 __u32 bblock_dvma; /* RX and TX descriptors */ 294 dma_addr_t bblock_dvma; /* RX and TX descriptors */
295 295
296 spinlock_t lock; 296 spinlock_t lock;
297 297
diff --git a/drivers/net/ethernet/sun/sunqe.c b/drivers/net/ethernet/sun/sunqe.c
index 9b825780b3be..9582948145c1 100644
--- a/drivers/net/ethernet/sun/sunqe.c
+++ b/drivers/net/ethernet/sun/sunqe.c
@@ -124,7 +124,7 @@ static void qe_init_rings(struct sunqe *qep)
124{ 124{
125 struct qe_init_block *qb = qep->qe_block; 125 struct qe_init_block *qb = qep->qe_block;
126 struct sunqe_buffers *qbufs = qep->buffers; 126 struct sunqe_buffers *qbufs = qep->buffers;
127 __u32 qbufs_dvma = qep->buffers_dvma; 127 __u32 qbufs_dvma = (__u32)qep->buffers_dvma;
128 int i; 128 int i;
129 129
130 qep->rx_new = qep->rx_old = qep->tx_new = qep->tx_old = 0; 130 qep->rx_new = qep->rx_old = qep->tx_new = qep->tx_old = 0;
@@ -144,6 +144,7 @@ static int qe_init(struct sunqe *qep, int from_irq)
144 void __iomem *mregs = qep->mregs; 144 void __iomem *mregs = qep->mregs;
145 void __iomem *gregs = qecp->gregs; 145 void __iomem *gregs = qecp->gregs;
146 unsigned char *e = &qep->dev->dev_addr[0]; 146 unsigned char *e = &qep->dev->dev_addr[0];
147 __u32 qblk_dvma = (__u32)qep->qblock_dvma;
147 u32 tmp; 148 u32 tmp;
148 int i; 149 int i;
149 150
@@ -152,8 +153,8 @@ static int qe_init(struct sunqe *qep, int from_irq)
152 return -EAGAIN; 153 return -EAGAIN;
153 154
154 /* Setup initial rx/tx init block pointers. */ 155 /* Setup initial rx/tx init block pointers. */
155 sbus_writel(qep->qblock_dvma + qib_offset(qe_rxd, 0), cregs + CREG_RXDS); 156 sbus_writel(qblk_dvma + qib_offset(qe_rxd, 0), cregs + CREG_RXDS);
156 sbus_writel(qep->qblock_dvma + qib_offset(qe_txd, 0), cregs + CREG_TXDS); 157 sbus_writel(qblk_dvma + qib_offset(qe_txd, 0), cregs + CREG_TXDS);
157 158
158 /* Enable/mask the various irq's. */ 159 /* Enable/mask the various irq's. */
159 sbus_writel(0, cregs + CREG_RIMASK); 160 sbus_writel(0, cregs + CREG_RIMASK);
@@ -413,7 +414,7 @@ static void qe_rx(struct sunqe *qep)
413 struct net_device *dev = qep->dev; 414 struct net_device *dev = qep->dev;
414 struct qe_rxd *this; 415 struct qe_rxd *this;
415 struct sunqe_buffers *qbufs = qep->buffers; 416 struct sunqe_buffers *qbufs = qep->buffers;
416 __u32 qbufs_dvma = qep->buffers_dvma; 417 __u32 qbufs_dvma = (__u32)qep->buffers_dvma;
417 int elem = qep->rx_new; 418 int elem = qep->rx_new;
418 u32 flags; 419 u32 flags;
419 420
@@ -572,7 +573,7 @@ static int qe_start_xmit(struct sk_buff *skb, struct net_device *dev)
572{ 573{
573 struct sunqe *qep = netdev_priv(dev); 574 struct sunqe *qep = netdev_priv(dev);
574 struct sunqe_buffers *qbufs = qep->buffers; 575 struct sunqe_buffers *qbufs = qep->buffers;
575 __u32 txbuf_dvma, qbufs_dvma = qep->buffers_dvma; 576 __u32 txbuf_dvma, qbufs_dvma = (__u32)qep->buffers_dvma;
576 unsigned char *txbuf; 577 unsigned char *txbuf;
577 int len, entry; 578 int len, entry;
578 579
diff --git a/drivers/net/ethernet/sun/sunqe.h b/drivers/net/ethernet/sun/sunqe.h
index 581781b6b2fa..ae190b77431b 100644
--- a/drivers/net/ethernet/sun/sunqe.h
+++ b/drivers/net/ethernet/sun/sunqe.h
@@ -334,12 +334,12 @@ struct sunqe {
334 void __iomem *qcregs; /* QEC per-channel Registers */ 334 void __iomem *qcregs; /* QEC per-channel Registers */
335 void __iomem *mregs; /* Per-channel MACE Registers */ 335 void __iomem *mregs; /* Per-channel MACE Registers */
336 struct qe_init_block *qe_block; /* RX and TX descriptors */ 336 struct qe_init_block *qe_block; /* RX and TX descriptors */
337 __u32 qblock_dvma; /* RX and TX descriptors */ 337 dma_addr_t qblock_dvma; /* RX and TX descriptors */
338 spinlock_t lock; /* Protects txfull state */ 338 spinlock_t lock; /* Protects txfull state */
339 int rx_new, rx_old; /* RX ring extents */ 339 int rx_new, rx_old; /* RX ring extents */
340 int tx_new, tx_old; /* TX ring extents */ 340 int tx_new, tx_old; /* TX ring extents */
341 struct sunqe_buffers *buffers; /* CPU visible address. */ 341 struct sunqe_buffers *buffers; /* CPU visible address. */
342 __u32 buffers_dvma; /* DVMA visible address. */ 342 dma_addr_t buffers_dvma; /* DVMA visible address. */
343 struct sunqec *parent; 343 struct sunqec *parent;
344 u8 mconfig; /* Base MACE mconfig value */ 344 u8 mconfig; /* Base MACE mconfig value */
345 struct platform_device *op; /* QE's OF device struct */ 345 struct platform_device *op; /* QE's OF device struct */
diff --git a/drivers/net/ethernet/synopsys/dwc_eth_qos.c b/drivers/net/ethernet/synopsys/dwc_eth_qos.c
index 5eedac495077..97d64bfed465 100644
--- a/drivers/net/ethernet/synopsys/dwc_eth_qos.c
+++ b/drivers/net/ethernet/synopsys/dwc_eth_qos.c
@@ -33,7 +33,6 @@
33#include <linux/stat.h> 33#include <linux/stat.h>
34#include <linux/types.h> 34#include <linux/types.h>
35 35
36#include <linux/types.h>
37#include <linux/slab.h> 36#include <linux/slab.h>
38#include <linux/delay.h> 37#include <linux/delay.h>
39#include <linux/mm.h> 38#include <linux/mm.h>
@@ -43,7 +42,6 @@
43 42
44#include <linux/phy.h> 43#include <linux/phy.h>
45#include <linux/mii.h> 44#include <linux/mii.h>
46#include <linux/delay.h>
47#include <linux/dma-mapping.h> 45#include <linux/dma-mapping.h>
48#include <linux/vmalloc.h> 46#include <linux/vmalloc.h>
49 47
@@ -2883,7 +2881,7 @@ static int dwceqos_probe(struct platform_device *pdev)
2883 ret = of_get_phy_mode(lp->pdev->dev.of_node); 2881 ret = of_get_phy_mode(lp->pdev->dev.of_node);
2884 if (ret < 0) { 2882 if (ret < 0) {
2885 dev_err(&lp->pdev->dev, "error in getting phy i/f\n"); 2883 dev_err(&lp->pdev->dev, "error in getting phy i/f\n");
2886 goto err_out_clk_dis_phy; 2884 goto err_out_deregister_fixed_link;
2887 } 2885 }
2888 2886
2889 lp->phy_interface = ret; 2887 lp->phy_interface = ret;
@@ -2891,14 +2889,14 @@ static int dwceqos_probe(struct platform_device *pdev)
2891 ret = dwceqos_mii_init(lp); 2889 ret = dwceqos_mii_init(lp);
2892 if (ret) { 2890 if (ret) {
2893 dev_err(&lp->pdev->dev, "error in dwceqos_mii_init\n"); 2891 dev_err(&lp->pdev->dev, "error in dwceqos_mii_init\n");
2894 goto err_out_clk_dis_phy; 2892 goto err_out_deregister_fixed_link;
2895 } 2893 }
2896 2894
2897 ret = dwceqos_mii_probe(ndev); 2895 ret = dwceqos_mii_probe(ndev);
2898 if (ret != 0) { 2896 if (ret != 0) {
2899 netdev_err(ndev, "mii_probe fail.\n"); 2897 netdev_err(ndev, "mii_probe fail.\n");
2900 ret = -ENXIO; 2898 ret = -ENXIO;
2901 goto err_out_clk_dis_phy; 2899 goto err_out_deregister_fixed_link;
2902 } 2900 }
2903 2901
2904 dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0); 2902 dwceqos_set_umac_addr(lp, lp->ndev->dev_addr, 0);
@@ -2916,7 +2914,7 @@ static int dwceqos_probe(struct platform_device *pdev)
2916 if (ret) { 2914 if (ret) {
2917 dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n", 2915 dev_err(&lp->pdev->dev, "Unable to retrieve DT, error %d\n",
2918 ret); 2916 ret);
2919 goto err_out_clk_dis_phy; 2917 goto err_out_deregister_fixed_link;
2920 } 2918 }
2921 dev_info(&lp->pdev->dev, "pdev->id %d, baseaddr 0x%08lx, irq %d\n", 2919 dev_info(&lp->pdev->dev, "pdev->id %d, baseaddr 0x%08lx, irq %d\n",
2922 pdev->id, ndev->base_addr, ndev->irq); 2920 pdev->id, ndev->base_addr, ndev->irq);
@@ -2926,7 +2924,7 @@ static int dwceqos_probe(struct platform_device *pdev)
2926 if (ret) { 2924 if (ret) {
2927 dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n", 2925 dev_err(&lp->pdev->dev, "Unable to request IRQ %d, error %d\n",
2928 ndev->irq, ret); 2926 ndev->irq, ret);
2929 goto err_out_clk_dis_phy; 2927 goto err_out_deregister_fixed_link;
2930 } 2928 }
2931 2929
2932 if (netif_msg_probe(lp)) 2930 if (netif_msg_probe(lp))
@@ -2937,11 +2935,14 @@ static int dwceqos_probe(struct platform_device *pdev)
2937 ret = register_netdev(ndev); 2935 ret = register_netdev(ndev);
2938 if (ret) { 2936 if (ret) {
2939 dev_err(&pdev->dev, "Cannot register net device, aborting.\n"); 2937 dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
2940 goto err_out_clk_dis_phy; 2938 goto err_out_deregister_fixed_link;
2941 } 2939 }
2942 2940
2943 return 0; 2941 return 0;
2944 2942
2943err_out_deregister_fixed_link:
2944 if (of_phy_is_fixed_link(pdev->dev.of_node))
2945 of_phy_deregister_fixed_link(pdev->dev.of_node);
2945err_out_clk_dis_phy: 2946err_out_clk_dis_phy:
2946 clk_disable_unprepare(lp->phy_ref_clk); 2947 clk_disable_unprepare(lp->phy_ref_clk);
2947err_out_clk_dis_aper: 2948err_out_clk_dis_aper:
@@ -2961,8 +2962,11 @@ static int dwceqos_remove(struct platform_device *pdev)
2961 if (ndev) { 2962 if (ndev) {
2962 lp = netdev_priv(ndev); 2963 lp = netdev_priv(ndev);
2963 2964
2964 if (ndev->phydev) 2965 if (ndev->phydev) {
2965 phy_disconnect(ndev->phydev); 2966 phy_disconnect(ndev->phydev);
2967 if (of_phy_is_fixed_link(pdev->dev.of_node))
2968 of_phy_deregister_fixed_link(pdev->dev.of_node);
2969 }
2966 mdiobus_unregister(lp->mii_bus); 2970 mdiobus_unregister(lp->mii_bus);
2967 mdiobus_free(lp->mii_bus); 2971 mdiobus_free(lp->mii_bus);
2968 2972
diff --git a/drivers/net/ethernet/ti/cpmac.c b/drivers/net/ethernet/ti/cpmac.c
index fa0cfda24fd9..28097be2ff28 100644
--- a/drivers/net/ethernet/ti/cpmac.c
+++ b/drivers/net/ethernet/ti/cpmac.c
@@ -1113,6 +1113,7 @@ static int cpmac_probe(struct platform_device *pdev)
1113 if (!dev) 1113 if (!dev)
1114 return -ENOMEM; 1114 return -ENOMEM;
1115 1115
1116 SET_NETDEV_DEV(dev, &pdev->dev);
1116 platform_set_drvdata(pdev, dev); 1117 platform_set_drvdata(pdev, dev);
1117 priv = netdev_priv(dev); 1118 priv = netdev_priv(dev);
1118 1119
diff --git a/drivers/net/ethernet/ti/cpsw-phy-sel.c b/drivers/net/ethernet/ti/cpsw-phy-sel.c
index 054a8dd23dae..18013645e76c 100644
--- a/drivers/net/ethernet/ti/cpsw-phy-sel.c
+++ b/drivers/net/ethernet/ti/cpsw-phy-sel.c
@@ -81,6 +81,7 @@ static void cpsw_gmii_sel_am3352(struct cpsw_phy_sel_priv *priv,
81 }; 81 };
82 82
83 mask = GMII_SEL_MODE_MASK << (slave * 2) | BIT(slave + 6); 83 mask = GMII_SEL_MODE_MASK << (slave * 2) | BIT(slave + 6);
84 mask |= BIT(slave + 4);
84 mode <<= slave * 2; 85 mode <<= slave * 2;
85 86
86 if (priv->rmii_clock_external) { 87 if (priv->rmii_clock_external) {
@@ -176,9 +177,12 @@ void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave)
176 } 177 }
177 178
178 dev = bus_find_device(&platform_bus_type, NULL, node, match); 179 dev = bus_find_device(&platform_bus_type, NULL, node, match);
180 of_node_put(node);
179 priv = dev_get_drvdata(dev); 181 priv = dev_get_drvdata(dev);
180 182
181 priv->cpsw_phy_sel(priv, phy_mode, slave); 183 priv->cpsw_phy_sel(priv, phy_mode, slave);
184
185 put_device(dev);
182} 186}
183EXPORT_SYMBOL_GPL(cpsw_phy_sel); 187EXPORT_SYMBOL_GPL(cpsw_phy_sel);
184 188
diff --git a/drivers/net/ethernet/ti/cpsw.c b/drivers/net/ethernet/ti/cpsw.c
index c6cff3d2ff05..b9087b828eff 100644
--- a/drivers/net/ethernet/ti/cpsw.c
+++ b/drivers/net/ethernet/ti/cpsw.c
@@ -2375,8 +2375,11 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
2375 * to the PHY is the Ethernet MAC DT node. 2375 * to the PHY is the Ethernet MAC DT node.
2376 */ 2376 */
2377 ret = of_phy_register_fixed_link(slave_node); 2377 ret = of_phy_register_fixed_link(slave_node);
2378 if (ret) 2378 if (ret) {
2379 if (ret != -EPROBE_DEFER)
2380 dev_err(&pdev->dev, "failed to register fixed-link phy: %d\n", ret);
2379 return ret; 2381 return ret;
2382 }
2380 slave_data->phy_node = of_node_get(slave_node); 2383 slave_data->phy_node = of_node_get(slave_node);
2381 } else if (parp) { 2384 } else if (parp) {
2382 u32 phyid; 2385 u32 phyid;
@@ -2397,6 +2400,7 @@ static int cpsw_probe_dt(struct cpsw_platform_data *data,
2397 } 2400 }
2398 snprintf(slave_data->phy_id, sizeof(slave_data->phy_id), 2401 snprintf(slave_data->phy_id, sizeof(slave_data->phy_id),
2399 PHY_ID_FMT, mdio->name, phyid); 2402 PHY_ID_FMT, mdio->name, phyid);
2403 put_device(&mdio->dev);
2400 } else { 2404 } else {
2401 dev_err(&pdev->dev, 2405 dev_err(&pdev->dev,
2402 "No slave[%d] phy_id, phy-handle, or fixed-link property\n", 2406 "No slave[%d] phy_id, phy-handle, or fixed-link property\n",
@@ -2440,6 +2444,34 @@ no_phy_slave:
2440 return 0; 2444 return 0;
2441} 2445}
2442 2446
2447static void cpsw_remove_dt(struct platform_device *pdev)
2448{
2449 struct net_device *ndev = platform_get_drvdata(pdev);
2450 struct cpsw_common *cpsw = ndev_to_cpsw(ndev);
2451 struct cpsw_platform_data *data = &cpsw->data;
2452 struct device_node *node = pdev->dev.of_node;
2453 struct device_node *slave_node;
2454 int i = 0;
2455
2456 for_each_available_child_of_node(node, slave_node) {
2457 struct cpsw_slave_data *slave_data = &data->slave_data[i];
2458
2459 if (strcmp(slave_node->name, "slave"))
2460 continue;
2461
2462 if (of_phy_is_fixed_link(slave_node))
2463 of_phy_deregister_fixed_link(slave_node);
2464
2465 of_node_put(slave_data->phy_node);
2466
2467 i++;
2468 if (i == data->slaves)
2469 break;
2470 }
2471
2472 of_platform_depopulate(&pdev->dev);
2473}
2474
2443static int cpsw_probe_dual_emac(struct cpsw_priv *priv) 2475static int cpsw_probe_dual_emac(struct cpsw_priv *priv)
2444{ 2476{
2445 struct cpsw_common *cpsw = priv->cpsw; 2477 struct cpsw_common *cpsw = priv->cpsw;
@@ -2547,6 +2579,9 @@ static int cpsw_probe(struct platform_device *pdev)
2547 int irq; 2579 int irq;
2548 2580
2549 cpsw = devm_kzalloc(&pdev->dev, sizeof(struct cpsw_common), GFP_KERNEL); 2581 cpsw = devm_kzalloc(&pdev->dev, sizeof(struct cpsw_common), GFP_KERNEL);
2582 if (!cpsw)
2583 return -ENOMEM;
2584
2550 cpsw->dev = &pdev->dev; 2585 cpsw->dev = &pdev->dev;
2551 2586
2552 ndev = alloc_etherdev_mq(sizeof(struct cpsw_priv), CPSW_MAX_QUEUES); 2587 ndev = alloc_etherdev_mq(sizeof(struct cpsw_priv), CPSW_MAX_QUEUES);
@@ -2584,11 +2619,19 @@ static int cpsw_probe(struct platform_device *pdev)
2584 /* Select default pin state */ 2619 /* Select default pin state */
2585 pinctrl_pm_select_default_state(&pdev->dev); 2620 pinctrl_pm_select_default_state(&pdev->dev);
2586 2621
2587 if (cpsw_probe_dt(&cpsw->data, pdev)) { 2622 /* Need to enable clocks with runtime PM api to access module
2588 dev_err(&pdev->dev, "cpsw: platform data missing\n"); 2623 * registers
2589 ret = -ENODEV; 2624 */
2625 ret = pm_runtime_get_sync(&pdev->dev);
2626 if (ret < 0) {
2627 pm_runtime_put_noidle(&pdev->dev);
2590 goto clean_runtime_disable_ret; 2628 goto clean_runtime_disable_ret;
2591 } 2629 }
2630
2631 ret = cpsw_probe_dt(&cpsw->data, pdev);
2632 if (ret)
2633 goto clean_dt_ret;
2634
2592 data = &cpsw->data; 2635 data = &cpsw->data;
2593 cpsw->rx_ch_num = 1; 2636 cpsw->rx_ch_num = 1;
2594 cpsw->tx_ch_num = 1; 2637 cpsw->tx_ch_num = 1;
@@ -2608,7 +2651,7 @@ static int cpsw_probe(struct platform_device *pdev)
2608 GFP_KERNEL); 2651 GFP_KERNEL);
2609 if (!cpsw->slaves) { 2652 if (!cpsw->slaves) {
2610 ret = -ENOMEM; 2653 ret = -ENOMEM;
2611 goto clean_runtime_disable_ret; 2654 goto clean_dt_ret;
2612 } 2655 }
2613 for (i = 0; i < data->slaves; i++) 2656 for (i = 0; i < data->slaves; i++)
2614 cpsw->slaves[i].slave_num = i; 2657 cpsw->slaves[i].slave_num = i;
@@ -2620,7 +2663,7 @@ static int cpsw_probe(struct platform_device *pdev)
2620 if (IS_ERR(clk)) { 2663 if (IS_ERR(clk)) {
2621 dev_err(priv->dev, "fck is not found\n"); 2664 dev_err(priv->dev, "fck is not found\n");
2622 ret = -ENODEV; 2665 ret = -ENODEV;
2623 goto clean_runtime_disable_ret; 2666 goto clean_dt_ret;
2624 } 2667 }
2625 cpsw->bus_freq_mhz = clk_get_rate(clk) / 1000000; 2668 cpsw->bus_freq_mhz = clk_get_rate(clk) / 1000000;
2626 2669
@@ -2628,26 +2671,17 @@ static int cpsw_probe(struct platform_device *pdev)
2628 ss_regs = devm_ioremap_resource(&pdev->dev, ss_res); 2671 ss_regs = devm_ioremap_resource(&pdev->dev, ss_res);
2629 if (IS_ERR(ss_regs)) { 2672 if (IS_ERR(ss_regs)) {
2630 ret = PTR_ERR(ss_regs); 2673 ret = PTR_ERR(ss_regs);
2631 goto clean_runtime_disable_ret; 2674 goto clean_dt_ret;
2632 } 2675 }
2633 cpsw->regs = ss_regs; 2676 cpsw->regs = ss_regs;
2634 2677
2635 /* Need to enable clocks with runtime PM api to access module
2636 * registers
2637 */
2638 ret = pm_runtime_get_sync(&pdev->dev);
2639 if (ret < 0) {
2640 pm_runtime_put_noidle(&pdev->dev);
2641 goto clean_runtime_disable_ret;
2642 }
2643 cpsw->version = readl(&cpsw->regs->id_ver); 2678 cpsw->version = readl(&cpsw->regs->id_ver);
2644 pm_runtime_put_sync(&pdev->dev);
2645 2679
2646 res = platform_get_resource(pdev, IORESOURCE_MEM, 1); 2680 res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
2647 cpsw->wr_regs = devm_ioremap_resource(&pdev->dev, res); 2681 cpsw->wr_regs = devm_ioremap_resource(&pdev->dev, res);
2648 if (IS_ERR(cpsw->wr_regs)) { 2682 if (IS_ERR(cpsw->wr_regs)) {
2649 ret = PTR_ERR(cpsw->wr_regs); 2683 ret = PTR_ERR(cpsw->wr_regs);
2650 goto clean_runtime_disable_ret; 2684 goto clean_dt_ret;
2651 } 2685 }
2652 2686
2653 memset(&dma_params, 0, sizeof(dma_params)); 2687 memset(&dma_params, 0, sizeof(dma_params));
@@ -2684,7 +2718,7 @@ static int cpsw_probe(struct platform_device *pdev)
2684 default: 2718 default:
2685 dev_err(priv->dev, "unknown version 0x%08x\n", cpsw->version); 2719 dev_err(priv->dev, "unknown version 0x%08x\n", cpsw->version);
2686 ret = -ENODEV; 2720 ret = -ENODEV;
2687 goto clean_runtime_disable_ret; 2721 goto clean_dt_ret;
2688 } 2722 }
2689 for (i = 0; i < cpsw->data.slaves; i++) { 2723 for (i = 0; i < cpsw->data.slaves; i++) {
2690 struct cpsw_slave *slave = &cpsw->slaves[i]; 2724 struct cpsw_slave *slave = &cpsw->slaves[i];
@@ -2713,7 +2747,7 @@ static int cpsw_probe(struct platform_device *pdev)
2713 if (!cpsw->dma) { 2747 if (!cpsw->dma) {
2714 dev_err(priv->dev, "error initializing dma\n"); 2748 dev_err(priv->dev, "error initializing dma\n");
2715 ret = -ENOMEM; 2749 ret = -ENOMEM;
2716 goto clean_runtime_disable_ret; 2750 goto clean_dt_ret;
2717 } 2751 }
2718 2752
2719 cpsw->txch[0] = cpdma_chan_create(cpsw->dma, 0, cpsw_tx_handler, 0); 2753 cpsw->txch[0] = cpdma_chan_create(cpsw->dma, 0, cpsw_tx_handler, 0);
@@ -2811,16 +2845,23 @@ static int cpsw_probe(struct platform_device *pdev)
2811 ret = cpsw_probe_dual_emac(priv); 2845 ret = cpsw_probe_dual_emac(priv);
2812 if (ret) { 2846 if (ret) {
2813 cpsw_err(priv, probe, "error probe slave 2 emac interface\n"); 2847 cpsw_err(priv, probe, "error probe slave 2 emac interface\n");
2814 goto clean_ale_ret; 2848 goto clean_unregister_netdev_ret;
2815 } 2849 }
2816 } 2850 }
2817 2851
2852 pm_runtime_put(&pdev->dev);
2853
2818 return 0; 2854 return 0;
2819 2855
2856clean_unregister_netdev_ret:
2857 unregister_netdev(ndev);
2820clean_ale_ret: 2858clean_ale_ret:
2821 cpsw_ale_destroy(cpsw->ale); 2859 cpsw_ale_destroy(cpsw->ale);
2822clean_dma_ret: 2860clean_dma_ret:
2823 cpdma_ctlr_destroy(cpsw->dma); 2861 cpdma_ctlr_destroy(cpsw->dma);
2862clean_dt_ret:
2863 cpsw_remove_dt(pdev);
2864 pm_runtime_put_sync(&pdev->dev);
2824clean_runtime_disable_ret: 2865clean_runtime_disable_ret:
2825 pm_runtime_disable(&pdev->dev); 2866 pm_runtime_disable(&pdev->dev);
2826clean_ndev_ret: 2867clean_ndev_ret:
@@ -2846,7 +2887,7 @@ static int cpsw_remove(struct platform_device *pdev)
2846 2887
2847 cpsw_ale_destroy(cpsw->ale); 2888 cpsw_ale_destroy(cpsw->ale);
2848 cpdma_ctlr_destroy(cpsw->dma); 2889 cpdma_ctlr_destroy(cpsw->dma);
2849 of_platform_depopulate(&pdev->dev); 2890 cpsw_remove_dt(pdev);
2850 pm_runtime_put_sync(&pdev->dev); 2891 pm_runtime_put_sync(&pdev->dev);
2851 pm_runtime_disable(&pdev->dev); 2892 pm_runtime_disable(&pdev->dev);
2852 if (cpsw->data.dual_emac) 2893 if (cpsw->data.dual_emac)
@@ -2889,6 +2930,8 @@ static int cpsw_resume(struct device *dev)
2889 /* Select default pin state */ 2930 /* Select default pin state */
2890 pinctrl_pm_select_default_state(dev); 2931 pinctrl_pm_select_default_state(dev);
2891 2932
2933 /* shut up ASSERT_RTNL() warning in netif_set_real_num_tx/rx_queues */
2934 rtnl_lock();
2892 if (cpsw->data.dual_emac) { 2935 if (cpsw->data.dual_emac) {
2893 int i; 2936 int i;
2894 2937
@@ -2900,6 +2943,8 @@ static int cpsw_resume(struct device *dev)
2900 if (netif_running(ndev)) 2943 if (netif_running(ndev))
2901 cpsw_ndo_open(ndev); 2944 cpsw_ndo_open(ndev);
2902 } 2945 }
2946 rtnl_unlock();
2947
2903 return 0; 2948 return 0;
2904} 2949}
2905#endif 2950#endif
diff --git a/drivers/net/ethernet/ti/davinci_emac.c b/drivers/net/ethernet/ti/davinci_emac.c
index 2fd94a5bc1f3..481c7bf0395b 100644
--- a/drivers/net/ethernet/ti/davinci_emac.c
+++ b/drivers/net/ethernet/ti/davinci_emac.c
@@ -1410,6 +1410,7 @@ static int emac_dev_open(struct net_device *ndev)
1410 int i = 0; 1410 int i = 0;
1411 struct emac_priv *priv = netdev_priv(ndev); 1411 struct emac_priv *priv = netdev_priv(ndev);
1412 struct phy_device *phydev = NULL; 1412 struct phy_device *phydev = NULL;
1413 struct device *phy = NULL;
1413 1414
1414 ret = pm_runtime_get_sync(&priv->pdev->dev); 1415 ret = pm_runtime_get_sync(&priv->pdev->dev);
1415 if (ret < 0) { 1416 if (ret < 0) {
@@ -1488,19 +1489,20 @@ static int emac_dev_open(struct net_device *ndev)
1488 1489
1489 /* use the first phy on the bus if pdata did not give us a phy id */ 1490 /* use the first phy on the bus if pdata did not give us a phy id */
1490 if (!phydev && !priv->phy_id) { 1491 if (!phydev && !priv->phy_id) {
1491 struct device *phy;
1492
1493 phy = bus_find_device(&mdio_bus_type, NULL, NULL, 1492 phy = bus_find_device(&mdio_bus_type, NULL, NULL,
1494 match_first_device); 1493 match_first_device);
1495 if (phy) 1494 if (phy) {
1496 priv->phy_id = dev_name(phy); 1495 priv->phy_id = dev_name(phy);
1496 if (!priv->phy_id || !*priv->phy_id)
1497 put_device(phy);
1498 }
1497 } 1499 }
1498 1500
1499 if (!phydev && priv->phy_id && *priv->phy_id) { 1501 if (!phydev && priv->phy_id && *priv->phy_id) {
1500 phydev = phy_connect(ndev, priv->phy_id, 1502 phydev = phy_connect(ndev, priv->phy_id,
1501 &emac_adjust_link, 1503 &emac_adjust_link,
1502 PHY_INTERFACE_MODE_MII); 1504 PHY_INTERFACE_MODE_MII);
1503 1505 put_device(phy); /* reference taken by bus_find_device */
1504 if (IS_ERR(phydev)) { 1506 if (IS_ERR(phydev)) {
1505 dev_err(emac_dev, "could not connect to phy %s\n", 1507 dev_err(emac_dev, "could not connect to phy %s\n",
1506 priv->phy_id); 1508 priv->phy_id);
@@ -1765,6 +1767,7 @@ static int davinci_emac_try_get_mac(struct platform_device *pdev,
1765 */ 1767 */
1766static int davinci_emac_probe(struct platform_device *pdev) 1768static int davinci_emac_probe(struct platform_device *pdev)
1767{ 1769{
1770 struct device_node *np = pdev->dev.of_node;
1768 int rc = 0; 1771 int rc = 0;
1769 struct resource *res, *res_ctrl; 1772 struct resource *res, *res_ctrl;
1770 struct net_device *ndev; 1773 struct net_device *ndev;
@@ -1803,7 +1806,7 @@ static int davinci_emac_probe(struct platform_device *pdev)
1803 if (!pdata) { 1806 if (!pdata) {
1804 dev_err(&pdev->dev, "no platform data\n"); 1807 dev_err(&pdev->dev, "no platform data\n");
1805 rc = -ENODEV; 1808 rc = -ENODEV;
1806 goto no_pdata; 1809 goto err_free_netdev;
1807 } 1810 }
1808 1811
1809 /* MAC addr and PHY mask , RMII enable info from platform_data */ 1812 /* MAC addr and PHY mask , RMII enable info from platform_data */
@@ -1939,6 +1942,10 @@ no_cpdma_chan:
1939 cpdma_chan_destroy(priv->rxchan); 1942 cpdma_chan_destroy(priv->rxchan);
1940 cpdma_ctlr_destroy(priv->dma); 1943 cpdma_ctlr_destroy(priv->dma);
1941no_pdata: 1944no_pdata:
1945 if (of_phy_is_fixed_link(np))
1946 of_phy_deregister_fixed_link(np);
1947 of_node_put(priv->phy_node);
1948err_free_netdev:
1942 free_netdev(ndev); 1949 free_netdev(ndev);
1943 return rc; 1950 return rc;
1944} 1951}
@@ -1954,6 +1961,7 @@ static int davinci_emac_remove(struct platform_device *pdev)
1954{ 1961{
1955 struct net_device *ndev = platform_get_drvdata(pdev); 1962 struct net_device *ndev = platform_get_drvdata(pdev);
1956 struct emac_priv *priv = netdev_priv(ndev); 1963 struct emac_priv *priv = netdev_priv(ndev);
1964 struct device_node *np = pdev->dev.of_node;
1957 1965
1958 dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n"); 1966 dev_notice(&ndev->dev, "DaVinci EMAC: davinci_emac_remove()\n");
1959 1967
@@ -1966,6 +1974,8 @@ static int davinci_emac_remove(struct platform_device *pdev)
1966 unregister_netdev(ndev); 1974 unregister_netdev(ndev);
1967 of_node_put(priv->phy_node); 1975 of_node_put(priv->phy_node);
1968 pm_runtime_disable(&pdev->dev); 1976 pm_runtime_disable(&pdev->dev);
1977 if (of_phy_is_fixed_link(np))
1978 of_phy_deregister_fixed_link(np);
1969 free_netdev(ndev); 1979 free_netdev(ndev);
1970 1980
1971 return 0; 1981 return 0;
diff --git a/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c b/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
index 446ea580ad42..928c1dca2673 100644
--- a/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
+++ b/drivers/net/ethernet/toshiba/ps3_gelic_wireless.c
@@ -1694,7 +1694,7 @@ struct gelic_wl_scan_info *gelic_wl_find_best_bss(struct gelic_wl_info *wl)
1694 pr_debug("%s: bssid matched\n", __func__); 1694 pr_debug("%s: bssid matched\n", __func__);
1695 break; 1695 break;
1696 } else { 1696 } else {
1697 pr_debug("%s: bssid unmached\n", __func__); 1697 pr_debug("%s: bssid unmatched\n", __func__);
1698 continue; 1698 continue;
1699 } 1699 }
1700 } 1700 }
diff --git a/drivers/net/ethernet/xscale/ixp4xx_eth.c b/drivers/net/ethernet/xscale/ixp4xx_eth.c
index 7f127dc1b7ba..fa32391720fe 100644
--- a/drivers/net/ethernet/xscale/ixp4xx_eth.c
+++ b/drivers/net/ethernet/xscale/ixp4xx_eth.c
@@ -708,8 +708,7 @@ static int eth_poll(struct napi_struct *napi, int budget)
708 if (!qmgr_stat_below_low_watermark(rxq) && 708 if (!qmgr_stat_below_low_watermark(rxq) &&
709 napi_reschedule(napi)) { /* not empty again */ 709 napi_reschedule(napi)) { /* not empty again */
710#if DEBUG_RX 710#if DEBUG_RX
711 printk(KERN_DEBUG "%s: eth_poll" 711 printk(KERN_DEBUG "%s: eth_poll napi_reschedule succeeded\n",
712 " napi_reschedule successed\n",
713 dev->name); 712 dev->name);
714#endif 713#endif
715 qmgr_disable_irq(rxq); 714 qmgr_disable_irq(rxq);
diff --git a/drivers/net/geneve.c b/drivers/net/geneve.c
index 42edd7b7902f..8b4822ad27cb 100644
--- a/drivers/net/geneve.c
+++ b/drivers/net/geneve.c
@@ -859,7 +859,6 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
859 struct geneve_dev *geneve = netdev_priv(dev); 859 struct geneve_dev *geneve = netdev_priv(dev);
860 struct geneve_sock *gs4; 860 struct geneve_sock *gs4;
861 struct rtable *rt = NULL; 861 struct rtable *rt = NULL;
862 const struct iphdr *iip; /* interior IP header */
863 int err = -EINVAL; 862 int err = -EINVAL;
864 struct flowi4 fl4; 863 struct flowi4 fl4;
865 __u8 tos, ttl; 864 __u8 tos, ttl;
@@ -890,8 +889,6 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
890 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); 889 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
891 skb_reset_mac_header(skb); 890 skb_reset_mac_header(skb);
892 891
893 iip = ip_hdr(skb);
894
895 if (info) { 892 if (info) {
896 const struct ip_tunnel_key *key = &info->key; 893 const struct ip_tunnel_key *key = &info->key;
897 u8 *opts = NULL; 894 u8 *opts = NULL;
@@ -911,7 +908,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
911 if (unlikely(err)) 908 if (unlikely(err))
912 goto tx_error; 909 goto tx_error;
913 910
914 tos = ip_tunnel_ecn_encap(key->tos, iip, skb); 911 tos = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
915 ttl = key->ttl; 912 ttl = key->ttl;
916 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0; 913 df = key->tun_flags & TUNNEL_DONT_FRAGMENT ? htons(IP_DF) : 0;
917 } else { 914 } else {
@@ -920,7 +917,7 @@ static netdev_tx_t geneve_xmit_skb(struct sk_buff *skb, struct net_device *dev,
920 if (unlikely(err)) 917 if (unlikely(err))
921 goto tx_error; 918 goto tx_error;
922 919
923 tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, iip, skb); 920 tos = ip_tunnel_ecn_encap(fl4.flowi4_tos, ip_hdr(skb), skb);
924 ttl = geneve->ttl; 921 ttl = geneve->ttl;
925 if (!ttl && IN_MULTICAST(ntohl(fl4.daddr))) 922 if (!ttl && IN_MULTICAST(ntohl(fl4.daddr)))
926 ttl = 1; 923 ttl = 1;
@@ -952,7 +949,6 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
952{ 949{
953 struct geneve_dev *geneve = netdev_priv(dev); 950 struct geneve_dev *geneve = netdev_priv(dev);
954 struct dst_entry *dst = NULL; 951 struct dst_entry *dst = NULL;
955 const struct iphdr *iip; /* interior IP header */
956 struct geneve_sock *gs6; 952 struct geneve_sock *gs6;
957 int err = -EINVAL; 953 int err = -EINVAL;
958 struct flowi6 fl6; 954 struct flowi6 fl6;
@@ -982,8 +978,6 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
982 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true); 978 sport = udp_flow_src_port(geneve->net, skb, 1, USHRT_MAX, true);
983 skb_reset_mac_header(skb); 979 skb_reset_mac_header(skb);
984 980
985 iip = ip_hdr(skb);
986
987 if (info) { 981 if (info) {
988 const struct ip_tunnel_key *key = &info->key; 982 const struct ip_tunnel_key *key = &info->key;
989 u8 *opts = NULL; 983 u8 *opts = NULL;
@@ -1004,7 +998,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
1004 if (unlikely(err)) 998 if (unlikely(err))
1005 goto tx_error; 999 goto tx_error;
1006 1000
1007 prio = ip_tunnel_ecn_encap(key->tos, iip, skb); 1001 prio = ip_tunnel_ecn_encap(key->tos, ip_hdr(skb), skb);
1008 ttl = key->ttl; 1002 ttl = key->ttl;
1009 label = info->key.label; 1003 label = info->key.label;
1010 } else { 1004 } else {
@@ -1014,7 +1008,7 @@ static netdev_tx_t geneve6_xmit_skb(struct sk_buff *skb, struct net_device *dev,
1014 goto tx_error; 1008 goto tx_error;
1015 1009
1016 prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel), 1010 prio = ip_tunnel_ecn_encap(ip6_tclass(fl6.flowlabel),
1017 iip, skb); 1011 ip_hdr(skb), skb);
1018 ttl = geneve->ttl; 1012 ttl = geneve->ttl;
1019 if (!ttl && ipv6_addr_is_multicast(&fl6.daddr)) 1013 if (!ttl && ipv6_addr_is_multicast(&fl6.daddr))
1020 ttl = 1; 1014 ttl = 1;
diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
index f6382150b16a..c9140c3aeb67 100644
--- a/drivers/net/hyperv/netvsc_drv.c
+++ b/drivers/net/hyperv/netvsc_drv.c
@@ -47,6 +47,10 @@
47 NETIF_F_TSO | \ 47 NETIF_F_TSO | \
48 NETIF_F_TSO6 | \ 48 NETIF_F_TSO6 | \
49 NETIF_F_HW_CSUM) 49 NETIF_F_HW_CSUM)
50
51/* Restrict GSO size to account for NVGRE */
52#define NETVSC_GSO_MAX_SIZE 62768
53
50static int ring_size = 128; 54static int ring_size = 128;
51module_param(ring_size, int, S_IRUGO); 55module_param(ring_size, int, S_IRUGO);
52MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)"); 56MODULE_PARM_DESC(ring_size, "Ring buffer size (# of pages)");
@@ -1400,6 +1404,7 @@ static int netvsc_probe(struct hv_device *dev,
1400 nvdev = net_device_ctx->nvdev; 1404 nvdev = net_device_ctx->nvdev;
1401 netif_set_real_num_tx_queues(net, nvdev->num_chn); 1405 netif_set_real_num_tx_queues(net, nvdev->num_chn);
1402 netif_set_real_num_rx_queues(net, nvdev->num_chn); 1406 netif_set_real_num_rx_queues(net, nvdev->num_chn);
1407 netif_set_gso_max_size(net, NETVSC_GSO_MAX_SIZE);
1403 1408
1404 ret = register_netdev(net); 1409 ret = register_netdev(net);
1405 if (ret != 0) { 1410 if (ret != 0) {
diff --git a/drivers/net/ieee802154/adf7242.c b/drivers/net/ieee802154/adf7242.c
index 9fa7ac9f8e68..f355df7cf84a 100644
--- a/drivers/net/ieee802154/adf7242.c
+++ b/drivers/net/ieee802154/adf7242.c
@@ -20,7 +20,6 @@
20#include <linux/skbuff.h> 20#include <linux/skbuff.h>
21#include <linux/of.h> 21#include <linux/of.h>
22#include <linux/irq.h> 22#include <linux/irq.h>
23#include <linux/delay.h>
24#include <linux/debugfs.h> 23#include <linux/debugfs.h>
25#include <linux/bitops.h> 24#include <linux/bitops.h>
26#include <linux/ieee802154.h> 25#include <linux/ieee802154.h>
diff --git a/drivers/net/ipvlan/ipvlan_main.c b/drivers/net/ipvlan/ipvlan_main.c
index f442eb366863..dfbc4ef6d507 100644
--- a/drivers/net/ipvlan/ipvlan_main.c
+++ b/drivers/net/ipvlan/ipvlan_main.c
@@ -497,6 +497,7 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
497 struct net_device *phy_dev; 497 struct net_device *phy_dev;
498 int err; 498 int err;
499 u16 mode = IPVLAN_MODE_L3; 499 u16 mode = IPVLAN_MODE_L3;
500 bool create = false;
500 501
501 if (!tb[IFLA_LINK]) 502 if (!tb[IFLA_LINK])
502 return -EINVAL; 503 return -EINVAL;
@@ -513,6 +514,7 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
513 err = ipvlan_port_create(phy_dev); 514 err = ipvlan_port_create(phy_dev);
514 if (err < 0) 515 if (err < 0)
515 return err; 516 return err;
517 create = true;
516 } 518 }
517 519
518 if (data && data[IFLA_IPVLAN_MODE]) 520 if (data && data[IFLA_IPVLAN_MODE])
@@ -536,22 +538,29 @@ static int ipvlan_link_new(struct net *src_net, struct net_device *dev,
536 538
537 err = register_netdevice(dev); 539 err = register_netdevice(dev);
538 if (err < 0) 540 if (err < 0)
539 return err; 541 goto destroy_ipvlan_port;
540 542
541 err = netdev_upper_dev_link(phy_dev, dev); 543 err = netdev_upper_dev_link(phy_dev, dev);
542 if (err) { 544 if (err) {
543 unregister_netdevice(dev); 545 goto unregister_netdev;
544 return err;
545 } 546 }
546 err = ipvlan_set_port_mode(port, mode); 547 err = ipvlan_set_port_mode(port, mode);
547 if (err) { 548 if (err) {
548 unregister_netdevice(dev); 549 goto unlink_netdev;
549 return err;
550 } 550 }
551 551
552 list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans); 552 list_add_tail_rcu(&ipvlan->pnode, &port->ipvlans);
553 netif_stacked_transfer_operstate(phy_dev, dev); 553 netif_stacked_transfer_operstate(phy_dev, dev);
554 return 0; 554 return 0;
555
556unlink_netdev:
557 netdev_upper_dev_unlink(phy_dev, dev);
558unregister_netdev:
559 unregister_netdevice(dev);
560destroy_ipvlan_port:
561 if (create)
562 ipvlan_port_destroy(phy_dev);
563 return err;
555} 564}
556 565
557static void ipvlan_link_delete(struct net_device *dev, struct list_head *head) 566static void ipvlan_link_delete(struct net_device *dev, struct list_head *head)
diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c
index a198946bc54f..8716b8c07feb 100644
--- a/drivers/net/irda/irda-usb.c
+++ b/drivers/net/irda/irda-usb.c
@@ -1723,6 +1723,7 @@ static int irda_usb_probe(struct usb_interface *intf,
1723 /* Don't change this buffer size and allocation without doing 1723 /* Don't change this buffer size and allocation without doing
1724 * some heavy and complete testing. Don't ask why :-( 1724 * some heavy and complete testing. Don't ask why :-(
1725 * Jean II */ 1725 * Jean II */
1726 ret = -ENOMEM;
1726 self->speed_buff = kzalloc(IRDA_USB_SPEED_MTU, GFP_KERNEL); 1727 self->speed_buff = kzalloc(IRDA_USB_SPEED_MTU, GFP_KERNEL);
1727 if (!self->speed_buff) 1728 if (!self->speed_buff)
1728 goto err_out_3; 1729 goto err_out_3;
diff --git a/drivers/net/irda/w83977af_ir.c b/drivers/net/irda/w83977af_ir.c
index 4e3d2e7c697c..e8c3a8c32534 100644
--- a/drivers/net/irda/w83977af_ir.c
+++ b/drivers/net/irda/w83977af_ir.c
@@ -518,7 +518,9 @@ static netdev_tx_t w83977af_hard_xmit(struct sk_buff *skb,
518 518
519 mtt = irda_get_mtt(skb); 519 mtt = irda_get_mtt(skb);
520 pr_debug("%s(%ld), mtt=%d\n", __func__ , jiffies, mtt); 520 pr_debug("%s(%ld), mtt=%d\n", __func__ , jiffies, mtt);
521 if (mtt) 521 if (mtt > 1000)
522 mdelay(mtt/1000);
523 else if (mtt)
522 udelay(mtt); 524 udelay(mtt);
523 525
524 /* Enable DMA interrupt */ 526 /* Enable DMA interrupt */
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
index 3234fcdea317..26d6f0bbe14b 100644
--- a/drivers/net/macvlan.c
+++ b/drivers/net/macvlan.c
@@ -623,7 +623,8 @@ hash_add:
623 return 0; 623 return 0;
624 624
625clear_multi: 625clear_multi:
626 dev_set_allmulti(lowerdev, -1); 626 if (dev->flags & IFF_ALLMULTI)
627 dev_set_allmulti(lowerdev, -1);
627del_unicast: 628del_unicast:
628 dev_uc_del(lowerdev, dev->dev_addr); 629 dev_uc_del(lowerdev, dev->dev_addr);
629out: 630out:
@@ -1278,6 +1279,7 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
1278 struct net_device *lowerdev; 1279 struct net_device *lowerdev;
1279 int err; 1280 int err;
1280 int macmode; 1281 int macmode;
1282 bool create = false;
1281 1283
1282 if (!tb[IFLA_LINK]) 1284 if (!tb[IFLA_LINK])
1283 return -EINVAL; 1285 return -EINVAL;
@@ -1304,12 +1306,18 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
1304 err = macvlan_port_create(lowerdev); 1306 err = macvlan_port_create(lowerdev);
1305 if (err < 0) 1307 if (err < 0)
1306 return err; 1308 return err;
1309 create = true;
1307 } 1310 }
1308 port = macvlan_port_get_rtnl(lowerdev); 1311 port = macvlan_port_get_rtnl(lowerdev);
1309 1312
1310 /* Only 1 macvlan device can be created in passthru mode */ 1313 /* Only 1 macvlan device can be created in passthru mode */
1311 if (port->passthru) 1314 if (port->passthru) {
1312 return -EINVAL; 1315 /* The macvlan port must be not created this time,
1316 * still goto destroy_macvlan_port for readability.
1317 */
1318 err = -EINVAL;
1319 goto destroy_macvlan_port;
1320 }
1313 1321
1314 vlan->lowerdev = lowerdev; 1322 vlan->lowerdev = lowerdev;
1315 vlan->dev = dev; 1323 vlan->dev = dev;
@@ -1325,24 +1333,28 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
1325 vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]); 1333 vlan->flags = nla_get_u16(data[IFLA_MACVLAN_FLAGS]);
1326 1334
1327 if (vlan->mode == MACVLAN_MODE_PASSTHRU) { 1335 if (vlan->mode == MACVLAN_MODE_PASSTHRU) {
1328 if (port->count) 1336 if (port->count) {
1329 return -EINVAL; 1337 err = -EINVAL;
1338 goto destroy_macvlan_port;
1339 }
1330 port->passthru = true; 1340 port->passthru = true;
1331 eth_hw_addr_inherit(dev, lowerdev); 1341 eth_hw_addr_inherit(dev, lowerdev);
1332 } 1342 }
1333 1343
1334 if (data && data[IFLA_MACVLAN_MACADDR_MODE]) { 1344 if (data && data[IFLA_MACVLAN_MACADDR_MODE]) {
1335 if (vlan->mode != MACVLAN_MODE_SOURCE) 1345 if (vlan->mode != MACVLAN_MODE_SOURCE) {
1336 return -EINVAL; 1346 err = -EINVAL;
1347 goto destroy_macvlan_port;
1348 }
1337 macmode = nla_get_u32(data[IFLA_MACVLAN_MACADDR_MODE]); 1349 macmode = nla_get_u32(data[IFLA_MACVLAN_MACADDR_MODE]);
1338 err = macvlan_changelink_sources(vlan, macmode, data); 1350 err = macvlan_changelink_sources(vlan, macmode, data);
1339 if (err) 1351 if (err)
1340 return err; 1352 goto destroy_macvlan_port;
1341 } 1353 }
1342 1354
1343 err = register_netdevice(dev); 1355 err = register_netdevice(dev);
1344 if (err < 0) 1356 if (err < 0)
1345 return err; 1357 goto destroy_macvlan_port;
1346 1358
1347 dev->priv_flags |= IFF_MACVLAN; 1359 dev->priv_flags |= IFF_MACVLAN;
1348 err = netdev_upper_dev_link(lowerdev, dev); 1360 err = netdev_upper_dev_link(lowerdev, dev);
@@ -1357,7 +1369,9 @@ int macvlan_common_newlink(struct net *src_net, struct net_device *dev,
1357 1369
1358unregister_netdev: 1370unregister_netdev:
1359 unregister_netdevice(dev); 1371 unregister_netdevice(dev);
1360 1372destroy_macvlan_port:
1373 if (create)
1374 macvlan_port_destroy(port->dev);
1361 return err; 1375 return err;
1362} 1376}
1363EXPORT_SYMBOL_GPL(macvlan_common_newlink); 1377EXPORT_SYMBOL_GPL(macvlan_common_newlink);
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 070e3290aa6e..7869b0651576 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -491,7 +491,13 @@ static int macvtap_newlink(struct net *src_net,
491 /* Don't put anything that may fail after macvlan_common_newlink 491 /* Don't put anything that may fail after macvlan_common_newlink
492 * because we can't undo what it does. 492 * because we can't undo what it does.
493 */ 493 */
494 return macvlan_common_newlink(src_net, dev, tb, data); 494 err = macvlan_common_newlink(src_net, dev, tb, data);
495 if (err) {
496 netdev_rx_handler_unregister(dev);
497 return err;
498 }
499
500 return 0;
495} 501}
496 502
497static void macvtap_dellink(struct net_device *dev, 503static void macvtap_dellink(struct net_device *dev,
@@ -736,13 +742,8 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
736 742
737 if (zerocopy) 743 if (zerocopy)
738 err = zerocopy_sg_from_iter(skb, from); 744 err = zerocopy_sg_from_iter(skb, from);
739 else { 745 else
740 err = skb_copy_datagram_from_iter(skb, 0, from, len); 746 err = skb_copy_datagram_from_iter(skb, 0, from, len);
741 if (!err && m && m->msg_control) {
742 struct ubuf_info *uarg = m->msg_control;
743 uarg->callback(uarg, false);
744 }
745 }
746 747
747 if (err) 748 if (err)
748 goto err_kfree; 749 goto err_kfree;
@@ -773,7 +774,11 @@ static ssize_t macvtap_get_user(struct macvtap_queue *q, struct msghdr *m,
773 skb_shinfo(skb)->destructor_arg = m->msg_control; 774 skb_shinfo(skb)->destructor_arg = m->msg_control;
774 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; 775 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
775 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; 776 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
777 } else if (m && m->msg_control) {
778 struct ubuf_info *uarg = m->msg_control;
779 uarg->callback(uarg, false);
776 } 780 }
781
777 if (vlan) { 782 if (vlan) {
778 skb->dev = vlan->dev; 783 skb->dev = vlan->dev;
779 dev_queue_xmit(skb); 784 dev_queue_xmit(skb);
diff --git a/drivers/net/phy/fixed_phy.c b/drivers/net/phy/fixed_phy.c
index c649c101bbab..eb5167210681 100644
--- a/drivers/net/phy/fixed_phy.c
+++ b/drivers/net/phy/fixed_phy.c
@@ -279,7 +279,7 @@ EXPORT_SYMBOL_GPL(fixed_phy_register);
279void fixed_phy_unregister(struct phy_device *phy) 279void fixed_phy_unregister(struct phy_device *phy)
280{ 280{
281 phy_device_remove(phy); 281 phy_device_remove(phy);
282 282 of_node_put(phy->mdio.dev.of_node);
283 fixed_phy_del(phy->mdio.addr); 283 fixed_phy_del(phy->mdio.addr);
284} 284}
285EXPORT_SYMBOL_GPL(fixed_phy_unregister); 285EXPORT_SYMBOL_GPL(fixed_phy_unregister);
diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 081df68d2ce1..ea92d524d5a8 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -318,12 +318,12 @@ static int ksz8041_config_init(struct phy_device *phydev)
318 /* Limit supported and advertised modes in fiber mode */ 318 /* Limit supported and advertised modes in fiber mode */
319 if (of_property_read_bool(of_node, "micrel,fiber-mode")) { 319 if (of_property_read_bool(of_node, "micrel,fiber-mode")) {
320 phydev->dev_flags |= MICREL_PHY_FXEN; 320 phydev->dev_flags |= MICREL_PHY_FXEN;
321 phydev->supported &= SUPPORTED_FIBRE | 321 phydev->supported &= SUPPORTED_100baseT_Full |
322 SUPPORTED_100baseT_Full |
323 SUPPORTED_100baseT_Half; 322 SUPPORTED_100baseT_Half;
324 phydev->advertising &= ADVERTISED_FIBRE | 323 phydev->supported |= SUPPORTED_FIBRE;
325 ADVERTISED_100baseT_Full | 324 phydev->advertising &= ADVERTISED_100baseT_Full |
326 ADVERTISED_100baseT_Half; 325 ADVERTISED_100baseT_Half;
326 phydev->advertising |= ADVERTISED_FIBRE;
327 phydev->autoneg = AUTONEG_DISABLE; 327 phydev->autoneg = AUTONEG_DISABLE;
328 } 328 }
329 329
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index e977ba931878..c4ceb082e970 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -723,6 +723,7 @@ struct phy_device *phy_connect(struct net_device *dev, const char *bus_id,
723 phydev = to_phy_device(d); 723 phydev = to_phy_device(d);
724 724
725 rc = phy_connect_direct(dev, phydev, handler, interface); 725 rc = phy_connect_direct(dev, phydev, handler, interface);
726 put_device(d);
726 if (rc) 727 if (rc)
727 return ERR_PTR(rc); 728 return ERR_PTR(rc);
728 729
@@ -856,11 +857,17 @@ EXPORT_SYMBOL(phy_attached_print);
856int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, 857int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
857 u32 flags, phy_interface_t interface) 858 u32 flags, phy_interface_t interface)
858{ 859{
860 struct module *ndev_owner = dev->dev.parent->driver->owner;
859 struct mii_bus *bus = phydev->mdio.bus; 861 struct mii_bus *bus = phydev->mdio.bus;
860 struct device *d = &phydev->mdio.dev; 862 struct device *d = &phydev->mdio.dev;
861 int err; 863 int err;
862 864
863 if (!try_module_get(bus->owner)) { 865 /* For Ethernet device drivers that register their own MDIO bus, we
866 * will have bus->owner match ndev_mod, so we do not want to increment
867 * our own module->refcnt here, otherwise we would not be able to
868 * unload later on.
869 */
870 if (ndev_owner != bus->owner && !try_module_get(bus->owner)) {
864 dev_err(&dev->dev, "failed to get the bus module\n"); 871 dev_err(&dev->dev, "failed to get the bus module\n");
865 return -EIO; 872 return -EIO;
866 } 873 }
@@ -920,7 +927,8 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
920 927
921error: 928error:
922 put_device(d); 929 put_device(d);
923 module_put(bus->owner); 930 if (ndev_owner != bus->owner)
931 module_put(bus->owner);
924 return err; 932 return err;
925} 933}
926EXPORT_SYMBOL(phy_attach_direct); 934EXPORT_SYMBOL(phy_attach_direct);
@@ -953,6 +961,7 @@ struct phy_device *phy_attach(struct net_device *dev, const char *bus_id,
953 phydev = to_phy_device(d); 961 phydev = to_phy_device(d);
954 962
955 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface); 963 rc = phy_attach_direct(dev, phydev, phydev->dev_flags, interface);
964 put_device(d);
956 if (rc) 965 if (rc)
957 return ERR_PTR(rc); 966 return ERR_PTR(rc);
958 967
@@ -969,6 +978,8 @@ EXPORT_SYMBOL(phy_attach);
969 */ 978 */
970void phy_detach(struct phy_device *phydev) 979void phy_detach(struct phy_device *phydev)
971{ 980{
981 struct net_device *dev = phydev->attached_dev;
982 struct module *ndev_owner = dev->dev.parent->driver->owner;
972 struct mii_bus *bus; 983 struct mii_bus *bus;
973 int i; 984 int i;
974 985
@@ -996,7 +1007,8 @@ void phy_detach(struct phy_device *phydev)
996 bus = phydev->mdio.bus; 1007 bus = phydev->mdio.bus;
997 1008
998 put_device(&phydev->mdio.dev); 1009 put_device(&phydev->mdio.dev);
999 module_put(bus->owner); 1010 if (ndev_owner != bus->owner)
1011 module_put(bus->owner);
1000} 1012}
1001EXPORT_SYMBOL(phy_detach); 1013EXPORT_SYMBOL(phy_detach);
1002 1014
diff --git a/drivers/net/phy/realtek.c b/drivers/net/phy/realtek.c
index aadd6e9f54ad..9cbe645e3d89 100644
--- a/drivers/net/phy/realtek.c
+++ b/drivers/net/phy/realtek.c
@@ -102,15 +102,19 @@ static int rtl8211f_config_init(struct phy_device *phydev)
102 if (ret < 0) 102 if (ret < 0)
103 return ret; 103 return ret;
104 104
105 if (phydev->interface == PHY_INTERFACE_MODE_RGMII) { 105 phy_write(phydev, RTL8211F_PAGE_SELECT, 0xd08);
106 /* enable TXDLY */ 106 reg = phy_read(phydev, 0x11);
107 phy_write(phydev, RTL8211F_PAGE_SELECT, 0xd08); 107
108 reg = phy_read(phydev, 0x11); 108 /* enable TX-delay for rgmii-id and rgmii-txid, otherwise disable it */
109 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
110 phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
109 reg |= RTL8211F_TX_DELAY; 111 reg |= RTL8211F_TX_DELAY;
110 phy_write(phydev, 0x11, reg); 112 else
111 /* restore to default page 0 */ 113 reg &= ~RTL8211F_TX_DELAY;
112 phy_write(phydev, RTL8211F_PAGE_SELECT, 0x0); 114
113 } 115 phy_write(phydev, 0x11, reg);
116 /* restore to default page 0 */
117 phy_write(phydev, RTL8211F_PAGE_SELECT, 0x0);
114 118
115 return 0; 119 return 0;
116} 120}
diff --git a/drivers/net/phy/vitesse.c b/drivers/net/phy/vitesse.c
index 2e37eb337d48..24b4a09468dd 100644
--- a/drivers/net/phy/vitesse.c
+++ b/drivers/net/phy/vitesse.c
@@ -62,6 +62,10 @@
62/* Vitesse Extended Page Access Register */ 62/* Vitesse Extended Page Access Register */
63#define MII_VSC82X4_EXT_PAGE_ACCESS 0x1f 63#define MII_VSC82X4_EXT_PAGE_ACCESS 0x1f
64 64
65/* Vitesse VSC8601 Extended PHY Control Register 1 */
66#define MII_VSC8601_EPHY_CTL 0x17
67#define MII_VSC8601_EPHY_CTL_RGMII_SKEW (1 << 8)
68
65#define PHY_ID_VSC8234 0x000fc620 69#define PHY_ID_VSC8234 0x000fc620
66#define PHY_ID_VSC8244 0x000fc6c0 70#define PHY_ID_VSC8244 0x000fc6c0
67#define PHY_ID_VSC8514 0x00070670 71#define PHY_ID_VSC8514 0x00070670
@@ -111,6 +115,34 @@ static int vsc824x_config_init(struct phy_device *phydev)
111 return err; 115 return err;
112} 116}
113 117
118/* This adds a skew for both TX and RX clocks, so the skew should only be
119 * applied to "rgmii-id" interfaces. It may not work as expected
120 * on "rgmii-txid", "rgmii-rxid" or "rgmii" interfaces. */
121static int vsc8601_add_skew(struct phy_device *phydev)
122{
123 int ret;
124
125 ret = phy_read(phydev, MII_VSC8601_EPHY_CTL);
126 if (ret < 0)
127 return ret;
128
129 ret |= MII_VSC8601_EPHY_CTL_RGMII_SKEW;
130 return phy_write(phydev, MII_VSC8601_EPHY_CTL, ret);
131}
132
133static int vsc8601_config_init(struct phy_device *phydev)
134{
135 int ret = 0;
136
137 if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID)
138 ret = vsc8601_add_skew(phydev);
139
140 if (ret < 0)
141 return ret;
142
143 return genphy_config_init(phydev);
144}
145
114static int vsc824x_ack_interrupt(struct phy_device *phydev) 146static int vsc824x_ack_interrupt(struct phy_device *phydev)
115{ 147{
116 int err = 0; 148 int err = 0;
@@ -275,7 +307,7 @@ static struct phy_driver vsc82xx_driver[] = {
275 .phy_id_mask = 0x000ffff0, 307 .phy_id_mask = 0x000ffff0,
276 .features = PHY_GBIT_FEATURES, 308 .features = PHY_GBIT_FEATURES,
277 .flags = PHY_HAS_INTERRUPT, 309 .flags = PHY_HAS_INTERRUPT,
278 .config_init = &genphy_config_init, 310 .config_init = &vsc8601_config_init,
279 .config_aneg = &genphy_config_aneg, 311 .config_aneg = &genphy_config_aneg,
280 .read_status = &genphy_read_status, 312 .read_status = &genphy_read_status,
281 .ack_interrupt = &vsc824x_ack_interrupt, 313 .ack_interrupt = &vsc824x_ack_interrupt,
diff --git a/drivers/net/tun.c b/drivers/net/tun.c
index 8093e39ae263..db6acecabeaa 100644
--- a/drivers/net/tun.c
+++ b/drivers/net/tun.c
@@ -1246,13 +1246,8 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
1246 1246
1247 if (zerocopy) 1247 if (zerocopy)
1248 err = zerocopy_sg_from_iter(skb, from); 1248 err = zerocopy_sg_from_iter(skb, from);
1249 else { 1249 else
1250 err = skb_copy_datagram_from_iter(skb, 0, from, len); 1250 err = skb_copy_datagram_from_iter(skb, 0, from, len);
1251 if (!err && msg_control) {
1252 struct ubuf_info *uarg = msg_control;
1253 uarg->callback(uarg, false);
1254 }
1255 }
1256 1251
1257 if (err) { 1252 if (err) {
1258 this_cpu_inc(tun->pcpu_stats->rx_dropped); 1253 this_cpu_inc(tun->pcpu_stats->rx_dropped);
@@ -1298,6 +1293,9 @@ static ssize_t tun_get_user(struct tun_struct *tun, struct tun_file *tfile,
1298 skb_shinfo(skb)->destructor_arg = msg_control; 1293 skb_shinfo(skb)->destructor_arg = msg_control;
1299 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY; 1294 skb_shinfo(skb)->tx_flags |= SKBTX_DEV_ZEROCOPY;
1300 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG; 1295 skb_shinfo(skb)->tx_flags |= SKBTX_SHARED_FRAG;
1296 } else if (msg_control) {
1297 struct ubuf_info *uarg = msg_control;
1298 uarg->callback(uarg, false);
1301 } 1299 }
1302 1300
1303 skb_reset_network_header(skb); 1301 skb_reset_network_header(skb);
diff --git a/drivers/net/usb/asix_devices.c b/drivers/net/usb/asix_devices.c
index cce24950a0ab..dc7b6392e75a 100644
--- a/drivers/net/usb/asix_devices.c
+++ b/drivers/net/usb/asix_devices.c
@@ -603,12 +603,12 @@ static void ax88772_suspend(struct usbnet *dev)
603 u16 medium; 603 u16 medium;
604 604
605 /* Stop MAC operation */ 605 /* Stop MAC operation */
606 medium = asix_read_medium_status(dev, 0); 606 medium = asix_read_medium_status(dev, 1);
607 medium &= ~AX_MEDIUM_RE; 607 medium &= ~AX_MEDIUM_RE;
608 asix_write_medium_mode(dev, medium, 0); 608 asix_write_medium_mode(dev, medium, 1);
609 609
610 netdev_dbg(dev->net, "ax88772_suspend: medium=0x%04x\n", 610 netdev_dbg(dev->net, "ax88772_suspend: medium=0x%04x\n",
611 asix_read_medium_status(dev, 0)); 611 asix_read_medium_status(dev, 1));
612 612
613 /* Preserve BMCR for restoring */ 613 /* Preserve BMCR for restoring */
614 priv->presvd_phy_bmcr = 614 priv->presvd_phy_bmcr =
diff --git a/drivers/net/usb/ax88179_178a.c b/drivers/net/usb/ax88179_178a.c
index e6338c16081a..8a6675d92b98 100644
--- a/drivers/net/usb/ax88179_178a.c
+++ b/drivers/net/usb/ax88179_178a.c
@@ -1656,6 +1656,19 @@ static const struct driver_info ax88178a_info = {
1656 .tx_fixup = ax88179_tx_fixup, 1656 .tx_fixup = ax88179_tx_fixup,
1657}; 1657};
1658 1658
1659static const struct driver_info cypress_GX3_info = {
1660 .description = "Cypress GX3 SuperSpeed to Gigabit Ethernet Controller",
1661 .bind = ax88179_bind,
1662 .unbind = ax88179_unbind,
1663 .status = ax88179_status,
1664 .link_reset = ax88179_link_reset,
1665 .reset = ax88179_reset,
1666 .stop = ax88179_stop,
1667 .flags = FLAG_ETHER | FLAG_FRAMING_AX,
1668 .rx_fixup = ax88179_rx_fixup,
1669 .tx_fixup = ax88179_tx_fixup,
1670};
1671
1659static const struct driver_info dlink_dub1312_info = { 1672static const struct driver_info dlink_dub1312_info = {
1660 .description = "D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter", 1673 .description = "D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter",
1661 .bind = ax88179_bind, 1674 .bind = ax88179_bind,
@@ -1718,6 +1731,10 @@ static const struct usb_device_id products[] = {
1718 USB_DEVICE(0x0b95, 0x178a), 1731 USB_DEVICE(0x0b95, 0x178a),
1719 .driver_info = (unsigned long)&ax88178a_info, 1732 .driver_info = (unsigned long)&ax88178a_info,
1720}, { 1733}, {
1734 /* Cypress GX3 SuperSpeed to Gigabit Ethernet Bridge Controller */
1735 USB_DEVICE(0x04b4, 0x3610),
1736 .driver_info = (unsigned long)&cypress_GX3_info,
1737}, {
1721 /* D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter */ 1738 /* D-Link DUB-1312 USB 3.0 to Gigabit Ethernet Adapter */
1722 USB_DEVICE(0x2001, 0x4a00), 1739 USB_DEVICE(0x2001, 0x4a00),
1723 .driver_info = (unsigned long)&dlink_dub1312_info, 1740 .driver_info = (unsigned long)&dlink_dub1312_info,
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
index c47ec0a04c8e..dd623f674487 100644
--- a/drivers/net/usb/cdc_ether.c
+++ b/drivers/net/usb/cdc_ether.c
@@ -388,12 +388,6 @@ void usbnet_cdc_status(struct usbnet *dev, struct urb *urb)
388 case USB_CDC_NOTIFY_NETWORK_CONNECTION: 388 case USB_CDC_NOTIFY_NETWORK_CONNECTION:
389 netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n", 389 netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
390 event->wValue ? "on" : "off"); 390 event->wValue ? "on" : "off");
391
392 /* Work-around for devices with broken off-notifications */
393 if (event->wValue &&
394 !test_bit(__LINK_STATE_NOCARRIER, &dev->net->state))
395 usbnet_link_change(dev, 0, 0);
396
397 usbnet_link_change(dev, !!event->wValue, 0); 391 usbnet_link_change(dev, !!event->wValue, 0);
398 break; 392 break;
399 case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */ 393 case USB_CDC_NOTIFY_SPEED_CHANGE: /* tx/rx rates */
@@ -466,6 +460,36 @@ static int usbnet_cdc_zte_rx_fixup(struct usbnet *dev, struct sk_buff *skb)
466 return 1; 460 return 1;
467} 461}
468 462
463/* Ensure correct link state
464 *
465 * Some devices (ZTE MF823/831/910) export two carrier on notifications when
466 * connected. This causes the link state to be incorrect. Work around this by
467 * always setting the state to off, then on.
468 */
469void usbnet_cdc_zte_status(struct usbnet *dev, struct urb *urb)
470{
471 struct usb_cdc_notification *event;
472
473 if (urb->actual_length < sizeof(*event))
474 return;
475
476 event = urb->transfer_buffer;
477
478 if (event->bNotificationType != USB_CDC_NOTIFY_NETWORK_CONNECTION) {
479 usbnet_cdc_status(dev, urb);
480 return;
481 }
482
483 netif_dbg(dev, timer, dev->net, "CDC: carrier %s\n",
484 event->wValue ? "on" : "off");
485
486 if (event->wValue &&
487 netif_carrier_ok(dev->net))
488 netif_carrier_off(dev->net);
489
490 usbnet_link_change(dev, !!event->wValue, 0);
491}
492
469static const struct driver_info cdc_info = { 493static const struct driver_info cdc_info = {
470 .description = "CDC Ethernet Device", 494 .description = "CDC Ethernet Device",
471 .flags = FLAG_ETHER | FLAG_POINTTOPOINT, 495 .flags = FLAG_ETHER | FLAG_POINTTOPOINT,
@@ -481,7 +505,7 @@ static const struct driver_info zte_cdc_info = {
481 .flags = FLAG_ETHER | FLAG_POINTTOPOINT, 505 .flags = FLAG_ETHER | FLAG_POINTTOPOINT,
482 .bind = usbnet_cdc_zte_bind, 506 .bind = usbnet_cdc_zte_bind,
483 .unbind = usbnet_cdc_unbind, 507 .unbind = usbnet_cdc_unbind,
484 .status = usbnet_cdc_status, 508 .status = usbnet_cdc_zte_status,
485 .set_rx_mode = usbnet_cdc_update_filter, 509 .set_rx_mode = usbnet_cdc_update_filter,
486 .manage_power = usbnet_manage_power, 510 .manage_power = usbnet_manage_power,
487 .rx_fixup = usbnet_cdc_zte_rx_fixup, 511 .rx_fixup = usbnet_cdc_zte_rx_fixup,
diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c
index 96a5028621c8..3a98f3762a4c 100644
--- a/drivers/net/usb/cdc_mbim.c
+++ b/drivers/net/usb/cdc_mbim.c
@@ -602,6 +602,21 @@ static const struct driver_info cdc_mbim_info_ndp_to_end = {
602 .data = CDC_NCM_FLAG_NDP_TO_END, 602 .data = CDC_NCM_FLAG_NDP_TO_END,
603}; 603};
604 604
605/* Some modems (e.g. Telit LE922A6) do not work properly with altsetting
606 * toggle done in cdc_ncm_bind_common. CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE
607 * flag is used to avoid this procedure.
608 */
609static const struct driver_info cdc_mbim_info_avoid_altsetting_toggle = {
610 .description = "CDC MBIM",
611 .flags = FLAG_NO_SETINT | FLAG_MULTI_PACKET | FLAG_WWAN,
612 .bind = cdc_mbim_bind,
613 .unbind = cdc_mbim_unbind,
614 .manage_power = cdc_mbim_manage_power,
615 .rx_fixup = cdc_mbim_rx_fixup,
616 .tx_fixup = cdc_mbim_tx_fixup,
617 .data = CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE,
618};
619
605static const struct usb_device_id mbim_devs[] = { 620static const struct usb_device_id mbim_devs[] = {
606 /* This duplicate NCM entry is intentional. MBIM devices can 621 /* This duplicate NCM entry is intentional. MBIM devices can
607 * be disguised as NCM by default, and this is necessary to 622 * be disguised as NCM by default, and this is necessary to
@@ -626,6 +641,12 @@ static const struct usb_device_id mbim_devs[] = {
626 { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), 641 { USB_VENDOR_AND_INTERFACE_INFO(0x12d1, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
627 .driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end, 642 .driver_info = (unsigned long)&cdc_mbim_info_ndp_to_end,
628 }, 643 },
644
645 /* Telit LE922A6 in MBIM composition */
646 { USB_DEVICE_AND_INTERFACE_INFO(0x1bc7, 0x1041, USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
647 .driver_info = (unsigned long)&cdc_mbim_info_avoid_altsetting_toggle,
648 },
649
629 /* default entry */ 650 /* default entry */
630 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE), 651 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MBIM, USB_CDC_PROTO_NONE),
631 .driver_info = (unsigned long)&cdc_mbim_info_zlp, 652 .driver_info = (unsigned long)&cdc_mbim_info_zlp,
diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c
index 877c9516e781..afbfc0f656f3 100644
--- a/drivers/net/usb/cdc_ncm.c
+++ b/drivers/net/usb/cdc_ncm.c
@@ -839,11 +839,18 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
839 839
840 iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber; 840 iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber;
841 841
842 /* Device-specific flags */
843 ctx->drvflags = drvflags;
844
842 /* Reset data interface. Some devices will not reset properly 845 /* Reset data interface. Some devices will not reset properly
843 * unless they are configured first. Toggle the altsetting to 846 * unless they are configured first. Toggle the altsetting to
844 * force a reset 847 * force a reset.
848 * Some other devices do not work properly with this procedure
849 * that can be avoided using quirk CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE
845 */ 850 */
846 usb_set_interface(dev->udev, iface_no, data_altsetting); 851 if (!(ctx->drvflags & CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE))
852 usb_set_interface(dev->udev, iface_no, data_altsetting);
853
847 temp = usb_set_interface(dev->udev, iface_no, 0); 854 temp = usb_set_interface(dev->udev, iface_no, 0);
848 if (temp) { 855 if (temp) {
849 dev_dbg(&intf->dev, "set interface failed\n"); 856 dev_dbg(&intf->dev, "set interface failed\n");
@@ -890,9 +897,6 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_
890 /* finish setting up the device specific data */ 897 /* finish setting up the device specific data */
891 cdc_ncm_setup(dev); 898 cdc_ncm_setup(dev);
892 899
893 /* Device-specific flags */
894 ctx->drvflags = drvflags;
895
896 /* Allocate the delayed NDP if needed. */ 900 /* Allocate the delayed NDP if needed. */
897 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) { 901 if (ctx->drvflags & CDC_NCM_FLAG_NDP_TO_END) {
898 ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL); 902 ctx->delayed_ndp16 = kzalloc(ctx->max_ndp_size, GFP_KERNEL);
diff --git a/drivers/net/usb/lan78xx.c b/drivers/net/usb/lan78xx.c
index db558b8b32fe..f33460cec79f 100644
--- a/drivers/net/usb/lan78xx.c
+++ b/drivers/net/usb/lan78xx.c
@@ -3395,6 +3395,7 @@ static int lan78xx_probe(struct usb_interface *intf,
3395 if (buf) { 3395 if (buf) {
3396 dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL); 3396 dev->urb_intr = usb_alloc_urb(0, GFP_KERNEL);
3397 if (!dev->urb_intr) { 3397 if (!dev->urb_intr) {
3398 ret = -ENOMEM;
3398 kfree(buf); 3399 kfree(buf);
3399 goto out3; 3400 goto out3;
3400 } else { 3401 } else {
diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
index 3ff76c6db4f6..6fe1cdb0174f 100644
--- a/drivers/net/usb/qmi_wwan.c
+++ b/drivers/net/usb/qmi_wwan.c
@@ -894,6 +894,7 @@ static const struct usb_device_id products[] = {
894 {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */ 894 {QMI_FIXED_INTF(0x1bbb, 0x0203, 2)}, /* Alcatel L800MA */
895 {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */ 895 {QMI_FIXED_INTF(0x2357, 0x0201, 4)}, /* TP-LINK HSUPA Modem MA180 */
896 {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */ 896 {QMI_FIXED_INTF(0x2357, 0x9000, 4)}, /* TP-LINK MA260 */
897 {QMI_QUIRK_SET_DTR(0x1bc7, 0x1040, 2)}, /* Telit LE922A */
897 {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */ 898 {QMI_FIXED_INTF(0x1bc7, 0x1200, 5)}, /* Telit LE920 */
898 {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */ 899 {QMI_FIXED_INTF(0x1bc7, 0x1201, 2)}, /* Telit LE920 */
899 {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */ 900 {QMI_FIXED_INTF(0x1c9e, 0x9b01, 3)}, /* XS Stick W100-2 from 4G Systems */
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
index 44d439f50961..efb84f092492 100644
--- a/drivers/net/usb/r8152.c
+++ b/drivers/net/usb/r8152.c
@@ -1730,7 +1730,7 @@ static u8 r8152_rx_csum(struct r8152 *tp, struct rx_desc *rx_desc)
1730 u8 checksum = CHECKSUM_NONE; 1730 u8 checksum = CHECKSUM_NONE;
1731 u32 opts2, opts3; 1731 u32 opts2, opts3;
1732 1732
1733 if (tp->version == RTL_VER_01) 1733 if (tp->version == RTL_VER_01 || tp->version == RTL_VER_02)
1734 goto return_result; 1734 goto return_result;
1735 1735
1736 opts2 = le32_to_cpu(rx_desc->opts2); 1736 opts2 = le32_to_cpu(rx_desc->opts2);
@@ -1745,7 +1745,7 @@ static u8 r8152_rx_csum(struct r8152 *tp, struct rx_desc *rx_desc)
1745 checksum = CHECKSUM_NONE; 1745 checksum = CHECKSUM_NONE;
1746 else 1746 else
1747 checksum = CHECKSUM_UNNECESSARY; 1747 checksum = CHECKSUM_UNNECESSARY;
1748 } else if (RD_IPV6_CS) { 1748 } else if (opts2 & RD_IPV6_CS) {
1749 if ((opts2 & RD_UDP_CS) && !(opts3 & UDPF)) 1749 if ((opts2 & RD_UDP_CS) && !(opts3 & UDPF))
1750 checksum = CHECKSUM_UNNECESSARY; 1750 checksum = CHECKSUM_UNNECESSARY;
1751 else if ((opts2 & RD_TCP_CS) && !(opts3 & TCPF)) 1751 else if ((opts2 & RD_TCP_CS) && !(opts3 & TCPF))
@@ -3266,10 +3266,8 @@ static int rtl8152_open(struct net_device *netdev)
3266 goto out; 3266 goto out;
3267 3267
3268 res = usb_autopm_get_interface(tp->intf); 3268 res = usb_autopm_get_interface(tp->intf);
3269 if (res < 0) { 3269 if (res < 0)
3270 free_all_mem(tp); 3270 goto out_free;
3271 goto out;
3272 }
3273 3271
3274 mutex_lock(&tp->control); 3272 mutex_lock(&tp->control);
3275 3273
@@ -3285,10 +3283,9 @@ static int rtl8152_open(struct net_device *netdev)
3285 netif_device_detach(tp->netdev); 3283 netif_device_detach(tp->netdev);
3286 netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n", 3284 netif_warn(tp, ifup, netdev, "intr_urb submit failed: %d\n",
3287 res); 3285 res);
3288 free_all_mem(tp); 3286 goto out_unlock;
3289 } else {
3290 napi_enable(&tp->napi);
3291 } 3287 }
3288 napi_enable(&tp->napi);
3292 3289
3293 mutex_unlock(&tp->control); 3290 mutex_unlock(&tp->control);
3294 3291
@@ -3297,7 +3294,13 @@ static int rtl8152_open(struct net_device *netdev)
3297 tp->pm_notifier.notifier_call = rtl_notifier; 3294 tp->pm_notifier.notifier_call = rtl_notifier;
3298 register_pm_notifier(&tp->pm_notifier); 3295 register_pm_notifier(&tp->pm_notifier);
3299#endif 3296#endif
3297 return 0;
3300 3298
3299out_unlock:
3300 mutex_unlock(&tp->control);
3301 usb_autopm_put_interface(tp->intf);
3302out_free:
3303 free_all_mem(tp);
3301out: 3304out:
3302 return res; 3305 return res;
3303} 3306}
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
index fad84f3f4109..cbf1c613c67a 100644
--- a/drivers/net/virtio_net.c
+++ b/drivers/net/virtio_net.c
@@ -969,12 +969,17 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
969 struct virtnet_info *vi = netdev_priv(dev); 969 struct virtnet_info *vi = netdev_priv(dev);
970 struct virtio_device *vdev = vi->vdev; 970 struct virtio_device *vdev = vi->vdev;
971 int ret; 971 int ret;
972 struct sockaddr *addr = p; 972 struct sockaddr *addr;
973 struct scatterlist sg; 973 struct scatterlist sg;
974 974
975 ret = eth_prepare_mac_addr_change(dev, p); 975 addr = kmalloc(sizeof(*addr), GFP_KERNEL);
976 if (!addr)
977 return -ENOMEM;
978 memcpy(addr, p, sizeof(*addr));
979
980 ret = eth_prepare_mac_addr_change(dev, addr);
976 if (ret) 981 if (ret)
977 return ret; 982 goto out;
978 983
979 if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR)) { 984 if (virtio_has_feature(vdev, VIRTIO_NET_F_CTRL_MAC_ADDR)) {
980 sg_init_one(&sg, addr->sa_data, dev->addr_len); 985 sg_init_one(&sg, addr->sa_data, dev->addr_len);
@@ -982,7 +987,8 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
982 VIRTIO_NET_CTRL_MAC_ADDR_SET, &sg)) { 987 VIRTIO_NET_CTRL_MAC_ADDR_SET, &sg)) {
983 dev_warn(&vdev->dev, 988 dev_warn(&vdev->dev,
984 "Failed to set mac address by vq command.\n"); 989 "Failed to set mac address by vq command.\n");
985 return -EINVAL; 990 ret = -EINVAL;
991 goto out;
986 } 992 }
987 } else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC) && 993 } else if (virtio_has_feature(vdev, VIRTIO_NET_F_MAC) &&
988 !virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) { 994 !virtio_has_feature(vdev, VIRTIO_F_VERSION_1)) {
@@ -996,8 +1002,11 @@ static int virtnet_set_mac_address(struct net_device *dev, void *p)
996 } 1002 }
997 1003
998 eth_commit_mac_addr_change(dev, p); 1004 eth_commit_mac_addr_change(dev, p);
1005 ret = 0;
999 1006
1000 return 0; 1007out:
1008 kfree(addr);
1009 return ret;
1001} 1010}
1002 1011
1003static struct rtnl_link_stats64 *virtnet_stats(struct net_device *dev, 1012static struct rtnl_link_stats64 *virtnet_stats(struct net_device *dev,
@@ -1497,6 +1506,11 @@ static void virtnet_free_queues(struct virtnet_info *vi)
1497 netif_napi_del(&vi->rq[i].napi); 1506 netif_napi_del(&vi->rq[i].napi);
1498 } 1507 }
1499 1508
1509 /* We called napi_hash_del() before netif_napi_del(),
1510 * we need to respect an RCU grace period before freeing vi->rq
1511 */
1512 synchronize_net();
1513
1500 kfree(vi->rq); 1514 kfree(vi->rq);
1501 kfree(vi->sq); 1515 kfree(vi->sq);
1502} 1516}
@@ -2038,23 +2052,33 @@ static struct virtio_device_id id_table[] = {
2038 { 0 }, 2052 { 0 },
2039}; 2053};
2040 2054
2055#define VIRTNET_FEATURES \
2056 VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, \
2057 VIRTIO_NET_F_MAC, \
2058 VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, \
2059 VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, \
2060 VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, \
2061 VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, \
2062 VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN, \
2063 VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ, \
2064 VIRTIO_NET_F_CTRL_MAC_ADDR, \
2065 VIRTIO_NET_F_MTU
2066
2041static unsigned int features[] = { 2067static unsigned int features[] = {
2042 VIRTIO_NET_F_CSUM, VIRTIO_NET_F_GUEST_CSUM, 2068 VIRTNET_FEATURES,
2043 VIRTIO_NET_F_GSO, VIRTIO_NET_F_MAC, 2069};
2044 VIRTIO_NET_F_HOST_TSO4, VIRTIO_NET_F_HOST_UFO, VIRTIO_NET_F_HOST_TSO6, 2070
2045 VIRTIO_NET_F_HOST_ECN, VIRTIO_NET_F_GUEST_TSO4, VIRTIO_NET_F_GUEST_TSO6, 2071static unsigned int features_legacy[] = {
2046 VIRTIO_NET_F_GUEST_ECN, VIRTIO_NET_F_GUEST_UFO, 2072 VIRTNET_FEATURES,
2047 VIRTIO_NET_F_MRG_RXBUF, VIRTIO_NET_F_STATUS, VIRTIO_NET_F_CTRL_VQ, 2073 VIRTIO_NET_F_GSO,
2048 VIRTIO_NET_F_CTRL_RX, VIRTIO_NET_F_CTRL_VLAN,
2049 VIRTIO_NET_F_GUEST_ANNOUNCE, VIRTIO_NET_F_MQ,
2050 VIRTIO_NET_F_CTRL_MAC_ADDR,
2051 VIRTIO_F_ANY_LAYOUT, 2074 VIRTIO_F_ANY_LAYOUT,
2052 VIRTIO_NET_F_MTU,
2053}; 2075};
2054 2076
2055static struct virtio_driver virtio_net_driver = { 2077static struct virtio_driver virtio_net_driver = {
2056 .feature_table = features, 2078 .feature_table = features,
2057 .feature_table_size = ARRAY_SIZE(features), 2079 .feature_table_size = ARRAY_SIZE(features),
2080 .feature_table_legacy = features_legacy,
2081 .feature_table_size_legacy = ARRAY_SIZE(features_legacy),
2058 .driver.name = KBUILD_MODNAME, 2082 .driver.name = KBUILD_MODNAME,
2059 .driver.owner = THIS_MODULE, 2083 .driver.owner = THIS_MODULE,
2060 .id_table = id_table, 2084 .id_table = id_table,
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c
index f3c2fa3ab0d5..2ba01ca02c9c 100644
--- a/drivers/net/vxlan.c
+++ b/drivers/net/vxlan.c
@@ -611,6 +611,7 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
611 struct vxlan_rdst *rd = NULL; 611 struct vxlan_rdst *rd = NULL;
612 struct vxlan_fdb *f; 612 struct vxlan_fdb *f;
613 int notify = 0; 613 int notify = 0;
614 int rc;
614 615
615 f = __vxlan_find_mac(vxlan, mac); 616 f = __vxlan_find_mac(vxlan, mac);
616 if (f) { 617 if (f) {
@@ -641,8 +642,7 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
641 if ((flags & NLM_F_APPEND) && 642 if ((flags & NLM_F_APPEND) &&
642 (is_multicast_ether_addr(f->eth_addr) || 643 (is_multicast_ether_addr(f->eth_addr) ||
643 is_zero_ether_addr(f->eth_addr))) { 644 is_zero_ether_addr(f->eth_addr))) {
644 int rc = vxlan_fdb_append(f, ip, port, vni, ifindex, 645 rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
645 &rd);
646 646
647 if (rc < 0) 647 if (rc < 0)
648 return rc; 648 return rc;
@@ -673,7 +673,11 @@ static int vxlan_fdb_create(struct vxlan_dev *vxlan,
673 INIT_LIST_HEAD(&f->remotes); 673 INIT_LIST_HEAD(&f->remotes);
674 memcpy(f->eth_addr, mac, ETH_ALEN); 674 memcpy(f->eth_addr, mac, ETH_ALEN);
675 675
676 vxlan_fdb_append(f, ip, port, vni, ifindex, &rd); 676 rc = vxlan_fdb_append(f, ip, port, vni, ifindex, &rd);
677 if (rc < 0) {
678 kfree(f);
679 return rc;
680 }
677 681
678 ++vxlan->addrcnt; 682 ++vxlan->addrcnt;
679 hlist_add_head_rcu(&f->hlist, 683 hlist_add_head_rcu(&f->hlist,
@@ -944,7 +948,9 @@ static bool vxlan_group_used(struct vxlan_net *vn, struct vxlan_dev *dev)
944{ 948{
945 struct vxlan_dev *vxlan; 949 struct vxlan_dev *vxlan;
946 struct vxlan_sock *sock4; 950 struct vxlan_sock *sock4;
947 struct vxlan_sock *sock6 = NULL; 951#if IS_ENABLED(CONFIG_IPV6)
952 struct vxlan_sock *sock6;
953#endif
948 unsigned short family = dev->default_dst.remote_ip.sa.sa_family; 954 unsigned short family = dev->default_dst.remote_ip.sa.sa_family;
949 955
950 sock4 = rtnl_dereference(dev->vn4_sock); 956 sock4 = rtnl_dereference(dev->vn4_sock);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
index b777e1b2f87a..78d9966a3957 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
@@ -4516,7 +4516,7 @@ brcmf_cfg80211_start_ap(struct wiphy *wiphy, struct net_device *ndev,
4516 /* store current 11d setting */ 4516 /* store current 11d setting */
4517 if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY, 4517 if (brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_REGULATORY,
4518 &ifp->vif->is_11d)) { 4518 &ifp->vif->is_11d)) {
4519 supports_11d = false; 4519 is_11d = supports_11d = false;
4520 } else { 4520 } else {
4521 country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail, 4521 country_ie = brcmf_parse_tlvs((u8 *)settings->beacon.tail,
4522 settings->beacon.tail_len, 4522 settings->beacon.tail_len,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
index 4fdc3dad3e85..b88e2048ae0b 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/d3.c
@@ -1087,6 +1087,15 @@ iwl_mvm_netdetect_config(struct iwl_mvm *mvm,
1087 ret = iwl_mvm_switch_to_d3(mvm); 1087 ret = iwl_mvm_switch_to_d3(mvm);
1088 if (ret) 1088 if (ret)
1089 return ret; 1089 return ret;
1090 } else {
1091 /* In theory, we wouldn't have to stop a running sched
1092 * scan in order to start another one (for
1093 * net-detect). But in practice this doesn't seem to
1094 * work properly, so stop any running sched_scan now.
1095 */
1096 ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED, true);
1097 if (ret)
1098 return ret;
1090 } 1099 }
1091 1100
1092 /* rfkill release can be either for wowlan or netdetect */ 1101 /* rfkill release can be either for wowlan or netdetect */
@@ -1254,7 +1263,10 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
1254 out: 1263 out:
1255 if (ret < 0) { 1264 if (ret < 0) {
1256 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); 1265 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
1257 ieee80211_restart_hw(mvm->hw); 1266 if (mvm->restart_fw > 0) {
1267 mvm->restart_fw--;
1268 ieee80211_restart_hw(mvm->hw);
1269 }
1258 iwl_mvm_free_nd(mvm); 1270 iwl_mvm_free_nd(mvm);
1259 } 1271 }
1260 out_noreset: 1272 out_noreset:
@@ -2088,6 +2100,16 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
2088 iwl_mvm_update_changed_regdom(mvm); 2100 iwl_mvm_update_changed_regdom(mvm);
2089 2101
2090 if (mvm->net_detect) { 2102 if (mvm->net_detect) {
2103 /* If this is a non-unified image, we restart the FW,
2104 * so no need to stop the netdetect scan. If that
2105 * fails, continue and try to get the wake-up reasons,
2106 * but trigger a HW restart by keeping a failure code
2107 * in ret.
2108 */
2109 if (unified_image)
2110 ret = iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_NETDETECT,
2111 false);
2112
2091 iwl_mvm_query_netdetect_reasons(mvm, vif); 2113 iwl_mvm_query_netdetect_reasons(mvm, vif);
2092 /* has unlocked the mutex, so skip that */ 2114 /* has unlocked the mutex, so skip that */
2093 goto out; 2115 goto out;
@@ -2271,7 +2293,8 @@ static void iwl_mvm_d3_test_disconn_work_iter(void *_data, u8 *mac,
2271static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file) 2293static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
2272{ 2294{
2273 struct iwl_mvm *mvm = inode->i_private; 2295 struct iwl_mvm *mvm = inode->i_private;
2274 int remaining_time = 10; 2296 bool unified_image = fw_has_capa(&mvm->fw->ucode_capa,
2297 IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG);
2275 2298
2276 mvm->d3_test_active = false; 2299 mvm->d3_test_active = false;
2277 2300
@@ -2282,17 +2305,21 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
2282 mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED; 2305 mvm->trans->system_pm_mode = IWL_PLAT_PM_MODE_DISABLED;
2283 2306
2284 iwl_abort_notification_waits(&mvm->notif_wait); 2307 iwl_abort_notification_waits(&mvm->notif_wait);
2285 ieee80211_restart_hw(mvm->hw); 2308 if (!unified_image) {
2309 int remaining_time = 10;
2286 2310
2287 /* wait for restart and disconnect all interfaces */ 2311 ieee80211_restart_hw(mvm->hw);
2288 while (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) && 2312
2289 remaining_time > 0) { 2313 /* wait for restart and disconnect all interfaces */
2290 remaining_time--; 2314 while (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status) &&
2291 msleep(1000); 2315 remaining_time > 0) {
2292 } 2316 remaining_time--;
2317 msleep(1000);
2318 }
2293 2319
2294 if (remaining_time == 0) 2320 if (remaining_time == 0)
2295 IWL_ERR(mvm, "Timed out waiting for HW restart to finish!\n"); 2321 IWL_ERR(mvm, "Timed out waiting for HW restart!\n");
2322 }
2296 2323
2297 ieee80211_iterate_active_interfaces_atomic( 2324 ieee80211_iterate_active_interfaces_atomic(
2298 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, 2325 mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
index 07da4efe8458..7b7d2a146e30 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
@@ -1529,8 +1529,8 @@ static ssize_t iwl_dbgfs_mem_read(struct file *file, char __user *user_buf,
1529 .data = { &cmd, }, 1529 .data = { &cmd, },
1530 .len = { sizeof(cmd) }, 1530 .len = { sizeof(cmd) },
1531 }; 1531 };
1532 size_t delta, len; 1532 size_t delta;
1533 ssize_t ret; 1533 ssize_t ret, len;
1534 1534
1535 hcmd.id = iwl_cmd_id(*ppos >> 24 ? UMAC_RD_WR : LMAC_RD_WR, 1535 hcmd.id = iwl_cmd_id(*ppos >> 24 ? UMAC_RD_WR : LMAC_RD_WR,
1536 DEBUG_GROUP, 0); 1536 DEBUG_GROUP, 0);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
index 318efd814037..1db1dc13e988 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
@@ -4121,7 +4121,6 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
4121 struct iwl_mvm_internal_rxq_notif *notif, 4121 struct iwl_mvm_internal_rxq_notif *notif,
4122 u32 size) 4122 u32 size)
4123{ 4123{
4124 DECLARE_WAIT_QUEUE_HEAD_ONSTACK(notif_waitq);
4125 u32 qmask = BIT(mvm->trans->num_rx_queues) - 1; 4124 u32 qmask = BIT(mvm->trans->num_rx_queues) - 1;
4126 int ret; 4125 int ret;
4127 4126
@@ -4143,7 +4142,7 @@ void iwl_mvm_sync_rx_queues_internal(struct iwl_mvm *mvm,
4143 } 4142 }
4144 4143
4145 if (notif->sync) 4144 if (notif->sync)
4146 ret = wait_event_timeout(notif_waitq, 4145 ret = wait_event_timeout(mvm->rx_sync_waitq,
4147 atomic_read(&mvm->queue_sync_counter) == 0, 4146 atomic_read(&mvm->queue_sync_counter) == 0,
4148 HZ); 4147 HZ);
4149 WARN_ON_ONCE(!ret); 4148 WARN_ON_ONCE(!ret);
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
index d17cbf603f7c..c60703e0c246 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
@@ -937,6 +937,7 @@ struct iwl_mvm {
937 /* sync d0i3_tx queue and IWL_MVM_STATUS_IN_D0I3 status flag */ 937 /* sync d0i3_tx queue and IWL_MVM_STATUS_IN_D0I3 status flag */
938 spinlock_t d0i3_tx_lock; 938 spinlock_t d0i3_tx_lock;
939 wait_queue_head_t d0i3_exit_waitq; 939 wait_queue_head_t d0i3_exit_waitq;
940 wait_queue_head_t rx_sync_waitq;
940 941
941 /* BT-Coex */ 942 /* BT-Coex */
942 struct iwl_bt_coex_profile_notif last_bt_notif; 943 struct iwl_bt_coex_profile_notif last_bt_notif;
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
index 05fe6dd1a2c8..4d35deb628bc 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/ops.c
@@ -619,6 +619,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
619 spin_lock_init(&mvm->refs_lock); 619 spin_lock_init(&mvm->refs_lock);
620 skb_queue_head_init(&mvm->d0i3_tx); 620 skb_queue_head_init(&mvm->d0i3_tx);
621 init_waitqueue_head(&mvm->d0i3_exit_waitq); 621 init_waitqueue_head(&mvm->d0i3_exit_waitq);
622 init_waitqueue_head(&mvm->rx_sync_waitq);
622 623
623 atomic_set(&mvm->queue_sync_counter, 0); 624 atomic_set(&mvm->queue_sync_counter, 0);
624 625
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
index a57c6ef5bc14..6c802cee900c 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c
@@ -547,7 +547,8 @@ void iwl_mvm_rx_queue_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
547 "Received expired RX queue sync message\n"); 547 "Received expired RX queue sync message\n");
548 return; 548 return;
549 } 549 }
550 atomic_dec(&mvm->queue_sync_counter); 550 if (!atomic_dec_return(&mvm->queue_sync_counter))
551 wake_up(&mvm->rx_sync_waitq);
551 } 552 }
552 553
553 switch (internal_notif->type) { 554 switch (internal_notif->type) {
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
index f279fdd6eb44..fa9743205491 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/scan.c
@@ -1199,6 +1199,9 @@ static int iwl_mvm_num_scans(struct iwl_mvm *mvm)
1199 1199
1200static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type) 1200static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type)
1201{ 1201{
1202 bool unified_image = fw_has_capa(&mvm->fw->ucode_capa,
1203 IWL_UCODE_TLV_CAPA_CNSLDTD_D3_D0_IMG);
1204
1202 /* This looks a bit arbitrary, but the idea is that if we run 1205 /* This looks a bit arbitrary, but the idea is that if we run
1203 * out of possible simultaneous scans and the userspace is 1206 * out of possible simultaneous scans and the userspace is
1204 * trying to run a scan type that is already running, we 1207 * trying to run a scan type that is already running, we
@@ -1225,12 +1228,30 @@ static int iwl_mvm_check_running_scans(struct iwl_mvm *mvm, int type)
1225 return -EBUSY; 1228 return -EBUSY;
1226 return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, true); 1229 return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR, true);
1227 case IWL_MVM_SCAN_NETDETECT: 1230 case IWL_MVM_SCAN_NETDETECT:
1228 /* No need to stop anything for net-detect since the 1231 /* For non-unified images, there's no need to stop
1229 * firmware is restarted anyway. This way, any sched 1232 * anything for net-detect since the firmware is
1230 * scans that were running will be restarted when we 1233 * restarted anyway. This way, any sched scans that
1231 * resume. 1234 * were running will be restarted when we resume.
1232 */ 1235 */
1233 return 0; 1236 if (!unified_image)
1237 return 0;
1238
1239 /* If this is a unified image and we ran out of scans,
1240 * we need to stop something. Prefer stopping regular
1241 * scans, because the results are useless at this
1242 * point, and we should be able to keep running
1243 * another scheduled scan while suspended.
1244 */
1245 if (mvm->scan_status & IWL_MVM_SCAN_REGULAR_MASK)
1246 return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_REGULAR,
1247 true);
1248 if (mvm->scan_status & IWL_MVM_SCAN_SCHED_MASK)
1249 return iwl_mvm_scan_stop(mvm, IWL_MVM_SCAN_SCHED,
1250 true);
1251
1252 /* fall through, something is wrong if no scan was
1253 * running but we ran out of scans.
1254 */
1234 default: 1255 default:
1235 WARN_ON(1); 1256 WARN_ON(1);
1236 break; 1257 break;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
index 001be406a3d3..2f8134b2a504 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/drv.c
@@ -541,48 +541,64 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
541MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids); 541MODULE_DEVICE_TABLE(pci, iwl_hw_card_ids);
542 542
543#ifdef CONFIG_ACPI 543#ifdef CONFIG_ACPI
544#define SPL_METHOD "SPLC" 544#define ACPI_SPLC_METHOD "SPLC"
545#define SPL_DOMAINTYPE_MODULE BIT(0) 545#define ACPI_SPLC_DOMAIN_WIFI (0x07)
546#define SPL_DOMAINTYPE_WIFI BIT(1)
547#define SPL_DOMAINTYPE_WIGIG BIT(2)
548#define SPL_DOMAINTYPE_RFEM BIT(3)
549 546
550static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx) 547static u64 splc_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splc)
551{ 548{
552 union acpi_object *limits, *domain_type, *power_limit; 549 union acpi_object *data_pkg, *dflt_pwr_limit;
553 550 int i;
554 if (splx->type != ACPI_TYPE_PACKAGE || 551
555 splx->package.count != 2 || 552 /* We need at least two elements, one for the revision and one
556 splx->package.elements[0].type != ACPI_TYPE_INTEGER || 553 * for the data itself. Also check that the revision is
557 splx->package.elements[0].integer.value != 0) { 554 * supported (currently only revision 0).
558 IWL_ERR(trans, "Unsupported splx structure\n"); 555 */
556 if (splc->type != ACPI_TYPE_PACKAGE ||
557 splc->package.count < 2 ||
558 splc->package.elements[0].type != ACPI_TYPE_INTEGER ||
559 splc->package.elements[0].integer.value != 0) {
560 IWL_DEBUG_INFO(trans,
561 "Unsupported structure returned by the SPLC method. Ignoring.\n");
559 return 0; 562 return 0;
560 } 563 }
561 564
562 limits = &splx->package.elements[1]; 565 /* loop through all the packages to find the one for WiFi */
563 if (limits->type != ACPI_TYPE_PACKAGE || 566 for (i = 1; i < splc->package.count; i++) {
564 limits->package.count < 2 || 567 union acpi_object *domain;
565 limits->package.elements[0].type != ACPI_TYPE_INTEGER || 568
566 limits->package.elements[1].type != ACPI_TYPE_INTEGER) { 569 data_pkg = &splc->package.elements[i];
567 IWL_ERR(trans, "Invalid limits element\n"); 570
568 return 0; 571 /* Skip anything that is not a package with the right
572 * amount of elements (i.e. at least 2 integers).
573 */
574 if (data_pkg->type != ACPI_TYPE_PACKAGE ||
575 data_pkg->package.count < 2 ||
576 data_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
577 data_pkg->package.elements[1].type != ACPI_TYPE_INTEGER)
578 continue;
579
580 domain = &data_pkg->package.elements[0];
581 if (domain->integer.value == ACPI_SPLC_DOMAIN_WIFI)
582 break;
583
584 data_pkg = NULL;
569 } 585 }
570 586
571 domain_type = &limits->package.elements[0]; 587 if (!data_pkg) {
572 power_limit = &limits->package.elements[1]; 588 IWL_DEBUG_INFO(trans,
573 if (!(domain_type->integer.value & SPL_DOMAINTYPE_WIFI)) { 589 "No element for the WiFi domain returned by the SPLC method.\n");
574 IWL_DEBUG_INFO(trans, "WiFi power is not limited\n");
575 return 0; 590 return 0;
576 } 591 }
577 592
578 return power_limit->integer.value; 593 dflt_pwr_limit = &data_pkg->package.elements[1];
594 return dflt_pwr_limit->integer.value;
579} 595}
580 596
581static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev) 597static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
582{ 598{
583 acpi_handle pxsx_handle; 599 acpi_handle pxsx_handle;
584 acpi_handle handle; 600 acpi_handle handle;
585 struct acpi_buffer splx = {ACPI_ALLOCATE_BUFFER, NULL}; 601 struct acpi_buffer splc = {ACPI_ALLOCATE_BUFFER, NULL};
586 acpi_status status; 602 acpi_status status;
587 603
588 pxsx_handle = ACPI_HANDLE(&pdev->dev); 604 pxsx_handle = ACPI_HANDLE(&pdev->dev);
@@ -593,23 +609,24 @@ static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
593 } 609 }
594 610
595 /* Get the method's handle */ 611 /* Get the method's handle */
596 status = acpi_get_handle(pxsx_handle, (acpi_string)SPL_METHOD, &handle); 612 status = acpi_get_handle(pxsx_handle, (acpi_string)ACPI_SPLC_METHOD,
613 &handle);
597 if (ACPI_FAILURE(status)) { 614 if (ACPI_FAILURE(status)) {
598 IWL_DEBUG_INFO(trans, "SPL method not found\n"); 615 IWL_DEBUG_INFO(trans, "SPLC method not found\n");
599 return; 616 return;
600 } 617 }
601 618
602 /* Call SPLC with no arguments */ 619 /* Call SPLC with no arguments */
603 status = acpi_evaluate_object(handle, NULL, NULL, &splx); 620 status = acpi_evaluate_object(handle, NULL, NULL, &splc);
604 if (ACPI_FAILURE(status)) { 621 if (ACPI_FAILURE(status)) {
605 IWL_ERR(trans, "SPLC invocation failed (0x%x)\n", status); 622 IWL_ERR(trans, "SPLC invocation failed (0x%x)\n", status);
606 return; 623 return;
607 } 624 }
608 625
609 trans->dflt_pwr_limit = splx_get_pwr_limit(trans, splx.pointer); 626 trans->dflt_pwr_limit = splc_get_pwr_limit(trans, splc.pointer);
610 IWL_DEBUG_INFO(trans, "Default power limit set to %lld\n", 627 IWL_DEBUG_INFO(trans, "Default power limit set to %lld\n",
611 trans->dflt_pwr_limit); 628 trans->dflt_pwr_limit);
612 kfree(splx.pointer); 629 kfree(splc.pointer);
613} 630}
614 631
615#else /* CONFIG_ACPI */ 632#else /* CONFIG_ACPI */
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
index e9a278b60dfd..5f840f16f40b 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
@@ -592,6 +592,7 @@ error:
592static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, 592static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq,
593 int slots_num, u32 txq_id) 593 int slots_num, u32 txq_id)
594{ 594{
595 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
595 int ret; 596 int ret;
596 597
597 txq->need_update = false; 598 txq->need_update = false;
@@ -606,6 +607,13 @@ static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq,
606 return ret; 607 return ret;
607 608
608 spin_lock_init(&txq->lock); 609 spin_lock_init(&txq->lock);
610
611 if (txq_id == trans_pcie->cmd_queue) {
612 static struct lock_class_key iwl_pcie_cmd_queue_lock_class;
613
614 lockdep_set_class(&txq->lock, &iwl_pcie_cmd_queue_lock_class);
615 }
616
609 __skb_queue_head_init(&txq->overflow_q); 617 __skb_queue_head_init(&txq->overflow_q);
610 618
611 /* 619 /*
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 431f13b4faf6..d3bad5779376 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -826,7 +826,7 @@ static void mac80211_hwsim_set_tsf(struct ieee80211_hw *hw,
826 data->bcn_delta = do_div(delta, bcn_int); 826 data->bcn_delta = do_div(delta, bcn_int);
827 } else { 827 } else {
828 data->tsf_offset -= delta; 828 data->tsf_offset -= delta;
829 data->bcn_delta = -do_div(delta, bcn_int); 829 data->bcn_delta = -(s64)do_div(delta, bcn_int);
830 } 830 }
831} 831}
832 832
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
index 39ce76ad00bc..16241d21727b 100644
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
@@ -2222,8 +2222,9 @@ done:
2222 is_scanning_required = 1; 2222 is_scanning_required = 1;
2223 } else { 2223 } else {
2224 mwifiex_dbg(priv->adapter, MSG, 2224 mwifiex_dbg(priv->adapter, MSG,
2225 "info: trying to associate to '%s' bssid %pM\n", 2225 "info: trying to associate to '%.*s' bssid %pM\n",
2226 (char *)req_ssid.ssid, bss->bssid); 2226 req_ssid.ssid_len, (char *)req_ssid.ssid,
2227 bss->bssid);
2227 memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN); 2228 memcpy(&priv->cfg_bssid, bss->bssid, ETH_ALEN);
2228 break; 2229 break;
2229 } 2230 }
@@ -2283,8 +2284,8 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
2283 } 2284 }
2284 2285
2285 mwifiex_dbg(adapter, INFO, 2286 mwifiex_dbg(adapter, INFO,
2286 "info: Trying to associate to %s and bssid %pM\n", 2287 "info: Trying to associate to %.*s and bssid %pM\n",
2287 (char *)sme->ssid, sme->bssid); 2288 (int)sme->ssid_len, (char *)sme->ssid, sme->bssid);
2288 2289
2289 if (!mwifiex_stop_bg_scan(priv)) 2290 if (!mwifiex_stop_bg_scan(priv))
2290 cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy); 2291 cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy);
@@ -2417,8 +2418,8 @@ mwifiex_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *dev,
2417 } 2418 }
2418 2419
2419 mwifiex_dbg(priv->adapter, MSG, 2420 mwifiex_dbg(priv->adapter, MSG,
2420 "info: trying to join to %s and bssid %pM\n", 2421 "info: trying to join to %.*s and bssid %pM\n",
2421 (char *)params->ssid, params->bssid); 2422 params->ssid_len, (char *)params->ssid, params->bssid);
2422 2423
2423 mwifiex_set_ibss_params(priv, params); 2424 mwifiex_set_ibss_params(priv, params);
2424 2425
diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index e17879dd5d5a..bf2744e1e3db 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -304,7 +304,7 @@ static void xennet_alloc_rx_buffers(struct netfront_queue *queue)
304 queue->rx_skbs[id] = skb; 304 queue->rx_skbs[id] = skb;
305 305
306 ref = gnttab_claim_grant_reference(&queue->gref_rx_head); 306 ref = gnttab_claim_grant_reference(&queue->gref_rx_head);
307 BUG_ON((signed short)ref < 0); 307 WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)(int)ref));
308 queue->grant_rx_ref[id] = ref; 308 queue->grant_rx_ref[id] = ref;
309 309
310 page = skb_frag_page(&skb_shinfo(skb)->frags[0]); 310 page = skb_frag_page(&skb_shinfo(skb)->frags[0]);
@@ -428,7 +428,7 @@ static void xennet_tx_setup_grant(unsigned long gfn, unsigned int offset,
428 id = get_id_from_freelist(&queue->tx_skb_freelist, queue->tx_skbs); 428 id = get_id_from_freelist(&queue->tx_skb_freelist, queue->tx_skbs);
429 tx = RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++); 429 tx = RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++);
430 ref = gnttab_claim_grant_reference(&queue->gref_tx_head); 430 ref = gnttab_claim_grant_reference(&queue->gref_tx_head);
431 BUG_ON((signed short)ref < 0); 431 WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)(int)ref));
432 432
433 gnttab_grant_foreign_access_ref(ref, queue->info->xbdev->otherend_id, 433 gnttab_grant_foreign_access_ref(ref, queue->info->xbdev->otherend_id,
434 gfn, GNTMAP_readonly); 434 gfn, GNTMAP_readonly);
diff --git a/drivers/nfc/mei_phy.c b/drivers/nfc/mei_phy.c
index 83deda4bb4d6..6f9563a96488 100644
--- a/drivers/nfc/mei_phy.c
+++ b/drivers/nfc/mei_phy.c
@@ -133,7 +133,7 @@ static int mei_nfc_if_version(struct nfc_mei_phy *phy)
133 return -ENOMEM; 133 return -ENOMEM;
134 134
135 bytes_recv = mei_cldev_recv(phy->cldev, (u8 *)reply, if_version_length); 135 bytes_recv = mei_cldev_recv(phy->cldev, (u8 *)reply, if_version_length);
136 if (bytes_recv < 0 || bytes_recv < sizeof(struct mei_nfc_reply)) { 136 if (bytes_recv < 0 || bytes_recv < if_version_length) {
137 pr_err("Could not read IF version\n"); 137 pr_err("Could not read IF version\n");
138 r = -EIO; 138 r = -EIO;
139 goto err; 139 goto err;
diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c
index 0d5c29ae51de..7310a261c858 100644
--- a/drivers/ntb/hw/intel/ntb_hw_intel.c
+++ b/drivers/ntb/hw/intel/ntb_hw_intel.c
@@ -112,17 +112,17 @@ MODULE_PARM_DESC(xeon_b2b_usd_bar2_addr64,
112 112
113module_param_named(xeon_b2b_usd_bar4_addr64, 113module_param_named(xeon_b2b_usd_bar4_addr64,
114 xeon_b2b_usd_addr.bar4_addr64, ullong, 0644); 114 xeon_b2b_usd_addr.bar4_addr64, ullong, 0644);
115MODULE_PARM_DESC(xeon_b2b_usd_bar2_addr64, 115MODULE_PARM_DESC(xeon_b2b_usd_bar4_addr64,
116 "XEON B2B USD BAR 4 64-bit address"); 116 "XEON B2B USD BAR 4 64-bit address");
117 117
118module_param_named(xeon_b2b_usd_bar4_addr32, 118module_param_named(xeon_b2b_usd_bar4_addr32,
119 xeon_b2b_usd_addr.bar4_addr32, ullong, 0644); 119 xeon_b2b_usd_addr.bar4_addr32, ullong, 0644);
120MODULE_PARM_DESC(xeon_b2b_usd_bar2_addr64, 120MODULE_PARM_DESC(xeon_b2b_usd_bar4_addr32,
121 "XEON B2B USD split-BAR 4 32-bit address"); 121 "XEON B2B USD split-BAR 4 32-bit address");
122 122
123module_param_named(xeon_b2b_usd_bar5_addr32, 123module_param_named(xeon_b2b_usd_bar5_addr32,
124 xeon_b2b_usd_addr.bar5_addr32, ullong, 0644); 124 xeon_b2b_usd_addr.bar5_addr32, ullong, 0644);
125MODULE_PARM_DESC(xeon_b2b_usd_bar2_addr64, 125MODULE_PARM_DESC(xeon_b2b_usd_bar5_addr32,
126 "XEON B2B USD split-BAR 5 32-bit address"); 126 "XEON B2B USD split-BAR 5 32-bit address");
127 127
128module_param_named(xeon_b2b_dsd_bar2_addr64, 128module_param_named(xeon_b2b_dsd_bar2_addr64,
@@ -132,17 +132,17 @@ MODULE_PARM_DESC(xeon_b2b_dsd_bar2_addr64,
132 132
133module_param_named(xeon_b2b_dsd_bar4_addr64, 133module_param_named(xeon_b2b_dsd_bar4_addr64,
134 xeon_b2b_dsd_addr.bar4_addr64, ullong, 0644); 134 xeon_b2b_dsd_addr.bar4_addr64, ullong, 0644);
135MODULE_PARM_DESC(xeon_b2b_dsd_bar2_addr64, 135MODULE_PARM_DESC(xeon_b2b_dsd_bar4_addr64,
136 "XEON B2B DSD BAR 4 64-bit address"); 136 "XEON B2B DSD BAR 4 64-bit address");
137 137
138module_param_named(xeon_b2b_dsd_bar4_addr32, 138module_param_named(xeon_b2b_dsd_bar4_addr32,
139 xeon_b2b_dsd_addr.bar4_addr32, ullong, 0644); 139 xeon_b2b_dsd_addr.bar4_addr32, ullong, 0644);
140MODULE_PARM_DESC(xeon_b2b_dsd_bar2_addr64, 140MODULE_PARM_DESC(xeon_b2b_dsd_bar4_addr32,
141 "XEON B2B DSD split-BAR 4 32-bit address"); 141 "XEON B2B DSD split-BAR 4 32-bit address");
142 142
143module_param_named(xeon_b2b_dsd_bar5_addr32, 143module_param_named(xeon_b2b_dsd_bar5_addr32,
144 xeon_b2b_dsd_addr.bar5_addr32, ullong, 0644); 144 xeon_b2b_dsd_addr.bar5_addr32, ullong, 0644);
145MODULE_PARM_DESC(xeon_b2b_dsd_bar2_addr64, 145MODULE_PARM_DESC(xeon_b2b_dsd_bar5_addr32,
146 "XEON B2B DSD split-BAR 5 32-bit address"); 146 "XEON B2B DSD split-BAR 5 32-bit address");
147 147
148#ifndef ioread64 148#ifndef ioread64
@@ -1755,6 +1755,8 @@ static int xeon_setup_b2b_mw(struct intel_ntb_dev *ndev,
1755 XEON_B2B_MIN_SIZE); 1755 XEON_B2B_MIN_SIZE);
1756 if (!ndev->peer_mmio) 1756 if (!ndev->peer_mmio)
1757 return -EIO; 1757 return -EIO;
1758
1759 ndev->peer_addr = pci_resource_start(pdev, b2b_bar);
1758 } 1760 }
1759 1761
1760 return 0; 1762 return 0;
@@ -2019,6 +2021,7 @@ static int intel_ntb_init_pci(struct intel_ntb_dev *ndev, struct pci_dev *pdev)
2019 goto err_mmio; 2021 goto err_mmio;
2020 } 2022 }
2021 ndev->peer_mmio = ndev->self_mmio; 2023 ndev->peer_mmio = ndev->self_mmio;
2024 ndev->peer_addr = pci_resource_start(pdev, 0);
2022 2025
2023 return 0; 2026 return 0;
2024 2027
diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c
index 8601c10acf74..4eb8adb34508 100644
--- a/drivers/ntb/ntb_transport.c
+++ b/drivers/ntb/ntb_transport.c
@@ -257,7 +257,7 @@ enum {
257#define NTB_QP_DEF_NUM_ENTRIES 100 257#define NTB_QP_DEF_NUM_ENTRIES 100
258#define NTB_LINK_DOWN_TIMEOUT 10 258#define NTB_LINK_DOWN_TIMEOUT 10
259#define DMA_RETRIES 20 259#define DMA_RETRIES 20
260#define DMA_OUT_RESOURCE_TO 50 260#define DMA_OUT_RESOURCE_TO msecs_to_jiffies(50)
261 261
262static void ntb_transport_rxc_db(unsigned long data); 262static void ntb_transport_rxc_db(unsigned long data);
263static const struct ntb_ctx_ops ntb_transport_ops; 263static const struct ntb_ctx_ops ntb_transport_ops;
diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c
index 6a50f20bf1cd..e75d4fdc0866 100644
--- a/drivers/ntb/test/ntb_perf.c
+++ b/drivers/ntb/test/ntb_perf.c
@@ -72,7 +72,7 @@
72#define MAX_THREADS 32 72#define MAX_THREADS 32
73#define MAX_TEST_SIZE SZ_1M 73#define MAX_TEST_SIZE SZ_1M
74#define MAX_SRCS 32 74#define MAX_SRCS 32
75#define DMA_OUT_RESOURCE_TO 50 75#define DMA_OUT_RESOURCE_TO msecs_to_jiffies(50)
76#define DMA_RETRIES 20 76#define DMA_RETRIES 20
77#define SZ_4G (1ULL << 32) 77#define SZ_4G (1ULL << 32)
78#define MAX_SEG_ORDER 20 /* no larger than 1M for kmalloc buffer */ 78#define MAX_SEG_ORDER 20 /* no larger than 1M for kmalloc buffer */
@@ -589,7 +589,7 @@ static ssize_t debugfs_run_read(struct file *filp, char __user *ubuf,
589 return -ENOMEM; 589 return -ENOMEM;
590 590
591 if (mutex_is_locked(&perf->run_mutex)) { 591 if (mutex_is_locked(&perf->run_mutex)) {
592 out_off = snprintf(buf, 64, "running\n"); 592 out_off = scnprintf(buf, 64, "running\n");
593 goto read_from_buf; 593 goto read_from_buf;
594 } 594 }
595 595
@@ -600,14 +600,14 @@ static ssize_t debugfs_run_read(struct file *filp, char __user *ubuf,
600 break; 600 break;
601 601
602 if (pctx->status) { 602 if (pctx->status) {
603 out_off += snprintf(buf + out_off, 1024 - out_off, 603 out_off += scnprintf(buf + out_off, 1024 - out_off,
604 "%d: error %d\n", i, 604 "%d: error %d\n", i,
605 pctx->status); 605 pctx->status);
606 continue; 606 continue;
607 } 607 }
608 608
609 rate = div64_u64(pctx->copied, pctx->diff_us); 609 rate = div64_u64(pctx->copied, pctx->diff_us);
610 out_off += snprintf(buf + out_off, 1024 - out_off, 610 out_off += scnprintf(buf + out_off, 1024 - out_off,
611 "%d: copied %llu bytes in %llu usecs, %llu MBytes/s\n", 611 "%d: copied %llu bytes in %llu usecs, %llu MBytes/s\n",
612 i, pctx->copied, pctx->diff_us, rate); 612 i, pctx->copied, pctx->diff_us, rate);
613 } 613 }
diff --git a/drivers/ntb/test/ntb_pingpong.c b/drivers/ntb/test/ntb_pingpong.c
index 7d311799fca1..435861189d97 100644
--- a/drivers/ntb/test/ntb_pingpong.c
+++ b/drivers/ntb/test/ntb_pingpong.c
@@ -88,7 +88,7 @@ MODULE_PARM_DESC(delay_ms, "Milliseconds to delay the response to peer");
88 88
89static unsigned long db_init = 0x7; 89static unsigned long db_init = 0x7;
90module_param(db_init, ulong, 0644); 90module_param(db_init, ulong, 0644);
91MODULE_PARM_DESC(delay_ms, "Initial doorbell bits to ring on the peer"); 91MODULE_PARM_DESC(db_init, "Initial doorbell bits to ring on the peer");
92 92
93struct pp_ctx { 93struct pp_ctx {
94 struct ntb_dev *ntb; 94 struct ntb_dev *ntb;
diff --git a/drivers/nvdimm/bus.c b/drivers/nvdimm/bus.c
index a8b6949a8778..23d4a1728cdf 100644
--- a/drivers/nvdimm/bus.c
+++ b/drivers/nvdimm/bus.c
@@ -715,7 +715,7 @@ EXPORT_SYMBOL_GPL(nd_cmd_in_size);
715 715
716u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd, 716u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
717 const struct nd_cmd_desc *desc, int idx, const u32 *in_field, 717 const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
718 const u32 *out_field) 718 const u32 *out_field, unsigned long remainder)
719{ 719{
720 if (idx >= desc->out_num) 720 if (idx >= desc->out_num)
721 return UINT_MAX; 721 return UINT_MAX;
@@ -727,9 +727,24 @@ u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
727 return in_field[1]; 727 return in_field[1];
728 else if (nvdimm && cmd == ND_CMD_VENDOR && idx == 2) 728 else if (nvdimm && cmd == ND_CMD_VENDOR && idx == 2)
729 return out_field[1]; 729 return out_field[1];
730 else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2) 730 else if (!nvdimm && cmd == ND_CMD_ARS_STATUS && idx == 2) {
731 return out_field[1] - 8; 731 /*
732 else if (cmd == ND_CMD_CALL) { 732 * Per table 9-276 ARS Data in ACPI 6.1, out_field[1] is
733 * "Size of Output Buffer in bytes, including this
734 * field."
735 */
736 if (out_field[1] < 4)
737 return 0;
738 /*
739 * ACPI 6.1 is ambiguous if 'status' is included in the
740 * output size. If we encounter an output size that
741 * overshoots the remainder by 4 bytes, assume it was
742 * including 'status'.
743 */
744 if (out_field[1] - 8 == remainder)
745 return remainder;
746 return out_field[1] - 4;
747 } else if (cmd == ND_CMD_CALL) {
733 struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field; 748 struct nd_cmd_pkg *pkg = (struct nd_cmd_pkg *) in_field;
734 749
735 return pkg->nd_size_out; 750 return pkg->nd_size_out;
@@ -876,7 +891,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,
876 /* process an output envelope */ 891 /* process an output envelope */
877 for (i = 0; i < desc->out_num; i++) { 892 for (i = 0; i < desc->out_num; i++) {
878 u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i, 893 u32 out_size = nd_cmd_out_size(nvdimm, cmd, desc, i,
879 (u32 *) in_env, (u32 *) out_env); 894 (u32 *) in_env, (u32 *) out_env, 0);
880 u32 copy; 895 u32 copy;
881 896
882 if (out_size == UINT_MAX) { 897 if (out_size == UINT_MAX) {
diff --git a/drivers/nvme/host/lightnvm.c b/drivers/nvme/host/lightnvm.c
index f5e3011e31fc..5daf2f4be0cd 100644
--- a/drivers/nvme/host/lightnvm.c
+++ b/drivers/nvme/host/lightnvm.c
@@ -612,7 +612,7 @@ int nvme_nvm_register(struct nvme_ns *ns, char *disk_name, int node,
612 612
613 ret = nvm_register(dev); 613 ret = nvm_register(dev);
614 614
615 ns->lba_shift = ilog2(dev->sec_size) - 9; 615 ns->lba_shift = ilog2(dev->sec_size);
616 616
617 if (sysfs_create_group(&dev->dev.kobj, attrs)) 617 if (sysfs_create_group(&dev->dev.kobj, attrs))
618 pr_warn("%s: failed to create sysfs group for identification\n", 618 pr_warn("%s: failed to create sysfs group for identification\n",
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index 0248d0e21fee..5e52034ab010 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -1242,20 +1242,16 @@ static int nvme_configure_admin_queue(struct nvme_dev *dev)
1242 1242
1243 result = nvme_enable_ctrl(&dev->ctrl, cap); 1243 result = nvme_enable_ctrl(&dev->ctrl, cap);
1244 if (result) 1244 if (result)
1245 goto free_nvmeq; 1245 return result;
1246 1246
1247 nvmeq->cq_vector = 0; 1247 nvmeq->cq_vector = 0;
1248 result = queue_request_irq(nvmeq); 1248 result = queue_request_irq(nvmeq);
1249 if (result) { 1249 if (result) {
1250 nvmeq->cq_vector = -1; 1250 nvmeq->cq_vector = -1;
1251 goto free_nvmeq; 1251 return result;
1252 } 1252 }
1253 1253
1254 return result; 1254 return result;
1255
1256 free_nvmeq:
1257 nvme_free_queues(dev, 0);
1258 return result;
1259} 1255}
1260 1256
1261static bool nvme_should_reset(struct nvme_dev *dev, u32 csts) 1257static bool nvme_should_reset(struct nvme_dev *dev, u32 csts)
@@ -1317,10 +1313,8 @@ static int nvme_create_io_queues(struct nvme_dev *dev)
1317 max = min(dev->max_qid, dev->queue_count - 1); 1313 max = min(dev->max_qid, dev->queue_count - 1);
1318 for (i = dev->online_queues; i <= max; i++) { 1314 for (i = dev->online_queues; i <= max; i++) {
1319 ret = nvme_create_queue(dev->queues[i], i); 1315 ret = nvme_create_queue(dev->queues[i], i);
1320 if (ret) { 1316 if (ret)
1321 nvme_free_queues(dev, i);
1322 break; 1317 break;
1323 }
1324 } 1318 }
1325 1319
1326 /* 1320 /*
@@ -1460,13 +1454,9 @@ static int nvme_setup_io_queues(struct nvme_dev *dev)
1460 result = queue_request_irq(adminq); 1454 result = queue_request_irq(adminq);
1461 if (result) { 1455 if (result) {
1462 adminq->cq_vector = -1; 1456 adminq->cq_vector = -1;
1463 goto free_queues; 1457 return result;
1464 } 1458 }
1465 return nvme_create_io_queues(dev); 1459 return nvme_create_io_queues(dev);
1466
1467 free_queues:
1468 nvme_free_queues(dev, 1);
1469 return result;
1470} 1460}
1471 1461
1472static void nvme_del_queue_end(struct request *req, int error) 1462static void nvme_del_queue_end(struct request *req, int error)
diff --git a/drivers/nvme/host/rdma.c b/drivers/nvme/host/rdma.c
index 5a8388177959..3d25add36d91 100644
--- a/drivers/nvme/host/rdma.c
+++ b/drivers/nvme/host/rdma.c
@@ -83,6 +83,7 @@ enum nvme_rdma_queue_flags {
83 NVME_RDMA_Q_CONNECTED = (1 << 0), 83 NVME_RDMA_Q_CONNECTED = (1 << 0),
84 NVME_RDMA_IB_QUEUE_ALLOCATED = (1 << 1), 84 NVME_RDMA_IB_QUEUE_ALLOCATED = (1 << 1),
85 NVME_RDMA_Q_DELETING = (1 << 2), 85 NVME_RDMA_Q_DELETING = (1 << 2),
86 NVME_RDMA_Q_LIVE = (1 << 3),
86}; 87};
87 88
88struct nvme_rdma_queue { 89struct nvme_rdma_queue {
@@ -624,10 +625,18 @@ static int nvme_rdma_connect_io_queues(struct nvme_rdma_ctrl *ctrl)
624 625
625 for (i = 1; i < ctrl->queue_count; i++) { 626 for (i = 1; i < ctrl->queue_count; i++) {
626 ret = nvmf_connect_io_queue(&ctrl->ctrl, i); 627 ret = nvmf_connect_io_queue(&ctrl->ctrl, i);
627 if (ret) 628 if (ret) {
628 break; 629 dev_info(ctrl->ctrl.device,
630 "failed to connect i/o queue: %d\n", ret);
631 goto out_free_queues;
632 }
633 set_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[i].flags);
629 } 634 }
630 635
636 return 0;
637
638out_free_queues:
639 nvme_rdma_free_io_queues(ctrl);
631 return ret; 640 return ret;
632} 641}
633 642
@@ -712,6 +721,8 @@ static void nvme_rdma_reconnect_ctrl_work(struct work_struct *work)
712 if (ret) 721 if (ret)
713 goto stop_admin_q; 722 goto stop_admin_q;
714 723
724 set_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[0].flags);
725
715 ret = nvme_enable_ctrl(&ctrl->ctrl, ctrl->cap); 726 ret = nvme_enable_ctrl(&ctrl->ctrl, ctrl->cap);
716 if (ret) 727 if (ret)
717 goto stop_admin_q; 728 goto stop_admin_q;
@@ -761,8 +772,10 @@ static void nvme_rdma_error_recovery_work(struct work_struct *work)
761 772
762 nvme_stop_keep_alive(&ctrl->ctrl); 773 nvme_stop_keep_alive(&ctrl->ctrl);
763 774
764 for (i = 0; i < ctrl->queue_count; i++) 775 for (i = 0; i < ctrl->queue_count; i++) {
765 clear_bit(NVME_RDMA_Q_CONNECTED, &ctrl->queues[i].flags); 776 clear_bit(NVME_RDMA_Q_CONNECTED, &ctrl->queues[i].flags);
777 clear_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[i].flags);
778 }
766 779
767 if (ctrl->queue_count > 1) 780 if (ctrl->queue_count > 1)
768 nvme_stop_queues(&ctrl->ctrl); 781 nvme_stop_queues(&ctrl->ctrl);
@@ -1378,6 +1391,24 @@ nvme_rdma_timeout(struct request *rq, bool reserved)
1378 return BLK_EH_HANDLED; 1391 return BLK_EH_HANDLED;
1379} 1392}
1380 1393
1394/*
1395 * We cannot accept any other command until the Connect command has completed.
1396 */
1397static inline bool nvme_rdma_queue_is_ready(struct nvme_rdma_queue *queue,
1398 struct request *rq)
1399{
1400 if (unlikely(!test_bit(NVME_RDMA_Q_LIVE, &queue->flags))) {
1401 struct nvme_command *cmd = (struct nvme_command *)rq->cmd;
1402
1403 if (rq->cmd_type != REQ_TYPE_DRV_PRIV ||
1404 cmd->common.opcode != nvme_fabrics_command ||
1405 cmd->fabrics.fctype != nvme_fabrics_type_connect)
1406 return false;
1407 }
1408
1409 return true;
1410}
1411
1381static int nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx, 1412static int nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx,
1382 const struct blk_mq_queue_data *bd) 1413 const struct blk_mq_queue_data *bd)
1383{ 1414{
@@ -1394,6 +1425,9 @@ static int nvme_rdma_queue_rq(struct blk_mq_hw_ctx *hctx,
1394 1425
1395 WARN_ON_ONCE(rq->tag < 0); 1426 WARN_ON_ONCE(rq->tag < 0);
1396 1427
1428 if (!nvme_rdma_queue_is_ready(queue, rq))
1429 return BLK_MQ_RQ_QUEUE_BUSY;
1430
1397 dev = queue->device->dev; 1431 dev = queue->device->dev;
1398 ib_dma_sync_single_for_cpu(dev, sqe->dma, 1432 ib_dma_sync_single_for_cpu(dev, sqe->dma,
1399 sizeof(struct nvme_command), DMA_TO_DEVICE); 1433 sizeof(struct nvme_command), DMA_TO_DEVICE);
@@ -1544,6 +1578,8 @@ static int nvme_rdma_configure_admin_queue(struct nvme_rdma_ctrl *ctrl)
1544 if (error) 1578 if (error)
1545 goto out_cleanup_queue; 1579 goto out_cleanup_queue;
1546 1580
1581 set_bit(NVME_RDMA_Q_LIVE, &ctrl->queues[0].flags);
1582
1547 error = nvmf_reg_read64(&ctrl->ctrl, NVME_REG_CAP, &ctrl->cap); 1583 error = nvmf_reg_read64(&ctrl->ctrl, NVME_REG_CAP, &ctrl->cap);
1548 if (error) { 1584 if (error) {
1549 dev_err(ctrl->ctrl.device, 1585 dev_err(ctrl->ctrl.device,
diff --git a/drivers/nvme/target/core.c b/drivers/nvme/target/core.c
index b4cacb6f0258..a21437a33adb 100644
--- a/drivers/nvme/target/core.c
+++ b/drivers/nvme/target/core.c
@@ -838,9 +838,13 @@ static void nvmet_fatal_error_handler(struct work_struct *work)
838 838
839void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl) 839void nvmet_ctrl_fatal_error(struct nvmet_ctrl *ctrl)
840{ 840{
841 ctrl->csts |= NVME_CSTS_CFS; 841 mutex_lock(&ctrl->lock);
842 INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler); 842 if (!(ctrl->csts & NVME_CSTS_CFS)) {
843 schedule_work(&ctrl->fatal_err_work); 843 ctrl->csts |= NVME_CSTS_CFS;
844 INIT_WORK(&ctrl->fatal_err_work, nvmet_fatal_error_handler);
845 schedule_work(&ctrl->fatal_err_work);
846 }
847 mutex_unlock(&ctrl->lock);
844} 848}
845EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error); 849EXPORT_SYMBOL_GPL(nvmet_ctrl_fatal_error);
846 850
diff --git a/drivers/nvme/target/rdma.c b/drivers/nvme/target/rdma.c
index f8d23999e0f2..005ef5d17a19 100644
--- a/drivers/nvme/target/rdma.c
+++ b/drivers/nvme/target/rdma.c
@@ -951,6 +951,7 @@ err_destroy_cq:
951 951
952static void nvmet_rdma_destroy_queue_ib(struct nvmet_rdma_queue *queue) 952static void nvmet_rdma_destroy_queue_ib(struct nvmet_rdma_queue *queue)
953{ 953{
954 ib_drain_qp(queue->cm_id->qp);
954 rdma_destroy_qp(queue->cm_id); 955 rdma_destroy_qp(queue->cm_id);
955 ib_free_cq(queue->cq); 956 ib_free_cq(queue->cq);
956} 957}
@@ -1066,6 +1067,7 @@ nvmet_rdma_alloc_queue(struct nvmet_rdma_device *ndev,
1066 spin_lock_init(&queue->rsp_wr_wait_lock); 1067 spin_lock_init(&queue->rsp_wr_wait_lock);
1067 INIT_LIST_HEAD(&queue->free_rsps); 1068 INIT_LIST_HEAD(&queue->free_rsps);
1068 spin_lock_init(&queue->rsps_lock); 1069 spin_lock_init(&queue->rsps_lock);
1070 INIT_LIST_HEAD(&queue->queue_list);
1069 1071
1070 queue->idx = ida_simple_get(&nvmet_rdma_queue_ida, 0, 0, GFP_KERNEL); 1072 queue->idx = ida_simple_get(&nvmet_rdma_queue_ida, 0, 0, GFP_KERNEL);
1071 if (queue->idx < 0) { 1073 if (queue->idx < 0) {
@@ -1244,7 +1246,6 @@ static void __nvmet_rdma_queue_disconnect(struct nvmet_rdma_queue *queue)
1244 1246
1245 if (disconnect) { 1247 if (disconnect) {
1246 rdma_disconnect(queue->cm_id); 1248 rdma_disconnect(queue->cm_id);
1247 ib_drain_qp(queue->cm_id->qp);
1248 schedule_work(&queue->release_work); 1249 schedule_work(&queue->release_work);
1249 } 1250 }
1250} 1251}
@@ -1269,7 +1270,12 @@ static void nvmet_rdma_queue_connect_fail(struct rdma_cm_id *cm_id,
1269{ 1270{
1270 WARN_ON_ONCE(queue->state != NVMET_RDMA_Q_CONNECTING); 1271 WARN_ON_ONCE(queue->state != NVMET_RDMA_Q_CONNECTING);
1271 1272
1272 pr_err("failed to connect queue\n"); 1273 mutex_lock(&nvmet_rdma_queue_mutex);
1274 if (!list_empty(&queue->queue_list))
1275 list_del_init(&queue->queue_list);
1276 mutex_unlock(&nvmet_rdma_queue_mutex);
1277
1278 pr_err("failed to connect queue %d\n", queue->idx);
1273 schedule_work(&queue->release_work); 1279 schedule_work(&queue->release_work);
1274} 1280}
1275 1281
@@ -1352,7 +1358,13 @@ static int nvmet_rdma_cm_handler(struct rdma_cm_id *cm_id,
1352 case RDMA_CM_EVENT_ADDR_CHANGE: 1358 case RDMA_CM_EVENT_ADDR_CHANGE:
1353 case RDMA_CM_EVENT_DISCONNECTED: 1359 case RDMA_CM_EVENT_DISCONNECTED:
1354 case RDMA_CM_EVENT_TIMEWAIT_EXIT: 1360 case RDMA_CM_EVENT_TIMEWAIT_EXIT:
1355 nvmet_rdma_queue_disconnect(queue); 1361 /*
1362 * We might end up here when we already freed the qp
1363 * which means queue release sequence is in progress,
1364 * so don't get in the way...
1365 */
1366 if (queue)
1367 nvmet_rdma_queue_disconnect(queue);
1356 break; 1368 break;
1357 case RDMA_CM_EVENT_DEVICE_REMOVAL: 1369 case RDMA_CM_EVENT_DEVICE_REMOVAL:
1358 ret = nvmet_rdma_device_removal(cm_id, queue); 1370 ret = nvmet_rdma_device_removal(cm_id, queue);
diff --git a/drivers/of/base.c b/drivers/of/base.c
index d687e6de24a0..a0bccb54a9bd 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -2077,8 +2077,6 @@ void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align))
2077 name = of_get_property(of_aliases, "stdout", NULL); 2077 name = of_get_property(of_aliases, "stdout", NULL);
2078 if (name) 2078 if (name)
2079 of_stdout = of_find_node_opts_by_path(name, &of_stdout_options); 2079 of_stdout = of_find_node_opts_by_path(name, &of_stdout_options);
2080 if (of_stdout)
2081 console_set_by_of();
2082 } 2080 }
2083 2081
2084 if (!of_aliases) 2082 if (!of_aliases)
diff --git a/drivers/of/of_mdio.c b/drivers/of/of_mdio.c
index b470f7e3521d..262281bd68fa 100644
--- a/drivers/of/of_mdio.c
+++ b/drivers/of/of_mdio.c
@@ -292,6 +292,7 @@ struct phy_device *of_phy_find_device(struct device_node *phy_np)
292 mdiodev = to_mdio_device(d); 292 mdiodev = to_mdio_device(d);
293 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY) 293 if (mdiodev->flags & MDIO_DEVICE_FLAG_PHY)
294 return to_phy_device(d); 294 return to_phy_device(d);
295 put_device(d);
295 } 296 }
296 297
297 return NULL; 298 return NULL;
@@ -456,8 +457,11 @@ int of_phy_register_fixed_link(struct device_node *np)
456 status.link = 1; 457 status.link = 1;
457 status.duplex = of_property_read_bool(fixed_link_node, 458 status.duplex = of_property_read_bool(fixed_link_node,
458 "full-duplex"); 459 "full-duplex");
459 if (of_property_read_u32(fixed_link_node, "speed", &status.speed)) 460 if (of_property_read_u32(fixed_link_node, "speed",
461 &status.speed)) {
462 of_node_put(fixed_link_node);
460 return -EINVAL; 463 return -EINVAL;
464 }
461 status.pause = of_property_read_bool(fixed_link_node, "pause"); 465 status.pause = of_property_read_bool(fixed_link_node, "pause");
462 status.asym_pause = of_property_read_bool(fixed_link_node, 466 status.asym_pause = of_property_read_bool(fixed_link_node,
463 "asym-pause"); 467 "asym-pause");
@@ -486,3 +490,18 @@ int of_phy_register_fixed_link(struct device_node *np)
486 return -ENODEV; 490 return -ENODEV;
487} 491}
488EXPORT_SYMBOL(of_phy_register_fixed_link); 492EXPORT_SYMBOL(of_phy_register_fixed_link);
493
494void of_phy_deregister_fixed_link(struct device_node *np)
495{
496 struct phy_device *phydev;
497
498 phydev = of_phy_find_device(np);
499 if (!phydev)
500 return;
501
502 fixed_phy_unregister(phydev);
503
504 put_device(&phydev->mdio.dev); /* of_phy_find_device() */
505 phy_device_free(phydev); /* fixed_phy_register() */
506}
507EXPORT_SYMBOL(of_phy_deregister_fixed_link);
diff --git a/drivers/pci/host/pcie-designware-plat.c b/drivers/pci/host/pcie-designware-plat.c
index 8df6312ed300..1a02038c4640 100644
--- a/drivers/pci/host/pcie-designware-plat.c
+++ b/drivers/pci/host/pcie-designware-plat.c
@@ -3,7 +3,7 @@
3 * 3 *
4 * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com) 4 * Copyright (C) 2015-2016 Synopsys, Inc. (www.synopsys.com)
5 * 5 *
6 * Authors: Joao Pinto <jpmpinto@gmail.com> 6 * Authors: Joao Pinto <Joao.Pinto@synopsys.com>
7 * 7 *
8 * This program is free software; you can redistribute it and/or modify 8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as 9 * it under the terms of the GNU General Public License version 2 as
diff --git a/drivers/pci/host/pcie-rockchip.c b/drivers/pci/host/pcie-rockchip.c
index e0b22dab9b7a..e04f69beb42d 100644
--- a/drivers/pci/host/pcie-rockchip.c
+++ b/drivers/pci/host/pcie-rockchip.c
@@ -190,6 +190,9 @@ struct rockchip_pcie {
190 struct reset_control *mgmt_rst; 190 struct reset_control *mgmt_rst;
191 struct reset_control *mgmt_sticky_rst; 191 struct reset_control *mgmt_sticky_rst;
192 struct reset_control *pipe_rst; 192 struct reset_control *pipe_rst;
193 struct reset_control *pm_rst;
194 struct reset_control *aclk_rst;
195 struct reset_control *pclk_rst;
193 struct clk *aclk_pcie; 196 struct clk *aclk_pcie;
194 struct clk *aclk_perf_pcie; 197 struct clk *aclk_perf_pcie;
195 struct clk *hclk_pcie; 198 struct clk *hclk_pcie;
@@ -408,6 +411,44 @@ static int rockchip_pcie_init_port(struct rockchip_pcie *rockchip)
408 411
409 gpiod_set_value(rockchip->ep_gpio, 0); 412 gpiod_set_value(rockchip->ep_gpio, 0);
410 413
414 err = reset_control_assert(rockchip->aclk_rst);
415 if (err) {
416 dev_err(dev, "assert aclk_rst err %d\n", err);
417 return err;
418 }
419
420 err = reset_control_assert(rockchip->pclk_rst);
421 if (err) {
422 dev_err(dev, "assert pclk_rst err %d\n", err);
423 return err;
424 }
425
426 err = reset_control_assert(rockchip->pm_rst);
427 if (err) {
428 dev_err(dev, "assert pm_rst err %d\n", err);
429 return err;
430 }
431
432 udelay(10);
433
434 err = reset_control_deassert(rockchip->pm_rst);
435 if (err) {
436 dev_err(dev, "deassert pm_rst err %d\n", err);
437 return err;
438 }
439
440 err = reset_control_deassert(rockchip->aclk_rst);
441 if (err) {
442 dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err);
443 return err;
444 }
445
446 err = reset_control_deassert(rockchip->pclk_rst);
447 if (err) {
448 dev_err(dev, "deassert mgmt_sticky_rst err %d\n", err);
449 return err;
450 }
451
411 err = phy_init(rockchip->phy); 452 err = phy_init(rockchip->phy);
412 if (err < 0) { 453 if (err < 0) {
413 dev_err(dev, "fail to init phy, err %d\n", err); 454 dev_err(dev, "fail to init phy, err %d\n", err);
@@ -781,6 +822,27 @@ static int rockchip_pcie_parse_dt(struct rockchip_pcie *rockchip)
781 return PTR_ERR(rockchip->pipe_rst); 822 return PTR_ERR(rockchip->pipe_rst);
782 } 823 }
783 824
825 rockchip->pm_rst = devm_reset_control_get(dev, "pm");
826 if (IS_ERR(rockchip->pm_rst)) {
827 if (PTR_ERR(rockchip->pm_rst) != -EPROBE_DEFER)
828 dev_err(dev, "missing pm reset property in node\n");
829 return PTR_ERR(rockchip->pm_rst);
830 }
831
832 rockchip->pclk_rst = devm_reset_control_get(dev, "pclk");
833 if (IS_ERR(rockchip->pclk_rst)) {
834 if (PTR_ERR(rockchip->pclk_rst) != -EPROBE_DEFER)
835 dev_err(dev, "missing pclk reset property in node\n");
836 return PTR_ERR(rockchip->pclk_rst);
837 }
838
839 rockchip->aclk_rst = devm_reset_control_get(dev, "aclk");
840 if (IS_ERR(rockchip->aclk_rst)) {
841 if (PTR_ERR(rockchip->aclk_rst) != -EPROBE_DEFER)
842 dev_err(dev, "missing aclk reset property in node\n");
843 return PTR_ERR(rockchip->aclk_rst);
844 }
845
784 rockchip->ep_gpio = devm_gpiod_get(dev, "ep", GPIOD_OUT_HIGH); 846 rockchip->ep_gpio = devm_gpiod_get(dev, "ep", GPIOD_OUT_HIGH);
785 if (IS_ERR(rockchip->ep_gpio)) { 847 if (IS_ERR(rockchip->ep_gpio)) {
786 dev_err(dev, "missing ep-gpios property in node\n"); 848 dev_err(dev, "missing ep-gpios property in node\n");
diff --git a/drivers/pci/pci-mid.c b/drivers/pci/pci-mid.c
index 55f453de562e..c7f3408e3148 100644
--- a/drivers/pci/pci-mid.c
+++ b/drivers/pci/pci-mid.c
@@ -29,6 +29,11 @@ static int mid_pci_set_power_state(struct pci_dev *pdev, pci_power_t state)
29 return intel_mid_pci_set_power_state(pdev, state); 29 return intel_mid_pci_set_power_state(pdev, state);
30} 30}
31 31
32static pci_power_t mid_pci_get_power_state(struct pci_dev *pdev)
33{
34 return intel_mid_pci_get_power_state(pdev);
35}
36
32static pci_power_t mid_pci_choose_state(struct pci_dev *pdev) 37static pci_power_t mid_pci_choose_state(struct pci_dev *pdev)
33{ 38{
34 return PCI_D3hot; 39 return PCI_D3hot;
@@ -52,6 +57,7 @@ static bool mid_pci_need_resume(struct pci_dev *dev)
52static struct pci_platform_pm_ops mid_pci_platform_pm = { 57static struct pci_platform_pm_ops mid_pci_platform_pm = {
53 .is_manageable = mid_pci_power_manageable, 58 .is_manageable = mid_pci_power_manageable,
54 .set_state = mid_pci_set_power_state, 59 .set_state = mid_pci_set_power_state,
60 .get_state = mid_pci_get_power_state,
55 .choose_state = mid_pci_choose_state, 61 .choose_state = mid_pci_choose_state,
56 .sleep_wake = mid_pci_sleep_wake, 62 .sleep_wake = mid_pci_sleep_wake,
57 .run_wake = mid_pci_run_wake, 63 .run_wake = mid_pci_run_wake,
diff --git a/drivers/pci/pcie/aer/aer_inject.c b/drivers/pci/pcie/aer/aer_inject.c
index db553dc22c8e..2b6a59266689 100644
--- a/drivers/pci/pcie/aer/aer_inject.c
+++ b/drivers/pci/pcie/aer/aer_inject.c
@@ -307,20 +307,6 @@ out:
307 return 0; 307 return 0;
308} 308}
309 309
310static struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
311{
312 while (1) {
313 if (!pci_is_pcie(dev))
314 break;
315 if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
316 return dev;
317 if (!dev->bus->self)
318 break;
319 dev = dev->bus->self;
320 }
321 return NULL;
322}
323
324static int find_aer_device_iter(struct device *device, void *data) 310static int find_aer_device_iter(struct device *device, void *data)
325{ 311{
326 struct pcie_device **result = data; 312 struct pcie_device **result = data;
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index ab002671fa60..104c46d53121 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -1439,6 +1439,21 @@ static void program_hpp_type1(struct pci_dev *dev, struct hpp_type1 *hpp)
1439 dev_warn(&dev->dev, "PCI-X settings not supported\n"); 1439 dev_warn(&dev->dev, "PCI-X settings not supported\n");
1440} 1440}
1441 1441
1442static bool pcie_root_rcb_set(struct pci_dev *dev)
1443{
1444 struct pci_dev *rp = pcie_find_root_port(dev);
1445 u16 lnkctl;
1446
1447 if (!rp)
1448 return false;
1449
1450 pcie_capability_read_word(rp, PCI_EXP_LNKCTL, &lnkctl);
1451 if (lnkctl & PCI_EXP_LNKCTL_RCB)
1452 return true;
1453
1454 return false;
1455}
1456
1442static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp) 1457static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
1443{ 1458{
1444 int pos; 1459 int pos;
@@ -1468,9 +1483,20 @@ static void program_hpp_type2(struct pci_dev *dev, struct hpp_type2 *hpp)
1468 ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or); 1483 ~hpp->pci_exp_devctl_and, hpp->pci_exp_devctl_or);
1469 1484
1470 /* Initialize Link Control Register */ 1485 /* Initialize Link Control Register */
1471 if (pcie_cap_has_lnkctl(dev)) 1486 if (pcie_cap_has_lnkctl(dev)) {
1487
1488 /*
1489 * If the Root Port supports Read Completion Boundary of
1490 * 128, set RCB to 128. Otherwise, clear it.
1491 */
1492 hpp->pci_exp_lnkctl_and |= PCI_EXP_LNKCTL_RCB;
1493 hpp->pci_exp_lnkctl_or &= ~PCI_EXP_LNKCTL_RCB;
1494 if (pcie_root_rcb_set(dev))
1495 hpp->pci_exp_lnkctl_or |= PCI_EXP_LNKCTL_RCB;
1496
1472 pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL, 1497 pcie_capability_clear_and_set_word(dev, PCI_EXP_LNKCTL,
1473 ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or); 1498 ~hpp->pci_exp_lnkctl_and, hpp->pci_exp_lnkctl_or);
1499 }
1474 1500
1475 /* Find Advanced Error Reporting Enhanced Capability */ 1501 /* Find Advanced Error Reporting Enhanced Capability */
1476 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); 1502 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
diff --git a/drivers/pci/setup-res.c b/drivers/pci/setup-res.c
index 66c4d8f42233..9526e341988b 100644
--- a/drivers/pci/setup-res.c
+++ b/drivers/pci/setup-res.c
@@ -121,6 +121,14 @@ int pci_claim_resource(struct pci_dev *dev, int resource)
121 return -EINVAL; 121 return -EINVAL;
122 } 122 }
123 123
124 /*
125 * If we have a shadow copy in RAM, the PCI device doesn't respond
126 * to the shadow range, so we don't need to claim it, and upstream
127 * bridges don't need to route the range to the device.
128 */
129 if (res->flags & IORESOURCE_ROM_SHADOW)
130 return 0;
131
124 root = pci_find_parent_resource(dev, res); 132 root = pci_find_parent_resource(dev, res);
125 if (!root) { 133 if (!root) {
126 dev_info(&dev->dev, "can't claim BAR %d %pR: no compatible bridge window\n", 134 dev_info(&dev->dev, "can't claim BAR %d %pR: no compatible bridge window\n",
diff --git a/drivers/pcmcia/soc_common.c b/drivers/pcmcia/soc_common.c
index 153f3122283d..b6b316de055c 100644
--- a/drivers/pcmcia/soc_common.c
+++ b/drivers/pcmcia/soc_common.c
@@ -107,7 +107,7 @@ int soc_pcmcia_regulator_set(struct soc_pcmcia_socket *skt,
107 107
108 ret = regulator_enable(r->reg); 108 ret = regulator_enable(r->reg);
109 } else { 109 } else {
110 regulator_disable(r->reg); 110 ret = regulator_disable(r->reg);
111 } 111 }
112 if (ret == 0) 112 if (ret == 0)
113 r->on = on; 113 r->on = on;
diff --git a/drivers/phy/phy-da8xx-usb.c b/drivers/phy/phy-da8xx-usb.c
index 32ae78c8ca17..c85fb0b59729 100644
--- a/drivers/phy/phy-da8xx-usb.c
+++ b/drivers/phy/phy-da8xx-usb.c
@@ -198,7 +198,8 @@ static int da8xx_usb_phy_probe(struct platform_device *pdev)
198 } else { 198 } else {
199 int ret; 199 int ret;
200 200
201 ret = phy_create_lookup(d_phy->usb11_phy, "usb-phy", "ohci.0"); 201 ret = phy_create_lookup(d_phy->usb11_phy, "usb-phy",
202 "ohci-da8xx");
202 if (ret) 203 if (ret)
203 dev_warn(dev, "Failed to create usb11 phy lookup\n"); 204 dev_warn(dev, "Failed to create usb11 phy lookup\n");
204 ret = phy_create_lookup(d_phy->usb20_phy, "usb-phy", 205 ret = phy_create_lookup(d_phy->usb20_phy, "usb-phy",
@@ -216,7 +217,7 @@ static int da8xx_usb_phy_remove(struct platform_device *pdev)
216 217
217 if (!pdev->dev.of_node) { 218 if (!pdev->dev.of_node) {
218 phy_remove_lookup(d_phy->usb20_phy, "usb-phy", "musb-da8xx"); 219 phy_remove_lookup(d_phy->usb20_phy, "usb-phy", "musb-da8xx");
219 phy_remove_lookup(d_phy->usb11_phy, "usb-phy", "ohci.0"); 220 phy_remove_lookup(d_phy->usb11_phy, "usb-phy", "ohci-da8xx");
220 } 221 }
221 222
222 return 0; 223 return 0;
diff --git a/drivers/phy/phy-rockchip-pcie.c b/drivers/phy/phy-rockchip-pcie.c
index a2b4c6b58aea..6904633cad68 100644
--- a/drivers/phy/phy-rockchip-pcie.c
+++ b/drivers/phy/phy-rockchip-pcie.c
@@ -249,21 +249,10 @@ err_refclk:
249static int rockchip_pcie_phy_exit(struct phy *phy) 249static int rockchip_pcie_phy_exit(struct phy *phy)
250{ 250{
251 struct rockchip_pcie_phy *rk_phy = phy_get_drvdata(phy); 251 struct rockchip_pcie_phy *rk_phy = phy_get_drvdata(phy);
252 int err = 0;
253 252
254 clk_disable_unprepare(rk_phy->clk_pciephy_ref); 253 clk_disable_unprepare(rk_phy->clk_pciephy_ref);
255 254
256 err = reset_control_deassert(rk_phy->phy_rst); 255 return 0;
257 if (err) {
258 dev_err(&phy->dev, "deassert phy_rst err %d\n", err);
259 goto err_reset;
260 }
261
262 return err;
263
264err_reset:
265 clk_prepare_enable(rk_phy->clk_pciephy_ref);
266 return err;
267} 256}
268 257
269static const struct phy_ops ops = { 258static const struct phy_ops ops = {
diff --git a/drivers/phy/phy-sun4i-usb.c b/drivers/phy/phy-sun4i-usb.c
index b9342a2af7b3..fec34f5213c4 100644
--- a/drivers/phy/phy-sun4i-usb.c
+++ b/drivers/phy/phy-sun4i-usb.c
@@ -264,7 +264,7 @@ static int sun4i_usb_phy_init(struct phy *_phy)
264 return ret; 264 return ret;
265 } 265 }
266 266
267 if (data->cfg->enable_pmu_unk1) { 267 if (phy->pmu && data->cfg->enable_pmu_unk1) {
268 val = readl(phy->pmu + REG_PMU_UNK1); 268 val = readl(phy->pmu + REG_PMU_UNK1);
269 writel(val & ~2, phy->pmu + REG_PMU_UNK1); 269 writel(val & ~2, phy->pmu + REG_PMU_UNK1);
270 } 270 }
diff --git a/drivers/phy/phy-twl4030-usb.c b/drivers/phy/phy-twl4030-usb.c
index 87e6334eab93..547ca7b3f098 100644
--- a/drivers/phy/phy-twl4030-usb.c
+++ b/drivers/phy/phy-twl4030-usb.c
@@ -459,8 +459,6 @@ static int twl4030_phy_power_off(struct phy *phy)
459 struct twl4030_usb *twl = phy_get_drvdata(phy); 459 struct twl4030_usb *twl = phy_get_drvdata(phy);
460 460
461 dev_dbg(twl->dev, "%s\n", __func__); 461 dev_dbg(twl->dev, "%s\n", __func__);
462 pm_runtime_mark_last_busy(twl->dev);
463 pm_runtime_put_autosuspend(twl->dev);
464 462
465 return 0; 463 return 0;
466} 464}
@@ -472,6 +470,8 @@ static int twl4030_phy_power_on(struct phy *phy)
472 dev_dbg(twl->dev, "%s\n", __func__); 470 dev_dbg(twl->dev, "%s\n", __func__);
473 pm_runtime_get_sync(twl->dev); 471 pm_runtime_get_sync(twl->dev);
474 schedule_delayed_work(&twl->id_workaround_work, HZ); 472 schedule_delayed_work(&twl->id_workaround_work, HZ);
473 pm_runtime_mark_last_busy(twl->dev);
474 pm_runtime_put_autosuspend(twl->dev);
475 475
476 return 0; 476 return 0;
477} 477}
diff --git a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c
index c8c72e8259d3..87b46390b695 100644
--- a/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c
+++ b/drivers/pinctrl/aspeed/pinctrl-aspeed-g5.c
@@ -26,7 +26,7 @@
26 26
27#define ASPEED_G5_NR_PINS 228 27#define ASPEED_G5_NR_PINS 228
28 28
29#define COND1 SIG_DESC_BIT(SCU90, 6, 0) 29#define COND1 { SCU90, BIT(6), 0, 0 }
30#define COND2 { SCU94, GENMASK(1, 0), 0, 0 } 30#define COND2 { SCU94, GENMASK(1, 0), 0, 0 }
31 31
32#define B14 0 32#define B14 0
diff --git a/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c b/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
index 7f7700716398..5d1e505c3c63 100644
--- a/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
+++ b/drivers/pinctrl/bcm/pinctrl-iproc-gpio.c
@@ -844,6 +844,6 @@ static struct platform_driver iproc_gpio_driver = {
844 844
845static int __init iproc_gpio_init(void) 845static int __init iproc_gpio_init(void)
846{ 846{
847 return platform_driver_probe(&iproc_gpio_driver, iproc_gpio_probe); 847 return platform_driver_register(&iproc_gpio_driver);
848} 848}
849arch_initcall_sync(iproc_gpio_init); 849arch_initcall_sync(iproc_gpio_init);
diff --git a/drivers/pinctrl/bcm/pinctrl-nsp-gpio.c b/drivers/pinctrl/bcm/pinctrl-nsp-gpio.c
index 35783db1c10b..c8deb8be1da7 100644
--- a/drivers/pinctrl/bcm/pinctrl-nsp-gpio.c
+++ b/drivers/pinctrl/bcm/pinctrl-nsp-gpio.c
@@ -741,6 +741,6 @@ static struct platform_driver nsp_gpio_driver = {
741 741
742static int __init nsp_gpio_init(void) 742static int __init nsp_gpio_init(void)
743{ 743{
744 return platform_driver_probe(&nsp_gpio_driver, nsp_gpio_probe); 744 return platform_driver_register(&nsp_gpio_driver);
745} 745}
746arch_initcall_sync(nsp_gpio_init); 746arch_initcall_sync(nsp_gpio_init);
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
index 47613201269a..79c4e14a5a75 100644
--- a/drivers/pinctrl/freescale/pinctrl-imx.c
+++ b/drivers/pinctrl/freescale/pinctrl-imx.c
@@ -687,6 +687,7 @@ static int imx_pinctrl_probe_dt(struct platform_device *pdev,
687 if (!info->functions) 687 if (!info->functions)
688 return -ENOMEM; 688 return -ENOMEM;
689 689
690 info->group_index = 0;
690 if (flat_funcs) { 691 if (flat_funcs) {
691 info->ngroups = of_get_child_count(np); 692 info->ngroups = of_get_child_count(np);
692 } else { 693 } else {
diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c
index 30389f4ccab4..c43b1e9a06af 100644
--- a/drivers/pinctrl/intel/pinctrl-cherryview.c
+++ b/drivers/pinctrl/intel/pinctrl-cherryview.c
@@ -1652,12 +1652,15 @@ static int chv_pinctrl_probe(struct platform_device *pdev)
1652} 1652}
1653 1653
1654#ifdef CONFIG_PM_SLEEP 1654#ifdef CONFIG_PM_SLEEP
1655static int chv_pinctrl_suspend(struct device *dev) 1655static int chv_pinctrl_suspend_noirq(struct device *dev)
1656{ 1656{
1657 struct platform_device *pdev = to_platform_device(dev); 1657 struct platform_device *pdev = to_platform_device(dev);
1658 struct chv_pinctrl *pctrl = platform_get_drvdata(pdev); 1658 struct chv_pinctrl *pctrl = platform_get_drvdata(pdev);
1659 unsigned long flags;
1659 int i; 1660 int i;
1660 1661
1662 raw_spin_lock_irqsave(&chv_lock, flags);
1663
1661 pctrl->saved_intmask = readl(pctrl->regs + CHV_INTMASK); 1664 pctrl->saved_intmask = readl(pctrl->regs + CHV_INTMASK);
1662 1665
1663 for (i = 0; i < pctrl->community->npins; i++) { 1666 for (i = 0; i < pctrl->community->npins; i++) {
@@ -1678,15 +1681,20 @@ static int chv_pinctrl_suspend(struct device *dev)
1678 ctx->padctrl1 = readl(reg); 1681 ctx->padctrl1 = readl(reg);
1679 } 1682 }
1680 1683
1684 raw_spin_unlock_irqrestore(&chv_lock, flags);
1685
1681 return 0; 1686 return 0;
1682} 1687}
1683 1688
1684static int chv_pinctrl_resume(struct device *dev) 1689static int chv_pinctrl_resume_noirq(struct device *dev)
1685{ 1690{
1686 struct platform_device *pdev = to_platform_device(dev); 1691 struct platform_device *pdev = to_platform_device(dev);
1687 struct chv_pinctrl *pctrl = platform_get_drvdata(pdev); 1692 struct chv_pinctrl *pctrl = platform_get_drvdata(pdev);
1693 unsigned long flags;
1688 int i; 1694 int i;
1689 1695
1696 raw_spin_lock_irqsave(&chv_lock, flags);
1697
1690 /* 1698 /*
1691 * Mask all interrupts before restoring per-pin configuration 1699 * Mask all interrupts before restoring per-pin configuration
1692 * registers because we don't know in which state BIOS left them 1700 * registers because we don't know in which state BIOS left them
@@ -1731,12 +1739,15 @@ static int chv_pinctrl_resume(struct device *dev)
1731 chv_writel(0xffff, pctrl->regs + CHV_INTSTAT); 1739 chv_writel(0xffff, pctrl->regs + CHV_INTSTAT);
1732 chv_writel(pctrl->saved_intmask, pctrl->regs + CHV_INTMASK); 1740 chv_writel(pctrl->saved_intmask, pctrl->regs + CHV_INTMASK);
1733 1741
1742 raw_spin_unlock_irqrestore(&chv_lock, flags);
1743
1734 return 0; 1744 return 0;
1735} 1745}
1736#endif 1746#endif
1737 1747
1738static const struct dev_pm_ops chv_pinctrl_pm_ops = { 1748static const struct dev_pm_ops chv_pinctrl_pm_ops = {
1739 SET_LATE_SYSTEM_SLEEP_PM_OPS(chv_pinctrl_suspend, chv_pinctrl_resume) 1749 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(chv_pinctrl_suspend_noirq,
1750 chv_pinctrl_resume_noirq)
1740}; 1751};
1741 1752
1742static const struct acpi_device_id chv_pinctrl_acpi_match[] = { 1753static const struct acpi_device_id chv_pinctrl_acpi_match[] = {
diff --git a/drivers/pinctrl/pinctrl-st.c b/drivers/pinctrl/pinctrl-st.c
index 99da4cf91031..b7bb37167969 100644
--- a/drivers/pinctrl/pinctrl-st.c
+++ b/drivers/pinctrl/pinctrl-st.c
@@ -1512,7 +1512,7 @@ static int st_gpiolib_register_bank(struct st_pinctrl *info,
1512 if (info->irqmux_base || gpio_irq > 0) { 1512 if (info->irqmux_base || gpio_irq > 0) {
1513 err = gpiochip_irqchip_add(&bank->gpio_chip, &st_gpio_irqchip, 1513 err = gpiochip_irqchip_add(&bank->gpio_chip, &st_gpio_irqchip,
1514 0, handle_simple_irq, 1514 0, handle_simple_irq,
1515 IRQ_TYPE_LEVEL_LOW); 1515 IRQ_TYPE_NONE);
1516 if (err) { 1516 if (err) {
1517 gpiochip_remove(&bank->gpio_chip); 1517 gpiochip_remove(&bank->gpio_chip);
1518 dev_info(dev, "could not add irqchip\n"); 1518 dev_info(dev, "could not add irqchip\n");
diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c
index 200667f08c37..efc43711ff5c 100644
--- a/drivers/pinctrl/stm32/pinctrl-stm32.c
+++ b/drivers/pinctrl/stm32/pinctrl-stm32.c
@@ -1092,9 +1092,11 @@ int stm32_pctl_probe(struct platform_device *pdev)
1092 return -EINVAL; 1092 return -EINVAL;
1093 } 1093 }
1094 1094
1095 ret = stm32_pctrl_dt_setup_irq(pdev, pctl); 1095 if (of_find_property(np, "interrupt-parent", NULL)) {
1096 if (ret) 1096 ret = stm32_pctrl_dt_setup_irq(pdev, pctl);
1097 return ret; 1097 if (ret)
1098 return ret;
1099 }
1098 1100
1099 for_each_child_of_node(np, child) 1101 for_each_child_of_node(np, child)
1100 if (of_property_read_bool(child, "gpio-controller")) 1102 if (of_property_read_bool(child, "gpio-controller"))
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
index a2323941e677..a7614fc542b5 100644
--- a/drivers/platform/x86/ideapad-laptop.c
+++ b/drivers/platform/x86/ideapad-laptop.c
@@ -934,6 +934,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = {
934 }, 934 },
935 }, 935 },
936 { 936 {
937 .ident = "Lenovo Yoga 900",
938 .matches = {
939 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
940 DMI_MATCH(DMI_BOARD_NAME, "VIUU4"),
941 },
942 },
943 {
937 .ident = "Lenovo YOGA 910-13IKB", 944 .ident = "Lenovo YOGA 910-13IKB",
938 .matches = { 945 .matches = {
939 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"), 946 DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
diff --git a/drivers/platform/x86/intel-hid.c b/drivers/platform/x86/intel-hid.c
index ed5874217ee7..12dbb5063376 100644
--- a/drivers/platform/x86/intel-hid.c
+++ b/drivers/platform/x86/intel-hid.c
@@ -264,7 +264,7 @@ check_acpi_dev(acpi_handle handle, u32 lvl, void *context, void **rv)
264 return AE_OK; 264 return AE_OK;
265 265
266 if (acpi_match_device_ids(dev, ids) == 0) 266 if (acpi_match_device_ids(dev, ids) == 0)
267 if (acpi_create_platform_device(dev)) 267 if (acpi_create_platform_device(dev, NULL))
268 dev_info(&dev->dev, 268 dev_info(&dev->dev,
269 "intel-hid: created platform device\n"); 269 "intel-hid: created platform device\n");
270 270
diff --git a/drivers/platform/x86/intel-vbtn.c b/drivers/platform/x86/intel-vbtn.c
index 146d02f8c9bc..78080763df51 100644
--- a/drivers/platform/x86/intel-vbtn.c
+++ b/drivers/platform/x86/intel-vbtn.c
@@ -164,7 +164,7 @@ check_acpi_dev(acpi_handle handle, u32 lvl, void *context, void **rv)
164 return AE_OK; 164 return AE_OK;
165 165
166 if (acpi_match_device_ids(dev, ids) == 0) 166 if (acpi_match_device_ids(dev, ids) == 0)
167 if (acpi_create_platform_device(dev)) 167 if (acpi_create_platform_device(dev, NULL))
168 dev_info(&dev->dev, 168 dev_info(&dev->dev,
169 "intel-vbtn: created platform device\n"); 169 "intel-vbtn: created platform device\n");
170 170
diff --git a/drivers/platform/x86/toshiba-wmi.c b/drivers/platform/x86/toshiba-wmi.c
index feac4576b837..2df07ee8f3c3 100644
--- a/drivers/platform/x86/toshiba-wmi.c
+++ b/drivers/platform/x86/toshiba-wmi.c
@@ -24,14 +24,15 @@
24#include <linux/acpi.h> 24#include <linux/acpi.h>
25#include <linux/input.h> 25#include <linux/input.h>
26#include <linux/input/sparse-keymap.h> 26#include <linux/input/sparse-keymap.h>
27#include <linux/dmi.h>
27 28
28MODULE_AUTHOR("Azael Avalos"); 29MODULE_AUTHOR("Azael Avalos");
29MODULE_DESCRIPTION("Toshiba WMI Hotkey Driver"); 30MODULE_DESCRIPTION("Toshiba WMI Hotkey Driver");
30MODULE_LICENSE("GPL"); 31MODULE_LICENSE("GPL");
31 32
32#define TOSHIBA_WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100" 33#define WMI_EVENT_GUID "59142400-C6A3-40FA-BADB-8A2652834100"
33 34
34MODULE_ALIAS("wmi:"TOSHIBA_WMI_EVENT_GUID); 35MODULE_ALIAS("wmi:"WMI_EVENT_GUID);
35 36
36static struct input_dev *toshiba_wmi_input_dev; 37static struct input_dev *toshiba_wmi_input_dev;
37 38
@@ -63,6 +64,16 @@ static void toshiba_wmi_notify(u32 value, void *context)
63 kfree(response.pointer); 64 kfree(response.pointer);
64} 65}
65 66
67static struct dmi_system_id toshiba_wmi_dmi_table[] __initdata = {
68 {
69 .ident = "Toshiba laptop",
70 .matches = {
71 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
72 },
73 },
74 {}
75};
76
66static int __init toshiba_wmi_input_setup(void) 77static int __init toshiba_wmi_input_setup(void)
67{ 78{
68 acpi_status status; 79 acpi_status status;
@@ -81,7 +92,7 @@ static int __init toshiba_wmi_input_setup(void)
81 if (err) 92 if (err)
82 goto err_free_dev; 93 goto err_free_dev;
83 94
84 status = wmi_install_notify_handler(TOSHIBA_WMI_EVENT_GUID, 95 status = wmi_install_notify_handler(WMI_EVENT_GUID,
85 toshiba_wmi_notify, NULL); 96 toshiba_wmi_notify, NULL);
86 if (ACPI_FAILURE(status)) { 97 if (ACPI_FAILURE(status)) {
87 err = -EIO; 98 err = -EIO;
@@ -95,7 +106,7 @@ static int __init toshiba_wmi_input_setup(void)
95 return 0; 106 return 0;
96 107
97 err_remove_notifier: 108 err_remove_notifier:
98 wmi_remove_notify_handler(TOSHIBA_WMI_EVENT_GUID); 109 wmi_remove_notify_handler(WMI_EVENT_GUID);
99 err_free_keymap: 110 err_free_keymap:
100 sparse_keymap_free(toshiba_wmi_input_dev); 111 sparse_keymap_free(toshiba_wmi_input_dev);
101 err_free_dev: 112 err_free_dev:
@@ -105,7 +116,7 @@ static int __init toshiba_wmi_input_setup(void)
105 116
106static void toshiba_wmi_input_destroy(void) 117static void toshiba_wmi_input_destroy(void)
107{ 118{
108 wmi_remove_notify_handler(TOSHIBA_WMI_EVENT_GUID); 119 wmi_remove_notify_handler(WMI_EVENT_GUID);
109 sparse_keymap_free(toshiba_wmi_input_dev); 120 sparse_keymap_free(toshiba_wmi_input_dev);
110 input_unregister_device(toshiba_wmi_input_dev); 121 input_unregister_device(toshiba_wmi_input_dev);
111} 122}
@@ -114,7 +125,8 @@ static int __init toshiba_wmi_init(void)
114{ 125{
115 int ret; 126 int ret;
116 127
117 if (!wmi_has_guid(TOSHIBA_WMI_EVENT_GUID)) 128 if (!wmi_has_guid(WMI_EVENT_GUID) ||
129 !dmi_check_system(toshiba_wmi_dmi_table))
118 return -ENODEV; 130 return -ENODEV;
119 131
120 ret = toshiba_wmi_input_setup(); 132 ret = toshiba_wmi_input_setup();
@@ -130,7 +142,7 @@ static int __init toshiba_wmi_init(void)
130 142
131static void __exit toshiba_wmi_exit(void) 143static void __exit toshiba_wmi_exit(void)
132{ 144{
133 if (wmi_has_guid(TOSHIBA_WMI_EVENT_GUID)) 145 if (wmi_has_guid(WMI_EVENT_GUID))
134 toshiba_wmi_input_destroy(); 146 toshiba_wmi_input_destroy();
135} 147}
136 148
diff --git a/drivers/pwm/pwm-meson.c b/drivers/pwm/pwm-meson.c
index 381871b2bb46..9d5bd7d5c610 100644
--- a/drivers/pwm/pwm-meson.c
+++ b/drivers/pwm/pwm-meson.c
@@ -474,6 +474,7 @@ static int meson_pwm_probe(struct platform_device *pdev)
474 if (IS_ERR(meson->base)) 474 if (IS_ERR(meson->base))
475 return PTR_ERR(meson->base); 475 return PTR_ERR(meson->base);
476 476
477 spin_lock_init(&meson->lock);
477 meson->chip.dev = &pdev->dev; 478 meson->chip.dev = &pdev->dev;
478 meson->chip.ops = &meson_pwm_ops; 479 meson->chip.ops = &meson_pwm_ops;
479 meson->chip.base = -1; 480 meson->chip.base = -1;
diff --git a/drivers/pwm/sysfs.c b/drivers/pwm/sysfs.c
index 0296d8178ae2..a813239300c3 100644
--- a/drivers/pwm/sysfs.c
+++ b/drivers/pwm/sysfs.c
@@ -425,6 +425,8 @@ void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
425 if (test_bit(PWMF_EXPORTED, &pwm->flags)) 425 if (test_bit(PWMF_EXPORTED, &pwm->flags))
426 pwm_unexport_child(parent, pwm); 426 pwm_unexport_child(parent, pwm);
427 } 427 }
428
429 put_device(parent);
428} 430}
429 431
430static int __init pwm_sysfs_init(void) 432static int __init pwm_sysfs_init(void)
diff --git a/drivers/regulator/rk808-regulator.c b/drivers/regulator/rk808-regulator.c
index 3314bf299a51..fb44d5215e30 100644
--- a/drivers/regulator/rk808-regulator.c
+++ b/drivers/regulator/rk808-regulator.c
@@ -120,7 +120,7 @@ static const struct regulator_linear_range rk808_ldo3_voltage_ranges[] = {
120static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev) 120static int rk808_buck1_2_get_voltage_sel_regmap(struct regulator_dev *rdev)
121{ 121{
122 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev); 122 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
123 int id = rdev->desc->id - RK808_ID_DCDC1; 123 int id = rdev_get_id(rdev);
124 struct gpio_desc *gpio = pdata->dvs_gpio[id]; 124 struct gpio_desc *gpio = pdata->dvs_gpio[id];
125 unsigned int val; 125 unsigned int val;
126 int ret; 126 int ret;
@@ -193,7 +193,7 @@ static int rk808_buck1_2_set_voltage_sel(struct regulator_dev *rdev,
193 unsigned sel) 193 unsigned sel)
194{ 194{
195 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev); 195 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
196 int id = rdev->desc->id - RK808_ID_DCDC1; 196 int id = rdev_get_id(rdev);
197 struct gpio_desc *gpio = pdata->dvs_gpio[id]; 197 struct gpio_desc *gpio = pdata->dvs_gpio[id];
198 unsigned int reg = rdev->desc->vsel_reg; 198 unsigned int reg = rdev->desc->vsel_reg;
199 unsigned old_sel; 199 unsigned old_sel;
@@ -232,7 +232,7 @@ static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
232 unsigned int new_selector) 232 unsigned int new_selector)
233{ 233{
234 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev); 234 struct rk808_regulator_data *pdata = rdev_get_drvdata(rdev);
235 int id = rdev->desc->id - RK808_ID_DCDC1; 235 int id = rdev_get_id(rdev);
236 struct gpio_desc *gpio = pdata->dvs_gpio[id]; 236 struct gpio_desc *gpio = pdata->dvs_gpio[id];
237 237
238 /* if there is no dvs1/2 pin, we don't need wait extra time here. */ 238 /* if there is no dvs1/2 pin, we don't need wait extra time here. */
@@ -245,8 +245,7 @@ static int rk808_buck1_2_set_voltage_time_sel(struct regulator_dev *rdev,
245static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay) 245static int rk808_set_ramp_delay(struct regulator_dev *rdev, int ramp_delay)
246{ 246{
247 unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US; 247 unsigned int ramp_value = RK808_RAMP_RATE_10MV_PER_US;
248 unsigned int reg = rk808_buck_config_regs[rdev->desc->id - 248 unsigned int reg = rk808_buck_config_regs[rdev_get_id(rdev)];
249 RK808_ID_DCDC1];
250 249
251 switch (ramp_delay) { 250 switch (ramp_delay) {
252 case 1 ... 2000: 251 case 1 ... 2000:
diff --git a/drivers/rtc/rtc-asm9260.c b/drivers/rtc/rtc-asm9260.c
index 18a93d3e3f93..d36534965635 100644
--- a/drivers/rtc/rtc-asm9260.c
+++ b/drivers/rtc/rtc-asm9260.c
@@ -327,6 +327,7 @@ static const struct of_device_id asm9260_dt_ids[] = {
327 { .compatible = "alphascale,asm9260-rtc", }, 327 { .compatible = "alphascale,asm9260-rtc", },
328 {} 328 {}
329}; 329};
330MODULE_DEVICE_TABLE(of, asm9260_dt_ids);
330 331
331static struct platform_driver asm9260_rtc_driver = { 332static struct platform_driver asm9260_rtc_driver = {
332 .probe = asm9260_rtc_probe, 333 .probe = asm9260_rtc_probe,
diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index dd3d59806ffa..7030d7cd3861 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -776,7 +776,7 @@ static void cmos_do_shutdown(int rtc_irq)
776 spin_unlock_irq(&rtc_lock); 776 spin_unlock_irq(&rtc_lock);
777} 777}
778 778
779static void __exit cmos_do_remove(struct device *dev) 779static void cmos_do_remove(struct device *dev)
780{ 780{
781 struct cmos_rtc *cmos = dev_get_drvdata(dev); 781 struct cmos_rtc *cmos = dev_get_drvdata(dev);
782 struct resource *ports; 782 struct resource *ports;
@@ -996,8 +996,9 @@ static u32 rtc_handler(void *context)
996 struct cmos_rtc *cmos = dev_get_drvdata(dev); 996 struct cmos_rtc *cmos = dev_get_drvdata(dev);
997 unsigned char rtc_control = 0; 997 unsigned char rtc_control = 0;
998 unsigned char rtc_intr; 998 unsigned char rtc_intr;
999 unsigned long flags;
999 1000
1000 spin_lock_irq(&rtc_lock); 1001 spin_lock_irqsave(&rtc_lock, flags);
1001 if (cmos_rtc.suspend_ctrl) 1002 if (cmos_rtc.suspend_ctrl)
1002 rtc_control = CMOS_READ(RTC_CONTROL); 1003 rtc_control = CMOS_READ(RTC_CONTROL);
1003 if (rtc_control & RTC_AIE) { 1004 if (rtc_control & RTC_AIE) {
@@ -1006,7 +1007,7 @@ static u32 rtc_handler(void *context)
1006 rtc_intr = CMOS_READ(RTC_INTR_FLAGS); 1007 rtc_intr = CMOS_READ(RTC_INTR_FLAGS);
1007 rtc_update_irq(cmos->rtc, 1, rtc_intr); 1008 rtc_update_irq(cmos->rtc, 1, rtc_intr);
1008 } 1009 }
1009 spin_unlock_irq(&rtc_lock); 1010 spin_unlock_irqrestore(&rtc_lock, flags);
1010 1011
1011 pm_wakeup_event(dev, 0); 1012 pm_wakeup_event(dev, 0);
1012 acpi_clear_event(ACPI_EVENT_RTC); 1013 acpi_clear_event(ACPI_EVENT_RTC);
@@ -1129,7 +1130,7 @@ static int cmos_pnp_probe(struct pnp_dev *pnp, const struct pnp_device_id *id)
1129 pnp_irq(pnp, 0)); 1130 pnp_irq(pnp, 0));
1130} 1131}
1131 1132
1132static void __exit cmos_pnp_remove(struct pnp_dev *pnp) 1133static void cmos_pnp_remove(struct pnp_dev *pnp)
1133{ 1134{
1134 cmos_do_remove(&pnp->dev); 1135 cmos_do_remove(&pnp->dev);
1135} 1136}
@@ -1161,7 +1162,7 @@ static struct pnp_driver cmos_pnp_driver = {
1161 .name = (char *) driver_name, 1162 .name = (char *) driver_name,
1162 .id_table = rtc_ids, 1163 .id_table = rtc_ids,
1163 .probe = cmos_pnp_probe, 1164 .probe = cmos_pnp_probe,
1164 .remove = __exit_p(cmos_pnp_remove), 1165 .remove = cmos_pnp_remove,
1165 .shutdown = cmos_pnp_shutdown, 1166 .shutdown = cmos_pnp_shutdown,
1166 1167
1167 /* flag ensures resume() gets called, and stops syslog spam */ 1168 /* flag ensures resume() gets called, and stops syslog spam */
@@ -1238,7 +1239,7 @@ static int __init cmos_platform_probe(struct platform_device *pdev)
1238 return cmos_do_probe(&pdev->dev, resource, irq); 1239 return cmos_do_probe(&pdev->dev, resource, irq);
1239} 1240}
1240 1241
1241static int __exit cmos_platform_remove(struct platform_device *pdev) 1242static int cmos_platform_remove(struct platform_device *pdev)
1242{ 1243{
1243 cmos_do_remove(&pdev->dev); 1244 cmos_do_remove(&pdev->dev);
1244 return 0; 1245 return 0;
@@ -1263,7 +1264,7 @@ static void cmos_platform_shutdown(struct platform_device *pdev)
1263MODULE_ALIAS("platform:rtc_cmos"); 1264MODULE_ALIAS("platform:rtc_cmos");
1264 1265
1265static struct platform_driver cmos_platform_driver = { 1266static struct platform_driver cmos_platform_driver = {
1266 .remove = __exit_p(cmos_platform_remove), 1267 .remove = cmos_platform_remove,
1267 .shutdown = cmos_platform_shutdown, 1268 .shutdown = cmos_platform_shutdown,
1268 .driver = { 1269 .driver = {
1269 .name = driver_name, 1270 .name = driver_name,
diff --git a/drivers/rtc/rtc-omap.c b/drivers/rtc/rtc-omap.c
index b04ea9b5ae67..51e52446eacb 100644
--- a/drivers/rtc/rtc-omap.c
+++ b/drivers/rtc/rtc-omap.c
@@ -113,6 +113,7 @@
113/* OMAP_RTC_OSC_REG bit fields: */ 113/* OMAP_RTC_OSC_REG bit fields: */
114#define OMAP_RTC_OSC_32KCLK_EN BIT(6) 114#define OMAP_RTC_OSC_32KCLK_EN BIT(6)
115#define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3) 115#define OMAP_RTC_OSC_SEL_32KCLK_SRC BIT(3)
116#define OMAP_RTC_OSC_OSC32K_GZ_DISABLE BIT(4)
116 117
117/* OMAP_RTC_IRQWAKEEN bit fields: */ 118/* OMAP_RTC_IRQWAKEEN bit fields: */
118#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1) 119#define OMAP_RTC_IRQWAKEEN_ALARM_WAKEEN BIT(1)
@@ -146,6 +147,7 @@ struct omap_rtc {
146 u8 interrupts_reg; 147 u8 interrupts_reg;
147 bool is_pmic_controller; 148 bool is_pmic_controller;
148 bool has_ext_clk; 149 bool has_ext_clk;
150 bool is_suspending;
149 const struct omap_rtc_device_type *type; 151 const struct omap_rtc_device_type *type;
150 struct pinctrl_dev *pctldev; 152 struct pinctrl_dev *pctldev;
151}; 153};
@@ -786,8 +788,9 @@ static int omap_rtc_probe(struct platform_device *pdev)
786 */ 788 */
787 if (rtc->has_ext_clk) { 789 if (rtc->has_ext_clk) {
788 reg = rtc_read(rtc, OMAP_RTC_OSC_REG); 790 reg = rtc_read(rtc, OMAP_RTC_OSC_REG);
789 rtc_write(rtc, OMAP_RTC_OSC_REG, 791 reg &= ~OMAP_RTC_OSC_OSC32K_GZ_DISABLE;
790 reg | OMAP_RTC_OSC_SEL_32KCLK_SRC); 792 reg |= OMAP_RTC_OSC_32KCLK_EN | OMAP_RTC_OSC_SEL_32KCLK_SRC;
793 rtc_writel(rtc, OMAP_RTC_OSC_REG, reg);
791 } 794 }
792 795
793 rtc->type->lock(rtc); 796 rtc->type->lock(rtc);
@@ -898,8 +901,7 @@ static int omap_rtc_suspend(struct device *dev)
898 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, 0); 901 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, 0);
899 rtc->type->lock(rtc); 902 rtc->type->lock(rtc);
900 903
901 /* Disable the clock/module */ 904 rtc->is_suspending = true;
902 pm_runtime_put_sync(dev);
903 905
904 return 0; 906 return 0;
905} 907}
@@ -908,9 +910,6 @@ static int omap_rtc_resume(struct device *dev)
908{ 910{
909 struct omap_rtc *rtc = dev_get_drvdata(dev); 911 struct omap_rtc *rtc = dev_get_drvdata(dev);
910 912
911 /* Enable the clock/module so that we can access the registers */
912 pm_runtime_get_sync(dev);
913
914 rtc->type->unlock(rtc); 913 rtc->type->unlock(rtc);
915 if (device_may_wakeup(dev)) 914 if (device_may_wakeup(dev))
916 disable_irq_wake(rtc->irq_alarm); 915 disable_irq_wake(rtc->irq_alarm);
@@ -918,11 +917,34 @@ static int omap_rtc_resume(struct device *dev)
918 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, rtc->interrupts_reg); 917 rtc_write(rtc, OMAP_RTC_INTERRUPTS_REG, rtc->interrupts_reg);
919 rtc->type->lock(rtc); 918 rtc->type->lock(rtc);
920 919
920 rtc->is_suspending = false;
921
921 return 0; 922 return 0;
922} 923}
923#endif 924#endif
924 925
925static SIMPLE_DEV_PM_OPS(omap_rtc_pm_ops, omap_rtc_suspend, omap_rtc_resume); 926#ifdef CONFIG_PM
927static int omap_rtc_runtime_suspend(struct device *dev)
928{
929 struct omap_rtc *rtc = dev_get_drvdata(dev);
930
931 if (rtc->is_suspending && !rtc->has_ext_clk)
932 return -EBUSY;
933
934 return 0;
935}
936
937static int omap_rtc_runtime_resume(struct device *dev)
938{
939 return 0;
940}
941#endif
942
943static const struct dev_pm_ops omap_rtc_pm_ops = {
944 SET_SYSTEM_SLEEP_PM_OPS(omap_rtc_suspend, omap_rtc_resume)
945 SET_RUNTIME_PM_OPS(omap_rtc_runtime_suspend,
946 omap_rtc_runtime_resume, NULL)
947};
926 948
927static void omap_rtc_shutdown(struct platform_device *pdev) 949static void omap_rtc_shutdown(struct platform_device *pdev)
928{ 950{
diff --git a/drivers/scsi/be2iscsi/be_mgmt.c b/drivers/scsi/be2iscsi/be_mgmt.c
index aebc4ddb3060..ac05317bba7f 100644
--- a/drivers/scsi/be2iscsi/be_mgmt.c
+++ b/drivers/scsi/be2iscsi/be_mgmt.c
@@ -1083,7 +1083,7 @@ unsigned int beiscsi_boot_get_sinfo(struct beiscsi_hba *phba)
1083 nonemb_cmd = &phba->boot_struct.nonemb_cmd; 1083 nonemb_cmd = &phba->boot_struct.nonemb_cmd;
1084 nonemb_cmd->size = sizeof(*resp); 1084 nonemb_cmd->size = sizeof(*resp);
1085 nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev, 1085 nonemb_cmd->va = pci_alloc_consistent(phba->ctrl.pdev,
1086 sizeof(nonemb_cmd->size), 1086 nonemb_cmd->size,
1087 &nonemb_cmd->dma); 1087 &nonemb_cmd->dma);
1088 if (!nonemb_cmd->va) { 1088 if (!nonemb_cmd->va) {
1089 mutex_unlock(&ctrl->mbox_lock); 1089 mutex_unlock(&ctrl->mbox_lock);
diff --git a/drivers/scsi/cxgbi/libcxgbi.c b/drivers/scsi/cxgbi/libcxgbi.c
index d1421139e6ea..2ffe029ff2b6 100644
--- a/drivers/scsi/cxgbi/libcxgbi.c
+++ b/drivers/scsi/cxgbi/libcxgbi.c
@@ -2081,9 +2081,10 @@ void cxgbi_cleanup_task(struct iscsi_task *task)
2081 /* never reached the xmit task callout */ 2081 /* never reached the xmit task callout */
2082 if (tdata->skb) 2082 if (tdata->skb)
2083 __kfree_skb(tdata->skb); 2083 __kfree_skb(tdata->skb);
2084 memset(tdata, 0, sizeof(*tdata));
2085 2084
2086 task_release_itt(task, task->hdr_itt); 2085 task_release_itt(task, task->hdr_itt);
2086 memset(tdata, 0, sizeof(*tdata));
2087
2087 iscsi_tcp_cleanup_task(task); 2088 iscsi_tcp_cleanup_task(task);
2088} 2089}
2089EXPORT_SYMBOL_GPL(cxgbi_cleanup_task); 2090EXPORT_SYMBOL_GPL(cxgbi_cleanup_task);
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
index 241829e59668..7bb20684e9fa 100644
--- a/drivers/scsi/device_handler/scsi_dh_alua.c
+++ b/drivers/scsi/device_handler/scsi_dh_alua.c
@@ -793,6 +793,7 @@ static void alua_rtpg_work(struct work_struct *work)
793 WARN_ON(pg->flags & ALUA_PG_RUN_RTPG); 793 WARN_ON(pg->flags & ALUA_PG_RUN_RTPG);
794 WARN_ON(pg->flags & ALUA_PG_RUN_STPG); 794 WARN_ON(pg->flags & ALUA_PG_RUN_STPG);
795 spin_unlock_irqrestore(&pg->lock, flags); 795 spin_unlock_irqrestore(&pg->lock, flags);
796 kref_put(&pg->kref, release_port_group);
796 return; 797 return;
797 } 798 }
798 if (pg->flags & ALUA_SYNC_STPG) 799 if (pg->flags & ALUA_SYNC_STPG)
@@ -890,6 +891,7 @@ static void alua_rtpg_queue(struct alua_port_group *pg,
890 /* Do not queue if the worker is already running */ 891 /* Do not queue if the worker is already running */
891 if (!(pg->flags & ALUA_PG_RUNNING)) { 892 if (!(pg->flags & ALUA_PG_RUNNING)) {
892 kref_get(&pg->kref); 893 kref_get(&pg->kref);
894 sdev = NULL;
893 start_queue = 1; 895 start_queue = 1;
894 } 896 }
895 } 897 }
@@ -901,7 +903,8 @@ static void alua_rtpg_queue(struct alua_port_group *pg,
901 if (start_queue && 903 if (start_queue &&
902 !queue_delayed_work(alua_wq, &pg->rtpg_work, 904 !queue_delayed_work(alua_wq, &pg->rtpg_work,
903 msecs_to_jiffies(ALUA_RTPG_DELAY_MSECS))) { 905 msecs_to_jiffies(ALUA_RTPG_DELAY_MSECS))) {
904 scsi_device_put(sdev); 906 if (sdev)
907 scsi_device_put(sdev);
905 kref_put(&pg->kref, release_port_group); 908 kref_put(&pg->kref, release_port_group);
906 } 909 }
907} 910}
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index d007ec18179a..a1d6ab76a514 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -2009,7 +2009,7 @@ static struct hpsa_scsi_dev_t *lookup_hpsa_scsi_dev(struct ctlr_info *h,
2009 2009
2010static int hpsa_slave_alloc(struct scsi_device *sdev) 2010static int hpsa_slave_alloc(struct scsi_device *sdev)
2011{ 2011{
2012 struct hpsa_scsi_dev_t *sd; 2012 struct hpsa_scsi_dev_t *sd = NULL;
2013 unsigned long flags; 2013 unsigned long flags;
2014 struct ctlr_info *h; 2014 struct ctlr_info *h;
2015 2015
@@ -2026,7 +2026,8 @@ static int hpsa_slave_alloc(struct scsi_device *sdev)
2026 sd->target = sdev_id(sdev); 2026 sd->target = sdev_id(sdev);
2027 sd->lun = sdev->lun; 2027 sd->lun = sdev->lun;
2028 } 2028 }
2029 } else 2029 }
2030 if (!sd)
2030 sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev), 2031 sd = lookup_hpsa_scsi_dev(h, sdev_channel(sdev),
2031 sdev_id(sdev), sdev->lun); 2032 sdev_id(sdev), sdev->lun);
2032 2033
@@ -3840,6 +3841,7 @@ static int hpsa_update_device_info(struct ctlr_info *h,
3840 sizeof(this_device->vendor)); 3841 sizeof(this_device->vendor));
3841 memcpy(this_device->model, &inq_buff[16], 3842 memcpy(this_device->model, &inq_buff[16],
3842 sizeof(this_device->model)); 3843 sizeof(this_device->model));
3844 this_device->rev = inq_buff[2];
3843 memset(this_device->device_id, 0, 3845 memset(this_device->device_id, 0,
3844 sizeof(this_device->device_id)); 3846 sizeof(this_device->device_id));
3845 if (hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8, 3847 if (hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
@@ -3929,10 +3931,14 @@ static void figure_bus_target_lun(struct ctlr_info *h,
3929 3931
3930 if (!is_logical_dev_addr_mode(lunaddrbytes)) { 3932 if (!is_logical_dev_addr_mode(lunaddrbytes)) {
3931 /* physical device, target and lun filled in later */ 3933 /* physical device, target and lun filled in later */
3932 if (is_hba_lunid(lunaddrbytes)) 3934 if (is_hba_lunid(lunaddrbytes)) {
3935 int bus = HPSA_HBA_BUS;
3936
3937 if (!device->rev)
3938 bus = HPSA_LEGACY_HBA_BUS;
3933 hpsa_set_bus_target_lun(device, 3939 hpsa_set_bus_target_lun(device,
3934 HPSA_HBA_BUS, 0, lunid & 0x3fff); 3940 bus, 0, lunid & 0x3fff);
3935 else 3941 } else
3936 /* defer target, lun assignment for physical devices */ 3942 /* defer target, lun assignment for physical devices */
3937 hpsa_set_bus_target_lun(device, 3943 hpsa_set_bus_target_lun(device,
3938 HPSA_PHYSICAL_DEVICE_BUS, -1, -1); 3944 HPSA_PHYSICAL_DEVICE_BUS, -1, -1);
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h
index 82cdfad874f3..9ea162de80dc 100644
--- a/drivers/scsi/hpsa.h
+++ b/drivers/scsi/hpsa.h
@@ -69,6 +69,7 @@ struct hpsa_scsi_dev_t {
69 u64 sas_address; 69 u64 sas_address;
70 unsigned char vendor[8]; /* bytes 8-15 of inquiry data */ 70 unsigned char vendor[8]; /* bytes 8-15 of inquiry data */
71 unsigned char model[16]; /* bytes 16-31 of inquiry data */ 71 unsigned char model[16]; /* bytes 16-31 of inquiry data */
72 unsigned char rev; /* byte 2 of inquiry data */
72 unsigned char raid_level; /* from inquiry page 0xC1 */ 73 unsigned char raid_level; /* from inquiry page 0xC1 */
73 unsigned char volume_offline; /* discovered via TUR or VPD */ 74 unsigned char volume_offline; /* discovered via TUR or VPD */
74 u16 queue_depth; /* max queue_depth for this device */ 75 u16 queue_depth; /* max queue_depth for this device */
@@ -402,6 +403,7 @@ struct offline_device_entry {
402#define HPSA_RAID_VOLUME_BUS 1 403#define HPSA_RAID_VOLUME_BUS 1
403#define HPSA_EXTERNAL_RAID_VOLUME_BUS 2 404#define HPSA_EXTERNAL_RAID_VOLUME_BUS 2
404#define HPSA_HBA_BUS 0 405#define HPSA_HBA_BUS 0
406#define HPSA_LEGACY_HBA_BUS 3
405 407
406/* 408/*
407 Send the command to the hardware 409 Send the command to the hardware
diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
index 04ce7cfb6d1b..50c71678a156 100644
--- a/drivers/scsi/libfc/fc_lport.c
+++ b/drivers/scsi/libfc/fc_lport.c
@@ -308,7 +308,7 @@ struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
308 fc_stats = &lport->host_stats; 308 fc_stats = &lport->host_stats;
309 memset(fc_stats, 0, sizeof(struct fc_host_statistics)); 309 memset(fc_stats, 0, sizeof(struct fc_host_statistics));
310 310
311 fc_stats->seconds_since_last_reset = (lport->boot_time - jiffies) / HZ; 311 fc_stats->seconds_since_last_reset = (jiffies - lport->boot_time) / HZ;
312 312
313 for_each_possible_cpu(cpu) { 313 for_each_possible_cpu(cpu) {
314 struct fc_stats *stats; 314 struct fc_stats *stats;
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c
index c5326055beee..f4f77c5b0c83 100644
--- a/drivers/scsi/lpfc/lpfc_sli.c
+++ b/drivers/scsi/lpfc/lpfc_sli.c
@@ -1323,18 +1323,20 @@ lpfc_sli_ringtxcmpl_put(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
1323{ 1323{
1324 lockdep_assert_held(&phba->hbalock); 1324 lockdep_assert_held(&phba->hbalock);
1325 1325
1326 BUG_ON(!piocb || !piocb->vport); 1326 BUG_ON(!piocb);
1327 1327
1328 list_add_tail(&piocb->list, &pring->txcmplq); 1328 list_add_tail(&piocb->list, &pring->txcmplq);
1329 piocb->iocb_flag |= LPFC_IO_ON_TXCMPLQ; 1329 piocb->iocb_flag |= LPFC_IO_ON_TXCMPLQ;
1330 1330
1331 if ((unlikely(pring->ringno == LPFC_ELS_RING)) && 1331 if ((unlikely(pring->ringno == LPFC_ELS_RING)) &&
1332 (piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) && 1332 (piocb->iocb.ulpCommand != CMD_ABORT_XRI_CN) &&
1333 (piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN) && 1333 (piocb->iocb.ulpCommand != CMD_CLOSE_XRI_CN)) {
1334 (!(piocb->vport->load_flag & FC_UNLOADING))) 1334 BUG_ON(!piocb->vport);
1335 mod_timer(&piocb->vport->els_tmofunc, 1335 if (!(piocb->vport->load_flag & FC_UNLOADING))
1336 jiffies + 1336 mod_timer(&piocb->vport->els_tmofunc,
1337 msecs_to_jiffies(1000 * (phba->fc_ratov << 1))); 1337 jiffies +
1338 msecs_to_jiffies(1000 * (phba->fc_ratov << 1)));
1339 }
1338 1340
1339 return 0; 1341 return 0;
1340} 1342}
diff --git a/drivers/scsi/megaraid/megaraid_sas.h b/drivers/scsi/megaraid/megaraid_sas.h
index ca86c885dfaa..3aaea713bf37 100644
--- a/drivers/scsi/megaraid/megaraid_sas.h
+++ b/drivers/scsi/megaraid/megaraid_sas.h
@@ -2233,7 +2233,7 @@ struct megasas_instance_template {
2233}; 2233};
2234 2234
2235#define MEGASAS_IS_LOGICAL(scp) \ 2235#define MEGASAS_IS_LOGICAL(scp) \
2236 (scp->device->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1 2236 ((scp->device->channel < MEGASAS_MAX_PD_CHANNELS) ? 0 : 1)
2237 2237
2238#define MEGASAS_DEV_INDEX(scp) \ 2238#define MEGASAS_DEV_INDEX(scp) \
2239 (((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \ 2239 (((scp->device->channel % 2) * MEGASAS_MAX_DEV_PER_CHANNEL) + \
diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 209a969a979d..1c4744e78173 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -1273,9 +1273,9 @@ scsih_target_alloc(struct scsi_target *starget)
1273 sas_target_priv_data->handle = raid_device->handle; 1273 sas_target_priv_data->handle = raid_device->handle;
1274 sas_target_priv_data->sas_address = raid_device->wwid; 1274 sas_target_priv_data->sas_address = raid_device->wwid;
1275 sas_target_priv_data->flags |= MPT_TARGET_FLAGS_VOLUME; 1275 sas_target_priv_data->flags |= MPT_TARGET_FLAGS_VOLUME;
1276 sas_target_priv_data->raid_device = raid_device;
1277 if (ioc->is_warpdrive) 1276 if (ioc->is_warpdrive)
1278 raid_device->starget = starget; 1277 sas_target_priv_data->raid_device = raid_device;
1278 raid_device->starget = starget;
1279 } 1279 }
1280 spin_unlock_irqrestore(&ioc->raid_device_lock, flags); 1280 spin_unlock_irqrestore(&ioc->raid_device_lock, flags);
1281 return 0; 1281 return 0;
@@ -3885,6 +3885,11 @@ _scsih_temp_threshold_events(struct MPT3SAS_ADAPTER *ioc,
3885 } 3885 }
3886} 3886}
3887 3887
3888static inline bool ata_12_16_cmd(struct scsi_cmnd *scmd)
3889{
3890 return (scmd->cmnd[0] == ATA_12 || scmd->cmnd[0] == ATA_16);
3891}
3892
3888/** 3893/**
3889 * _scsih_flush_running_cmds - completing outstanding commands. 3894 * _scsih_flush_running_cmds - completing outstanding commands.
3890 * @ioc: per adapter object 3895 * @ioc: per adapter object
@@ -3906,6 +3911,9 @@ _scsih_flush_running_cmds(struct MPT3SAS_ADAPTER *ioc)
3906 if (!scmd) 3911 if (!scmd)
3907 continue; 3912 continue;
3908 count++; 3913 count++;
3914 if (ata_12_16_cmd(scmd))
3915 scsi_internal_device_unblock(scmd->device,
3916 SDEV_RUNNING);
3909 mpt3sas_base_free_smid(ioc, smid); 3917 mpt3sas_base_free_smid(ioc, smid);
3910 scsi_dma_unmap(scmd); 3918 scsi_dma_unmap(scmd);
3911 if (ioc->pci_error_recovery) 3919 if (ioc->pci_error_recovery)
@@ -4010,8 +4018,6 @@ _scsih_eedp_error_handling(struct scsi_cmnd *scmd, u16 ioc_status)
4010 SAM_STAT_CHECK_CONDITION; 4018 SAM_STAT_CHECK_CONDITION;
4011} 4019}
4012 4020
4013
4014
4015/** 4021/**
4016 * scsih_qcmd - main scsi request entry point 4022 * scsih_qcmd - main scsi request entry point
4017 * @scmd: pointer to scsi command object 4023 * @scmd: pointer to scsi command object
@@ -4038,6 +4044,13 @@ scsih_qcmd(struct Scsi_Host *shost, struct scsi_cmnd *scmd)
4038 if (ioc->logging_level & MPT_DEBUG_SCSI) 4044 if (ioc->logging_level & MPT_DEBUG_SCSI)
4039 scsi_print_command(scmd); 4045 scsi_print_command(scmd);
4040 4046
4047 /*
4048 * Lock the device for any subsequent command until command is
4049 * done.
4050 */
4051 if (ata_12_16_cmd(scmd))
4052 scsi_internal_device_block(scmd->device);
4053
4041 sas_device_priv_data = scmd->device->hostdata; 4054 sas_device_priv_data = scmd->device->hostdata;
4042 if (!sas_device_priv_data || !sas_device_priv_data->sas_target) { 4055 if (!sas_device_priv_data || !sas_device_priv_data->sas_target) {
4043 scmd->result = DID_NO_CONNECT << 16; 4056 scmd->result = DID_NO_CONNECT << 16;
@@ -4613,6 +4626,9 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply)
4613 if (scmd == NULL) 4626 if (scmd == NULL)
4614 return 1; 4627 return 1;
4615 4628
4629 if (ata_12_16_cmd(scmd))
4630 scsi_internal_device_unblock(scmd->device, SDEV_RUNNING);
4631
4616 mpi_request = mpt3sas_base_get_msg_frame(ioc, smid); 4632 mpi_request = mpt3sas_base_get_msg_frame(ioc, smid);
4617 4633
4618 if (mpi_reply == NULL) { 4634 if (mpi_reply == NULL) {
diff --git a/drivers/scsi/mvsas/mv_sas.c b/drivers/scsi/mvsas/mv_sas.c
index 86eb19902bac..c7cc8035eacb 100644
--- a/drivers/scsi/mvsas/mv_sas.c
+++ b/drivers/scsi/mvsas/mv_sas.c
@@ -791,8 +791,10 @@ static int mvs_task_prep(struct sas_task *task, struct mvs_info *mvi, int is_tmf
791 slot->slot_tag = tag; 791 slot->slot_tag = tag;
792 792
793 slot->buf = pci_pool_alloc(mvi->dma_pool, GFP_ATOMIC, &slot->buf_dma); 793 slot->buf = pci_pool_alloc(mvi->dma_pool, GFP_ATOMIC, &slot->buf_dma);
794 if (!slot->buf) 794 if (!slot->buf) {
795 rc = -ENOMEM;
795 goto err_out_tag; 796 goto err_out_tag;
797 }
796 memset(slot->buf, 0, MVS_SLOT_BUF_SZ); 798 memset(slot->buf, 0, MVS_SLOT_BUF_SZ);
797 799
798 tei.task = task; 800 tei.task = task;
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index ace65db1d2a2..56d6142852a5 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -707,6 +707,11 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
707 srb_t *sp; 707 srb_t *sp;
708 int rval; 708 int rval;
709 709
710 if (unlikely(test_bit(UNLOADING, &base_vha->dpc_flags))) {
711 cmd->result = DID_NO_CONNECT << 16;
712 goto qc24_fail_command;
713 }
714
710 if (ha->flags.eeh_busy) { 715 if (ha->flags.eeh_busy) {
711 if (ha->flags.pci_channel_io_perm_failure) { 716 if (ha->flags.pci_channel_io_perm_failure) {
712 ql_dbg(ql_dbg_aer, vha, 0x9010, 717 ql_dbg(ql_dbg_aer, vha, 0x9010,
@@ -1451,6 +1456,20 @@ qla2x00_abort_all_cmds(scsi_qla_host_t *vha, int res)
1451 for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) { 1456 for (cnt = 1; cnt < req->num_outstanding_cmds; cnt++) {
1452 sp = req->outstanding_cmds[cnt]; 1457 sp = req->outstanding_cmds[cnt];
1453 if (sp) { 1458 if (sp) {
1459 /* Don't abort commands in adapter during EEH
1460 * recovery as it's not accessible/responding.
1461 */
1462 if (!ha->flags.eeh_busy) {
1463 /* Get a reference to the sp and drop the lock.
1464 * The reference ensures this sp->done() call
1465 * - and not the call in qla2xxx_eh_abort() -
1466 * ends the SCSI command (with result 'res').
1467 */
1468 sp_get(sp);
1469 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1470 qla2xxx_eh_abort(GET_CMD_SP(sp));
1471 spin_lock_irqsave(&ha->hardware_lock, flags);
1472 }
1454 req->outstanding_cmds[cnt] = NULL; 1473 req->outstanding_cmds[cnt] = NULL;
1455 sp->done(vha, sp, res); 1474 sp->done(vha, sp, res);
1456 } 1475 }
@@ -2341,6 +2360,8 @@ qla2xxx_scan_finished(struct Scsi_Host *shost, unsigned long time)
2341{ 2360{
2342 scsi_qla_host_t *vha = shost_priv(shost); 2361 scsi_qla_host_t *vha = shost_priv(shost);
2343 2362
2363 if (test_bit(UNLOADING, &vha->dpc_flags))
2364 return 1;
2344 if (!vha->host) 2365 if (!vha->host)
2345 return 1; 2366 return 1;
2346 if (time > vha->hw->loop_reset_delay * HZ) 2367 if (time > vha->hw->loop_reset_delay * HZ)
diff --git a/drivers/scsi/qlogicpti.h b/drivers/scsi/qlogicpti.h
index 4377e87ee79c..892a0b058b99 100644
--- a/drivers/scsi/qlogicpti.h
+++ b/drivers/scsi/qlogicpti.h
@@ -356,8 +356,8 @@ struct qlogicpti {
356 356
357 /* The rest of the elements are unimportant for performance. */ 357 /* The rest of the elements are unimportant for performance. */
358 struct qlogicpti *next; 358 struct qlogicpti *next;
359 __u32 res_dvma; /* Ptr to RESPONSE bufs (DVMA)*/ 359 dma_addr_t res_dvma; /* Ptr to RESPONSE bufs (DVMA)*/
360 __u32 req_dvma; /* Ptr to REQUEST bufs (DVMA) */ 360 dma_addr_t req_dvma; /* Ptr to REQUEST bufs (DVMA) */
361 u_char fware_majrev, fware_minrev, fware_micrev; 361 u_char fware_majrev, fware_minrev, fware_micrev;
362 struct Scsi_Host *qhost; 362 struct Scsi_Host *qhost;
363 int qpti_id; 363 int qpti_id;
diff --git a/drivers/scsi/vmw_pvscsi.c b/drivers/scsi/vmw_pvscsi.c
index 4a0d3cdc607c..15ca09cd16f3 100644
--- a/drivers/scsi/vmw_pvscsi.c
+++ b/drivers/scsi/vmw_pvscsi.c
@@ -793,6 +793,7 @@ static int pvscsi_abort(struct scsi_cmnd *cmd)
793 unsigned long flags; 793 unsigned long flags;
794 int result = SUCCESS; 794 int result = SUCCESS;
795 DECLARE_COMPLETION_ONSTACK(abort_cmp); 795 DECLARE_COMPLETION_ONSTACK(abort_cmp);
796 int done;
796 797
797 scmd_printk(KERN_DEBUG, cmd, "task abort on host %u, %p\n", 798 scmd_printk(KERN_DEBUG, cmd, "task abort on host %u, %p\n",
798 adapter->host->host_no, cmd); 799 adapter->host->host_no, cmd);
@@ -824,10 +825,10 @@ static int pvscsi_abort(struct scsi_cmnd *cmd)
824 pvscsi_abort_cmd(adapter, ctx); 825 pvscsi_abort_cmd(adapter, ctx);
825 spin_unlock_irqrestore(&adapter->hw_lock, flags); 826 spin_unlock_irqrestore(&adapter->hw_lock, flags);
826 /* Wait for 2 secs for the completion. */ 827 /* Wait for 2 secs for the completion. */
827 wait_for_completion_timeout(&abort_cmp, msecs_to_jiffies(2000)); 828 done = wait_for_completion_timeout(&abort_cmp, msecs_to_jiffies(2000));
828 spin_lock_irqsave(&adapter->hw_lock, flags); 829 spin_lock_irqsave(&adapter->hw_lock, flags);
829 830
830 if (!completion_done(&abort_cmp)) { 831 if (!done) {
831 /* 832 /*
832 * Failed to abort the command, unmark the fact that it 833 * Failed to abort the command, unmark the fact that it
833 * was requested to be aborted. 834 * was requested to be aborted.
diff --git a/drivers/scsi/vmw_pvscsi.h b/drivers/scsi/vmw_pvscsi.h
index c097d2ccbde3..d41292ef85f2 100644
--- a/drivers/scsi/vmw_pvscsi.h
+++ b/drivers/scsi/vmw_pvscsi.h
@@ -26,7 +26,7 @@
26 26
27#include <linux/types.h> 27#include <linux/types.h>
28 28
29#define PVSCSI_DRIVER_VERSION_STRING "1.0.6.0-k" 29#define PVSCSI_DRIVER_VERSION_STRING "1.0.7.0-k"
30 30
31#define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128 31#define PVSCSI_MAX_NUM_SG_ENTRIES_PER_SEGMENT 128
32 32
diff --git a/drivers/staging/comedi/drivers/ni_tio.c b/drivers/staging/comedi/drivers/ni_tio.c
index 7043eb0543f6..5ab49a798164 100644
--- a/drivers/staging/comedi/drivers/ni_tio.c
+++ b/drivers/staging/comedi/drivers/ni_tio.c
@@ -207,7 +207,8 @@ static int ni_tio_clock_period_ps(const struct ni_gpct *counter,
207 * clock period is specified by user with prescaling 207 * clock period is specified by user with prescaling
208 * already taken into account. 208 * already taken into account.
209 */ 209 */
210 return counter->clock_period_ps; 210 *period_ps = counter->clock_period_ps;
211 return 0;
211 } 212 }
212 213
213 switch (generic_clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) { 214 switch (generic_clock_source & NI_GPCT_PRESCALE_MODE_CLOCK_SRC_MASK) {
diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c
index 34307ac3f255..d33d6fe078ad 100644
--- a/drivers/staging/greybus/arche-platform.c
+++ b/drivers/staging/greybus/arche-platform.c
@@ -186,6 +186,7 @@ int arche_platform_change_state(enum arche_platform_state state,
186exit: 186exit:
187 spin_unlock_irqrestore(&arche_pdata->wake_lock, flags); 187 spin_unlock_irqrestore(&arche_pdata->wake_lock, flags);
188 mutex_unlock(&arche_pdata->platform_state_mutex); 188 mutex_unlock(&arche_pdata->platform_state_mutex);
189 put_device(&pdev->dev);
189 of_node_put(np); 190 of_node_put(np);
190 return ret; 191 return ret;
191} 192}
diff --git a/drivers/staging/iio/impedance-analyzer/ad5933.c b/drivers/staging/iio/impedance-analyzer/ad5933.c
index 5eecf1cb1028..3892a7470410 100644
--- a/drivers/staging/iio/impedance-analyzer/ad5933.c
+++ b/drivers/staging/iio/impedance-analyzer/ad5933.c
@@ -655,6 +655,7 @@ static void ad5933_work(struct work_struct *work)
655 __be16 buf[2]; 655 __be16 buf[2];
656 int val[2]; 656 int val[2];
657 unsigned char status; 657 unsigned char status;
658 int ret;
658 659
659 mutex_lock(&indio_dev->mlock); 660 mutex_lock(&indio_dev->mlock);
660 if (st->state == AD5933_CTRL_INIT_START_FREQ) { 661 if (st->state == AD5933_CTRL_INIT_START_FREQ) {
@@ -662,19 +663,22 @@ static void ad5933_work(struct work_struct *work)
662 ad5933_cmd(st, AD5933_CTRL_START_SWEEP); 663 ad5933_cmd(st, AD5933_CTRL_START_SWEEP);
663 st->state = AD5933_CTRL_START_SWEEP; 664 st->state = AD5933_CTRL_START_SWEEP;
664 schedule_delayed_work(&st->work, st->poll_time_jiffies); 665 schedule_delayed_work(&st->work, st->poll_time_jiffies);
665 mutex_unlock(&indio_dev->mlock); 666 goto out;
666 return;
667 } 667 }
668 668
669 ad5933_i2c_read(st->client, AD5933_REG_STATUS, 1, &status); 669 ret = ad5933_i2c_read(st->client, AD5933_REG_STATUS, 1, &status);
670 if (ret)
671 goto out;
670 672
671 if (status & AD5933_STAT_DATA_VALID) { 673 if (status & AD5933_STAT_DATA_VALID) {
672 int scan_count = bitmap_weight(indio_dev->active_scan_mask, 674 int scan_count = bitmap_weight(indio_dev->active_scan_mask,
673 indio_dev->masklength); 675 indio_dev->masklength);
674 ad5933_i2c_read(st->client, 676 ret = ad5933_i2c_read(st->client,
675 test_bit(1, indio_dev->active_scan_mask) ? 677 test_bit(1, indio_dev->active_scan_mask) ?
676 AD5933_REG_REAL_DATA : AD5933_REG_IMAG_DATA, 678 AD5933_REG_REAL_DATA : AD5933_REG_IMAG_DATA,
677 scan_count * 2, (u8 *)buf); 679 scan_count * 2, (u8 *)buf);
680 if (ret)
681 goto out;
678 682
679 if (scan_count == 2) { 683 if (scan_count == 2) {
680 val[0] = be16_to_cpu(buf[0]); 684 val[0] = be16_to_cpu(buf[0]);
@@ -686,8 +690,7 @@ static void ad5933_work(struct work_struct *work)
686 } else { 690 } else {
687 /* no data available - try again later */ 691 /* no data available - try again later */
688 schedule_delayed_work(&st->work, st->poll_time_jiffies); 692 schedule_delayed_work(&st->work, st->poll_time_jiffies);
689 mutex_unlock(&indio_dev->mlock); 693 goto out;
690 return;
691 } 694 }
692 695
693 if (status & AD5933_STAT_SWEEP_DONE) { 696 if (status & AD5933_STAT_SWEEP_DONE) {
@@ -700,7 +703,7 @@ static void ad5933_work(struct work_struct *work)
700 ad5933_cmd(st, AD5933_CTRL_INC_FREQ); 703 ad5933_cmd(st, AD5933_CTRL_INC_FREQ);
701 schedule_delayed_work(&st->work, st->poll_time_jiffies); 704 schedule_delayed_work(&st->work, st->poll_time_jiffies);
702 } 705 }
703 706out:
704 mutex_unlock(&indio_dev->mlock); 707 mutex_unlock(&indio_dev->mlock);
705} 708}
706 709
diff --git a/drivers/staging/nvec/nvec_ps2.c b/drivers/staging/nvec/nvec_ps2.c
index a324322ee0ad..499952c8ef39 100644
--- a/drivers/staging/nvec/nvec_ps2.c
+++ b/drivers/staging/nvec/nvec_ps2.c
@@ -106,13 +106,12 @@ static int nvec_mouse_probe(struct platform_device *pdev)
106{ 106{
107 struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent); 107 struct nvec_chip *nvec = dev_get_drvdata(pdev->dev.parent);
108 struct serio *ser_dev; 108 struct serio *ser_dev;
109 char mouse_reset[] = { NVEC_PS2, SEND_COMMAND, PSMOUSE_RST, 3 };
110 109
111 ser_dev = devm_kzalloc(&pdev->dev, sizeof(struct serio), GFP_KERNEL); 110 ser_dev = kzalloc(sizeof(struct serio), GFP_KERNEL);
112 if (!ser_dev) 111 if (!ser_dev)
113 return -ENOMEM; 112 return -ENOMEM;
114 113
115 ser_dev->id.type = SERIO_PS_PSTHRU; 114 ser_dev->id.type = SERIO_8042;
116 ser_dev->write = ps2_sendcommand; 115 ser_dev->write = ps2_sendcommand;
117 ser_dev->start = ps2_startstreaming; 116 ser_dev->start = ps2_startstreaming;
118 ser_dev->stop = ps2_stopstreaming; 117 ser_dev->stop = ps2_stopstreaming;
@@ -127,9 +126,6 @@ static int nvec_mouse_probe(struct platform_device *pdev)
127 126
128 serio_register_port(ser_dev); 127 serio_register_port(ser_dev);
129 128
130 /* mouse reset */
131 nvec_write_async(nvec, mouse_reset, sizeof(mouse_reset));
132
133 return 0; 129 return 0;
134} 130}
135 131
diff --git a/drivers/staging/sm750fb/ddk750_reg.h b/drivers/staging/sm750fb/ddk750_reg.h
index 955247979aaa..4ed6d8d7712a 100644
--- a/drivers/staging/sm750fb/ddk750_reg.h
+++ b/drivers/staging/sm750fb/ddk750_reg.h
@@ -601,13 +601,13 @@
601 601
602#define PANEL_PLANE_TL 0x08001C 602#define PANEL_PLANE_TL 0x08001C
603#define PANEL_PLANE_TL_TOP_SHIFT 16 603#define PANEL_PLANE_TL_TOP_SHIFT 16
604#define PANEL_PLANE_TL_TOP_MASK (0xeff << 16) 604#define PANEL_PLANE_TL_TOP_MASK (0x7ff << 16)
605#define PANEL_PLANE_TL_LEFT_MASK 0xeff 605#define PANEL_PLANE_TL_LEFT_MASK 0x7ff
606 606
607#define PANEL_PLANE_BR 0x080020 607#define PANEL_PLANE_BR 0x080020
608#define PANEL_PLANE_BR_BOTTOM_SHIFT 16 608#define PANEL_PLANE_BR_BOTTOM_SHIFT 16
609#define PANEL_PLANE_BR_BOTTOM_MASK (0xeff << 16) 609#define PANEL_PLANE_BR_BOTTOM_MASK (0x7ff << 16)
610#define PANEL_PLANE_BR_RIGHT_MASK 0xeff 610#define PANEL_PLANE_BR_RIGHT_MASK 0x7ff
611 611
612#define PANEL_HORIZONTAL_TOTAL 0x080024 612#define PANEL_HORIZONTAL_TOTAL 0x080024
613#define PANEL_HORIZONTAL_TOTAL_TOTAL_SHIFT 16 613#define PANEL_HORIZONTAL_TOTAL_TOTAL_SHIFT 16
diff --git a/drivers/thermal/intel_powerclamp.c b/drivers/thermal/intel_powerclamp.c
index 7a223074df3d..afada655f861 100644
--- a/drivers/thermal/intel_powerclamp.c
+++ b/drivers/thermal/intel_powerclamp.c
@@ -669,9 +669,16 @@ static struct thermal_cooling_device_ops powerclamp_cooling_ops = {
669 .set_cur_state = powerclamp_set_cur_state, 669 .set_cur_state = powerclamp_set_cur_state,
670}; 670};
671 671
672static const struct x86_cpu_id __initconst intel_powerclamp_ids[] = {
673 { X86_VENDOR_INTEL, X86_FAMILY_ANY, X86_MODEL_ANY, X86_FEATURE_MWAIT },
674 {}
675};
676MODULE_DEVICE_TABLE(x86cpu, intel_powerclamp_ids);
677
672static int __init powerclamp_probe(void) 678static int __init powerclamp_probe(void)
673{ 679{
674 if (!boot_cpu_has(X86_FEATURE_MWAIT)) { 680
681 if (!x86_match_cpu(intel_powerclamp_ids)) {
675 pr_err("CPU does not support MWAIT"); 682 pr_err("CPU does not support MWAIT");
676 return -ENODEV; 683 return -ENODEV;
677 } 684 }
diff --git a/drivers/usb/chipidea/core.c b/drivers/usb/chipidea/core.c
index 69426e644d17..3dbb4a21ab44 100644
--- a/drivers/usb/chipidea/core.c
+++ b/drivers/usb/chipidea/core.c
@@ -914,6 +914,7 @@ static int ci_hdrc_probe(struct platform_device *pdev)
914 if (!ci) 914 if (!ci)
915 return -ENOMEM; 915 return -ENOMEM;
916 916
917 spin_lock_init(&ci->lock);
917 ci->dev = dev; 918 ci->dev = dev;
918 ci->platdata = dev_get_platdata(dev); 919 ci->platdata = dev_get_platdata(dev);
919 ci->imx28_write_fix = !!(ci->platdata->flags & 920 ci->imx28_write_fix = !!(ci->platdata->flags &
diff --git a/drivers/usb/chipidea/udc.c b/drivers/usb/chipidea/udc.c
index 661f43fe0f9e..c9e80ad48fdc 100644
--- a/drivers/usb/chipidea/udc.c
+++ b/drivers/usb/chipidea/udc.c
@@ -1889,8 +1889,6 @@ static int udc_start(struct ci_hdrc *ci)
1889 struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps; 1889 struct usb_otg_caps *otg_caps = &ci->platdata->ci_otg_caps;
1890 int retval = 0; 1890 int retval = 0;
1891 1891
1892 spin_lock_init(&ci->lock);
1893
1894 ci->gadget.ops = &usb_gadget_ops; 1892 ci->gadget.ops = &usb_gadget_ops;
1895 ci->gadget.speed = USB_SPEED_UNKNOWN; 1893 ci->gadget.speed = USB_SPEED_UNKNOWN;
1896 ci->gadget.max_speed = USB_SPEED_HIGH; 1894 ci->gadget.max_speed = USB_SPEED_HIGH;
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
index 78f0f85bebdc..fada988512a1 100644
--- a/drivers/usb/class/cdc-acm.c
+++ b/drivers/usb/class/cdc-acm.c
@@ -932,8 +932,6 @@ static int wait_serial_change(struct acm *acm, unsigned long arg)
932 DECLARE_WAITQUEUE(wait, current); 932 DECLARE_WAITQUEUE(wait, current);
933 struct async_icount old, new; 933 struct async_icount old, new;
934 934
935 if (arg & (TIOCM_DSR | TIOCM_RI | TIOCM_CD))
936 return -EINVAL;
937 do { 935 do {
938 spin_lock_irq(&acm->read_lock); 936 spin_lock_irq(&acm->read_lock);
939 old = acm->oldcount; 937 old = acm->oldcount;
@@ -1161,6 +1159,8 @@ static int acm_probe(struct usb_interface *intf,
1161 if (quirks == IGNORE_DEVICE) 1159 if (quirks == IGNORE_DEVICE)
1162 return -ENODEV; 1160 return -ENODEV;
1163 1161
1162 memset(&h, 0x00, sizeof(struct usb_cdc_parsed_header));
1163
1164 num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR; 1164 num_rx_buf = (quirks == SINGLE_RX_URB) ? 1 : ACM_NR;
1165 1165
1166 /* handle quirks deadly to normal probing*/ 1166 /* handle quirks deadly to normal probing*/
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 7287a763cd0c..fea446900cad 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -769,15 +769,14 @@ static int dwc3_core_init(struct dwc3 *dwc)
769 return 0; 769 return 0;
770 770
771err4: 771err4:
772 phy_power_off(dwc->usb2_generic_phy); 772 phy_power_off(dwc->usb3_generic_phy);
773 773
774err3: 774err3:
775 phy_power_off(dwc->usb3_generic_phy); 775 phy_power_off(dwc->usb2_generic_phy);
776 776
777err2: 777err2:
778 usb_phy_set_suspend(dwc->usb2_phy, 1); 778 usb_phy_set_suspend(dwc->usb2_phy, 1);
779 usb_phy_set_suspend(dwc->usb3_phy, 1); 779 usb_phy_set_suspend(dwc->usb3_phy, 1);
780 dwc3_core_exit(dwc);
781 780
782err1: 781err1:
783 usb_phy_shutdown(dwc->usb2_phy); 782 usb_phy_shutdown(dwc->usb2_phy);
diff --git a/drivers/usb/dwc3/dwc3-st.c b/drivers/usb/dwc3/dwc3-st.c
index 89a2f712fdfe..aaaf256f71dd 100644
--- a/drivers/usb/dwc3/dwc3-st.c
+++ b/drivers/usb/dwc3/dwc3-st.c
@@ -31,6 +31,7 @@
31#include <linux/slab.h> 31#include <linux/slab.h>
32#include <linux/regmap.h> 32#include <linux/regmap.h>
33#include <linux/reset.h> 33#include <linux/reset.h>
34#include <linux/pinctrl/consumer.h>
34#include <linux/usb/of.h> 35#include <linux/usb/of.h>
35 36
36#include "core.h" 37#include "core.h"
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index e40d47d47d82..17989b72cdae 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -3225,11 +3225,11 @@ static bool ffs_func_req_match(struct usb_function *f,
3225 3225
3226 switch (creq->bRequestType & USB_RECIP_MASK) { 3226 switch (creq->bRequestType & USB_RECIP_MASK) {
3227 case USB_RECIP_INTERFACE: 3227 case USB_RECIP_INTERFACE:
3228 return ffs_func_revmap_intf(func, 3228 return (ffs_func_revmap_intf(func,
3229 le16_to_cpu(creq->wIndex) >= 0); 3229 le16_to_cpu(creq->wIndex)) >= 0);
3230 case USB_RECIP_ENDPOINT: 3230 case USB_RECIP_ENDPOINT:
3231 return ffs_func_revmap_ep(func, 3231 return (ffs_func_revmap_ep(func,
3232 le16_to_cpu(creq->wIndex) >= 0); 3232 le16_to_cpu(creq->wIndex)) >= 0);
3233 default: 3233 default:
3234 return (bool) (func->ffs->user_flags & 3234 return (bool) (func->ffs->user_flags &
3235 FUNCTIONFS_ALL_CTRL_RECIP); 3235 FUNCTIONFS_ALL_CTRL_RECIP);
diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c
index fe1811650dbc..5d1bd13a56c1 100644
--- a/drivers/usb/gadget/function/u_ether.c
+++ b/drivers/usb/gadget/function/u_ether.c
@@ -588,14 +588,6 @@ static netdev_tx_t eth_start_xmit(struct sk_buff *skb,
588 588
589 req->length = length; 589 req->length = length;
590 590
591 /* throttle high/super speed IRQ rate back slightly */
592 if (gadget_is_dualspeed(dev->gadget))
593 req->no_interrupt = (((dev->gadget->speed == USB_SPEED_HIGH ||
594 dev->gadget->speed == USB_SPEED_SUPER)) &&
595 !list_empty(&dev->tx_reqs))
596 ? ((atomic_read(&dev->tx_qlen) % dev->qmult) != 0)
597 : 0;
598
599 retval = usb_ep_queue(in, req, GFP_ATOMIC); 591 retval = usb_ep_queue(in, req, GFP_ATOMIC);
600 switch (retval) { 592 switch (retval) {
601 default: 593 default:
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c
index d793f548dfe2..a9a1e4c40480 100644
--- a/drivers/usb/host/pci-quirks.c
+++ b/drivers/usb/host/pci-quirks.c
@@ -995,6 +995,14 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev)
995 } 995 }
996 val = readl(base + ext_cap_offset); 996 val = readl(base + ext_cap_offset);
997 997
998 /* Auto handoff never worked for these devices. Force it and continue */
999 if ((pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241) ||
1000 (pdev->vendor == PCI_VENDOR_ID_RENESAS
1001 && pdev->device == 0x0014)) {
1002 val = (val | XHCI_HC_OS_OWNED) & ~XHCI_HC_BIOS_OWNED;
1003 writel(val, base + ext_cap_offset);
1004 }
1005
998 /* If the BIOS owns the HC, signal that the OS wants it, and wait */ 1006 /* If the BIOS owns the HC, signal that the OS wants it, and wait */
999 if (val & XHCI_HC_BIOS_OWNED) { 1007 if (val & XHCI_HC_BIOS_OWNED) {
1000 writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset); 1008 writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset);
diff --git a/drivers/usb/musb/da8xx.c b/drivers/usb/musb/da8xx.c
index 210b7e43a6fd..2440f88e07a3 100644
--- a/drivers/usb/musb/da8xx.c
+++ b/drivers/usb/musb/da8xx.c
@@ -479,7 +479,8 @@ static int da8xx_probe(struct platform_device *pdev)
479 479
480 glue->phy = devm_phy_get(&pdev->dev, "usb-phy"); 480 glue->phy = devm_phy_get(&pdev->dev, "usb-phy");
481 if (IS_ERR(glue->phy)) { 481 if (IS_ERR(glue->phy)) {
482 dev_err(&pdev->dev, "failed to get phy\n"); 482 if (PTR_ERR(glue->phy) != -EPROBE_DEFER)
483 dev_err(&pdev->dev, "failed to get phy\n");
483 return PTR_ERR(glue->phy); 484 return PTR_ERR(glue->phy);
484 } 485 }
485 486
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
index 27dadc0d9114..c3e172e15ec3 100644
--- a/drivers/usb/musb/musb_core.c
+++ b/drivers/usb/musb/musb_core.c
@@ -986,7 +986,7 @@ b_host:
986 } 986 }
987#endif 987#endif
988 988
989 schedule_work(&musb->irq_work); 989 schedule_delayed_work(&musb->irq_work, 0);
990 990
991 return handled; 991 return handled;
992} 992}
@@ -1855,14 +1855,23 @@ static void musb_pm_runtime_check_session(struct musb *musb)
1855 MUSB_DEVCTL_HR; 1855 MUSB_DEVCTL_HR;
1856 switch (devctl & ~s) { 1856 switch (devctl & ~s) {
1857 case MUSB_QUIRK_B_INVALID_VBUS_91: 1857 case MUSB_QUIRK_B_INVALID_VBUS_91:
1858 if (!musb->session && !musb->quirk_invalid_vbus) { 1858 if (musb->quirk_retries--) {
1859 musb->quirk_invalid_vbus = true;
1860 musb_dbg(musb, 1859 musb_dbg(musb,
1861 "First invalid vbus, assume no session"); 1860 "Poll devctl on invalid vbus, assume no session");
1861 schedule_delayed_work(&musb->irq_work,
1862 msecs_to_jiffies(1000));
1863
1862 return; 1864 return;
1863 } 1865 }
1864 break;
1865 case MUSB_QUIRK_A_DISCONNECT_19: 1866 case MUSB_QUIRK_A_DISCONNECT_19:
1867 if (musb->quirk_retries--) {
1868 musb_dbg(musb,
1869 "Poll devctl on possible host mode disconnect");
1870 schedule_delayed_work(&musb->irq_work,
1871 msecs_to_jiffies(1000));
1872
1873 return;
1874 }
1866 if (!musb->session) 1875 if (!musb->session)
1867 break; 1876 break;
1868 musb_dbg(musb, "Allow PM on possible host mode disconnect"); 1877 musb_dbg(musb, "Allow PM on possible host mode disconnect");
@@ -1886,9 +1895,9 @@ static void musb_pm_runtime_check_session(struct musb *musb)
1886 if (error < 0) 1895 if (error < 0)
1887 dev_err(musb->controller, "Could not enable: %i\n", 1896 dev_err(musb->controller, "Could not enable: %i\n",
1888 error); 1897 error);
1898 musb->quirk_retries = 3;
1889 } else { 1899 } else {
1890 musb_dbg(musb, "Allow PM with no session: %02x", devctl); 1900 musb_dbg(musb, "Allow PM with no session: %02x", devctl);
1891 musb->quirk_invalid_vbus = false;
1892 pm_runtime_mark_last_busy(musb->controller); 1901 pm_runtime_mark_last_busy(musb->controller);
1893 pm_runtime_put_autosuspend(musb->controller); 1902 pm_runtime_put_autosuspend(musb->controller);
1894 } 1903 }
@@ -1899,7 +1908,7 @@ static void musb_pm_runtime_check_session(struct musb *musb)
1899/* Only used to provide driver mode change events */ 1908/* Only used to provide driver mode change events */
1900static void musb_irq_work(struct work_struct *data) 1909static void musb_irq_work(struct work_struct *data)
1901{ 1910{
1902 struct musb *musb = container_of(data, struct musb, irq_work); 1911 struct musb *musb = container_of(data, struct musb, irq_work.work);
1903 1912
1904 musb_pm_runtime_check_session(musb); 1913 musb_pm_runtime_check_session(musb);
1905 1914
@@ -1969,6 +1978,7 @@ static struct musb *allocate_instance(struct device *dev,
1969 INIT_LIST_HEAD(&musb->control); 1978 INIT_LIST_HEAD(&musb->control);
1970 INIT_LIST_HEAD(&musb->in_bulk); 1979 INIT_LIST_HEAD(&musb->in_bulk);
1971 INIT_LIST_HEAD(&musb->out_bulk); 1980 INIT_LIST_HEAD(&musb->out_bulk);
1981 INIT_LIST_HEAD(&musb->pending_list);
1972 1982
1973 musb->vbuserr_retry = VBUSERR_RETRY_COUNT; 1983 musb->vbuserr_retry = VBUSERR_RETRY_COUNT;
1974 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON; 1984 musb->a_wait_bcon = OTG_TIME_A_WAIT_BCON;
@@ -2018,6 +2028,84 @@ static void musb_free(struct musb *musb)
2018 musb_host_free(musb); 2028 musb_host_free(musb);
2019} 2029}
2020 2030
2031struct musb_pending_work {
2032 int (*callback)(struct musb *musb, void *data);
2033 void *data;
2034 struct list_head node;
2035};
2036
2037/*
2038 * Called from musb_runtime_resume(), musb_resume(), and
2039 * musb_queue_resume_work(). Callers must take musb->lock.
2040 */
2041static int musb_run_resume_work(struct musb *musb)
2042{
2043 struct musb_pending_work *w, *_w;
2044 unsigned long flags;
2045 int error = 0;
2046
2047 spin_lock_irqsave(&musb->list_lock, flags);
2048 list_for_each_entry_safe(w, _w, &musb->pending_list, node) {
2049 if (w->callback) {
2050 error = w->callback(musb, w->data);
2051 if (error < 0) {
2052 dev_err(musb->controller,
2053 "resume callback %p failed: %i\n",
2054 w->callback, error);
2055 }
2056 }
2057 list_del(&w->node);
2058 devm_kfree(musb->controller, w);
2059 }
2060 spin_unlock_irqrestore(&musb->list_lock, flags);
2061
2062 return error;
2063}
2064
2065/*
2066 * Called to run work if device is active or else queue the work to happen
2067 * on resume. Caller must take musb->lock and must hold an RPM reference.
2068 *
2069 * Note that we cowardly refuse queuing work after musb PM runtime
2070 * resume is done calling musb_run_resume_work() and return -EINPROGRESS
2071 * instead.
2072 */
2073int musb_queue_resume_work(struct musb *musb,
2074 int (*callback)(struct musb *musb, void *data),
2075 void *data)
2076{
2077 struct musb_pending_work *w;
2078 unsigned long flags;
2079 int error;
2080
2081 if (WARN_ON(!callback))
2082 return -EINVAL;
2083
2084 if (pm_runtime_active(musb->controller))
2085 return callback(musb, data);
2086
2087 w = devm_kzalloc(musb->controller, sizeof(*w), GFP_ATOMIC);
2088 if (!w)
2089 return -ENOMEM;
2090
2091 w->callback = callback;
2092 w->data = data;
2093 spin_lock_irqsave(&musb->list_lock, flags);
2094 if (musb->is_runtime_suspended) {
2095 list_add_tail(&w->node, &musb->pending_list);
2096 error = 0;
2097 } else {
2098 dev_err(musb->controller, "could not add resume work %p\n",
2099 callback);
2100 devm_kfree(musb->controller, w);
2101 error = -EINPROGRESS;
2102 }
2103 spin_unlock_irqrestore(&musb->list_lock, flags);
2104
2105 return error;
2106}
2107EXPORT_SYMBOL_GPL(musb_queue_resume_work);
2108
2021static void musb_deassert_reset(struct work_struct *work) 2109static void musb_deassert_reset(struct work_struct *work)
2022{ 2110{
2023 struct musb *musb; 2111 struct musb *musb;
@@ -2065,6 +2153,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2065 } 2153 }
2066 2154
2067 spin_lock_init(&musb->lock); 2155 spin_lock_init(&musb->lock);
2156 spin_lock_init(&musb->list_lock);
2068 musb->board_set_power = plat->set_power; 2157 musb->board_set_power = plat->set_power;
2069 musb->min_power = plat->min_power; 2158 musb->min_power = plat->min_power;
2070 musb->ops = plat->platform_ops; 2159 musb->ops = plat->platform_ops;
@@ -2114,11 +2203,6 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2114 musb->io.ep_offset = musb_flat_ep_offset; 2203 musb->io.ep_offset = musb_flat_ep_offset;
2115 musb->io.ep_select = musb_flat_ep_select; 2204 musb->io.ep_select = musb_flat_ep_select;
2116 } 2205 }
2117 /* And override them with platform specific ops if specified. */
2118 if (musb->ops->ep_offset)
2119 musb->io.ep_offset = musb->ops->ep_offset;
2120 if (musb->ops->ep_select)
2121 musb->io.ep_select = musb->ops->ep_select;
2122 2206
2123 /* At least tusb6010 has its own offsets */ 2207 /* At least tusb6010 has its own offsets */
2124 if (musb->ops->ep_offset) 2208 if (musb->ops->ep_offset)
@@ -2213,7 +2297,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2213 musb_generic_disable(musb); 2297 musb_generic_disable(musb);
2214 2298
2215 /* Init IRQ workqueue before request_irq */ 2299 /* Init IRQ workqueue before request_irq */
2216 INIT_WORK(&musb->irq_work, musb_irq_work); 2300 INIT_DELAYED_WORK(&musb->irq_work, musb_irq_work);
2217 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset); 2301 INIT_DELAYED_WORK(&musb->deassert_reset_work, musb_deassert_reset);
2218 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume); 2302 INIT_DELAYED_WORK(&musb->finish_resume_work, musb_host_finish_resume);
2219 2303
@@ -2296,6 +2380,7 @@ musb_init_controller(struct device *dev, int nIrq, void __iomem *ctrl)
2296 if (status) 2380 if (status)
2297 goto fail5; 2381 goto fail5;
2298 2382
2383 musb->is_initialized = 1;
2299 pm_runtime_mark_last_busy(musb->controller); 2384 pm_runtime_mark_last_busy(musb->controller);
2300 pm_runtime_put_autosuspend(musb->controller); 2385 pm_runtime_put_autosuspend(musb->controller);
2301 2386
@@ -2309,7 +2394,7 @@ fail4:
2309 musb_host_cleanup(musb); 2394 musb_host_cleanup(musb);
2310 2395
2311fail3: 2396fail3:
2312 cancel_work_sync(&musb->irq_work); 2397 cancel_delayed_work_sync(&musb->irq_work);
2313 cancel_delayed_work_sync(&musb->finish_resume_work); 2398 cancel_delayed_work_sync(&musb->finish_resume_work);
2314 cancel_delayed_work_sync(&musb->deassert_reset_work); 2399 cancel_delayed_work_sync(&musb->deassert_reset_work);
2315 if (musb->dma_controller) 2400 if (musb->dma_controller)
@@ -2376,7 +2461,7 @@ static int musb_remove(struct platform_device *pdev)
2376 */ 2461 */
2377 musb_exit_debugfs(musb); 2462 musb_exit_debugfs(musb);
2378 2463
2379 cancel_work_sync(&musb->irq_work); 2464 cancel_delayed_work_sync(&musb->irq_work);
2380 cancel_delayed_work_sync(&musb->finish_resume_work); 2465 cancel_delayed_work_sync(&musb->finish_resume_work);
2381 cancel_delayed_work_sync(&musb->deassert_reset_work); 2466 cancel_delayed_work_sync(&musb->deassert_reset_work);
2382 pm_runtime_get_sync(musb->controller); 2467 pm_runtime_get_sync(musb->controller);
@@ -2562,6 +2647,7 @@ static int musb_suspend(struct device *dev)
2562 2647
2563 musb_platform_disable(musb); 2648 musb_platform_disable(musb);
2564 musb_generic_disable(musb); 2649 musb_generic_disable(musb);
2650 WARN_ON(!list_empty(&musb->pending_list));
2565 2651
2566 spin_lock_irqsave(&musb->lock, flags); 2652 spin_lock_irqsave(&musb->lock, flags);
2567 2653
@@ -2583,9 +2669,11 @@ static int musb_suspend(struct device *dev)
2583 2669
2584static int musb_resume(struct device *dev) 2670static int musb_resume(struct device *dev)
2585{ 2671{
2586 struct musb *musb = dev_to_musb(dev); 2672 struct musb *musb = dev_to_musb(dev);
2587 u8 devctl; 2673 unsigned long flags;
2588 u8 mask; 2674 int error;
2675 u8 devctl;
2676 u8 mask;
2589 2677
2590 /* 2678 /*
2591 * For static cmos like DaVinci, register values were preserved 2679 * For static cmos like DaVinci, register values were preserved
@@ -2619,6 +2707,13 @@ static int musb_resume(struct device *dev)
2619 2707
2620 musb_start(musb); 2708 musb_start(musb);
2621 2709
2710 spin_lock_irqsave(&musb->lock, flags);
2711 error = musb_run_resume_work(musb);
2712 if (error)
2713 dev_err(musb->controller, "resume work failed with %i\n",
2714 error);
2715 spin_unlock_irqrestore(&musb->lock, flags);
2716
2622 return 0; 2717 return 0;
2623} 2718}
2624 2719
@@ -2627,14 +2722,16 @@ static int musb_runtime_suspend(struct device *dev)
2627 struct musb *musb = dev_to_musb(dev); 2722 struct musb *musb = dev_to_musb(dev);
2628 2723
2629 musb_save_context(musb); 2724 musb_save_context(musb);
2725 musb->is_runtime_suspended = 1;
2630 2726
2631 return 0; 2727 return 0;
2632} 2728}
2633 2729
2634static int musb_runtime_resume(struct device *dev) 2730static int musb_runtime_resume(struct device *dev)
2635{ 2731{
2636 struct musb *musb = dev_to_musb(dev); 2732 struct musb *musb = dev_to_musb(dev);
2637 static int first = 1; 2733 unsigned long flags;
2734 int error;
2638 2735
2639 /* 2736 /*
2640 * When pm_runtime_get_sync called for the first time in driver 2737 * When pm_runtime_get_sync called for the first time in driver
@@ -2645,9 +2742,10 @@ static int musb_runtime_resume(struct device *dev)
2645 * Also context restore without save does not make 2742 * Also context restore without save does not make
2646 * any sense 2743 * any sense
2647 */ 2744 */
2648 if (!first) 2745 if (!musb->is_initialized)
2649 musb_restore_context(musb); 2746 return 0;
2650 first = 0; 2747
2748 musb_restore_context(musb);
2651 2749
2652 if (musb->need_finish_resume) { 2750 if (musb->need_finish_resume) {
2653 musb->need_finish_resume = 0; 2751 musb->need_finish_resume = 0;
@@ -2655,6 +2753,14 @@ static int musb_runtime_resume(struct device *dev)
2655 msecs_to_jiffies(USB_RESUME_TIMEOUT)); 2753 msecs_to_jiffies(USB_RESUME_TIMEOUT));
2656 } 2754 }
2657 2755
2756 spin_lock_irqsave(&musb->lock, flags);
2757 error = musb_run_resume_work(musb);
2758 if (error)
2759 dev_err(musb->controller, "resume work failed with %i\n",
2760 error);
2761 musb->is_runtime_suspended = 0;
2762 spin_unlock_irqrestore(&musb->lock, flags);
2763
2658 return 0; 2764 return 0;
2659} 2765}
2660 2766
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h
index 2cb88a498f8a..91817d77d59c 100644
--- a/drivers/usb/musb/musb_core.h
+++ b/drivers/usb/musb/musb_core.h
@@ -303,13 +303,14 @@ struct musb_context_registers {
303struct musb { 303struct musb {
304 /* device lock */ 304 /* device lock */
305 spinlock_t lock; 305 spinlock_t lock;
306 spinlock_t list_lock; /* resume work list lock */
306 307
307 struct musb_io io; 308 struct musb_io io;
308 const struct musb_platform_ops *ops; 309 const struct musb_platform_ops *ops;
309 struct musb_context_registers context; 310 struct musb_context_registers context;
310 311
311 irqreturn_t (*isr)(int, void *); 312 irqreturn_t (*isr)(int, void *);
312 struct work_struct irq_work; 313 struct delayed_work irq_work;
313 struct delayed_work deassert_reset_work; 314 struct delayed_work deassert_reset_work;
314 struct delayed_work finish_resume_work; 315 struct delayed_work finish_resume_work;
315 struct delayed_work gadget_work; 316 struct delayed_work gadget_work;
@@ -337,6 +338,7 @@ struct musb {
337 struct list_head control; /* of musb_qh */ 338 struct list_head control; /* of musb_qh */
338 struct list_head in_bulk; /* of musb_qh */ 339 struct list_head in_bulk; /* of musb_qh */
339 struct list_head out_bulk; /* of musb_qh */ 340 struct list_head out_bulk; /* of musb_qh */
341 struct list_head pending_list; /* pending work list */
340 342
341 struct timer_list otg_timer; 343 struct timer_list otg_timer;
342 struct notifier_block nb; 344 struct notifier_block nb;
@@ -379,12 +381,15 @@ struct musb {
379 381
380 int port_mode; /* MUSB_PORT_MODE_* */ 382 int port_mode; /* MUSB_PORT_MODE_* */
381 bool session; 383 bool session;
382 bool quirk_invalid_vbus; 384 unsigned long quirk_retries;
383 bool is_host; 385 bool is_host;
384 386
385 int a_wait_bcon; /* VBUS timeout in msecs */ 387 int a_wait_bcon; /* VBUS timeout in msecs */
386 unsigned long idle_timeout; /* Next timeout in jiffies */ 388 unsigned long idle_timeout; /* Next timeout in jiffies */
387 389
390 unsigned is_initialized:1;
391 unsigned is_runtime_suspended:1;
392
388 /* active means connected and not suspended */ 393 /* active means connected and not suspended */
389 unsigned is_active:1; 394 unsigned is_active:1;
390 395
@@ -540,6 +545,10 @@ extern irqreturn_t musb_interrupt(struct musb *);
540 545
541extern void musb_hnp_stop(struct musb *musb); 546extern void musb_hnp_stop(struct musb *musb);
542 547
548int musb_queue_resume_work(struct musb *musb,
549 int (*callback)(struct musb *musb, void *data),
550 void *data);
551
543static inline void musb_platform_set_vbus(struct musb *musb, int is_on) 552static inline void musb_platform_set_vbus(struct musb *musb, int is_on)
544{ 553{
545 if (musb->ops->set_vbus) 554 if (musb->ops->set_vbus)
diff --git a/drivers/usb/musb/musb_dsps.c b/drivers/usb/musb/musb_dsps.c
index 0f17d2140db6..feae1561b9ab 100644
--- a/drivers/usb/musb/musb_dsps.c
+++ b/drivers/usb/musb/musb_dsps.c
@@ -185,24 +185,19 @@ static void dsps_musb_disable(struct musb *musb)
185 musb_writel(reg_base, wrp->coreintr_clear, wrp->usb_bitmap); 185 musb_writel(reg_base, wrp->coreintr_clear, wrp->usb_bitmap);
186 musb_writel(reg_base, wrp->epintr_clear, 186 musb_writel(reg_base, wrp->epintr_clear,
187 wrp->txep_bitmap | wrp->rxep_bitmap); 187 wrp->txep_bitmap | wrp->rxep_bitmap);
188 del_timer_sync(&glue->timer);
188 musb_writeb(musb->mregs, MUSB_DEVCTL, 0); 189 musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
189} 190}
190 191
191static void otg_timer(unsigned long _musb) 192/* Caller must take musb->lock */
193static int dsps_check_status(struct musb *musb, void *unused)
192{ 194{
193 struct musb *musb = (void *)_musb;
194 void __iomem *mregs = musb->mregs; 195 void __iomem *mregs = musb->mregs;
195 struct device *dev = musb->controller; 196 struct device *dev = musb->controller;
196 struct dsps_glue *glue = dev_get_drvdata(dev->parent); 197 struct dsps_glue *glue = dev_get_drvdata(dev->parent);
197 const struct dsps_musb_wrapper *wrp = glue->wrp; 198 const struct dsps_musb_wrapper *wrp = glue->wrp;
198 u8 devctl; 199 u8 devctl;
199 unsigned long flags;
200 int skip_session = 0; 200 int skip_session = 0;
201 int err;
202
203 err = pm_runtime_get_sync(dev);
204 if (err < 0)
205 dev_err(dev, "Poll could not pm_runtime_get: %i\n", err);
206 201
207 /* 202 /*
208 * We poll because DSPS IP's won't expose several OTG-critical 203 * We poll because DSPS IP's won't expose several OTG-critical
@@ -212,7 +207,6 @@ static void otg_timer(unsigned long _musb)
212 dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl, 207 dev_dbg(musb->controller, "Poll devctl %02x (%s)\n", devctl,
213 usb_otg_state_string(musb->xceiv->otg->state)); 208 usb_otg_state_string(musb->xceiv->otg->state));
214 209
215 spin_lock_irqsave(&musb->lock, flags);
216 switch (musb->xceiv->otg->state) { 210 switch (musb->xceiv->otg->state) {
217 case OTG_STATE_A_WAIT_VRISE: 211 case OTG_STATE_A_WAIT_VRISE:
218 mod_timer(&glue->timer, jiffies + 212 mod_timer(&glue->timer, jiffies +
@@ -245,8 +239,30 @@ static void otg_timer(unsigned long _musb)
245 default: 239 default:
246 break; 240 break;
247 } 241 }
248 spin_unlock_irqrestore(&musb->lock, flags);
249 242
243 return 0;
244}
245
246static void otg_timer(unsigned long _musb)
247{
248 struct musb *musb = (void *)_musb;
249 struct device *dev = musb->controller;
250 unsigned long flags;
251 int err;
252
253 err = pm_runtime_get(dev);
254 if ((err != -EINPROGRESS) && err < 0) {
255 dev_err(dev, "Poll could not pm_runtime_get: %i\n", err);
256 pm_runtime_put_noidle(dev);
257
258 return;
259 }
260
261 spin_lock_irqsave(&musb->lock, flags);
262 err = musb_queue_resume_work(musb, dsps_check_status, NULL);
263 if (err < 0)
264 dev_err(dev, "%s resume work: %i\n", __func__, err);
265 spin_unlock_irqrestore(&musb->lock, flags);
250 pm_runtime_mark_last_busy(dev); 266 pm_runtime_mark_last_busy(dev);
251 pm_runtime_put_autosuspend(dev); 267 pm_runtime_put_autosuspend(dev);
252} 268}
@@ -767,28 +783,13 @@ static int dsps_probe(struct platform_device *pdev)
767 783
768 platform_set_drvdata(pdev, glue); 784 platform_set_drvdata(pdev, glue);
769 pm_runtime_enable(&pdev->dev); 785 pm_runtime_enable(&pdev->dev);
770 pm_runtime_use_autosuspend(&pdev->dev);
771 pm_runtime_set_autosuspend_delay(&pdev->dev, 200);
772
773 ret = pm_runtime_get_sync(&pdev->dev);
774 if (ret < 0) {
775 dev_err(&pdev->dev, "pm_runtime_get_sync FAILED");
776 goto err2;
777 }
778
779 ret = dsps_create_musb_pdev(glue, pdev); 786 ret = dsps_create_musb_pdev(glue, pdev);
780 if (ret) 787 if (ret)
781 goto err3; 788 goto err;
782
783 pm_runtime_mark_last_busy(&pdev->dev);
784 pm_runtime_put_autosuspend(&pdev->dev);
785 789
786 return 0; 790 return 0;
787 791
788err3: 792err:
789 pm_runtime_put_sync(&pdev->dev);
790err2:
791 pm_runtime_dont_use_autosuspend(&pdev->dev);
792 pm_runtime_disable(&pdev->dev); 793 pm_runtime_disable(&pdev->dev);
793 return ret; 794 return ret;
794} 795}
@@ -799,9 +800,6 @@ static int dsps_remove(struct platform_device *pdev)
799 800
800 platform_device_unregister(glue->musb); 801 platform_device_unregister(glue->musb);
801 802
802 /* disable usbss clocks */
803 pm_runtime_dont_use_autosuspend(&pdev->dev);
804 pm_runtime_put_sync(&pdev->dev);
805 pm_runtime_disable(&pdev->dev); 803 pm_runtime_disable(&pdev->dev);
806 804
807 return 0; 805 return 0;
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index 4042ea017985..a55173c9e564 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -1114,7 +1114,7 @@ static int musb_gadget_enable(struct usb_ep *ep,
1114 musb_ep->dma ? "dma, " : "", 1114 musb_ep->dma ? "dma, " : "",
1115 musb_ep->packet_sz); 1115 musb_ep->packet_sz);
1116 1116
1117 schedule_work(&musb->irq_work); 1117 schedule_delayed_work(&musb->irq_work, 0);
1118 1118
1119fail: 1119fail:
1120 spin_unlock_irqrestore(&musb->lock, flags); 1120 spin_unlock_irqrestore(&musb->lock, flags);
@@ -1158,7 +1158,7 @@ static int musb_gadget_disable(struct usb_ep *ep)
1158 musb_ep->desc = NULL; 1158 musb_ep->desc = NULL;
1159 musb_ep->end_point.desc = NULL; 1159 musb_ep->end_point.desc = NULL;
1160 1160
1161 schedule_work(&musb->irq_work); 1161 schedule_delayed_work(&musb->irq_work, 0);
1162 1162
1163 spin_unlock_irqrestore(&(musb->lock), flags); 1163 spin_unlock_irqrestore(&(musb->lock), flags);
1164 1164
@@ -1222,13 +1222,22 @@ void musb_ep_restart(struct musb *musb, struct musb_request *req)
1222 rxstate(musb, req); 1222 rxstate(musb, req);
1223} 1223}
1224 1224
1225static int musb_ep_restart_resume_work(struct musb *musb, void *data)
1226{
1227 struct musb_request *req = data;
1228
1229 musb_ep_restart(musb, req);
1230
1231 return 0;
1232}
1233
1225static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req, 1234static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
1226 gfp_t gfp_flags) 1235 gfp_t gfp_flags)
1227{ 1236{
1228 struct musb_ep *musb_ep; 1237 struct musb_ep *musb_ep;
1229 struct musb_request *request; 1238 struct musb_request *request;
1230 struct musb *musb; 1239 struct musb *musb;
1231 int status = 0; 1240 int status;
1232 unsigned long lockflags; 1241 unsigned long lockflags;
1233 1242
1234 if (!ep || !req) 1243 if (!ep || !req)
@@ -1245,6 +1254,17 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
1245 if (request->ep != musb_ep) 1254 if (request->ep != musb_ep)
1246 return -EINVAL; 1255 return -EINVAL;
1247 1256
1257 status = pm_runtime_get(musb->controller);
1258 if ((status != -EINPROGRESS) && status < 0) {
1259 dev_err(musb->controller,
1260 "pm runtime get failed in %s\n",
1261 __func__);
1262 pm_runtime_put_noidle(musb->controller);
1263
1264 return status;
1265 }
1266 status = 0;
1267
1248 trace_musb_req_enq(request); 1268 trace_musb_req_enq(request);
1249 1269
1250 /* request is mine now... */ 1270 /* request is mine now... */
@@ -1255,7 +1275,6 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
1255 1275
1256 map_dma_buffer(request, musb, musb_ep); 1276 map_dma_buffer(request, musb, musb_ep);
1257 1277
1258 pm_runtime_get_sync(musb->controller);
1259 spin_lock_irqsave(&musb->lock, lockflags); 1278 spin_lock_irqsave(&musb->lock, lockflags);
1260 1279
1261 /* don't queue if the ep is down */ 1280 /* don't queue if the ep is down */
@@ -1271,8 +1290,14 @@ static int musb_gadget_queue(struct usb_ep *ep, struct usb_request *req,
1271 list_add_tail(&request->list, &musb_ep->req_list); 1290 list_add_tail(&request->list, &musb_ep->req_list);
1272 1291
1273 /* it this is the head of the queue, start i/o ... */ 1292 /* it this is the head of the queue, start i/o ... */
1274 if (!musb_ep->busy && &request->list == musb_ep->req_list.next) 1293 if (!musb_ep->busy && &request->list == musb_ep->req_list.next) {
1275 musb_ep_restart(musb, request); 1294 status = musb_queue_resume_work(musb,
1295 musb_ep_restart_resume_work,
1296 request);
1297 if (status < 0)
1298 dev_err(musb->controller, "%s resume work: %i\n",
1299 __func__, status);
1300 }
1276 1301
1277unlock: 1302unlock:
1278 spin_unlock_irqrestore(&musb->lock, lockflags); 1303 spin_unlock_irqrestore(&musb->lock, lockflags);
@@ -1969,7 +1994,7 @@ static int musb_gadget_stop(struct usb_gadget *g)
1969 */ 1994 */
1970 1995
1971 /* Force check of devctl register for PM runtime */ 1996 /* Force check of devctl register for PM runtime */
1972 schedule_work(&musb->irq_work); 1997 schedule_delayed_work(&musb->irq_work, 0);
1973 1998
1974 pm_runtime_mark_last_busy(musb->controller); 1999 pm_runtime_mark_last_busy(musb->controller);
1975 pm_runtime_put_autosuspend(musb->controller); 2000 pm_runtime_put_autosuspend(musb->controller);
diff --git a/drivers/usb/musb/omap2430.c b/drivers/usb/musb/omap2430.c
index cc1225485509..e8be8e39ab8f 100644
--- a/drivers/usb/musb/omap2430.c
+++ b/drivers/usb/musb/omap2430.c
@@ -513,17 +513,18 @@ static int omap2430_probe(struct platform_device *pdev)
513 } 513 }
514 514
515 pm_runtime_enable(glue->dev); 515 pm_runtime_enable(glue->dev);
516 pm_runtime_use_autosuspend(glue->dev);
517 pm_runtime_set_autosuspend_delay(glue->dev, 100);
518 516
519 ret = platform_device_add(musb); 517 ret = platform_device_add(musb);
520 if (ret) { 518 if (ret) {
521 dev_err(&pdev->dev, "failed to register musb device\n"); 519 dev_err(&pdev->dev, "failed to register musb device\n");
522 goto err2; 520 goto err3;
523 } 521 }
524 522
525 return 0; 523 return 0;
526 524
525err3:
526 pm_runtime_disable(glue->dev);
527
527err2: 528err2:
528 platform_device_put(musb); 529 platform_device_put(musb);
529 530
@@ -535,10 +536,7 @@ static int omap2430_remove(struct platform_device *pdev)
535{ 536{
536 struct omap2430_glue *glue = platform_get_drvdata(pdev); 537 struct omap2430_glue *glue = platform_get_drvdata(pdev);
537 538
538 pm_runtime_get_sync(glue->dev);
539 platform_device_unregister(glue->musb); 539 platform_device_unregister(glue->musb);
540 pm_runtime_put_sync(glue->dev);
541 pm_runtime_dont_use_autosuspend(glue->dev);
542 pm_runtime_disable(glue->dev); 540 pm_runtime_disable(glue->dev);
543 541
544 return 0; 542 return 0;
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c
index df7c9f46be54..e85cc8e4e7a9 100644
--- a/drivers/usb/musb/tusb6010.c
+++ b/drivers/usb/musb/tusb6010.c
@@ -724,7 +724,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
724 dev_dbg(musb->controller, "vbus change, %s, otg %03x\n", 724 dev_dbg(musb->controller, "vbus change, %s, otg %03x\n",
725 usb_otg_state_string(musb->xceiv->otg->state), otg_stat); 725 usb_otg_state_string(musb->xceiv->otg->state), otg_stat);
726 idle_timeout = jiffies + (1 * HZ); 726 idle_timeout = jiffies + (1 * HZ);
727 schedule_work(&musb->irq_work); 727 schedule_delayed_work(&musb->irq_work, 0);
728 728
729 } else /* A-dev state machine */ { 729 } else /* A-dev state machine */ {
730 dev_dbg(musb->controller, "vbus change, %s, otg %03x\n", 730 dev_dbg(musb->controller, "vbus change, %s, otg %03x\n",
@@ -814,7 +814,7 @@ tusb_otg_ints(struct musb *musb, u32 int_src, void __iomem *tbase)
814 break; 814 break;
815 } 815 }
816 } 816 }
817 schedule_work(&musb->irq_work); 817 schedule_delayed_work(&musb->irq_work, 0);
818 818
819 return idle_timeout; 819 return idle_timeout;
820} 820}
@@ -864,7 +864,7 @@ static irqreturn_t tusb_musb_interrupt(int irq, void *__hci)
864 musb_writel(tbase, TUSB_PRCM_WAKEUP_CLEAR, reg); 864 musb_writel(tbase, TUSB_PRCM_WAKEUP_CLEAR, reg);
865 if (reg & ~TUSB_PRCM_WNORCS) { 865 if (reg & ~TUSB_PRCM_WNORCS) {
866 musb->is_active = 1; 866 musb->is_active = 1;
867 schedule_work(&musb->irq_work); 867 schedule_delayed_work(&musb->irq_work, 0);
868 } 868 }
869 dev_dbg(musb->controller, "wake %sactive %02x\n", 869 dev_dbg(musb->controller, "wake %sactive %02x\n",
870 musb->is_active ? "" : "in", reg); 870 musb->is_active ? "" : "in", reg);
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
index f61477bed3a8..243ac5ebe46a 100644
--- a/drivers/usb/serial/cp210x.c
+++ b/drivers/usb/serial/cp210x.c
@@ -131,6 +131,7 @@ static const struct usb_device_id id_table[] = {
131 { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ 131 { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */
132 { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ 132 { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */
133 { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ 133 { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */
134 { USB_DEVICE(0x10C4, 0x8962) }, /* Brim Brothers charging dock */
134 { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ 135 { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */
135 { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */ 136 { USB_DEVICE(0x10C4, 0x8998) }, /* KCF Technologies PRN */
136 { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */ 137 { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
index 0ff7f38d7800..6e9fc8bcc285 100644
--- a/drivers/usb/serial/ftdi_sio.c
+++ b/drivers/usb/serial/ftdi_sio.c
@@ -1012,6 +1012,8 @@ static const struct usb_device_id id_table_combined[] = {
1012 { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) }, 1012 { USB_DEVICE(ICPDAS_VID, ICPDAS_I7561U_PID) },
1013 { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) }, 1013 { USB_DEVICE(ICPDAS_VID, ICPDAS_I7563U_PID) },
1014 { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) }, 1014 { USB_DEVICE(WICED_VID, WICED_USB20706V2_PID) },
1015 { USB_DEVICE(TI_VID, TI_CC3200_LAUNCHPAD_PID),
1016 .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
1015 { } /* Terminating entry */ 1017 { } /* Terminating entry */
1016}; 1018};
1017 1019
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h
index 21011c0a4c64..48ee04c94a75 100644
--- a/drivers/usb/serial/ftdi_sio_ids.h
+++ b/drivers/usb/serial/ftdi_sio_ids.h
@@ -596,6 +596,12 @@
596#define STK541_PID 0x2109 /* Zigbee Controller */ 596#define STK541_PID 0x2109 /* Zigbee Controller */
597 597
598/* 598/*
599 * Texas Instruments
600 */
601#define TI_VID 0x0451
602#define TI_CC3200_LAUNCHPAD_PID 0xC32A /* SimpleLink Wi-Fi CC3200 LaunchPad */
603
604/*
599 * Blackfin gnICE JTAG 605 * Blackfin gnICE JTAG
600 * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice 606 * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
601 */ 607 */
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
index ffd086733421..1a59f335b063 100644
--- a/drivers/usb/storage/transport.c
+++ b/drivers/usb/storage/transport.c
@@ -954,10 +954,15 @@ int usb_stor_CB_transport(struct scsi_cmnd *srb, struct us_data *us)
954 954
955 /* COMMAND STAGE */ 955 /* COMMAND STAGE */
956 /* let's send the command via the control pipe */ 956 /* let's send the command via the control pipe */
957 /*
958 * Command is sometime (f.e. after scsi_eh_prep_cmnd) on the stack.
959 * Stack may be vmallocated. So no DMA for us. Make a copy.
960 */
961 memcpy(us->iobuf, srb->cmnd, srb->cmd_len);
957 result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe, 962 result = usb_stor_ctrl_transfer(us, us->send_ctrl_pipe,
958 US_CBI_ADSC, 963 US_CBI_ADSC,
959 USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0, 964 USB_TYPE_CLASS | USB_RECIP_INTERFACE, 0,
960 us->ifnum, srb->cmnd, srb->cmd_len); 965 us->ifnum, us->iobuf, srb->cmd_len);
961 966
962 /* check the return code for the command */ 967 /* check the return code for the command */
963 usb_stor_dbg(us, "Call to usb_stor_ctrl_transfer() returned %d\n", 968 usb_stor_dbg(us, "Call to usb_stor_ctrl_transfer() returned %d\n",
diff --git a/drivers/uwb/lc-rc.c b/drivers/uwb/lc-rc.c
index d059ad4d0dbd..97ee1b46db69 100644
--- a/drivers/uwb/lc-rc.c
+++ b/drivers/uwb/lc-rc.c
@@ -56,8 +56,11 @@ static struct uwb_rc *uwb_rc_find_by_index(int index)
56 struct uwb_rc *rc = NULL; 56 struct uwb_rc *rc = NULL;
57 57
58 dev = class_find_device(&uwb_rc_class, NULL, &index, uwb_rc_index_match); 58 dev = class_find_device(&uwb_rc_class, NULL, &index, uwb_rc_index_match);
59 if (dev) 59 if (dev) {
60 rc = dev_get_drvdata(dev); 60 rc = dev_get_drvdata(dev);
61 put_device(dev);
62 }
63
61 return rc; 64 return rc;
62} 65}
63 66
@@ -467,7 +470,9 @@ struct uwb_rc *__uwb_rc_try_get(struct uwb_rc *target_rc)
467 if (dev) { 470 if (dev) {
468 rc = dev_get_drvdata(dev); 471 rc = dev_get_drvdata(dev);
469 __uwb_rc_get(rc); 472 __uwb_rc_get(rc);
473 put_device(dev);
470 } 474 }
475
471 return rc; 476 return rc;
472} 477}
473EXPORT_SYMBOL_GPL(__uwb_rc_try_get); 478EXPORT_SYMBOL_GPL(__uwb_rc_try_get);
@@ -520,8 +525,11 @@ struct uwb_rc *uwb_rc_get_by_grandpa(const struct device *grandpa_dev)
520 525
521 dev = class_find_device(&uwb_rc_class, NULL, grandpa_dev, 526 dev = class_find_device(&uwb_rc_class, NULL, grandpa_dev,
522 find_rc_grandpa); 527 find_rc_grandpa);
523 if (dev) 528 if (dev) {
524 rc = dev_get_drvdata(dev); 529 rc = dev_get_drvdata(dev);
530 put_device(dev);
531 }
532
525 return rc; 533 return rc;
526} 534}
527EXPORT_SYMBOL_GPL(uwb_rc_get_by_grandpa); 535EXPORT_SYMBOL_GPL(uwb_rc_get_by_grandpa);
@@ -553,8 +561,10 @@ struct uwb_rc *uwb_rc_get_by_dev(const struct uwb_dev_addr *addr)
553 struct uwb_rc *rc = NULL; 561 struct uwb_rc *rc = NULL;
554 562
555 dev = class_find_device(&uwb_rc_class, NULL, addr, find_rc_dev); 563 dev = class_find_device(&uwb_rc_class, NULL, addr, find_rc_dev);
556 if (dev) 564 if (dev) {
557 rc = dev_get_drvdata(dev); 565 rc = dev_get_drvdata(dev);
566 put_device(dev);
567 }
558 568
559 return rc; 569 return rc;
560} 570}
diff --git a/drivers/uwb/pal.c b/drivers/uwb/pal.c
index c1304b8d4985..678e93741ae1 100644
--- a/drivers/uwb/pal.c
+++ b/drivers/uwb/pal.c
@@ -97,6 +97,8 @@ static bool uwb_rc_class_device_exists(struct uwb_rc *target_rc)
97 97
98 dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc); 98 dev = class_find_device(&uwb_rc_class, NULL, target_rc, find_rc);
99 99
100 put_device(dev);
101
100 return (dev != NULL); 102 return (dev != NULL);
101} 103}
102 104
diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
index e3b30ea9ece5..a504e2e003da 100644
--- a/drivers/vhost/vsock.c
+++ b/drivers/vhost/vsock.c
@@ -506,7 +506,7 @@ static void vhost_vsock_reset_orphans(struct sock *sk)
506 * executing. 506 * executing.
507 */ 507 */
508 508
509 if (!vhost_vsock_get(vsk->local_addr.svm_cid)) { 509 if (!vhost_vsock_get(vsk->remote_addr.svm_cid)) {
510 sock_set_flag(sk, SOCK_DONE); 510 sock_set_flag(sk, SOCK_DONE);
511 vsk->peer_shutdown = SHUTDOWN_MASK; 511 vsk->peer_shutdown = SHUTDOWN_MASK;
512 sk->sk_state = SS_UNCONNECTED; 512 sk->sk_state = SS_UNCONNECTED;
diff --git a/drivers/video/fbdev/amba-clcd-versatile.c b/drivers/video/fbdev/amba-clcd-versatile.c
index 19ad8645d93c..e5d9bfc1703a 100644
--- a/drivers/video/fbdev/amba-clcd-versatile.c
+++ b/drivers/video/fbdev/amba-clcd-versatile.c
@@ -526,8 +526,8 @@ int versatile_clcd_init_panel(struct clcd_fb *fb,
526 np = of_find_matching_node_and_match(NULL, versatile_clcd_of_match, 526 np = of_find_matching_node_and_match(NULL, versatile_clcd_of_match,
527 &clcd_id); 527 &clcd_id);
528 if (!np) { 528 if (!np) {
529 dev_err(dev, "no Versatile syscon node\n"); 529 /* Vexpress does not have this */
530 return -ENODEV; 530 return 0;
531 } 531 }
532 versatile_clcd_type = (enum versatile_clcd)clcd_id->data; 532 versatile_clcd_type = (enum versatile_clcd)clcd_id->data;
533 533
diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
index fdd3228e0678..3eb58cb51e56 100644
--- a/drivers/watchdog/Kconfig
+++ b/drivers/watchdog/Kconfig
@@ -155,6 +155,7 @@ config TANGOX_WATCHDOG
155config WDAT_WDT 155config WDAT_WDT
156 tristate "ACPI Watchdog Action Table (WDAT)" 156 tristate "ACPI Watchdog Action Table (WDAT)"
157 depends on ACPI 157 depends on ACPI
158 select WATCHDOG_CORE
158 select ACPI_WATCHDOG 159 select ACPI_WATCHDOG
159 help 160 help
160 This driver adds support for systems with ACPI Watchdog Action 161 This driver adds support for systems with ACPI Watchdog Action
diff --git a/fs/aio.c b/fs/aio.c
index 1157e13a36d6..428484f2f841 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1078,6 +1078,17 @@ static void aio_complete(struct kiocb *kiocb, long res, long res2)
1078 unsigned tail, pos, head; 1078 unsigned tail, pos, head;
1079 unsigned long flags; 1079 unsigned long flags;
1080 1080
1081 if (kiocb->ki_flags & IOCB_WRITE) {
1082 struct file *file = kiocb->ki_filp;
1083
1084 /*
1085 * Tell lockdep we inherited freeze protection from submission
1086 * thread.
1087 */
1088 __sb_writers_acquired(file_inode(file)->i_sb, SB_FREEZE_WRITE);
1089 file_end_write(file);
1090 }
1091
1081 /* 1092 /*
1082 * Special case handling for sync iocbs: 1093 * Special case handling for sync iocbs:
1083 * - events go directly into the iocb for fast handling 1094 * - events go directly into the iocb for fast handling
@@ -1392,122 +1403,106 @@ SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
1392 return -EINVAL; 1403 return -EINVAL;
1393} 1404}
1394 1405
1395typedef ssize_t (rw_iter_op)(struct kiocb *, struct iov_iter *); 1406static int aio_setup_rw(int rw, struct iocb *iocb, struct iovec **iovec,
1396 1407 bool vectored, bool compat, struct iov_iter *iter)
1397static int aio_setup_vectored_rw(int rw, char __user *buf, size_t len,
1398 struct iovec **iovec,
1399 bool compat,
1400 struct iov_iter *iter)
1401{ 1408{
1409 void __user *buf = (void __user *)(uintptr_t)iocb->aio_buf;
1410 size_t len = iocb->aio_nbytes;
1411
1412 if (!vectored) {
1413 ssize_t ret = import_single_range(rw, buf, len, *iovec, iter);
1414 *iovec = NULL;
1415 return ret;
1416 }
1402#ifdef CONFIG_COMPAT 1417#ifdef CONFIG_COMPAT
1403 if (compat) 1418 if (compat)
1404 return compat_import_iovec(rw, 1419 return compat_import_iovec(rw, buf, len, UIO_FASTIOV, iovec,
1405 (struct compat_iovec __user *)buf, 1420 iter);
1406 len, UIO_FASTIOV, iovec, iter);
1407#endif 1421#endif
1408 return import_iovec(rw, (struct iovec __user *)buf, 1422 return import_iovec(rw, buf, len, UIO_FASTIOV, iovec, iter);
1409 len, UIO_FASTIOV, iovec, iter);
1410} 1423}
1411 1424
1412/* 1425static inline ssize_t aio_ret(struct kiocb *req, ssize_t ret)
1413 * aio_run_iocb: 1426{
1414 * Performs the initial checks and io submission. 1427 switch (ret) {
1415 */ 1428 case -EIOCBQUEUED:
1416static ssize_t aio_run_iocb(struct kiocb *req, unsigned opcode, 1429 return ret;
1417 char __user *buf, size_t len, bool compat) 1430 case -ERESTARTSYS:
1431 case -ERESTARTNOINTR:
1432 case -ERESTARTNOHAND:
1433 case -ERESTART_RESTARTBLOCK:
1434 /*
1435 * There's no easy way to restart the syscall since other AIO's
1436 * may be already running. Just fail this IO with EINTR.
1437 */
1438 ret = -EINTR;
1439 /*FALLTHRU*/
1440 default:
1441 aio_complete(req, ret, 0);
1442 return 0;
1443 }
1444}
1445
1446static ssize_t aio_read(struct kiocb *req, struct iocb *iocb, bool vectored,
1447 bool compat)
1418{ 1448{
1419 struct file *file = req->ki_filp; 1449 struct file *file = req->ki_filp;
1420 ssize_t ret;
1421 int rw;
1422 fmode_t mode;
1423 rw_iter_op *iter_op;
1424 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs; 1450 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
1425 struct iov_iter iter; 1451 struct iov_iter iter;
1452 ssize_t ret;
1426 1453
1427 switch (opcode) { 1454 if (unlikely(!(file->f_mode & FMODE_READ)))
1428 case IOCB_CMD_PREAD: 1455 return -EBADF;
1429 case IOCB_CMD_PREADV: 1456 if (unlikely(!file->f_op->read_iter))
1430 mode = FMODE_READ; 1457 return -EINVAL;
1431 rw = READ;
1432 iter_op = file->f_op->read_iter;
1433 goto rw_common;
1434
1435 case IOCB_CMD_PWRITE:
1436 case IOCB_CMD_PWRITEV:
1437 mode = FMODE_WRITE;
1438 rw = WRITE;
1439 iter_op = file->f_op->write_iter;
1440 goto rw_common;
1441rw_common:
1442 if (unlikely(!(file->f_mode & mode)))
1443 return -EBADF;
1444
1445 if (!iter_op)
1446 return -EINVAL;
1447
1448 if (opcode == IOCB_CMD_PREADV || opcode == IOCB_CMD_PWRITEV)
1449 ret = aio_setup_vectored_rw(rw, buf, len,
1450 &iovec, compat, &iter);
1451 else {
1452 ret = import_single_range(rw, buf, len, iovec, &iter);
1453 iovec = NULL;
1454 }
1455 if (!ret)
1456 ret = rw_verify_area(rw, file, &req->ki_pos,
1457 iov_iter_count(&iter));
1458 if (ret < 0) {
1459 kfree(iovec);
1460 return ret;
1461 }
1462
1463 if (rw == WRITE)
1464 file_start_write(file);
1465
1466 ret = iter_op(req, &iter);
1467
1468 if (rw == WRITE)
1469 file_end_write(file);
1470 kfree(iovec);
1471 break;
1472
1473 case IOCB_CMD_FDSYNC:
1474 if (!file->f_op->aio_fsync)
1475 return -EINVAL;
1476
1477 ret = file->f_op->aio_fsync(req, 1);
1478 break;
1479 1458
1480 case IOCB_CMD_FSYNC: 1459 ret = aio_setup_rw(READ, iocb, &iovec, vectored, compat, &iter);
1481 if (!file->f_op->aio_fsync) 1460 if (ret)
1482 return -EINVAL; 1461 return ret;
1462 ret = rw_verify_area(READ, file, &req->ki_pos, iov_iter_count(&iter));
1463 if (!ret)
1464 ret = aio_ret(req, file->f_op->read_iter(req, &iter));
1465 kfree(iovec);
1466 return ret;
1467}
1483 1468
1484 ret = file->f_op->aio_fsync(req, 0); 1469static ssize_t aio_write(struct kiocb *req, struct iocb *iocb, bool vectored,
1485 break; 1470 bool compat)
1471{
1472 struct file *file = req->ki_filp;
1473 struct iovec inline_vecs[UIO_FASTIOV], *iovec = inline_vecs;
1474 struct iov_iter iter;
1475 ssize_t ret;
1486 1476
1487 default: 1477 if (unlikely(!(file->f_mode & FMODE_WRITE)))
1488 pr_debug("EINVAL: no operation provided\n"); 1478 return -EBADF;
1479 if (unlikely(!file->f_op->write_iter))
1489 return -EINVAL; 1480 return -EINVAL;
1490 }
1491 1481
1492 if (ret != -EIOCBQUEUED) { 1482 ret = aio_setup_rw(WRITE, iocb, &iovec, vectored, compat, &iter);
1483 if (ret)
1484 return ret;
1485 ret = rw_verify_area(WRITE, file, &req->ki_pos, iov_iter_count(&iter));
1486 if (!ret) {
1487 req->ki_flags |= IOCB_WRITE;
1488 file_start_write(file);
1489 ret = aio_ret(req, file->f_op->write_iter(req, &iter));
1493 /* 1490 /*
1494 * There's no easy way to restart the syscall since other AIO's 1491 * We release freeze protection in aio_complete(). Fool lockdep
1495 * may be already running. Just fail this IO with EINTR. 1492 * by telling it the lock got released so that it doesn't
1493 * complain about held lock when we return to userspace.
1496 */ 1494 */
1497 if (unlikely(ret == -ERESTARTSYS || ret == -ERESTARTNOINTR || 1495 __sb_writers_release(file_inode(file)->i_sb, SB_FREEZE_WRITE);
1498 ret == -ERESTARTNOHAND ||
1499 ret == -ERESTART_RESTARTBLOCK))
1500 ret = -EINTR;
1501 aio_complete(req, ret, 0);
1502 } 1496 }
1503 1497 kfree(iovec);
1504 return 0; 1498 return ret;
1505} 1499}
1506 1500
1507static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb, 1501static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
1508 struct iocb *iocb, bool compat) 1502 struct iocb *iocb, bool compat)
1509{ 1503{
1510 struct aio_kiocb *req; 1504 struct aio_kiocb *req;
1505 struct file *file;
1511 ssize_t ret; 1506 ssize_t ret;
1512 1507
1513 /* enforce forwards compatibility on users */ 1508 /* enforce forwards compatibility on users */
@@ -1530,7 +1525,7 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
1530 if (unlikely(!req)) 1525 if (unlikely(!req))
1531 return -EAGAIN; 1526 return -EAGAIN;
1532 1527
1533 req->common.ki_filp = fget(iocb->aio_fildes); 1528 req->common.ki_filp = file = fget(iocb->aio_fildes);
1534 if (unlikely(!req->common.ki_filp)) { 1529 if (unlikely(!req->common.ki_filp)) {
1535 ret = -EBADF; 1530 ret = -EBADF;
1536 goto out_put_req; 1531 goto out_put_req;
@@ -1565,13 +1560,29 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
1565 req->ki_user_iocb = user_iocb; 1560 req->ki_user_iocb = user_iocb;
1566 req->ki_user_data = iocb->aio_data; 1561 req->ki_user_data = iocb->aio_data;
1567 1562
1568 ret = aio_run_iocb(&req->common, iocb->aio_lio_opcode, 1563 get_file(file);
1569 (char __user *)(unsigned long)iocb->aio_buf, 1564 switch (iocb->aio_lio_opcode) {
1570 iocb->aio_nbytes, 1565 case IOCB_CMD_PREAD:
1571 compat); 1566 ret = aio_read(&req->common, iocb, false, compat);
1572 if (ret) 1567 break;
1573 goto out_put_req; 1568 case IOCB_CMD_PWRITE:
1569 ret = aio_write(&req->common, iocb, false, compat);
1570 break;
1571 case IOCB_CMD_PREADV:
1572 ret = aio_read(&req->common, iocb, true, compat);
1573 break;
1574 case IOCB_CMD_PWRITEV:
1575 ret = aio_write(&req->common, iocb, true, compat);
1576 break;
1577 default:
1578 pr_debug("invalid aio operation %d\n", iocb->aio_lio_opcode);
1579 ret = -EINVAL;
1580 break;
1581 }
1582 fput(file);
1574 1583
1584 if (ret && ret != -EIOCBQUEUED)
1585 goto out_put_req;
1575 return 0; 1586 return 0;
1576out_put_req: 1587out_put_req:
1577 put_reqs_available(ctx, 1); 1588 put_reqs_available(ctx, 1);
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c
index 78180d151730..a594c7879cc2 100644
--- a/fs/ceph/dir.c
+++ b/fs/ceph/dir.c
@@ -1261,26 +1261,30 @@ static int ceph_d_revalidate(struct dentry *dentry, unsigned int flags)
1261 return -ECHILD; 1261 return -ECHILD;
1262 1262
1263 op = ceph_snap(dir) == CEPH_SNAPDIR ? 1263 op = ceph_snap(dir) == CEPH_SNAPDIR ?
1264 CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_LOOKUP; 1264 CEPH_MDS_OP_LOOKUPSNAP : CEPH_MDS_OP_GETATTR;
1265 req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS); 1265 req = ceph_mdsc_create_request(mdsc, op, USE_ANY_MDS);
1266 if (!IS_ERR(req)) { 1266 if (!IS_ERR(req)) {
1267 req->r_dentry = dget(dentry); 1267 req->r_dentry = dget(dentry);
1268 req->r_num_caps = 2; 1268 req->r_num_caps = op == CEPH_MDS_OP_GETATTR ? 1 : 2;
1269 1269
1270 mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED; 1270 mask = CEPH_STAT_CAP_INODE | CEPH_CAP_AUTH_SHARED;
1271 if (ceph_security_xattr_wanted(dir)) 1271 if (ceph_security_xattr_wanted(dir))
1272 mask |= CEPH_CAP_XATTR_SHARED; 1272 mask |= CEPH_CAP_XATTR_SHARED;
1273 req->r_args.getattr.mask = mask; 1273 req->r_args.getattr.mask = mask;
1274 1274
1275 req->r_locked_dir = dir;
1276 err = ceph_mdsc_do_request(mdsc, NULL, req); 1275 err = ceph_mdsc_do_request(mdsc, NULL, req);
1277 if (err == 0 || err == -ENOENT) { 1276 switch (err) {
1278 if (dentry == req->r_dentry) { 1277 case 0:
1279 valid = !d_unhashed(dentry); 1278 if (d_really_is_positive(dentry) &&
1280 } else { 1279 d_inode(dentry) == req->r_target_inode)
1281 d_invalidate(req->r_dentry); 1280 valid = 1;
1282 err = -EAGAIN; 1281 break;
1283 } 1282 case -ENOENT:
1283 if (d_really_is_negative(dentry))
1284 valid = 1;
1285 /* Fallthrough */
1286 default:
1287 break;
1284 } 1288 }
1285 ceph_mdsc_put_request(req); 1289 ceph_mdsc_put_request(req);
1286 dout("d_revalidate %p lookup result=%d\n", 1290 dout("d_revalidate %p lookup result=%d\n",
diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 18630e800208..f995e3528a33 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -1770,7 +1770,6 @@ const struct file_operations ceph_file_fops = {
1770 .fsync = ceph_fsync, 1770 .fsync = ceph_fsync,
1771 .lock = ceph_lock, 1771 .lock = ceph_lock,
1772 .flock = ceph_flock, 1772 .flock = ceph_flock,
1773 .splice_read = generic_file_splice_read,
1774 .splice_write = iter_file_splice_write, 1773 .splice_write = iter_file_splice_write,
1775 .unlocked_ioctl = ceph_ioctl, 1774 .unlocked_ioctl = ceph_ioctl,
1776 .compat_ioctl = ceph_ioctl, 1775 .compat_ioctl = ceph_ioctl,
diff --git a/fs/cifs/cifsencrypt.c b/fs/cifs/cifsencrypt.c
index 8347c90cf483..5eb04129f938 100644
--- a/fs/cifs/cifsencrypt.c
+++ b/fs/cifs/cifsencrypt.c
@@ -808,7 +808,11 @@ calc_seckey(struct cifs_ses *ses)
808 struct crypto_skcipher *tfm_arc4; 808 struct crypto_skcipher *tfm_arc4;
809 struct scatterlist sgin, sgout; 809 struct scatterlist sgin, sgout;
810 struct skcipher_request *req; 810 struct skcipher_request *req;
811 unsigned char sec_key[CIFS_SESS_KEY_SIZE]; /* a nonce */ 811 unsigned char *sec_key;
812
813 sec_key = kmalloc(CIFS_SESS_KEY_SIZE, GFP_KERNEL);
814 if (sec_key == NULL)
815 return -ENOMEM;
812 816
813 get_random_bytes(sec_key, CIFS_SESS_KEY_SIZE); 817 get_random_bytes(sec_key, CIFS_SESS_KEY_SIZE);
814 818
@@ -816,7 +820,7 @@ calc_seckey(struct cifs_ses *ses)
816 if (IS_ERR(tfm_arc4)) { 820 if (IS_ERR(tfm_arc4)) {
817 rc = PTR_ERR(tfm_arc4); 821 rc = PTR_ERR(tfm_arc4);
818 cifs_dbg(VFS, "could not allocate crypto API arc4\n"); 822 cifs_dbg(VFS, "could not allocate crypto API arc4\n");
819 return rc; 823 goto out;
820 } 824 }
821 825
822 rc = crypto_skcipher_setkey(tfm_arc4, ses->auth_key.response, 826 rc = crypto_skcipher_setkey(tfm_arc4, ses->auth_key.response,
@@ -854,7 +858,8 @@ calc_seckey(struct cifs_ses *ses)
854 858
855out_free_cipher: 859out_free_cipher:
856 crypto_free_skcipher(tfm_arc4); 860 crypto_free_skcipher(tfm_arc4);
857 861out:
862 kfree(sec_key);
858 return rc; 863 return rc;
859} 864}
860 865
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 3f3185febc58..e3fed9249a04 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -3427,6 +3427,7 @@ static __u16 ACL_to_cifs_posix(char *parm_data, const char *pACL,
3427 __u16 rc = 0; 3427 __u16 rc = 0;
3428 struct cifs_posix_acl *cifs_acl = (struct cifs_posix_acl *)parm_data; 3428 struct cifs_posix_acl *cifs_acl = (struct cifs_posix_acl *)parm_data;
3429 struct posix_acl_xattr_header *local_acl = (void *)pACL; 3429 struct posix_acl_xattr_header *local_acl = (void *)pACL;
3430 struct posix_acl_xattr_entry *ace = (void *)(local_acl + 1);
3430 int count; 3431 int count;
3431 int i; 3432 int i;
3432 3433
@@ -3453,8 +3454,7 @@ static __u16 ACL_to_cifs_posix(char *parm_data, const char *pACL,
3453 return 0; 3454 return 0;
3454 } 3455 }
3455 for (i = 0; i < count; i++) { 3456 for (i = 0; i < count; i++) {
3456 rc = convert_ace_to_cifs_ace(&cifs_acl->ace_array[i], 3457 rc = convert_ace_to_cifs_ace(&cifs_acl->ace_array[i], &ace[i]);
3457 (struct posix_acl_xattr_entry *)(local_acl + 1));
3458 if (rc != 0) { 3458 if (rc != 0) {
3459 /* ACE not converted */ 3459 /* ACE not converted */
3460 break; 3460 break;
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index aab5227979e2..4547aeddd12b 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -412,6 +412,9 @@ cifs_reconnect(struct TCP_Server_Info *server)
412 } 412 }
413 } while (server->tcpStatus == CifsNeedReconnect); 413 } while (server->tcpStatus == CifsNeedReconnect);
414 414
415 if (server->tcpStatus == CifsNeedNegotiate)
416 mod_delayed_work(cifsiod_wq, &server->echo, 0);
417
415 return rc; 418 return rc;
416} 419}
417 420
@@ -421,17 +424,25 @@ cifs_echo_request(struct work_struct *work)
421 int rc; 424 int rc;
422 struct TCP_Server_Info *server = container_of(work, 425 struct TCP_Server_Info *server = container_of(work,
423 struct TCP_Server_Info, echo.work); 426 struct TCP_Server_Info, echo.work);
424 unsigned long echo_interval = server->echo_interval; 427 unsigned long echo_interval;
428
429 /*
430 * If we need to renegotiate, set echo interval to zero to
431 * immediately call echo service where we can renegotiate.
432 */
433 if (server->tcpStatus == CifsNeedNegotiate)
434 echo_interval = 0;
435 else
436 echo_interval = server->echo_interval;
425 437
426 /* 438 /*
427 * We cannot send an echo if it is disabled or until the 439 * We cannot send an echo if it is disabled.
428 * NEGOTIATE_PROTOCOL request is done, which is indicated by 440 * Also, no need to ping if we got a response recently.
429 * server->ops->need_neg() == true. Also, no need to ping if
430 * we got a response recently.
431 */ 441 */
432 442
433 if (server->tcpStatus == CifsNeedReconnect || 443 if (server->tcpStatus == CifsNeedReconnect ||
434 server->tcpStatus == CifsExiting || server->tcpStatus == CifsNew || 444 server->tcpStatus == CifsExiting ||
445 server->tcpStatus == CifsNew ||
435 (server->ops->can_echo && !server->ops->can_echo(server)) || 446 (server->ops->can_echo && !server->ops->can_echo(server)) ||
436 time_before(jiffies, server->lstrp + echo_interval - HZ)) 447 time_before(jiffies, server->lstrp + echo_interval - HZ))
437 goto requeue_echo; 448 goto requeue_echo;
@@ -442,7 +453,7 @@ cifs_echo_request(struct work_struct *work)
442 server->hostname); 453 server->hostname);
443 454
444requeue_echo: 455requeue_echo:
445 queue_delayed_work(cifsiod_wq, &server->echo, echo_interval); 456 queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval);
446} 457}
447 458
448static bool 459static bool
diff --git a/fs/coredump.c b/fs/coredump.c
index 281b768000e6..eb9c92c9b20f 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -1,6 +1,7 @@
1#include <linux/slab.h> 1#include <linux/slab.h>
2#include <linux/file.h> 2#include <linux/file.h>
3#include <linux/fdtable.h> 3#include <linux/fdtable.h>
4#include <linux/freezer.h>
4#include <linux/mm.h> 5#include <linux/mm.h>
5#include <linux/stat.h> 6#include <linux/stat.h>
6#include <linux/fcntl.h> 7#include <linux/fcntl.h>
@@ -423,7 +424,9 @@ static int coredump_wait(int exit_code, struct core_state *core_state)
423 if (core_waiters > 0) { 424 if (core_waiters > 0) {
424 struct core_thread *ptr; 425 struct core_thread *ptr;
425 426
427 freezer_do_not_count();
426 wait_for_completion(&core_state->startup); 428 wait_for_completion(&core_state->startup);
429 freezer_count();
427 /* 430 /*
428 * Wait for all the threads to become inactive, so that 431 * Wait for all the threads to become inactive, so that
429 * all the thread context (extended register state, like 432 * all the thread context (extended register state, like
diff --git a/fs/crypto/fname.c b/fs/crypto/fname.c
index 9a28133ac3b8..9b774f4b50c8 100644
--- a/fs/crypto/fname.c
+++ b/fs/crypto/fname.c
@@ -39,65 +39,54 @@ static void fname_crypt_complete(struct crypto_async_request *req, int res)
39static int fname_encrypt(struct inode *inode, 39static int fname_encrypt(struct inode *inode,
40 const struct qstr *iname, struct fscrypt_str *oname) 40 const struct qstr *iname, struct fscrypt_str *oname)
41{ 41{
42 u32 ciphertext_len;
43 struct skcipher_request *req = NULL; 42 struct skcipher_request *req = NULL;
44 DECLARE_FS_COMPLETION_RESULT(ecr); 43 DECLARE_FS_COMPLETION_RESULT(ecr);
45 struct fscrypt_info *ci = inode->i_crypt_info; 44 struct fscrypt_info *ci = inode->i_crypt_info;
46 struct crypto_skcipher *tfm = ci->ci_ctfm; 45 struct crypto_skcipher *tfm = ci->ci_ctfm;
47 int res = 0; 46 int res = 0;
48 char iv[FS_CRYPTO_BLOCK_SIZE]; 47 char iv[FS_CRYPTO_BLOCK_SIZE];
49 struct scatterlist src_sg, dst_sg; 48 struct scatterlist sg;
50 int padding = 4 << (ci->ci_flags & FS_POLICY_FLAGS_PAD_MASK); 49 int padding = 4 << (ci->ci_flags & FS_POLICY_FLAGS_PAD_MASK);
51 char *workbuf, buf[32], *alloc_buf = NULL; 50 unsigned int lim;
52 unsigned lim; 51 unsigned int cryptlen;
53 52
54 lim = inode->i_sb->s_cop->max_namelen(inode); 53 lim = inode->i_sb->s_cop->max_namelen(inode);
55 if (iname->len <= 0 || iname->len > lim) 54 if (iname->len <= 0 || iname->len > lim)
56 return -EIO; 55 return -EIO;
57 56
58 ciphertext_len = max(iname->len, (u32)FS_CRYPTO_BLOCK_SIZE); 57 /*
59 ciphertext_len = round_up(ciphertext_len, padding); 58 * Copy the filename to the output buffer for encrypting in-place and
60 ciphertext_len = min(ciphertext_len, lim); 59 * pad it with the needed number of NUL bytes.
60 */
61 cryptlen = max_t(unsigned int, iname->len, FS_CRYPTO_BLOCK_SIZE);
62 cryptlen = round_up(cryptlen, padding);
63 cryptlen = min(cryptlen, lim);
64 memcpy(oname->name, iname->name, iname->len);
65 memset(oname->name + iname->len, 0, cryptlen - iname->len);
61 66
62 if (ciphertext_len <= sizeof(buf)) { 67 /* Initialize the IV */
63 workbuf = buf; 68 memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
64 } else {
65 alloc_buf = kmalloc(ciphertext_len, GFP_NOFS);
66 if (!alloc_buf)
67 return -ENOMEM;
68 workbuf = alloc_buf;
69 }
70 69
71 /* Allocate request */ 70 /* Set up the encryption request */
72 req = skcipher_request_alloc(tfm, GFP_NOFS); 71 req = skcipher_request_alloc(tfm, GFP_NOFS);
73 if (!req) { 72 if (!req) {
74 printk_ratelimited(KERN_ERR 73 printk_ratelimited(KERN_ERR
75 "%s: crypto_request_alloc() failed\n", __func__); 74 "%s: skcipher_request_alloc() failed\n", __func__);
76 kfree(alloc_buf);
77 return -ENOMEM; 75 return -ENOMEM;
78 } 76 }
79 skcipher_request_set_callback(req, 77 skcipher_request_set_callback(req,
80 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP, 78 CRYPTO_TFM_REQ_MAY_BACKLOG | CRYPTO_TFM_REQ_MAY_SLEEP,
81 fname_crypt_complete, &ecr); 79 fname_crypt_complete, &ecr);
80 sg_init_one(&sg, oname->name, cryptlen);
81 skcipher_request_set_crypt(req, &sg, &sg, cryptlen, iv);
82 82
83 /* Copy the input */ 83 /* Do the encryption */
84 memcpy(workbuf, iname->name, iname->len);
85 if (iname->len < ciphertext_len)
86 memset(workbuf + iname->len, 0, ciphertext_len - iname->len);
87
88 /* Initialize IV */
89 memset(iv, 0, FS_CRYPTO_BLOCK_SIZE);
90
91 /* Create encryption request */
92 sg_init_one(&src_sg, workbuf, ciphertext_len);
93 sg_init_one(&dst_sg, oname->name, ciphertext_len);
94 skcipher_request_set_crypt(req, &src_sg, &dst_sg, ciphertext_len, iv);
95 res = crypto_skcipher_encrypt(req); 84 res = crypto_skcipher_encrypt(req);
96 if (res == -EINPROGRESS || res == -EBUSY) { 85 if (res == -EINPROGRESS || res == -EBUSY) {
86 /* Request is being completed asynchronously; wait for it */
97 wait_for_completion(&ecr.completion); 87 wait_for_completion(&ecr.completion);
98 res = ecr.res; 88 res = ecr.res;
99 } 89 }
100 kfree(alloc_buf);
101 skcipher_request_free(req); 90 skcipher_request_free(req);
102 if (res < 0) { 91 if (res < 0) {
103 printk_ratelimited(KERN_ERR 92 printk_ratelimited(KERN_ERR
@@ -105,7 +94,7 @@ static int fname_encrypt(struct inode *inode,
105 return res; 94 return res;
106 } 95 }
107 96
108 oname->len = ciphertext_len; 97 oname->len = cryptlen;
109 return 0; 98 return 0;
110} 99}
111 100
diff --git a/fs/crypto/keyinfo.c b/fs/crypto/keyinfo.c
index 82f0285f5d08..67fb6d8876d0 100644
--- a/fs/crypto/keyinfo.c
+++ b/fs/crypto/keyinfo.c
@@ -185,7 +185,7 @@ int get_crypt_info(struct inode *inode)
185 struct crypto_skcipher *ctfm; 185 struct crypto_skcipher *ctfm;
186 const char *cipher_str; 186 const char *cipher_str;
187 int keysize; 187 int keysize;
188 u8 raw_key[FS_MAX_KEY_SIZE]; 188 u8 *raw_key = NULL;
189 int res; 189 int res;
190 190
191 res = fscrypt_initialize(); 191 res = fscrypt_initialize();
@@ -238,6 +238,15 @@ retry:
238 if (res) 238 if (res)
239 goto out; 239 goto out;
240 240
241 /*
242 * This cannot be a stack buffer because it is passed to the scatterlist
243 * crypto API as part of key derivation.
244 */
245 res = -ENOMEM;
246 raw_key = kmalloc(FS_MAX_KEY_SIZE, GFP_NOFS);
247 if (!raw_key)
248 goto out;
249
241 if (fscrypt_dummy_context_enabled(inode)) { 250 if (fscrypt_dummy_context_enabled(inode)) {
242 memset(raw_key, 0x42, FS_AES_256_XTS_KEY_SIZE); 251 memset(raw_key, 0x42, FS_AES_256_XTS_KEY_SIZE);
243 goto got_key; 252 goto got_key;
@@ -276,7 +285,8 @@ got_key:
276 if (res) 285 if (res)
277 goto out; 286 goto out;
278 287
279 memzero_explicit(raw_key, sizeof(raw_key)); 288 kzfree(raw_key);
289 raw_key = NULL;
280 if (cmpxchg(&inode->i_crypt_info, NULL, crypt_info) != NULL) { 290 if (cmpxchg(&inode->i_crypt_info, NULL, crypt_info) != NULL) {
281 put_crypt_info(crypt_info); 291 put_crypt_info(crypt_info);
282 goto retry; 292 goto retry;
@@ -287,7 +297,7 @@ out:
287 if (res == -ENOKEY) 297 if (res == -ENOKEY)
288 res = 0; 298 res = 0;
289 put_crypt_info(crypt_info); 299 put_crypt_info(crypt_info);
290 memzero_explicit(raw_key, sizeof(raw_key)); 300 kzfree(raw_key);
291 return res; 301 return res;
292} 302}
293 303
diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
index 282a51b07c57..a8a750f59621 100644
--- a/fs/ext4/ext4.h
+++ b/fs/ext4/ext4.h
@@ -235,6 +235,7 @@ struct ext4_io_submit {
235#define EXT4_MAX_BLOCK_SIZE 65536 235#define EXT4_MAX_BLOCK_SIZE 65536
236#define EXT4_MIN_BLOCK_LOG_SIZE 10 236#define EXT4_MIN_BLOCK_LOG_SIZE 10
237#define EXT4_MAX_BLOCK_LOG_SIZE 16 237#define EXT4_MAX_BLOCK_LOG_SIZE 16
238#define EXT4_MAX_CLUSTER_LOG_SIZE 30
238#ifdef __KERNEL__ 239#ifdef __KERNEL__
239# define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize) 240# define EXT4_BLOCK_SIZE(s) ((s)->s_blocksize)
240#else 241#else
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index 20da99da0a34..52b0530c5d65 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -3565,7 +3565,15 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
3565 if (blocksize < EXT4_MIN_BLOCK_SIZE || 3565 if (blocksize < EXT4_MIN_BLOCK_SIZE ||
3566 blocksize > EXT4_MAX_BLOCK_SIZE) { 3566 blocksize > EXT4_MAX_BLOCK_SIZE) {
3567 ext4_msg(sb, KERN_ERR, 3567 ext4_msg(sb, KERN_ERR,
3568 "Unsupported filesystem blocksize %d", blocksize); 3568 "Unsupported filesystem blocksize %d (%d log_block_size)",
3569 blocksize, le32_to_cpu(es->s_log_block_size));
3570 goto failed_mount;
3571 }
3572 if (le32_to_cpu(es->s_log_block_size) >
3573 (EXT4_MAX_BLOCK_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
3574 ext4_msg(sb, KERN_ERR,
3575 "Invalid log block size: %u",
3576 le32_to_cpu(es->s_log_block_size));
3569 goto failed_mount; 3577 goto failed_mount;
3570 } 3578 }
3571 3579
@@ -3697,6 +3705,13 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
3697 "block size (%d)", clustersize, blocksize); 3705 "block size (%d)", clustersize, blocksize);
3698 goto failed_mount; 3706 goto failed_mount;
3699 } 3707 }
3708 if (le32_to_cpu(es->s_log_cluster_size) >
3709 (EXT4_MAX_CLUSTER_LOG_SIZE - EXT4_MIN_BLOCK_LOG_SIZE)) {
3710 ext4_msg(sb, KERN_ERR,
3711 "Invalid log cluster size: %u",
3712 le32_to_cpu(es->s_log_cluster_size));
3713 goto failed_mount;
3714 }
3700 sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) - 3715 sbi->s_cluster_bits = le32_to_cpu(es->s_log_cluster_size) -
3701 le32_to_cpu(es->s_log_block_size); 3716 le32_to_cpu(es->s_log_block_size);
3702 sbi->s_clusters_per_group = 3717 sbi->s_clusters_per_group =
diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c
index 6a4d0e5418a1..096f79997f75 100644
--- a/fs/fuse/dir.c
+++ b/fs/fuse/dir.c
@@ -286,6 +286,11 @@ const struct dentry_operations fuse_dentry_operations = {
286 .d_release = fuse_dentry_release, 286 .d_release = fuse_dentry_release,
287}; 287};
288 288
289const struct dentry_operations fuse_root_dentry_operations = {
290 .d_init = fuse_dentry_init,
291 .d_release = fuse_dentry_release,
292};
293
289int fuse_valid_type(int m) 294int fuse_valid_type(int m)
290{ 295{
291 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) || 296 return S_ISREG(m) || S_ISDIR(m) || S_ISLNK(m) || S_ISCHR(m) ||
@@ -1734,8 +1739,6 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1734 * This should be done on write(), truncate() and chown(). 1739 * This should be done on write(), truncate() and chown().
1735 */ 1740 */
1736 if (!fc->handle_killpriv) { 1741 if (!fc->handle_killpriv) {
1737 int kill;
1738
1739 /* 1742 /*
1740 * ia_mode calculation may have used stale i_mode. 1743 * ia_mode calculation may have used stale i_mode.
1741 * Refresh and recalculate. 1744 * Refresh and recalculate.
@@ -1745,12 +1748,11 @@ static int fuse_setattr(struct dentry *entry, struct iattr *attr)
1745 return ret; 1748 return ret;
1746 1749
1747 attr->ia_mode = inode->i_mode; 1750 attr->ia_mode = inode->i_mode;
1748 kill = should_remove_suid(entry); 1751 if (inode->i_mode & S_ISUID) {
1749 if (kill & ATTR_KILL_SUID) {
1750 attr->ia_valid |= ATTR_MODE; 1752 attr->ia_valid |= ATTR_MODE;
1751 attr->ia_mode &= ~S_ISUID; 1753 attr->ia_mode &= ~S_ISUID;
1752 } 1754 }
1753 if (kill & ATTR_KILL_SGID) { 1755 if ((inode->i_mode & (S_ISGID | S_IXGRP)) == (S_ISGID | S_IXGRP)) {
1754 attr->ia_valid |= ATTR_MODE; 1756 attr->ia_valid |= ATTR_MODE;
1755 attr->ia_mode &= ~S_ISGID; 1757 attr->ia_mode &= ~S_ISGID;
1756 } 1758 }
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index abc66a6237fd..2401c5dabb2a 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -1985,6 +1985,10 @@ static int fuse_write_end(struct file *file, struct address_space *mapping,
1985{ 1985{
1986 struct inode *inode = page->mapping->host; 1986 struct inode *inode = page->mapping->host;
1987 1987
1988 /* Haven't copied anything? Skip zeroing, size extending, dirtying. */
1989 if (!copied)
1990 goto unlock;
1991
1988 if (!PageUptodate(page)) { 1992 if (!PageUptodate(page)) {
1989 /* Zero any unwritten bytes at the end of the page */ 1993 /* Zero any unwritten bytes at the end of the page */
1990 size_t endoff = (pos + copied) & ~PAGE_MASK; 1994 size_t endoff = (pos + copied) & ~PAGE_MASK;
@@ -1995,6 +1999,8 @@ static int fuse_write_end(struct file *file, struct address_space *mapping,
1995 1999
1996 fuse_write_update_size(inode, pos + copied); 2000 fuse_write_update_size(inode, pos + copied);
1997 set_page_dirty(page); 2001 set_page_dirty(page);
2002
2003unlock:
1998 unlock_page(page); 2004 unlock_page(page);
1999 put_page(page); 2005 put_page(page);
2000 2006
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 0dfbb136e59a..91307940c8ac 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -692,6 +692,7 @@ static inline u64 get_node_id(struct inode *inode)
692extern const struct file_operations fuse_dev_operations; 692extern const struct file_operations fuse_dev_operations;
693 693
694extern const struct dentry_operations fuse_dentry_operations; 694extern const struct dentry_operations fuse_dentry_operations;
695extern const struct dentry_operations fuse_root_dentry_operations;
695 696
696/** 697/**
697 * Inode to nodeid comparison. 698 * Inode to nodeid comparison.
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index 17141099f2e7..6fe6a88ecb4a 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -1131,10 +1131,11 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
1131 1131
1132 err = -ENOMEM; 1132 err = -ENOMEM;
1133 root = fuse_get_root_inode(sb, d.rootmode); 1133 root = fuse_get_root_inode(sb, d.rootmode);
1134 sb->s_d_op = &fuse_root_dentry_operations;
1134 root_dentry = d_make_root(root); 1135 root_dentry = d_make_root(root);
1135 if (!root_dentry) 1136 if (!root_dentry)
1136 goto err_dev_free; 1137 goto err_dev_free;
1137 /* only now - we want root dentry with NULL ->d_op */ 1138 /* Root dentry doesn't have .d_revalidate */
1138 sb->s_d_op = &fuse_dentry_operations; 1139 sb->s_d_op = &fuse_dentry_operations;
1139 1140
1140 init_req = fuse_request_alloc(0); 1141 init_req = fuse_request_alloc(0);
diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c
index 98b3eb7d8eaf..0ec137310320 100644
--- a/fs/isofs/rock.c
+++ b/fs/isofs/rock.c
@@ -377,9 +377,9 @@ repeat:
377 { 377 {
378 int p; 378 int p;
379 for (p = 0; p < rr->u.ER.len_id; p++) 379 for (p = 0; p < rr->u.ER.len_id; p++)
380 printk("%c", rr->u.ER.data[p]); 380 printk(KERN_CONT "%c", rr->u.ER.data[p]);
381 } 381 }
382 printk("\n"); 382 printk(KERN_CONT "\n");
383 break; 383 break;
384 case SIG('P', 'X'): 384 case SIG('P', 'X'):
385 inode->i_mode = isonum_733(rr->u.PX.mode); 385 inode->i_mode = isonum_733(rr->u.PX.mode);
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c
index 532d8e242d4d..484bebc20bca 100644
--- a/fs/nfs/callback.c
+++ b/fs/nfs/callback.c
@@ -197,7 +197,7 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
197 } 197 }
198 198
199 ret = -EPROTONOSUPPORT; 199 ret = -EPROTONOSUPPORT;
200 if (minorversion == 0) 200 if (!IS_ENABLED(CONFIG_NFS_V4_1) || minorversion == 0)
201 ret = nfs4_callback_up_net(serv, net); 201 ret = nfs4_callback_up_net(serv, net);
202 else if (xprt->ops->bc_up) 202 else if (xprt->ops->bc_up)
203 ret = xprt->ops->bc_up(serv, net); 203 ret = xprt->ops->bc_up(serv, net);
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index 7555ba889d1f..ebecfb8fba06 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -314,7 +314,8 @@ static struct nfs_client *nfs_match_client(const struct nfs_client_initdata *dat
314 /* Match the full socket address */ 314 /* Match the full socket address */
315 if (!rpc_cmp_addr_port(sap, clap)) 315 if (!rpc_cmp_addr_port(sap, clap))
316 /* Match all xprt_switch full socket addresses */ 316 /* Match all xprt_switch full socket addresses */
317 if (!rpc_clnt_xprt_switch_has_addr(clp->cl_rpcclient, 317 if (IS_ERR(clp->cl_rpcclient) ||
318 !rpc_clnt_xprt_switch_has_addr(clp->cl_rpcclient,
318 sap)) 319 sap))
319 continue; 320 continue;
320 321
diff --git a/fs/nfs/namespace.c b/fs/nfs/namespace.c
index c8162c660c44..5551e8ef67fd 100644
--- a/fs/nfs/namespace.c
+++ b/fs/nfs/namespace.c
@@ -98,7 +98,7 @@ rename_retry:
98 return end; 98 return end;
99 } 99 }
100 namelen = strlen(base); 100 namelen = strlen(base);
101 if (flags & NFS_PATH_CANONICAL) { 101 if (*end == '/') {
102 /* Strip off excess slashes in base string */ 102 /* Strip off excess slashes in base string */
103 while (namelen > 0 && base[namelen - 1] == '/') 103 while (namelen > 0 && base[namelen - 1] == '/')
104 namelen--; 104 namelen--;
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 9b3a82abab07..1452177c822d 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -542,6 +542,13 @@ static inline bool nfs4_valid_open_stateid(const struct nfs4_state *state)
542 return test_bit(NFS_STATE_RECOVERY_FAILED, &state->flags) == 0; 542 return test_bit(NFS_STATE_RECOVERY_FAILED, &state->flags) == 0;
543} 543}
544 544
545static inline bool nfs4_state_match_open_stateid_other(const struct nfs4_state *state,
546 const nfs4_stateid *stateid)
547{
548 return test_bit(NFS_OPEN_STATE, &state->flags) &&
549 nfs4_stateid_match_other(&state->open_stateid, stateid);
550}
551
545#else 552#else
546 553
547#define nfs4_close_state(a, b) do { } while (0) 554#define nfs4_close_state(a, b) do { } while (0)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 7897826d7c51..241da19b7da4 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1451,7 +1451,6 @@ static void nfs_resync_open_stateid_locked(struct nfs4_state *state)
1451} 1451}
1452 1452
1453static void nfs_clear_open_stateid_locked(struct nfs4_state *state, 1453static void nfs_clear_open_stateid_locked(struct nfs4_state *state,
1454 nfs4_stateid *arg_stateid,
1455 nfs4_stateid *stateid, fmode_t fmode) 1454 nfs4_stateid *stateid, fmode_t fmode)
1456{ 1455{
1457 clear_bit(NFS_O_RDWR_STATE, &state->flags); 1456 clear_bit(NFS_O_RDWR_STATE, &state->flags);
@@ -1469,10 +1468,9 @@ static void nfs_clear_open_stateid_locked(struct nfs4_state *state,
1469 } 1468 }
1470 if (stateid == NULL) 1469 if (stateid == NULL)
1471 return; 1470 return;
1472 /* Handle races with OPEN */ 1471 /* Handle OPEN+OPEN_DOWNGRADE races */
1473 if (!nfs4_stateid_match_other(arg_stateid, &state->open_stateid) || 1472 if (nfs4_stateid_match_other(stateid, &state->open_stateid) &&
1474 (nfs4_stateid_match_other(stateid, &state->open_stateid) && 1473 !nfs4_stateid_is_newer(stateid, &state->open_stateid)) {
1475 !nfs4_stateid_is_newer(stateid, &state->open_stateid))) {
1476 nfs_resync_open_stateid_locked(state); 1474 nfs_resync_open_stateid_locked(state);
1477 return; 1475 return;
1478 } 1476 }
@@ -1486,7 +1484,9 @@ static void nfs_clear_open_stateid(struct nfs4_state *state,
1486 nfs4_stateid *stateid, fmode_t fmode) 1484 nfs4_stateid *stateid, fmode_t fmode)
1487{ 1485{
1488 write_seqlock(&state->seqlock); 1486 write_seqlock(&state->seqlock);
1489 nfs_clear_open_stateid_locked(state, arg_stateid, stateid, fmode); 1487 /* Ignore, if the CLOSE argment doesn't match the current stateid */
1488 if (nfs4_state_match_open_stateid_other(state, arg_stateid))
1489 nfs_clear_open_stateid_locked(state, stateid, fmode);
1490 write_sequnlock(&state->seqlock); 1490 write_sequnlock(&state->seqlock);
1491 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags)) 1491 if (test_bit(NFS_STATE_RECLAIM_NOGRACE, &state->flags))
1492 nfs4_schedule_state_manager(state->owner->so_server->nfs_client); 1492 nfs4_schedule_state_manager(state->owner->so_server->nfs_client);
@@ -2564,15 +2564,23 @@ static void nfs41_check_delegation_stateid(struct nfs4_state *state)
2564static int nfs41_check_expired_locks(struct nfs4_state *state) 2564static int nfs41_check_expired_locks(struct nfs4_state *state)
2565{ 2565{
2566 int status, ret = NFS_OK; 2566 int status, ret = NFS_OK;
2567 struct nfs4_lock_state *lsp; 2567 struct nfs4_lock_state *lsp, *prev = NULL;
2568 struct nfs_server *server = NFS_SERVER(state->inode); 2568 struct nfs_server *server = NFS_SERVER(state->inode);
2569 2569
2570 if (!test_bit(LK_STATE_IN_USE, &state->flags)) 2570 if (!test_bit(LK_STATE_IN_USE, &state->flags))
2571 goto out; 2571 goto out;
2572
2573 spin_lock(&state->state_lock);
2572 list_for_each_entry(lsp, &state->lock_states, ls_locks) { 2574 list_for_each_entry(lsp, &state->lock_states, ls_locks) {
2573 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) { 2575 if (test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags)) {
2574 struct rpc_cred *cred = lsp->ls_state->owner->so_cred; 2576 struct rpc_cred *cred = lsp->ls_state->owner->so_cred;
2575 2577
2578 atomic_inc(&lsp->ls_count);
2579 spin_unlock(&state->state_lock);
2580
2581 nfs4_put_lock_state(prev);
2582 prev = lsp;
2583
2576 status = nfs41_test_and_free_expired_stateid(server, 2584 status = nfs41_test_and_free_expired_stateid(server,
2577 &lsp->ls_stateid, 2585 &lsp->ls_stateid,
2578 cred); 2586 cred);
@@ -2585,10 +2593,14 @@ static int nfs41_check_expired_locks(struct nfs4_state *state)
2585 set_bit(NFS_LOCK_LOST, &lsp->ls_flags); 2593 set_bit(NFS_LOCK_LOST, &lsp->ls_flags);
2586 } else if (status != NFS_OK) { 2594 } else if (status != NFS_OK) {
2587 ret = status; 2595 ret = status;
2588 break; 2596 nfs4_put_lock_state(prev);
2597 goto out;
2589 } 2598 }
2599 spin_lock(&state->state_lock);
2590 } 2600 }
2591 }; 2601 }
2602 spin_unlock(&state->state_lock);
2603 nfs4_put_lock_state(prev);
2592out: 2604out:
2593 return ret; 2605 return ret;
2594} 2606}
@@ -3122,7 +3134,8 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
3122 } else if (is_rdwr) 3134 } else if (is_rdwr)
3123 calldata->arg.fmode |= FMODE_READ|FMODE_WRITE; 3135 calldata->arg.fmode |= FMODE_READ|FMODE_WRITE;
3124 3136
3125 if (!nfs4_valid_open_stateid(state)) 3137 if (!nfs4_valid_open_stateid(state) ||
3138 test_bit(NFS_OPEN_STATE, &state->flags) == 0)
3126 call_close = 0; 3139 call_close = 0;
3127 spin_unlock(&state->owner->so_lock); 3140 spin_unlock(&state->owner->so_lock);
3128 3141
@@ -5569,6 +5582,7 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
5569 switch (task->tk_status) { 5582 switch (task->tk_status) {
5570 case 0: 5583 case 0:
5571 renew_lease(data->res.server, data->timestamp); 5584 renew_lease(data->res.server, data->timestamp);
5585 break;
5572 case -NFS4ERR_ADMIN_REVOKED: 5586 case -NFS4ERR_ADMIN_REVOKED:
5573 case -NFS4ERR_DELEG_REVOKED: 5587 case -NFS4ERR_DELEG_REVOKED:
5574 case -NFS4ERR_EXPIRED: 5588 case -NFS4ERR_EXPIRED:
@@ -5579,8 +5593,6 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
5579 case -NFS4ERR_OLD_STATEID: 5593 case -NFS4ERR_OLD_STATEID:
5580 case -NFS4ERR_STALE_STATEID: 5594 case -NFS4ERR_STALE_STATEID:
5581 task->tk_status = 0; 5595 task->tk_status = 0;
5582 if (data->roc)
5583 pnfs_roc_set_barrier(data->inode, data->roc_barrier);
5584 break; 5596 break;
5585 default: 5597 default:
5586 if (nfs4_async_handle_error(task, data->res.server, 5598 if (nfs4_async_handle_error(task, data->res.server,
@@ -5590,6 +5602,8 @@ static void nfs4_delegreturn_done(struct rpc_task *task, void *calldata)
5590 } 5602 }
5591 } 5603 }
5592 data->rpc_status = task->tk_status; 5604 data->rpc_status = task->tk_status;
5605 if (data->roc && data->rpc_status == 0)
5606 pnfs_roc_set_barrier(data->inode, data->roc_barrier);
5593} 5607}
5594 5608
5595static void nfs4_delegreturn_release(void *calldata) 5609static void nfs4_delegreturn_release(void *calldata)
diff --git a/fs/nfs/nfs4session.c b/fs/nfs/nfs4session.c
index b62973045a3e..a61350f75c74 100644
--- a/fs/nfs/nfs4session.c
+++ b/fs/nfs/nfs4session.c
@@ -178,12 +178,14 @@ static int nfs4_slot_get_seqid(struct nfs4_slot_table *tbl, u32 slotid,
178 __must_hold(&tbl->slot_tbl_lock) 178 __must_hold(&tbl->slot_tbl_lock)
179{ 179{
180 struct nfs4_slot *slot; 180 struct nfs4_slot *slot;
181 int ret;
181 182
182 slot = nfs4_lookup_slot(tbl, slotid); 183 slot = nfs4_lookup_slot(tbl, slotid);
183 if (IS_ERR(slot)) 184 ret = PTR_ERR_OR_ZERO(slot);
184 return PTR_ERR(slot); 185 if (!ret)
185 *seq_nr = slot->seq_nr; 186 *seq_nr = slot->seq_nr;
186 return 0; 187
188 return ret;
187} 189}
188 190
189/* 191/*
@@ -196,7 +198,7 @@ static int nfs4_slot_get_seqid(struct nfs4_slot_table *tbl, u32 slotid,
196static bool nfs4_slot_seqid_in_use(struct nfs4_slot_table *tbl, 198static bool nfs4_slot_seqid_in_use(struct nfs4_slot_table *tbl,
197 u32 slotid, u32 seq_nr) 199 u32 slotid, u32 seq_nr)
198{ 200{
199 u32 cur_seq; 201 u32 cur_seq = 0;
200 bool ret = false; 202 bool ret = false;
201 203
202 spin_lock(&tbl->slot_tbl_lock); 204 spin_lock(&tbl->slot_tbl_lock);
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
index 5f4281ec5f72..0959c9661662 100644
--- a/fs/nfs/nfs4state.c
+++ b/fs/nfs/nfs4state.c
@@ -1547,6 +1547,7 @@ restart:
1547 ssleep(1); 1547 ssleep(1);
1548 case -NFS4ERR_ADMIN_REVOKED: 1548 case -NFS4ERR_ADMIN_REVOKED:
1549 case -NFS4ERR_STALE_STATEID: 1549 case -NFS4ERR_STALE_STATEID:
1550 case -NFS4ERR_OLD_STATEID:
1550 case -NFS4ERR_BAD_STATEID: 1551 case -NFS4ERR_BAD_STATEID:
1551 case -NFS4ERR_RECLAIM_BAD: 1552 case -NFS4ERR_RECLAIM_BAD:
1552 case -NFS4ERR_RECLAIM_CONFLICT: 1553 case -NFS4ERR_RECLAIM_CONFLICT:
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index 56b2d96f9103..259ef85f435a 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -146,6 +146,8 @@ set_pnfs_layoutdriver(struct nfs_server *server, const struct nfs_fh *mntfh,
146 u32 id; 146 u32 id;
147 int i; 147 int i;
148 148
149 if (fsinfo->nlayouttypes == 0)
150 goto out_no_driver;
149 if (!(server->nfs_client->cl_exchange_flags & 151 if (!(server->nfs_client->cl_exchange_flags &
150 (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) { 152 (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) {
151 printk(KERN_ERR "NFS: %s: cl_exchange_flags 0x%x\n", 153 printk(KERN_ERR "NFS: %s: cl_exchange_flags 0x%x\n",
diff --git a/fs/ntfs/dir.c b/fs/ntfs/dir.c
index a18613579001..0ee19ecc982d 100644
--- a/fs/ntfs/dir.c
+++ b/fs/ntfs/dir.c
@@ -1544,8 +1544,6 @@ const struct file_operations ntfs_dir_ops = {
1544 .iterate = ntfs_readdir, /* Read directory contents. */ 1544 .iterate = ntfs_readdir, /* Read directory contents. */
1545#ifdef NTFS_RW 1545#ifdef NTFS_RW
1546 .fsync = ntfs_dir_fsync, /* Sync a directory to disk. */ 1546 .fsync = ntfs_dir_fsync, /* Sync a directory to disk. */
1547 /*.aio_fsync = ,*/ /* Sync all outstanding async
1548 i/o operations on a kiocb. */
1549#endif /* NTFS_RW */ 1547#endif /* NTFS_RW */
1550 /*.ioctl = ,*/ /* Perform function on the 1548 /*.ioctl = ,*/ /* Perform function on the
1551 mounted filesystem. */ 1549 mounted filesystem. */
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c
index e7054e2ac922..3ecb9f337b7d 100644
--- a/fs/ocfs2/dir.c
+++ b/fs/ocfs2/dir.c
@@ -3699,7 +3699,7 @@ static void ocfs2_dx_dir_transfer_leaf(struct inode *dir, u32 split_hash,
3699static int ocfs2_dx_dir_rebalance_credits(struct ocfs2_super *osb, 3699static int ocfs2_dx_dir_rebalance_credits(struct ocfs2_super *osb,
3700 struct ocfs2_dx_root_block *dx_root) 3700 struct ocfs2_dx_root_block *dx_root)
3701{ 3701{
3702 int credits = ocfs2_clusters_to_blocks(osb->sb, 2); 3702 int credits = ocfs2_clusters_to_blocks(osb->sb, 3);
3703 3703
3704 credits += ocfs2_calc_extend_credits(osb->sb, &dx_root->dr_list); 3704 credits += ocfs2_calc_extend_credits(osb->sb, &dx_root->dr_list);
3705 credits += ocfs2_quota_trans_credits(osb->sb); 3705 credits += ocfs2_quota_trans_credits(osb->sb);
diff --git a/fs/orangefs/orangefs-debugfs.c b/fs/orangefs/orangefs-debugfs.c
index eb09aa026723..38887cc5577f 100644
--- a/fs/orangefs/orangefs-debugfs.c
+++ b/fs/orangefs/orangefs-debugfs.c
@@ -114,6 +114,7 @@ static const struct seq_operations help_debug_ops = {
114}; 114};
115 115
116const struct file_operations debug_help_fops = { 116const struct file_operations debug_help_fops = {
117 .owner = THIS_MODULE,
117 .open = orangefs_debug_help_open, 118 .open = orangefs_debug_help_open,
118 .read = seq_read, 119 .read = seq_read,
119 .release = seq_release, 120 .release = seq_release,
@@ -121,6 +122,7 @@ const struct file_operations debug_help_fops = {
121}; 122};
122 123
123static const struct file_operations kernel_debug_fops = { 124static const struct file_operations kernel_debug_fops = {
125 .owner = THIS_MODULE,
124 .open = orangefs_debug_open, 126 .open = orangefs_debug_open,
125 .read = orangefs_debug_read, 127 .read = orangefs_debug_read,
126 .write = orangefs_debug_write, 128 .write = orangefs_debug_write,
@@ -141,6 +143,9 @@ static struct client_debug_mask client_debug_mask;
141 */ 143 */
142static DEFINE_MUTEX(orangefs_debug_lock); 144static DEFINE_MUTEX(orangefs_debug_lock);
143 145
146/* Used to protect data in ORANGEFS_KMOD_DEBUG_HELP_FILE */
147static DEFINE_MUTEX(orangefs_help_file_lock);
148
144/* 149/*
145 * initialize kmod debug operations, create orangefs debugfs dir and 150 * initialize kmod debug operations, create orangefs debugfs dir and
146 * ORANGEFS_KMOD_DEBUG_HELP_FILE. 151 * ORANGEFS_KMOD_DEBUG_HELP_FILE.
@@ -289,6 +294,8 @@ static void *help_start(struct seq_file *m, loff_t *pos)
289 294
290 gossip_debug(GOSSIP_DEBUGFS_DEBUG, "help_start: start\n"); 295 gossip_debug(GOSSIP_DEBUGFS_DEBUG, "help_start: start\n");
291 296
297 mutex_lock(&orangefs_help_file_lock);
298
292 if (*pos == 0) 299 if (*pos == 0)
293 payload = m->private; 300 payload = m->private;
294 301
@@ -305,6 +312,7 @@ static void *help_next(struct seq_file *m, void *v, loff_t *pos)
305static void help_stop(struct seq_file *m, void *p) 312static void help_stop(struct seq_file *m, void *p)
306{ 313{
307 gossip_debug(GOSSIP_DEBUGFS_DEBUG, "help_stop: start\n"); 314 gossip_debug(GOSSIP_DEBUGFS_DEBUG, "help_stop: start\n");
315 mutex_unlock(&orangefs_help_file_lock);
308} 316}
309 317
310static int help_show(struct seq_file *m, void *v) 318static int help_show(struct seq_file *m, void *v)
@@ -610,32 +618,54 @@ out:
610 * /sys/kernel/debug/orangefs/debug-help can be catted to 618 * /sys/kernel/debug/orangefs/debug-help can be catted to
611 * see all the available kernel and client debug keywords. 619 * see all the available kernel and client debug keywords.
612 * 620 *
613 * When the kernel boots, we have no idea what keywords the 621 * When orangefs.ko initializes, we have no idea what keywords the
614 * client supports, nor their associated masks. 622 * client supports, nor their associated masks.
615 * 623 *
616 * We pass through this function once at boot and stamp a 624 * We pass through this function once at module-load and stamp a
617 * boilerplate "we don't know" message for the client in the 625 * boilerplate "we don't know" message for the client in the
618 * debug-help file. We pass through here again when the client 626 * debug-help file. We pass through here again when the client
619 * starts and then we can fill out the debug-help file fully. 627 * starts and then we can fill out the debug-help file fully.
620 * 628 *
621 * The client might be restarted any number of times between 629 * The client might be restarted any number of times between
622 * reboots, we only build the debug-help file the first time. 630 * module reloads, we only build the debug-help file the first time.
623 */ 631 */
624int orangefs_prepare_debugfs_help_string(int at_boot) 632int orangefs_prepare_debugfs_help_string(int at_boot)
625{ 633{
626 int rc = -EINVAL;
627 int i;
628 int byte_count = 0;
629 char *client_title = "Client Debug Keywords:\n"; 634 char *client_title = "Client Debug Keywords:\n";
630 char *kernel_title = "Kernel Debug Keywords:\n"; 635 char *kernel_title = "Kernel Debug Keywords:\n";
636 size_t string_size = DEBUG_HELP_STRING_SIZE;
637 size_t result_size;
638 size_t i;
639 char *new;
640 int rc = -EINVAL;
631 641
632 gossip_debug(GOSSIP_UTILS_DEBUG, "%s: start\n", __func__); 642 gossip_debug(GOSSIP_UTILS_DEBUG, "%s: start\n", __func__);
633 643
634 if (at_boot) { 644 if (at_boot)
635 byte_count += strlen(HELP_STRING_UNINITIALIZED);
636 client_title = HELP_STRING_UNINITIALIZED; 645 client_title = HELP_STRING_UNINITIALIZED;
637 } else { 646
638 /* 647 /* build a new debug_help_string. */
648 new = kzalloc(DEBUG_HELP_STRING_SIZE, GFP_KERNEL);
649 if (!new) {
650 rc = -ENOMEM;
651 goto out;
652 }
653
654 /*
655 * strlcat(dst, src, size) will append at most
656 * "size - strlen(dst) - 1" bytes of src onto dst,
657 * null terminating the result, and return the total
658 * length of the string it tried to create.
659 *
660 * We'll just plow through here building our new debug
661 * help string and let strlcat take care of assuring that
662 * dst doesn't overflow.
663 */
664 strlcat(new, client_title, string_size);
665
666 if (!at_boot) {
667
668 /*
639 * fill the client keyword/mask array and remember 669 * fill the client keyword/mask array and remember
640 * how many elements there were. 670 * how many elements there were.
641 */ 671 */
@@ -644,64 +674,40 @@ int orangefs_prepare_debugfs_help_string(int at_boot)
644 if (cdm_element_count <= 0) 674 if (cdm_element_count <= 0)
645 goto out; 675 goto out;
646 676
647 /* Count the bytes destined for debug_help_string. */
648 byte_count += strlen(client_title);
649
650 for (i = 0; i < cdm_element_count; i++) { 677 for (i = 0; i < cdm_element_count; i++) {
651 byte_count += strlen(cdm_array[i].keyword + 2); 678 strlcat(new, "\t", string_size);
652 if (byte_count >= DEBUG_HELP_STRING_SIZE) { 679 strlcat(new, cdm_array[i].keyword, string_size);
653 pr_info("%s: overflow 1!\n", __func__); 680 strlcat(new, "\n", string_size);
654 goto out;
655 }
656 } 681 }
657
658 gossip_debug(GOSSIP_UTILS_DEBUG,
659 "%s: cdm_element_count:%d:\n",
660 __func__,
661 cdm_element_count);
662 } 682 }
663 683
664 byte_count += strlen(kernel_title); 684 strlcat(new, "\n", string_size);
685 strlcat(new, kernel_title, string_size);
686
665 for (i = 0; i < num_kmod_keyword_mask_map; i++) { 687 for (i = 0; i < num_kmod_keyword_mask_map; i++) {
666 byte_count += 688 strlcat(new, "\t", string_size);
667 strlen(s_kmod_keyword_mask_map[i].keyword + 2); 689 strlcat(new, s_kmod_keyword_mask_map[i].keyword, string_size);
668 if (byte_count >= DEBUG_HELP_STRING_SIZE) { 690 result_size = strlcat(new, "\n", string_size);
669 pr_info("%s: overflow 2!\n", __func__);
670 goto out;
671 }
672 } 691 }
673 692
674 /* build debug_help_string. */ 693 /* See if we tried to put too many bytes into "new"... */
675 debug_help_string = kzalloc(DEBUG_HELP_STRING_SIZE, GFP_KERNEL); 694 if (result_size >= string_size) {
676 if (!debug_help_string) { 695 kfree(new);
677 rc = -ENOMEM;
678 goto out; 696 goto out;
679 } 697 }
680 698
681 strcat(debug_help_string, client_title); 699 if (at_boot) {
682 700 debug_help_string = new;
683 if (!at_boot) { 701 } else {
684 for (i = 0; i < cdm_element_count; i++) { 702 mutex_lock(&orangefs_help_file_lock);
685 strcat(debug_help_string, "\t"); 703 memset(debug_help_string, 0, DEBUG_HELP_STRING_SIZE);
686 strcat(debug_help_string, cdm_array[i].keyword); 704 strlcat(debug_help_string, new, string_size);
687 strcat(debug_help_string, "\n"); 705 mutex_unlock(&orangefs_help_file_lock);
688 }
689 }
690
691 strcat(debug_help_string, "\n");
692 strcat(debug_help_string, kernel_title);
693
694 for (i = 0; i < num_kmod_keyword_mask_map; i++) {
695 strcat(debug_help_string, "\t");
696 strcat(debug_help_string, s_kmod_keyword_mask_map[i].keyword);
697 strcat(debug_help_string, "\n");
698 } 706 }
699 707
700 rc = 0; 708 rc = 0;
701 709
702out: 710out: return rc;
703
704 return rc;
705 711
706} 712}
707 713
@@ -959,8 +965,12 @@ int orangefs_debugfs_new_client_string(void __user *arg)
959 ret = copy_from_user(&client_debug_array_string, 965 ret = copy_from_user(&client_debug_array_string,
960 (void __user *)arg, 966 (void __user *)arg,
961 ORANGEFS_MAX_DEBUG_STRING_LEN); 967 ORANGEFS_MAX_DEBUG_STRING_LEN);
962 if (ret != 0) 968
969 if (ret != 0) {
970 pr_info("%s: CLIENT_STRING: copy_from_user failed\n",
971 __func__);
963 return -EIO; 972 return -EIO;
973 }
964 974
965 /* 975 /*
966 * The real client-core makes an effort to ensure 976 * The real client-core makes an effort to ensure
@@ -975,45 +985,18 @@ int orangefs_debugfs_new_client_string(void __user *arg)
975 client_debug_array_string[ORANGEFS_MAX_DEBUG_STRING_LEN - 1] = 985 client_debug_array_string[ORANGEFS_MAX_DEBUG_STRING_LEN - 1] =
976 '\0'; 986 '\0';
977 987
978 if (ret != 0) {
979 pr_info("%s: CLIENT_STRING: copy_from_user failed\n",
980 __func__);
981 return -EIO;
982 }
983
984 pr_info("%s: client debug array string has been received.\n", 988 pr_info("%s: client debug array string has been received.\n",
985 __func__); 989 __func__);
986 990
987 if (!help_string_initialized) { 991 if (!help_string_initialized) {
988 992
989 /* Free the "we don't know yet" default string... */ 993 /* Build a proper debug help string. */
990 kfree(debug_help_string);
991
992 /* build a proper debug help string */
993 if (orangefs_prepare_debugfs_help_string(0)) { 994 if (orangefs_prepare_debugfs_help_string(0)) {
994 gossip_err("%s: no debug help string \n", 995 gossip_err("%s: no debug help string \n",
995 __func__); 996 __func__);
996 return -EIO; 997 return -EIO;
997 } 998 }
998 999
999 /* Replace the boilerplate boot-time debug-help file. */
1000 debugfs_remove(help_file_dentry);
1001
1002 help_file_dentry =
1003 debugfs_create_file(
1004 ORANGEFS_KMOD_DEBUG_HELP_FILE,
1005 0444,
1006 debug_dir,
1007 debug_help_string,
1008 &debug_help_fops);
1009
1010 if (!help_file_dentry) {
1011 gossip_err("%s: debugfs_create_file failed for"
1012 " :%s:!\n",
1013 __func__,
1014 ORANGEFS_KMOD_DEBUG_HELP_FILE);
1015 return -EIO;
1016 }
1017 } 1000 }
1018 1001
1019 debug_mask_to_string(&client_debug_mask, 1); 1002 debug_mask_to_string(&client_debug_mask, 1);
diff --git a/fs/orangefs/orangefs-mod.c b/fs/orangefs/orangefs-mod.c
index 2e5b03065f34..4113eb0495bf 100644
--- a/fs/orangefs/orangefs-mod.c
+++ b/fs/orangefs/orangefs-mod.c
@@ -124,7 +124,7 @@ static int __init orangefs_init(void)
124 * unknown at boot time. 124 * unknown at boot time.
125 * 125 *
126 * orangefs_prepare_debugfs_help_string will be used again 126 * orangefs_prepare_debugfs_help_string will be used again
127 * later to rebuild the debug-help file after the client starts 127 * later to rebuild the debug-help-string after the client starts
128 * and passes along the needed info. The argument signifies 128 * and passes along the needed info. The argument signifies
129 * which time orangefs_prepare_debugfs_help_string is being 129 * which time orangefs_prepare_debugfs_help_string is being
130 * called. 130 * called.
@@ -152,7 +152,9 @@ static int __init orangefs_init(void)
152 152
153 ret = register_filesystem(&orangefs_fs_type); 153 ret = register_filesystem(&orangefs_fs_type);
154 if (ret == 0) { 154 if (ret == 0) {
155 pr_info("orangefs: module version %s loaded\n", ORANGEFS_VERSION); 155 pr_info("%s: module version %s loaded\n",
156 __func__,
157 ORANGEFS_VERSION);
156 ret = 0; 158 ret = 0;
157 goto out; 159 goto out;
158 } 160 }
diff --git a/fs/overlayfs/super.c b/fs/overlayfs/super.c
index edd46a0e951d..0e100856c7b8 100644
--- a/fs/overlayfs/super.c
+++ b/fs/overlayfs/super.c
@@ -328,11 +328,11 @@ static struct dentry *ovl_d_real(struct dentry *dentry,
328 if (!real) 328 if (!real)
329 goto bug; 329 goto bug;
330 330
331 /* Handle recursion */
332 real = d_real(real, inode, open_flags);
333
331 if (!inode || inode == d_inode(real)) 334 if (!inode || inode == d_inode(real))
332 return real; 335 return real;
333
334 /* Handle recursion */
335 return d_real(real, inode, open_flags);
336bug: 336bug:
337 WARN(1, "ovl_d_real(%pd4, %s:%lu): real dentry not found\n", dentry, 337 WARN(1, "ovl_d_real(%pd4, %s:%lu): real dentry not found\n", dentry,
338 inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0); 338 inode ? inode->i_sb->s_id : "NULL", inode ? inode->i_ino : 0);
diff --git a/fs/splice.c b/fs/splice.c
index 153d4f3bd441..5a7750bd2eea 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -299,13 +299,8 @@ ssize_t generic_file_splice_read(struct file *in, loff_t *ppos,
299{ 299{
300 struct iov_iter to; 300 struct iov_iter to;
301 struct kiocb kiocb; 301 struct kiocb kiocb;
302 loff_t isize;
303 int idx, ret; 302 int idx, ret;
304 303
305 isize = i_size_read(in->f_mapping->host);
306 if (unlikely(*ppos >= isize))
307 return 0;
308
309 iov_iter_pipe(&to, ITER_PIPE | READ, pipe, len); 304 iov_iter_pipe(&to, ITER_PIPE | READ, pipe, len);
310 idx = to.idx; 305 idx = to.idx;
311 init_sync_kiocb(&kiocb, in); 306 init_sync_kiocb(&kiocb, in);
@@ -413,7 +408,8 @@ static ssize_t default_file_splice_read(struct file *in, loff_t *ppos,
413 if (res <= 0) 408 if (res <= 0)
414 return -ENOMEM; 409 return -ENOMEM;
415 410
416 nr_pages = res / PAGE_SIZE; 411 BUG_ON(dummy);
412 nr_pages = DIV_ROUND_UP(res, PAGE_SIZE);
417 413
418 vec = __vec; 414 vec = __vec;
419 if (nr_pages > PIPE_DEF_BUFFERS) { 415 if (nr_pages > PIPE_DEF_BUFFERS) {
diff --git a/fs/xattr.c b/fs/xattr.c
index 3368659c471e..2d13b4e62fae 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -170,7 +170,7 @@ int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
170 const void *value, size_t size, int flags) 170 const void *value, size_t size, int flags)
171{ 171{
172 struct inode *inode = dentry->d_inode; 172 struct inode *inode = dentry->d_inode;
173 int error = -EOPNOTSUPP; 173 int error = -EAGAIN;
174 int issec = !strncmp(name, XATTR_SECURITY_PREFIX, 174 int issec = !strncmp(name, XATTR_SECURITY_PREFIX,
175 XATTR_SECURITY_PREFIX_LEN); 175 XATTR_SECURITY_PREFIX_LEN);
176 176
@@ -183,15 +183,21 @@ int __vfs_setxattr_noperm(struct dentry *dentry, const char *name,
183 security_inode_post_setxattr(dentry, name, value, 183 security_inode_post_setxattr(dentry, name, value,
184 size, flags); 184 size, flags);
185 } 185 }
186 } else if (issec) { 186 } else {
187 const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
188
189 if (unlikely(is_bad_inode(inode))) 187 if (unlikely(is_bad_inode(inode)))
190 return -EIO; 188 return -EIO;
191 error = security_inode_setsecurity(inode, suffix, value, 189 }
192 size, flags); 190 if (error == -EAGAIN) {
193 if (!error) 191 error = -EOPNOTSUPP;
194 fsnotify_xattr(dentry); 192
193 if (issec) {
194 const char *suffix = name + XATTR_SECURITY_PREFIX_LEN;
195
196 error = security_inode_setsecurity(inode, suffix, value,
197 size, flags);
198 if (!error)
199 fsnotify_xattr(dentry);
200 }
195 } 201 }
196 202
197 return error; 203 return error;
diff --git a/fs/xfs/libxfs/xfs_defer.c b/fs/xfs/libxfs/xfs_defer.c
index 613c5cf19436..5c2929f94bd3 100644
--- a/fs/xfs/libxfs/xfs_defer.c
+++ b/fs/xfs/libxfs/xfs_defer.c
@@ -199,9 +199,9 @@ xfs_defer_intake_work(
199 struct xfs_defer_pending *dfp; 199 struct xfs_defer_pending *dfp;
200 200
201 list_for_each_entry(dfp, &dop->dop_intake, dfp_list) { 201 list_for_each_entry(dfp, &dop->dop_intake, dfp_list) {
202 trace_xfs_defer_intake_work(tp->t_mountp, dfp);
203 dfp->dfp_intent = dfp->dfp_type->create_intent(tp, 202 dfp->dfp_intent = dfp->dfp_type->create_intent(tp,
204 dfp->dfp_count); 203 dfp->dfp_count);
204 trace_xfs_defer_intake_work(tp->t_mountp, dfp);
205 list_sort(tp->t_mountp, &dfp->dfp_work, 205 list_sort(tp->t_mountp, &dfp->dfp_work,
206 dfp->dfp_type->diff_items); 206 dfp->dfp_type->diff_items);
207 list_for_each(li, &dfp->dfp_work) 207 list_for_each(li, &dfp->dfp_work)
@@ -221,21 +221,14 @@ xfs_defer_trans_abort(
221 struct xfs_defer_pending *dfp; 221 struct xfs_defer_pending *dfp;
222 222
223 trace_xfs_defer_trans_abort(tp->t_mountp, dop); 223 trace_xfs_defer_trans_abort(tp->t_mountp, dop);
224 /*
225 * If the transaction was committed, drop the intent reference
226 * since we're bailing out of here. The other reference is
227 * dropped when the intent hits the AIL. If the transaction
228 * was not committed, the intent is freed by the intent item
229 * unlock handler on abort.
230 */
231 if (!dop->dop_committed)
232 return;
233 224
234 /* Abort intent items. */ 225 /* Abort intent items that don't have a done item. */
235 list_for_each_entry(dfp, &dop->dop_pending, dfp_list) { 226 list_for_each_entry(dfp, &dop->dop_pending, dfp_list) {
236 trace_xfs_defer_pending_abort(tp->t_mountp, dfp); 227 trace_xfs_defer_pending_abort(tp->t_mountp, dfp);
237 if (!dfp->dfp_done) 228 if (dfp->dfp_intent && !dfp->dfp_done) {
238 dfp->dfp_type->abort_intent(dfp->dfp_intent); 229 dfp->dfp_type->abort_intent(dfp->dfp_intent);
230 dfp->dfp_intent = NULL;
231 }
239 } 232 }
240 233
241 /* Shut down FS. */ 234 /* Shut down FS. */
diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h
index 1b949e08015c..c19700e2a2fe 100644
--- a/include/acpi/actbl.h
+++ b/include/acpi/actbl.h
@@ -230,72 +230,62 @@ struct acpi_table_facs {
230/* Fields common to all versions of the FADT */ 230/* Fields common to all versions of the FADT */
231 231
232struct acpi_table_fadt { 232struct acpi_table_fadt {
233 struct acpi_table_header header; /* [V1] Common ACPI table header */ 233 struct acpi_table_header header; /* Common ACPI table header */
234 u32 facs; /* [V1] 32-bit physical address of FACS */ 234 u32 facs; /* 32-bit physical address of FACS */
235 u32 dsdt; /* [V1] 32-bit physical address of DSDT */ 235 u32 dsdt; /* 32-bit physical address of DSDT */
236 u8 model; /* [V1] System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */ 236 u8 model; /* System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */
237 u8 preferred_profile; /* [V1] Conveys preferred power management profile to OSPM. */ 237 u8 preferred_profile; /* Conveys preferred power management profile to OSPM. */
238 u16 sci_interrupt; /* [V1] System vector of SCI interrupt */ 238 u16 sci_interrupt; /* System vector of SCI interrupt */
239 u32 smi_command; /* [V1] 32-bit Port address of SMI command port */ 239 u32 smi_command; /* 32-bit Port address of SMI command port */
240 u8 acpi_enable; /* [V1] Value to write to SMI_CMD to enable ACPI */ 240 u8 acpi_enable; /* Value to write to SMI_CMD to enable ACPI */
241 u8 acpi_disable; /* [V1] Value to write to SMI_CMD to disable ACPI */ 241 u8 acpi_disable; /* Value to write to SMI_CMD to disable ACPI */
242 u8 s4_bios_request; /* [V1] Value to write to SMI_CMD to enter S4BIOS state */ 242 u8 s4_bios_request; /* Value to write to SMI_CMD to enter S4BIOS state */
243 u8 pstate_control; /* [V1] Processor performance state control */ 243 u8 pstate_control; /* Processor performance state control */
244 u32 pm1a_event_block; /* [V1] 32-bit port address of Power Mgt 1a Event Reg Blk */ 244 u32 pm1a_event_block; /* 32-bit port address of Power Mgt 1a Event Reg Blk */
245 u32 pm1b_event_block; /* [V1] 32-bit port address of Power Mgt 1b Event Reg Blk */ 245 u32 pm1b_event_block; /* 32-bit port address of Power Mgt 1b Event Reg Blk */
246 u32 pm1a_control_block; /* [V1] 32-bit port address of Power Mgt 1a Control Reg Blk */ 246 u32 pm1a_control_block; /* 32-bit port address of Power Mgt 1a Control Reg Blk */
247 u32 pm1b_control_block; /* [V1] 32-bit port address of Power Mgt 1b Control Reg Blk */ 247 u32 pm1b_control_block; /* 32-bit port address of Power Mgt 1b Control Reg Blk */
248 u32 pm2_control_block; /* [V1] 32-bit port address of Power Mgt 2 Control Reg Blk */ 248 u32 pm2_control_block; /* 32-bit port address of Power Mgt 2 Control Reg Blk */
249 u32 pm_timer_block; /* [V1] 32-bit port address of Power Mgt Timer Ctrl Reg Blk */ 249 u32 pm_timer_block; /* 32-bit port address of Power Mgt Timer Ctrl Reg Blk */
250 u32 gpe0_block; /* [V1] 32-bit port address of General Purpose Event 0 Reg Blk */ 250 u32 gpe0_block; /* 32-bit port address of General Purpose Event 0 Reg Blk */
251 u32 gpe1_block; /* [V1] 32-bit port address of General Purpose Event 1 Reg Blk */ 251 u32 gpe1_block; /* 32-bit port address of General Purpose Event 1 Reg Blk */
252 u8 pm1_event_length; /* [V1] Byte Length of ports at pm1x_event_block */ 252 u8 pm1_event_length; /* Byte Length of ports at pm1x_event_block */
253 u8 pm1_control_length; /* [V1] Byte Length of ports at pm1x_control_block */ 253 u8 pm1_control_length; /* Byte Length of ports at pm1x_control_block */
254 u8 pm2_control_length; /* [V1] Byte Length of ports at pm2_control_block */ 254 u8 pm2_control_length; /* Byte Length of ports at pm2_control_block */
255 u8 pm_timer_length; /* [V1] Byte Length of ports at pm_timer_block */ 255 u8 pm_timer_length; /* Byte Length of ports at pm_timer_block */
256 u8 gpe0_block_length; /* [V1] Byte Length of ports at gpe0_block */ 256 u8 gpe0_block_length; /* Byte Length of ports at gpe0_block */
257 u8 gpe1_block_length; /* [V1] Byte Length of ports at gpe1_block */ 257 u8 gpe1_block_length; /* Byte Length of ports at gpe1_block */
258 u8 gpe1_base; /* [V1] Offset in GPE number space where GPE1 events start */ 258 u8 gpe1_base; /* Offset in GPE number space where GPE1 events start */
259 u8 cst_control; /* [V1] Support for the _CST object and C-States change notification */ 259 u8 cst_control; /* Support for the _CST object and C-States change notification */
260 u16 c2_latency; /* [V1] Worst case HW latency to enter/exit C2 state */ 260 u16 c2_latency; /* Worst case HW latency to enter/exit C2 state */
261 u16 c3_latency; /* [V1] Worst case HW latency to enter/exit C3 state */ 261 u16 c3_latency; /* Worst case HW latency to enter/exit C3 state */
262 u16 flush_size; /* [V1] Processor memory cache line width, in bytes */ 262 u16 flush_size; /* Processor memory cache line width, in bytes */
263 u16 flush_stride; /* [V1] Number of flush strides that need to be read */ 263 u16 flush_stride; /* Number of flush strides that need to be read */
264 u8 duty_offset; /* [V1] Processor duty cycle index in processor P_CNT reg */ 264 u8 duty_offset; /* Processor duty cycle index in processor P_CNT reg */
265 u8 duty_width; /* [V1] Processor duty cycle value bit width in P_CNT register */ 265 u8 duty_width; /* Processor duty cycle value bit width in P_CNT register */
266 u8 day_alarm; /* [V1] Index to day-of-month alarm in RTC CMOS RAM */ 266 u8 day_alarm; /* Index to day-of-month alarm in RTC CMOS RAM */
267 u8 month_alarm; /* [V1] Index to month-of-year alarm in RTC CMOS RAM */ 267 u8 month_alarm; /* Index to month-of-year alarm in RTC CMOS RAM */
268 u8 century; /* [V1] Index to century in RTC CMOS RAM */ 268 u8 century; /* Index to century in RTC CMOS RAM */
269 u16 boot_flags; /* [V3] IA-PC Boot Architecture Flags (see below for individual flags) */ 269 u16 boot_flags; /* IA-PC Boot Architecture Flags (see below for individual flags) */
270 u8 reserved; /* [V1] Reserved, must be zero */ 270 u8 reserved; /* Reserved, must be zero */
271 u32 flags; /* [V1] Miscellaneous flag bits (see below for individual flags) */ 271 u32 flags; /* Miscellaneous flag bits (see below for individual flags) */
272 /* End of Version 1 FADT fields (ACPI 1.0) */ 272 struct acpi_generic_address reset_register; /* 64-bit address of the Reset register */
273 273 u8 reset_value; /* Value to write to the reset_register port to reset the system */
274 struct acpi_generic_address reset_register; /* [V3] 64-bit address of the Reset register */ 274 u16 arm_boot_flags; /* ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */
275 u8 reset_value; /* [V3] Value to write to the reset_register port to reset the system */ 275 u8 minor_revision; /* FADT Minor Revision (ACPI 5.1) */
276 u16 arm_boot_flags; /* [V5] ARM-Specific Boot Flags (see below for individual flags) (ACPI 5.1) */ 276 u64 Xfacs; /* 64-bit physical address of FACS */
277 u8 minor_revision; /* [V5] FADT Minor Revision (ACPI 5.1) */ 277 u64 Xdsdt; /* 64-bit physical address of DSDT */
278 u64 Xfacs; /* [V3] 64-bit physical address of FACS */ 278 struct acpi_generic_address xpm1a_event_block; /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
279 u64 Xdsdt; /* [V3] 64-bit physical address of DSDT */ 279 struct acpi_generic_address xpm1b_event_block; /* 64-bit Extended Power Mgt 1b Event Reg Blk address */
280 struct acpi_generic_address xpm1a_event_block; /* [V3] 64-bit Extended Power Mgt 1a Event Reg Blk address */ 280 struct acpi_generic_address xpm1a_control_block; /* 64-bit Extended Power Mgt 1a Control Reg Blk address */
281 struct acpi_generic_address xpm1b_event_block; /* [V3] 64-bit Extended Power Mgt 1b Event Reg Blk address */ 281 struct acpi_generic_address xpm1b_control_block; /* 64-bit Extended Power Mgt 1b Control Reg Blk address */
282 struct acpi_generic_address xpm1a_control_block; /* [V3] 64-bit Extended Power Mgt 1a Control Reg Blk address */ 282 struct acpi_generic_address xpm2_control_block; /* 64-bit Extended Power Mgt 2 Control Reg Blk address */
283 struct acpi_generic_address xpm1b_control_block; /* [V3] 64-bit Extended Power Mgt 1b Control Reg Blk address */ 283 struct acpi_generic_address xpm_timer_block; /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */
284 struct acpi_generic_address xpm2_control_block; /* [V3] 64-bit Extended Power Mgt 2 Control Reg Blk address */ 284 struct acpi_generic_address xgpe0_block; /* 64-bit Extended General Purpose Event 0 Reg Blk address */
285 struct acpi_generic_address xpm_timer_block; /* [V3] 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */ 285 struct acpi_generic_address xgpe1_block; /* 64-bit Extended General Purpose Event 1 Reg Blk address */
286 struct acpi_generic_address xgpe0_block; /* [V3] 64-bit Extended General Purpose Event 0 Reg Blk address */ 286 struct acpi_generic_address sleep_control; /* 64-bit Sleep Control register (ACPI 5.0) */
287 struct acpi_generic_address xgpe1_block; /* [V3] 64-bit Extended General Purpose Event 1 Reg Blk address */ 287 struct acpi_generic_address sleep_status; /* 64-bit Sleep Status register (ACPI 5.0) */
288 /* End of Version 3 FADT fields (ACPI 2.0) */ 288 u64 hypervisor_id; /* Hypervisor Vendor ID (ACPI 6.0) */
289
290 struct acpi_generic_address sleep_control; /* [V4] 64-bit Sleep Control register (ACPI 5.0) */
291 /* End of Version 4 FADT fields (ACPI 3.0 and ACPI 4.0) (Field was originally reserved in ACPI 3.0) */
292
293 struct acpi_generic_address sleep_status; /* [V5] 64-bit Sleep Status register (ACPI 5.0) */
294 /* End of Version 5 FADT fields (ACPI 5.0) */
295
296 u64 hypervisor_id; /* [V6] Hypervisor Vendor ID (ACPI 6.0) */
297 /* End of Version 6 FADT fields (ACPI 6.0) */
298
299}; 289};
300 290
301/* Masks for FADT IA-PC Boot Architecture Flags (boot_flags) [Vx]=Introduced in this FADT revision */ 291/* Masks for FADT IA-PC Boot Architecture Flags (boot_flags) [Vx]=Introduced in this FADT revision */
@@ -311,8 +301,8 @@ struct acpi_table_fadt {
311 301
312/* Masks for FADT ARM Boot Architecture Flags (arm_boot_flags) ACPI 5.1 */ 302/* Masks for FADT ARM Boot Architecture Flags (arm_boot_flags) ACPI 5.1 */
313 303
314#define ACPI_FADT_PSCI_COMPLIANT (1) /* 00: [V5] PSCI 0.2+ is implemented */ 304#define ACPI_FADT_PSCI_COMPLIANT (1) /* 00: [V5+] PSCI 0.2+ is implemented */
315#define ACPI_FADT_PSCI_USE_HVC (1<<1) /* 01: [V5] HVC must be used instead of SMC as the PSCI conduit */ 305#define ACPI_FADT_PSCI_USE_HVC (1<<1) /* 01: [V5+] HVC must be used instead of SMC as the PSCI conduit */
316 306
317/* Masks for FADT flags */ 307/* Masks for FADT flags */
318 308
@@ -409,34 +399,20 @@ struct acpi_table_desc {
409 * match the expected length. In other words, the length of the 399 * match the expected length. In other words, the length of the
410 * FADT is the bottom line as to what the version really is. 400 * FADT is the bottom line as to what the version really is.
411 * 401 *
412 * NOTE: There is no officialy released V2 of the FADT. This 402 * For reference, the values below are as follows:
413 * version was used only for prototyping and testing during the 403 * FADT V1 size: 0x074
414 * 32-bit to 64-bit transition. V3 was the first official 64-bit 404 * FADT V2 size: 0x084
415 * version of the FADT. 405 * FADT V3 size: 0x0F4
416 * 406 * FADT V4 size: 0x0F4
417 * Update this list of defines when a new version of the FADT is 407 * FADT V5 size: 0x10C
418 * added to the ACPI specification. Note that the FADT version is 408 * FADT V6 size: 0x114
419 * only incremented when new fields are appended to the existing
420 * version. Therefore, the FADT version is competely independent
421 * from the version of the ACPI specification where it is
422 * defined.
423 *
424 * For reference, the various FADT lengths are as follows:
425 * FADT V1 size: 0x074 ACPI 1.0
426 * FADT V3 size: 0x0F4 ACPI 2.0
427 * FADT V4 size: 0x100 ACPI 3.0 and ACPI 4.0
428 * FADT V5 size: 0x10C ACPI 5.0
429 * FADT V6 size: 0x114 ACPI 6.0
430 */ 409 */
431#define ACPI_FADT_V1_SIZE (u32) (ACPI_FADT_OFFSET (flags) + 4) /* ACPI 1.0 */ 410#define ACPI_FADT_V1_SIZE (u32) (ACPI_FADT_OFFSET (flags) + 4)
432#define ACPI_FADT_V3_SIZE (u32) (ACPI_FADT_OFFSET (sleep_control)) /* ACPI 2.0 */ 411#define ACPI_FADT_V2_SIZE (u32) (ACPI_FADT_OFFSET (minor_revision) + 1)
433#define ACPI_FADT_V4_SIZE (u32) (ACPI_FADT_OFFSET (sleep_status)) /* ACPI 3.0 and ACPI 4.0 */ 412#define ACPI_FADT_V3_SIZE (u32) (ACPI_FADT_OFFSET (sleep_control))
434#define ACPI_FADT_V5_SIZE (u32) (ACPI_FADT_OFFSET (hypervisor_id)) /* ACPI 5.0 */ 413#define ACPI_FADT_V5_SIZE (u32) (ACPI_FADT_OFFSET (hypervisor_id))
435#define ACPI_FADT_V6_SIZE (u32) (sizeof (struct acpi_table_fadt)) /* ACPI 6.0 */ 414#define ACPI_FADT_V6_SIZE (u32) (sizeof (struct acpi_table_fadt))
436
437/* Update these when new FADT versions are added */
438 415
439#define ACPI_FADT_MAX_VERSION 6
440#define ACPI_FADT_CONFORMANCE "ACPI 6.1 (FADT version 6)" 416#define ACPI_FADT_CONFORMANCE "ACPI 6.1 (FADT version 6)"
441 417
442#endif /* __ACTBL_H__ */ 418#endif /* __ACTBL_H__ */
diff --git a/include/acpi/platform/aclinux.h b/include/acpi/platform/aclinux.h
index a5d98d171866..e861a24f06f2 100644
--- a/include/acpi/platform/aclinux.h
+++ b/include/acpi/platform/aclinux.h
@@ -191,6 +191,9 @@
191#ifndef __init 191#ifndef __init
192#define __init 192#define __init
193#endif 193#endif
194#ifndef __iomem
195#define __iomem
196#endif
194 197
195/* Host-dependent types and defines for user-space ACPICA */ 198/* Host-dependent types and defines for user-space ACPICA */
196 199
diff --git a/include/asm-generic/percpu.h b/include/asm-generic/percpu.h
index 40e887068da2..0504ef8f3aa3 100644
--- a/include/asm-generic/percpu.h
+++ b/include/asm-generic/percpu.h
@@ -118,9 +118,9 @@ do { \
118#define this_cpu_generic_read(pcp) \ 118#define this_cpu_generic_read(pcp) \
119({ \ 119({ \
120 typeof(pcp) __ret; \ 120 typeof(pcp) __ret; \
121 preempt_disable(); \ 121 preempt_disable_notrace(); \
122 __ret = raw_cpu_generic_read(pcp); \ 122 __ret = raw_cpu_generic_read(pcp); \
123 preempt_enable(); \ 123 preempt_enable_notrace(); \
124 __ret; \ 124 __ret; \
125}) 125})
126 126
diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index af0254c09424..4df64a1fc09e 100644
--- a/include/asm-generic/sections.h
+++ b/include/asm-generic/sections.h
@@ -14,6 +14,8 @@
14 * [_sdata, _edata]: contains .data.* sections, may also contain .rodata.* 14 * [_sdata, _edata]: contains .data.* sections, may also contain .rodata.*
15 * and/or .init.* sections. 15 * and/or .init.* sections.
16 * [__start_rodata, __end_rodata]: contains .rodata.* sections 16 * [__start_rodata, __end_rodata]: contains .rodata.* sections
17 * [__start_data_ro_after_init, __end_data_ro_after_init]:
18 * contains data.ro_after_init section
17 * [__init_begin, __init_end]: contains .init.* sections, but .init.text.* 19 * [__init_begin, __init_end]: contains .init.* sections, but .init.text.*
18 * may be out of this range on some architectures. 20 * may be out of this range on some architectures.
19 * [_sinittext, _einittext]: contains .init.text.* sections 21 * [_sinittext, _einittext]: contains .init.text.* sections
@@ -31,6 +33,7 @@ extern char _data[], _sdata[], _edata[];
31extern char __bss_start[], __bss_stop[]; 33extern char __bss_start[], __bss_stop[];
32extern char __init_begin[], __init_end[]; 34extern char __init_begin[], __init_end[];
33extern char _sinittext[], _einittext[]; 35extern char _sinittext[], _einittext[];
36extern char __start_data_ro_after_init[], __end_data_ro_after_init[];
34extern char _end[]; 37extern char _end[];
35extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[]; 38extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
36extern char __kprobes_text_start[], __kprobes_text_end[]; 39extern char __kprobes_text_start[], __kprobes_text_end[];
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
index 30747960bc54..31e1d639abed 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -259,7 +259,10 @@
259 * own by defining an empty RO_AFTER_INIT_DATA. 259 * own by defining an empty RO_AFTER_INIT_DATA.
260 */ 260 */
261#ifndef RO_AFTER_INIT_DATA 261#ifndef RO_AFTER_INIT_DATA
262#define RO_AFTER_INIT_DATA *(.data..ro_after_init) 262#define RO_AFTER_INIT_DATA \
263 __start_data_ro_after_init = .; \
264 *(.data..ro_after_init) \
265 __end_data_ro_after_init = .;
263#endif 266#endif
264 267
265/* 268/*
diff --git a/include/crypto/drbg.h b/include/crypto/drbg.h
index 61580b19f9f6..22f884c97387 100644
--- a/include/crypto/drbg.h
+++ b/include/crypto/drbg.h
@@ -124,6 +124,8 @@ struct drbg_state {
124 struct skcipher_request *ctr_req; /* CTR mode request handle */ 124 struct skcipher_request *ctr_req; /* CTR mode request handle */
125 __u8 *ctr_null_value_buf; /* CTR mode unaligned buffer */ 125 __u8 *ctr_null_value_buf; /* CTR mode unaligned buffer */
126 __u8 *ctr_null_value; /* CTR mode aligned zero buf */ 126 __u8 *ctr_null_value; /* CTR mode aligned zero buf */
127 __u8 *outscratchpadbuf; /* CTR mode output scratchpad */
128 __u8 *outscratchpad; /* CTR mode aligned outbuf */
127 struct completion ctr_completion; /* CTR mode async handler */ 129 struct completion ctr_completion; /* CTR mode async handler */
128 int ctr_async_err; /* CTR mode async error */ 130 int ctr_async_err; /* CTR mode async error */
129 131
diff --git a/include/dt-bindings/sound/cs42l42.h b/include/dt-bindings/sound/cs42l42.h
new file mode 100644
index 000000000000..399a123aed58
--- /dev/null
+++ b/include/dt-bindings/sound/cs42l42.h
@@ -0,0 +1,73 @@
1/*
2 * cs42l42.h -- CS42L42 ALSA SoC audio driver DT bindings header
3 *
4 * Copyright 2016 Cirrus Logic, Inc.
5 *
6 * Author: James Schulman <james.schulman@cirrus.com>
7 * Author: Brian Austin <brian.austin@cirrus.com>
8 * Author: Michael White <michael.white@cirrus.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 */
15
16#ifndef __DT_CS42L42_H
17#define __DT_CS42L42_H
18
19/* HPOUT Load Capacity */
20#define CS42L42_HPOUT_LOAD_1NF 0
21#define CS42L42_HPOUT_LOAD_10NF 1
22
23/* HPOUT Clamp to GND Overide */
24#define CS42L42_HPOUT_CLAMP_EN 0
25#define CS42L42_HPOUT_CLAMP_DIS 1
26
27/* Tip Sense Inversion */
28#define CS42L42_TS_INV_DIS 0
29#define CS42L42_TS_INV_EN 1
30
31/* Tip Sense Debounce */
32#define CS42L42_TS_DBNCE_0 0
33#define CS42L42_TS_DBNCE_125 1
34#define CS42L42_TS_DBNCE_250 2
35#define CS42L42_TS_DBNCE_500 3
36#define CS42L42_TS_DBNCE_750 4
37#define CS42L42_TS_DBNCE_1000 5
38#define CS42L42_TS_DBNCE_1250 6
39#define CS42L42_TS_DBNCE_1500 7
40
41/* Button Press Software Debounce Times */
42#define CS42L42_BTN_DET_INIT_DBNCE_MIN 0
43#define CS42L42_BTN_DET_INIT_DBNCE_DEFAULT 100
44#define CS42L42_BTN_DET_INIT_DBNCE_MAX 200
45
46#define CS42L42_BTN_DET_EVENT_DBNCE_MIN 0
47#define CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT 10
48#define CS42L42_BTN_DET_EVENT_DBNCE_MAX 20
49
50/* Button Detect Level Sensitivities */
51#define CS42L42_NUM_BIASES 4
52
53#define CS42L42_HS_DET_LEVEL_15 0x0F
54#define CS42L42_HS_DET_LEVEL_8 0x08
55#define CS42L42_HS_DET_LEVEL_4 0x04
56#define CS42L42_HS_DET_LEVEL_1 0x01
57
58#define CS42L42_HS_DET_LEVEL_MIN 0
59#define CS42L42_HS_DET_LEVEL_MAX 0x3F
60
61/* HS Bias Ramp Rate */
62
63#define CS42L42_HSBIAS_RAMP_FAST_RISE_SLOW_FALL 0
64#define CS42L42_HSBIAS_RAMP_FAST 1
65#define CS42L42_HSBIAS_RAMP_SLOW 2
66#define CS42L42_HSBIAS_RAMP_SLOWEST 3
67
68#define CS42L42_HSBIAS_RAMP_TIME0 10
69#define CS42L42_HSBIAS_RAMP_TIME1 40
70#define CS42L42_HSBIAS_RAMP_TIME2 90
71#define CS42L42_HSBIAS_RAMP_TIME3 170
72
73#endif /* __DT_CS42L42_H */
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 689a8b9b9c8f..61a3d90f32b3 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -555,7 +555,8 @@ int acpi_device_uevent_modalias(struct device *, struct kobj_uevent_env *);
555int acpi_device_modalias(struct device *, char *, int); 555int acpi_device_modalias(struct device *, char *, int);
556void acpi_walk_dep_device_list(acpi_handle handle); 556void acpi_walk_dep_device_list(acpi_handle handle);
557 557
558struct platform_device *acpi_create_platform_device(struct acpi_device *); 558struct platform_device *acpi_create_platform_device(struct acpi_device *,
559 struct property_entry *);
559#define ACPI_PTR(_ptr) (_ptr) 560#define ACPI_PTR(_ptr) (_ptr)
560 561
561static inline void acpi_device_set_enumerated(struct acpi_device *adev) 562static inline void acpi_device_set_enumerated(struct acpi_device *adev)
diff --git a/include/linux/bpf_verifier.h b/include/linux/bpf_verifier.h
index 7035b997aaa5..6aaf425cebc3 100644
--- a/include/linux/bpf_verifier.h
+++ b/include/linux/bpf_verifier.h
@@ -14,7 +14,7 @@
14 * are obviously wrong for any sort of memory access. 14 * are obviously wrong for any sort of memory access.
15 */ 15 */
16#define BPF_REGISTER_MAX_RANGE (1024 * 1024 * 1024) 16#define BPF_REGISTER_MAX_RANGE (1024 * 1024 * 1024)
17#define BPF_REGISTER_MIN_RANGE -(1024 * 1024 * 1024) 17#define BPF_REGISTER_MIN_RANGE -1
18 18
19struct bpf_reg_state { 19struct bpf_reg_state {
20 enum bpf_reg_type type; 20 enum bpf_reg_type type;
@@ -22,7 +22,8 @@ struct bpf_reg_state {
22 * Used to determine if any memory access using this register will 22 * Used to determine if any memory access using this register will
23 * result in a bad access. 23 * result in a bad access.
24 */ 24 */
25 u64 min_value, max_value; 25 s64 min_value;
26 u64 max_value;
26 union { 27 union {
27 /* valid when type == CONST_IMM | PTR_TO_STACK | UNKNOWN_VALUE */ 28 /* valid when type == CONST_IMM | PTR_TO_STACK | UNKNOWN_VALUE */
28 s64 imm; 29 s64 imm;
diff --git a/include/linux/ceph/osd_client.h b/include/linux/ceph/osd_client.h
index 96337b15a60d..a8e66344bacc 100644
--- a/include/linux/ceph/osd_client.h
+++ b/include/linux/ceph/osd_client.h
@@ -258,6 +258,8 @@ struct ceph_watch_item {
258 struct ceph_entity_addr addr; 258 struct ceph_entity_addr addr;
259}; 259};
260 260
261#define CEPH_LINGER_ID_START 0xffff000000000000ULL
262
261struct ceph_osd_client { 263struct ceph_osd_client {
262 struct ceph_client *client; 264 struct ceph_client *client;
263 265
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 432f5c97e18f..928e5ca0caee 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -263,7 +263,9 @@
263#endif 263#endif
264#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */ 264#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP && !__CHECKER__ */
265 265
266#if GCC_VERSION >= 50000 266#if GCC_VERSION >= 70000
267#define KASAN_ABI_VERSION 5
268#elif GCC_VERSION >= 50000
267#define KASAN_ABI_VERSION 4 269#define KASAN_ABI_VERSION 4
268#elif GCC_VERSION >= 40902 270#elif GCC_VERSION >= 40902
269#define KASAN_ABI_VERSION 3 271#define KASAN_ABI_VERSION 3
diff --git a/include/linux/console.h b/include/linux/console.h
index 3672809234a7..d530c4627e54 100644
--- a/include/linux/console.h
+++ b/include/linux/console.h
@@ -173,12 +173,6 @@ static inline void console_sysfs_notify(void)
173#endif 173#endif
174extern bool console_suspend_enabled; 174extern bool console_suspend_enabled;
175 175
176#ifdef CONFIG_OF
177extern void console_set_by_of(void);
178#else
179static inline void console_set_by_of(void) {}
180#endif
181
182/* Suspend and resume console messages over PM events */ 176/* Suspend and resume console messages over PM events */
183extern void suspend_console(void); 177extern void suspend_console(void);
184extern void resume_console(void); 178extern void resume_console(void);
diff --git a/include/linux/frontswap.h b/include/linux/frontswap.h
index c46d2aa16d81..1d18af034554 100644
--- a/include/linux/frontswap.h
+++ b/include/linux/frontswap.h
@@ -106,8 +106,9 @@ static inline void frontswap_invalidate_area(unsigned type)
106 106
107static inline void frontswap_init(unsigned type, unsigned long *map) 107static inline void frontswap_init(unsigned type, unsigned long *map)
108{ 108{
109 if (frontswap_enabled()) 109#ifdef CONFIG_FRONTSWAP
110 __frontswap_init(type, map); 110 __frontswap_init(type, map);
111#endif
111} 112}
112 113
113#endif /* _LINUX_FRONTSWAP_H */ 114#endif /* _LINUX_FRONTSWAP_H */
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 16d2b6e874d6..dc0478c07b2a 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -321,6 +321,7 @@ struct writeback_control;
321#define IOCB_HIPRI (1 << 3) 321#define IOCB_HIPRI (1 << 3)
322#define IOCB_DSYNC (1 << 4) 322#define IOCB_DSYNC (1 << 4)
323#define IOCB_SYNC (1 << 5) 323#define IOCB_SYNC (1 << 5)
324#define IOCB_WRITE (1 << 6)
324 325
325struct kiocb { 326struct kiocb {
326 struct file *ki_filp; 327 struct file *ki_filp;
@@ -1709,7 +1710,6 @@ struct file_operations {
1709 int (*flush) (struct file *, fl_owner_t id); 1710 int (*flush) (struct file *, fl_owner_t id);
1710 int (*release) (struct inode *, struct file *); 1711 int (*release) (struct inode *, struct file *);
1711 int (*fsync) (struct file *, loff_t, loff_t, int datasync); 1712 int (*fsync) (struct file *, loff_t, loff_t, int datasync);
1712 int (*aio_fsync) (struct kiocb *, int datasync);
1713 int (*fasync) (int, struct file *, int); 1713 int (*fasync) (int, struct file *, int);
1714 int (*lock) (struct file *, int, struct file_lock *); 1714 int (*lock) (struct file *, int, struct file_lock *);
1715 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); 1715 ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h
index 9b9f65d99873..e35e6de633b9 100644
--- a/include/linux/huge_mm.h
+++ b/include/linux/huge_mm.h
@@ -22,7 +22,7 @@ extern int mincore_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
22 unsigned char *vec); 22 unsigned char *vec);
23extern bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr, 23extern bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
24 unsigned long new_addr, unsigned long old_end, 24 unsigned long new_addr, unsigned long old_end,
25 pmd_t *old_pmd, pmd_t *new_pmd); 25 pmd_t *old_pmd, pmd_t *new_pmd, bool *need_flush);
26extern int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd, 26extern int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
27 unsigned long addr, pgprot_t newprot, 27 unsigned long addr, pgprot_t newprot,
28 int prot_numa); 28 int prot_numa);
diff --git a/include/linux/intel-iommu.h b/include/linux/intel-iommu.h
index 2d9b650047a5..d49e26c6cdc7 100644
--- a/include/linux/intel-iommu.h
+++ b/include/linux/intel-iommu.h
@@ -429,6 +429,7 @@ struct intel_iommu {
429 struct page_req_dsc *prq; 429 struct page_req_dsc *prq;
430 unsigned char prq_name[16]; /* Name for PRQ interrupt */ 430 unsigned char prq_name[16]; /* Name for PRQ interrupt */
431 struct idr pasid_idr; 431 struct idr pasid_idr;
432 u32 pasid_max;
432#endif 433#endif
433 struct q_inval *qi; /* Queued invalidation info */ 434 struct q_inval *qi; /* Queued invalidation info */
434 u32 *iommu_state; /* Store iommu states between suspend and resume.*/ 435 u32 *iommu_state; /* Store iommu states between suspend and resume.*/
diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h
index ca1ad9ebbc92..a0649973ee5b 100644
--- a/include/linux/ipv6.h
+++ b/include/linux/ipv6.h
@@ -149,7 +149,7 @@ static inline bool inet6_exact_dif_match(struct net *net, struct sk_buff *skb)
149{ 149{
150#if defined(CONFIG_NET_L3_MASTER_DEV) 150#if defined(CONFIG_NET_L3_MASTER_DEV)
151 if (!net->ipv4.sysctl_tcp_l3mdev_accept && 151 if (!net->ipv4.sysctl_tcp_l3mdev_accept &&
152 ipv6_l3mdev_skb(IP6CB(skb)->flags)) 152 skb && ipv6_l3mdev_skb(IP6CB(skb)->flags))
153 return true; 153 return true;
154#endif 154#endif
155 return false; 155 return false;
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
index f4947fda11e7..8458c5351e56 100644
--- a/include/linux/libnvdimm.h
+++ b/include/linux/libnvdimm.h
@@ -143,7 +143,7 @@ u32 nd_cmd_in_size(struct nvdimm *nvdimm, int cmd,
143 const struct nd_cmd_desc *desc, int idx, void *buf); 143 const struct nd_cmd_desc *desc, int idx, void *buf);
144u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd, 144u32 nd_cmd_out_size(struct nvdimm *nvdimm, int cmd,
145 const struct nd_cmd_desc *desc, int idx, const u32 *in_field, 145 const struct nd_cmd_desc *desc, int idx, const u32 *in_field,
146 const u32 *out_field); 146 const u32 *out_field, unsigned long remainder);
147int nvdimm_bus_check_dimm_count(struct nvdimm_bus *nvdimm_bus, int dimm_count); 147int nvdimm_bus_check_dimm_count(struct nvdimm_bus *nvdimm_bus, int dimm_count);
148struct nd_region *nvdimm_pmem_region_create(struct nvdimm_bus *nvdimm_bus, 148struct nd_region *nvdimm_pmem_region_create(struct nvdimm_bus *nvdimm_bus,
149 struct nd_region_desc *ndr_desc); 149 struct nd_region_desc *ndr_desc);
diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h
index 3be7abd6e722..c9f379689dd0 100644
--- a/include/linux/mlx4/device.h
+++ b/include/linux/mlx4/device.h
@@ -476,7 +476,6 @@ enum {
476enum { 476enum {
477 MLX4_INTERFACE_STATE_UP = 1 << 0, 477 MLX4_INTERFACE_STATE_UP = 1 << 0,
478 MLX4_INTERFACE_STATE_DELETION = 1 << 1, 478 MLX4_INTERFACE_STATE_DELETION = 1 << 1,
479 MLX4_INTERFACE_STATE_SHUTDOWN = 1 << 2,
480}; 479};
481 480
482#define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \ 481#define MSTR_SM_CHANGE_MASK (MLX4_EQ_PORT_INFO_MSTR_SM_SL_CHANGE_MASK | \
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 91ee3643ccc8..e16a2a980ea8 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1619,7 +1619,7 @@ enum netdev_priv_flags {
1619 * @dcbnl_ops: Data Center Bridging netlink ops 1619 * @dcbnl_ops: Data Center Bridging netlink ops
1620 * @num_tc: Number of traffic classes in the net device 1620 * @num_tc: Number of traffic classes in the net device
1621 * @tc_to_txq: XXX: need comments on this one 1621 * @tc_to_txq: XXX: need comments on this one
1622 * @prio_tc_map XXX: need comments on this one 1622 * @prio_tc_map: XXX: need comments on this one
1623 * 1623 *
1624 * @fcoe_ddp_xid: Max exchange id for FCoE LRO by ddp 1624 * @fcoe_ddp_xid: Max exchange id for FCoE LRO by ddp
1625 * 1625 *
@@ -3354,6 +3354,21 @@ int dev_forward_skb(struct net_device *dev, struct sk_buff *skb);
3354bool is_skb_forwardable(const struct net_device *dev, 3354bool is_skb_forwardable(const struct net_device *dev,
3355 const struct sk_buff *skb); 3355 const struct sk_buff *skb);
3356 3356
3357static __always_inline int ____dev_forward_skb(struct net_device *dev,
3358 struct sk_buff *skb)
3359{
3360 if (skb_orphan_frags(skb, GFP_ATOMIC) ||
3361 unlikely(!is_skb_forwardable(dev, skb))) {
3362 atomic_long_inc(&dev->rx_dropped);
3363 kfree_skb(skb);
3364 return NET_RX_DROP;
3365 }
3366
3367 skb_scrub_packet(skb, true);
3368 skb->priority = 0;
3369 return 0;
3370}
3371
3357void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev); 3372void dev_queue_xmit_nit(struct sk_buff *skb, struct net_device *dev);
3358 3373
3359extern int netdev_budget; 3374extern int netdev_budget;
diff --git a/include/linux/of_mdio.h b/include/linux/of_mdio.h
index 2ab233661ae5..a58cca8bcb29 100644
--- a/include/linux/of_mdio.h
+++ b/include/linux/of_mdio.h
@@ -29,6 +29,7 @@ struct phy_device *of_phy_attach(struct net_device *dev,
29extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); 29extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np);
30extern int of_mdio_parse_addr(struct device *dev, const struct device_node *np); 30extern int of_mdio_parse_addr(struct device *dev, const struct device_node *np);
31extern int of_phy_register_fixed_link(struct device_node *np); 31extern int of_phy_register_fixed_link(struct device_node *np);
32extern void of_phy_deregister_fixed_link(struct device_node *np);
32extern bool of_phy_is_fixed_link(struct device_node *np); 33extern bool of_phy_is_fixed_link(struct device_node *np);
33 34
34#else /* CONFIG_OF */ 35#else /* CONFIG_OF */
@@ -83,6 +84,9 @@ static inline int of_phy_register_fixed_link(struct device_node *np)
83{ 84{
84 return -ENOSYS; 85 return -ENOSYS;
85} 86}
87static inline void of_phy_deregister_fixed_link(struct device_node *np)
88{
89}
86static inline bool of_phy_is_fixed_link(struct device_node *np) 90static inline bool of_phy_is_fixed_link(struct device_node *np)
87{ 91{
88 return false; 92 return false;
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index dd15d39e1985..7dbe9148b2f8 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -374,16 +374,13 @@ static inline struct page *read_mapping_page(struct address_space *mapping,
374} 374}
375 375
376/* 376/*
377 * Get the offset in PAGE_SIZE. 377 * Get index of the page with in radix-tree
378 * (TODO: hugepage should have ->index in PAGE_SIZE) 378 * (TODO: remove once hugetlb pages will have ->index in PAGE_SIZE)
379 */ 379 */
380static inline pgoff_t page_to_pgoff(struct page *page) 380static inline pgoff_t page_to_index(struct page *page)
381{ 381{
382 pgoff_t pgoff; 382 pgoff_t pgoff;
383 383
384 if (unlikely(PageHeadHuge(page)))
385 return page->index << compound_order(page);
386
387 if (likely(!PageTransTail(page))) 384 if (likely(!PageTransTail(page)))
388 return page->index; 385 return page->index;
389 386
@@ -397,6 +394,18 @@ static inline pgoff_t page_to_pgoff(struct page *page)
397} 394}
398 395
399/* 396/*
397 * Get the offset in PAGE_SIZE.
398 * (TODO: hugepage should have ->index in PAGE_SIZE)
399 */
400static inline pgoff_t page_to_pgoff(struct page *page)
401{
402 if (unlikely(PageHeadHuge(page)))
403 return page->index << compound_order(page);
404
405 return page_to_index(page);
406}
407
408/*
400 * Return byte-offset into filesystem object for page. 409 * Return byte-offset into filesystem object for page.
401 */ 410 */
402static inline loff_t page_offset(struct page *page) 411static inline loff_t page_offset(struct page *page)
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 0e49f70dbd9b..a38772a85588 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1928,6 +1928,20 @@ static inline int pci_pcie_type(const struct pci_dev *dev)
1928 return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4; 1928 return (pcie_caps_reg(dev) & PCI_EXP_FLAGS_TYPE) >> 4;
1929} 1929}
1930 1930
1931static inline struct pci_dev *pcie_find_root_port(struct pci_dev *dev)
1932{
1933 while (1) {
1934 if (!pci_is_pcie(dev))
1935 break;
1936 if (pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT)
1937 return dev;
1938 if (!dev->bus->self)
1939 break;
1940 dev = dev->bus->self;
1941 }
1942 return NULL;
1943}
1944
1931void pci_request_acs(void); 1945void pci_request_acs(void);
1932bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags); 1946bool pci_acs_enabled(struct pci_dev *pdev, u16 acs_flags);
1933bool pci_acs_path_enabled(struct pci_dev *start, 1947bool pci_acs_path_enabled(struct pci_dev *start,
diff --git a/include/linux/phy/phy.h b/include/linux/phy/phy.h
index ee1bed7dbfc6..78bb0d7f6b11 100644
--- a/include/linux/phy/phy.h
+++ b/include/linux/phy/phy.h
@@ -253,6 +253,13 @@ static inline int phy_set_mode(struct phy *phy, enum phy_mode mode)
253 return -ENOSYS; 253 return -ENOSYS;
254} 254}
255 255
256static inline int phy_reset(struct phy *phy)
257{
258 if (!phy)
259 return 0;
260 return -ENOSYS;
261}
262
256static inline int phy_get_bus_width(struct phy *phy) 263static inline int phy_get_bus_width(struct phy *phy)
257{ 264{
258 return -ENOSYS; 265 return -ENOSYS;
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 348f51b0ec92..e9c009dc3a4a 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -2567,6 +2567,7 @@ extern void sched_autogroup_create_attach(struct task_struct *p);
2567extern void sched_autogroup_detach(struct task_struct *p); 2567extern void sched_autogroup_detach(struct task_struct *p);
2568extern void sched_autogroup_fork(struct signal_struct *sig); 2568extern void sched_autogroup_fork(struct signal_struct *sig);
2569extern void sched_autogroup_exit(struct signal_struct *sig); 2569extern void sched_autogroup_exit(struct signal_struct *sig);
2570extern void sched_autogroup_exit_task(struct task_struct *p);
2570#ifdef CONFIG_PROC_FS 2571#ifdef CONFIG_PROC_FS
2571extern void proc_sched_autogroup_show_task(struct task_struct *p, struct seq_file *m); 2572extern void proc_sched_autogroup_show_task(struct task_struct *p, struct seq_file *m);
2572extern int proc_sched_autogroup_set_nice(struct task_struct *p, int nice); 2573extern int proc_sched_autogroup_set_nice(struct task_struct *p, int nice);
@@ -2576,6 +2577,7 @@ static inline void sched_autogroup_create_attach(struct task_struct *p) { }
2576static inline void sched_autogroup_detach(struct task_struct *p) { } 2577static inline void sched_autogroup_detach(struct task_struct *p) { }
2577static inline void sched_autogroup_fork(struct signal_struct *sig) { } 2578static inline void sched_autogroup_fork(struct signal_struct *sig) { }
2578static inline void sched_autogroup_exit(struct signal_struct *sig) { } 2579static inline void sched_autogroup_exit(struct signal_struct *sig) { }
2580static inline void sched_autogroup_exit_task(struct task_struct *p) { }
2579#endif 2581#endif
2580 2582
2581extern int yield_to(struct task_struct *p, bool preempt); 2583extern int yield_to(struct task_struct *p, bool preempt);
diff --git a/include/linux/sunrpc/svc_xprt.h b/include/linux/sunrpc/svc_xprt.h
index ab02a457da1f..e5d193440374 100644
--- a/include/linux/sunrpc/svc_xprt.h
+++ b/include/linux/sunrpc/svc_xprt.h
@@ -25,6 +25,7 @@ struct svc_xprt_ops {
25 void (*xpo_detach)(struct svc_xprt *); 25 void (*xpo_detach)(struct svc_xprt *);
26 void (*xpo_free)(struct svc_xprt *); 26 void (*xpo_free)(struct svc_xprt *);
27 int (*xpo_secure_port)(struct svc_rqst *); 27 int (*xpo_secure_port)(struct svc_rqst *);
28 void (*xpo_kill_temp_xprt)(struct svc_xprt *);
28}; 29};
29 30
30struct svc_xprt_class { 31struct svc_xprt_class {
diff --git a/include/linux/usb/cdc_ncm.h b/include/linux/usb/cdc_ncm.h
index 3a375d07d0dc..00d232406f18 100644
--- a/include/linux/usb/cdc_ncm.h
+++ b/include/linux/usb/cdc_ncm.h
@@ -81,7 +81,8 @@
81#define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC) 81#define CDC_NCM_TIMER_INTERVAL_MAX (U32_MAX / NSEC_PER_USEC)
82 82
83/* Driver flags */ 83/* Driver flags */
84#define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */ 84#define CDC_NCM_FLAG_NDP_TO_END 0x02 /* NDP is placed at end of frame */
85#define CDC_MBIM_FLAG_AVOID_ALTSETTING_TOGGLE 0x04 /* Avoid altsetting toggle during init */
85 86
86#define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \ 87#define cdc_ncm_comm_intf_is_mbim(x) ((x)->desc.bInterfaceSubClass == USB_CDC_SUBCLASS_MBIM && \
87 (x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE) 88 (x)->desc.bInterfaceProtocol == USB_CDC_PROTO_NONE)
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index f00bf667ec33..554671c81f4a 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -1018,7 +1018,7 @@ static inline void hci_set_drvdata(struct hci_dev *hdev, void *data)
1018} 1018}
1019 1019
1020struct hci_dev *hci_dev_get(int index); 1020struct hci_dev *hci_dev_get(int index);
1021struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src); 1021struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, u8 src_type);
1022 1022
1023struct hci_dev *hci_alloc_dev(void); 1023struct hci_dev *hci_alloc_dev(void);
1024void hci_free_dev(struct hci_dev *hdev); 1024void hci_free_dev(struct hci_dev *hdev);
diff --git a/include/net/gro_cells.h b/include/net/gro_cells.h
index d15214d673b2..2a1abbf8da74 100644
--- a/include/net/gro_cells.h
+++ b/include/net/gro_cells.h
@@ -68,6 +68,9 @@ static inline int gro_cells_init(struct gro_cells *gcells, struct net_device *de
68 struct gro_cell *cell = per_cpu_ptr(gcells->cells, i); 68 struct gro_cell *cell = per_cpu_ptr(gcells->cells, i);
69 69
70 __skb_queue_head_init(&cell->napi_skbs); 70 __skb_queue_head_init(&cell->napi_skbs);
71
72 set_bit(NAPI_STATE_NO_BUSY_POLL, &cell->napi.state);
73
71 netif_napi_add(dev, &cell->napi, gro_cell_poll, 64); 74 netif_napi_add(dev, &cell->napi, gro_cell_poll, 64);
72 napi_enable(&cell->napi); 75 napi_enable(&cell->napi);
73 } 76 }
diff --git a/include/net/ip.h b/include/net/ip.h
index 5413883ac47f..d3a107850a41 100644
--- a/include/net/ip.h
+++ b/include/net/ip.h
@@ -47,8 +47,7 @@ struct inet_skb_parm {
47#define IPSKB_REROUTED BIT(4) 47#define IPSKB_REROUTED BIT(4)
48#define IPSKB_DOREDIRECT BIT(5) 48#define IPSKB_DOREDIRECT BIT(5)
49#define IPSKB_FRAG_PMTU BIT(6) 49#define IPSKB_FRAG_PMTU BIT(6)
50#define IPSKB_FRAG_SEGS BIT(7) 50#define IPSKB_L3SLAVE BIT(7)
51#define IPSKB_L3SLAVE BIT(8)
52 51
53 u16 frag_max_size; 52 u16 frag_max_size;
54}; 53};
diff --git a/include/net/ip6_tunnel.h b/include/net/ip6_tunnel.h
index 20ed9699fcd4..1b1cf33cbfb0 100644
--- a/include/net/ip6_tunnel.h
+++ b/include/net/ip6_tunnel.h
@@ -146,6 +146,7 @@ static inline void ip6tunnel_xmit(struct sock *sk, struct sk_buff *skb,
146{ 146{
147 int pkt_len, err; 147 int pkt_len, err;
148 148
149 memset(skb->cb, 0, sizeof(struct inet6_skb_parm));
149 pkt_len = skb->len - skb_inner_network_offset(skb); 150 pkt_len = skb->len - skb_inner_network_offset(skb);
150 err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb); 151 err = ip6_local_out(dev_net(skb_dst(skb)->dev), sk, skb);
151 if (unlikely(net_xmit_eval(err))) 152 if (unlikely(net_xmit_eval(err)))
diff --git a/include/net/ip_fib.h b/include/net/ip_fib.h
index b9314b48e39f..f390c3bb05c5 100644
--- a/include/net/ip_fib.h
+++ b/include/net/ip_fib.h
@@ -243,6 +243,7 @@ int fib_table_dump(struct fib_table *table, struct sk_buff *skb,
243 struct netlink_callback *cb); 243 struct netlink_callback *cb);
244int fib_table_flush(struct net *net, struct fib_table *table); 244int fib_table_flush(struct net *net, struct fib_table *table);
245struct fib_table *fib_trie_unmerge(struct fib_table *main_tb); 245struct fib_table *fib_trie_unmerge(struct fib_table *main_tb);
246void fib_table_flush_external(struct fib_table *table);
246void fib_free_table(struct fib_table *tb); 247void fib_free_table(struct fib_table *tb);
247 248
248#ifndef CONFIG_IP_MULTIPLE_TABLES 249#ifndef CONFIG_IP_MULTIPLE_TABLES
diff --git a/include/net/ipv6.h b/include/net/ipv6.h
index 8fed1cd78658..f11ca837361b 100644
--- a/include/net/ipv6.h
+++ b/include/net/ipv6.h
@@ -970,6 +970,8 @@ int compat_ipv6_setsockopt(struct sock *sk, int level, int optname,
970int compat_ipv6_getsockopt(struct sock *sk, int level, int optname, 970int compat_ipv6_getsockopt(struct sock *sk, int level, int optname,
971 char __user *optval, int __user *optlen); 971 char __user *optval, int __user *optlen);
972 972
973int __ip6_datagram_connect(struct sock *sk, struct sockaddr *addr,
974 int addr_len);
973int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len); 975int ip6_datagram_connect(struct sock *sk, struct sockaddr *addr, int addr_len);
974int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr, 976int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *addr,
975 int addr_len); 977 int addr_len);
diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
index fc4f757107df..0940598c002f 100644
--- a/include/net/net_namespace.h
+++ b/include/net/net_namespace.h
@@ -170,7 +170,7 @@ static inline struct net *copy_net_ns(unsigned long flags,
170extern struct list_head net_namespace_list; 170extern struct list_head net_namespace_list;
171 171
172struct net *get_net_ns_by_pid(pid_t pid); 172struct net *get_net_ns_by_pid(pid_t pid);
173struct net *get_net_ns_by_fd(int pid); 173struct net *get_net_ns_by_fd(int fd);
174 174
175#ifdef CONFIG_SYSCTL 175#ifdef CONFIG_SYSCTL
176void ipx_register_sysctl(void); 176void ipx_register_sysctl(void);
diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
index 50418052a520..d9d52c020a70 100644
--- a/include/net/netfilter/nf_conntrack.h
+++ b/include/net/netfilter/nf_conntrack.h
@@ -100,6 +100,9 @@ struct nf_conn {
100 100
101 possible_net_t ct_net; 101 possible_net_t ct_net;
102 102
103#if IS_ENABLED(CONFIG_NF_NAT)
104 struct rhlist_head nat_bysource;
105#endif
103 /* all members below initialized via memset */ 106 /* all members below initialized via memset */
104 u8 __nfct_init_offset[0]; 107 u8 __nfct_init_offset[0];
105 108
@@ -117,9 +120,6 @@ struct nf_conn {
117 /* Extensions */ 120 /* Extensions */
118 struct nf_ct_ext *ext; 121 struct nf_ct_ext *ext;
119 122
120#if IS_ENABLED(CONFIG_NF_NAT)
121 struct rhash_head nat_bysource;
122#endif
123 /* Storage reserved for other modules, must be the last member */ 123 /* Storage reserved for other modules, must be the last member */
124 union nf_conntrack_proto proto; 124 union nf_conntrack_proto proto;
125}; 125};
diff --git a/include/net/netfilter/nf_conntrack_labels.h b/include/net/netfilter/nf_conntrack_labels.h
index 498814626e28..1723a67c0b0a 100644
--- a/include/net/netfilter/nf_conntrack_labels.h
+++ b/include/net/netfilter/nf_conntrack_labels.h
@@ -30,8 +30,7 @@ static inline struct nf_conn_labels *nf_ct_labels_ext_add(struct nf_conn *ct)
30 if (net->ct.labels_used == 0) 30 if (net->ct.labels_used == 0)
31 return NULL; 31 return NULL;
32 32
33 return nf_ct_ext_add_length(ct, NF_CT_EXT_LABELS, 33 return nf_ct_ext_add(ct, NF_CT_EXT_LABELS, GFP_ATOMIC);
34 sizeof(struct nf_conn_labels), GFP_ATOMIC);
35#else 34#else
36 return NULL; 35 return NULL;
37#endif 36#endif
diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h
index 5031e072567b..b02af0bf5777 100644
--- a/include/net/netfilter/nf_tables.h
+++ b/include/net/netfilter/nf_tables.h
@@ -145,7 +145,7 @@ static inline enum nft_registers nft_type_to_reg(enum nft_data_types type)
145 return type == NFT_DATA_VERDICT ? NFT_REG_VERDICT : NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE; 145 return type == NFT_DATA_VERDICT ? NFT_REG_VERDICT : NFT_REG_1 * NFT_REG_SIZE / NFT_REG32_SIZE;
146} 146}
147 147
148unsigned int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest); 148int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest);
149unsigned int nft_parse_register(const struct nlattr *attr); 149unsigned int nft_parse_register(const struct nlattr *attr);
150int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg); 150int nft_dump_register(struct sk_buff *skb, unsigned int attr, unsigned int reg);
151 151
@@ -313,7 +313,7 @@ void nft_unregister_set(struct nft_set_ops *ops);
313 * @size: maximum set size 313 * @size: maximum set size
314 * @nelems: number of elements 314 * @nelems: number of elements
315 * @ndeact: number of deactivated elements queued for removal 315 * @ndeact: number of deactivated elements queued for removal
316 * @timeout: default timeout value in msecs 316 * @timeout: default timeout value in jiffies
317 * @gc_int: garbage collection interval in msecs 317 * @gc_int: garbage collection interval in msecs
318 * @policy: set parameterization (see enum nft_set_policies) 318 * @policy: set parameterization (see enum nft_set_policies)
319 * @udlen: user data length 319 * @udlen: user data length
@@ -542,7 +542,8 @@ void *nft_set_elem_init(const struct nft_set *set,
542 const struct nft_set_ext_tmpl *tmpl, 542 const struct nft_set_ext_tmpl *tmpl,
543 const u32 *key, const u32 *data, 543 const u32 *key, const u32 *data,
544 u64 timeout, gfp_t gfp); 544 u64 timeout, gfp_t gfp);
545void nft_set_elem_destroy(const struct nft_set *set, void *elem); 545void nft_set_elem_destroy(const struct nft_set *set, void *elem,
546 bool destroy_expr);
546 547
547/** 548/**
548 * struct nft_set_gc_batch_head - nf_tables set garbage collection batch 549 * struct nft_set_gc_batch_head - nf_tables set garbage collection batch
@@ -693,7 +694,6 @@ static inline int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src)
693{ 694{
694 int err; 695 int err;
695 696
696 __module_get(src->ops->type->owner);
697 if (src->ops->clone) { 697 if (src->ops->clone) {
698 dst->ops = src->ops; 698 dst->ops = src->ops;
699 err = src->ops->clone(dst, src); 699 err = src->ops->clone(dst, src);
@@ -702,6 +702,8 @@ static inline int nft_expr_clone(struct nft_expr *dst, struct nft_expr *src)
702 } else { 702 } else {
703 memcpy(dst, src, src->ops->size); 703 memcpy(dst, src, src->ops->size);
704 } 704 }
705
706 __module_get(src->ops->type->owner);
705 return 0; 707 return 0;
706} 708}
707 709
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
index 87a7f42e7639..31acc3f4f132 100644
--- a/include/net/sctp/sctp.h
+++ b/include/net/sctp/sctp.h
@@ -152,7 +152,7 @@ void sctp_unhash_endpoint(struct sctp_endpoint *);
152struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *, 152struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *,
153 struct sctphdr *, struct sctp_association **, 153 struct sctphdr *, struct sctp_association **,
154 struct sctp_transport **); 154 struct sctp_transport **);
155void sctp_err_finish(struct sock *, struct sctp_association *); 155void sctp_err_finish(struct sock *, struct sctp_transport *);
156void sctp_icmp_frag_needed(struct sock *, struct sctp_association *, 156void sctp_icmp_frag_needed(struct sock *, struct sctp_association *,
157 struct sctp_transport *t, __u32 pmtu); 157 struct sctp_transport *t, __u32 pmtu);
158void sctp_icmp_redirect(struct sock *, struct sctp_transport *, 158void sctp_icmp_redirect(struct sock *, struct sctp_transport *,
diff --git a/include/net/sock.h b/include/net/sock.h
index 73c6b008f1b7..92b269709b9a 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -1596,11 +1596,11 @@ static inline void sock_put(struct sock *sk)
1596void sock_gen_put(struct sock *sk); 1596void sock_gen_put(struct sock *sk);
1597 1597
1598int __sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested, 1598int __sk_receive_skb(struct sock *sk, struct sk_buff *skb, const int nested,
1599 unsigned int trim_cap); 1599 unsigned int trim_cap, bool refcounted);
1600static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb, 1600static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb,
1601 const int nested) 1601 const int nested)
1602{ 1602{
1603 return __sk_receive_skb(sk, skb, nested, 1); 1603 return __sk_receive_skb(sk, skb, nested, 1, true);
1604} 1604}
1605 1605
1606static inline void sk_tx_queue_set(struct sock *sk, int tx_queue) 1606static inline void sk_tx_queue_set(struct sock *sk, int tx_queue)
diff --git a/include/net/tcp.h b/include/net/tcp.h
index 5b82d4d94834..123979fe12bf 100644
--- a/include/net/tcp.h
+++ b/include/net/tcp.h
@@ -805,7 +805,7 @@ static inline bool inet_exact_dif_match(struct net *net, struct sk_buff *skb)
805{ 805{
806#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV) 806#if IS_ENABLED(CONFIG_NET_L3_MASTER_DEV)
807 if (!net->ipv4.sysctl_tcp_l3mdev_accept && 807 if (!net->ipv4.sysctl_tcp_l3mdev_accept &&
808 ipv4_l3mdev_skb(TCP_SKB_CB(skb)->header.h4.flags)) 808 skb && ipv4_l3mdev_skb(TCP_SKB_CB(skb)->header.h4.flags))
809 return true; 809 return true;
810#endif 810#endif
811 return false; 811 return false;
@@ -1220,6 +1220,7 @@ static inline void tcp_prequeue_init(struct tcp_sock *tp)
1220 1220
1221bool tcp_prequeue(struct sock *sk, struct sk_buff *skb); 1221bool tcp_prequeue(struct sock *sk, struct sk_buff *skb);
1222bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb); 1222bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb);
1223int tcp_filter(struct sock *sk, struct sk_buff *skb);
1223 1224
1224#undef STATE_TRACE 1225#undef STATE_TRACE
1225 1226
diff --git a/include/sound/cs35l34.h b/include/sound/cs35l34.h
new file mode 100644
index 000000000000..9c927cffbe46
--- /dev/null
+++ b/include/sound/cs35l34.h
@@ -0,0 +1,35 @@
1/*
2 * linux/sound/cs35l34.h -- Platform data for CS35l34
3 *
4 * Copyright (c) 2016 Cirrus Logic Inc.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __CS35L34_H
12#define __CS35L34_H
13
14struct cs35l34_platform_data {
15 /* Set AIF to half drive strength */
16 bool aif_half_drv;
17 /* Digital Soft Ramp Disable */
18 bool digsft_disable;
19 /* Amplifier Invert */
20 bool amp_inv;
21 /* Peak current (mA) */
22 unsigned int boost_peak;
23 /* Boost inductor value (nH) */
24 unsigned int boost_ind;
25 /* Boost Controller Voltage Setting (mV) */
26 unsigned int boost_vtge;
27 /* Gain Change Zero Cross */
28 bool gain_zc_disable;
29 /* SDIN Left/Right Selection */
30 unsigned int i2s_sdinloc;
31 /* TDM Rising Edge */
32 bool tdm_rising_edge;
33};
34
35#endif /* __CS35L34_H */
diff --git a/include/sound/dmaengine_pcm.h b/include/sound/dmaengine_pcm.h
index 67be2445941a..1c8f9e1ef2a5 100644
--- a/include/sound/dmaengine_pcm.h
+++ b/include/sound/dmaengine_pcm.h
@@ -71,7 +71,6 @@ struct dma_chan *snd_dmaengine_pcm_get_chan(struct snd_pcm_substream *substream)
71 * @slave_id: Slave requester id for the DMA channel. 71 * @slave_id: Slave requester id for the DMA channel.
72 * @filter_data: Custom DMA channel filter data, this will usually be used when 72 * @filter_data: Custom DMA channel filter data, this will usually be used when
73 * requesting the DMA channel. 73 * requesting the DMA channel.
74 * @chan_name: Custom channel name to use when requesting DMA channel.
75 * @fifo_size: FIFO size of the DAI controller in bytes 74 * @fifo_size: FIFO size of the DAI controller in bytes
76 * @flags: PCM_DAI flags, only SND_DMAENGINE_PCM_DAI_FLAG_PACK for now 75 * @flags: PCM_DAI flags, only SND_DMAENGINE_PCM_DAI_FLAG_PACK for now
77 */ 76 */
@@ -81,7 +80,6 @@ struct snd_dmaengine_dai_dma_data {
81 u32 maxburst; 80 u32 maxburst;
82 unsigned int slave_id; 81 unsigned int slave_id;
83 void *filter_data; 82 void *filter_data;
84 const char *chan_name;
85 unsigned int fifo_size; 83 unsigned int fifo_size;
86 unsigned int flags; 84 unsigned int flags;
87}; 85};
@@ -107,10 +105,6 @@ void snd_dmaengine_pcm_set_config_from_dai_data(
107 * playback. 105 * playback.
108 */ 106 */
109#define SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX BIT(3) 107#define SND_DMAENGINE_PCM_FLAG_HALF_DUPLEX BIT(3)
110/*
111 * The PCM streams have custom channel names specified.
112 */
113#define SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME BIT(4)
114 108
115/** 109/**
116 * struct snd_dmaengine_pcm_config - Configuration data for dmaengine based PCM 110 * struct snd_dmaengine_pcm_config - Configuration data for dmaengine based PCM
diff --git a/include/sound/rt5514.h b/include/sound/rt5514.h
new file mode 100644
index 000000000000..ef18494769ee
--- /dev/null
+++ b/include/sound/rt5514.h
@@ -0,0 +1,20 @@
1/*
2 * linux/sound/rt5514.h -- Platform data for RT5514
3 *
4 * Copyright 2016 Realtek Semiconductor Corp.
5 * Author: Oder Chiou <oder_chiou@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __LINUX_SND_RT5514_H
13#define __LINUX_SND_RT5514_H
14
15struct rt5514_platform_data {
16 unsigned int dmic_init_delay;
17};
18
19#endif
20
diff --git a/include/sound/rt5665.h b/include/sound/rt5665.h
new file mode 100755
index 000000000000..963229e71dc7
--- /dev/null
+++ b/include/sound/rt5665.h
@@ -0,0 +1,47 @@
1/*
2 * linux/sound/rt5665.h -- Platform data for RT5665
3 *
4 * Copyright 2016 Realtek Microelectronics
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 */
10
11#ifndef __LINUX_SND_RT5665_H
12#define __LINUX_SND_RT5665_H
13
14enum rt5665_dmic1_data_pin {
15 RT5665_DMIC1_NULL,
16 RT5665_DMIC1_DATA_GPIO4,
17 RT5665_DMIC1_DATA_IN2N,
18};
19
20enum rt5665_dmic2_data_pin {
21 RT5665_DMIC2_NULL,
22 RT5665_DMIC2_DATA_GPIO5,
23 RT5665_DMIC2_DATA_IN2P,
24};
25
26enum rt5665_jd_src {
27 RT5665_JD_NULL,
28 RT5665_JD1,
29};
30
31struct rt5665_platform_data {
32 bool in1_diff;
33 bool in2_diff;
34 bool in3_diff;
35 bool in4_diff;
36
37 int ldo1_en; /* GPIO for LDO1_EN */
38
39 enum rt5665_dmic1_data_pin dmic1_data_pin;
40 enum rt5665_dmic2_data_pin dmic2_data_pin;
41 enum rt5665_jd_src jd_src;
42
43 unsigned int sar_hs_type;
44};
45
46#endif
47
diff --git a/include/sound/simple_card_utils.h b/include/sound/simple_card_utils.h
index fd6412551145..64e90ca9ad32 100644
--- a/include/sound/simple_card_utils.h
+++ b/include/sound/simple_card_utils.h
@@ -1,5 +1,5 @@
1/* 1/*
2 * simple_card_core.h 2 * simple_card_utils.h
3 * 3 *
4 * Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 4 * Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
5 * 5 *
@@ -7,8 +7,8 @@
7 * it under the terms of the GNU General Public License version 2 as 7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation. 8 * published by the Free Software Foundation.
9 */ 9 */
10#ifndef __SIMPLE_CARD_CORE_H 10#ifndef __SIMPLE_CARD_UTILS_H
11#define __SIMPLE_CARD_CORE_H 11#define __SIMPLE_CARD_UTILS_H
12 12
13#include <sound/soc.h> 13#include <sound/soc.h>
14 14
@@ -68,4 +68,4 @@ void asoc_simple_card_canonicalize_cpu(struct snd_soc_dai_link *dai_link,
68 68
69int asoc_simple_card_clean_reference(struct snd_soc_card *card); 69int asoc_simple_card_clean_reference(struct snd_soc_card *card);
70 70
71#endif /* __SIMPLE_CARD_CORE_H */ 71#endif /* __SIMPLE_CARD_UTILS_H */
diff --git a/include/sound/soc-dai.h b/include/sound/soc-dai.h
index 964b7de1a1cc..200e1f04c166 100644
--- a/include/sound/soc-dai.h
+++ b/include/sound/soc-dai.h
@@ -15,6 +15,7 @@
15 15
16 16
17#include <linux/list.h> 17#include <linux/list.h>
18#include <sound/asoc.h>
18 19
19struct snd_pcm_substream; 20struct snd_pcm_substream;
20struct snd_soc_dapm_widget; 21struct snd_soc_dapm_widget;
@@ -26,13 +27,13 @@ struct snd_compr_stream;
26 * Describes the physical PCM data formating and clocking. Add new formats 27 * Describes the physical PCM data formating and clocking. Add new formats
27 * to the end. 28 * to the end.
28 */ 29 */
29#define SND_SOC_DAIFMT_I2S 1 /* I2S mode */ 30#define SND_SOC_DAIFMT_I2S SND_SOC_DAI_FORMAT_I2S
30#define SND_SOC_DAIFMT_RIGHT_J 2 /* Right Justified mode */ 31#define SND_SOC_DAIFMT_RIGHT_J SND_SOC_DAI_FORMAT_RIGHT_J
31#define SND_SOC_DAIFMT_LEFT_J 3 /* Left Justified mode */ 32#define SND_SOC_DAIFMT_LEFT_J SND_SOC_DAI_FORMAT_LEFT_J
32#define SND_SOC_DAIFMT_DSP_A 4 /* L data MSB after FRM LRC */ 33#define SND_SOC_DAIFMT_DSP_A SND_SOC_DAI_FORMAT_DSP_A
33#define SND_SOC_DAIFMT_DSP_B 5 /* L data MSB during FRM LRC */ 34#define SND_SOC_DAIFMT_DSP_B SND_SOC_DAI_FORMAT_DSP_B
34#define SND_SOC_DAIFMT_AC97 6 /* AC97 */ 35#define SND_SOC_DAIFMT_AC97 SND_SOC_DAI_FORMAT_AC97
35#define SND_SOC_DAIFMT_PDM 7 /* Pulse density modulation */ 36#define SND_SOC_DAIFMT_PDM SND_SOC_DAI_FORMAT_PDM
36 37
37/* left and right justified also known as MSB and LSB respectively */ 38/* left and right justified also known as MSB and LSB respectively */
38#define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J 39#define SND_SOC_DAIFMT_MSB SND_SOC_DAIFMT_LEFT_J
@@ -207,6 +208,30 @@ struct snd_soc_dai_ops {
207 struct snd_soc_dai *); 208 struct snd_soc_dai *);
208}; 209};
209 210
211struct snd_soc_cdai_ops {
212 /*
213 * for compress ops
214 */
215 int (*startup)(struct snd_compr_stream *,
216 struct snd_soc_dai *);
217 int (*shutdown)(struct snd_compr_stream *,
218 struct snd_soc_dai *);
219 int (*set_params)(struct snd_compr_stream *,
220 struct snd_compr_params *, struct snd_soc_dai *);
221 int (*get_params)(struct snd_compr_stream *,
222 struct snd_codec *, struct snd_soc_dai *);
223 int (*set_metadata)(struct snd_compr_stream *,
224 struct snd_compr_metadata *, struct snd_soc_dai *);
225 int (*get_metadata)(struct snd_compr_stream *,
226 struct snd_compr_metadata *, struct snd_soc_dai *);
227 int (*trigger)(struct snd_compr_stream *, int,
228 struct snd_soc_dai *);
229 int (*pointer)(struct snd_compr_stream *,
230 struct snd_compr_tstamp *, struct snd_soc_dai *);
231 int (*ack)(struct snd_compr_stream *, size_t,
232 struct snd_soc_dai *);
233};
234
210/* 235/*
211 * Digital Audio Interface Driver. 236 * Digital Audio Interface Driver.
212 * 237 *
@@ -236,6 +261,7 @@ struct snd_soc_dai_driver {
236 261
237 /* ops */ 262 /* ops */
238 const struct snd_soc_dai_ops *ops; 263 const struct snd_soc_dai_ops *ops;
264 const struct snd_soc_cdai_ops *cops;
239 265
240 /* DAI capabilities */ 266 /* DAI capabilities */
241 struct snd_soc_pcm_stream capture; 267 struct snd_soc_pcm_stream capture;
@@ -268,8 +294,9 @@ struct snd_soc_dai {
268 unsigned int symmetric_rates:1; 294 unsigned int symmetric_rates:1;
269 unsigned int symmetric_channels:1; 295 unsigned int symmetric_channels:1;
270 unsigned int symmetric_samplebits:1; 296 unsigned int symmetric_samplebits:1;
297 unsigned int probed:1;
298
271 unsigned int active; 299 unsigned int active;
272 unsigned char probed:1;
273 300
274 struct snd_soc_dapm_widget *playback_widget; 301 struct snd_soc_dapm_widget *playback_widget;
275 struct snd_soc_dapm_widget *capture_widget; 302 struct snd_soc_dapm_widget *capture_widget;
diff --git a/include/sound/soc-dapm.h b/include/sound/soc-dapm.h
index f60d755f7ac6..a466f4bdc835 100644
--- a/include/sound/soc-dapm.h
+++ b/include/sound/soc-dapm.h
@@ -272,6 +272,16 @@ struct device;
272 272
273 273
274/* dapm kcontrol types */ 274/* dapm kcontrol types */
275#define SOC_DAPM_DOUBLE(xname, reg, lshift, rshift, max, invert) \
276{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
277 .info = snd_soc_info_volsw, \
278 .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
279 .private_value = SOC_DOUBLE_VALUE(reg, lshift, rshift, max, invert, 0) }
280#define SOC_DAPM_DOUBLE_R(xname, lreg, rreg, shift, max, invert) \
281{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
282 .info = snd_soc_info_volsw, \
283 .get = snd_soc_dapm_get_volsw, .put = snd_soc_dapm_put_volsw, \
284 .private_value = SOC_DOUBLE_R_VALUE(lreg, rreg, shift, max, invert) }
275#define SOC_DAPM_SINGLE(xname, reg, shift, max, invert) \ 285#define SOC_DAPM_SINGLE(xname, reg, shift, max, invert) \
276{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \ 286{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
277 .info = snd_soc_info_volsw, \ 287 .info = snd_soc_info_volsw, \
@@ -615,6 +625,10 @@ struct snd_soc_dapm_update {
615 int reg; 625 int reg;
616 int mask; 626 int mask;
617 int val; 627 int val;
628 int reg2;
629 int mask2;
630 int val2;
631 bool has_second_set;
618}; 632};
619 633
620struct snd_soc_dapm_wcache { 634struct snd_soc_dapm_wcache {
diff --git a/include/sound/soc-topology.h b/include/sound/soc-topology.h
index b897b9d63161..f9cc7b9271ac 100644
--- a/include/sound/soc-topology.h
+++ b/include/sound/soc-topology.h
@@ -53,7 +53,7 @@ struct snd_soc_dobj_control {
53 53
54/* dynamic widget object */ 54/* dynamic widget object */
55struct snd_soc_dobj_widget { 55struct snd_soc_dobj_widget {
56 unsigned int kcontrol_enum:1; /* this widget is an enum kcontrol */ 56 unsigned int kcontrol_type; /* kcontrol type: mixer, enum, bytes */
57}; 57};
58 58
59/* generic dynamic object - all dynamic objects belong to this struct */ 59/* generic dynamic object - all dynamic objects belong to this struct */
diff --git a/include/sound/soc.h b/include/sound/soc.h
index 4f1c784e44f6..2b502f6cc6d0 100644
--- a/include/sound/soc.h
+++ b/include/sound/soc.h
@@ -782,6 +782,8 @@ struct snd_soc_component_driver {
782 782
783 int (*probe)(struct snd_soc_component *); 783 int (*probe)(struct snd_soc_component *);
784 void (*remove)(struct snd_soc_component *); 784 void (*remove)(struct snd_soc_component *);
785 int (*suspend)(struct snd_soc_component *);
786 int (*resume)(struct snd_soc_component *);
785 787
786 /* DT */ 788 /* DT */
787 int (*of_xlate_dai_name)(struct snd_soc_component *component, 789 int (*of_xlate_dai_name)(struct snd_soc_component *component,
@@ -807,9 +809,11 @@ struct snd_soc_component {
807 809
808 unsigned int ignore_pmdown_time:1; /* pmdown_time is ignored at stop */ 810 unsigned int ignore_pmdown_time:1; /* pmdown_time is ignored at stop */
809 unsigned int registered_as_component:1; 811 unsigned int registered_as_component:1;
812 unsigned int auxiliary:1; /* for auxiliary component of the card */
813 unsigned int suspended:1; /* is in suspend PM state */
810 814
811 struct list_head list; 815 struct list_head list;
812 struct list_head list_aux; /* for auxiliary component of the card */ 816 struct list_head card_list;
813 817
814 struct snd_soc_dai_driver *dai_drv; 818 struct snd_soc_dai_driver *dai_drv;
815 int num_dai; 819 int num_dai;
@@ -852,6 +856,8 @@ struct snd_soc_component {
852 856
853 int (*probe)(struct snd_soc_component *); 857 int (*probe)(struct snd_soc_component *);
854 void (*remove)(struct snd_soc_component *); 858 void (*remove)(struct snd_soc_component *);
859 int (*suspend)(struct snd_soc_component *);
860 int (*resume)(struct snd_soc_component *);
855 861
856 /* machine specific init */ 862 /* machine specific init */
857 int (*init)(struct snd_soc_component *component); 863 int (*init)(struct snd_soc_component *component);
@@ -868,11 +874,9 @@ struct snd_soc_codec {
868 const struct snd_soc_codec_driver *driver; 874 const struct snd_soc_codec_driver *driver;
869 875
870 struct list_head list; 876 struct list_head list;
871 struct list_head card_list;
872 877
873 /* runtime */ 878 /* runtime */
874 unsigned int cache_bypass:1; /* Suppress access to the cache */ 879 unsigned int cache_bypass:1; /* Suppress access to the cache */
875 unsigned int suspended:1; /* Codec is in suspend PM state */
876 unsigned int cache_init:1; /* codec cache has been initialized */ 880 unsigned int cache_init:1; /* codec cache has been initialized */
877 881
878 /* codec IO */ 882 /* codec IO */
@@ -1025,13 +1029,13 @@ struct snd_soc_dai_link {
1025 const struct snd_soc_ops *ops; 1029 const struct snd_soc_ops *ops;
1026 const struct snd_soc_compr_ops *compr_ops; 1030 const struct snd_soc_compr_ops *compr_ops;
1027 1031
1028 /* For unidirectional dai links */
1029 bool playback_only;
1030 bool capture_only;
1031
1032 /* Mark this pcm with non atomic ops */ 1032 /* Mark this pcm with non atomic ops */
1033 bool nonatomic; 1033 bool nonatomic;
1034 1034
1035 /* For unidirectional dai links */
1036 unsigned int playback_only:1;
1037 unsigned int capture_only:1;
1038
1035 /* Keep DAI active over suspend */ 1039 /* Keep DAI active over suspend */
1036 unsigned int ignore_suspend:1; 1040 unsigned int ignore_suspend:1;
1037 1041
@@ -1148,7 +1152,6 @@ struct snd_soc_card {
1148 */ 1152 */
1149 struct snd_soc_aux_dev *aux_dev; 1153 struct snd_soc_aux_dev *aux_dev;
1150 int num_aux_devs; 1154 int num_aux_devs;
1151 struct list_head aux_comp_list;
1152 1155
1153 const struct snd_kcontrol_new *controls; 1156 const struct snd_kcontrol_new *controls;
1154 int num_controls; 1157 int num_controls;
@@ -1170,7 +1173,7 @@ struct snd_soc_card {
1170 struct work_struct deferred_resume_work; 1173 struct work_struct deferred_resume_work;
1171 1174
1172 /* lists of probed devices belonging to this card */ 1175 /* lists of probed devices belonging to this card */
1173 struct list_head codec_dev_list; 1176 struct list_head component_dev_list;
1174 1177
1175 struct list_head widgets; 1178 struct list_head widgets;
1176 struct list_head paths; 1179 struct list_head paths;
@@ -1203,14 +1206,11 @@ struct snd_soc_pcm_runtime {
1203 enum snd_soc_pcm_subclass pcm_subclass; 1206 enum snd_soc_pcm_subclass pcm_subclass;
1204 struct snd_pcm_ops ops; 1207 struct snd_pcm_ops ops;
1205 1208
1206 unsigned int dev_registered:1;
1207
1208 /* Dynamic PCM BE runtime data */ 1209 /* Dynamic PCM BE runtime data */
1209 struct snd_soc_dpcm_runtime dpcm[2]; 1210 struct snd_soc_dpcm_runtime dpcm[2];
1210 int fe_compr; 1211 int fe_compr;
1211 1212
1212 long pmdown_time; 1213 long pmdown_time;
1213 unsigned char pop_wait:1;
1214 1214
1215 /* runtime devices */ 1215 /* runtime devices */
1216 struct snd_pcm *pcm; 1216 struct snd_pcm *pcm;
@@ -1219,7 +1219,6 @@ struct snd_soc_pcm_runtime {
1219 struct snd_soc_platform *platform; 1219 struct snd_soc_platform *platform;
1220 struct snd_soc_dai *codec_dai; 1220 struct snd_soc_dai *codec_dai;
1221 struct snd_soc_dai *cpu_dai; 1221 struct snd_soc_dai *cpu_dai;
1222 struct snd_soc_component *component; /* Only valid for AUX dev rtds */
1223 1222
1224 struct snd_soc_dai **codec_dais; 1223 struct snd_soc_dai **codec_dais;
1225 unsigned int num_codecs; 1224 unsigned int num_codecs;
@@ -1232,6 +1231,10 @@ struct snd_soc_pcm_runtime {
1232 1231
1233 unsigned int num; /* 0-based and monotonic increasing */ 1232 unsigned int num; /* 0-based and monotonic increasing */
1234 struct list_head list; /* rtd list of the soc card */ 1233 struct list_head list; /* rtd list of the soc card */
1234
1235 /* bit field */
1236 unsigned int dev_registered:1;
1237 unsigned int pop_wait:1;
1235}; 1238};
1236 1239
1237/* mixer control */ 1240/* mixer control */
@@ -1541,11 +1544,10 @@ static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platfo
1541 1544
1542static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card) 1545static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
1543{ 1546{
1544 INIT_LIST_HEAD(&card->codec_dev_list);
1545 INIT_LIST_HEAD(&card->widgets); 1547 INIT_LIST_HEAD(&card->widgets);
1546 INIT_LIST_HEAD(&card->paths); 1548 INIT_LIST_HEAD(&card->paths);
1547 INIT_LIST_HEAD(&card->dapm_list); 1549 INIT_LIST_HEAD(&card->dapm_list);
1548 INIT_LIST_HEAD(&card->aux_comp_list); 1550 INIT_LIST_HEAD(&card->component_dev_list);
1549} 1551}
1550 1552
1551static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc) 1553static inline bool snd_soc_volsw_is_stereo(struct soc_mixer_control *mc)
@@ -1642,25 +1644,43 @@ static inline struct snd_soc_platform *snd_soc_kcontrol_platform(
1642int snd_soc_util_init(void); 1644int snd_soc_util_init(void);
1643void snd_soc_util_exit(void); 1645void snd_soc_util_exit(void);
1644 1646
1645int snd_soc_of_parse_card_name(struct snd_soc_card *card, 1647#define snd_soc_of_parse_card_name(card, propname) \
1646 const char *propname); 1648 snd_soc_of_parse_card_name_from_node(card, NULL, propname)
1647int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card, 1649int snd_soc_of_parse_card_name_from_node(struct snd_soc_card *card,
1648 const char *propname); 1650 struct device_node *np,
1651 const char *propname);
1652#define snd_soc_of_parse_audio_simple_widgets(card, propname)\
1653 snd_soc_of_parse_audio_simple_widgets_from_node(card, NULL, propname)
1654int snd_soc_of_parse_audio_simple_widgets_from_node(struct snd_soc_card *card,
1655 struct device_node *np,
1656 const char *propname);
1657
1649int snd_soc_of_parse_tdm_slot(struct device_node *np, 1658int snd_soc_of_parse_tdm_slot(struct device_node *np,
1650 unsigned int *tx_mask, 1659 unsigned int *tx_mask,
1651 unsigned int *rx_mask, 1660 unsigned int *rx_mask,
1652 unsigned int *slots, 1661 unsigned int *slots,
1653 unsigned int *slot_width); 1662 unsigned int *slot_width);
1654void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card, 1663#define snd_soc_of_parse_audio_prefix(card, codec_conf, of_node, propname) \
1664 snd_soc_of_parse_audio_prefix_from_node(card, NULL, codec_conf, \
1665 of_node, propname)
1666void snd_soc_of_parse_audio_prefix_from_node(struct snd_soc_card *card,
1667 struct device_node *np,
1655 struct snd_soc_codec_conf *codec_conf, 1668 struct snd_soc_codec_conf *codec_conf,
1656 struct device_node *of_node, 1669 struct device_node *of_node,
1657 const char *propname); 1670 const char *propname);
1658int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, 1671
1659 const char *propname); 1672#define snd_soc_of_parse_audio_routing(card, propname) \
1673 snd_soc_of_parse_audio_routing_from_node(card, NULL, propname)
1674int snd_soc_of_parse_audio_routing_from_node(struct snd_soc_card *card,
1675 struct device_node *np,
1676 const char *propname);
1677
1660unsigned int snd_soc_of_parse_daifmt(struct device_node *np, 1678unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
1661 const char *prefix, 1679 const char *prefix,
1662 struct device_node **bitclkmaster, 1680 struct device_node **bitclkmaster,
1663 struct device_node **framemaster); 1681 struct device_node **framemaster);
1682int snd_soc_get_dai_name(struct of_phandle_args *args,
1683 const char **dai_name);
1664int snd_soc_of_get_dai_name(struct device_node *of_node, 1684int snd_soc_of_get_dai_name(struct device_node *of_node,
1665 const char **dai_name); 1685 const char **dai_name);
1666int snd_soc_of_get_dai_link_codecs(struct device *dev, 1686int snd_soc_of_get_dai_link_codecs(struct device *dev,
@@ -1671,6 +1691,9 @@ int snd_soc_add_dai_link(struct snd_soc_card *card,
1671 struct snd_soc_dai_link *dai_link); 1691 struct snd_soc_dai_link *dai_link);
1672void snd_soc_remove_dai_link(struct snd_soc_card *card, 1692void snd_soc_remove_dai_link(struct snd_soc_card *card,
1673 struct snd_soc_dai_link *dai_link); 1693 struct snd_soc_dai_link *dai_link);
1694struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
1695 int id, const char *name,
1696 const char *stream_name);
1674 1697
1675int snd_soc_register_dai(struct snd_soc_component *component, 1698int snd_soc_register_dai(struct snd_soc_component *component,
1676 struct snd_soc_dai_driver *dai_drv); 1699 struct snd_soc_dai_driver *dai_drv);
@@ -1697,4 +1720,24 @@ static inline void snd_soc_dapm_mutex_unlock(struct snd_soc_dapm_context *dapm)
1697 mutex_unlock(&dapm->card->dapm_mutex); 1720 mutex_unlock(&dapm->card->dapm_mutex);
1698} 1721}
1699 1722
1723int snd_soc_component_enable_pin(struct snd_soc_component *component,
1724 const char *pin);
1725int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
1726 const char *pin);
1727int snd_soc_component_disable_pin(struct snd_soc_component *component,
1728 const char *pin);
1729int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
1730 const char *pin);
1731int snd_soc_component_nc_pin(struct snd_soc_component *component,
1732 const char *pin);
1733int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
1734 const char *pin);
1735int snd_soc_component_get_pin_status(struct snd_soc_component *component,
1736 const char *pin);
1737int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
1738 const char *pin);
1739int snd_soc_component_force_enable_pin_unlocked(
1740 struct snd_soc_component *component,
1741 const char *pin);
1742
1700#endif 1743#endif
diff --git a/include/uapi/linux/atm_zatm.h b/include/uapi/linux/atm_zatm.h
index 5cd4d4d2dd1d..9c9c6ad55f14 100644
--- a/include/uapi/linux/atm_zatm.h
+++ b/include/uapi/linux/atm_zatm.h
@@ -14,7 +14,6 @@
14 14
15#include <linux/atmapi.h> 15#include <linux/atmapi.h>
16#include <linux/atmioc.h> 16#include <linux/atmioc.h>
17#include <linux/time.h>
18 17
19#define ZATM_GETPOOL _IOW('a',ATMIOC_SARPRV+1,struct atmif_sioc) 18#define ZATM_GETPOOL _IOW('a',ATMIOC_SARPRV+1,struct atmif_sioc)
20 /* get pool statistics */ 19 /* get pool statistics */
diff --git a/include/uapi/linux/bpqether.h b/include/uapi/linux/bpqether.h
index a6c35e1a89ad..05865edaefda 100644
--- a/include/uapi/linux/bpqether.h
+++ b/include/uapi/linux/bpqether.h
@@ -5,9 +5,7 @@
5 * Defines for the BPQETHER pseudo device driver 5 * Defines for the BPQETHER pseudo device driver
6 */ 6 */
7 7
8#ifndef __LINUX_IF_ETHER_H
9#include <linux/if_ether.h> 8#include <linux/if_ether.h>
10#endif
11 9
12#define SIOCSBPQETHOPT (SIOCDEVPRIVATE+0) /* reserved */ 10#define SIOCSBPQETHOPT (SIOCDEVPRIVATE+0) /* reserved */
13#define SIOCSBPQETHADDR (SIOCDEVPRIVATE+1) 11#define SIOCSBPQETHADDR (SIOCDEVPRIVATE+1)
diff --git a/include/uapi/linux/can.h b/include/uapi/linux/can.h
index 9692cda5f8fc..c48d93a28d1a 100644
--- a/include/uapi/linux/can.h
+++ b/include/uapi/linux/can.h
@@ -196,5 +196,6 @@ struct can_filter {
196}; 196};
197 197
198#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */ 198#define CAN_INV_FILTER 0x20000000U /* to be set in can_filter.can_id */
199#define CAN_RAW_FILTER_MAX 512 /* maximum number of can_filter set via setsockopt() */
199 200
200#endif /* !_UAPI_CAN_H */ 201#endif /* !_UAPI_CAN_H */
diff --git a/include/uapi/linux/if.h b/include/uapi/linux/if.h
index e601c8c3bdc7..1158a043342a 100644
--- a/include/uapi/linux/if.h
+++ b/include/uapi/linux/if.h
@@ -31,7 +31,7 @@
31#include <linux/hdlc/ioctl.h> 31#include <linux/hdlc/ioctl.h>
32 32
33/* For glibc compatibility. An empty enum does not compile. */ 33/* For glibc compatibility. An empty enum does not compile. */
34#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 && \ 34#if __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || \
35 __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 35 __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0
36/** 36/**
37 * enum net_device_flags - &struct net_device flags 37 * enum net_device_flags - &struct net_device flags
@@ -99,7 +99,7 @@ enum net_device_flags {
99 IFF_ECHO = 1<<18, /* volatile */ 99 IFF_ECHO = 1<<18, /* volatile */
100#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */ 100#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO */
101}; 101};
102#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 && __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */ 102#endif /* __UAPI_DEF_IF_NET_DEVICE_FLAGS_LOWER_UP_DORMANT_ECHO != 0 || __UAPI_DEF_IF_NET_DEVICE_FLAGS != 0 */
103 103
104/* for compatibility with glibc net/if.h */ 104/* for compatibility with glibc net/if.h */
105#if __UAPI_DEF_IF_NET_DEVICE_FLAGS 105#if __UAPI_DEF_IF_NET_DEVICE_FLAGS
diff --git a/include/uapi/linux/input-event-codes.h b/include/uapi/linux/input-event-codes.h
index d6d071fc3c56..3af60ee69053 100644
--- a/include/uapi/linux/input-event-codes.h
+++ b/include/uapi/linux/input-event-codes.h
@@ -640,7 +640,7 @@
640 * Control a data application associated with the currently viewed channel, 640 * Control a data application associated with the currently viewed channel,
641 * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.) 641 * e.g. teletext or data broadcast application (MHEG, MHP, HbbTV, etc.)
642 */ 642 */
643#define KEY_DATA 0x275 643#define KEY_DATA 0x277
644 644
645#define BTN_TRIGGER_HAPPY 0x2c0 645#define BTN_TRIGGER_HAPPY 0x2c0
646#define BTN_TRIGGER_HAPPY1 0x2c0 646#define BTN_TRIGGER_HAPPY1 0x2c0
diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
index 300ef255d1e0..4ee67cb99143 100644
--- a/include/uapi/linux/kvm.h
+++ b/include/uapi/linux/kvm.h
@@ -972,12 +972,19 @@ struct kvm_irqfd {
972 __u8 pad[16]; 972 __u8 pad[16];
973}; 973};
974 974
975/* For KVM_CAP_ADJUST_CLOCK */
976
977/* Do not use 1, KVM_CHECK_EXTENSION returned it before we had flags. */
978#define KVM_CLOCK_TSC_STABLE 2
979
975struct kvm_clock_data { 980struct kvm_clock_data {
976 __u64 clock; 981 __u64 clock;
977 __u32 flags; 982 __u32 flags;
978 __u32 pad[9]; 983 __u32 pad[9];
979}; 984};
980 985
986/* For KVM_CAP_SW_TLB */
987
981#define KVM_MMU_FSL_BOOKE_NOHV 0 988#define KVM_MMU_FSL_BOOKE_NOHV 0
982#define KVM_MMU_FSL_BOOKE_HV 1 989#define KVM_MMU_FSL_BOOKE_HV 1
983 990
diff --git a/include/uapi/linux/netfilter/Kbuild b/include/uapi/linux/netfilter/Kbuild
index cd26d7a0fd07..03f194aeadc5 100644
--- a/include/uapi/linux/netfilter/Kbuild
+++ b/include/uapi/linux/netfilter/Kbuild
@@ -5,6 +5,7 @@ header-y += nf_conntrack_ftp.h
5header-y += nf_conntrack_sctp.h 5header-y += nf_conntrack_sctp.h
6header-y += nf_conntrack_tcp.h 6header-y += nf_conntrack_tcp.h
7header-y += nf_conntrack_tuple_common.h 7header-y += nf_conntrack_tuple_common.h
8header-y += nf_log.h
8header-y += nf_tables.h 9header-y += nf_tables.h
9header-y += nf_tables_compat.h 10header-y += nf_tables_compat.h
10header-y += nf_nat.h 11header-y += nf_nat.h
diff --git a/include/uapi/linux/tc_act/Kbuild b/include/uapi/linux/tc_act/Kbuild
index e3969bd939e4..e3db7403296f 100644
--- a/include/uapi/linux/tc_act/Kbuild
+++ b/include/uapi/linux/tc_act/Kbuild
@@ -11,3 +11,5 @@ header-y += tc_vlan.h
11header-y += tc_bpf.h 11header-y += tc_bpf.h
12header-y += tc_connmark.h 12header-y += tc_connmark.h
13header-y += tc_ife.h 13header-y += tc_ife.h
14header-y += tc_tunnel_key.h
15header-y += tc_skbmod.h
diff --git a/include/uapi/sound/asoc.h b/include/uapi/sound/asoc.h
index 819d895edfdc..6702533c8bd8 100644
--- a/include/uapi/sound/asoc.h
+++ b/include/uapi/sound/asoc.h
@@ -33,6 +33,11 @@
33 */ 33 */
34#define SND_SOC_TPLG_STREAM_CONFIG_MAX 8 34#define SND_SOC_TPLG_STREAM_CONFIG_MAX 8
35 35
36/*
37 * Maximum number of physical link's hardware configs
38 */
39#define SND_SOC_TPLG_HW_CONFIG_MAX 8
40
36/* individual kcontrol info types - can be mixed with other types */ 41/* individual kcontrol info types - can be mixed with other types */
37#define SND_SOC_TPLG_CTL_VOLSW 1 42#define SND_SOC_TPLG_CTL_VOLSW 1
38#define SND_SOC_TPLG_CTL_VOLSW_SX 2 43#define SND_SOC_TPLG_CTL_VOLSW_SX 2
@@ -77,7 +82,8 @@
77#define SND_SOC_TPLG_NUM_TEXTS 16 82#define SND_SOC_TPLG_NUM_TEXTS 16
78 83
79/* ABI version */ 84/* ABI version */
80#define SND_SOC_TPLG_ABI_VERSION 0x5 85#define SND_SOC_TPLG_ABI_VERSION 0x5 /* current version */
86#define SND_SOC_TPLG_ABI_VERSION_MIN 0x4 /* oldest version supported */
81 87
82/* Max size of TLV data */ 88/* Max size of TLV data */
83#define SND_SOC_TPLG_TLV_SIZE 32 89#define SND_SOC_TPLG_TLV_SIZE 32
@@ -99,8 +105,8 @@
99#define SND_SOC_TPLG_TYPE_CODEC_LINK 9 105#define SND_SOC_TPLG_TYPE_CODEC_LINK 9
100#define SND_SOC_TPLG_TYPE_BACKEND_LINK 10 106#define SND_SOC_TPLG_TYPE_BACKEND_LINK 10
101#define SND_SOC_TPLG_TYPE_PDATA 11 107#define SND_SOC_TPLG_TYPE_PDATA 11
102#define SND_SOC_TPLG_TYPE_BE_DAI 12 108#define SND_SOC_TPLG_TYPE_DAI 12
103#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_BE_DAI 109#define SND_SOC_TPLG_TYPE_MAX SND_SOC_TPLG_TYPE_DAI
104 110
105/* vendor block IDs - please add new vendor types to end */ 111/* vendor block IDs - please add new vendor types to end */
106#define SND_SOC_TPLG_TYPE_VENDOR_FW 1000 112#define SND_SOC_TPLG_TYPE_VENDOR_FW 1000
@@ -119,11 +125,32 @@
119#define SND_SOC_TPLG_TUPLE_TYPE_WORD 4 125#define SND_SOC_TPLG_TUPLE_TYPE_WORD 4
120#define SND_SOC_TPLG_TUPLE_TYPE_SHORT 5 126#define SND_SOC_TPLG_TUPLE_TYPE_SHORT 5
121 127
122/* BE DAI flags */ 128/* DAI flags */
123#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES (1 << 0) 129#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_RATES (1 << 0)
124#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1) 130#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
125#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2) 131#define SND_SOC_TPLG_DAI_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
126 132
133/* DAI physical PCM data formats.
134 * Add new formats to the end of the list.
135 */
136#define SND_SOC_DAI_FORMAT_I2S 1 /* I2S mode */
137#define SND_SOC_DAI_FORMAT_RIGHT_J 2 /* Right Justified mode */
138#define SND_SOC_DAI_FORMAT_LEFT_J 3 /* Left Justified mode */
139#define SND_SOC_DAI_FORMAT_DSP_A 4 /* L data MSB after FRM LRC */
140#define SND_SOC_DAI_FORMAT_DSP_B 5 /* L data MSB during FRM LRC */
141#define SND_SOC_DAI_FORMAT_AC97 6 /* AC97 */
142#define SND_SOC_DAI_FORMAT_PDM 7 /* Pulse density modulation */
143
144/* left and right justified also known as MSB and LSB respectively */
145#define SND_SOC_DAI_FORMAT_MSB SND_SOC_DAI_FORMAT_LEFT_J
146#define SND_SOC_DAI_FORMAT_LSB SND_SOC_DAI_FORMAT_RIGHT_J
147
148/* DAI link flags */
149#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES (1 << 0)
150#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS (1 << 1)
151#define SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS (1 << 2)
152#define SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP (1 << 3)
153
127/* 154/*
128 * Block Header. 155 * Block Header.
129 * This header precedes all object and object arrays below. 156 * This header precedes all object and object arrays below.
@@ -267,6 +294,35 @@ struct snd_soc_tplg_stream {
267 __le32 channels; /* channels */ 294 __le32 channels; /* channels */
268} __attribute__((packed)); 295} __attribute__((packed));
269 296
297
298/*
299 * Describes a physical link's runtime supported hardware config,
300 * i.e. hardware audio formats.
301 */
302struct snd_soc_tplg_hw_config {
303 __le32 size; /* in bytes of this structure */
304 __le32 id; /* unique ID - - used to match */
305 __le32 fmt; /* SND_SOC_DAI_FORMAT_ format value */
306 __u8 clock_gated; /* 1 if clock can be gated to save power */
307 __u8 invert_bclk; /* 1 for inverted BCLK, 0 for normal */
308 __u8 invert_fsync; /* 1 for inverted frame clock, 0 for normal */
309 __u8 bclk_master; /* 1 for master of BCLK, 0 for slave */
310 __u8 fsync_master; /* 1 for master of FSYNC, 0 for slave */
311 __u8 mclk_direction; /* 0 for input, 1 for output */
312 __le16 reserved; /* for 32bit alignment */
313 __le32 mclk_rate; /* MCLK or SYSCLK freqency in Hz */
314 __le32 bclk_rate; /* BCLK freqency in Hz */
315 __le32 fsync_rate; /* frame clock in Hz */
316 __le32 tdm_slots; /* number of TDM slots in use */
317 __le32 tdm_slot_width; /* width in bits for each slot */
318 __le32 tx_slots; /* bit mask for active Tx slots */
319 __le32 rx_slots; /* bit mask for active Rx slots */
320 __le32 tx_channels; /* number of Tx channels */
321 __le32 tx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
322 __le32 rx_channels; /* number of Rx channels */
323 __le32 rx_chanmap[SND_SOC_TPLG_MAX_CHAN]; /* array of slot number */
324} __attribute__((packed));
325
270/* 326/*
271 * Manifest. List totals for each payload type. Not used in parsing, but will 327 * Manifest. List totals for each payload type. Not used in parsing, but will
272 * be passed to the component driver before any other objects in order for any 328 * be passed to the component driver before any other objects in order for any
@@ -286,7 +342,7 @@ struct snd_soc_tplg_manifest {
286 __le32 graph_elems; /* number of graph elements */ 342 __le32 graph_elems; /* number of graph elements */
287 __le32 pcm_elems; /* number of PCM elements */ 343 __le32 pcm_elems; /* number of PCM elements */
288 __le32 dai_link_elems; /* number of DAI link elements */ 344 __le32 dai_link_elems; /* number of DAI link elements */
289 __le32 be_dai_elems; /* number of BE DAI elements */ 345 __le32 dai_elems; /* number of physical DAI elements */
290 __le32 reserved[20]; /* reserved for new ABI element types */ 346 __le32 reserved[20]; /* reserved for new ABI element types */
291 struct snd_soc_tplg_private priv; 347 struct snd_soc_tplg_private priv;
292} __attribute__((packed)); 348} __attribute__((packed));
@@ -434,13 +490,16 @@ struct snd_soc_tplg_pcm {
434 struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */ 490 struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
435 __le32 num_streams; /* number of streams */ 491 __le32 num_streams; /* number of streams */
436 struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */ 492 struct snd_soc_tplg_stream_caps caps[2]; /* playback and capture for DAI */
493 __le32 flag_mask; /* bitmask of flags to configure */
494 __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
495 struct snd_soc_tplg_private priv;
437} __attribute__((packed)); 496} __attribute__((packed));
438 497
439 498
440/* 499/*
441 * Describes the BE or CC link runtime supported configs or params 500 * Describes the physical link runtime supported configs or params
442 * 501 *
443 * File block representation for BE/CC link config :- 502 * File block representation for physical link config :-
444 * +-----------------------------------+-----+ 503 * +-----------------------------------+-----+
445 * | struct snd_soc_tplg_hdr | 1 | 504 * | struct snd_soc_tplg_hdr | 1 |
446 * +-----------------------------------+-----+ 505 * +-----------------------------------+-----+
@@ -450,21 +509,30 @@ struct snd_soc_tplg_pcm {
450struct snd_soc_tplg_link_config { 509struct snd_soc_tplg_link_config {
451 __le32 size; /* in bytes of this structure */ 510 __le32 size; /* in bytes of this structure */
452 __le32 id; /* unique ID - used to match */ 511 __le32 id; /* unique ID - used to match */
512 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
513 char stream_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* stream name - used to match */
453 struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */ 514 struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
454 __le32 num_streams; /* number of streams */ 515 __le32 num_streams; /* number of streams */
516 struct snd_soc_tplg_hw_config hw_config[SND_SOC_TPLG_HW_CONFIG_MAX]; /* hw configs */
517 __le32 num_hw_configs; /* number of hw configs */
518 __le32 default_hw_config_id; /* default hw config ID for init */
519 __le32 flag_mask; /* bitmask of flags to configure */
520 __le32 flags; /* SND_SOC_TPLG_LNK_FLGBIT_* flag value */
521 struct snd_soc_tplg_private priv;
455} __attribute__((packed)); 522} __attribute__((packed));
456 523
457/* 524/*
458 * Describes SW/FW specific features of BE DAI. 525 * Describes SW/FW specific features of physical DAI.
526 * It can be used to configure backend DAIs for DPCM.
459 * 527 *
460 * File block representation for BE DAI :- 528 * File block representation for physical DAI :-
461 * +-----------------------------------+-----+ 529 * +-----------------------------------+-----+
462 * | struct snd_soc_tplg_hdr | 1 | 530 * | struct snd_soc_tplg_hdr | 1 |
463 * +-----------------------------------+-----+ 531 * +-----------------------------------+-----+
464 * | struct snd_soc_tplg_be_dai | N | 532 * | struct snd_soc_tplg_dai | N |
465 * +-----------------------------------+-----+ 533 * +-----------------------------------+-----+
466 */ 534 */
467struct snd_soc_tplg_be_dai { 535struct snd_soc_tplg_dai {
468 __le32 size; /* in bytes of this structure */ 536 __le32 size; /* in bytes of this structure */
469 char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */ 537 char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; /* name - used to match */
470 __le32 dai_id; /* unique ID - used to match */ 538 __le32 dai_id; /* unique ID - used to match */
diff --git a/include/uapi/sound/snd_sst_tokens.h b/include/uapi/sound/snd_sst_tokens.h
index 1ee2e943d66a..93392bedcc58 100644
--- a/include/uapi/sound/snd_sst_tokens.h
+++ b/include/uapi/sound/snd_sst_tokens.h
@@ -157,6 +157,10 @@
157 * 157 *
158 * %SKL_TKN_STR_LIB_NAME: Specifies the library name 158 * %SKL_TKN_STR_LIB_NAME: Specifies the library name
159 * 159 *
160 * %SKL_TKN_U32_PMODE: Specifies the power mode for pipe
161 *
162 * %SKL_TKL_U32_D0I3_CAPS: Specifies the D0i3 capability for module
163 *
160 * module_id and loadable flags dont have tokens as these values will be 164 * module_id and loadable flags dont have tokens as these values will be
161 * read from the DSP FW manifest 165 * read from the DSP FW manifest
162 */ 166 */
@@ -208,7 +212,9 @@ enum SKL_TKNS {
208 SKL_TKN_U32_PROC_DOMAIN, 212 SKL_TKN_U32_PROC_DOMAIN,
209 SKL_TKN_U32_LIB_COUNT, 213 SKL_TKN_U32_LIB_COUNT,
210 SKL_TKN_STR_LIB_NAME, 214 SKL_TKN_STR_LIB_NAME,
211 SKL_TKN_MAX = SKL_TKN_STR_LIB_NAME, 215 SKL_TKN_U32_PMODE,
216 SKL_TKL_U32_D0I3_CAPS,
217 SKL_TKN_MAX = SKL_TKL_U32_D0I3_CAPS,
212}; 218};
213 219
214#endif 220#endif
diff --git a/init/do_mounts_rd.c b/init/do_mounts_rd.c
index 8a09b32e07d6..dd4104c9aa12 100644
--- a/init/do_mounts_rd.c
+++ b/init/do_mounts_rd.c
@@ -272,7 +272,7 @@ int __init rd_load_image(char *from)
272 sys_write(out_fd, buf, BLOCK_SIZE); 272 sys_write(out_fd, buf, BLOCK_SIZE);
273#if !defined(CONFIG_S390) 273#if !defined(CONFIG_S390)
274 if (!(i % 16)) { 274 if (!(i % 16)) {
275 printk("%c\b", rotator[rotate & 0x3]); 275 pr_cont("%c\b", rotator[rotate & 0x3]);
276 rotate++; 276 rotate++;
277 } 277 }
278#endif 278#endif
diff --git a/kernel/bpf/hashtab.c b/kernel/bpf/hashtab.c
index 570eeca7bdfa..ad1bc67aff1b 100644
--- a/kernel/bpf/hashtab.c
+++ b/kernel/bpf/hashtab.c
@@ -687,7 +687,8 @@ static void delete_all_elements(struct bpf_htab *htab)
687 687
688 hlist_for_each_entry_safe(l, n, head, hash_node) { 688 hlist_for_each_entry_safe(l, n, head, hash_node) {
689 hlist_del_rcu(&l->hash_node); 689 hlist_del_rcu(&l->hash_node);
690 htab_elem_free(htab, l); 690 if (l->state != HTAB_EXTRA_ELEM_USED)
691 htab_elem_free(htab, l);
691 } 692 }
692 } 693 }
693} 694}
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 228f962447a5..237f3d6a7ddc 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -194,7 +194,7 @@ static int map_create(union bpf_attr *attr)
194 194
195 err = bpf_map_charge_memlock(map); 195 err = bpf_map_charge_memlock(map);
196 if (err) 196 if (err)
197 goto free_map; 197 goto free_map_nouncharge;
198 198
199 err = bpf_map_new_fd(map); 199 err = bpf_map_new_fd(map);
200 if (err < 0) 200 if (err < 0)
@@ -204,6 +204,8 @@ static int map_create(union bpf_attr *attr)
204 return err; 204 return err;
205 205
206free_map: 206free_map:
207 bpf_map_uncharge_memlock(map);
208free_map_nouncharge:
207 map->ops->map_free(map); 209 map->ops->map_free(map);
208 return err; 210 return err;
209} 211}
diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
index 99a7e5b388f2..8199821f54cf 100644
--- a/kernel/bpf/verifier.c
+++ b/kernel/bpf/verifier.c
@@ -216,8 +216,8 @@ static void print_verifier_state(struct bpf_verifier_state *state)
216 reg->map_ptr->key_size, 216 reg->map_ptr->key_size,
217 reg->map_ptr->value_size); 217 reg->map_ptr->value_size);
218 if (reg->min_value != BPF_REGISTER_MIN_RANGE) 218 if (reg->min_value != BPF_REGISTER_MIN_RANGE)
219 verbose(",min_value=%llu", 219 verbose(",min_value=%lld",
220 (unsigned long long)reg->min_value); 220 (long long)reg->min_value);
221 if (reg->max_value != BPF_REGISTER_MAX_RANGE) 221 if (reg->max_value != BPF_REGISTER_MAX_RANGE)
222 verbose(",max_value=%llu", 222 verbose(",max_value=%llu",
223 (unsigned long long)reg->max_value); 223 (unsigned long long)reg->max_value);
@@ -758,7 +758,7 @@ static int check_mem_access(struct bpf_verifier_env *env, u32 regno, int off,
758 * index'es we need to make sure that whatever we use 758 * index'es we need to make sure that whatever we use
759 * will have a set floor within our range. 759 * will have a set floor within our range.
760 */ 760 */
761 if ((s64)reg->min_value < 0) { 761 if (reg->min_value < 0) {
762 verbose("R%d min value is negative, either use unsigned index or do a if (index >=0) check.\n", 762 verbose("R%d min value is negative, either use unsigned index or do a if (index >=0) check.\n",
763 regno); 763 regno);
764 return -EACCES; 764 return -EACCES;
@@ -1468,7 +1468,8 @@ static void check_reg_overflow(struct bpf_reg_state *reg)
1468{ 1468{
1469 if (reg->max_value > BPF_REGISTER_MAX_RANGE) 1469 if (reg->max_value > BPF_REGISTER_MAX_RANGE)
1470 reg->max_value = BPF_REGISTER_MAX_RANGE; 1470 reg->max_value = BPF_REGISTER_MAX_RANGE;
1471 if ((s64)reg->min_value < BPF_REGISTER_MIN_RANGE) 1471 if (reg->min_value < BPF_REGISTER_MIN_RANGE ||
1472 reg->min_value > BPF_REGISTER_MAX_RANGE)
1472 reg->min_value = BPF_REGISTER_MIN_RANGE; 1473 reg->min_value = BPF_REGISTER_MIN_RANGE;
1473} 1474}
1474 1475
@@ -1476,7 +1477,8 @@ static void adjust_reg_min_max_vals(struct bpf_verifier_env *env,
1476 struct bpf_insn *insn) 1477 struct bpf_insn *insn)
1477{ 1478{
1478 struct bpf_reg_state *regs = env->cur_state.regs, *dst_reg; 1479 struct bpf_reg_state *regs = env->cur_state.regs, *dst_reg;
1479 u64 min_val = BPF_REGISTER_MIN_RANGE, max_val = BPF_REGISTER_MAX_RANGE; 1480 s64 min_val = BPF_REGISTER_MIN_RANGE;
1481 u64 max_val = BPF_REGISTER_MAX_RANGE;
1480 bool min_set = false, max_set = false; 1482 bool min_set = false, max_set = false;
1481 u8 opcode = BPF_OP(insn->code); 1483 u8 opcode = BPF_OP(insn->code);
1482 1484
@@ -1512,22 +1514,43 @@ static void adjust_reg_min_max_vals(struct bpf_verifier_env *env,
1512 return; 1514 return;
1513 } 1515 }
1514 1516
1517 /* If one of our values was at the end of our ranges then we can't just
1518 * do our normal operations to the register, we need to set the values
1519 * to the min/max since they are undefined.
1520 */
1521 if (min_val == BPF_REGISTER_MIN_RANGE)
1522 dst_reg->min_value = BPF_REGISTER_MIN_RANGE;
1523 if (max_val == BPF_REGISTER_MAX_RANGE)
1524 dst_reg->max_value = BPF_REGISTER_MAX_RANGE;
1525
1515 switch (opcode) { 1526 switch (opcode) {
1516 case BPF_ADD: 1527 case BPF_ADD:
1517 dst_reg->min_value += min_val; 1528 if (dst_reg->min_value != BPF_REGISTER_MIN_RANGE)
1518 dst_reg->max_value += max_val; 1529 dst_reg->min_value += min_val;
1530 if (dst_reg->max_value != BPF_REGISTER_MAX_RANGE)
1531 dst_reg->max_value += max_val;
1519 break; 1532 break;
1520 case BPF_SUB: 1533 case BPF_SUB:
1521 dst_reg->min_value -= min_val; 1534 if (dst_reg->min_value != BPF_REGISTER_MIN_RANGE)
1522 dst_reg->max_value -= max_val; 1535 dst_reg->min_value -= min_val;
1536 if (dst_reg->max_value != BPF_REGISTER_MAX_RANGE)
1537 dst_reg->max_value -= max_val;
1523 break; 1538 break;
1524 case BPF_MUL: 1539 case BPF_MUL:
1525 dst_reg->min_value *= min_val; 1540 if (dst_reg->min_value != BPF_REGISTER_MIN_RANGE)
1526 dst_reg->max_value *= max_val; 1541 dst_reg->min_value *= min_val;
1542 if (dst_reg->max_value != BPF_REGISTER_MAX_RANGE)
1543 dst_reg->max_value *= max_val;
1527 break; 1544 break;
1528 case BPF_AND: 1545 case BPF_AND:
1529 /* & is special since it could end up with 0 bits set. */ 1546 /* Disallow AND'ing of negative numbers, ain't nobody got time
1530 dst_reg->min_value &= min_val; 1547 * for that. Otherwise the minimum is 0 and the max is the max
1548 * value we could AND against.
1549 */
1550 if (min_val < 0)
1551 dst_reg->min_value = BPF_REGISTER_MIN_RANGE;
1552 else
1553 dst_reg->min_value = 0;
1531 dst_reg->max_value = max_val; 1554 dst_reg->max_value = max_val;
1532 break; 1555 break;
1533 case BPF_LSH: 1556 case BPF_LSH:
@@ -1537,24 +1560,25 @@ static void adjust_reg_min_max_vals(struct bpf_verifier_env *env,
1537 */ 1560 */
1538 if (min_val > ilog2(BPF_REGISTER_MAX_RANGE)) 1561 if (min_val > ilog2(BPF_REGISTER_MAX_RANGE))
1539 dst_reg->min_value = BPF_REGISTER_MIN_RANGE; 1562 dst_reg->min_value = BPF_REGISTER_MIN_RANGE;
1540 else 1563 else if (dst_reg->min_value != BPF_REGISTER_MIN_RANGE)
1541 dst_reg->min_value <<= min_val; 1564 dst_reg->min_value <<= min_val;
1542 1565
1543 if (max_val > ilog2(BPF_REGISTER_MAX_RANGE)) 1566 if (max_val > ilog2(BPF_REGISTER_MAX_RANGE))
1544 dst_reg->max_value = BPF_REGISTER_MAX_RANGE; 1567 dst_reg->max_value = BPF_REGISTER_MAX_RANGE;
1545 else 1568 else if (dst_reg->max_value != BPF_REGISTER_MAX_RANGE)
1546 dst_reg->max_value <<= max_val; 1569 dst_reg->max_value <<= max_val;
1547 break; 1570 break;
1548 case BPF_RSH: 1571 case BPF_RSH:
1549 dst_reg->min_value >>= min_val; 1572 /* RSH by a negative number is undefined, and the BPF_RSH is an
1550 dst_reg->max_value >>= max_val; 1573 * unsigned shift, so make the appropriate casts.
1551 break;
1552 case BPF_MOD:
1553 /* % is special since it is an unsigned modulus, so the floor
1554 * will always be 0.
1555 */ 1574 */
1556 dst_reg->min_value = 0; 1575 if (min_val < 0 || dst_reg->min_value < 0)
1557 dst_reg->max_value = max_val - 1; 1576 dst_reg->min_value = BPF_REGISTER_MIN_RANGE;
1577 else
1578 dst_reg->min_value =
1579 (u64)(dst_reg->min_value) >> min_val;
1580 if (dst_reg->max_value != BPF_REGISTER_MAX_RANGE)
1581 dst_reg->max_value >>= max_val;
1558 break; 1582 break;
1559 default: 1583 default:
1560 reset_reg_range_values(regs, insn->dst_reg); 1584 reset_reg_range_values(regs, insn->dst_reg);
@@ -2430,6 +2454,7 @@ static bool states_equal(struct bpf_verifier_env *env,
2430 struct bpf_verifier_state *old, 2454 struct bpf_verifier_state *old,
2431 struct bpf_verifier_state *cur) 2455 struct bpf_verifier_state *cur)
2432{ 2456{
2457 bool varlen_map_access = env->varlen_map_value_access;
2433 struct bpf_reg_state *rold, *rcur; 2458 struct bpf_reg_state *rold, *rcur;
2434 int i; 2459 int i;
2435 2460
@@ -2443,12 +2468,17 @@ static bool states_equal(struct bpf_verifier_env *env,
2443 /* If the ranges were not the same, but everything else was and 2468 /* If the ranges were not the same, but everything else was and
2444 * we didn't do a variable access into a map then we are a-ok. 2469 * we didn't do a variable access into a map then we are a-ok.
2445 */ 2470 */
2446 if (!env->varlen_map_value_access && 2471 if (!varlen_map_access &&
2447 rold->type == rcur->type && rold->imm == rcur->imm) 2472 rold->type == rcur->type && rold->imm == rcur->imm)
2448 continue; 2473 continue;
2449 2474
2475 /* If we didn't map access then again we don't care about the
2476 * mismatched range values and it's ok if our old type was
2477 * UNKNOWN and we didn't go to a NOT_INIT'ed reg.
2478 */
2450 if (rold->type == NOT_INIT || 2479 if (rold->type == NOT_INIT ||
2451 (rold->type == UNKNOWN_VALUE && rcur->type != NOT_INIT)) 2480 (!varlen_map_access && rold->type == UNKNOWN_VALUE &&
2481 rcur->type != NOT_INIT))
2452 continue; 2482 continue;
2453 2483
2454 if (rold->type == PTR_TO_PACKET && rcur->type == PTR_TO_PACKET && 2484 if (rold->type == PTR_TO_PACKET && rcur->type == PTR_TO_PACKET &&
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 0e292132efac..02c8421f8c01 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -902,7 +902,15 @@ list_update_cgroup_event(struct perf_event *event,
902 * this will always be called from the right CPU. 902 * this will always be called from the right CPU.
903 */ 903 */
904 cpuctx = __get_cpu_context(ctx); 904 cpuctx = __get_cpu_context(ctx);
905 cpuctx->cgrp = add ? event->cgrp : NULL; 905
906 /*
907 * cpuctx->cgrp is NULL until a cgroup event is sched in or
908 * ctx->nr_cgroup == 0 .
909 */
910 if (add && perf_cgroup_from_task(current, ctx) == event->cgrp)
911 cpuctx->cgrp = event->cgrp;
912 else if (!add)
913 cpuctx->cgrp = NULL;
906} 914}
907 915
908#else /* !CONFIG_CGROUP_PERF */ 916#else /* !CONFIG_CGROUP_PERF */
@@ -8018,6 +8026,7 @@ restart:
8018 * if <size> is not specified, the range is treated as a single address. 8026 * if <size> is not specified, the range is treated as a single address.
8019 */ 8027 */
8020enum { 8028enum {
8029 IF_ACT_NONE = -1,
8021 IF_ACT_FILTER, 8030 IF_ACT_FILTER,
8022 IF_ACT_START, 8031 IF_ACT_START,
8023 IF_ACT_STOP, 8032 IF_ACT_STOP,
@@ -8041,6 +8050,7 @@ static const match_table_t if_tokens = {
8041 { IF_SRC_KERNEL, "%u/%u" }, 8050 { IF_SRC_KERNEL, "%u/%u" },
8042 { IF_SRC_FILEADDR, "%u@%s" }, 8051 { IF_SRC_FILEADDR, "%u@%s" },
8043 { IF_SRC_KERNELADDR, "%u" }, 8052 { IF_SRC_KERNELADDR, "%u" },
8053 { IF_ACT_NONE, NULL },
8044}; 8054};
8045 8055
8046/* 8056/*
diff --git a/kernel/exit.c b/kernel/exit.c
index 9d68c45ebbe3..3076f3089919 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -836,6 +836,7 @@ void __noreturn do_exit(long code)
836 */ 836 */
837 perf_event_exit_task(tsk); 837 perf_event_exit_task(tsk);
838 838
839 sched_autogroup_exit_task(tsk);
839 cgroup_exit(tsk); 840 cgroup_exit(tsk);
840 841
841 /* 842 /*
diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c
index 9c4d30483264..6b669593e7eb 100644
--- a/kernel/irq/manage.c
+++ b/kernel/irq/manage.c
@@ -1341,12 +1341,12 @@ __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
1341 1341
1342 } else if (new->flags & IRQF_TRIGGER_MASK) { 1342 } else if (new->flags & IRQF_TRIGGER_MASK) {
1343 unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK; 1343 unsigned int nmsk = new->flags & IRQF_TRIGGER_MASK;
1344 unsigned int omsk = irq_settings_get_trigger_mask(desc); 1344 unsigned int omsk = irqd_get_trigger_type(&desc->irq_data);
1345 1345
1346 if (nmsk != omsk) 1346 if (nmsk != omsk)
1347 /* hope the handler works with current trigger mode */ 1347 /* hope the handler works with current trigger mode */
1348 pr_warn("irq %d uses trigger mode %u; requested %u\n", 1348 pr_warn("irq %d uses trigger mode %u; requested %u\n",
1349 irq, nmsk, omsk); 1349 irq, omsk, nmsk);
1350 } 1350 }
1351 1351
1352 *old_ptr = new; 1352 *old_ptr = new;
diff --git a/kernel/kcov.c b/kernel/kcov.c
index 30e6d05aa5a9..3cbb0c879705 100644
--- a/kernel/kcov.c
+++ b/kernel/kcov.c
@@ -7,6 +7,7 @@
7#include <linux/fs.h> 7#include <linux/fs.h>
8#include <linux/mm.h> 8#include <linux/mm.h>
9#include <linux/printk.h> 9#include <linux/printk.h>
10#include <linux/sched.h>
10#include <linux/slab.h> 11#include <linux/slab.h>
11#include <linux/spinlock.h> 12#include <linux/spinlock.h>
12#include <linux/vmalloc.h> 13#include <linux/vmalloc.h>
diff --git a/kernel/locking/lockdep.c b/kernel/locking/lockdep.c
index 589d763a49b3..4d7ffc0a0d00 100644
--- a/kernel/locking/lockdep.c
+++ b/kernel/locking/lockdep.c
@@ -506,13 +506,13 @@ static void __print_lock_name(struct lock_class *class)
506 name = class->name; 506 name = class->name;
507 if (!name) { 507 if (!name) {
508 name = __get_key_name(class->key, str); 508 name = __get_key_name(class->key, str);
509 printk("%s", name); 509 printk(KERN_CONT "%s", name);
510 } else { 510 } else {
511 printk("%s", name); 511 printk(KERN_CONT "%s", name);
512 if (class->name_version > 1) 512 if (class->name_version > 1)
513 printk("#%d", class->name_version); 513 printk(KERN_CONT "#%d", class->name_version);
514 if (class->subclass) 514 if (class->subclass)
515 printk("/%d", class->subclass); 515 printk(KERN_CONT "/%d", class->subclass);
516 } 516 }
517} 517}
518 518
@@ -522,9 +522,9 @@ static void print_lock_name(struct lock_class *class)
522 522
523 get_usage_chars(class, usage); 523 get_usage_chars(class, usage);
524 524
525 printk(" ("); 525 printk(KERN_CONT " (");
526 __print_lock_name(class); 526 __print_lock_name(class);
527 printk("){%s}", usage); 527 printk(KERN_CONT "){%s}", usage);
528} 528}
529 529
530static void print_lockdep_cache(struct lockdep_map *lock) 530static void print_lockdep_cache(struct lockdep_map *lock)
@@ -536,7 +536,7 @@ static void print_lockdep_cache(struct lockdep_map *lock)
536 if (!name) 536 if (!name)
537 name = __get_key_name(lock->key->subkeys, str); 537 name = __get_key_name(lock->key->subkeys, str);
538 538
539 printk("%s", name); 539 printk(KERN_CONT "%s", name);
540} 540}
541 541
542static void print_lock(struct held_lock *hlock) 542static void print_lock(struct held_lock *hlock)
@@ -551,13 +551,13 @@ static void print_lock(struct held_lock *hlock)
551 barrier(); 551 barrier();
552 552
553 if (!class_idx || (class_idx - 1) >= MAX_LOCKDEP_KEYS) { 553 if (!class_idx || (class_idx - 1) >= MAX_LOCKDEP_KEYS) {
554 printk("<RELEASED>\n"); 554 printk(KERN_CONT "<RELEASED>\n");
555 return; 555 return;
556 } 556 }
557 557
558 print_lock_name(lock_classes + class_idx - 1); 558 print_lock_name(lock_classes + class_idx - 1);
559 printk(", at: "); 559 printk(KERN_CONT ", at: [<%p>] %pS\n",
560 print_ip_sym(hlock->acquire_ip); 560 (void *)hlock->acquire_ip, (void *)hlock->acquire_ip);
561} 561}
562 562
563static void lockdep_print_held_locks(struct task_struct *curr) 563static void lockdep_print_held_locks(struct task_struct *curr)
@@ -792,8 +792,8 @@ register_lock_class(struct lockdep_map *lock, unsigned int subclass, int force)
792 792
793 printk("\nnew class %p: %s", class->key, class->name); 793 printk("\nnew class %p: %s", class->key, class->name);
794 if (class->name_version > 1) 794 if (class->name_version > 1)
795 printk("#%d", class->name_version); 795 printk(KERN_CONT "#%d", class->name_version);
796 printk("\n"); 796 printk(KERN_CONT "\n");
797 dump_stack(); 797 dump_stack();
798 798
799 if (!graph_lock()) { 799 if (!graph_lock()) {
@@ -1071,7 +1071,7 @@ print_circular_bug_entry(struct lock_list *target, int depth)
1071 return 0; 1071 return 0;
1072 printk("\n-> #%u", depth); 1072 printk("\n-> #%u", depth);
1073 print_lock_name(target->class); 1073 print_lock_name(target->class);
1074 printk(":\n"); 1074 printk(KERN_CONT ":\n");
1075 print_stack_trace(&target->trace, 6); 1075 print_stack_trace(&target->trace, 6);
1076 1076
1077 return 0; 1077 return 0;
@@ -1102,11 +1102,11 @@ print_circular_lock_scenario(struct held_lock *src,
1102 if (parent != source) { 1102 if (parent != source) {
1103 printk("Chain exists of:\n "); 1103 printk("Chain exists of:\n ");
1104 __print_lock_name(source); 1104 __print_lock_name(source);
1105 printk(" --> "); 1105 printk(KERN_CONT " --> ");
1106 __print_lock_name(parent); 1106 __print_lock_name(parent);
1107 printk(" --> "); 1107 printk(KERN_CONT " --> ");
1108 __print_lock_name(target); 1108 __print_lock_name(target);
1109 printk("\n\n"); 1109 printk(KERN_CONT "\n\n");
1110 } 1110 }
1111 1111
1112 printk(" Possible unsafe locking scenario:\n\n"); 1112 printk(" Possible unsafe locking scenario:\n\n");
@@ -1114,16 +1114,16 @@ print_circular_lock_scenario(struct held_lock *src,
1114 printk(" ---- ----\n"); 1114 printk(" ---- ----\n");
1115 printk(" lock("); 1115 printk(" lock(");
1116 __print_lock_name(target); 1116 __print_lock_name(target);
1117 printk(");\n"); 1117 printk(KERN_CONT ");\n");
1118 printk(" lock("); 1118 printk(" lock(");
1119 __print_lock_name(parent); 1119 __print_lock_name(parent);
1120 printk(");\n"); 1120 printk(KERN_CONT ");\n");
1121 printk(" lock("); 1121 printk(" lock(");
1122 __print_lock_name(target); 1122 __print_lock_name(target);
1123 printk(");\n"); 1123 printk(KERN_CONT ");\n");
1124 printk(" lock("); 1124 printk(" lock(");
1125 __print_lock_name(source); 1125 __print_lock_name(source);
1126 printk(");\n"); 1126 printk(KERN_CONT ");\n");
1127 printk("\n *** DEADLOCK ***\n\n"); 1127 printk("\n *** DEADLOCK ***\n\n");
1128} 1128}
1129 1129
@@ -1359,22 +1359,22 @@ static void print_lock_class_header(struct lock_class *class, int depth)
1359 1359
1360 printk("%*s->", depth, ""); 1360 printk("%*s->", depth, "");
1361 print_lock_name(class); 1361 print_lock_name(class);
1362 printk(" ops: %lu", class->ops); 1362 printk(KERN_CONT " ops: %lu", class->ops);
1363 printk(" {\n"); 1363 printk(KERN_CONT " {\n");
1364 1364
1365 for (bit = 0; bit < LOCK_USAGE_STATES; bit++) { 1365 for (bit = 0; bit < LOCK_USAGE_STATES; bit++) {
1366 if (class->usage_mask & (1 << bit)) { 1366 if (class->usage_mask & (1 << bit)) {
1367 int len = depth; 1367 int len = depth;
1368 1368
1369 len += printk("%*s %s", depth, "", usage_str[bit]); 1369 len += printk("%*s %s", depth, "", usage_str[bit]);
1370 len += printk(" at:\n"); 1370 len += printk(KERN_CONT " at:\n");
1371 print_stack_trace(class->usage_traces + bit, len); 1371 print_stack_trace(class->usage_traces + bit, len);
1372 } 1372 }
1373 } 1373 }
1374 printk("%*s }\n", depth, ""); 1374 printk("%*s }\n", depth, "");
1375 1375
1376 printk("%*s ... key at: ",depth,""); 1376 printk("%*s ... key at: [<%p>] %pS\n",
1377 print_ip_sym((unsigned long)class->key); 1377 depth, "", class->key, class->key);
1378} 1378}
1379 1379
1380/* 1380/*
@@ -1437,11 +1437,11 @@ print_irq_lock_scenario(struct lock_list *safe_entry,
1437 if (middle_class != unsafe_class) { 1437 if (middle_class != unsafe_class) {
1438 printk("Chain exists of:\n "); 1438 printk("Chain exists of:\n ");
1439 __print_lock_name(safe_class); 1439 __print_lock_name(safe_class);
1440 printk(" --> "); 1440 printk(KERN_CONT " --> ");
1441 __print_lock_name(middle_class); 1441 __print_lock_name(middle_class);
1442 printk(" --> "); 1442 printk(KERN_CONT " --> ");
1443 __print_lock_name(unsafe_class); 1443 __print_lock_name(unsafe_class);
1444 printk("\n\n"); 1444 printk(KERN_CONT "\n\n");
1445 } 1445 }
1446 1446
1447 printk(" Possible interrupt unsafe locking scenario:\n\n"); 1447 printk(" Possible interrupt unsafe locking scenario:\n\n");
@@ -1449,18 +1449,18 @@ print_irq_lock_scenario(struct lock_list *safe_entry,
1449 printk(" ---- ----\n"); 1449 printk(" ---- ----\n");
1450 printk(" lock("); 1450 printk(" lock(");
1451 __print_lock_name(unsafe_class); 1451 __print_lock_name(unsafe_class);
1452 printk(");\n"); 1452 printk(KERN_CONT ");\n");
1453 printk(" local_irq_disable();\n"); 1453 printk(" local_irq_disable();\n");
1454 printk(" lock("); 1454 printk(" lock(");
1455 __print_lock_name(safe_class); 1455 __print_lock_name(safe_class);
1456 printk(");\n"); 1456 printk(KERN_CONT ");\n");
1457 printk(" lock("); 1457 printk(" lock(");
1458 __print_lock_name(middle_class); 1458 __print_lock_name(middle_class);
1459 printk(");\n"); 1459 printk(KERN_CONT ");\n");
1460 printk(" <Interrupt>\n"); 1460 printk(" <Interrupt>\n");
1461 printk(" lock("); 1461 printk(" lock(");
1462 __print_lock_name(safe_class); 1462 __print_lock_name(safe_class);
1463 printk(");\n"); 1463 printk(KERN_CONT ");\n");
1464 printk("\n *** DEADLOCK ***\n\n"); 1464 printk("\n *** DEADLOCK ***\n\n");
1465} 1465}
1466 1466
@@ -1497,9 +1497,9 @@ print_bad_irq_dependency(struct task_struct *curr,
1497 print_lock(prev); 1497 print_lock(prev);
1498 printk("which would create a new lock dependency:\n"); 1498 printk("which would create a new lock dependency:\n");
1499 print_lock_name(hlock_class(prev)); 1499 print_lock_name(hlock_class(prev));
1500 printk(" ->"); 1500 printk(KERN_CONT " ->");
1501 print_lock_name(hlock_class(next)); 1501 print_lock_name(hlock_class(next));
1502 printk("\n"); 1502 printk(KERN_CONT "\n");
1503 1503
1504 printk("\nbut this new dependency connects a %s-irq-safe lock:\n", 1504 printk("\nbut this new dependency connects a %s-irq-safe lock:\n",
1505 irqclass); 1505 irqclass);
@@ -1521,8 +1521,7 @@ print_bad_irq_dependency(struct task_struct *curr,
1521 1521
1522 lockdep_print_held_locks(curr); 1522 lockdep_print_held_locks(curr);
1523 1523
1524 printk("\nthe dependencies between %s-irq-safe lock", irqclass); 1524 printk("\nthe dependencies between %s-irq-safe lock and the holding lock:\n", irqclass);
1525 printk(" and the holding lock:\n");
1526 if (!save_trace(&prev_root->trace)) 1525 if (!save_trace(&prev_root->trace))
1527 return 0; 1526 return 0;
1528 print_shortest_lock_dependencies(backwards_entry, prev_root); 1527 print_shortest_lock_dependencies(backwards_entry, prev_root);
@@ -1694,10 +1693,10 @@ print_deadlock_scenario(struct held_lock *nxt,
1694 printk(" ----\n"); 1693 printk(" ----\n");
1695 printk(" lock("); 1694 printk(" lock(");
1696 __print_lock_name(prev); 1695 __print_lock_name(prev);
1697 printk(");\n"); 1696 printk(KERN_CONT ");\n");
1698 printk(" lock("); 1697 printk(" lock(");
1699 __print_lock_name(next); 1698 __print_lock_name(next);
1700 printk(");\n"); 1699 printk(KERN_CONT ");\n");
1701 printk("\n *** DEADLOCK ***\n\n"); 1700 printk("\n *** DEADLOCK ***\n\n");
1702 printk(" May be due to missing lock nesting notation\n\n"); 1701 printk(" May be due to missing lock nesting notation\n\n");
1703} 1702}
@@ -1891,9 +1890,9 @@ check_prev_add(struct task_struct *curr, struct held_lock *prev,
1891 graph_unlock(); 1890 graph_unlock();
1892 printk("\n new dependency: "); 1891 printk("\n new dependency: ");
1893 print_lock_name(hlock_class(prev)); 1892 print_lock_name(hlock_class(prev));
1894 printk(" => "); 1893 printk(KERN_CONT " => ");
1895 print_lock_name(hlock_class(next)); 1894 print_lock_name(hlock_class(next));
1896 printk("\n"); 1895 printk(KERN_CONT "\n");
1897 dump_stack(); 1896 dump_stack();
1898 return graph_lock(); 1897 return graph_lock();
1899 } 1898 }
@@ -2343,11 +2342,11 @@ print_usage_bug_scenario(struct held_lock *lock)
2343 printk(" ----\n"); 2342 printk(" ----\n");
2344 printk(" lock("); 2343 printk(" lock(");
2345 __print_lock_name(class); 2344 __print_lock_name(class);
2346 printk(");\n"); 2345 printk(KERN_CONT ");\n");
2347 printk(" <Interrupt>\n"); 2346 printk(" <Interrupt>\n");
2348 printk(" lock("); 2347 printk(" lock(");
2349 __print_lock_name(class); 2348 __print_lock_name(class);
2350 printk(");\n"); 2349 printk(KERN_CONT ");\n");
2351 printk("\n *** DEADLOCK ***\n\n"); 2350 printk("\n *** DEADLOCK ***\n\n");
2352} 2351}
2353 2352
@@ -2522,14 +2521,18 @@ check_usage_backwards(struct task_struct *curr, struct held_lock *this,
2522void print_irqtrace_events(struct task_struct *curr) 2521void print_irqtrace_events(struct task_struct *curr)
2523{ 2522{
2524 printk("irq event stamp: %u\n", curr->irq_events); 2523 printk("irq event stamp: %u\n", curr->irq_events);
2525 printk("hardirqs last enabled at (%u): ", curr->hardirq_enable_event); 2524 printk("hardirqs last enabled at (%u): [<%p>] %pS\n",
2526 print_ip_sym(curr->hardirq_enable_ip); 2525 curr->hardirq_enable_event, (void *)curr->hardirq_enable_ip,
2527 printk("hardirqs last disabled at (%u): ", curr->hardirq_disable_event); 2526 (void *)curr->hardirq_enable_ip);
2528 print_ip_sym(curr->hardirq_disable_ip); 2527 printk("hardirqs last disabled at (%u): [<%p>] %pS\n",
2529 printk("softirqs last enabled at (%u): ", curr->softirq_enable_event); 2528 curr->hardirq_disable_event, (void *)curr->hardirq_disable_ip,
2530 print_ip_sym(curr->softirq_enable_ip); 2529 (void *)curr->hardirq_disable_ip);
2531 printk("softirqs last disabled at (%u): ", curr->softirq_disable_event); 2530 printk("softirqs last enabled at (%u): [<%p>] %pS\n",
2532 print_ip_sym(curr->softirq_disable_ip); 2531 curr->softirq_enable_event, (void *)curr->softirq_enable_ip,
2532 (void *)curr->softirq_enable_ip);
2533 printk("softirqs last disabled at (%u): [<%p>] %pS\n",
2534 curr->softirq_disable_event, (void *)curr->softirq_disable_ip,
2535 (void *)curr->softirq_disable_ip);
2533} 2536}
2534 2537
2535static int HARDIRQ_verbose(struct lock_class *class) 2538static int HARDIRQ_verbose(struct lock_class *class)
@@ -3235,8 +3238,8 @@ static int __lock_acquire(struct lockdep_map *lock, unsigned int subclass,
3235 if (very_verbose(class)) { 3238 if (very_verbose(class)) {
3236 printk("\nacquire class [%p] %s", class->key, class->name); 3239 printk("\nacquire class [%p] %s", class->key, class->name);
3237 if (class->name_version > 1) 3240 if (class->name_version > 1)
3238 printk("#%d", class->name_version); 3241 printk(KERN_CONT "#%d", class->name_version);
3239 printk("\n"); 3242 printk(KERN_CONT "\n");
3240 dump_stack(); 3243 dump_stack();
3241 } 3244 }
3242 3245
@@ -3378,7 +3381,7 @@ print_unlock_imbalance_bug(struct task_struct *curr, struct lockdep_map *lock,
3378 printk("%s/%d is trying to release lock (", 3381 printk("%s/%d is trying to release lock (",
3379 curr->comm, task_pid_nr(curr)); 3382 curr->comm, task_pid_nr(curr));
3380 print_lockdep_cache(lock); 3383 print_lockdep_cache(lock);
3381 printk(") at:\n"); 3384 printk(KERN_CONT ") at:\n");
3382 print_ip_sym(ip); 3385 print_ip_sym(ip);
3383 printk("but there are no more locks to release!\n"); 3386 printk("but there are no more locks to release!\n");
3384 printk("\nother info that might help us debug this:\n"); 3387 printk("\nother info that might help us debug this:\n");
@@ -3871,7 +3874,7 @@ print_lock_contention_bug(struct task_struct *curr, struct lockdep_map *lock,
3871 printk("%s/%d is trying to contend lock (", 3874 printk("%s/%d is trying to contend lock (",
3872 curr->comm, task_pid_nr(curr)); 3875 curr->comm, task_pid_nr(curr));
3873 print_lockdep_cache(lock); 3876 print_lockdep_cache(lock);
3874 printk(") at:\n"); 3877 printk(KERN_CONT ") at:\n");
3875 print_ip_sym(ip); 3878 print_ip_sym(ip);
3876 printk("but there are no locks held!\n"); 3879 printk("but there are no locks held!\n");
3877 printk("\nother info that might help us debug this:\n"); 3880 printk("\nother info that might help us debug this:\n");
diff --git a/kernel/locking/lockdep_internals.h b/kernel/locking/lockdep_internals.h
index 51c4b24b6328..c2b88490d857 100644
--- a/kernel/locking/lockdep_internals.h
+++ b/kernel/locking/lockdep_internals.h
@@ -46,6 +46,14 @@ enum {
46 (LOCKF_USED_IN_HARDIRQ_READ | LOCKF_USED_IN_SOFTIRQ_READ) 46 (LOCKF_USED_IN_HARDIRQ_READ | LOCKF_USED_IN_SOFTIRQ_READ)
47 47
48/* 48/*
49 * CONFIG_PROVE_LOCKING_SMALL is defined for sparc. Sparc requires .text,
50 * .data and .bss to fit in required 32MB limit for the kernel. With
51 * PROVE_LOCKING we could go over this limit and cause system boot-up problems.
52 * So, reduce the static allocations for lockdeps related structures so that
53 * everything fits in current required size limit.
54 */
55#ifdef CONFIG_PROVE_LOCKING_SMALL
56/*
49 * MAX_LOCKDEP_ENTRIES is the maximum number of lock dependencies 57 * MAX_LOCKDEP_ENTRIES is the maximum number of lock dependencies
50 * we track. 58 * we track.
51 * 59 *
@@ -54,18 +62,24 @@ enum {
54 * table (if it's not there yet), and we check it for lock order 62 * table (if it's not there yet), and we check it for lock order
55 * conflicts and deadlocks. 63 * conflicts and deadlocks.
56 */ 64 */
65#define MAX_LOCKDEP_ENTRIES 16384UL
66#define MAX_LOCKDEP_CHAINS_BITS 15
67#define MAX_STACK_TRACE_ENTRIES 262144UL
68#else
57#define MAX_LOCKDEP_ENTRIES 32768UL 69#define MAX_LOCKDEP_ENTRIES 32768UL
58 70
59#define MAX_LOCKDEP_CHAINS_BITS 16 71#define MAX_LOCKDEP_CHAINS_BITS 16
60#define MAX_LOCKDEP_CHAINS (1UL << MAX_LOCKDEP_CHAINS_BITS)
61
62#define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5)
63 72
64/* 73/*
65 * Stack-trace: tightly packed array of stack backtrace 74 * Stack-trace: tightly packed array of stack backtrace
66 * addresses. Protected by the hash_lock. 75 * addresses. Protected by the hash_lock.
67 */ 76 */
68#define MAX_STACK_TRACE_ENTRIES 524288UL 77#define MAX_STACK_TRACE_ENTRIES 524288UL
78#endif
79
80#define MAX_LOCKDEP_CHAINS (1UL << MAX_LOCKDEP_CHAINS_BITS)
81
82#define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5)
69 83
70extern struct list_head all_lock_classes; 84extern struct list_head all_lock_classes;
71extern struct lock_chain lock_chains[]; 85extern struct lock_chain lock_chains[];
diff --git a/kernel/locking/rtmutex.c b/kernel/locking/rtmutex.c
index 1ec0f48962b3..2c49d76f96c3 100644
--- a/kernel/locking/rtmutex.c
+++ b/kernel/locking/rtmutex.c
@@ -65,8 +65,72 @@ static inline void clear_rt_mutex_waiters(struct rt_mutex *lock)
65 65
66static void fixup_rt_mutex_waiters(struct rt_mutex *lock) 66static void fixup_rt_mutex_waiters(struct rt_mutex *lock)
67{ 67{
68 if (!rt_mutex_has_waiters(lock)) 68 unsigned long owner, *p = (unsigned long *) &lock->owner;
69 clear_rt_mutex_waiters(lock); 69
70 if (rt_mutex_has_waiters(lock))
71 return;
72
73 /*
74 * The rbtree has no waiters enqueued, now make sure that the
75 * lock->owner still has the waiters bit set, otherwise the
76 * following can happen:
77 *
78 * CPU 0 CPU 1 CPU2
79 * l->owner=T1
80 * rt_mutex_lock(l)
81 * lock(l->lock)
82 * l->owner = T1 | HAS_WAITERS;
83 * enqueue(T2)
84 * boost()
85 * unlock(l->lock)
86 * block()
87 *
88 * rt_mutex_lock(l)
89 * lock(l->lock)
90 * l->owner = T1 | HAS_WAITERS;
91 * enqueue(T3)
92 * boost()
93 * unlock(l->lock)
94 * block()
95 * signal(->T2) signal(->T3)
96 * lock(l->lock)
97 * dequeue(T2)
98 * deboost()
99 * unlock(l->lock)
100 * lock(l->lock)
101 * dequeue(T3)
102 * ==> wait list is empty
103 * deboost()
104 * unlock(l->lock)
105 * lock(l->lock)
106 * fixup_rt_mutex_waiters()
107 * if (wait_list_empty(l) {
108 * l->owner = owner
109 * owner = l->owner & ~HAS_WAITERS;
110 * ==> l->owner = T1
111 * }
112 * lock(l->lock)
113 * rt_mutex_unlock(l) fixup_rt_mutex_waiters()
114 * if (wait_list_empty(l) {
115 * owner = l->owner & ~HAS_WAITERS;
116 * cmpxchg(l->owner, T1, NULL)
117 * ===> Success (l->owner = NULL)
118 *
119 * l->owner = owner
120 * ==> l->owner = T1
121 * }
122 *
123 * With the check for the waiter bit in place T3 on CPU2 will not
124 * overwrite. All tasks fiddling with the waiters bit are
125 * serialized by l->lock, so nothing else can modify the waiters
126 * bit. If the bit is set then nothing can change l->owner either
127 * so the simple RMW is safe. The cmpxchg() will simply fail if it
128 * happens in the middle of the RMW because the waiters bit is
129 * still set.
130 */
131 owner = READ_ONCE(*p);
132 if (owner & RT_MUTEX_HAS_WAITERS)
133 WRITE_ONCE(*p, owner & ~RT_MUTEX_HAS_WAITERS);
70} 134}
71 135
72/* 136/*
diff --git a/kernel/locking/rtmutex_common.h b/kernel/locking/rtmutex_common.h
index 4f5f83c7d2d3..e317e1cbb3eb 100644
--- a/kernel/locking/rtmutex_common.h
+++ b/kernel/locking/rtmutex_common.h
@@ -75,8 +75,9 @@ task_top_pi_waiter(struct task_struct *p)
75 75
76static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock) 76static inline struct task_struct *rt_mutex_owner(struct rt_mutex *lock)
77{ 77{
78 return (struct task_struct *) 78 unsigned long owner = (unsigned long) READ_ONCE(lock->owner);
79 ((unsigned long)lock->owner & ~RT_MUTEX_OWNER_MASKALL); 79
80 return (struct task_struct *) (owner & ~RT_MUTEX_OWNER_MASKALL);
80} 81}
81 82
82/* 83/*
diff --git a/kernel/module.c b/kernel/module.c
index f57dd63186e6..0e54d5bf0097 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1301,8 +1301,9 @@ static int check_version(Elf_Shdr *sechdrs,
1301 goto bad_version; 1301 goto bad_version;
1302 } 1302 }
1303 1303
1304 pr_warn("%s: no symbol version for %s\n", mod->name, symname); 1304 /* Broken toolchain. Warn once, then let it go.. */
1305 return 0; 1305 pr_warn_once("%s: no symbol version for %s\n", mod->name, symname);
1306 return 1;
1306 1307
1307bad_version: 1308bad_version:
1308 pr_warn("%s: disagrees about version of symbol %s\n", 1309 pr_warn("%s: disagrees about version of symbol %s\n",
diff --git a/kernel/power/suspend_test.c b/kernel/power/suspend_test.c
index 084452e34a12..bdff5ed57f10 100644
--- a/kernel/power/suspend_test.c
+++ b/kernel/power/suspend_test.c
@@ -203,8 +203,10 @@ static int __init test_suspend(void)
203 203
204 /* RTCs have initialized by now too ... can we use one? */ 204 /* RTCs have initialized by now too ... can we use one? */
205 dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm); 205 dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm);
206 if (dev) 206 if (dev) {
207 rtc = rtc_class_open(dev_name(dev)); 207 rtc = rtc_class_open(dev_name(dev));
208 put_device(dev);
209 }
208 if (!rtc) { 210 if (!rtc) {
209 printk(warn_no_rtc); 211 printk(warn_no_rtc);
210 return 0; 212 return 0;
diff --git a/kernel/printk/printk.c b/kernel/printk/printk.c
index de08fc90baaf..f7a55e9ff2f7 100644
--- a/kernel/printk/printk.c
+++ b/kernel/printk/printk.c
@@ -253,17 +253,6 @@ static int preferred_console = -1;
253int console_set_on_cmdline; 253int console_set_on_cmdline;
254EXPORT_SYMBOL(console_set_on_cmdline); 254EXPORT_SYMBOL(console_set_on_cmdline);
255 255
256#ifdef CONFIG_OF
257static bool of_specified_console;
258
259void console_set_by_of(void)
260{
261 of_specified_console = true;
262}
263#else
264# define of_specified_console false
265#endif
266
267/* Flag: console code may call schedule() */ 256/* Flag: console code may call schedule() */
268static int console_may_schedule; 257static int console_may_schedule;
269 258
@@ -794,8 +783,6 @@ static ssize_t devkmsg_write(struct kiocb *iocb, struct iov_iter *from)
794 return ret; 783 return ret;
795} 784}
796 785
797static void cont_flush(void);
798
799static ssize_t devkmsg_read(struct file *file, char __user *buf, 786static ssize_t devkmsg_read(struct file *file, char __user *buf,
800 size_t count, loff_t *ppos) 787 size_t count, loff_t *ppos)
801{ 788{
@@ -811,7 +798,6 @@ static ssize_t devkmsg_read(struct file *file, char __user *buf,
811 if (ret) 798 if (ret)
812 return ret; 799 return ret;
813 raw_spin_lock_irq(&logbuf_lock); 800 raw_spin_lock_irq(&logbuf_lock);
814 cont_flush();
815 while (user->seq == log_next_seq) { 801 while (user->seq == log_next_seq) {
816 if (file->f_flags & O_NONBLOCK) { 802 if (file->f_flags & O_NONBLOCK) {
817 ret = -EAGAIN; 803 ret = -EAGAIN;
@@ -874,7 +860,6 @@ static loff_t devkmsg_llseek(struct file *file, loff_t offset, int whence)
874 return -ESPIPE; 860 return -ESPIPE;
875 861
876 raw_spin_lock_irq(&logbuf_lock); 862 raw_spin_lock_irq(&logbuf_lock);
877 cont_flush();
878 switch (whence) { 863 switch (whence) {
879 case SEEK_SET: 864 case SEEK_SET:
880 /* the first record */ 865 /* the first record */
@@ -913,7 +898,6 @@ static unsigned int devkmsg_poll(struct file *file, poll_table *wait)
913 poll_wait(file, &log_wait, wait); 898 poll_wait(file, &log_wait, wait);
914 899
915 raw_spin_lock_irq(&logbuf_lock); 900 raw_spin_lock_irq(&logbuf_lock);
916 cont_flush();
917 if (user->seq < log_next_seq) { 901 if (user->seq < log_next_seq) {
918 /* return error when data has vanished underneath us */ 902 /* return error when data has vanished underneath us */
919 if (user->seq < log_first_seq) 903 if (user->seq < log_first_seq)
@@ -1300,7 +1284,6 @@ static int syslog_print(char __user *buf, int size)
1300 size_t skip; 1284 size_t skip;
1301 1285
1302 raw_spin_lock_irq(&logbuf_lock); 1286 raw_spin_lock_irq(&logbuf_lock);
1303 cont_flush();
1304 if (syslog_seq < log_first_seq) { 1287 if (syslog_seq < log_first_seq) {
1305 /* messages are gone, move to first one */ 1288 /* messages are gone, move to first one */
1306 syslog_seq = log_first_seq; 1289 syslog_seq = log_first_seq;
@@ -1360,7 +1343,6 @@ static int syslog_print_all(char __user *buf, int size, bool clear)
1360 return -ENOMEM; 1343 return -ENOMEM;
1361 1344
1362 raw_spin_lock_irq(&logbuf_lock); 1345 raw_spin_lock_irq(&logbuf_lock);
1363 cont_flush();
1364 if (buf) { 1346 if (buf) {
1365 u64 next_seq; 1347 u64 next_seq;
1366 u64 seq; 1348 u64 seq;
@@ -1522,7 +1504,6 @@ int do_syslog(int type, char __user *buf, int len, int source)
1522 /* Number of chars in the log buffer */ 1504 /* Number of chars in the log buffer */
1523 case SYSLOG_ACTION_SIZE_UNREAD: 1505 case SYSLOG_ACTION_SIZE_UNREAD:
1524 raw_spin_lock_irq(&logbuf_lock); 1506 raw_spin_lock_irq(&logbuf_lock);
1525 cont_flush();
1526 if (syslog_seq < log_first_seq) { 1507 if (syslog_seq < log_first_seq) {
1527 /* messages are gone, move to first one */ 1508 /* messages are gone, move to first one */
1528 syslog_seq = log_first_seq; 1509 syslog_seq = log_first_seq;
@@ -2657,7 +2638,7 @@ void register_console(struct console *newcon)
2657 * didn't select a console we take the first one 2638 * didn't select a console we take the first one
2658 * that registers here. 2639 * that registers here.
2659 */ 2640 */
2660 if (preferred_console < 0 && !of_specified_console) { 2641 if (preferred_console < 0) {
2661 if (newcon->index < 0) 2642 if (newcon->index < 0)
2662 newcon->index = 0; 2643 newcon->index = 0;
2663 if (newcon->setup == NULL || 2644 if (newcon->setup == NULL ||
@@ -3039,7 +3020,6 @@ void kmsg_dump(enum kmsg_dump_reason reason)
3039 dumper->active = true; 3020 dumper->active = true;
3040 3021
3041 raw_spin_lock_irqsave(&logbuf_lock, flags); 3022 raw_spin_lock_irqsave(&logbuf_lock, flags);
3042 cont_flush();
3043 dumper->cur_seq = clear_seq; 3023 dumper->cur_seq = clear_seq;
3044 dumper->cur_idx = clear_idx; 3024 dumper->cur_idx = clear_idx;
3045 dumper->next_seq = log_next_seq; 3025 dumper->next_seq = log_next_seq;
@@ -3130,7 +3110,6 @@ bool kmsg_dump_get_line(struct kmsg_dumper *dumper, bool syslog,
3130 bool ret; 3110 bool ret;
3131 3111
3132 raw_spin_lock_irqsave(&logbuf_lock, flags); 3112 raw_spin_lock_irqsave(&logbuf_lock, flags);
3133 cont_flush();
3134 ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len); 3113 ret = kmsg_dump_get_line_nolock(dumper, syslog, line, size, len);
3135 raw_spin_unlock_irqrestore(&logbuf_lock, flags); 3114 raw_spin_unlock_irqrestore(&logbuf_lock, flags);
3136 3115
@@ -3173,7 +3152,6 @@ bool kmsg_dump_get_buffer(struct kmsg_dumper *dumper, bool syslog,
3173 goto out; 3152 goto out;
3174 3153
3175 raw_spin_lock_irqsave(&logbuf_lock, flags); 3154 raw_spin_lock_irqsave(&logbuf_lock, flags);
3176 cont_flush();
3177 if (dumper->cur_seq < log_first_seq) { 3155 if (dumper->cur_seq < log_first_seq) {
3178 /* messages are gone, move to first available one */ 3156 /* messages are gone, move to first available one */
3179 dumper->cur_seq = log_first_seq; 3157 dumper->cur_seq = log_first_seq;
diff --git a/kernel/sched/auto_group.c b/kernel/sched/auto_group.c
index a5d966cb8891..da39489d2d80 100644
--- a/kernel/sched/auto_group.c
+++ b/kernel/sched/auto_group.c
@@ -111,10 +111,13 @@ bool task_wants_autogroup(struct task_struct *p, struct task_group *tg)
111{ 111{
112 if (tg != &root_task_group) 112 if (tg != &root_task_group)
113 return false; 113 return false;
114
115 /* 114 /*
116 * We can only assume the task group can't go away on us if 115 * If we race with autogroup_move_group() the caller can use the old
117 * autogroup_move_group() can see us on ->thread_group list. 116 * value of signal->autogroup but in this case sched_move_task() will
117 * be called again before autogroup_kref_put().
118 *
119 * However, there is no way sched_autogroup_exit_task() could tell us
120 * to avoid autogroup->tg, so we abuse PF_EXITING flag for this case.
118 */ 121 */
119 if (p->flags & PF_EXITING) 122 if (p->flags & PF_EXITING)
120 return false; 123 return false;
@@ -122,6 +125,16 @@ bool task_wants_autogroup(struct task_struct *p, struct task_group *tg)
122 return true; 125 return true;
123} 126}
124 127
128void sched_autogroup_exit_task(struct task_struct *p)
129{
130 /*
131 * We are going to call exit_notify() and autogroup_move_group() can't
132 * see this thread after that: we can no longer use signal->autogroup.
133 * See the PF_EXITING check in task_wants_autogroup().
134 */
135 sched_move_task(p);
136}
137
125static void 138static void
126autogroup_move_group(struct task_struct *p, struct autogroup *ag) 139autogroup_move_group(struct task_struct *p, struct autogroup *ag)
127{ 140{
@@ -138,13 +151,20 @@ autogroup_move_group(struct task_struct *p, struct autogroup *ag)
138 } 151 }
139 152
140 p->signal->autogroup = autogroup_kref_get(ag); 153 p->signal->autogroup = autogroup_kref_get(ag);
141 154 /*
142 if (!READ_ONCE(sysctl_sched_autogroup_enabled)) 155 * We can't avoid sched_move_task() after we changed signal->autogroup,
143 goto out; 156 * this process can already run with task_group() == prev->tg or we can
144 157 * race with cgroup code which can read autogroup = prev under rq->lock.
158 * In the latter case for_each_thread() can not miss a migrating thread,
159 * cpu_cgroup_attach() must not be possible after cgroup_exit() and it
160 * can't be removed from thread list, we hold ->siglock.
161 *
162 * If an exiting thread was already removed from thread list we rely on
163 * sched_autogroup_exit_task().
164 */
145 for_each_thread(p, t) 165 for_each_thread(p, t)
146 sched_move_task(t); 166 sched_move_task(t);
147out: 167
148 unlock_task_sighand(p, &flags); 168 unlock_task_sighand(p, &flags);
149 autogroup_kref_put(prev); 169 autogroup_kref_put(prev);
150} 170}
@@ -192,6 +212,7 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice)
192{ 212{
193 static unsigned long next = INITIAL_JIFFIES; 213 static unsigned long next = INITIAL_JIFFIES;
194 struct autogroup *ag; 214 struct autogroup *ag;
215 unsigned long shares;
195 int err; 216 int err;
196 217
197 if (nice < MIN_NICE || nice > MAX_NICE) 218 if (nice < MIN_NICE || nice > MAX_NICE)
@@ -210,9 +231,10 @@ int proc_sched_autogroup_set_nice(struct task_struct *p, int nice)
210 231
211 next = HZ / 10 + jiffies; 232 next = HZ / 10 + jiffies;
212 ag = autogroup_task_get(p); 233 ag = autogroup_task_get(p);
234 shares = scale_load(sched_prio_to_weight[nice + 20]);
213 235
214 down_write(&ag->lock); 236 down_write(&ag->lock);
215 err = sched_group_set_shares(ag->tg, sched_prio_to_weight[nice + 20]); 237 err = sched_group_set_shares(ag->tg, shares);
216 if (!err) 238 if (!err)
217 ag->nice = nice; 239 ag->nice = nice;
218 up_write(&ag->lock); 240 up_write(&ag->lock);
diff --git a/kernel/taskstats.c b/kernel/taskstats.c
index b3f05ee20d18..cbb387a265db 100644
--- a/kernel/taskstats.c
+++ b/kernel/taskstats.c
@@ -54,7 +54,11 @@ static const struct nla_policy taskstats_cmd_get_policy[TASKSTATS_CMD_ATTR_MAX+1
54 [TASKSTATS_CMD_ATTR_REGISTER_CPUMASK] = { .type = NLA_STRING }, 54 [TASKSTATS_CMD_ATTR_REGISTER_CPUMASK] = { .type = NLA_STRING },
55 [TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK] = { .type = NLA_STRING },}; 55 [TASKSTATS_CMD_ATTR_DEREGISTER_CPUMASK] = { .type = NLA_STRING },};
56 56
57static const struct nla_policy cgroupstats_cmd_get_policy[CGROUPSTATS_CMD_ATTR_MAX+1] = { 57/*
58 * We have to use TASKSTATS_CMD_ATTR_MAX here, it is the maxattr in the family.
59 * Make sure they are always aligned.
60 */
61static const struct nla_policy cgroupstats_cmd_get_policy[TASKSTATS_CMD_ATTR_MAX+1] = {
58 [CGROUPSTATS_CMD_ATTR_FD] = { .type = NLA_U32 }, 62 [CGROUPSTATS_CMD_ATTR_FD] = { .type = NLA_U32 },
59}; 63};
60 64
diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
index 2050a7652a86..da87b3cba5b3 100644
--- a/kernel/trace/ftrace.c
+++ b/kernel/trace/ftrace.c
@@ -1862,6 +1862,10 @@ static int __ftrace_hash_update_ipmodify(struct ftrace_ops *ops,
1862 1862
1863 /* Update rec->flags */ 1863 /* Update rec->flags */
1864 do_for_each_ftrace_rec(pg, rec) { 1864 do_for_each_ftrace_rec(pg, rec) {
1865
1866 if (rec->flags & FTRACE_FL_DISABLED)
1867 continue;
1868
1865 /* We need to update only differences of filter_hash */ 1869 /* We need to update only differences of filter_hash */
1866 in_old = !!ftrace_lookup_ip(old_hash, rec->ip); 1870 in_old = !!ftrace_lookup_ip(old_hash, rec->ip);
1867 in_new = !!ftrace_lookup_ip(new_hash, rec->ip); 1871 in_new = !!ftrace_lookup_ip(new_hash, rec->ip);
@@ -1884,6 +1888,10 @@ rollback:
1884 1888
1885 /* Roll back what we did above */ 1889 /* Roll back what we did above */
1886 do_for_each_ftrace_rec(pg, rec) { 1890 do_for_each_ftrace_rec(pg, rec) {
1891
1892 if (rec->flags & FTRACE_FL_DISABLED)
1893 continue;
1894
1887 if (rec == end) 1895 if (rec == end)
1888 goto err_out; 1896 goto err_out;
1889 1897
@@ -2397,6 +2405,10 @@ void __weak ftrace_replace_code(int enable)
2397 return; 2405 return;
2398 2406
2399 do_for_each_ftrace_rec(pg, rec) { 2407 do_for_each_ftrace_rec(pg, rec) {
2408
2409 if (rec->flags & FTRACE_FL_DISABLED)
2410 continue;
2411
2400 failed = __ftrace_replace_code(rec, enable); 2412 failed = __ftrace_replace_code(rec, enable);
2401 if (failed) { 2413 if (failed) {
2402 ftrace_bug(failed, rec); 2414 ftrace_bug(failed, rec);
@@ -2763,7 +2775,7 @@ static int ftrace_shutdown(struct ftrace_ops *ops, int command)
2763 struct dyn_ftrace *rec; 2775 struct dyn_ftrace *rec;
2764 2776
2765 do_for_each_ftrace_rec(pg, rec) { 2777 do_for_each_ftrace_rec(pg, rec) {
2766 if (FTRACE_WARN_ON_ONCE(rec->flags)) 2778 if (FTRACE_WARN_ON_ONCE(rec->flags & ~FTRACE_FL_DISABLED))
2767 pr_warn(" %pS flags:%lx\n", 2779 pr_warn(" %pS flags:%lx\n",
2768 (void *)rec->ip, rec->flags); 2780 (void *)rec->ip, rec->flags);
2769 } while_for_each_ftrace_rec(); 2781 } while_for_each_ftrace_rec();
@@ -3598,6 +3610,10 @@ match_records(struct ftrace_hash *hash, char *func, int len, char *mod)
3598 goto out_unlock; 3610 goto out_unlock;
3599 3611
3600 do_for_each_ftrace_rec(pg, rec) { 3612 do_for_each_ftrace_rec(pg, rec) {
3613
3614 if (rec->flags & FTRACE_FL_DISABLED)
3615 continue;
3616
3601 if (ftrace_match_record(rec, &func_g, mod_match, exclude_mod)) { 3617 if (ftrace_match_record(rec, &func_g, mod_match, exclude_mod)) {
3602 ret = enter_record(hash, rec, clear_filter); 3618 ret = enter_record(hash, rec, clear_filter);
3603 if (ret < 0) { 3619 if (ret < 0) {
@@ -3793,6 +3809,9 @@ register_ftrace_function_probe(char *glob, struct ftrace_probe_ops *ops,
3793 3809
3794 do_for_each_ftrace_rec(pg, rec) { 3810 do_for_each_ftrace_rec(pg, rec) {
3795 3811
3812 if (rec->flags & FTRACE_FL_DISABLED)
3813 continue;
3814
3796 if (!ftrace_match_record(rec, &func_g, NULL, 0)) 3815 if (!ftrace_match_record(rec, &func_g, NULL, 0))
3797 continue; 3816 continue;
3798 3817
@@ -4685,6 +4704,9 @@ ftrace_set_func(unsigned long *array, int *idx, int size, char *buffer)
4685 4704
4686 do_for_each_ftrace_rec(pg, rec) { 4705 do_for_each_ftrace_rec(pg, rec) {
4687 4706
4707 if (rec->flags & FTRACE_FL_DISABLED)
4708 continue;
4709
4688 if (ftrace_match_record(rec, &func_g, NULL, 0)) { 4710 if (ftrace_match_record(rec, &func_g, NULL, 0)) {
4689 /* if it is in the array */ 4711 /* if it is in the array */
4690 exists = false; 4712 exists = false;
diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index b01e547d4d04..a6c8db1d62f6 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -1085,6 +1085,9 @@ config PROVE_LOCKING
1085 1085
1086 For more details, see Documentation/locking/lockdep-design.txt. 1086 For more details, see Documentation/locking/lockdep-design.txt.
1087 1087
1088config PROVE_LOCKING_SMALL
1089 bool
1090
1088config LOCKDEP 1091config LOCKDEP
1089 bool 1092 bool
1090 depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT 1093 depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
diff --git a/lib/debugobjects.c b/lib/debugobjects.c
index a8e12601eb37..056052dc8e91 100644
--- a/lib/debugobjects.c
+++ b/lib/debugobjects.c
@@ -362,6 +362,7 @@ void debug_object_init(void *addr, struct debug_obj_descr *descr)
362 362
363 __debug_object_init(addr, descr, 0); 363 __debug_object_init(addr, descr, 0);
364} 364}
365EXPORT_SYMBOL_GPL(debug_object_init);
365 366
366/** 367/**
367 * debug_object_init_on_stack - debug checks when an object on stack is 368 * debug_object_init_on_stack - debug checks when an object on stack is
@@ -376,6 +377,7 @@ void debug_object_init_on_stack(void *addr, struct debug_obj_descr *descr)
376 377
377 __debug_object_init(addr, descr, 1); 378 __debug_object_init(addr, descr, 1);
378} 379}
380EXPORT_SYMBOL_GPL(debug_object_init_on_stack);
379 381
380/** 382/**
381 * debug_object_activate - debug checks when an object is activated 383 * debug_object_activate - debug checks when an object is activated
@@ -449,6 +451,7 @@ int debug_object_activate(void *addr, struct debug_obj_descr *descr)
449 } 451 }
450 return 0; 452 return 0;
451} 453}
454EXPORT_SYMBOL_GPL(debug_object_activate);
452 455
453/** 456/**
454 * debug_object_deactivate - debug checks when an object is deactivated 457 * debug_object_deactivate - debug checks when an object is deactivated
@@ -496,6 +499,7 @@ void debug_object_deactivate(void *addr, struct debug_obj_descr *descr)
496 499
497 raw_spin_unlock_irqrestore(&db->lock, flags); 500 raw_spin_unlock_irqrestore(&db->lock, flags);
498} 501}
502EXPORT_SYMBOL_GPL(debug_object_deactivate);
499 503
500/** 504/**
501 * debug_object_destroy - debug checks when an object is destroyed 505 * debug_object_destroy - debug checks when an object is destroyed
@@ -542,6 +546,7 @@ void debug_object_destroy(void *addr, struct debug_obj_descr *descr)
542out_unlock: 546out_unlock:
543 raw_spin_unlock_irqrestore(&db->lock, flags); 547 raw_spin_unlock_irqrestore(&db->lock, flags);
544} 548}
549EXPORT_SYMBOL_GPL(debug_object_destroy);
545 550
546/** 551/**
547 * debug_object_free - debug checks when an object is freed 552 * debug_object_free - debug checks when an object is freed
@@ -582,6 +587,7 @@ void debug_object_free(void *addr, struct debug_obj_descr *descr)
582out_unlock: 587out_unlock:
583 raw_spin_unlock_irqrestore(&db->lock, flags); 588 raw_spin_unlock_irqrestore(&db->lock, flags);
584} 589}
590EXPORT_SYMBOL_GPL(debug_object_free);
585 591
586/** 592/**
587 * debug_object_assert_init - debug checks when object should be init-ed 593 * debug_object_assert_init - debug checks when object should be init-ed
@@ -626,6 +632,7 @@ void debug_object_assert_init(void *addr, struct debug_obj_descr *descr)
626 632
627 raw_spin_unlock_irqrestore(&db->lock, flags); 633 raw_spin_unlock_irqrestore(&db->lock, flags);
628} 634}
635EXPORT_SYMBOL_GPL(debug_object_assert_init);
629 636
630/** 637/**
631 * debug_object_active_state - debug checks object usage state machine 638 * debug_object_active_state - debug checks object usage state machine
@@ -673,6 +680,7 @@ debug_object_active_state(void *addr, struct debug_obj_descr *descr,
673 680
674 raw_spin_unlock_irqrestore(&db->lock, flags); 681 raw_spin_unlock_irqrestore(&db->lock, flags);
675} 682}
683EXPORT_SYMBOL_GPL(debug_object_active_state);
676 684
677#ifdef CONFIG_DEBUG_OBJECTS_FREE 685#ifdef CONFIG_DEBUG_OBJECTS_FREE
678static void __debug_check_no_obj_freed(const void *address, unsigned long size) 686static void __debug_check_no_obj_freed(const void *address, unsigned long size)
diff --git a/lib/iov_iter.c b/lib/iov_iter.c
index f0c7f1481bae..f2bd21b93dfc 100644
--- a/lib/iov_iter.c
+++ b/lib/iov_iter.c
@@ -683,10 +683,11 @@ static void pipe_advance(struct iov_iter *i, size_t size)
683 struct pipe_inode_info *pipe = i->pipe; 683 struct pipe_inode_info *pipe = i->pipe;
684 struct pipe_buffer *buf; 684 struct pipe_buffer *buf;
685 int idx = i->idx; 685 int idx = i->idx;
686 size_t off = i->iov_offset; 686 size_t off = i->iov_offset, orig_sz;
687 687
688 if (unlikely(i->count < size)) 688 if (unlikely(i->count < size))
689 size = i->count; 689 size = i->count;
690 orig_sz = size;
690 691
691 if (size) { 692 if (size) {
692 if (off) /* make it relative to the beginning of buffer */ 693 if (off) /* make it relative to the beginning of buffer */
@@ -713,6 +714,7 @@ static void pipe_advance(struct iov_iter *i, size_t size)
713 pipe->nrbufs--; 714 pipe->nrbufs--;
714 } 715 }
715 } 716 }
717 i->count -= orig_sz;
716} 718}
717 719
718void iov_iter_advance(struct iov_iter *i, size_t size) 720void iov_iter_advance(struct iov_iter *i, size_t size)
diff --git a/lib/locking-selftest.c b/lib/locking-selftest.c
index 872a15a2a637..f3a217ea0388 100644
--- a/lib/locking-selftest.c
+++ b/lib/locking-selftest.c
@@ -980,23 +980,23 @@ static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
980#ifndef CONFIG_PROVE_LOCKING 980#ifndef CONFIG_PROVE_LOCKING
981 if (expected == FAILURE && debug_locks) { 981 if (expected == FAILURE && debug_locks) {
982 expected_testcase_failures++; 982 expected_testcase_failures++;
983 printk("failed|"); 983 pr_cont("failed|");
984 } 984 }
985 else 985 else
986#endif 986#endif
987 if (debug_locks != expected) { 987 if (debug_locks != expected) {
988 unexpected_testcase_failures++; 988 unexpected_testcase_failures++;
989 printk("FAILED|"); 989 pr_cont("FAILED|");
990 990
991 dump_stack(); 991 dump_stack();
992 } else { 992 } else {
993 testcase_successes++; 993 testcase_successes++;
994 printk(" ok |"); 994 pr_cont(" ok |");
995 } 995 }
996 testcase_total++; 996 testcase_total++;
997 997
998 if (debug_locks_verbose) 998 if (debug_locks_verbose)
999 printk(" lockclass mask: %x, debug_locks: %d, expected: %d\n", 999 pr_cont(" lockclass mask: %x, debug_locks: %d, expected: %d\n",
1000 lockclass_mask, debug_locks, expected); 1000 lockclass_mask, debug_locks, expected);
1001 /* 1001 /*
1002 * Some tests (e.g. double-unlock) might corrupt the preemption 1002 * Some tests (e.g. double-unlock) might corrupt the preemption
@@ -1021,26 +1021,26 @@ static inline void print_testname(const char *testname)
1021#define DO_TESTCASE_1(desc, name, nr) \ 1021#define DO_TESTCASE_1(desc, name, nr) \
1022 print_testname(desc"/"#nr); \ 1022 print_testname(desc"/"#nr); \
1023 dotest(name##_##nr, SUCCESS, LOCKTYPE_RWLOCK); \ 1023 dotest(name##_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
1024 printk("\n"); 1024 pr_cont("\n");
1025 1025
1026#define DO_TESTCASE_1B(desc, name, nr) \ 1026#define DO_TESTCASE_1B(desc, name, nr) \
1027 print_testname(desc"/"#nr); \ 1027 print_testname(desc"/"#nr); \
1028 dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK); \ 1028 dotest(name##_##nr, FAILURE, LOCKTYPE_RWLOCK); \
1029 printk("\n"); 1029 pr_cont("\n");
1030 1030
1031#define DO_TESTCASE_3(desc, name, nr) \ 1031#define DO_TESTCASE_3(desc, name, nr) \
1032 print_testname(desc"/"#nr); \ 1032 print_testname(desc"/"#nr); \
1033 dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN); \ 1033 dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN); \
1034 dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK); \ 1034 dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK); \
1035 dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK); \ 1035 dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
1036 printk("\n"); 1036 pr_cont("\n");
1037 1037
1038#define DO_TESTCASE_3RW(desc, name, nr) \ 1038#define DO_TESTCASE_3RW(desc, name, nr) \
1039 print_testname(desc"/"#nr); \ 1039 print_testname(desc"/"#nr); \
1040 dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN|LOCKTYPE_RWLOCK);\ 1040 dotest(name##_spin_##nr, FAILURE, LOCKTYPE_SPIN|LOCKTYPE_RWLOCK);\
1041 dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK); \ 1041 dotest(name##_wlock_##nr, FAILURE, LOCKTYPE_RWLOCK); \
1042 dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK); \ 1042 dotest(name##_rlock_##nr, SUCCESS, LOCKTYPE_RWLOCK); \
1043 printk("\n"); 1043 pr_cont("\n");
1044 1044
1045#define DO_TESTCASE_6(desc, name) \ 1045#define DO_TESTCASE_6(desc, name) \
1046 print_testname(desc); \ 1046 print_testname(desc); \
@@ -1050,7 +1050,7 @@ static inline void print_testname(const char *testname)
1050 dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX); \ 1050 dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX); \
1051 dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM); \ 1051 dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM); \
1052 dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM); \ 1052 dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM); \
1053 printk("\n"); 1053 pr_cont("\n");
1054 1054
1055#define DO_TESTCASE_6_SUCCESS(desc, name) \ 1055#define DO_TESTCASE_6_SUCCESS(desc, name) \
1056 print_testname(desc); \ 1056 print_testname(desc); \
@@ -1060,7 +1060,7 @@ static inline void print_testname(const char *testname)
1060 dotest(name##_mutex, SUCCESS, LOCKTYPE_MUTEX); \ 1060 dotest(name##_mutex, SUCCESS, LOCKTYPE_MUTEX); \
1061 dotest(name##_wsem, SUCCESS, LOCKTYPE_RWSEM); \ 1061 dotest(name##_wsem, SUCCESS, LOCKTYPE_RWSEM); \
1062 dotest(name##_rsem, SUCCESS, LOCKTYPE_RWSEM); \ 1062 dotest(name##_rsem, SUCCESS, LOCKTYPE_RWSEM); \
1063 printk("\n"); 1063 pr_cont("\n");
1064 1064
1065/* 1065/*
1066 * 'read' variant: rlocks must not trigger. 1066 * 'read' variant: rlocks must not trigger.
@@ -1073,7 +1073,7 @@ static inline void print_testname(const char *testname)
1073 dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX); \ 1073 dotest(name##_mutex, FAILURE, LOCKTYPE_MUTEX); \
1074 dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM); \ 1074 dotest(name##_wsem, FAILURE, LOCKTYPE_RWSEM); \
1075 dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM); \ 1075 dotest(name##_rsem, FAILURE, LOCKTYPE_RWSEM); \
1076 printk("\n"); 1076 pr_cont("\n");
1077 1077
1078#define DO_TESTCASE_2I(desc, name, nr) \ 1078#define DO_TESTCASE_2I(desc, name, nr) \
1079 DO_TESTCASE_1("hard-"desc, name##_hard, nr); \ 1079 DO_TESTCASE_1("hard-"desc, name##_hard, nr); \
@@ -1726,25 +1726,25 @@ static void ww_tests(void)
1726 dotest(ww_test_fail_acquire, SUCCESS, LOCKTYPE_WW); 1726 dotest(ww_test_fail_acquire, SUCCESS, LOCKTYPE_WW);
1727 dotest(ww_test_normal, SUCCESS, LOCKTYPE_WW); 1727 dotest(ww_test_normal, SUCCESS, LOCKTYPE_WW);
1728 dotest(ww_test_unneeded_slow, FAILURE, LOCKTYPE_WW); 1728 dotest(ww_test_unneeded_slow, FAILURE, LOCKTYPE_WW);
1729 printk("\n"); 1729 pr_cont("\n");
1730 1730
1731 print_testname("ww contexts mixing"); 1731 print_testname("ww contexts mixing");
1732 dotest(ww_test_two_contexts, FAILURE, LOCKTYPE_WW); 1732 dotest(ww_test_two_contexts, FAILURE, LOCKTYPE_WW);
1733 dotest(ww_test_diff_class, FAILURE, LOCKTYPE_WW); 1733 dotest(ww_test_diff_class, FAILURE, LOCKTYPE_WW);
1734 printk("\n"); 1734 pr_cont("\n");
1735 1735
1736 print_testname("finishing ww context"); 1736 print_testname("finishing ww context");
1737 dotest(ww_test_context_done_twice, FAILURE, LOCKTYPE_WW); 1737 dotest(ww_test_context_done_twice, FAILURE, LOCKTYPE_WW);
1738 dotest(ww_test_context_unlock_twice, FAILURE, LOCKTYPE_WW); 1738 dotest(ww_test_context_unlock_twice, FAILURE, LOCKTYPE_WW);
1739 dotest(ww_test_context_fini_early, FAILURE, LOCKTYPE_WW); 1739 dotest(ww_test_context_fini_early, FAILURE, LOCKTYPE_WW);
1740 dotest(ww_test_context_lock_after_done, FAILURE, LOCKTYPE_WW); 1740 dotest(ww_test_context_lock_after_done, FAILURE, LOCKTYPE_WW);
1741 printk("\n"); 1741 pr_cont("\n");
1742 1742
1743 print_testname("locking mismatches"); 1743 print_testname("locking mismatches");
1744 dotest(ww_test_object_unlock_twice, FAILURE, LOCKTYPE_WW); 1744 dotest(ww_test_object_unlock_twice, FAILURE, LOCKTYPE_WW);
1745 dotest(ww_test_object_lock_unbalanced, FAILURE, LOCKTYPE_WW); 1745 dotest(ww_test_object_lock_unbalanced, FAILURE, LOCKTYPE_WW);
1746 dotest(ww_test_object_lock_stale_context, FAILURE, LOCKTYPE_WW); 1746 dotest(ww_test_object_lock_stale_context, FAILURE, LOCKTYPE_WW);
1747 printk("\n"); 1747 pr_cont("\n");
1748 1748
1749 print_testname("EDEADLK handling"); 1749 print_testname("EDEADLK handling");
1750 dotest(ww_test_edeadlk_normal, SUCCESS, LOCKTYPE_WW); 1750 dotest(ww_test_edeadlk_normal, SUCCESS, LOCKTYPE_WW);
@@ -1757,11 +1757,11 @@ static void ww_tests(void)
1757 dotest(ww_test_edeadlk_acquire_more_edeadlk_slow, FAILURE, LOCKTYPE_WW); 1757 dotest(ww_test_edeadlk_acquire_more_edeadlk_slow, FAILURE, LOCKTYPE_WW);
1758 dotest(ww_test_edeadlk_acquire_wrong, FAILURE, LOCKTYPE_WW); 1758 dotest(ww_test_edeadlk_acquire_wrong, FAILURE, LOCKTYPE_WW);
1759 dotest(ww_test_edeadlk_acquire_wrong_slow, FAILURE, LOCKTYPE_WW); 1759 dotest(ww_test_edeadlk_acquire_wrong_slow, FAILURE, LOCKTYPE_WW);
1760 printk("\n"); 1760 pr_cont("\n");
1761 1761
1762 print_testname("spinlock nest unlocked"); 1762 print_testname("spinlock nest unlocked");
1763 dotest(ww_test_spin_nest_unlocked, FAILURE, LOCKTYPE_WW); 1763 dotest(ww_test_spin_nest_unlocked, FAILURE, LOCKTYPE_WW);
1764 printk("\n"); 1764 pr_cont("\n");
1765 1765
1766 printk(" -----------------------------------------------------\n"); 1766 printk(" -----------------------------------------------------\n");
1767 printk(" |block | try |context|\n"); 1767 printk(" |block | try |context|\n");
@@ -1771,25 +1771,25 @@ static void ww_tests(void)
1771 dotest(ww_test_context_block, FAILURE, LOCKTYPE_WW); 1771 dotest(ww_test_context_block, FAILURE, LOCKTYPE_WW);
1772 dotest(ww_test_context_try, SUCCESS, LOCKTYPE_WW); 1772 dotest(ww_test_context_try, SUCCESS, LOCKTYPE_WW);
1773 dotest(ww_test_context_context, SUCCESS, LOCKTYPE_WW); 1773 dotest(ww_test_context_context, SUCCESS, LOCKTYPE_WW);
1774 printk("\n"); 1774 pr_cont("\n");
1775 1775
1776 print_testname("try"); 1776 print_testname("try");
1777 dotest(ww_test_try_block, FAILURE, LOCKTYPE_WW); 1777 dotest(ww_test_try_block, FAILURE, LOCKTYPE_WW);
1778 dotest(ww_test_try_try, SUCCESS, LOCKTYPE_WW); 1778 dotest(ww_test_try_try, SUCCESS, LOCKTYPE_WW);
1779 dotest(ww_test_try_context, FAILURE, LOCKTYPE_WW); 1779 dotest(ww_test_try_context, FAILURE, LOCKTYPE_WW);
1780 printk("\n"); 1780 pr_cont("\n");
1781 1781
1782 print_testname("block"); 1782 print_testname("block");
1783 dotest(ww_test_block_block, FAILURE, LOCKTYPE_WW); 1783 dotest(ww_test_block_block, FAILURE, LOCKTYPE_WW);
1784 dotest(ww_test_block_try, SUCCESS, LOCKTYPE_WW); 1784 dotest(ww_test_block_try, SUCCESS, LOCKTYPE_WW);
1785 dotest(ww_test_block_context, FAILURE, LOCKTYPE_WW); 1785 dotest(ww_test_block_context, FAILURE, LOCKTYPE_WW);
1786 printk("\n"); 1786 pr_cont("\n");
1787 1787
1788 print_testname("spinlock"); 1788 print_testname("spinlock");
1789 dotest(ww_test_spin_block, FAILURE, LOCKTYPE_WW); 1789 dotest(ww_test_spin_block, FAILURE, LOCKTYPE_WW);
1790 dotest(ww_test_spin_try, SUCCESS, LOCKTYPE_WW); 1790 dotest(ww_test_spin_try, SUCCESS, LOCKTYPE_WW);
1791 dotest(ww_test_spin_context, FAILURE, LOCKTYPE_WW); 1791 dotest(ww_test_spin_context, FAILURE, LOCKTYPE_WW);
1792 printk("\n"); 1792 pr_cont("\n");
1793} 1793}
1794 1794
1795void locking_selftest(void) 1795void locking_selftest(void)
@@ -1829,32 +1829,32 @@ void locking_selftest(void)
1829 1829
1830 printk(" --------------------------------------------------------------------------\n"); 1830 printk(" --------------------------------------------------------------------------\n");
1831 print_testname("recursive read-lock"); 1831 print_testname("recursive read-lock");
1832 printk(" |"); 1832 pr_cont(" |");
1833 dotest(rlock_AA1, SUCCESS, LOCKTYPE_RWLOCK); 1833 dotest(rlock_AA1, SUCCESS, LOCKTYPE_RWLOCK);
1834 printk(" |"); 1834 pr_cont(" |");
1835 dotest(rsem_AA1, FAILURE, LOCKTYPE_RWSEM); 1835 dotest(rsem_AA1, FAILURE, LOCKTYPE_RWSEM);
1836 printk("\n"); 1836 pr_cont("\n");
1837 1837
1838 print_testname("recursive read-lock #2"); 1838 print_testname("recursive read-lock #2");
1839 printk(" |"); 1839 pr_cont(" |");
1840 dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK); 1840 dotest(rlock_AA1B, SUCCESS, LOCKTYPE_RWLOCK);
1841 printk(" |"); 1841 pr_cont(" |");
1842 dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM); 1842 dotest(rsem_AA1B, FAILURE, LOCKTYPE_RWSEM);
1843 printk("\n"); 1843 pr_cont("\n");
1844 1844
1845 print_testname("mixed read-write-lock"); 1845 print_testname("mixed read-write-lock");
1846 printk(" |"); 1846 pr_cont(" |");
1847 dotest(rlock_AA2, FAILURE, LOCKTYPE_RWLOCK); 1847 dotest(rlock_AA2, FAILURE, LOCKTYPE_RWLOCK);
1848 printk(" |"); 1848 pr_cont(" |");
1849 dotest(rsem_AA2, FAILURE, LOCKTYPE_RWSEM); 1849 dotest(rsem_AA2, FAILURE, LOCKTYPE_RWSEM);
1850 printk("\n"); 1850 pr_cont("\n");
1851 1851
1852 print_testname("mixed write-read-lock"); 1852 print_testname("mixed write-read-lock");
1853 printk(" |"); 1853 pr_cont(" |");
1854 dotest(rlock_AA3, FAILURE, LOCKTYPE_RWLOCK); 1854 dotest(rlock_AA3, FAILURE, LOCKTYPE_RWLOCK);
1855 printk(" |"); 1855 pr_cont(" |");
1856 dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM); 1856 dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM);
1857 printk("\n"); 1857 pr_cont("\n");
1858 1858
1859 printk(" --------------------------------------------------------------------------\n"); 1859 printk(" --------------------------------------------------------------------------\n");
1860 1860
diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c
index 5464c8744ea9..e24388a863a7 100644
--- a/lib/mpi/mpi-pow.c
+++ b/lib/mpi/mpi-pow.c
@@ -64,8 +64,13 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod)
64 if (!esize) { 64 if (!esize) {
65 /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 65 /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0
66 * depending on if MOD equals 1. */ 66 * depending on if MOD equals 1. */
67 rp[0] = 1;
68 res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; 67 res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1;
68 if (res->nlimbs) {
69 if (mpi_resize(res, 1) < 0)
70 goto enomem;
71 rp = res->d;
72 rp[0] = 1;
73 }
69 res->sign = 0; 74 res->sign = 0;
70 goto leave; 75 goto leave;
71 } 76 }
diff --git a/lib/stackdepot.c b/lib/stackdepot.c
index 4d830e299989..f87d138e9672 100644
--- a/lib/stackdepot.c
+++ b/lib/stackdepot.c
@@ -192,6 +192,7 @@ void depot_fetch_stack(depot_stack_handle_t handle, struct stack_trace *trace)
192 trace->entries = stack->entries; 192 trace->entries = stack->entries;
193 trace->skip = 0; 193 trace->skip = 0;
194} 194}
195EXPORT_SYMBOL_GPL(depot_fetch_stack);
195 196
196/** 197/**
197 * depot_save_stack - save stack in a stack depot. 198 * depot_save_stack - save stack in a stack depot.
@@ -283,3 +284,4 @@ exit:
283fast_exit: 284fast_exit:
284 return retval; 285 return retval;
285} 286}
287EXPORT_SYMBOL_GPL(depot_save_stack);
diff --git a/lib/test_kasan.c b/lib/test_kasan.c
index 5e51872b3fc1..fbdf87920093 100644
--- a/lib/test_kasan.c
+++ b/lib/test_kasan.c
@@ -20,6 +20,11 @@
20#include <linux/uaccess.h> 20#include <linux/uaccess.h>
21#include <linux/module.h> 21#include <linux/module.h>
22 22
23/*
24 * Note: test functions are marked noinline so that their names appear in
25 * reports.
26 */
27
23static noinline void __init kmalloc_oob_right(void) 28static noinline void __init kmalloc_oob_right(void)
24{ 29{
25 char *ptr; 30 char *ptr;
@@ -411,6 +416,29 @@ static noinline void __init copy_user_test(void)
411 kfree(kmem); 416 kfree(kmem);
412} 417}
413 418
419static noinline void __init use_after_scope_test(void)
420{
421 volatile char *volatile p;
422
423 pr_info("use-after-scope on int\n");
424 {
425 int local = 0;
426
427 p = (char *)&local;
428 }
429 p[0] = 1;
430 p[3] = 1;
431
432 pr_info("use-after-scope on array\n");
433 {
434 char local[1024] = {0};
435
436 p = local;
437 }
438 p[0] = 1;
439 p[1023] = 1;
440}
441
414static int __init kmalloc_tests_init(void) 442static int __init kmalloc_tests_init(void)
415{ 443{
416 kmalloc_oob_right(); 444 kmalloc_oob_right();
@@ -436,6 +464,7 @@ static int __init kmalloc_tests_init(void)
436 kasan_global_oob(); 464 kasan_global_oob();
437 ksize_unpoisons_memory(); 465 ksize_unpoisons_memory();
438 copy_user_test(); 466 copy_user_test();
467 use_after_scope_test();
439 return -EAGAIN; 468 return -EAGAIN;
440} 469}
441 470
diff --git a/mm/cma.c b/mm/cma.c
index 384c2cb51b56..c960459eda7e 100644
--- a/mm/cma.c
+++ b/mm/cma.c
@@ -385,6 +385,9 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align)
385 bitmap_maxno = cma_bitmap_maxno(cma); 385 bitmap_maxno = cma_bitmap_maxno(cma);
386 bitmap_count = cma_bitmap_pages_to_bits(cma, count); 386 bitmap_count = cma_bitmap_pages_to_bits(cma, count);
387 387
388 if (bitmap_count > bitmap_maxno)
389 return NULL;
390
388 for (;;) { 391 for (;;) {
389 mutex_lock(&cma->lock); 392 mutex_lock(&cma->lock);
390 bitmap_no = bitmap_find_next_zero_area_off(cma->bitmap, 393 bitmap_no = bitmap_find_next_zero_area_off(cma->bitmap,
diff --git a/mm/filemap.c b/mm/filemap.c
index c7fe2f16503f..50b52fe51937 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -1732,6 +1732,9 @@ find_page:
1732 if (inode->i_blkbits == PAGE_SHIFT || 1732 if (inode->i_blkbits == PAGE_SHIFT ||
1733 !mapping->a_ops->is_partially_uptodate) 1733 !mapping->a_ops->is_partially_uptodate)
1734 goto page_not_up_to_date; 1734 goto page_not_up_to_date;
1735 /* pipes can't handle partially uptodate pages */
1736 if (unlikely(iter->type & ITER_PIPE))
1737 goto page_not_up_to_date;
1735 if (!trylock_page(page)) 1738 if (!trylock_page(page))
1736 goto page_not_up_to_date; 1739 goto page_not_up_to_date;
1737 /* Did it get truncated before we got the lock? */ 1740 /* Did it get truncated before we got the lock? */
diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index cdcd25cb30fe..d4a6e4001512 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -1426,11 +1426,12 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
1426 1426
1427bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr, 1427bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
1428 unsigned long new_addr, unsigned long old_end, 1428 unsigned long new_addr, unsigned long old_end,
1429 pmd_t *old_pmd, pmd_t *new_pmd) 1429 pmd_t *old_pmd, pmd_t *new_pmd, bool *need_flush)
1430{ 1430{
1431 spinlock_t *old_ptl, *new_ptl; 1431 spinlock_t *old_ptl, *new_ptl;
1432 pmd_t pmd; 1432 pmd_t pmd;
1433 struct mm_struct *mm = vma->vm_mm; 1433 struct mm_struct *mm = vma->vm_mm;
1434 bool force_flush = false;
1434 1435
1435 if ((old_addr & ~HPAGE_PMD_MASK) || 1436 if ((old_addr & ~HPAGE_PMD_MASK) ||
1436 (new_addr & ~HPAGE_PMD_MASK) || 1437 (new_addr & ~HPAGE_PMD_MASK) ||
@@ -1456,6 +1457,8 @@ bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
1456 if (new_ptl != old_ptl) 1457 if (new_ptl != old_ptl)
1457 spin_lock_nested(new_ptl, SINGLE_DEPTH_NESTING); 1458 spin_lock_nested(new_ptl, SINGLE_DEPTH_NESTING);
1458 pmd = pmdp_huge_get_and_clear(mm, old_addr, old_pmd); 1459 pmd = pmdp_huge_get_and_clear(mm, old_addr, old_pmd);
1460 if (pmd_present(pmd) && pmd_dirty(pmd))
1461 force_flush = true;
1459 VM_BUG_ON(!pmd_none(*new_pmd)); 1462 VM_BUG_ON(!pmd_none(*new_pmd));
1460 1463
1461 if (pmd_move_must_withdraw(new_ptl, old_ptl) && 1464 if (pmd_move_must_withdraw(new_ptl, old_ptl) &&
@@ -1467,6 +1470,10 @@ bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
1467 set_pmd_at(mm, new_addr, new_pmd, pmd_mksoft_dirty(pmd)); 1470 set_pmd_at(mm, new_addr, new_pmd, pmd_mksoft_dirty(pmd));
1468 if (new_ptl != old_ptl) 1471 if (new_ptl != old_ptl)
1469 spin_unlock(new_ptl); 1472 spin_unlock(new_ptl);
1473 if (force_flush)
1474 flush_tlb_range(vma, old_addr, old_addr + PMD_SIZE);
1475 else
1476 *need_flush = true;
1470 spin_unlock(old_ptl); 1477 spin_unlock(old_ptl);
1471 return true; 1478 return true;
1472 } 1479 }
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index ec49d9ef1eef..418bf01a50ed 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -1826,11 +1826,17 @@ static void return_unused_surplus_pages(struct hstate *h,
1826 * is not the case is if a reserve map was changed between calls. It 1826 * is not the case is if a reserve map was changed between calls. It
1827 * is the responsibility of the caller to notice the difference and 1827 * is the responsibility of the caller to notice the difference and
1828 * take appropriate action. 1828 * take appropriate action.
1829 *
1830 * vma_add_reservation is used in error paths where a reservation must
1831 * be restored when a newly allocated huge page must be freed. It is
1832 * to be called after calling vma_needs_reservation to determine if a
1833 * reservation exists.
1829 */ 1834 */
1830enum vma_resv_mode { 1835enum vma_resv_mode {
1831 VMA_NEEDS_RESV, 1836 VMA_NEEDS_RESV,
1832 VMA_COMMIT_RESV, 1837 VMA_COMMIT_RESV,
1833 VMA_END_RESV, 1838 VMA_END_RESV,
1839 VMA_ADD_RESV,
1834}; 1840};
1835static long __vma_reservation_common(struct hstate *h, 1841static long __vma_reservation_common(struct hstate *h,
1836 struct vm_area_struct *vma, unsigned long addr, 1842 struct vm_area_struct *vma, unsigned long addr,
@@ -1856,6 +1862,14 @@ static long __vma_reservation_common(struct hstate *h,
1856 region_abort(resv, idx, idx + 1); 1862 region_abort(resv, idx, idx + 1);
1857 ret = 0; 1863 ret = 0;
1858 break; 1864 break;
1865 case VMA_ADD_RESV:
1866 if (vma->vm_flags & VM_MAYSHARE)
1867 ret = region_add(resv, idx, idx + 1);
1868 else {
1869 region_abort(resv, idx, idx + 1);
1870 ret = region_del(resv, idx, idx + 1);
1871 }
1872 break;
1859 default: 1873 default:
1860 BUG(); 1874 BUG();
1861 } 1875 }
@@ -1903,6 +1917,56 @@ static void vma_end_reservation(struct hstate *h,
1903 (void)__vma_reservation_common(h, vma, addr, VMA_END_RESV); 1917 (void)__vma_reservation_common(h, vma, addr, VMA_END_RESV);
1904} 1918}
1905 1919
1920static long vma_add_reservation(struct hstate *h,
1921 struct vm_area_struct *vma, unsigned long addr)
1922{
1923 return __vma_reservation_common(h, vma, addr, VMA_ADD_RESV);
1924}
1925
1926/*
1927 * This routine is called to restore a reservation on error paths. In the
1928 * specific error paths, a huge page was allocated (via alloc_huge_page)
1929 * and is about to be freed. If a reservation for the page existed,
1930 * alloc_huge_page would have consumed the reservation and set PagePrivate
1931 * in the newly allocated page. When the page is freed via free_huge_page,
1932 * the global reservation count will be incremented if PagePrivate is set.
1933 * However, free_huge_page can not adjust the reserve map. Adjust the
1934 * reserve map here to be consistent with global reserve count adjustments
1935 * to be made by free_huge_page.
1936 */
1937static void restore_reserve_on_error(struct hstate *h,
1938 struct vm_area_struct *vma, unsigned long address,
1939 struct page *page)
1940{
1941 if (unlikely(PagePrivate(page))) {
1942 long rc = vma_needs_reservation(h, vma, address);
1943
1944 if (unlikely(rc < 0)) {
1945 /*
1946 * Rare out of memory condition in reserve map
1947 * manipulation. Clear PagePrivate so that
1948 * global reserve count will not be incremented
1949 * by free_huge_page. This will make it appear
1950 * as though the reservation for this page was
1951 * consumed. This may prevent the task from
1952 * faulting in the page at a later time. This
1953 * is better than inconsistent global huge page
1954 * accounting of reserve counts.
1955 */
1956 ClearPagePrivate(page);
1957 } else if (rc) {
1958 rc = vma_add_reservation(h, vma, address);
1959 if (unlikely(rc < 0))
1960 /*
1961 * See above comment about rare out of
1962 * memory condition.
1963 */
1964 ClearPagePrivate(page);
1965 } else
1966 vma_end_reservation(h, vma, address);
1967 }
1968}
1969
1906struct page *alloc_huge_page(struct vm_area_struct *vma, 1970struct page *alloc_huge_page(struct vm_area_struct *vma,
1907 unsigned long addr, int avoid_reserve) 1971 unsigned long addr, int avoid_reserve)
1908{ 1972{
@@ -3498,6 +3562,7 @@ retry_avoidcopy:
3498 spin_unlock(ptl); 3562 spin_unlock(ptl);
3499 mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end); 3563 mmu_notifier_invalidate_range_end(mm, mmun_start, mmun_end);
3500out_release_all: 3564out_release_all:
3565 restore_reserve_on_error(h, vma, address, new_page);
3501 put_page(new_page); 3566 put_page(new_page);
3502out_release_old: 3567out_release_old:
3503 put_page(old_page); 3568 put_page(old_page);
@@ -3680,6 +3745,7 @@ backout:
3680 spin_unlock(ptl); 3745 spin_unlock(ptl);
3681backout_unlocked: 3746backout_unlocked:
3682 unlock_page(page); 3747 unlock_page(page);
3748 restore_reserve_on_error(h, vma, address, page);
3683 put_page(page); 3749 put_page(page);
3684 goto out; 3750 goto out;
3685} 3751}
diff --git a/mm/kasan/kasan.c b/mm/kasan/kasan.c
index 70c009741aab..0e9505f66ec1 100644
--- a/mm/kasan/kasan.c
+++ b/mm/kasan/kasan.c
@@ -764,6 +764,25 @@ EXPORT_SYMBOL(__asan_storeN_noabort);
764void __asan_handle_no_return(void) {} 764void __asan_handle_no_return(void) {}
765EXPORT_SYMBOL(__asan_handle_no_return); 765EXPORT_SYMBOL(__asan_handle_no_return);
766 766
767/* Emitted by compiler to poison large objects when they go out of scope. */
768void __asan_poison_stack_memory(const void *addr, size_t size)
769{
770 /*
771 * Addr is KASAN_SHADOW_SCALE_SIZE-aligned and the object is surrounded
772 * by redzones, so we simply round up size to simplify logic.
773 */
774 kasan_poison_shadow(addr, round_up(size, KASAN_SHADOW_SCALE_SIZE),
775 KASAN_USE_AFTER_SCOPE);
776}
777EXPORT_SYMBOL(__asan_poison_stack_memory);
778
779/* Emitted by compiler to unpoison large objects when they go into scope. */
780void __asan_unpoison_stack_memory(const void *addr, size_t size)
781{
782 kasan_unpoison_shadow(addr, size);
783}
784EXPORT_SYMBOL(__asan_unpoison_stack_memory);
785
767#ifdef CONFIG_MEMORY_HOTPLUG 786#ifdef CONFIG_MEMORY_HOTPLUG
768static int kasan_mem_notifier(struct notifier_block *nb, 787static int kasan_mem_notifier(struct notifier_block *nb,
769 unsigned long action, void *data) 788 unsigned long action, void *data)
diff --git a/mm/kasan/kasan.h b/mm/kasan/kasan.h
index e5c2181fee6f..1c260e6b3b3c 100644
--- a/mm/kasan/kasan.h
+++ b/mm/kasan/kasan.h
@@ -21,6 +21,7 @@
21#define KASAN_STACK_MID 0xF2 21#define KASAN_STACK_MID 0xF2
22#define KASAN_STACK_RIGHT 0xF3 22#define KASAN_STACK_RIGHT 0xF3
23#define KASAN_STACK_PARTIAL 0xF4 23#define KASAN_STACK_PARTIAL 0xF4
24#define KASAN_USE_AFTER_SCOPE 0xF8
24 25
25/* Don't break randconfig/all*config builds */ 26/* Don't break randconfig/all*config builds */
26#ifndef KASAN_ABI_VERSION 27#ifndef KASAN_ABI_VERSION
@@ -53,6 +54,9 @@ struct kasan_global {
53#if KASAN_ABI_VERSION >= 4 54#if KASAN_ABI_VERSION >= 4
54 struct kasan_source_location *location; 55 struct kasan_source_location *location;
55#endif 56#endif
57#if KASAN_ABI_VERSION >= 5
58 char *odr_indicator;
59#endif
56}; 60};
57 61
58/** 62/**
diff --git a/mm/kasan/report.c b/mm/kasan/report.c
index 24c1211fe9d5..073325aedc68 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -90,6 +90,9 @@ static void print_error_description(struct kasan_access_info *info)
90 case KASAN_KMALLOC_FREE: 90 case KASAN_KMALLOC_FREE:
91 bug_type = "use-after-free"; 91 bug_type = "use-after-free";
92 break; 92 break;
93 case KASAN_USE_AFTER_SCOPE:
94 bug_type = "use-after-scope";
95 break;
93 } 96 }
94 97
95 pr_err("BUG: KASAN: %s in %pS at addr %p\n", 98 pr_err("BUG: KASAN: %s in %pS at addr %p\n",
diff --git a/mm/khugepaged.c b/mm/khugepaged.c
index 728d7790dc2d..87e1a7ca3846 100644
--- a/mm/khugepaged.c
+++ b/mm/khugepaged.c
@@ -103,6 +103,7 @@ static struct khugepaged_scan khugepaged_scan = {
103 .mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head), 103 .mm_head = LIST_HEAD_INIT(khugepaged_scan.mm_head),
104}; 104};
105 105
106#ifdef CONFIG_SYSFS
106static ssize_t scan_sleep_millisecs_show(struct kobject *kobj, 107static ssize_t scan_sleep_millisecs_show(struct kobject *kobj,
107 struct kobj_attribute *attr, 108 struct kobj_attribute *attr,
108 char *buf) 109 char *buf)
@@ -295,6 +296,7 @@ struct attribute_group khugepaged_attr_group = {
295 .attrs = khugepaged_attr, 296 .attrs = khugepaged_attr,
296 .name = "khugepaged", 297 .name = "khugepaged",
297}; 298};
299#endif /* CONFIG_SYSFS */
298 300
299#define VM_NO_KHUGEPAGED (VM_SPECIAL | VM_HUGETLB) 301#define VM_NO_KHUGEPAGED (VM_SPECIAL | VM_HUGETLB)
300 302
diff --git a/mm/kmemleak.c b/mm/kmemleak.c
index e5355a5b423f..d1380ed93fdf 100644
--- a/mm/kmemleak.c
+++ b/mm/kmemleak.c
@@ -1414,6 +1414,7 @@ static void kmemleak_scan(void)
1414 /* data/bss scanning */ 1414 /* data/bss scanning */
1415 scan_large_block(_sdata, _edata); 1415 scan_large_block(_sdata, _edata);
1416 scan_large_block(__bss_start, __bss_stop); 1416 scan_large_block(__bss_start, __bss_stop);
1417 scan_large_block(__start_data_ro_after_init, __end_data_ro_after_init);
1417 1418
1418#ifdef CONFIG_SMP 1419#ifdef CONFIG_SMP
1419 /* per-cpu sections scanning */ 1420 /* per-cpu sections scanning */
diff --git a/mm/memory-failure.c b/mm/memory-failure.c
index de88f33519c0..19e796d36a62 100644
--- a/mm/memory-failure.c
+++ b/mm/memory-failure.c
@@ -1112,10 +1112,10 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
1112 } 1112 }
1113 1113
1114 if (!PageHuge(p) && PageTransHuge(hpage)) { 1114 if (!PageHuge(p) && PageTransHuge(hpage)) {
1115 lock_page(hpage); 1115 lock_page(p);
1116 if (!PageAnon(hpage) || unlikely(split_huge_page(hpage))) { 1116 if (!PageAnon(p) || unlikely(split_huge_page(p))) {
1117 unlock_page(hpage); 1117 unlock_page(p);
1118 if (!PageAnon(hpage)) 1118 if (!PageAnon(p))
1119 pr_err("Memory failure: %#lx: non anonymous thp\n", 1119 pr_err("Memory failure: %#lx: non anonymous thp\n",
1120 pfn); 1120 pfn);
1121 else 1121 else
@@ -1126,9 +1126,7 @@ int memory_failure(unsigned long pfn, int trapno, int flags)
1126 put_hwpoison_page(p); 1126 put_hwpoison_page(p);
1127 return -EBUSY; 1127 return -EBUSY;
1128 } 1128 }
1129 unlock_page(hpage); 1129 unlock_page(p);
1130 get_hwpoison_page(p);
1131 put_hwpoison_page(hpage);
1132 VM_BUG_ON_PAGE(!page_count(p), p); 1130 VM_BUG_ON_PAGE(!page_count(p), p);
1133 hpage = compound_head(p); 1131 hpage = compound_head(p);
1134 } 1132 }
diff --git a/mm/mlock.c b/mm/mlock.c
index 145a4258ddbc..cdbed8aaa426 100644
--- a/mm/mlock.c
+++ b/mm/mlock.c
@@ -190,10 +190,13 @@ unsigned int munlock_vma_page(struct page *page)
190 */ 190 */
191 spin_lock_irq(zone_lru_lock(zone)); 191 spin_lock_irq(zone_lru_lock(zone));
192 192
193 nr_pages = hpage_nr_pages(page); 193 if (!TestClearPageMlocked(page)) {
194 if (!TestClearPageMlocked(page)) 194 /* Potentially, PTE-mapped THP: do not skip the rest PTEs */
195 nr_pages = 1;
195 goto unlock_out; 196 goto unlock_out;
197 }
196 198
199 nr_pages = hpage_nr_pages(page);
197 __mod_zone_page_state(zone, NR_MLOCK, -nr_pages); 200 __mod_zone_page_state(zone, NR_MLOCK, -nr_pages);
198 201
199 if (__munlock_isolate_lru_page(page, true)) { 202 if (__munlock_isolate_lru_page(page, true)) {
diff --git a/mm/mremap.c b/mm/mremap.c
index da22ad2a5678..30d7d2482eea 100644
--- a/mm/mremap.c
+++ b/mm/mremap.c
@@ -104,11 +104,13 @@ static pte_t move_soft_dirty_pte(pte_t pte)
104static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd, 104static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd,
105 unsigned long old_addr, unsigned long old_end, 105 unsigned long old_addr, unsigned long old_end,
106 struct vm_area_struct *new_vma, pmd_t *new_pmd, 106 struct vm_area_struct *new_vma, pmd_t *new_pmd,
107 unsigned long new_addr, bool need_rmap_locks) 107 unsigned long new_addr, bool need_rmap_locks, bool *need_flush)
108{ 108{
109 struct mm_struct *mm = vma->vm_mm; 109 struct mm_struct *mm = vma->vm_mm;
110 pte_t *old_pte, *new_pte, pte; 110 pte_t *old_pte, *new_pte, pte;
111 spinlock_t *old_ptl, *new_ptl; 111 spinlock_t *old_ptl, *new_ptl;
112 bool force_flush = false;
113 unsigned long len = old_end - old_addr;
112 114
113 /* 115 /*
114 * When need_rmap_locks is true, we take the i_mmap_rwsem and anon_vma 116 * When need_rmap_locks is true, we take the i_mmap_rwsem and anon_vma
@@ -146,7 +148,19 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd,
146 new_pte++, new_addr += PAGE_SIZE) { 148 new_pte++, new_addr += PAGE_SIZE) {
147 if (pte_none(*old_pte)) 149 if (pte_none(*old_pte))
148 continue; 150 continue;
151
149 pte = ptep_get_and_clear(mm, old_addr, old_pte); 152 pte = ptep_get_and_clear(mm, old_addr, old_pte);
153 /*
154 * If we are remapping a dirty PTE, make sure
155 * to flush TLB before we drop the PTL for the
156 * old PTE or we may race with page_mkclean().
157 *
158 * This check has to be done after we removed the
159 * old PTE from page tables or another thread may
160 * dirty it after the check and before the removal.
161 */
162 if (pte_present(pte) && pte_dirty(pte))
163 force_flush = true;
150 pte = move_pte(pte, new_vma->vm_page_prot, old_addr, new_addr); 164 pte = move_pte(pte, new_vma->vm_page_prot, old_addr, new_addr);
151 pte = move_soft_dirty_pte(pte); 165 pte = move_soft_dirty_pte(pte);
152 set_pte_at(mm, new_addr, new_pte, pte); 166 set_pte_at(mm, new_addr, new_pte, pte);
@@ -156,6 +170,10 @@ static void move_ptes(struct vm_area_struct *vma, pmd_t *old_pmd,
156 if (new_ptl != old_ptl) 170 if (new_ptl != old_ptl)
157 spin_unlock(new_ptl); 171 spin_unlock(new_ptl);
158 pte_unmap(new_pte - 1); 172 pte_unmap(new_pte - 1);
173 if (force_flush)
174 flush_tlb_range(vma, old_end - len, old_end);
175 else
176 *need_flush = true;
159 pte_unmap_unlock(old_pte - 1, old_ptl); 177 pte_unmap_unlock(old_pte - 1, old_ptl);
160 if (need_rmap_locks) 178 if (need_rmap_locks)
161 drop_rmap_locks(vma); 179 drop_rmap_locks(vma);
@@ -201,13 +219,12 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
201 if (need_rmap_locks) 219 if (need_rmap_locks)
202 take_rmap_locks(vma); 220 take_rmap_locks(vma);
203 moved = move_huge_pmd(vma, old_addr, new_addr, 221 moved = move_huge_pmd(vma, old_addr, new_addr,
204 old_end, old_pmd, new_pmd); 222 old_end, old_pmd, new_pmd,
223 &need_flush);
205 if (need_rmap_locks) 224 if (need_rmap_locks)
206 drop_rmap_locks(vma); 225 drop_rmap_locks(vma);
207 if (moved) { 226 if (moved)
208 need_flush = true;
209 continue; 227 continue;
210 }
211 } 228 }
212 split_huge_pmd(vma, old_pmd, old_addr); 229 split_huge_pmd(vma, old_pmd, old_addr);
213 if (pmd_trans_unstable(old_pmd)) 230 if (pmd_trans_unstable(old_pmd))
@@ -220,11 +237,10 @@ unsigned long move_page_tables(struct vm_area_struct *vma,
220 extent = next - new_addr; 237 extent = next - new_addr;
221 if (extent > LATENCY_LIMIT) 238 if (extent > LATENCY_LIMIT)
222 extent = LATENCY_LIMIT; 239 extent = LATENCY_LIMIT;
223 move_ptes(vma, old_pmd, old_addr, old_addr + extent, 240 move_ptes(vma, old_pmd, old_addr, old_addr + extent, new_vma,
224 new_vma, new_pmd, new_addr, need_rmap_locks); 241 new_pmd, new_addr, need_rmap_locks, &need_flush);
225 need_flush = true;
226 } 242 }
227 if (likely(need_flush)) 243 if (need_flush)
228 flush_tlb_range(vma, old_end-len, old_addr); 244 flush_tlb_range(vma, old_end-len, old_addr);
229 245
230 mmu_notifier_invalidate_range_end(vma->vm_mm, mmun_start, mmun_end); 246 mmu_notifier_invalidate_range_end(vma->vm_mm, mmun_start, mmun_end);
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index 072d791dce2d..6de9440e3ae2 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -3658,7 +3658,7 @@ retry:
3658 /* Make sure we know about allocations which stall for too long */ 3658 /* Make sure we know about allocations which stall for too long */
3659 if (time_after(jiffies, alloc_start + stall_timeout)) { 3659 if (time_after(jiffies, alloc_start + stall_timeout)) {
3660 warn_alloc(gfp_mask, 3660 warn_alloc(gfp_mask,
3661 "page alloction stalls for %ums, order:%u\n", 3661 "page allocation stalls for %ums, order:%u",
3662 jiffies_to_msecs(jiffies-alloc_start), order); 3662 jiffies_to_msecs(jiffies-alloc_start), order);
3663 stall_timeout += 10 * HZ; 3663 stall_timeout += 10 * HZ;
3664 } 3664 }
diff --git a/mm/shmem.c b/mm/shmem.c
index ad7813d73ea7..9d32e1cb9f38 100644
--- a/mm/shmem.c
+++ b/mm/shmem.c
@@ -1483,6 +1483,8 @@ static int shmem_replace_page(struct page **pagep, gfp_t gfp,
1483 copy_highpage(newpage, oldpage); 1483 copy_highpage(newpage, oldpage);
1484 flush_dcache_page(newpage); 1484 flush_dcache_page(newpage);
1485 1485
1486 __SetPageLocked(newpage);
1487 __SetPageSwapBacked(newpage);
1486 SetPageUptodate(newpage); 1488 SetPageUptodate(newpage);
1487 set_page_private(newpage, swap_index); 1489 set_page_private(newpage, swap_index);
1488 SetPageSwapCache(newpage); 1490 SetPageSwapCache(newpage);
@@ -1846,6 +1848,18 @@ unlock:
1846 return error; 1848 return error;
1847} 1849}
1848 1850
1851/*
1852 * This is like autoremove_wake_function, but it removes the wait queue
1853 * entry unconditionally - even if something else had already woken the
1854 * target.
1855 */
1856static int synchronous_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
1857{
1858 int ret = default_wake_function(wait, mode, sync, key);
1859 list_del_init(&wait->task_list);
1860 return ret;
1861}
1862
1849static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) 1863static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1850{ 1864{
1851 struct inode *inode = file_inode(vma->vm_file); 1865 struct inode *inode = file_inode(vma->vm_file);
@@ -1881,7 +1895,7 @@ static int shmem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
1881 vmf->pgoff >= shmem_falloc->start && 1895 vmf->pgoff >= shmem_falloc->start &&
1882 vmf->pgoff < shmem_falloc->next) { 1896 vmf->pgoff < shmem_falloc->next) {
1883 wait_queue_head_t *shmem_falloc_waitq; 1897 wait_queue_head_t *shmem_falloc_waitq;
1884 DEFINE_WAIT(shmem_fault_wait); 1898 DEFINE_WAIT_FUNC(shmem_fault_wait, synchronous_wake_function);
1885 1899
1886 ret = VM_FAULT_NOPAGE; 1900 ret = VM_FAULT_NOPAGE;
1887 if ((vmf->flags & FAULT_FLAG_ALLOW_RETRY) && 1901 if ((vmf->flags & FAULT_FLAG_ALLOW_RETRY) &&
@@ -2663,6 +2677,7 @@ static long shmem_fallocate(struct file *file, int mode, loff_t offset,
2663 spin_lock(&inode->i_lock); 2677 spin_lock(&inode->i_lock);
2664 inode->i_private = NULL; 2678 inode->i_private = NULL;
2665 wake_up_all(&shmem_falloc_waitq); 2679 wake_up_all(&shmem_falloc_waitq);
2680 WARN_ON_ONCE(!list_empty(&shmem_falloc_waitq.task_list));
2666 spin_unlock(&inode->i_lock); 2681 spin_unlock(&inode->i_lock);
2667 error = 0; 2682 error = 0;
2668 goto out; 2683 goto out;
diff --git a/mm/slab_common.c b/mm/slab_common.c
index 71f0b28a1bec..329b03843863 100644
--- a/mm/slab_common.c
+++ b/mm/slab_common.c
@@ -533,8 +533,8 @@ void memcg_create_kmem_cache(struct mem_cgroup *memcg,
533 533
534 s = create_cache(cache_name, root_cache->object_size, 534 s = create_cache(cache_name, root_cache->object_size,
535 root_cache->size, root_cache->align, 535 root_cache->size, root_cache->align,
536 root_cache->flags, root_cache->ctor, 536 root_cache->flags & CACHE_CREATE_MASK,
537 memcg, root_cache); 537 root_cache->ctor, memcg, root_cache);
538 /* 538 /*
539 * If we could not create a memcg cache, do not complain, because 539 * If we could not create a memcg cache, do not complain, because
540 * that's not critical at all as we can always proceed with the root 540 * that's not critical at all as we can always proceed with the root
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 2210de290b54..f30438970cd1 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -2224,6 +2224,8 @@ static unsigned long read_swap_header(struct swap_info_struct *p,
2224 swab32s(&swap_header->info.version); 2224 swab32s(&swap_header->info.version);
2225 swab32s(&swap_header->info.last_page); 2225 swab32s(&swap_header->info.last_page);
2226 swab32s(&swap_header->info.nr_badpages); 2226 swab32s(&swap_header->info.nr_badpages);
2227 if (swap_header->info.nr_badpages > MAX_SWAP_BADPAGES)
2228 return 0;
2227 for (i = 0; i < swap_header->info.nr_badpages; i++) 2229 for (i = 0; i < swap_header->info.nr_badpages; i++)
2228 swab32s(&swap_header->info.badpages[i]); 2230 swab32s(&swap_header->info.badpages[i]);
2229 } 2231 }
diff --git a/mm/truncate.c b/mm/truncate.c
index a01cce450a26..8d8c62d89e6d 100644
--- a/mm/truncate.c
+++ b/mm/truncate.c
@@ -283,7 +283,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
283 283
284 if (!trylock_page(page)) 284 if (!trylock_page(page))
285 continue; 285 continue;
286 WARN_ON(page_to_pgoff(page) != index); 286 WARN_ON(page_to_index(page) != index);
287 if (PageWriteback(page)) { 287 if (PageWriteback(page)) {
288 unlock_page(page); 288 unlock_page(page);
289 continue; 289 continue;
@@ -371,7 +371,7 @@ void truncate_inode_pages_range(struct address_space *mapping,
371 } 371 }
372 372
373 lock_page(page); 373 lock_page(page);
374 WARN_ON(page_to_pgoff(page) != index); 374 WARN_ON(page_to_index(page) != index);
375 wait_on_page_writeback(page); 375 wait_on_page_writeback(page);
376 truncate_inode_page(mapping, page); 376 truncate_inode_page(mapping, page);
377 unlock_page(page); 377 unlock_page(page);
@@ -492,7 +492,7 @@ unsigned long invalidate_mapping_pages(struct address_space *mapping,
492 if (!trylock_page(page)) 492 if (!trylock_page(page))
493 continue; 493 continue;
494 494
495 WARN_ON(page_to_pgoff(page) != index); 495 WARN_ON(page_to_index(page) != index);
496 496
497 /* Middle of THP: skip */ 497 /* Middle of THP: skip */
498 if (PageTransTail(page)) { 498 if (PageTransTail(page)) {
@@ -612,7 +612,7 @@ int invalidate_inode_pages2_range(struct address_space *mapping,
612 } 612 }
613 613
614 lock_page(page); 614 lock_page(page);
615 WARN_ON(page_to_pgoff(page) != index); 615 WARN_ON(page_to_index(page) != index);
616 if (page->mapping != mapping) { 616 if (page->mapping != mapping) {
617 unlock_page(page); 617 unlock_page(page);
618 continue; 618 continue;
diff --git a/mm/vmscan.c b/mm/vmscan.c
index 76fda2268148..d75cdf360730 100644
--- a/mm/vmscan.c
+++ b/mm/vmscan.c
@@ -2354,6 +2354,8 @@ static void shrink_node_memcg(struct pglist_data *pgdat, struct mem_cgroup *memc
2354 } 2354 }
2355 } 2355 }
2356 2356
2357 cond_resched();
2358
2357 if (nr_reclaimed < nr_to_reclaim || scan_adjusted) 2359 if (nr_reclaimed < nr_to_reclaim || scan_adjusted)
2358 continue; 2360 continue;
2359 2361
diff --git a/mm/workingset.c b/mm/workingset.c
index 617475f529f4..fb1f9183d89a 100644
--- a/mm/workingset.c
+++ b/mm/workingset.c
@@ -348,7 +348,7 @@ static unsigned long count_shadow_nodes(struct shrinker *shrinker,
348 shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc); 348 shadow_nodes = list_lru_shrink_count(&workingset_shadow_nodes, sc);
349 local_irq_enable(); 349 local_irq_enable();
350 350
351 if (memcg_kmem_enabled()) { 351 if (sc->memcg) {
352 pages = mem_cgroup_node_nr_lru_pages(sc->memcg, sc->nid, 352 pages = mem_cgroup_node_nr_lru_pages(sc->memcg, sc->nid,
353 LRU_ALL_FILE); 353 LRU_ALL_FILE);
354 } else { 354 } else {
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index e034afbd1bb0..08ce36147c4c 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -652,6 +652,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,
652 batadv_softif_destroy_sysfs(hard_iface->soft_iface); 652 batadv_softif_destroy_sysfs(hard_iface->soft_iface);
653 } 653 }
654 654
655 hard_iface->soft_iface = NULL;
655 batadv_hardif_put(hard_iface); 656 batadv_hardif_put(hard_iface);
656 657
657out: 658out:
diff --git a/net/batman-adv/tp_meter.c b/net/batman-adv/tp_meter.c
index 2333777f919d..8af1611b8ab2 100644
--- a/net/batman-adv/tp_meter.c
+++ b/net/batman-adv/tp_meter.c
@@ -837,6 +837,7 @@ static int batadv_tp_send(void *arg)
837 primary_if = batadv_primary_if_get_selected(bat_priv); 837 primary_if = batadv_primary_if_get_selected(bat_priv);
838 if (unlikely(!primary_if)) { 838 if (unlikely(!primary_if)) {
839 err = BATADV_TP_REASON_DST_UNREACHABLE; 839 err = BATADV_TP_REASON_DST_UNREACHABLE;
840 tp_vars->reason = err;
840 goto out; 841 goto out;
841 } 842 }
842 843
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c
index 7f663092f6de..0dc85eb1cb7a 100644
--- a/net/batman-adv/translation-table.c
+++ b/net/batman-adv/translation-table.c
@@ -3282,7 +3282,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
3282 &tvlv_tt_data, 3282 &tvlv_tt_data,
3283 &tt_change, 3283 &tt_change,
3284 &tt_len); 3284 &tt_len);
3285 if (!tt_len) 3285 if (!tt_len || !tvlv_len)
3286 goto unlock; 3286 goto unlock;
3287 3287
3288 /* Copy the last orig_node's OGM buffer */ 3288 /* Copy the last orig_node's OGM buffer */
@@ -3300,7 +3300,7 @@ static bool batadv_send_my_tt_response(struct batadv_priv *bat_priv,
3300 &tvlv_tt_data, 3300 &tvlv_tt_data,
3301 &tt_change, 3301 &tt_change,
3302 &tt_len); 3302 &tt_len);
3303 if (!tt_len) 3303 if (!tt_len || !tvlv_len)
3304 goto out; 3304 goto out;
3305 3305
3306 /* fill the rest of the tvlv with the real TT entries */ 3306 /* fill the rest of the tvlv with the real TT entries */
diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index d020299baba4..1904a93f47d5 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -1090,7 +1090,6 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type,
1090{ 1090{
1091 struct hci_conn *hcon; 1091 struct hci_conn *hcon;
1092 struct hci_dev *hdev; 1092 struct hci_dev *hdev;
1093 bdaddr_t *src = BDADDR_ANY;
1094 int n; 1093 int n;
1095 1094
1096 n = sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu", 1095 n = sscanf(buf, "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx %hhu",
@@ -1101,7 +1100,8 @@ static int get_l2cap_conn(char *buf, bdaddr_t *addr, u8 *addr_type,
1101 if (n < 7) 1100 if (n < 7)
1102 return -EINVAL; 1101 return -EINVAL;
1103 1102
1104 hdev = hci_get_route(addr, src); 1103 /* The LE_PUBLIC address type is ignored because of BDADDR_ANY */
1104 hdev = hci_get_route(addr, BDADDR_ANY, BDADDR_LE_PUBLIC);
1105 if (!hdev) 1105 if (!hdev)
1106 return -ENOENT; 1106 return -ENOENT;
1107 1107
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index 3809617aa98d..dc59eae54717 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -613,7 +613,7 @@ int hci_conn_del(struct hci_conn *conn)
613 return 0; 613 return 0;
614} 614}
615 615
616struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src) 616struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, uint8_t src_type)
617{ 617{
618 int use_src = bacmp(src, BDADDR_ANY); 618 int use_src = bacmp(src, BDADDR_ANY);
619 struct hci_dev *hdev = NULL, *d; 619 struct hci_dev *hdev = NULL, *d;
@@ -634,7 +634,29 @@ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
634 */ 634 */
635 635
636 if (use_src) { 636 if (use_src) {
637 if (!bacmp(&d->bdaddr, src)) { 637 bdaddr_t id_addr;
638 u8 id_addr_type;
639
640 if (src_type == BDADDR_BREDR) {
641 if (!lmp_bredr_capable(d))
642 continue;
643 bacpy(&id_addr, &d->bdaddr);
644 id_addr_type = BDADDR_BREDR;
645 } else {
646 if (!lmp_le_capable(d))
647 continue;
648
649 hci_copy_identity_address(d, &id_addr,
650 &id_addr_type);
651
652 /* Convert from HCI to three-value type */
653 if (id_addr_type == ADDR_LE_DEV_PUBLIC)
654 id_addr_type = BDADDR_LE_PUBLIC;
655 else
656 id_addr_type = BDADDR_LE_RANDOM;
657 }
658
659 if (!bacmp(&id_addr, src) && id_addr_type == src_type) {
638 hdev = d; break; 660 hdev = d; break;
639 } 661 }
640 } else { 662 } else {
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index d4cad29b033f..577f1c01454a 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -7060,7 +7060,7 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7060 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst, 7060 BT_DBG("%pMR -> %pMR (type %u) psm 0x%2.2x", &chan->src, dst,
7061 dst_type, __le16_to_cpu(psm)); 7061 dst_type, __le16_to_cpu(psm));
7062 7062
7063 hdev = hci_get_route(dst, &chan->src); 7063 hdev = hci_get_route(dst, &chan->src, chan->src_type);
7064 if (!hdev) 7064 if (!hdev)
7065 return -EHOSTUNREACH; 7065 return -EHOSTUNREACH;
7066 7066
diff --git a/net/bluetooth/rfcomm/tty.c b/net/bluetooth/rfcomm/tty.c
index 8e385a0ae60e..2f2cb5e27cdd 100644
--- a/net/bluetooth/rfcomm/tty.c
+++ b/net/bluetooth/rfcomm/tty.c
@@ -178,7 +178,7 @@ static void rfcomm_reparent_device(struct rfcomm_dev *dev)
178 struct hci_dev *hdev; 178 struct hci_dev *hdev;
179 struct hci_conn *conn; 179 struct hci_conn *conn;
180 180
181 hdev = hci_get_route(&dev->dst, &dev->src); 181 hdev = hci_get_route(&dev->dst, &dev->src, BDADDR_BREDR);
182 if (!hdev) 182 if (!hdev)
183 return; 183 return;
184 184
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index f52bcbf2e58c..3125ce670c2f 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -219,7 +219,7 @@ static int sco_connect(struct sock *sk)
219 219
220 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst); 220 BT_DBG("%pMR -> %pMR", &sco_pi(sk)->src, &sco_pi(sk)->dst);
221 221
222 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src); 222 hdev = hci_get_route(&sco_pi(sk)->dst, &sco_pi(sk)->src, BDADDR_BREDR);
223 if (!hdev) 223 if (!hdev)
224 return -EHOSTUNREACH; 224 return -EHOSTUNREACH;
225 225
diff --git a/net/bridge/br_sysfs_br.c b/net/bridge/br_sysfs_br.c
index e120307c6e36..f88c4df3f91e 100644
--- a/net/bridge/br_sysfs_br.c
+++ b/net/bridge/br_sysfs_br.c
@@ -898,6 +898,7 @@ int br_sysfs_addbr(struct net_device *dev)
898 if (!br->ifobj) { 898 if (!br->ifobj) {
899 pr_info("%s: can't add kobject (directory) %s/%s\n", 899 pr_info("%s: can't add kobject (directory) %s/%s\n",
900 __func__, dev->name, SYSFS_BRIDGE_PORT_SUBDIR); 900 __func__, dev->name, SYSFS_BRIDGE_PORT_SUBDIR);
901 err = -ENOMEM;
901 goto out3; 902 goto out3;
902 } 903 }
903 return 0; 904 return 0;
diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
index aa209b1066c9..92cbbd2afddb 100644
--- a/net/caif/caif_socket.c
+++ b/net/caif/caif_socket.c
@@ -1107,10 +1107,7 @@ static struct net_proto_family caif_family_ops = {
1107 1107
1108static int __init caif_sktinit_module(void) 1108static int __init caif_sktinit_module(void)
1109{ 1109{
1110 int err = sock_register(&caif_family_ops); 1110 return sock_register(&caif_family_ops);
1111 if (!err)
1112 return err;
1113 return 0;
1114} 1111}
1115 1112
1116static void __exit caif_sktexit_module(void) 1113static void __exit caif_sktexit_module(void)
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 8e999ffdf28b..436a7537e6a9 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -77,7 +77,7 @@
77 (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \ 77 (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \
78 (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG)) 78 (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG))
79 79
80#define CAN_BCM_VERSION "20160617" 80#define CAN_BCM_VERSION "20161123"
81 81
82MODULE_DESCRIPTION("PF_CAN broadcast manager protocol"); 82MODULE_DESCRIPTION("PF_CAN broadcast manager protocol");
83MODULE_LICENSE("Dual BSD/GPL"); 83MODULE_LICENSE("Dual BSD/GPL");
@@ -109,8 +109,9 @@ struct bcm_op {
109 u32 count; 109 u32 count;
110 u32 nframes; 110 u32 nframes;
111 u32 currframe; 111 u32 currframe;
112 struct canfd_frame *frames; 112 /* void pointers to arrays of struct can[fd]_frame */
113 struct canfd_frame *last_frames; 113 void *frames;
114 void *last_frames;
114 struct canfd_frame sframe; 115 struct canfd_frame sframe;
115 struct canfd_frame last_sframe; 116 struct canfd_frame last_sframe;
116 struct sock *sk; 117 struct sock *sk;
@@ -681,7 +682,7 @@ static void bcm_rx_handler(struct sk_buff *skb, void *data)
681 682
682 if (op->flags & RX_FILTER_ID) { 683 if (op->flags & RX_FILTER_ID) {
683 /* the easiest case */ 684 /* the easiest case */
684 bcm_rx_update_and_send(op, &op->last_frames[0], rxframe); 685 bcm_rx_update_and_send(op, op->last_frames, rxframe);
685 goto rx_starttimer; 686 goto rx_starttimer;
686 } 687 }
687 688
@@ -1068,7 +1069,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
1068 1069
1069 if (msg_head->nframes) { 1070 if (msg_head->nframes) {
1070 /* update CAN frames content */ 1071 /* update CAN frames content */
1071 err = memcpy_from_msg((u8 *)op->frames, msg, 1072 err = memcpy_from_msg(op->frames, msg,
1072 msg_head->nframes * op->cfsiz); 1073 msg_head->nframes * op->cfsiz);
1073 if (err < 0) 1074 if (err < 0)
1074 return err; 1075 return err;
@@ -1118,7 +1119,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
1118 } 1119 }
1119 1120
1120 if (msg_head->nframes) { 1121 if (msg_head->nframes) {
1121 err = memcpy_from_msg((u8 *)op->frames, msg, 1122 err = memcpy_from_msg(op->frames, msg,
1122 msg_head->nframes * op->cfsiz); 1123 msg_head->nframes * op->cfsiz);
1123 if (err < 0) { 1124 if (err < 0) {
1124 if (op->frames != &op->sframe) 1125 if (op->frames != &op->sframe)
@@ -1163,6 +1164,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
1163 /* check flags */ 1164 /* check flags */
1164 1165
1165 if (op->flags & RX_RTR_FRAME) { 1166 if (op->flags & RX_RTR_FRAME) {
1167 struct canfd_frame *frame0 = op->frames;
1166 1168
1167 /* no timers in RTR-mode */ 1169 /* no timers in RTR-mode */
1168 hrtimer_cancel(&op->thrtimer); 1170 hrtimer_cancel(&op->thrtimer);
@@ -1174,8 +1176,8 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
1174 * prevent a full-load-loopback-test ... ;-] 1176 * prevent a full-load-loopback-test ... ;-]
1175 */ 1177 */
1176 if ((op->flags & TX_CP_CAN_ID) || 1178 if ((op->flags & TX_CP_CAN_ID) ||
1177 (op->frames[0].can_id == op->can_id)) 1179 (frame0->can_id == op->can_id))
1178 op->frames[0].can_id = op->can_id & ~CAN_RTR_FLAG; 1180 frame0->can_id = op->can_id & ~CAN_RTR_FLAG;
1179 1181
1180 } else { 1182 } else {
1181 if (op->flags & SETTIMER) { 1183 if (op->flags & SETTIMER) {
@@ -1549,24 +1551,31 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
1549 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr; 1551 struct sockaddr_can *addr = (struct sockaddr_can *)uaddr;
1550 struct sock *sk = sock->sk; 1552 struct sock *sk = sock->sk;
1551 struct bcm_sock *bo = bcm_sk(sk); 1553 struct bcm_sock *bo = bcm_sk(sk);
1554 int ret = 0;
1552 1555
1553 if (len < sizeof(*addr)) 1556 if (len < sizeof(*addr))
1554 return -EINVAL; 1557 return -EINVAL;
1555 1558
1556 if (bo->bound) 1559 lock_sock(sk);
1557 return -EISCONN; 1560
1561 if (bo->bound) {
1562 ret = -EISCONN;
1563 goto fail;
1564 }
1558 1565
1559 /* bind a device to this socket */ 1566 /* bind a device to this socket */
1560 if (addr->can_ifindex) { 1567 if (addr->can_ifindex) {
1561 struct net_device *dev; 1568 struct net_device *dev;
1562 1569
1563 dev = dev_get_by_index(&init_net, addr->can_ifindex); 1570 dev = dev_get_by_index(&init_net, addr->can_ifindex);
1564 if (!dev) 1571 if (!dev) {
1565 return -ENODEV; 1572 ret = -ENODEV;
1566 1573 goto fail;
1574 }
1567 if (dev->type != ARPHRD_CAN) { 1575 if (dev->type != ARPHRD_CAN) {
1568 dev_put(dev); 1576 dev_put(dev);
1569 return -ENODEV; 1577 ret = -ENODEV;
1578 goto fail;
1570 } 1579 }
1571 1580
1572 bo->ifindex = dev->ifindex; 1581 bo->ifindex = dev->ifindex;
@@ -1577,17 +1586,24 @@ static int bcm_connect(struct socket *sock, struct sockaddr *uaddr, int len,
1577 bo->ifindex = 0; 1586 bo->ifindex = 0;
1578 } 1587 }
1579 1588
1580 bo->bound = 1;
1581
1582 if (proc_dir) { 1589 if (proc_dir) {
1583 /* unique socket address as filename */ 1590 /* unique socket address as filename */
1584 sprintf(bo->procname, "%lu", sock_i_ino(sk)); 1591 sprintf(bo->procname, "%lu", sock_i_ino(sk));
1585 bo->bcm_proc_read = proc_create_data(bo->procname, 0644, 1592 bo->bcm_proc_read = proc_create_data(bo->procname, 0644,
1586 proc_dir, 1593 proc_dir,
1587 &bcm_proc_fops, sk); 1594 &bcm_proc_fops, sk);
1595 if (!bo->bcm_proc_read) {
1596 ret = -ENOMEM;
1597 goto fail;
1598 }
1588 } 1599 }
1589 1600
1590 return 0; 1601 bo->bound = 1;
1602
1603fail:
1604 release_sock(sk);
1605
1606 return ret;
1591} 1607}
1592 1608
1593static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size, 1609static int bcm_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
diff --git a/net/can/raw.c b/net/can/raw.c
index 972c187d40ab..b075f028d7e2 100644
--- a/net/can/raw.c
+++ b/net/can/raw.c
@@ -499,6 +499,9 @@ static int raw_setsockopt(struct socket *sock, int level, int optname,
499 if (optlen % sizeof(struct can_filter) != 0) 499 if (optlen % sizeof(struct can_filter) != 0)
500 return -EINVAL; 500 return -EINVAL;
501 501
502 if (optlen > CAN_RAW_FILTER_MAX * sizeof(struct can_filter))
503 return -EINVAL;
504
502 count = optlen / sizeof(struct can_filter); 505 count = optlen / sizeof(struct can_filter);
503 506
504 if (count > 1) { 507 if (count > 1) {
diff --git a/net/ceph/ceph_fs.c b/net/ceph/ceph_fs.c
index 7d54e944de5e..dcbe67ff3e2b 100644
--- a/net/ceph/ceph_fs.c
+++ b/net/ceph/ceph_fs.c
@@ -34,7 +34,8 @@ void ceph_file_layout_from_legacy(struct ceph_file_layout *fl,
34 fl->stripe_count = le32_to_cpu(legacy->fl_stripe_count); 34 fl->stripe_count = le32_to_cpu(legacy->fl_stripe_count);
35 fl->object_size = le32_to_cpu(legacy->fl_object_size); 35 fl->object_size = le32_to_cpu(legacy->fl_object_size);
36 fl->pool_id = le32_to_cpu(legacy->fl_pg_pool); 36 fl->pool_id = le32_to_cpu(legacy->fl_pg_pool);
37 if (fl->pool_id == 0) 37 if (fl->pool_id == 0 && fl->stripe_unit == 0 &&
38 fl->stripe_count == 0 && fl->object_size == 0)
38 fl->pool_id = -1; 39 fl->pool_id = -1;
39} 40}
40EXPORT_SYMBOL(ceph_file_layout_from_legacy); 41EXPORT_SYMBOL(ceph_file_layout_from_legacy);
diff --git a/net/ceph/osd_client.c b/net/ceph/osd_client.c
index d9bf7a1d0a58..e6ae15bc41b7 100644
--- a/net/ceph/osd_client.c
+++ b/net/ceph/osd_client.c
@@ -4094,6 +4094,7 @@ int ceph_osdc_init(struct ceph_osd_client *osdc, struct ceph_client *client)
4094 osd_init(&osdc->homeless_osd); 4094 osd_init(&osdc->homeless_osd);
4095 osdc->homeless_osd.o_osdc = osdc; 4095 osdc->homeless_osd.o_osdc = osdc;
4096 osdc->homeless_osd.o_osd = CEPH_HOMELESS_OSD; 4096 osdc->homeless_osd.o_osd = CEPH_HOMELESS_OSD;
4097 osdc->last_linger_id = CEPH_LINGER_ID_START;
4097 osdc->linger_requests = RB_ROOT; 4098 osdc->linger_requests = RB_ROOT;
4098 osdc->map_checks = RB_ROOT; 4099 osdc->map_checks = RB_ROOT;
4099 osdc->linger_map_checks = RB_ROOT; 4100 osdc->linger_map_checks = RB_ROOT;
diff --git a/net/core/dev.c b/net/core/dev.c
index 820bac239738..6666b28b6815 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -1766,19 +1766,14 @@ EXPORT_SYMBOL_GPL(is_skb_forwardable);
1766 1766
1767int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb) 1767int __dev_forward_skb(struct net_device *dev, struct sk_buff *skb)
1768{ 1768{
1769 if (skb_orphan_frags(skb, GFP_ATOMIC) || 1769 int ret = ____dev_forward_skb(dev, skb);
1770 unlikely(!is_skb_forwardable(dev, skb))) {
1771 atomic_long_inc(&dev->rx_dropped);
1772 kfree_skb(skb);
1773 return NET_RX_DROP;
1774 }
1775 1770
1776 skb_scrub_packet(skb, true); 1771 if (likely(!ret)) {
1777 skb->priority = 0; 1772 skb->protocol = eth_type_trans(skb, dev);
1778 skb->protocol = eth_type_trans(skb, dev); 1773 skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
1779 skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); 1774 }
1780 1775
1781 return 0; 1776 return ret;
1782} 1777}
1783EXPORT_SYMBOL_GPL(__dev_forward_skb); 1778EXPORT_SYMBOL_GPL(__dev_forward_skb);
1784 1779
@@ -2484,7 +2479,7 @@ int skb_checksum_help(struct sk_buff *skb)
2484 goto out; 2479 goto out;
2485 } 2480 }
2486 2481
2487 *(__sum16 *)(skb->data + offset) = csum_fold(csum); 2482 *(__sum16 *)(skb->data + offset) = csum_fold(csum) ?: CSUM_MANGLED_0;
2488out_set_summed: 2483out_set_summed:
2489 skb->ip_summed = CHECKSUM_NONE; 2484 skb->ip_summed = CHECKSUM_NONE;
2490out: 2485out:
diff --git a/net/core/ethtool.c b/net/core/ethtool.c
index 977489820eb9..047a1752ece1 100644
--- a/net/core/ethtool.c
+++ b/net/core/ethtool.c
@@ -2479,6 +2479,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
2479 case ETHTOOL_GET_TS_INFO: 2479 case ETHTOOL_GET_TS_INFO:
2480 case ETHTOOL_GEEE: 2480 case ETHTOOL_GEEE:
2481 case ETHTOOL_GTUNABLE: 2481 case ETHTOOL_GTUNABLE:
2482 case ETHTOOL_GLINKSETTINGS:
2482 break; 2483 break;
2483 default: 2484 default:
2484 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 2485 if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
diff --git a/net/core/filter.c b/net/core/filter.c
index 00351cdf7d0c..b391209838ef 100644
--- a/net/core/filter.c
+++ b/net/core/filter.c
@@ -1628,6 +1628,19 @@ static inline int __bpf_rx_skb(struct net_device *dev, struct sk_buff *skb)
1628 return dev_forward_skb(dev, skb); 1628 return dev_forward_skb(dev, skb);
1629} 1629}
1630 1630
1631static inline int __bpf_rx_skb_no_mac(struct net_device *dev,
1632 struct sk_buff *skb)
1633{
1634 int ret = ____dev_forward_skb(dev, skb);
1635
1636 if (likely(!ret)) {
1637 skb->dev = dev;
1638 ret = netif_rx(skb);
1639 }
1640
1641 return ret;
1642}
1643
1631static inline int __bpf_tx_skb(struct net_device *dev, struct sk_buff *skb) 1644static inline int __bpf_tx_skb(struct net_device *dev, struct sk_buff *skb)
1632{ 1645{
1633 int ret; 1646 int ret;
@@ -1647,6 +1660,51 @@ static inline int __bpf_tx_skb(struct net_device *dev, struct sk_buff *skb)
1647 return ret; 1660 return ret;
1648} 1661}
1649 1662
1663static int __bpf_redirect_no_mac(struct sk_buff *skb, struct net_device *dev,
1664 u32 flags)
1665{
1666 /* skb->mac_len is not set on normal egress */
1667 unsigned int mlen = skb->network_header - skb->mac_header;
1668
1669 __skb_pull(skb, mlen);
1670
1671 /* At ingress, the mac header has already been pulled once.
1672 * At egress, skb_pospull_rcsum has to be done in case that
1673 * the skb is originated from ingress (i.e. a forwarded skb)
1674 * to ensure that rcsum starts at net header.
1675 */
1676 if (!skb_at_tc_ingress(skb))
1677 skb_postpull_rcsum(skb, skb_mac_header(skb), mlen);
1678 skb_pop_mac_header(skb);
1679 skb_reset_mac_len(skb);
1680 return flags & BPF_F_INGRESS ?
1681 __bpf_rx_skb_no_mac(dev, skb) : __bpf_tx_skb(dev, skb);
1682}
1683
1684static int __bpf_redirect_common(struct sk_buff *skb, struct net_device *dev,
1685 u32 flags)
1686{
1687 bpf_push_mac_rcsum(skb);
1688 return flags & BPF_F_INGRESS ?
1689 __bpf_rx_skb(dev, skb) : __bpf_tx_skb(dev, skb);
1690}
1691
1692static int __bpf_redirect(struct sk_buff *skb, struct net_device *dev,
1693 u32 flags)
1694{
1695 switch (dev->type) {
1696 case ARPHRD_TUNNEL:
1697 case ARPHRD_TUNNEL6:
1698 case ARPHRD_SIT:
1699 case ARPHRD_IPGRE:
1700 case ARPHRD_VOID:
1701 case ARPHRD_NONE:
1702 return __bpf_redirect_no_mac(skb, dev, flags);
1703 default:
1704 return __bpf_redirect_common(skb, dev, flags);
1705 }
1706}
1707
1650BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags) 1708BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags)
1651{ 1709{
1652 struct net_device *dev; 1710 struct net_device *dev;
@@ -1675,10 +1733,7 @@ BPF_CALL_3(bpf_clone_redirect, struct sk_buff *, skb, u32, ifindex, u64, flags)
1675 return -ENOMEM; 1733 return -ENOMEM;
1676 } 1734 }
1677 1735
1678 bpf_push_mac_rcsum(clone); 1736 return __bpf_redirect(clone, dev, flags);
1679
1680 return flags & BPF_F_INGRESS ?
1681 __bpf_rx_skb(dev, clone) : __bpf_tx_skb(dev, clone);
1682} 1737}
1683 1738
1684static const struct bpf_func_proto bpf_clone_redirect_proto = { 1739static const struct bpf_func_proto bpf_clone_redirect_proto = {
@@ -1722,10 +1777,7 @@ int skb_do_redirect(struct sk_buff *skb)
1722 return -EINVAL; 1777 return -EINVAL;
1723 } 1778 }
1724 1779
1725 bpf_push_mac_rcsum(skb); 1780 return __bpf_redirect(skb, dev, ri->flags);
1726
1727 return ri->flags & BPF_F_INGRESS ?
1728 __bpf_rx_skb(dev, skb) : __bpf_tx_skb(dev, skb);
1729} 1781}
1730 1782
1731static const struct bpf_func_proto bpf_redirect_proto = { 1783static const struct bpf_func_proto bpf_redirect_proto = {
diff --git a/net/core/flow.c b/net/core/flow.c
index 3937b1b68d5b..18e8893d4be5 100644
--- a/net/core/flow.c
+++ b/net/core/flow.c
@@ -95,7 +95,6 @@ static void flow_cache_gc_task(struct work_struct *work)
95 list_for_each_entry_safe(fce, n, &gc_list, u.gc_list) { 95 list_for_each_entry_safe(fce, n, &gc_list, u.gc_list) {
96 flow_entry_kill(fce, xfrm); 96 flow_entry_kill(fce, xfrm);
97 atomic_dec(&xfrm->flow_cache_gc_count); 97 atomic_dec(&xfrm->flow_cache_gc_count);
98 WARN_ON(atomic_read(&xfrm->flow_cache_gc_count) < 0);
99 } 98 }
100} 99}
101 100
@@ -236,9 +235,8 @@ flow_cache_lookup(struct net *net, const struct flowi *key, u16 family, u8 dir,
236 if (fcp->hash_count > fc->high_watermark) 235 if (fcp->hash_count > fc->high_watermark)
237 flow_cache_shrink(fc, fcp); 236 flow_cache_shrink(fc, fcp);
238 237
239 if (fcp->hash_count > 2 * fc->high_watermark || 238 if (atomic_read(&net->xfrm.flow_cache_gc_count) >
240 atomic_read(&net->xfrm.flow_cache_gc_count) > fc->high_watermark) { 239 2 * num_online_cpus() * fc->high_watermark) {
241 atomic_inc(&net->xfrm.flow_cache_genid);
242 flo = ERR_PTR(-ENOBUFS); 240 flo = ERR_PTR(-ENOBUFS);
243 goto ret_object; 241 goto ret_object;
244 } 242 }
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
index ab193e5def07..c6d8207ffa7e 100644
--- a/net/core/flow_dissector.c
+++ b/net/core/flow_dissector.c
@@ -122,7 +122,7 @@ bool __skb_flow_dissect(const struct sk_buff *skb,
122 struct flow_dissector_key_keyid *key_keyid; 122 struct flow_dissector_key_keyid *key_keyid;
123 bool skip_vlan = false; 123 bool skip_vlan = false;
124 u8 ip_proto = 0; 124 u8 ip_proto = 0;
125 bool ret = false; 125 bool ret;
126 126
127 if (!data) { 127 if (!data) {
128 data = skb->data; 128 data = skb->data;
@@ -549,12 +549,17 @@ ip_proto_again:
549out_good: 549out_good:
550 ret = true; 550 ret = true;
551 551
552out_bad: 552 key_control->thoff = (u16)nhoff;
553out:
553 key_basic->n_proto = proto; 554 key_basic->n_proto = proto;
554 key_basic->ip_proto = ip_proto; 555 key_basic->ip_proto = ip_proto;
555 key_control->thoff = (u16)nhoff;
556 556
557 return ret; 557 return ret;
558
559out_bad:
560 ret = false;
561 key_control->thoff = min_t(u16, nhoff, skb ? skb->len : hlen);
562 goto out;
558} 563}
559EXPORT_SYMBOL(__skb_flow_dissect); 564EXPORT_SYMBOL(__skb_flow_dissect);
560 565
@@ -1008,4 +1013,4 @@ static int __init init_default_flow_dissectors(void)
1008 return 0; 1013 return 0;
1009} 1014}
1010 1015
1011late_initcall_sync(init_default_flow_dissectors); 1016core_initcall(init_default_flow_dissectors);
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index f61c0e02a413..7001da910c6b 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -219,6 +219,8 @@ int peernet2id_alloc(struct net *net, struct net *peer)
219 bool alloc; 219 bool alloc;
220 int id; 220 int id;
221 221
222 if (atomic_read(&net->count) == 0)
223 return NETNSA_NSID_NOT_ASSIGNED;
222 spin_lock_irqsave(&net->nsid_lock, flags); 224 spin_lock_irqsave(&net->nsid_lock, flags);
223 alloc = atomic_read(&peer->count) == 0 ? false : true; 225 alloc = atomic_read(&peer->count) == 0 ? false : true;
224 id = __peernet2id_alloc(net, peer, &alloc); 226 id = __peernet2id_alloc(net, peer, &alloc);
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index fb7348f13501..a6196cf844f6 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -275,6 +275,7 @@ int rtnl_unregister(int protocol, int msgtype)
275 275
276 rtnl_msg_handlers[protocol][msgindex].doit = NULL; 276 rtnl_msg_handlers[protocol][msgindex].doit = NULL;
277 rtnl_msg_handlers[protocol][msgindex].dumpit = NULL; 277 rtnl_msg_handlers[protocol][msgindex].dumpit = NULL;
278 rtnl_msg_handlers[protocol][msgindex].calcit = NULL;
278 279
279 return 0; 280 return 0;
280} 281}
@@ -839,18 +840,20 @@ static inline int rtnl_vfinfo_size(const struct net_device *dev,
839 if (dev->dev.parent && dev_is_pci(dev->dev.parent) && 840 if (dev->dev.parent && dev_is_pci(dev->dev.parent) &&
840 (ext_filter_mask & RTEXT_FILTER_VF)) { 841 (ext_filter_mask & RTEXT_FILTER_VF)) {
841 int num_vfs = dev_num_vf(dev->dev.parent); 842 int num_vfs = dev_num_vf(dev->dev.parent);
842 size_t size = nla_total_size(sizeof(struct nlattr)); 843 size_t size = nla_total_size(0);
843 size += nla_total_size(num_vfs * sizeof(struct nlattr));
844 size += num_vfs * 844 size += num_vfs *
845 (nla_total_size(sizeof(struct ifla_vf_mac)) + 845 (nla_total_size(0) +
846 nla_total_size(MAX_VLAN_LIST_LEN * 846 nla_total_size(sizeof(struct ifla_vf_mac)) +
847 sizeof(struct nlattr)) + 847 nla_total_size(sizeof(struct ifla_vf_vlan)) +
848 nla_total_size(0) + /* nest IFLA_VF_VLAN_LIST */
848 nla_total_size(MAX_VLAN_LIST_LEN * 849 nla_total_size(MAX_VLAN_LIST_LEN *
849 sizeof(struct ifla_vf_vlan_info)) + 850 sizeof(struct ifla_vf_vlan_info)) +
850 nla_total_size(sizeof(struct ifla_vf_spoofchk)) + 851 nla_total_size(sizeof(struct ifla_vf_spoofchk)) +
852 nla_total_size(sizeof(struct ifla_vf_tx_rate)) +
851 nla_total_size(sizeof(struct ifla_vf_rate)) + 853 nla_total_size(sizeof(struct ifla_vf_rate)) +
852 nla_total_size(sizeof(struct ifla_vf_link_state)) + 854 nla_total_size(sizeof(struct ifla_vf_link_state)) +
853 nla_total_size(sizeof(struct ifla_vf_rss_query_en)) + 855 nla_total_size(sizeof(struct ifla_vf_rss_query_en)) +
856 nla_total_size(0) + /* nest IFLA_VF_STATS */
854 /* IFLA_VF_STATS_RX_PACKETS */ 857 /* IFLA_VF_STATS_RX_PACKETS */
855 nla_total_size_64bit(sizeof(__u64)) + 858 nla_total_size_64bit(sizeof(__u64)) +
856 /* IFLA_VF_STATS_TX_PACKETS */ 859 /* IFLA_VF_STATS_TX_PACKETS */
@@ -898,7 +901,8 @@ static size_t rtnl_port_size(const struct net_device *dev,
898 901
899static size_t rtnl_xdp_size(const struct net_device *dev) 902static size_t rtnl_xdp_size(const struct net_device *dev)
900{ 903{
901 size_t xdp_size = nla_total_size(1); /* XDP_ATTACHED */ 904 size_t xdp_size = nla_total_size(0) + /* nest IFLA_XDP */
905 nla_total_size(1); /* XDP_ATTACHED */
902 906
903 if (!dev->netdev_ops->ndo_xdp) 907 if (!dev->netdev_ops->ndo_xdp)
904 return 0; 908 return 0;
@@ -927,8 +931,8 @@ static noinline size_t if_nlmsg_size(const struct net_device *dev,
927 + nla_total_size(4) /* IFLA_PROMISCUITY */ 931 + nla_total_size(4) /* IFLA_PROMISCUITY */
928 + nla_total_size(4) /* IFLA_NUM_TX_QUEUES */ 932 + nla_total_size(4) /* IFLA_NUM_TX_QUEUES */
929 + nla_total_size(4) /* IFLA_NUM_RX_QUEUES */ 933 + nla_total_size(4) /* IFLA_NUM_RX_QUEUES */
930 + nla_total_size(4) /* IFLA_MAX_GSO_SEGS */ 934 + nla_total_size(4) /* IFLA_GSO_MAX_SEGS */
931 + nla_total_size(4) /* IFLA_MAX_GSO_SIZE */ 935 + nla_total_size(4) /* IFLA_GSO_MAX_SIZE */
932 + nla_total_size(1) /* IFLA_OPERSTATE */ 936 + nla_total_size(1) /* IFLA_OPERSTATE */
933 + nla_total_size(1) /* IFLA_LINKMODE */ 937 + nla_total_size(1) /* IFLA_LINKMODE */
934 + nla_total_size(4) /* IFLA_CARRIER_CHANGES */ 938 + nla_total_size(4) /* IFLA_CARRIER_CHANGES */
@@ -1605,7 +1609,7 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
1605 head = &net->dev_index_head[h]; 1609 head = &net->dev_index_head[h];
1606 hlist_for_each_entry(dev, head, index_hlist) { 1610 hlist_for_each_entry(dev, head, index_hlist) {
1607 if (link_dump_filtered(dev, master_idx, kind_ops)) 1611 if (link_dump_filtered(dev, master_idx, kind_ops))
1608 continue; 1612 goto cont;
1609 if (idx < s_idx) 1613 if (idx < s_idx)
1610 goto cont; 1614 goto cont;
1611 err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK, 1615 err = rtnl_fill_ifinfo(skb, dev, RTM_NEWLINK,
@@ -2733,7 +2737,7 @@ static u16 rtnl_calcit(struct sk_buff *skb, struct nlmsghdr *nlh)
2733 ext_filter_mask)); 2737 ext_filter_mask));
2734 } 2738 }
2735 2739
2736 return min_ifinfo_dump_size; 2740 return nlmsg_total_size(min_ifinfo_dump_size);
2737} 2741}
2738 2742
2739static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb) 2743static int rtnl_dump_all(struct sk_buff *skb, struct netlink_callback *cb)
@@ -2848,7 +2852,10 @@ nla_put_failure:
2848 2852
2849static inline size_t rtnl_fdb_nlmsg_size(void) 2853static inline size_t rtnl_fdb_nlmsg_size(void)
2850{ 2854{
2851 return NLMSG_ALIGN(sizeof(struct ndmsg)) + nla_total_size(ETH_ALEN); 2855 return NLMSG_ALIGN(sizeof(struct ndmsg)) +
2856 nla_total_size(ETH_ALEN) + /* NDA_LLADDR */
2857 nla_total_size(sizeof(u16)) + /* NDA_VLAN */
2858 0;
2852} 2859}
2853 2860
2854static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, u16 vid, int type, 2861static void rtnl_fdb_notify(struct net_device *dev, u8 *addr, u16 vid, int type,
diff --git a/net/core/sock.c b/net/core/sock.c
index c73e28fc9c2a..00a074dbfe9b 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -453,7 +453,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
453EXPORT_SYMBOL(sock_queue_rcv_skb); 453EXPORT_SYMBOL(sock_queue_rcv_skb);
454 454
455int __sk_receive_skb(struct sock *sk, struct sk_buff *skb, 455int __sk_receive_skb(struct sock *sk, struct sk_buff *skb,
456 const int nested, unsigned int trim_cap) 456 const int nested, unsigned int trim_cap, bool refcounted)
457{ 457{
458 int rc = NET_RX_SUCCESS; 458 int rc = NET_RX_SUCCESS;
459 459
@@ -487,7 +487,8 @@ int __sk_receive_skb(struct sock *sk, struct sk_buff *skb,
487 487
488 bh_unlock_sock(sk); 488 bh_unlock_sock(sk);
489out: 489out:
490 sock_put(sk); 490 if (refcounted)
491 sock_put(sk);
491 return rc; 492 return rc;
492discard_and_relse: 493discard_and_relse:
493 kfree_skb(skb); 494 kfree_skb(skb);
@@ -714,7 +715,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
714 val = min_t(u32, val, sysctl_wmem_max); 715 val = min_t(u32, val, sysctl_wmem_max);
715set_sndbuf: 716set_sndbuf:
716 sk->sk_userlocks |= SOCK_SNDBUF_LOCK; 717 sk->sk_userlocks |= SOCK_SNDBUF_LOCK;
717 sk->sk_sndbuf = max_t(u32, val * 2, SOCK_MIN_SNDBUF); 718 sk->sk_sndbuf = max_t(int, val * 2, SOCK_MIN_SNDBUF);
718 /* Wake up sending tasks if we upped the value. */ 719 /* Wake up sending tasks if we upped the value. */
719 sk->sk_write_space(sk); 720 sk->sk_write_space(sk);
720 break; 721 break;
@@ -750,7 +751,7 @@ set_rcvbuf:
750 * returning the value we actually used in getsockopt 751 * returning the value we actually used in getsockopt
751 * is the most desirable behavior. 752 * is the most desirable behavior.
752 */ 753 */
753 sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF); 754 sk->sk_rcvbuf = max_t(int, val * 2, SOCK_MIN_RCVBUF);
754 break; 755 break;
755 756
756 case SO_RCVBUFFORCE: 757 case SO_RCVBUFFORCE:
@@ -1543,6 +1544,7 @@ struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority)
1543 RCU_INIT_POINTER(newsk->sk_reuseport_cb, NULL); 1544 RCU_INIT_POINTER(newsk->sk_reuseport_cb, NULL);
1544 1545
1545 newsk->sk_err = 0; 1546 newsk->sk_err = 0;
1547 newsk->sk_err_soft = 0;
1546 newsk->sk_priority = 0; 1548 newsk->sk_priority = 0;
1547 newsk->sk_incoming_cpu = raw_smp_processor_id(); 1549 newsk->sk_incoming_cpu = raw_smp_processor_id();
1548 atomic64_set(&newsk->sk_cookie, 0); 1550 atomic64_set(&newsk->sk_cookie, 0);
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
index 4f6c1862dfd2..3202d75329b5 100644
--- a/net/dcb/dcbnl.c
+++ b/net/dcb/dcbnl.c
@@ -1353,6 +1353,7 @@ static int dcbnl_cee_fill(struct sk_buff *skb, struct net_device *netdev)
1353dcb_unlock: 1353dcb_unlock:
1354 spin_unlock_bh(&dcb_lock); 1354 spin_unlock_bh(&dcb_lock);
1355nla_put_failure: 1355nla_put_failure:
1356 err = -EMSGSIZE;
1356 return err; 1357 return err;
1357} 1358}
1358 1359
diff --git a/net/dccp/ipv4.c b/net/dccp/ipv4.c
index 345a3aeb8c7e..edbe59d203ef 100644
--- a/net/dccp/ipv4.c
+++ b/net/dccp/ipv4.c
@@ -235,7 +235,7 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
235{ 235{
236 const struct iphdr *iph = (struct iphdr *)skb->data; 236 const struct iphdr *iph = (struct iphdr *)skb->data;
237 const u8 offset = iph->ihl << 2; 237 const u8 offset = iph->ihl << 2;
238 const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset); 238 const struct dccp_hdr *dh;
239 struct dccp_sock *dp; 239 struct dccp_sock *dp;
240 struct inet_sock *inet; 240 struct inet_sock *inet;
241 const int type = icmp_hdr(skb)->type; 241 const int type = icmp_hdr(skb)->type;
@@ -245,11 +245,13 @@ static void dccp_v4_err(struct sk_buff *skb, u32 info)
245 int err; 245 int err;
246 struct net *net = dev_net(skb->dev); 246 struct net *net = dev_net(skb->dev);
247 247
248 if (skb->len < offset + sizeof(*dh) || 248 /* Only need dccph_dport & dccph_sport which are the first
249 skb->len < offset + __dccp_basic_hdr_len(dh)) { 249 * 4 bytes in dccp header.
250 __ICMP_INC_STATS(net, ICMP_MIB_INERRORS); 250 * Our caller (icmp_socket_deliver()) already pulled 8 bytes for us.
251 return; 251 */
252 } 252 BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8);
253 BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8);
254 dh = (struct dccp_hdr *)(skb->data + offset);
253 255
254 sk = __inet_lookup_established(net, &dccp_hashinfo, 256 sk = __inet_lookup_established(net, &dccp_hashinfo,
255 iph->daddr, dh->dccph_dport, 257 iph->daddr, dh->dccph_dport,
@@ -698,6 +700,7 @@ int dccp_invalid_packet(struct sk_buff *skb)
698{ 700{
699 const struct dccp_hdr *dh; 701 const struct dccp_hdr *dh;
700 unsigned int cscov; 702 unsigned int cscov;
703 u8 dccph_doff;
701 704
702 if (skb->pkt_type != PACKET_HOST) 705 if (skb->pkt_type != PACKET_HOST)
703 return 1; 706 return 1;
@@ -719,18 +722,19 @@ int dccp_invalid_packet(struct sk_buff *skb)
719 /* 722 /*
720 * If P.Data Offset is too small for packet type, drop packet and return 723 * If P.Data Offset is too small for packet type, drop packet and return
721 */ 724 */
722 if (dh->dccph_doff < dccp_hdr_len(skb) / sizeof(u32)) { 725 dccph_doff = dh->dccph_doff;
723 DCCP_WARN("P.Data Offset(%u) too small\n", dh->dccph_doff); 726 if (dccph_doff < dccp_hdr_len(skb) / sizeof(u32)) {
727 DCCP_WARN("P.Data Offset(%u) too small\n", dccph_doff);
724 return 1; 728 return 1;
725 } 729 }
726 /* 730 /*
727 * If P.Data Offset is too too large for packet, drop packet and return 731 * If P.Data Offset is too too large for packet, drop packet and return
728 */ 732 */
729 if (!pskb_may_pull(skb, dh->dccph_doff * sizeof(u32))) { 733 if (!pskb_may_pull(skb, dccph_doff * sizeof(u32))) {
730 DCCP_WARN("P.Data Offset(%u) too large\n", dh->dccph_doff); 734 DCCP_WARN("P.Data Offset(%u) too large\n", dccph_doff);
731 return 1; 735 return 1;
732 } 736 }
733 737 dh = dccp_hdr(skb);
734 /* 738 /*
735 * If P.type is not Data, Ack, or DataAck and P.X == 0 (the packet 739 * If P.type is not Data, Ack, or DataAck and P.X == 0 (the packet
736 * has short sequence numbers), drop packet and return 740 * has short sequence numbers), drop packet and return
@@ -868,7 +872,7 @@ lookup:
868 goto discard_and_relse; 872 goto discard_and_relse;
869 nf_reset(skb); 873 nf_reset(skb);
870 874
871 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4); 875 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4, refcounted);
872 876
873no_dccp_socket: 877no_dccp_socket:
874 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb)) 878 if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c
index 3828f94b234c..715e5d1dc107 100644
--- a/net/dccp/ipv6.c
+++ b/net/dccp/ipv6.c
@@ -70,7 +70,7 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
70 u8 type, u8 code, int offset, __be32 info) 70 u8 type, u8 code, int offset, __be32 info)
71{ 71{
72 const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data; 72 const struct ipv6hdr *hdr = (const struct ipv6hdr *)skb->data;
73 const struct dccp_hdr *dh = (struct dccp_hdr *)(skb->data + offset); 73 const struct dccp_hdr *dh;
74 struct dccp_sock *dp; 74 struct dccp_sock *dp;
75 struct ipv6_pinfo *np; 75 struct ipv6_pinfo *np;
76 struct sock *sk; 76 struct sock *sk;
@@ -78,12 +78,13 @@ static void dccp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
78 __u64 seq; 78 __u64 seq;
79 struct net *net = dev_net(skb->dev); 79 struct net *net = dev_net(skb->dev);
80 80
81 if (skb->len < offset + sizeof(*dh) || 81 /* Only need dccph_dport & dccph_sport which are the first
82 skb->len < offset + __dccp_basic_hdr_len(dh)) { 82 * 4 bytes in dccp header.
83 __ICMP6_INC_STATS(net, __in6_dev_get(skb->dev), 83 * Our caller (icmpv6_notify()) already pulled 8 bytes for us.
84 ICMP6_MIB_INERRORS); 84 */
85 return; 85 BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_sport) > 8);
86 } 86 BUILD_BUG_ON(offsetofend(struct dccp_hdr, dccph_dport) > 8);
87 dh = (struct dccp_hdr *)(skb->data + offset);
87 88
88 sk = __inet6_lookup_established(net, &dccp_hashinfo, 89 sk = __inet6_lookup_established(net, &dccp_hashinfo,
89 &hdr->daddr, dh->dccph_dport, 90 &hdr->daddr, dh->dccph_dport,
@@ -738,7 +739,8 @@ lookup:
738 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) 739 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
739 goto discard_and_relse; 740 goto discard_and_relse;
740 741
741 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4) ? -1 : 0; 742 return __sk_receive_skb(sk, skb, 1, dh->dccph_doff * 4,
743 refcounted) ? -1 : 0;
742 744
743no_dccp_socket: 745no_dccp_socket:
744 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb)) 746 if (!xfrm6_policy_check(NULL, XFRM_POLICY_IN, skb))
@@ -956,6 +958,7 @@ static const struct inet_connection_sock_af_ops dccp_ipv6_mapped = {
956 .getsockopt = ipv6_getsockopt, 958 .getsockopt = ipv6_getsockopt,
957 .addr2sockaddr = inet6_csk_addr2sockaddr, 959 .addr2sockaddr = inet6_csk_addr2sockaddr,
958 .sockaddr_len = sizeof(struct sockaddr_in6), 960 .sockaddr_len = sizeof(struct sockaddr_in6),
961 .bind_conflict = inet6_csk_bind_conflict,
959#ifdef CONFIG_COMPAT 962#ifdef CONFIG_COMPAT
960 .compat_setsockopt = compat_ipv6_setsockopt, 963 .compat_setsockopt = compat_ipv6_setsockopt,
961 .compat_getsockopt = compat_ipv6_getsockopt, 964 .compat_getsockopt = compat_ipv6_getsockopt,
diff --git a/net/dccp/proto.c b/net/dccp/proto.c
index 41e65804ddf5..9fe25bf63296 100644
--- a/net/dccp/proto.c
+++ b/net/dccp/proto.c
@@ -1009,6 +1009,10 @@ void dccp_close(struct sock *sk, long timeout)
1009 __kfree_skb(skb); 1009 __kfree_skb(skb);
1010 } 1010 }
1011 1011
1012 /* If socket has been already reset kill it. */
1013 if (sk->sk_state == DCCP_CLOSED)
1014 goto adjudge_to_death;
1015
1012 if (data_was_unread) { 1016 if (data_was_unread) {
1013 /* Unread data was tossed, send an appropriate Reset Code */ 1017 /* Unread data was tossed, send an appropriate Reset Code */
1014 DCCP_WARN("ABORT with %u bytes unread\n", data_was_unread); 1018 DCCP_WARN("ABORT with %u bytes unread\n", data_was_unread);
diff --git a/net/dsa/dsa.c b/net/dsa/dsa.c
index a6902c1e2f28..7899919cd9f0 100644
--- a/net/dsa/dsa.c
+++ b/net/dsa/dsa.c
@@ -233,6 +233,8 @@ int dsa_cpu_dsa_setup(struct dsa_switch *ds, struct device *dev,
233 genphy_read_status(phydev); 233 genphy_read_status(phydev);
234 if (ds->ops->adjust_link) 234 if (ds->ops->adjust_link)
235 ds->ops->adjust_link(ds, port, phydev); 235 ds->ops->adjust_link(ds, port, phydev);
236
237 put_device(&phydev->mdio.dev);
236 } 238 }
237 239
238 return 0; 240 return 0;
@@ -504,15 +506,8 @@ dsa_switch_setup(struct dsa_switch_tree *dst, int index,
504 506
505void dsa_cpu_dsa_destroy(struct device_node *port_dn) 507void dsa_cpu_dsa_destroy(struct device_node *port_dn)
506{ 508{
507 struct phy_device *phydev; 509 if (of_phy_is_fixed_link(port_dn))
508 510 of_phy_deregister_fixed_link(port_dn);
509 if (of_phy_is_fixed_link(port_dn)) {
510 phydev = of_phy_find_device(port_dn);
511 if (phydev) {
512 phy_device_free(phydev);
513 fixed_phy_unregister(phydev);
514 }
515 }
516} 511}
517 512
518static void dsa_switch_destroy(struct dsa_switch *ds) 513static void dsa_switch_destroy(struct dsa_switch *ds)
diff --git a/net/dsa/dsa2.c b/net/dsa/dsa2.c
index f8a7d9aab437..5fff951a0a49 100644
--- a/net/dsa/dsa2.c
+++ b/net/dsa/dsa2.c
@@ -28,8 +28,10 @@ static struct dsa_switch_tree *dsa_get_dst(u32 tree)
28 struct dsa_switch_tree *dst; 28 struct dsa_switch_tree *dst;
29 29
30 list_for_each_entry(dst, &dsa_switch_trees, list) 30 list_for_each_entry(dst, &dsa_switch_trees, list)
31 if (dst->tree == tree) 31 if (dst->tree == tree) {
32 kref_get(&dst->refcount);
32 return dst; 33 return dst;
34 }
33 return NULL; 35 return NULL;
34} 36}
35 37
diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index 6b1282c006b1..30e2e21d7619 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -1125,7 +1125,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1125 p->phy_interface = mode; 1125 p->phy_interface = mode;
1126 1126
1127 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0); 1127 phy_dn = of_parse_phandle(port_dn, "phy-handle", 0);
1128 if (of_phy_is_fixed_link(port_dn)) { 1128 if (!phy_dn && of_phy_is_fixed_link(port_dn)) {
1129 /* In the case of a fixed PHY, the DT node associated 1129 /* In the case of a fixed PHY, the DT node associated
1130 * to the fixed PHY is the Port DT node 1130 * to the fixed PHY is the Port DT node
1131 */ 1131 */
@@ -1135,7 +1135,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1135 return ret; 1135 return ret;
1136 } 1136 }
1137 phy_is_fixed = true; 1137 phy_is_fixed = true;
1138 phy_dn = port_dn; 1138 phy_dn = of_node_get(port_dn);
1139 } 1139 }
1140 1140
1141 if (ds->ops->get_phy_flags) 1141 if (ds->ops->get_phy_flags)
@@ -1154,6 +1154,7 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1154 ret = dsa_slave_phy_connect(p, slave_dev, phy_id); 1154 ret = dsa_slave_phy_connect(p, slave_dev, phy_id);
1155 if (ret) { 1155 if (ret) {
1156 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret); 1156 netdev_err(slave_dev, "failed to connect to phy%d: %d\n", phy_id, ret);
1157 of_node_put(phy_dn);
1157 return ret; 1158 return ret;
1158 } 1159 }
1159 } else { 1160 } else {
@@ -1162,6 +1163,8 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1162 phy_flags, 1163 phy_flags,
1163 p->phy_interface); 1164 p->phy_interface);
1164 } 1165 }
1166
1167 of_node_put(phy_dn);
1165 } 1168 }
1166 1169
1167 if (p->phy && phy_is_fixed) 1170 if (p->phy && phy_is_fixed)
@@ -1174,6 +1177,8 @@ static int dsa_slave_phy_setup(struct dsa_slave_priv *p,
1174 ret = dsa_slave_phy_connect(p, slave_dev, p->port); 1177 ret = dsa_slave_phy_connect(p, slave_dev, p->port);
1175 if (ret) { 1178 if (ret) {
1176 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret); 1179 netdev_err(slave_dev, "failed to connect to port %d: %d\n", p->port, ret);
1180 if (phy_is_fixed)
1181 of_phy_deregister_fixed_link(port_dn);
1177 return ret; 1182 return ret;
1178 } 1183 }
1179 } 1184 }
@@ -1289,10 +1294,18 @@ int dsa_slave_create(struct dsa_switch *ds, struct device *parent,
1289void dsa_slave_destroy(struct net_device *slave_dev) 1294void dsa_slave_destroy(struct net_device *slave_dev)
1290{ 1295{
1291 struct dsa_slave_priv *p = netdev_priv(slave_dev); 1296 struct dsa_slave_priv *p = netdev_priv(slave_dev);
1297 struct dsa_switch *ds = p->parent;
1298 struct device_node *port_dn;
1299
1300 port_dn = ds->ports[p->port].dn;
1292 1301
1293 netif_carrier_off(slave_dev); 1302 netif_carrier_off(slave_dev);
1294 if (p->phy) 1303 if (p->phy) {
1295 phy_disconnect(p->phy); 1304 phy_disconnect(p->phy);
1305
1306 if (of_phy_is_fixed_link(port_dn))
1307 of_phy_deregister_fixed_link(port_dn);
1308 }
1296 unregister_netdev(slave_dev); 1309 unregister_netdev(slave_dev);
1297 free_netdev(slave_dev); 1310 free_netdev(slave_dev);
1298} 1311}
diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig
index 300b06888fdf..b54b3ca939db 100644
--- a/net/ipv4/Kconfig
+++ b/net/ipv4/Kconfig
@@ -715,6 +715,7 @@ config DEFAULT_TCP_CONG
715 default "reno" if DEFAULT_RENO 715 default "reno" if DEFAULT_RENO
716 default "dctcp" if DEFAULT_DCTCP 716 default "dctcp" if DEFAULT_DCTCP
717 default "cdg" if DEFAULT_CDG 717 default "cdg" if DEFAULT_CDG
718 default "bbr" if DEFAULT_BBR
718 default "cubic" 719 default "cubic"
719 720
720config TCP_MD5SIG 721config TCP_MD5SIG
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
index 9648c97e541f..215143246e4b 100644
--- a/net/ipv4/af_inet.c
+++ b/net/ipv4/af_inet.c
@@ -533,9 +533,9 @@ EXPORT_SYMBOL(inet_dgram_connect);
533 533
534static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias) 534static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias)
535{ 535{
536 DEFINE_WAIT(wait); 536 DEFINE_WAIT_FUNC(wait, woken_wake_function);
537 537
538 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); 538 add_wait_queue(sk_sleep(sk), &wait);
539 sk->sk_write_pending += writebias; 539 sk->sk_write_pending += writebias;
540 540
541 /* Basic assumption: if someone sets sk->sk_err, he _must_ 541 /* Basic assumption: if someone sets sk->sk_err, he _must_
@@ -545,13 +545,12 @@ static long inet_wait_for_connect(struct sock *sk, long timeo, int writebias)
545 */ 545 */
546 while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { 546 while ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) {
547 release_sock(sk); 547 release_sock(sk);
548 timeo = schedule_timeout(timeo); 548 timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, timeo);
549 lock_sock(sk); 549 lock_sock(sk);
550 if (signal_pending(current) || !timeo) 550 if (signal_pending(current) || !timeo)
551 break; 551 break;
552 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
553 } 552 }
554 finish_wait(sk_sleep(sk), &wait); 553 remove_wait_queue(sk_sleep(sk), &wait);
555 sk->sk_write_pending -= writebias; 554 sk->sk_write_pending -= writebias;
556 return timeo; 555 return timeo;
557} 556}
@@ -1234,7 +1233,7 @@ struct sk_buff *inet_gso_segment(struct sk_buff *skb,
1234 fixedid = !!(skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID); 1233 fixedid = !!(skb_shinfo(skb)->gso_type & SKB_GSO_TCP_FIXEDID);
1235 1234
1236 /* fixed ID is invalid if DF bit is not set */ 1235 /* fixed ID is invalid if DF bit is not set */
1237 if (fixedid && !(iph->frag_off & htons(IP_DF))) 1236 if (fixedid && !(ip_hdr(skb)->frag_off & htons(IP_DF)))
1238 goto out; 1237 goto out;
1239 } 1238 }
1240 1239
diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
index d95631d09248..20fb25e3027b 100644
--- a/net/ipv4/esp4.c
+++ b/net/ipv4/esp4.c
@@ -476,7 +476,7 @@ static int esp_input(struct xfrm_state *x, struct sk_buff *skb)
476 esph = (void *)skb_push(skb, 4); 476 esph = (void *)skb_push(skb, 4);
477 *seqhi = esph->spi; 477 *seqhi = esph->spi;
478 esph->spi = esph->seq_no; 478 esph->spi = esph->seq_no;
479 esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.input.hi); 479 esph->seq_no = XFRM_SKB_CB(skb)->seq.input.hi;
480 aead_request_set_callback(req, 0, esp_input_done_esn, skb); 480 aead_request_set_callback(req, 0, esp_input_done_esn, skb);
481 } 481 }
482 482
diff --git a/net/ipv4/fib_frontend.c b/net/ipv4/fib_frontend.c
index c3b80478226e..161fc0f0d752 100644
--- a/net/ipv4/fib_frontend.c
+++ b/net/ipv4/fib_frontend.c
@@ -151,7 +151,7 @@ static void fib_replace_table(struct net *net, struct fib_table *old,
151 151
152int fib_unmerge(struct net *net) 152int fib_unmerge(struct net *net)
153{ 153{
154 struct fib_table *old, *new; 154 struct fib_table *old, *new, *main_table;
155 155
156 /* attempt to fetch local table if it has been allocated */ 156 /* attempt to fetch local table if it has been allocated */
157 old = fib_get_table(net, RT_TABLE_LOCAL); 157 old = fib_get_table(net, RT_TABLE_LOCAL);
@@ -162,11 +162,21 @@ int fib_unmerge(struct net *net)
162 if (!new) 162 if (!new)
163 return -ENOMEM; 163 return -ENOMEM;
164 164
165 /* table is already unmerged */
166 if (new == old)
167 return 0;
168
165 /* replace merged table with clean table */ 169 /* replace merged table with clean table */
166 if (new != old) { 170 fib_replace_table(net, old, new);
167 fib_replace_table(net, old, new); 171 fib_free_table(old);
168 fib_free_table(old); 172
169 } 173 /* attempt to fetch main table if it has been allocated */
174 main_table = fib_get_table(net, RT_TABLE_MAIN);
175 if (!main_table)
176 return 0;
177
178 /* flush local entries from main table */
179 fib_table_flush_external(main_table);
170 180
171 return 0; 181 return 0;
172} 182}
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 31cef3602585..e3665bf7a7f3 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -719,6 +719,13 @@ static unsigned char update_suffix(struct key_vector *tn)
719{ 719{
720 unsigned char slen = tn->pos; 720 unsigned char slen = tn->pos;
721 unsigned long stride, i; 721 unsigned long stride, i;
722 unsigned char slen_max;
723
724 /* only vector 0 can have a suffix length greater than or equal to
725 * tn->pos + tn->bits, the second highest node will have a suffix
726 * length at most of tn->pos + tn->bits - 1
727 */
728 slen_max = min_t(unsigned char, tn->pos + tn->bits - 1, tn->slen);
722 729
723 /* search though the list of children looking for nodes that might 730 /* search though the list of children looking for nodes that might
724 * have a suffix greater than the one we currently have. This is 731 * have a suffix greater than the one we currently have. This is
@@ -736,12 +743,8 @@ static unsigned char update_suffix(struct key_vector *tn)
736 slen = n->slen; 743 slen = n->slen;
737 i &= ~(stride - 1); 744 i &= ~(stride - 1);
738 745
739 /* if slen covers all but the last bit we can stop here 746 /* stop searching if we have hit the maximum possible value */
740 * there will be nothing longer than that since only node 747 if (slen >= slen_max)
741 * 0 and 1 << (bits - 1) could have that as their suffix
742 * length.
743 */
744 if ((slen + 1) >= (tn->pos + tn->bits))
745 break; 748 break;
746 } 749 }
747 750
@@ -913,39 +916,27 @@ static struct key_vector *resize(struct trie *t, struct key_vector *tn)
913 return collapse(t, tn); 916 return collapse(t, tn);
914 917
915 /* update parent in case halve failed */ 918 /* update parent in case halve failed */
916 tp = node_parent(tn); 919 return node_parent(tn);
917
918 /* Return if at least one deflate was run */
919 if (max_work != MAX_WORK)
920 return tp;
921
922 /* push the suffix length to the parent node */
923 if (tn->slen > tn->pos) {
924 unsigned char slen = update_suffix(tn);
925
926 if (slen > tp->slen)
927 tp->slen = slen;
928 }
929
930 return tp;
931} 920}
932 921
933static void leaf_pull_suffix(struct key_vector *tp, struct key_vector *l) 922static void node_pull_suffix(struct key_vector *tn, unsigned char slen)
934{ 923{
935 while ((tp->slen > tp->pos) && (tp->slen > l->slen)) { 924 unsigned char node_slen = tn->slen;
936 if (update_suffix(tp) > l->slen) 925
926 while ((node_slen > tn->pos) && (node_slen > slen)) {
927 slen = update_suffix(tn);
928 if (node_slen == slen)
937 break; 929 break;
938 tp = node_parent(tp); 930
931 tn = node_parent(tn);
932 node_slen = tn->slen;
939 } 933 }
940} 934}
941 935
942static void leaf_push_suffix(struct key_vector *tn, struct key_vector *l) 936static void node_push_suffix(struct key_vector *tn, unsigned char slen)
943{ 937{
944 /* if this is a new leaf then tn will be NULL and we can sort 938 while (tn->slen < slen) {
945 * out parent suffix lengths as a part of trie_rebalance 939 tn->slen = slen;
946 */
947 while (tn->slen < l->slen) {
948 tn->slen = l->slen;
949 tn = node_parent(tn); 940 tn = node_parent(tn);
950 } 941 }
951} 942}
@@ -1066,6 +1057,7 @@ static int fib_insert_node(struct trie *t, struct key_vector *tp,
1066 } 1057 }
1067 1058
1068 /* Case 3: n is NULL, and will just insert a new leaf */ 1059 /* Case 3: n is NULL, and will just insert a new leaf */
1060 node_push_suffix(tp, new->fa_slen);
1069 NODE_INIT_PARENT(l, tp); 1061 NODE_INIT_PARENT(l, tp);
1070 put_child_root(tp, key, l); 1062 put_child_root(tp, key, l);
1071 trie_rebalance(t, tp); 1063 trie_rebalance(t, tp);
@@ -1107,7 +1099,7 @@ static int fib_insert_alias(struct trie *t, struct key_vector *tp,
1107 /* if we added to the tail node then we need to update slen */ 1099 /* if we added to the tail node then we need to update slen */
1108 if (l->slen < new->fa_slen) { 1100 if (l->slen < new->fa_slen) {
1109 l->slen = new->fa_slen; 1101 l->slen = new->fa_slen;
1110 leaf_push_suffix(tp, l); 1102 node_push_suffix(tp, new->fa_slen);
1111 } 1103 }
1112 1104
1113 return 0; 1105 return 0;
@@ -1499,6 +1491,8 @@ static void fib_remove_alias(struct trie *t, struct key_vector *tp,
1499 * out parent suffix lengths as a part of trie_rebalance 1491 * out parent suffix lengths as a part of trie_rebalance
1500 */ 1492 */
1501 if (hlist_empty(&l->leaf)) { 1493 if (hlist_empty(&l->leaf)) {
1494 if (tp->slen == l->slen)
1495 node_pull_suffix(tp, tp->pos);
1502 put_child_root(tp, l->key, NULL); 1496 put_child_root(tp, l->key, NULL);
1503 node_free(l); 1497 node_free(l);
1504 trie_rebalance(t, tp); 1498 trie_rebalance(t, tp);
@@ -1511,7 +1505,7 @@ static void fib_remove_alias(struct trie *t, struct key_vector *tp,
1511 1505
1512 /* update the trie with the latest suffix length */ 1506 /* update the trie with the latest suffix length */
1513 l->slen = fa->fa_slen; 1507 l->slen = fa->fa_slen;
1514 leaf_pull_suffix(tp, l); 1508 node_pull_suffix(tp, fa->fa_slen);
1515} 1509}
1516 1510
1517/* Caller must hold RTNL. */ 1511/* Caller must hold RTNL. */
@@ -1743,8 +1737,10 @@ struct fib_table *fib_trie_unmerge(struct fib_table *oldtb)
1743 local_l = fib_find_node(lt, &local_tp, l->key); 1737 local_l = fib_find_node(lt, &local_tp, l->key);
1744 1738
1745 if (fib_insert_alias(lt, local_tp, local_l, new_fa, 1739 if (fib_insert_alias(lt, local_tp, local_l, new_fa,
1746 NULL, l->key)) 1740 NULL, l->key)) {
1741 kmem_cache_free(fn_alias_kmem, new_fa);
1747 goto out; 1742 goto out;
1743 }
1748 } 1744 }
1749 1745
1750 /* stop loop if key wrapped back to 0 */ 1746 /* stop loop if key wrapped back to 0 */
@@ -1760,6 +1756,75 @@ out:
1760 return NULL; 1756 return NULL;
1761} 1757}
1762 1758
1759/* Caller must hold RTNL */
1760void fib_table_flush_external(struct fib_table *tb)
1761{
1762 struct trie *t = (struct trie *)tb->tb_data;
1763 struct key_vector *pn = t->kv;
1764 unsigned long cindex = 1;
1765 struct hlist_node *tmp;
1766 struct fib_alias *fa;
1767
1768 /* walk trie in reverse order */
1769 for (;;) {
1770 unsigned char slen = 0;
1771 struct key_vector *n;
1772
1773 if (!(cindex--)) {
1774 t_key pkey = pn->key;
1775
1776 /* cannot resize the trie vector */
1777 if (IS_TRIE(pn))
1778 break;
1779
1780 /* update the suffix to address pulled leaves */
1781 if (pn->slen > pn->pos)
1782 update_suffix(pn);
1783
1784 /* resize completed node */
1785 pn = resize(t, pn);
1786 cindex = get_index(pkey, pn);
1787
1788 continue;
1789 }
1790
1791 /* grab the next available node */
1792 n = get_child(pn, cindex);
1793 if (!n)
1794 continue;
1795
1796 if (IS_TNODE(n)) {
1797 /* record pn and cindex for leaf walking */
1798 pn = n;
1799 cindex = 1ul << n->bits;
1800
1801 continue;
1802 }
1803
1804 hlist_for_each_entry_safe(fa, tmp, &n->leaf, fa_list) {
1805 /* if alias was cloned to local then we just
1806 * need to remove the local copy from main
1807 */
1808 if (tb->tb_id != fa->tb_id) {
1809 hlist_del_rcu(&fa->fa_list);
1810 alias_free_mem_rcu(fa);
1811 continue;
1812 }
1813
1814 /* record local slen */
1815 slen = fa->fa_slen;
1816 }
1817
1818 /* update leaf slen */
1819 n->slen = slen;
1820
1821 if (hlist_empty(&n->leaf)) {
1822 put_child_root(pn, n->key, NULL);
1823 node_free(n);
1824 }
1825 }
1826}
1827
1763/* Caller must hold RTNL. */ 1828/* Caller must hold RTNL. */
1764int fib_table_flush(struct net *net, struct fib_table *tb) 1829int fib_table_flush(struct net *net, struct fib_table *tb)
1765{ 1830{
@@ -1782,6 +1847,10 @@ int fib_table_flush(struct net *net, struct fib_table *tb)
1782 if (IS_TRIE(pn)) 1847 if (IS_TRIE(pn))
1783 break; 1848 break;
1784 1849
1850 /* update the suffix to address pulled leaves */
1851 if (pn->slen > pn->pos)
1852 update_suffix(pn);
1853
1785 /* resize completed node */ 1854 /* resize completed node */
1786 pn = resize(t, pn); 1855 pn = resize(t, pn);
1787 cindex = get_index(pkey, pn); 1856 cindex = get_index(pkey, pn);
@@ -2413,22 +2482,19 @@ static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter,
2413 struct key_vector *l, **tp = &iter->tnode; 2482 struct key_vector *l, **tp = &iter->tnode;
2414 t_key key; 2483 t_key key;
2415 2484
2416 /* use cache location of next-to-find key */ 2485 /* use cached location of previously found key */
2417 if (iter->pos > 0 && pos >= iter->pos) { 2486 if (iter->pos > 0 && pos >= iter->pos) {
2418 pos -= iter->pos;
2419 key = iter->key; 2487 key = iter->key;
2420 } else { 2488 } else {
2421 iter->pos = 0; 2489 iter->pos = 1;
2422 key = 0; 2490 key = 0;
2423 } 2491 }
2424 2492
2425 while ((l = leaf_walk_rcu(tp, key)) != NULL) { 2493 pos -= iter->pos;
2494
2495 while ((l = leaf_walk_rcu(tp, key)) && (pos-- > 0)) {
2426 key = l->key + 1; 2496 key = l->key + 1;
2427 iter->pos++; 2497 iter->pos++;
2428
2429 if (--pos <= 0)
2430 break;
2431
2432 l = NULL; 2498 l = NULL;
2433 2499
2434 /* handle unlikely case of a key wrap */ 2500 /* handle unlikely case of a key wrap */
@@ -2437,7 +2503,7 @@ static struct key_vector *fib_route_get_idx(struct fib_route_iter *iter,
2437 } 2503 }
2438 2504
2439 if (l) 2505 if (l)
2440 iter->key = key; /* remember it */ 2506 iter->key = l->key; /* remember it */
2441 else 2507 else
2442 iter->pos = 0; /* forget it */ 2508 iter->pos = 0; /* forget it */
2443 2509
@@ -2465,7 +2531,7 @@ static void *fib_route_seq_start(struct seq_file *seq, loff_t *pos)
2465 return fib_route_get_idx(iter, *pos); 2531 return fib_route_get_idx(iter, *pos);
2466 2532
2467 iter->pos = 0; 2533 iter->pos = 0;
2468 iter->key = 0; 2534 iter->key = KEY_MAX;
2469 2535
2470 return SEQ_START_TOKEN; 2536 return SEQ_START_TOKEN;
2471} 2537}
@@ -2474,7 +2540,7 @@ static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2474{ 2540{
2475 struct fib_route_iter *iter = seq->private; 2541 struct fib_route_iter *iter = seq->private;
2476 struct key_vector *l = NULL; 2542 struct key_vector *l = NULL;
2477 t_key key = iter->key; 2543 t_key key = iter->key + 1;
2478 2544
2479 ++*pos; 2545 ++*pos;
2480 2546
@@ -2483,7 +2549,7 @@ static void *fib_route_seq_next(struct seq_file *seq, void *v, loff_t *pos)
2483 l = leaf_walk_rcu(&iter->tnode, key); 2549 l = leaf_walk_rcu(&iter->tnode, key);
2484 2550
2485 if (l) { 2551 if (l) {
2486 iter->key = l->key + 1; 2552 iter->key = l->key;
2487 iter->pos++; 2553 iter->pos++;
2488 } else { 2554 } else {
2489 iter->pos = 0; 2555 iter->pos = 0;
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index 38abe70e595f..48734ee6293f 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -477,7 +477,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
477 fl4->flowi4_proto = IPPROTO_ICMP; 477 fl4->flowi4_proto = IPPROTO_ICMP;
478 fl4->fl4_icmp_type = type; 478 fl4->fl4_icmp_type = type;
479 fl4->fl4_icmp_code = code; 479 fl4->fl4_icmp_code = code;
480 fl4->flowi4_oif = l3mdev_master_ifindex(skb_in->dev); 480 fl4->flowi4_oif = l3mdev_master_ifindex(skb_dst(skb_in)->dev);
481 481
482 security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4)); 482 security_skb_classify_flow(skb_in, flowi4_to_flowi(fl4));
483 rt = __ip_route_output_key_hash(net, fl4, 483 rt = __ip_route_output_key_hash(net, fl4,
@@ -502,7 +502,7 @@ static struct rtable *icmp_route_lookup(struct net *net,
502 if (err) 502 if (err)
503 goto relookup_failed; 503 goto relookup_failed;
504 504
505 if (inet_addr_type_dev_table(net, skb_in->dev, 505 if (inet_addr_type_dev_table(net, skb_dst(skb_in)->dev,
506 fl4_dec.saddr) == RTN_LOCAL) { 506 fl4_dec.saddr) == RTN_LOCAL) {
507 rt2 = __ip_route_output_key(net, &fl4_dec); 507 rt2 = __ip_route_output_key(net, &fl4_dec);
508 if (IS_ERR(rt2)) 508 if (IS_ERR(rt2))
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
index 606cc3e85d2b..15db786d50ed 100644
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -162,7 +162,7 @@ static int unsolicited_report_interval(struct in_device *in_dev)
162} 162}
163 163
164static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im); 164static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im);
165static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr); 165static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im);
166static void igmpv3_clear_delrec(struct in_device *in_dev); 166static void igmpv3_clear_delrec(struct in_device *in_dev);
167static int sf_setstate(struct ip_mc_list *pmc); 167static int sf_setstate(struct ip_mc_list *pmc);
168static void sf_markstate(struct ip_mc_list *pmc); 168static void sf_markstate(struct ip_mc_list *pmc);
@@ -1130,10 +1130,15 @@ static void igmpv3_add_delrec(struct in_device *in_dev, struct ip_mc_list *im)
1130 spin_unlock_bh(&in_dev->mc_tomb_lock); 1130 spin_unlock_bh(&in_dev->mc_tomb_lock);
1131} 1131}
1132 1132
1133static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr) 1133/*
1134 * restore ip_mc_list deleted records
1135 */
1136static void igmpv3_del_delrec(struct in_device *in_dev, struct ip_mc_list *im)
1134{ 1137{
1135 struct ip_mc_list *pmc, *pmc_prev; 1138 struct ip_mc_list *pmc, *pmc_prev;
1136 struct ip_sf_list *psf, *psf_next; 1139 struct ip_sf_list *psf;
1140 struct net *net = dev_net(in_dev->dev);
1141 __be32 multiaddr = im->multiaddr;
1137 1142
1138 spin_lock_bh(&in_dev->mc_tomb_lock); 1143 spin_lock_bh(&in_dev->mc_tomb_lock);
1139 pmc_prev = NULL; 1144 pmc_prev = NULL;
@@ -1149,16 +1154,26 @@ static void igmpv3_del_delrec(struct in_device *in_dev, __be32 multiaddr)
1149 in_dev->mc_tomb = pmc->next; 1154 in_dev->mc_tomb = pmc->next;
1150 } 1155 }
1151 spin_unlock_bh(&in_dev->mc_tomb_lock); 1156 spin_unlock_bh(&in_dev->mc_tomb_lock);
1157
1158 spin_lock_bh(&im->lock);
1152 if (pmc) { 1159 if (pmc) {
1153 for (psf = pmc->tomb; psf; psf = psf_next) { 1160 im->interface = pmc->interface;
1154 psf_next = psf->sf_next; 1161 im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
1155 kfree(psf); 1162 im->sfmode = pmc->sfmode;
1163 if (pmc->sfmode == MCAST_INCLUDE) {
1164 im->tomb = pmc->tomb;
1165 im->sources = pmc->sources;
1166 for (psf = im->sources; psf; psf = psf->sf_next)
1167 psf->sf_crcount = im->crcount;
1156 } 1168 }
1157 in_dev_put(pmc->interface); 1169 in_dev_put(pmc->interface);
1158 kfree(pmc);
1159 } 1170 }
1171 spin_unlock_bh(&im->lock);
1160} 1172}
1161 1173
1174/*
1175 * flush ip_mc_list deleted records
1176 */
1162static void igmpv3_clear_delrec(struct in_device *in_dev) 1177static void igmpv3_clear_delrec(struct in_device *in_dev)
1163{ 1178{
1164 struct ip_mc_list *pmc, *nextpmc; 1179 struct ip_mc_list *pmc, *nextpmc;
@@ -1366,7 +1381,7 @@ void ip_mc_inc_group(struct in_device *in_dev, __be32 addr)
1366 ip_mc_hash_add(in_dev, im); 1381 ip_mc_hash_add(in_dev, im);
1367 1382
1368#ifdef CONFIG_IP_MULTICAST 1383#ifdef CONFIG_IP_MULTICAST
1369 igmpv3_del_delrec(in_dev, im->multiaddr); 1384 igmpv3_del_delrec(in_dev, im);
1370#endif 1385#endif
1371 igmp_group_added(im); 1386 igmp_group_added(im);
1372 if (!in_dev->dead) 1387 if (!in_dev->dead)
@@ -1626,8 +1641,12 @@ void ip_mc_remap(struct in_device *in_dev)
1626 1641
1627 ASSERT_RTNL(); 1642 ASSERT_RTNL();
1628 1643
1629 for_each_pmc_rtnl(in_dev, pmc) 1644 for_each_pmc_rtnl(in_dev, pmc) {
1645#ifdef CONFIG_IP_MULTICAST
1646 igmpv3_del_delrec(in_dev, pmc);
1647#endif
1630 igmp_group_added(pmc); 1648 igmp_group_added(pmc);
1649 }
1631} 1650}
1632 1651
1633/* Device going down */ 1652/* Device going down */
@@ -1648,7 +1667,6 @@ void ip_mc_down(struct in_device *in_dev)
1648 in_dev->mr_gq_running = 0; 1667 in_dev->mr_gq_running = 0;
1649 if (del_timer(&in_dev->mr_gq_timer)) 1668 if (del_timer(&in_dev->mr_gq_timer))
1650 __in_dev_put(in_dev); 1669 __in_dev_put(in_dev);
1651 igmpv3_clear_delrec(in_dev);
1652#endif 1670#endif
1653 1671
1654 ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS); 1672 ip_mc_dec_group(in_dev, IGMP_ALL_HOSTS);
@@ -1688,8 +1706,12 @@ void ip_mc_up(struct in_device *in_dev)
1688#endif 1706#endif
1689 ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS); 1707 ip_mc_inc_group(in_dev, IGMP_ALL_HOSTS);
1690 1708
1691 for_each_pmc_rtnl(in_dev, pmc) 1709 for_each_pmc_rtnl(in_dev, pmc) {
1710#ifdef CONFIG_IP_MULTICAST
1711 igmpv3_del_delrec(in_dev, pmc);
1712#endif
1692 igmp_group_added(pmc); 1713 igmp_group_added(pmc);
1714 }
1693} 1715}
1694 1716
1695/* 1717/*
@@ -1704,13 +1726,13 @@ void ip_mc_destroy_dev(struct in_device *in_dev)
1704 1726
1705 /* Deactivate timers */ 1727 /* Deactivate timers */
1706 ip_mc_down(in_dev); 1728 ip_mc_down(in_dev);
1729#ifdef CONFIG_IP_MULTICAST
1730 igmpv3_clear_delrec(in_dev);
1731#endif
1707 1732
1708 while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) { 1733 while ((i = rtnl_dereference(in_dev->mc_list)) != NULL) {
1709 in_dev->mc_list = i->next_rcu; 1734 in_dev->mc_list = i->next_rcu;
1710 in_dev->mc_count--; 1735 in_dev->mc_count--;
1711
1712 /* We've dropped the groups in ip_mc_down already */
1713 ip_mc_clear_src(i);
1714 ip_ma_put(i); 1736 ip_ma_put(i);
1715 } 1737 }
1716} 1738}
diff --git a/net/ipv4/ip_forward.c b/net/ipv4/ip_forward.c
index 8b4ffd216839..9f0a7b96646f 100644
--- a/net/ipv4/ip_forward.c
+++ b/net/ipv4/ip_forward.c
@@ -117,7 +117,7 @@ int ip_forward(struct sk_buff *skb)
117 if (opt->is_strictroute && rt->rt_uses_gateway) 117 if (opt->is_strictroute && rt->rt_uses_gateway)
118 goto sr_failed; 118 goto sr_failed;
119 119
120 IPCB(skb)->flags |= IPSKB_FORWARDED | IPSKB_FRAG_SEGS; 120 IPCB(skb)->flags |= IPSKB_FORWARDED;
121 mtu = ip_dst_mtu_maybe_forward(&rt->dst, true); 121 mtu = ip_dst_mtu_maybe_forward(&rt->dst, true);
122 if (ip_exceeds_mtu(skb, mtu)) { 122 if (ip_exceeds_mtu(skb, mtu)) {
123 IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS); 123 IP_INC_STATS(net, IPSTATS_MIB_FRAGFAILS);
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index 03e7f7310423..877bdb02e887 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -107,6 +107,8 @@ int __ip_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
107 if (unlikely(!skb)) 107 if (unlikely(!skb))
108 return 0; 108 return 0;
109 109
110 skb->protocol = htons(ETH_P_IP);
111
110 return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT, 112 return nf_hook(NFPROTO_IPV4, NF_INET_LOCAL_OUT,
111 net, sk, skb, NULL, skb_dst(skb)->dev, 113 net, sk, skb, NULL, skb_dst(skb)->dev,
112 dst_output); 114 dst_output);
@@ -239,19 +241,23 @@ static int ip_finish_output_gso(struct net *net, struct sock *sk,
239 struct sk_buff *segs; 241 struct sk_buff *segs;
240 int ret = 0; 242 int ret = 0;
241 243
242 /* common case: fragmentation of segments is not allowed, 244 /* common case: seglen is <= mtu
243 * or seglen is <= mtu
244 */ 245 */
245 if (((IPCB(skb)->flags & IPSKB_FRAG_SEGS) == 0) || 246 if (skb_gso_validate_mtu(skb, mtu))
246 skb_gso_validate_mtu(skb, mtu))
247 return ip_finish_output2(net, sk, skb); 247 return ip_finish_output2(net, sk, skb);
248 248
249 /* Slowpath - GSO segment length is exceeding the dst MTU. 249 /* Slowpath - GSO segment length exceeds the egress MTU.
250 * 250 *
251 * This can happen in two cases: 251 * This can happen in several cases:
252 * 1) TCP GRO packet, DF bit not set 252 * - Forwarding of a TCP GRO skb, when DF flag is not set.
253 * 2) skb arrived via virtio-net, we thus get TSO/GSO skbs directly 253 * - Forwarding of an skb that arrived on a virtualization interface
254 * from host network stack. 254 * (virtio-net/vhost/tap) with TSO/GSO size set by other network
255 * stack.
256 * - Local GSO skb transmitted on an NETIF_F_TSO tunnel stacked over an
257 * interface with a smaller MTU.
258 * - Arriving GRO skb (or GSO skb in a virtualized environment) that is
259 * bridged to a NETIF_F_TSO tunnel stacked over an interface with an
260 * insufficent MTU.
255 */ 261 */
256 features = netif_skb_features(skb); 262 features = netif_skb_features(skb);
257 BUILD_BUG_ON(sizeof(*IPCB(skb)) > SKB_SGO_CB_OFFSET); 263 BUILD_BUG_ON(sizeof(*IPCB(skb)) > SKB_SGO_CB_OFFSET);
@@ -1579,7 +1585,8 @@ void ip_send_unicast_reply(struct sock *sk, struct sk_buff *skb,
1579 } 1585 }
1580 1586
1581 oif = arg->bound_dev_if; 1587 oif = arg->bound_dev_if;
1582 oif = oif ? : skb->skb_iif; 1588 if (!oif && netif_index_is_l3_master(net, skb->skb_iif))
1589 oif = skb->skb_iif;
1583 1590
1584 flowi4_init_output(&fl4, oif, 1591 flowi4_init_output(&fl4, oif,
1585 IP4_REPLY_MARK(net, skb->mark), 1592 IP4_REPLY_MARK(net, skb->mark),
diff --git a/net/ipv4/ip_tunnel_core.c b/net/ipv4/ip_tunnel_core.c
index 777bc1883870..fed3d29f9eb3 100644
--- a/net/ipv4/ip_tunnel_core.c
+++ b/net/ipv4/ip_tunnel_core.c
@@ -63,7 +63,6 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
63 int pkt_len = skb->len - skb_inner_network_offset(skb); 63 int pkt_len = skb->len - skb_inner_network_offset(skb);
64 struct net *net = dev_net(rt->dst.dev); 64 struct net *net = dev_net(rt->dst.dev);
65 struct net_device *dev = skb->dev; 65 struct net_device *dev = skb->dev;
66 int skb_iif = skb->skb_iif;
67 struct iphdr *iph; 66 struct iphdr *iph;
68 int err; 67 int err;
69 68
@@ -73,16 +72,6 @@ void iptunnel_xmit(struct sock *sk, struct rtable *rt, struct sk_buff *skb,
73 skb_dst_set(skb, &rt->dst); 72 skb_dst_set(skb, &rt->dst);
74 memset(IPCB(skb), 0, sizeof(*IPCB(skb))); 73 memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
75 74
76 if (skb_iif && !(df & htons(IP_DF))) {
77 /* Arrived from an ingress interface, got encapsulated, with
78 * fragmentation of encapulating frames allowed.
79 * If skb is gso, the resulting encapsulated network segments
80 * may exceed dst mtu.
81 * Allow IP Fragmentation of segments.
82 */
83 IPCB(skb)->flags |= IPSKB_FRAG_SEGS;
84 }
85
86 /* Push down and install the IP header. */ 75 /* Push down and install the IP header. */
87 skb_push(skb, sizeof(struct iphdr)); 76 skb_push(skb, sizeof(struct iphdr));
88 skb_reset_network_header(skb); 77 skb_reset_network_header(skb);
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c
index 5f006e13de56..27089f5ebbb1 100644
--- a/net/ipv4/ipmr.c
+++ b/net/ipv4/ipmr.c
@@ -1749,7 +1749,7 @@ static void ipmr_queue_xmit(struct net *net, struct mr_table *mrt,
1749 vif->dev->stats.tx_bytes += skb->len; 1749 vif->dev->stats.tx_bytes += skb->len;
1750 } 1750 }
1751 1751
1752 IPCB(skb)->flags |= IPSKB_FORWARDED | IPSKB_FRAG_SEGS; 1752 IPCB(skb)->flags |= IPSKB_FORWARDED;
1753 1753
1754 /* RFC1584 teaches, that DVMRP/PIM router must deliver packets locally 1754 /* RFC1584 teaches, that DVMRP/PIM router must deliver packets locally
1755 * not only before forwarding, but after forwarding on all output 1755 * not only before forwarding, but after forwarding on all output
diff --git a/net/ipv4/netfilter.c b/net/ipv4/netfilter.c
index c3776ff6749f..b3cc1335adbc 100644
--- a/net/ipv4/netfilter.c
+++ b/net/ipv4/netfilter.c
@@ -24,10 +24,11 @@ int ip_route_me_harder(struct net *net, struct sk_buff *skb, unsigned int addr_t
24 struct flowi4 fl4 = {}; 24 struct flowi4 fl4 = {};
25 __be32 saddr = iph->saddr; 25 __be32 saddr = iph->saddr;
26 __u8 flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : 0; 26 __u8 flags = skb->sk ? inet_sk_flowi_flags(skb->sk) : 0;
27 struct net_device *dev = skb_dst(skb)->dev;
27 unsigned int hh_len; 28 unsigned int hh_len;
28 29
29 if (addr_type == RTN_UNSPEC) 30 if (addr_type == RTN_UNSPEC)
30 addr_type = inet_addr_type(net, saddr); 31 addr_type = inet_addr_type_dev_table(net, dev, saddr);
31 if (addr_type == RTN_LOCAL || addr_type == RTN_UNICAST) 32 if (addr_type == RTN_LOCAL || addr_type == RTN_UNICAST)
32 flags |= FLOWI_FLAG_ANYSRC; 33 flags |= FLOWI_FLAG_ANYSRC;
33 else 34 else
@@ -40,6 +41,8 @@ int ip_route_me_harder(struct net *net, struct sk_buff *skb, unsigned int addr_t
40 fl4.saddr = saddr; 41 fl4.saddr = saddr;
41 fl4.flowi4_tos = RT_TOS(iph->tos); 42 fl4.flowi4_tos = RT_TOS(iph->tos);
42 fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0; 43 fl4.flowi4_oif = skb->sk ? skb->sk->sk_bound_dev_if : 0;
44 if (!fl4.flowi4_oif)
45 fl4.flowi4_oif = l3mdev_master_ifindex(dev);
43 fl4.flowi4_mark = skb->mark; 46 fl4.flowi4_mark = skb->mark;
44 fl4.flowi4_flags = flags; 47 fl4.flowi4_flags = flags;
45 rt = ip_route_output_key(net, &fl4); 48 rt = ip_route_output_key(net, &fl4);
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
index b31df597fd37..697538464e6e 100644
--- a/net/ipv4/netfilter/arp_tables.c
+++ b/net/ipv4/netfilter/arp_tables.c
@@ -1201,8 +1201,8 @@ static int translate_compat_table(struct xt_table_info **pinfo,
1201 1201
1202 newinfo->number = compatr->num_entries; 1202 newinfo->number = compatr->num_entries;
1203 for (i = 0; i < NF_ARP_NUMHOOKS; i++) { 1203 for (i = 0; i < NF_ARP_NUMHOOKS; i++) {
1204 newinfo->hook_entry[i] = info->hook_entry[i]; 1204 newinfo->hook_entry[i] = compatr->hook_entry[i];
1205 newinfo->underflow[i] = info->underflow[i]; 1205 newinfo->underflow[i] = compatr->underflow[i];
1206 } 1206 }
1207 entry1 = newinfo->entries; 1207 entry1 = newinfo->entries;
1208 pos = entry1; 1208 pos = entry1;
diff --git a/net/ipv4/netfilter/nft_dup_ipv4.c b/net/ipv4/netfilter/nft_dup_ipv4.c
index bf855e64fc45..0c01a270bf9f 100644
--- a/net/ipv4/netfilter/nft_dup_ipv4.c
+++ b/net/ipv4/netfilter/nft_dup_ipv4.c
@@ -28,7 +28,7 @@ static void nft_dup_ipv4_eval(const struct nft_expr *expr,
28 struct in_addr gw = { 28 struct in_addr gw = {
29 .s_addr = (__force __be32)regs->data[priv->sreg_addr], 29 .s_addr = (__force __be32)regs->data[priv->sreg_addr],
30 }; 30 };
31 int oif = regs->data[priv->sreg_dev]; 31 int oif = priv->sreg_dev ? regs->data[priv->sreg_dev] : -1;
32 32
33 nf_dup_ipv4(pkt->net, pkt->skb, pkt->hook, &gw, oif); 33 nf_dup_ipv4(pkt->net, pkt->skb, pkt->hook, &gw, oif);
34} 34}
@@ -59,7 +59,9 @@ static int nft_dup_ipv4_dump(struct sk_buff *skb, const struct nft_expr *expr)
59{ 59{
60 struct nft_dup_ipv4 *priv = nft_expr_priv(expr); 60 struct nft_dup_ipv4 *priv = nft_expr_priv(expr);
61 61
62 if (nft_dump_register(skb, NFTA_DUP_SREG_ADDR, priv->sreg_addr) || 62 if (nft_dump_register(skb, NFTA_DUP_SREG_ADDR, priv->sreg_addr))
63 goto nla_put_failure;
64 if (priv->sreg_dev &&
63 nft_dump_register(skb, NFTA_DUP_SREG_DEV, priv->sreg_dev)) 65 nft_dump_register(skb, NFTA_DUP_SREG_DEV, priv->sreg_dev))
64 goto nla_put_failure; 66 goto nla_put_failure;
65 67
diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c
index 205e2000d395..96b8e2b95731 100644
--- a/net/ipv4/ping.c
+++ b/net/ipv4/ping.c
@@ -657,6 +657,10 @@ int ping_common_sendmsg(int family, struct msghdr *msg, size_t len,
657 if (len > 0xFFFF) 657 if (len > 0xFFFF)
658 return -EMSGSIZE; 658 return -EMSGSIZE;
659 659
660 /* Must have at least a full ICMP header. */
661 if (len < icmph_len)
662 return -EINVAL;
663
660 /* 664 /*
661 * Check the flags. 665 * Check the flags.
662 */ 666 */
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index 62d4d90c1389..2a57566e6e91 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -753,7 +753,9 @@ static void __ip_do_redirect(struct rtable *rt, struct sk_buff *skb, struct flow
753 goto reject_redirect; 753 goto reject_redirect;
754 } 754 }
755 755
756 n = ipv4_neigh_lookup(&rt->dst, NULL, &new_gw); 756 n = __ipv4_neigh_lookup(rt->dst.dev, new_gw);
757 if (!n)
758 n = neigh_create(&arp_tbl, &new_gw, rt->dst.dev);
757 if (!IS_ERR(n)) { 759 if (!IS_ERR(n)) {
758 if (!(n->nud_state & NUD_VALID)) { 760 if (!(n->nud_state & NUD_VALID)) {
759 neigh_event_send(n, NULL); 761 neigh_event_send(n, NULL);
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 3251fe71f39f..814af89c1bd3 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -1164,7 +1164,7 @@ restart:
1164 1164
1165 err = -EPIPE; 1165 err = -EPIPE;
1166 if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN)) 1166 if (sk->sk_err || (sk->sk_shutdown & SEND_SHUTDOWN))
1167 goto out_err; 1167 goto do_error;
1168 1168
1169 sg = !!(sk->sk_route_caps & NETIF_F_SG); 1169 sg = !!(sk->sk_route_caps & NETIF_F_SG);
1170 1170
@@ -1241,7 +1241,7 @@ new_segment:
1241 1241
1242 if (!skb_can_coalesce(skb, i, pfrag->page, 1242 if (!skb_can_coalesce(skb, i, pfrag->page,
1243 pfrag->offset)) { 1243 pfrag->offset)) {
1244 if (i == sysctl_max_skb_frags || !sg) { 1244 if (i >= sysctl_max_skb_frags || !sg) {
1245 tcp_mark_push(tp, skb); 1245 tcp_mark_push(tp, skb);
1246 goto new_segment; 1246 goto new_segment;
1247 } 1247 }
diff --git a/net/ipv4/tcp_cong.c b/net/ipv4/tcp_cong.c
index 1294af4e0127..f9038d6b109e 100644
--- a/net/ipv4/tcp_cong.c
+++ b/net/ipv4/tcp_cong.c
@@ -200,8 +200,10 @@ static void tcp_reinit_congestion_control(struct sock *sk,
200 icsk->icsk_ca_ops = ca; 200 icsk->icsk_ca_ops = ca;
201 icsk->icsk_ca_setsockopt = 1; 201 icsk->icsk_ca_setsockopt = 1;
202 202
203 if (sk->sk_state != TCP_CLOSE) 203 if (sk->sk_state != TCP_CLOSE) {
204 memset(icsk->icsk_ca_priv, 0, sizeof(icsk->icsk_ca_priv));
204 tcp_init_congestion_control(sk); 205 tcp_init_congestion_control(sk);
206 }
205} 207}
206 208
207/* Manage refcounts on socket close. */ 209/* Manage refcounts on socket close. */
diff --git a/net/ipv4/tcp_dctcp.c b/net/ipv4/tcp_dctcp.c
index 10d728b6804c..ab37c6775630 100644
--- a/net/ipv4/tcp_dctcp.c
+++ b/net/ipv4/tcp_dctcp.c
@@ -56,6 +56,7 @@ struct dctcp {
56 u32 next_seq; 56 u32 next_seq;
57 u32 ce_state; 57 u32 ce_state;
58 u32 delayed_ack_reserved; 58 u32 delayed_ack_reserved;
59 u32 loss_cwnd;
59}; 60};
60 61
61static unsigned int dctcp_shift_g __read_mostly = 4; /* g = 1/2^4 */ 62static unsigned int dctcp_shift_g __read_mostly = 4; /* g = 1/2^4 */
@@ -96,6 +97,7 @@ static void dctcp_init(struct sock *sk)
96 ca->dctcp_alpha = min(dctcp_alpha_on_init, DCTCP_MAX_ALPHA); 97 ca->dctcp_alpha = min(dctcp_alpha_on_init, DCTCP_MAX_ALPHA);
97 98
98 ca->delayed_ack_reserved = 0; 99 ca->delayed_ack_reserved = 0;
100 ca->loss_cwnd = 0;
99 ca->ce_state = 0; 101 ca->ce_state = 0;
100 102
101 dctcp_reset(tp, ca); 103 dctcp_reset(tp, ca);
@@ -111,9 +113,10 @@ static void dctcp_init(struct sock *sk)
111 113
112static u32 dctcp_ssthresh(struct sock *sk) 114static u32 dctcp_ssthresh(struct sock *sk)
113{ 115{
114 const struct dctcp *ca = inet_csk_ca(sk); 116 struct dctcp *ca = inet_csk_ca(sk);
115 struct tcp_sock *tp = tcp_sk(sk); 117 struct tcp_sock *tp = tcp_sk(sk);
116 118
119 ca->loss_cwnd = tp->snd_cwnd;
117 return max(tp->snd_cwnd - ((tp->snd_cwnd * ca->dctcp_alpha) >> 11U), 2U); 120 return max(tp->snd_cwnd - ((tp->snd_cwnd * ca->dctcp_alpha) >> 11U), 2U);
118} 121}
119 122
@@ -308,12 +311,20 @@ static size_t dctcp_get_info(struct sock *sk, u32 ext, int *attr,
308 return 0; 311 return 0;
309} 312}
310 313
314static u32 dctcp_cwnd_undo(struct sock *sk)
315{
316 const struct dctcp *ca = inet_csk_ca(sk);
317
318 return max(tcp_sk(sk)->snd_cwnd, ca->loss_cwnd);
319}
320
311static struct tcp_congestion_ops dctcp __read_mostly = { 321static struct tcp_congestion_ops dctcp __read_mostly = {
312 .init = dctcp_init, 322 .init = dctcp_init,
313 .in_ack_event = dctcp_update_alpha, 323 .in_ack_event = dctcp_update_alpha,
314 .cwnd_event = dctcp_cwnd_event, 324 .cwnd_event = dctcp_cwnd_event,
315 .ssthresh = dctcp_ssthresh, 325 .ssthresh = dctcp_ssthresh,
316 .cong_avoid = tcp_reno_cong_avoid, 326 .cong_avoid = tcp_reno_cong_avoid,
327 .undo_cwnd = dctcp_cwnd_undo,
317 .set_state = dctcp_state, 328 .set_state = dctcp_state,
318 .get_info = dctcp_get_info, 329 .get_info = dctcp_get_info,
319 .flags = TCP_CONG_NEEDS_ECN, 330 .flags = TCP_CONG_NEEDS_ECN,
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
index a27b9c0e27c0..c71d49ce0c93 100644
--- a/net/ipv4/tcp_input.c
+++ b/net/ipv4/tcp_input.c
@@ -128,6 +128,23 @@ int sysctl_tcp_invalid_ratelimit __read_mostly = HZ/2;
128#define REXMIT_LOST 1 /* retransmit packets marked lost */ 128#define REXMIT_LOST 1 /* retransmit packets marked lost */
129#define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */ 129#define REXMIT_NEW 2 /* FRTO-style transmit of unsent/new packets */
130 130
131static void tcp_gro_dev_warn(struct sock *sk, const struct sk_buff *skb)
132{
133 static bool __once __read_mostly;
134
135 if (!__once) {
136 struct net_device *dev;
137
138 __once = true;
139
140 rcu_read_lock();
141 dev = dev_get_by_index_rcu(sock_net(sk), skb->skb_iif);
142 pr_warn("%s: Driver has suspect GRO implementation, TCP performance may be compromised.\n",
143 dev ? dev->name : "Unknown driver");
144 rcu_read_unlock();
145 }
146}
147
131/* Adapt the MSS value used to make delayed ack decision to the 148/* Adapt the MSS value used to make delayed ack decision to the
132 * real world. 149 * real world.
133 */ 150 */
@@ -144,7 +161,10 @@ static void tcp_measure_rcv_mss(struct sock *sk, const struct sk_buff *skb)
144 */ 161 */
145 len = skb_shinfo(skb)->gso_size ? : skb->len; 162 len = skb_shinfo(skb)->gso_size ? : skb->len;
146 if (len >= icsk->icsk_ack.rcv_mss) { 163 if (len >= icsk->icsk_ack.rcv_mss) {
147 icsk->icsk_ack.rcv_mss = len; 164 icsk->icsk_ack.rcv_mss = min_t(unsigned int, len,
165 tcp_sk(sk)->advmss);
166 if (unlikely(icsk->icsk_ack.rcv_mss != len))
167 tcp_gro_dev_warn(sk, skb);
148 } else { 168 } else {
149 /* Otherwise, we make more careful check taking into account, 169 /* Otherwise, we make more careful check taking into account,
150 * that SACKs block is variable. 170 * that SACKs block is variable.
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 61b7be303eec..2259114c7242 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1564,6 +1564,21 @@ bool tcp_add_backlog(struct sock *sk, struct sk_buff *skb)
1564} 1564}
1565EXPORT_SYMBOL(tcp_add_backlog); 1565EXPORT_SYMBOL(tcp_add_backlog);
1566 1566
1567int tcp_filter(struct sock *sk, struct sk_buff *skb)
1568{
1569 struct tcphdr *th = (struct tcphdr *)skb->data;
1570 unsigned int eaten = skb->len;
1571 int err;
1572
1573 err = sk_filter_trim_cap(sk, skb, th->doff * 4);
1574 if (!err) {
1575 eaten -= skb->len;
1576 TCP_SKB_CB(skb)->end_seq -= eaten;
1577 }
1578 return err;
1579}
1580EXPORT_SYMBOL(tcp_filter);
1581
1567/* 1582/*
1568 * From tcp_input.c 1583 * From tcp_input.c
1569 */ 1584 */
@@ -1676,8 +1691,10 @@ process:
1676 1691
1677 nf_reset(skb); 1692 nf_reset(skb);
1678 1693
1679 if (sk_filter(sk, skb)) 1694 if (tcp_filter(sk, skb))
1680 goto discard_and_relse; 1695 goto discard_and_relse;
1696 th = (const struct tcphdr *)skb->data;
1697 iph = ip_hdr(skb);
1681 1698
1682 skb->dev = NULL; 1699 skb->dev = NULL;
1683 1700
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index d123d68f4d1d..5bab6c3f7a2f 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -1455,7 +1455,7 @@ static void udp_v4_rehash(struct sock *sk)
1455 udp_lib_rehash(sk, new_hash); 1455 udp_lib_rehash(sk, new_hash);
1456} 1456}
1457 1457
1458static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) 1458int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
1459{ 1459{
1460 int rc; 1460 int rc;
1461 1461
@@ -1652,10 +1652,10 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
1652 1652
1653 if (use_hash2) { 1653 if (use_hash2) {
1654 hash2_any = udp4_portaddr_hash(net, htonl(INADDR_ANY), hnum) & 1654 hash2_any = udp4_portaddr_hash(net, htonl(INADDR_ANY), hnum) &
1655 udp_table.mask; 1655 udptable->mask;
1656 hash2 = udp4_portaddr_hash(net, daddr, hnum) & udp_table.mask; 1656 hash2 = udp4_portaddr_hash(net, daddr, hnum) & udptable->mask;
1657start_lookup: 1657start_lookup:
1658 hslot = &udp_table.hash2[hash2]; 1658 hslot = &udptable->hash2[hash2];
1659 offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node); 1659 offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node);
1660 } 1660 }
1661 1661
diff --git a/net/ipv4/udp_impl.h b/net/ipv4/udp_impl.h
index 7e0fe4bdd967..feb50a16398d 100644
--- a/net/ipv4/udp_impl.h
+++ b/net/ipv4/udp_impl.h
@@ -25,7 +25,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
25 int flags, int *addr_len); 25 int flags, int *addr_len);
26int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size, 26int udp_sendpage(struct sock *sk, struct page *page, int offset, size_t size,
27 int flags); 27 int flags);
28int udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); 28int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
29void udp_destroy_sock(struct sock *sk); 29void udp_destroy_sock(struct sock *sk);
30 30
31#ifdef CONFIG_PROC_FS 31#ifdef CONFIG_PROC_FS
diff --git a/net/ipv4/udplite.c b/net/ipv4/udplite.c
index af817158d830..ff450c2aad9b 100644
--- a/net/ipv4/udplite.c
+++ b/net/ipv4/udplite.c
@@ -50,7 +50,7 @@ struct proto udplite_prot = {
50 .sendmsg = udp_sendmsg, 50 .sendmsg = udp_sendmsg,
51 .recvmsg = udp_recvmsg, 51 .recvmsg = udp_recvmsg,
52 .sendpage = udp_sendpage, 52 .sendpage = udp_sendpage,
53 .backlog_rcv = udp_queue_rcv_skb, 53 .backlog_rcv = __udp_queue_rcv_skb,
54 .hash = udp_lib_hash, 54 .hash = udp_lib_hash,
55 .unhash = udp_lib_unhash, 55 .unhash = udp_lib_unhash,
56 .get_port = udp_v4_get_port, 56 .get_port = udp_v4_get_port,
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 060dd9922018..4bc5ba3ae452 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -183,7 +183,7 @@ static struct rt6_info *addrconf_get_prefix_route(const struct in6_addr *pfx,
183 183
184static void addrconf_dad_start(struct inet6_ifaddr *ifp); 184static void addrconf_dad_start(struct inet6_ifaddr *ifp);
185static void addrconf_dad_work(struct work_struct *w); 185static void addrconf_dad_work(struct work_struct *w);
186static void addrconf_dad_completed(struct inet6_ifaddr *ifp); 186static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id);
187static void addrconf_dad_run(struct inet6_dev *idev); 187static void addrconf_dad_run(struct inet6_dev *idev);
188static void addrconf_rs_timer(unsigned long data); 188static void addrconf_rs_timer(unsigned long data);
189static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa); 189static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
@@ -2898,6 +2898,7 @@ static void add_addr(struct inet6_dev *idev, const struct in6_addr *addr,
2898 spin_lock_bh(&ifp->lock); 2898 spin_lock_bh(&ifp->lock);
2899 ifp->flags &= ~IFA_F_TENTATIVE; 2899 ifp->flags &= ~IFA_F_TENTATIVE;
2900 spin_unlock_bh(&ifp->lock); 2900 spin_unlock_bh(&ifp->lock);
2901 rt_genid_bump_ipv6(dev_net(idev->dev));
2901 ipv6_ifa_notify(RTM_NEWADDR, ifp); 2902 ipv6_ifa_notify(RTM_NEWADDR, ifp);
2902 in6_ifa_put(ifp); 2903 in6_ifa_put(ifp);
2903 } 2904 }
@@ -3740,7 +3741,7 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
3740{ 3741{
3741 struct inet6_dev *idev = ifp->idev; 3742 struct inet6_dev *idev = ifp->idev;
3742 struct net_device *dev = idev->dev; 3743 struct net_device *dev = idev->dev;
3743 bool notify = false; 3744 bool bump_id, notify = false;
3744 3745
3745 addrconf_join_solict(dev, &ifp->addr); 3746 addrconf_join_solict(dev, &ifp->addr);
3746 3747
@@ -3755,11 +3756,12 @@ static void addrconf_dad_begin(struct inet6_ifaddr *ifp)
3755 idev->cnf.accept_dad < 1 || 3756 idev->cnf.accept_dad < 1 ||
3756 !(ifp->flags&IFA_F_TENTATIVE) || 3757 !(ifp->flags&IFA_F_TENTATIVE) ||
3757 ifp->flags & IFA_F_NODAD) { 3758 ifp->flags & IFA_F_NODAD) {
3759 bump_id = ifp->flags & IFA_F_TENTATIVE;
3758 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); 3760 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
3759 spin_unlock(&ifp->lock); 3761 spin_unlock(&ifp->lock);
3760 read_unlock_bh(&idev->lock); 3762 read_unlock_bh(&idev->lock);
3761 3763
3762 addrconf_dad_completed(ifp); 3764 addrconf_dad_completed(ifp, bump_id);
3763 return; 3765 return;
3764 } 3766 }
3765 3767
@@ -3819,8 +3821,8 @@ static void addrconf_dad_work(struct work_struct *w)
3819 struct inet6_ifaddr, 3821 struct inet6_ifaddr,
3820 dad_work); 3822 dad_work);
3821 struct inet6_dev *idev = ifp->idev; 3823 struct inet6_dev *idev = ifp->idev;
3824 bool bump_id, disable_ipv6 = false;
3822 struct in6_addr mcaddr; 3825 struct in6_addr mcaddr;
3823 bool disable_ipv6 = false;
3824 3826
3825 enum { 3827 enum {
3826 DAD_PROCESS, 3828 DAD_PROCESS,
@@ -3890,11 +3892,12 @@ static void addrconf_dad_work(struct work_struct *w)
3890 * DAD was successful 3892 * DAD was successful
3891 */ 3893 */
3892 3894
3895 bump_id = ifp->flags & IFA_F_TENTATIVE;
3893 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED); 3896 ifp->flags &= ~(IFA_F_TENTATIVE|IFA_F_OPTIMISTIC|IFA_F_DADFAILED);
3894 spin_unlock(&ifp->lock); 3897 spin_unlock(&ifp->lock);
3895 write_unlock_bh(&idev->lock); 3898 write_unlock_bh(&idev->lock);
3896 3899
3897 addrconf_dad_completed(ifp); 3900 addrconf_dad_completed(ifp, bump_id);
3898 3901
3899 goto out; 3902 goto out;
3900 } 3903 }
@@ -3931,7 +3934,7 @@ static bool ipv6_lonely_lladdr(struct inet6_ifaddr *ifp)
3931 return true; 3934 return true;
3932} 3935}
3933 3936
3934static void addrconf_dad_completed(struct inet6_ifaddr *ifp) 3937static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id)
3935{ 3938{
3936 struct net_device *dev = ifp->idev->dev; 3939 struct net_device *dev = ifp->idev->dev;
3937 struct in6_addr lladdr; 3940 struct in6_addr lladdr;
@@ -3983,6 +3986,9 @@ static void addrconf_dad_completed(struct inet6_ifaddr *ifp)
3983 spin_unlock(&ifp->lock); 3986 spin_unlock(&ifp->lock);
3984 write_unlock_bh(&ifp->idev->lock); 3987 write_unlock_bh(&ifp->idev->lock);
3985 } 3988 }
3989
3990 if (bump_id)
3991 rt_genid_bump_ipv6(dev_net(dev));
3986} 3992}
3987 3993
3988static void addrconf_dad_run(struct inet6_dev *idev) 3994static void addrconf_dad_run(struct inet6_dev *idev)
diff --git a/net/ipv6/datagram.c b/net/ipv6/datagram.c
index 37874e2f30ed..ccf40550c475 100644
--- a/net/ipv6/datagram.c
+++ b/net/ipv6/datagram.c
@@ -139,7 +139,8 @@ void ip6_datagram_release_cb(struct sock *sk)
139} 139}
140EXPORT_SYMBOL_GPL(ip6_datagram_release_cb); 140EXPORT_SYMBOL_GPL(ip6_datagram_release_cb);
141 141
142static int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) 142int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr,
143 int addr_len)
143{ 144{
144 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; 145 struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
145 struct inet_sock *inet = inet_sk(sk); 146 struct inet_sock *inet = inet_sk(sk);
@@ -252,6 +253,7 @@ ipv4_connected:
252out: 253out:
253 return err; 254 return err;
254} 255}
256EXPORT_SYMBOL_GPL(__ip6_datagram_connect);
255 257
256int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) 258int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
257{ 259{
diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
index 060a60b2f8a6..111ba55fd512 100644
--- a/net/ipv6/esp6.c
+++ b/net/ipv6/esp6.c
@@ -418,7 +418,7 @@ static int esp6_input(struct xfrm_state *x, struct sk_buff *skb)
418 esph = (void *)skb_push(skb, 4); 418 esph = (void *)skb_push(skb, 4);
419 *seqhi = esph->spi; 419 *seqhi = esph->spi;
420 esph->spi = esph->seq_no; 420 esph->spi = esph->seq_no;
421 esph->seq_no = htonl(XFRM_SKB_CB(skb)->seq.input.hi); 421 esph->seq_no = XFRM_SKB_CB(skb)->seq.input.hi;
422 aead_request_set_callback(req, 0, esp_input_done_esn, skb); 422 aead_request_set_callback(req, 0, esp_input_done_esn, skb);
423 } 423 }
424 424
diff --git a/net/ipv6/icmp.c b/net/ipv6/icmp.c
index bd59c343d35f..2772004ba5a1 100644
--- a/net/ipv6/icmp.c
+++ b/net/ipv6/icmp.c
@@ -447,8 +447,10 @@ static void icmp6_send(struct sk_buff *skb, u8 type, u8 code, __u32 info,
447 447
448 if (__ipv6_addr_needs_scope_id(addr_type)) 448 if (__ipv6_addr_needs_scope_id(addr_type))
449 iif = skb->dev->ifindex; 449 iif = skb->dev->ifindex;
450 else 450 else {
451 iif = l3mdev_master_ifindex(skb->dev); 451 dst = skb_dst(skb);
452 iif = l3mdev_master_ifindex(dst ? dst->dev : skb->dev);
453 }
452 454
453 /* 455 /*
454 * Must not send error if the source does not uniquely 456 * Must not send error if the source does not uniquely
diff --git a/net/ipv6/ip6_offload.c b/net/ipv6/ip6_offload.c
index 1fcf61f1cbc3..89c59e656f44 100644
--- a/net/ipv6/ip6_offload.c
+++ b/net/ipv6/ip6_offload.c
@@ -99,7 +99,7 @@ static struct sk_buff *ipv6_gso_segment(struct sk_buff *skb,
99 segs = ops->callbacks.gso_segment(skb, features); 99 segs = ops->callbacks.gso_segment(skb, features);
100 } 100 }
101 101
102 if (IS_ERR(segs)) 102 if (IS_ERR_OR_NULL(segs))
103 goto out; 103 goto out;
104 104
105 gso_partial = !!(skb_shinfo(segs)->gso_type & SKB_GSO_PARTIAL); 105 gso_partial = !!(skb_shinfo(segs)->gso_type & SKB_GSO_PARTIAL);
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index 6001e781164e..59eb4ed99ce8 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -1366,7 +1366,7 @@ emsgsize:
1366 if (((length > mtu) || 1366 if (((length > mtu) ||
1367 (skb && skb_is_gso(skb))) && 1367 (skb && skb_is_gso(skb))) &&
1368 (sk->sk_protocol == IPPROTO_UDP) && 1368 (sk->sk_protocol == IPPROTO_UDP) &&
1369 (rt->dst.dev->features & NETIF_F_UFO) && 1369 (rt->dst.dev->features & NETIF_F_UFO) && !rt->dst.header_len &&
1370 (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk)) { 1370 (sk->sk_type == SOCK_DGRAM) && !udp_get_no_check6_tx(sk)) {
1371 err = ip6_ufo_append_data(sk, queue, getfrag, from, length, 1371 err = ip6_ufo_append_data(sk, queue, getfrag, from, length,
1372 hh_len, fragheaderlen, exthdrlen, 1372 hh_len, fragheaderlen, exthdrlen,
diff --git a/net/ipv6/ip6_tunnel.c b/net/ipv6/ip6_tunnel.c
index 87784560dc46..d76674efe523 100644
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -1034,6 +1034,7 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
1034 int mtu; 1034 int mtu;
1035 unsigned int psh_hlen = sizeof(struct ipv6hdr) + t->encap_hlen; 1035 unsigned int psh_hlen = sizeof(struct ipv6hdr) + t->encap_hlen;
1036 unsigned int max_headroom = psh_hlen; 1036 unsigned int max_headroom = psh_hlen;
1037 bool use_cache = false;
1037 u8 hop_limit; 1038 u8 hop_limit;
1038 int err = -1; 1039 int err = -1;
1039 1040
@@ -1066,7 +1067,15 @@ int ip6_tnl_xmit(struct sk_buff *skb, struct net_device *dev, __u8 dsfield,
1066 1067
1067 memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr)); 1068 memcpy(&fl6->daddr, addr6, sizeof(fl6->daddr));
1068 neigh_release(neigh); 1069 neigh_release(neigh);
1069 } else if (!fl6->flowi6_mark) 1070 } else if (!(t->parms.flags &
1071 (IP6_TNL_F_USE_ORIG_TCLASS | IP6_TNL_F_USE_ORIG_FWMARK))) {
1072 /* enable the cache only only if the routing decision does
1073 * not depend on the current inner header value
1074 */
1075 use_cache = true;
1076 }
1077
1078 if (use_cache)
1070 dst = dst_cache_get(&t->dst_cache); 1079 dst = dst_cache_get(&t->dst_cache);
1071 1080
1072 if (!ip6_tnl_xmit_ctl(t, &fl6->saddr, &fl6->daddr)) 1081 if (!ip6_tnl_xmit_ctl(t, &fl6->saddr, &fl6->daddr))
@@ -1150,7 +1159,7 @@ route_lookup:
1150 if (t->encap.type != TUNNEL_ENCAP_NONE) 1159 if (t->encap.type != TUNNEL_ENCAP_NONE)
1151 goto tx_err_dst_release; 1160 goto tx_err_dst_release;
1152 } else { 1161 } else {
1153 if (!fl6->flowi6_mark && ndst) 1162 if (use_cache && ndst)
1154 dst_cache_set_ip6(&t->dst_cache, ndst, &fl6->saddr); 1163 dst_cache_set_ip6(&t->dst_cache, ndst, &fl6->saddr);
1155 } 1164 }
1156 skb_dst_set(skb, dst); 1165 skb_dst_set(skb, dst);
@@ -1172,7 +1181,6 @@ route_lookup:
1172 if (err) 1181 if (err)
1173 return err; 1182 return err;
1174 1183
1175 skb->protocol = htons(ETH_P_IPV6);
1176 skb_push(skb, sizeof(struct ipv6hdr)); 1184 skb_push(skb, sizeof(struct ipv6hdr));
1177 skb_reset_network_header(skb); 1185 skb_reset_network_header(skb);
1178 ipv6h = ipv6_hdr(skb); 1186 ipv6h = ipv6_hdr(skb);
diff --git a/net/ipv6/ip6_udp_tunnel.c b/net/ipv6/ip6_udp_tunnel.c
index a7520528ecd2..b283f293ee4a 100644
--- a/net/ipv6/ip6_udp_tunnel.c
+++ b/net/ipv6/ip6_udp_tunnel.c
@@ -88,9 +88,6 @@ int udp_tunnel6_xmit_skb(struct dst_entry *dst, struct sock *sk,
88 88
89 uh->len = htons(skb->len); 89 uh->len = htons(skb->len);
90 90
91 memset(&(IPCB(skb)->opt), 0, sizeof(IPCB(skb)->opt));
92 IPCB(skb)->flags &= ~(IPSKB_XFRM_TUNNEL_SIZE | IPSKB_XFRM_TRANSFORMED
93 | IPSKB_REROUTED);
94 skb_dst_set(skb, dst); 91 skb_dst_set(skb, dst);
95 92
96 udp6_set_csum(nocheck, skb, saddr, daddr, skb->len); 93 udp6_set_csum(nocheck, skb, saddr, daddr, skb->len);
diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
index 8a02ca8a11af..c299c1e2bbf0 100644
--- a/net/ipv6/ip6_vti.c
+++ b/net/ipv6/ip6_vti.c
@@ -1138,6 +1138,33 @@ static struct xfrm6_protocol vti_ipcomp6_protocol __read_mostly = {
1138 .priority = 100, 1138 .priority = 100,
1139}; 1139};
1140 1140
1141static bool is_vti6_tunnel(const struct net_device *dev)
1142{
1143 return dev->netdev_ops == &vti6_netdev_ops;
1144}
1145
1146static int vti6_device_event(struct notifier_block *unused,
1147 unsigned long event, void *ptr)
1148{
1149 struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1150 struct ip6_tnl *t = netdev_priv(dev);
1151
1152 if (!is_vti6_tunnel(dev))
1153 return NOTIFY_DONE;
1154
1155 switch (event) {
1156 case NETDEV_DOWN:
1157 if (!net_eq(t->net, dev_net(dev)))
1158 xfrm_garbage_collect(t->net);
1159 break;
1160 }
1161 return NOTIFY_DONE;
1162}
1163
1164static struct notifier_block vti6_notifier_block __read_mostly = {
1165 .notifier_call = vti6_device_event,
1166};
1167
1141/** 1168/**
1142 * vti6_tunnel_init - register protocol and reserve needed resources 1169 * vti6_tunnel_init - register protocol and reserve needed resources
1143 * 1170 *
@@ -1148,6 +1175,8 @@ static int __init vti6_tunnel_init(void)
1148 const char *msg; 1175 const char *msg;
1149 int err; 1176 int err;
1150 1177
1178 register_netdevice_notifier(&vti6_notifier_block);
1179
1151 msg = "tunnel device"; 1180 msg = "tunnel device";
1152 err = register_pernet_device(&vti6_net_ops); 1181 err = register_pernet_device(&vti6_net_ops);
1153 if (err < 0) 1182 if (err < 0)
@@ -1180,6 +1209,7 @@ xfrm_proto_ah_failed:
1180xfrm_proto_esp_failed: 1209xfrm_proto_esp_failed:
1181 unregister_pernet_device(&vti6_net_ops); 1210 unregister_pernet_device(&vti6_net_ops);
1182pernet_dev_failed: 1211pernet_dev_failed:
1212 unregister_netdevice_notifier(&vti6_notifier_block);
1183 pr_err("vti6 init: failed to register %s\n", msg); 1213 pr_err("vti6 init: failed to register %s\n", msg);
1184 return err; 1214 return err;
1185} 1215}
@@ -1194,6 +1224,7 @@ static void __exit vti6_tunnel_cleanup(void)
1194 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH); 1224 xfrm6_protocol_deregister(&vti_ah6_protocol, IPPROTO_AH);
1195 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP); 1225 xfrm6_protocol_deregister(&vti_esp6_protocol, IPPROTO_ESP);
1196 unregister_pernet_device(&vti6_net_ops); 1226 unregister_pernet_device(&vti6_net_ops);
1227 unregister_netdevice_notifier(&vti6_notifier_block);
1197} 1228}
1198 1229
1199module_init(vti6_tunnel_init); 1230module_init(vti6_tunnel_init);
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c
index e4347aeb2e65..9948b5ce52da 100644
--- a/net/ipv6/netfilter/nf_conntrack_reasm.c
+++ b/net/ipv6/netfilter/nf_conntrack_reasm.c
@@ -576,11 +576,11 @@ int nf_ct_frag6_gather(struct net *net, struct sk_buff *skb, u32 user)
576 /* Jumbo payload inhibits frag. header */ 576 /* Jumbo payload inhibits frag. header */
577 if (ipv6_hdr(skb)->payload_len == 0) { 577 if (ipv6_hdr(skb)->payload_len == 0) {
578 pr_debug("payload len = 0\n"); 578 pr_debug("payload len = 0\n");
579 return -EINVAL; 579 return 0;
580 } 580 }
581 581
582 if (find_prev_fhdr(skb, &prevhdr, &nhoff, &fhoff) < 0) 582 if (find_prev_fhdr(skb, &prevhdr, &nhoff, &fhoff) < 0)
583 return -EINVAL; 583 return 0;
584 584
585 if (!pskb_may_pull(skb, fhoff + sizeof(*fhdr))) 585 if (!pskb_may_pull(skb, fhoff + sizeof(*fhdr)))
586 return -ENOMEM; 586 return -ENOMEM;
diff --git a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
index f7aab5ab93a5..f06b0471f39f 100644
--- a/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
+++ b/net/ipv6/netfilter/nf_defrag_ipv6_hooks.c
@@ -69,7 +69,7 @@ static unsigned int ipv6_defrag(void *priv,
69 if (err == -EINPROGRESS) 69 if (err == -EINPROGRESS)
70 return NF_STOLEN; 70 return NF_STOLEN;
71 71
72 return NF_ACCEPT; 72 return err == 0 ? NF_ACCEPT : NF_DROP;
73} 73}
74 74
75static struct nf_hook_ops ipv6_defrag_ops[] = { 75static struct nf_hook_ops ipv6_defrag_ops[] = {
diff --git a/net/ipv6/netfilter/nf_reject_ipv6.c b/net/ipv6/netfilter/nf_reject_ipv6.c
index a5400223fd74..10090400c72f 100644
--- a/net/ipv6/netfilter/nf_reject_ipv6.c
+++ b/net/ipv6/netfilter/nf_reject_ipv6.c
@@ -156,6 +156,7 @@ void nf_send_reset6(struct net *net, struct sk_buff *oldskb, int hook)
156 fl6.daddr = oip6h->saddr; 156 fl6.daddr = oip6h->saddr;
157 fl6.fl6_sport = otcph->dest; 157 fl6.fl6_sport = otcph->dest;
158 fl6.fl6_dport = otcph->source; 158 fl6.fl6_dport = otcph->source;
159 fl6.flowi6_oif = l3mdev_master_ifindex(skb_dst(oldskb)->dev);
159 security_skb_classify_flow(oldskb, flowi6_to_flowi(&fl6)); 160 security_skb_classify_flow(oldskb, flowi6_to_flowi(&fl6));
160 dst = ip6_route_output(net, NULL, &fl6); 161 dst = ip6_route_output(net, NULL, &fl6);
161 if (dst->error) { 162 if (dst->error) {
diff --git a/net/ipv6/netfilter/nft_dup_ipv6.c b/net/ipv6/netfilter/nft_dup_ipv6.c
index 8bfd470cbe72..831f86e1ec08 100644
--- a/net/ipv6/netfilter/nft_dup_ipv6.c
+++ b/net/ipv6/netfilter/nft_dup_ipv6.c
@@ -26,7 +26,7 @@ static void nft_dup_ipv6_eval(const struct nft_expr *expr,
26{ 26{
27 struct nft_dup_ipv6 *priv = nft_expr_priv(expr); 27 struct nft_dup_ipv6 *priv = nft_expr_priv(expr);
28 struct in6_addr *gw = (struct in6_addr *)&regs->data[priv->sreg_addr]; 28 struct in6_addr *gw = (struct in6_addr *)&regs->data[priv->sreg_addr];
29 int oif = regs->data[priv->sreg_dev]; 29 int oif = priv->sreg_dev ? regs->data[priv->sreg_dev] : -1;
30 30
31 nf_dup_ipv6(pkt->net, pkt->skb, pkt->hook, gw, oif); 31 nf_dup_ipv6(pkt->net, pkt->skb, pkt->hook, gw, oif);
32} 32}
@@ -57,7 +57,9 @@ static int nft_dup_ipv6_dump(struct sk_buff *skb, const struct nft_expr *expr)
57{ 57{
58 struct nft_dup_ipv6 *priv = nft_expr_priv(expr); 58 struct nft_dup_ipv6 *priv = nft_expr_priv(expr);
59 59
60 if (nft_dump_register(skb, NFTA_DUP_SREG_ADDR, priv->sreg_addr) || 60 if (nft_dump_register(skb, NFTA_DUP_SREG_ADDR, priv->sreg_addr))
61 goto nla_put_failure;
62 if (priv->sreg_dev &&
61 nft_dump_register(skb, NFTA_DUP_SREG_DEV, priv->sreg_dev)) 63 nft_dump_register(skb, NFTA_DUP_SREG_DEV, priv->sreg_dev))
62 goto nla_put_failure; 64 goto nla_put_failure;
63 65
diff --git a/net/ipv6/output_core.c b/net/ipv6/output_core.c
index 7cca8ac66fe9..cd4252346a32 100644
--- a/net/ipv6/output_core.c
+++ b/net/ipv6/output_core.c
@@ -155,6 +155,8 @@ int __ip6_local_out(struct net *net, struct sock *sk, struct sk_buff *skb)
155 if (unlikely(!skb)) 155 if (unlikely(!skb))
156 return 0; 156 return 0;
157 157
158 skb->protocol = htons(ETH_P_IPV6);
159
158 return nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT, 160 return nf_hook(NFPROTO_IPV6, NF_INET_LOCAL_OUT,
159 net, sk, skb, NULL, skb_dst(skb)->dev, 161 net, sk, skb, NULL, skb_dst(skb)->dev,
160 dst_output); 162 dst_output);
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index 947ed1ded026..1b57e11e6e0d 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -1364,6 +1364,9 @@ static void __ip6_rt_update_pmtu(struct dst_entry *dst, const struct sock *sk,
1364 if (rt6->rt6i_flags & RTF_LOCAL) 1364 if (rt6->rt6i_flags & RTF_LOCAL)
1365 return; 1365 return;
1366 1366
1367 if (dst_metric_locked(dst, RTAX_MTU))
1368 return;
1369
1367 dst_confirm(dst); 1370 dst_confirm(dst);
1368 mtu = max_t(u32, mtu, IPV6_MIN_MTU); 1371 mtu = max_t(u32, mtu, IPV6_MIN_MTU);
1369 if (mtu >= dst_mtu(dst)) 1372 if (mtu >= dst_mtu(dst))
@@ -2758,6 +2761,7 @@ static int rt6_mtu_change_route(struct rt6_info *rt, void *p_arg)
2758 PMTU discouvery. 2761 PMTU discouvery.
2759 */ 2762 */
2760 if (rt->dst.dev == arg->dev && 2763 if (rt->dst.dev == arg->dev &&
2764 dst_metric_raw(&rt->dst, RTAX_MTU) &&
2761 !dst_metric_locked(&rt->dst, RTAX_MTU)) { 2765 !dst_metric_locked(&rt->dst, RTAX_MTU)) {
2762 if (rt->rt6i_flags & RTF_CACHE) { 2766 if (rt->rt6i_flags & RTF_CACHE) {
2763 /* For RTF_CACHE with rt6i_pmtu == 0 2767 /* For RTF_CACHE with rt6i_pmtu == 0
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
index 5a27ab4eab39..b9f1fee9a886 100644
--- a/net/ipv6/tcp_ipv6.c
+++ b/net/ipv6/tcp_ipv6.c
@@ -818,8 +818,12 @@ static void tcp_v6_send_response(const struct sock *sk, struct sk_buff *skb, u32
818 fl6.flowi6_proto = IPPROTO_TCP; 818 fl6.flowi6_proto = IPPROTO_TCP;
819 if (rt6_need_strict(&fl6.daddr) && !oif) 819 if (rt6_need_strict(&fl6.daddr) && !oif)
820 fl6.flowi6_oif = tcp_v6_iif(skb); 820 fl6.flowi6_oif = tcp_v6_iif(skb);
821 else 821 else {
822 fl6.flowi6_oif = oif ? : skb->skb_iif; 822 if (!oif && netif_index_is_l3_master(net, skb->skb_iif))
823 oif = skb->skb_iif;
824
825 fl6.flowi6_oif = oif;
826 }
823 827
824 fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark); 828 fl6.flowi6_mark = IP6_REPLY_MARK(net, skb->mark);
825 fl6.fl6_dport = t1->dest; 829 fl6.fl6_dport = t1->dest;
@@ -1225,7 +1229,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb)
1225 if (skb->protocol == htons(ETH_P_IP)) 1229 if (skb->protocol == htons(ETH_P_IP))
1226 return tcp_v4_do_rcv(sk, skb); 1230 return tcp_v4_do_rcv(sk, skb);
1227 1231
1228 if (sk_filter(sk, skb)) 1232 if (tcp_filter(sk, skb))
1229 goto discard; 1233 goto discard;
1230 1234
1231 /* 1235 /*
@@ -1453,8 +1457,10 @@ process:
1453 if (tcp_v6_inbound_md5_hash(sk, skb)) 1457 if (tcp_v6_inbound_md5_hash(sk, skb))
1454 goto discard_and_relse; 1458 goto discard_and_relse;
1455 1459
1456 if (sk_filter(sk, skb)) 1460 if (tcp_filter(sk, skb))
1457 goto discard_and_relse; 1461 goto discard_and_relse;
1462 th = (const struct tcphdr *)skb->data;
1463 hdr = ipv6_hdr(skb);
1458 1464
1459 skb->dev = NULL; 1465 skb->dev = NULL;
1460 1466
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index b2ef061e6836..e4a8000d59ad 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -514,7 +514,7 @@ out:
514 return; 514 return;
515} 515}
516 516
517static int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) 517int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
518{ 518{
519 int rc; 519 int rc;
520 520
@@ -706,10 +706,10 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
706 706
707 if (use_hash2) { 707 if (use_hash2) {
708 hash2_any = udp6_portaddr_hash(net, &in6addr_any, hnum) & 708 hash2_any = udp6_portaddr_hash(net, &in6addr_any, hnum) &
709 udp_table.mask; 709 udptable->mask;
710 hash2 = udp6_portaddr_hash(net, daddr, hnum) & udp_table.mask; 710 hash2 = udp6_portaddr_hash(net, daddr, hnum) & udptable->mask;
711start_lookup: 711start_lookup:
712 hslot = &udp_table.hash2[hash2]; 712 hslot = &udptable->hash2[hash2];
713 offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node); 713 offset = offsetof(typeof(*sk), __sk_common.skc_portaddr_node);
714 } 714 }
715 715
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h
index f6eb1ab34f4b..e78bdc76dcc3 100644
--- a/net/ipv6/udp_impl.h
+++ b/net/ipv6/udp_impl.h
@@ -26,7 +26,7 @@ int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
26int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len); 26int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
27int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock, 27int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int noblock,
28 int flags, int *addr_len); 28 int flags, int *addr_len);
29int udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb); 29int __udpv6_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
30void udpv6_destroy_sock(struct sock *sk); 30void udpv6_destroy_sock(struct sock *sk);
31 31
32#ifdef CONFIG_PROC_FS 32#ifdef CONFIG_PROC_FS
diff --git a/net/ipv6/udplite.c b/net/ipv6/udplite.c
index 47d0d2b87106..2f5101a12283 100644
--- a/net/ipv6/udplite.c
+++ b/net/ipv6/udplite.c
@@ -45,7 +45,7 @@ struct proto udplitev6_prot = {
45 .getsockopt = udpv6_getsockopt, 45 .getsockopt = udpv6_getsockopt,
46 .sendmsg = udpv6_sendmsg, 46 .sendmsg = udpv6_sendmsg,
47 .recvmsg = udpv6_recvmsg, 47 .recvmsg = udpv6_recvmsg,
48 .backlog_rcv = udpv6_queue_rcv_skb, 48 .backlog_rcv = __udpv6_queue_rcv_skb,
49 .hash = udp_lib_hash, 49 .hash = udp_lib_hash,
50 .unhash = udp_lib_unhash, 50 .unhash = udp_lib_unhash,
51 .get_port = udp_v6_get_port, 51 .get_port = udp_v6_get_port,
diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c
index fce25afb652a..8938b6ba57a0 100644
--- a/net/l2tp/l2tp_ip.c
+++ b/net/l2tp/l2tp_ip.c
@@ -61,7 +61,8 @@ static struct sock *__l2tp_ip_bind_lookup(struct net *net, __be32 laddr, int dif
61 if ((l2tp->conn_id == tunnel_id) && 61 if ((l2tp->conn_id == tunnel_id) &&
62 net_eq(sock_net(sk), net) && 62 net_eq(sock_net(sk), net) &&
63 !(inet->inet_rcv_saddr && inet->inet_rcv_saddr != laddr) && 63 !(inet->inet_rcv_saddr && inet->inet_rcv_saddr != laddr) &&
64 !(sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)) 64 (!sk->sk_bound_dev_if || !dif ||
65 sk->sk_bound_dev_if == dif))
65 goto found; 66 goto found;
66 } 67 }
67 68
@@ -182,15 +183,17 @@ pass_up:
182 struct iphdr *iph = (struct iphdr *) skb_network_header(skb); 183 struct iphdr *iph = (struct iphdr *) skb_network_header(skb);
183 184
184 read_lock_bh(&l2tp_ip_lock); 185 read_lock_bh(&l2tp_ip_lock);
185 sk = __l2tp_ip_bind_lookup(net, iph->daddr, 0, tunnel_id); 186 sk = __l2tp_ip_bind_lookup(net, iph->daddr, inet_iif(skb),
187 tunnel_id);
188 if (!sk) {
189 read_unlock_bh(&l2tp_ip_lock);
190 goto discard;
191 }
192
193 sock_hold(sk);
186 read_unlock_bh(&l2tp_ip_lock); 194 read_unlock_bh(&l2tp_ip_lock);
187 } 195 }
188 196
189 if (sk == NULL)
190 goto discard;
191
192 sock_hold(sk);
193
194 if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb)) 197 if (!xfrm4_policy_check(sk, XFRM_POLICY_IN, skb))
195 goto discard_put; 198 goto discard_put;
196 199
@@ -251,22 +254,17 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
251 int ret; 254 int ret;
252 int chk_addr_ret; 255 int chk_addr_ret;
253 256
254 if (!sock_flag(sk, SOCK_ZAPPED))
255 return -EINVAL;
256 if (addr_len < sizeof(struct sockaddr_l2tpip)) 257 if (addr_len < sizeof(struct sockaddr_l2tpip))
257 return -EINVAL; 258 return -EINVAL;
258 if (addr->l2tp_family != AF_INET) 259 if (addr->l2tp_family != AF_INET)
259 return -EINVAL; 260 return -EINVAL;
260 261
261 ret = -EADDRINUSE; 262 lock_sock(sk);
262 read_lock_bh(&l2tp_ip_lock);
263 if (__l2tp_ip_bind_lookup(net, addr->l2tp_addr.s_addr,
264 sk->sk_bound_dev_if, addr->l2tp_conn_id))
265 goto out_in_use;
266 263
267 read_unlock_bh(&l2tp_ip_lock); 264 ret = -EINVAL;
265 if (!sock_flag(sk, SOCK_ZAPPED))
266 goto out;
268 267
269 lock_sock(sk);
270 if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_l2tpip)) 268 if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_l2tpip))
271 goto out; 269 goto out;
272 270
@@ -280,14 +278,22 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
280 inet->inet_rcv_saddr = inet->inet_saddr = addr->l2tp_addr.s_addr; 278 inet->inet_rcv_saddr = inet->inet_saddr = addr->l2tp_addr.s_addr;
281 if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST) 279 if (chk_addr_ret == RTN_MULTICAST || chk_addr_ret == RTN_BROADCAST)
282 inet->inet_saddr = 0; /* Use device */ 280 inet->inet_saddr = 0; /* Use device */
283 sk_dst_reset(sk);
284 281
282 write_lock_bh(&l2tp_ip_lock);
283 if (__l2tp_ip_bind_lookup(net, addr->l2tp_addr.s_addr,
284 sk->sk_bound_dev_if, addr->l2tp_conn_id)) {
285 write_unlock_bh(&l2tp_ip_lock);
286 ret = -EADDRINUSE;
287 goto out;
288 }
289
290 sk_dst_reset(sk);
285 l2tp_ip_sk(sk)->conn_id = addr->l2tp_conn_id; 291 l2tp_ip_sk(sk)->conn_id = addr->l2tp_conn_id;
286 292
287 write_lock_bh(&l2tp_ip_lock);
288 sk_add_bind_node(sk, &l2tp_ip_bind_table); 293 sk_add_bind_node(sk, &l2tp_ip_bind_table);
289 sk_del_node_init(sk); 294 sk_del_node_init(sk);
290 write_unlock_bh(&l2tp_ip_lock); 295 write_unlock_bh(&l2tp_ip_lock);
296
291 ret = 0; 297 ret = 0;
292 sock_reset_flag(sk, SOCK_ZAPPED); 298 sock_reset_flag(sk, SOCK_ZAPPED);
293 299
@@ -295,11 +301,6 @@ out:
295 release_sock(sk); 301 release_sock(sk);
296 302
297 return ret; 303 return ret;
298
299out_in_use:
300 read_unlock_bh(&l2tp_ip_lock);
301
302 return ret;
303} 304}
304 305
305static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) 306static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
@@ -307,21 +308,24 @@ static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len
307 struct sockaddr_l2tpip *lsa = (struct sockaddr_l2tpip *) uaddr; 308 struct sockaddr_l2tpip *lsa = (struct sockaddr_l2tpip *) uaddr;
308 int rc; 309 int rc;
309 310
310 if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
311 return -EINVAL;
312
313 if (addr_len < sizeof(*lsa)) 311 if (addr_len < sizeof(*lsa))
314 return -EINVAL; 312 return -EINVAL;
315 313
316 if (ipv4_is_multicast(lsa->l2tp_addr.s_addr)) 314 if (ipv4_is_multicast(lsa->l2tp_addr.s_addr))
317 return -EINVAL; 315 return -EINVAL;
318 316
319 rc = ip4_datagram_connect(sk, uaddr, addr_len);
320 if (rc < 0)
321 return rc;
322
323 lock_sock(sk); 317 lock_sock(sk);
324 318
319 /* Must bind first - autobinding does not work */
320 if (sock_flag(sk, SOCK_ZAPPED)) {
321 rc = -EINVAL;
322 goto out_sk;
323 }
324
325 rc = __ip4_datagram_connect(sk, uaddr, addr_len);
326 if (rc < 0)
327 goto out_sk;
328
325 l2tp_ip_sk(sk)->peer_conn_id = lsa->l2tp_conn_id; 329 l2tp_ip_sk(sk)->peer_conn_id = lsa->l2tp_conn_id;
326 330
327 write_lock_bh(&l2tp_ip_lock); 331 write_lock_bh(&l2tp_ip_lock);
@@ -329,7 +333,9 @@ static int l2tp_ip_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len
329 sk_add_bind_node(sk, &l2tp_ip_bind_table); 333 sk_add_bind_node(sk, &l2tp_ip_bind_table);
330 write_unlock_bh(&l2tp_ip_lock); 334 write_unlock_bh(&l2tp_ip_lock);
331 335
336out_sk:
332 release_sock(sk); 337 release_sock(sk);
338
333 return rc; 339 return rc;
334} 340}
335 341
diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c
index ad3468c32b53..aa821cb639e5 100644
--- a/net/l2tp/l2tp_ip6.c
+++ b/net/l2tp/l2tp_ip6.c
@@ -72,8 +72,9 @@ static struct sock *__l2tp_ip6_bind_lookup(struct net *net,
72 72
73 if ((l2tp->conn_id == tunnel_id) && 73 if ((l2tp->conn_id == tunnel_id) &&
74 net_eq(sock_net(sk), net) && 74 net_eq(sock_net(sk), net) &&
75 !(addr && ipv6_addr_equal(addr, laddr)) && 75 (!addr || ipv6_addr_equal(addr, laddr)) &&
76 !(sk->sk_bound_dev_if && sk->sk_bound_dev_if != dif)) 76 (!sk->sk_bound_dev_if || !dif ||
77 sk->sk_bound_dev_if == dif))
77 goto found; 78 goto found;
78 } 79 }
79 80
@@ -196,16 +197,17 @@ pass_up:
196 struct ipv6hdr *iph = ipv6_hdr(skb); 197 struct ipv6hdr *iph = ipv6_hdr(skb);
197 198
198 read_lock_bh(&l2tp_ip6_lock); 199 read_lock_bh(&l2tp_ip6_lock);
199 sk = __l2tp_ip6_bind_lookup(net, &iph->daddr, 200 sk = __l2tp_ip6_bind_lookup(net, &iph->daddr, inet6_iif(skb),
200 0, tunnel_id); 201 tunnel_id);
202 if (!sk) {
203 read_unlock_bh(&l2tp_ip6_lock);
204 goto discard;
205 }
206
207 sock_hold(sk);
201 read_unlock_bh(&l2tp_ip6_lock); 208 read_unlock_bh(&l2tp_ip6_lock);
202 } 209 }
203 210
204 if (sk == NULL)
205 goto discard;
206
207 sock_hold(sk);
208
209 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb)) 211 if (!xfrm6_policy_check(sk, XFRM_POLICY_IN, skb))
210 goto discard_put; 212 goto discard_put;
211 213
@@ -266,11 +268,10 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
266 struct sockaddr_l2tpip6 *addr = (struct sockaddr_l2tpip6 *) uaddr; 268 struct sockaddr_l2tpip6 *addr = (struct sockaddr_l2tpip6 *) uaddr;
267 struct net *net = sock_net(sk); 269 struct net *net = sock_net(sk);
268 __be32 v4addr = 0; 270 __be32 v4addr = 0;
271 int bound_dev_if;
269 int addr_type; 272 int addr_type;
270 int err; 273 int err;
271 274
272 if (!sock_flag(sk, SOCK_ZAPPED))
273 return -EINVAL;
274 if (addr->l2tp_family != AF_INET6) 275 if (addr->l2tp_family != AF_INET6)
275 return -EINVAL; 276 return -EINVAL;
276 if (addr_len < sizeof(*addr)) 277 if (addr_len < sizeof(*addr))
@@ -286,41 +287,34 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
286 if (addr_type & IPV6_ADDR_MULTICAST) 287 if (addr_type & IPV6_ADDR_MULTICAST)
287 return -EADDRNOTAVAIL; 288 return -EADDRNOTAVAIL;
288 289
289 err = -EADDRINUSE;
290 read_lock_bh(&l2tp_ip6_lock);
291 if (__l2tp_ip6_bind_lookup(net, &addr->l2tp_addr,
292 sk->sk_bound_dev_if, addr->l2tp_conn_id))
293 goto out_in_use;
294 read_unlock_bh(&l2tp_ip6_lock);
295
296 lock_sock(sk); 290 lock_sock(sk);
297 291
298 err = -EINVAL; 292 err = -EINVAL;
293 if (!sock_flag(sk, SOCK_ZAPPED))
294 goto out_unlock;
295
299 if (sk->sk_state != TCP_CLOSE) 296 if (sk->sk_state != TCP_CLOSE)
300 goto out_unlock; 297 goto out_unlock;
301 298
299 bound_dev_if = sk->sk_bound_dev_if;
300
302 /* Check if the address belongs to the host. */ 301 /* Check if the address belongs to the host. */
303 rcu_read_lock(); 302 rcu_read_lock();
304 if (addr_type != IPV6_ADDR_ANY) { 303 if (addr_type != IPV6_ADDR_ANY) {
305 struct net_device *dev = NULL; 304 struct net_device *dev = NULL;
306 305
307 if (addr_type & IPV6_ADDR_LINKLOCAL) { 306 if (addr_type & IPV6_ADDR_LINKLOCAL) {
308 if (addr_len >= sizeof(struct sockaddr_in6) && 307 if (addr->l2tp_scope_id)
309 addr->l2tp_scope_id) { 308 bound_dev_if = addr->l2tp_scope_id;
310 /* Override any existing binding, if another
311 * one is supplied by user.
312 */
313 sk->sk_bound_dev_if = addr->l2tp_scope_id;
314 }
315 309
316 /* Binding to link-local address requires an 310 /* Binding to link-local address requires an
317 interface */ 311 * interface.
318 if (!sk->sk_bound_dev_if) 312 */
313 if (!bound_dev_if)
319 goto out_unlock_rcu; 314 goto out_unlock_rcu;
320 315
321 err = -ENODEV; 316 err = -ENODEV;
322 dev = dev_get_by_index_rcu(sock_net(sk), 317 dev = dev_get_by_index_rcu(sock_net(sk), bound_dev_if);
323 sk->sk_bound_dev_if);
324 if (!dev) 318 if (!dev)
325 goto out_unlock_rcu; 319 goto out_unlock_rcu;
326 } 320 }
@@ -335,13 +329,22 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len)
335 } 329 }
336 rcu_read_unlock(); 330 rcu_read_unlock();
337 331
338 inet->inet_rcv_saddr = inet->inet_saddr = v4addr; 332 write_lock_bh(&l2tp_ip6_lock);
333 if (__l2tp_ip6_bind_lookup(net, &addr->l2tp_addr, bound_dev_if,
334 addr->l2tp_conn_id)) {
335 write_unlock_bh(&l2tp_ip6_lock);
336 err = -EADDRINUSE;
337 goto out_unlock;
338 }
339
340 inet->inet_saddr = v4addr;
341 inet->inet_rcv_saddr = v4addr;
342 sk->sk_bound_dev_if = bound_dev_if;
339 sk->sk_v6_rcv_saddr = addr->l2tp_addr; 343 sk->sk_v6_rcv_saddr = addr->l2tp_addr;
340 np->saddr = addr->l2tp_addr; 344 np->saddr = addr->l2tp_addr;
341 345
342 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id; 346 l2tp_ip6_sk(sk)->conn_id = addr->l2tp_conn_id;
343 347
344 write_lock_bh(&l2tp_ip6_lock);
345 sk_add_bind_node(sk, &l2tp_ip6_bind_table); 348 sk_add_bind_node(sk, &l2tp_ip6_bind_table);
346 sk_del_node_init(sk); 349 sk_del_node_init(sk);
347 write_unlock_bh(&l2tp_ip6_lock); 350 write_unlock_bh(&l2tp_ip6_lock);
@@ -354,10 +357,7 @@ out_unlock_rcu:
354 rcu_read_unlock(); 357 rcu_read_unlock();
355out_unlock: 358out_unlock:
356 release_sock(sk); 359 release_sock(sk);
357 return err;
358 360
359out_in_use:
360 read_unlock_bh(&l2tp_ip6_lock);
361 return err; 361 return err;
362} 362}
363 363
@@ -370,9 +370,6 @@ static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr,
370 int addr_type; 370 int addr_type;
371 int rc; 371 int rc;
372 372
373 if (sock_flag(sk, SOCK_ZAPPED)) /* Must bind first - autobinding does not work */
374 return -EINVAL;
375
376 if (addr_len < sizeof(*lsa)) 373 if (addr_len < sizeof(*lsa))
377 return -EINVAL; 374 return -EINVAL;
378 375
@@ -389,10 +386,18 @@ static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr,
389 return -EINVAL; 386 return -EINVAL;
390 } 387 }
391 388
392 rc = ip6_datagram_connect(sk, uaddr, addr_len);
393
394 lock_sock(sk); 389 lock_sock(sk);
395 390
391 /* Must bind first - autobinding does not work */
392 if (sock_flag(sk, SOCK_ZAPPED)) {
393 rc = -EINVAL;
394 goto out_sk;
395 }
396
397 rc = __ip6_datagram_connect(sk, uaddr, addr_len);
398 if (rc < 0)
399 goto out_sk;
400
396 l2tp_ip6_sk(sk)->peer_conn_id = lsa->l2tp_conn_id; 401 l2tp_ip6_sk(sk)->peer_conn_id = lsa->l2tp_conn_id;
397 402
398 write_lock_bh(&l2tp_ip6_lock); 403 write_lock_bh(&l2tp_ip6_lock);
@@ -400,6 +405,7 @@ static int l2tp_ip6_connect(struct sock *sk, struct sockaddr *uaddr,
400 sk_add_bind_node(sk, &l2tp_ip6_bind_table); 405 sk_add_bind_node(sk, &l2tp_ip6_bind_table);
401 write_unlock_bh(&l2tp_ip6_lock); 406 write_unlock_bh(&l2tp_ip6_lock);
402 407
408out_sk:
403 release_sock(sk); 409 release_sock(sk);
404 410
405 return rc; 411 return rc;
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 78e9ecbc96e6..8e05032689f0 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -688,7 +688,7 @@ static void __sta_info_recalc_tim(struct sta_info *sta, bool ignore_pending)
688 } 688 }
689 689
690 /* No need to do anything if the driver does all */ 690 /* No need to do anything if the driver does all */
691 if (!local->ops->set_tim) 691 if (ieee80211_hw_check(&local->hw, AP_LINK_PS))
692 return; 692 return;
693 693
694 if (sta->dead) 694 if (sta->dead)
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index 1c56abc49627..bd5f4be89435 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -1501,7 +1501,6 @@ static bool ieee80211_queue_skb(struct ieee80211_local *local,
1501 struct sta_info *sta, 1501 struct sta_info *sta,
1502 struct sk_buff *skb) 1502 struct sk_buff *skb)
1503{ 1503{
1504 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1505 struct fq *fq = &local->fq; 1504 struct fq *fq = &local->fq;
1506 struct ieee80211_vif *vif; 1505 struct ieee80211_vif *vif;
1507 struct txq_info *txqi; 1506 struct txq_info *txqi;
@@ -1526,8 +1525,6 @@ static bool ieee80211_queue_skb(struct ieee80211_local *local,
1526 if (!txqi) 1525 if (!txqi)
1527 return false; 1526 return false;
1528 1527
1529 info->control.vif = vif;
1530
1531 spin_lock_bh(&fq->lock); 1528 spin_lock_bh(&fq->lock);
1532 ieee80211_txq_enqueue(local, txqi, skb); 1529 ieee80211_txq_enqueue(local, txqi, skb);
1533 spin_unlock_bh(&fq->lock); 1530 spin_unlock_bh(&fq->lock);
@@ -3213,7 +3210,6 @@ static void ieee80211_xmit_fast_finish(struct ieee80211_sub_if_data *sdata,
3213 3210
3214 if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) { 3211 if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
3215 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; 3212 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
3216 *ieee80211_get_qos_ctl(hdr) = tid;
3217 hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid); 3213 hdr->seq_ctrl = ieee80211_tx_next_seq(sta, tid);
3218 } else { 3214 } else {
3219 info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ; 3215 info->flags |= IEEE80211_TX_CTL_ASSIGN_SEQ;
@@ -3338,6 +3334,11 @@ static bool ieee80211_xmit_fast(struct ieee80211_sub_if_data *sdata,
3338 (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0); 3334 (tid_tx ? IEEE80211_TX_CTL_AMPDU : 0);
3339 info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT; 3335 info->control.flags = IEEE80211_TX_CTRL_FAST_XMIT;
3340 3336
3337 if (hdr->frame_control & cpu_to_le16(IEEE80211_STYPE_QOS_DATA)) {
3338 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK;
3339 *ieee80211_get_qos_ctl(hdr) = tid;
3340 }
3341
3341 __skb_queue_head_init(&tx.skbs); 3342 __skb_queue_head_init(&tx.skbs);
3342 3343
3343 tx.flags = IEEE80211_TX_UNICAST; 3344 tx.flags = IEEE80211_TX_UNICAST;
@@ -3426,6 +3427,11 @@ begin:
3426 goto begin; 3427 goto begin;
3427 } 3428 }
3428 3429
3430 if (test_bit(IEEE80211_TXQ_AMPDU, &txqi->flags))
3431 info->flags |= IEEE80211_TX_CTL_AMPDU;
3432 else
3433 info->flags &= ~IEEE80211_TX_CTL_AMPDU;
3434
3429 if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) { 3435 if (info->control.flags & IEEE80211_TX_CTRL_FAST_XMIT) {
3430 struct sta_info *sta = container_of(txq->sta, struct sta_info, 3436 struct sta_info *sta = container_of(txq->sta, struct sta_info,
3431 sta); 3437 sta);
diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c
index ee715764a828..6832bf6ab69f 100644
--- a/net/mac80211/vht.c
+++ b/net/mac80211/vht.c
@@ -270,6 +270,22 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
270 vht_cap->vht_mcs.tx_mcs_map |= cpu_to_le16(peer_tx << i * 2); 270 vht_cap->vht_mcs.tx_mcs_map |= cpu_to_le16(peer_tx << i * 2);
271 } 271 }
272 272
273 /*
274 * This is a workaround for VHT-enabled STAs which break the spec
275 * and have the VHT-MCS Rx map filled in with value 3 for all eight
276 * spacial streams, an example is AR9462.
277 *
278 * As per spec, in section 22.1.1 Introduction to the VHT PHY
279 * A VHT STA shall support at least single spactial stream VHT-MCSs
280 * 0 to 7 (transmit and receive) in all supported channel widths.
281 */
282 if (vht_cap->vht_mcs.rx_mcs_map == cpu_to_le16(0xFFFF)) {
283 vht_cap->vht_supported = false;
284 sdata_info(sdata, "Ignoring VHT IE from %pM due to invalid rx_mcs_map\n",
285 sta->addr);
286 return;
287 }
288
273 /* finally set up the bandwidth */ 289 /* finally set up the bandwidth */
274 switch (vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) { 290 switch (vht_cap->cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK) {
275 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ: 291 case IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ:
diff --git a/net/mpls/af_mpls.c b/net/mpls/af_mpls.c
index 0e4334cbde17..15fe97644ffe 100644
--- a/net/mpls/af_mpls.c
+++ b/net/mpls/af_mpls.c
@@ -1252,7 +1252,7 @@ static int rtm_to_route_config(struct sk_buff *skb, struct nlmsghdr *nlh,
1252 if (!nla) 1252 if (!nla)
1253 continue; 1253 continue;
1254 1254
1255 switch(index) { 1255 switch (index) {
1256 case RTA_OIF: 1256 case RTA_OIF:
1257 cfg->rc_ifindex = nla_get_u32(nla); 1257 cfg->rc_ifindex = nla_get_u32(nla);
1258 break; 1258 break;
diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
index c3c809b2e712..a6e44ef2ec9a 100644
--- a/net/netfilter/ipvs/ip_vs_ctl.c
+++ b/net/netfilter/ipvs/ip_vs_ctl.c
@@ -2845,7 +2845,7 @@ static struct genl_family ip_vs_genl_family = {
2845 .hdrsize = 0, 2845 .hdrsize = 0,
2846 .name = IPVS_GENL_NAME, 2846 .name = IPVS_GENL_NAME,
2847 .version = IPVS_GENL_VERSION, 2847 .version = IPVS_GENL_VERSION,
2848 .maxattr = IPVS_CMD_MAX, 2848 .maxattr = IPVS_CMD_ATTR_MAX,
2849 .netnsok = true, /* Make ipvsadm to work on netns */ 2849 .netnsok = true, /* Make ipvsadm to work on netns */
2850}; 2850};
2851 2851
diff --git a/net/netfilter/ipvs/ip_vs_sync.c b/net/netfilter/ipvs/ip_vs_sync.c
index 1b07578bedf3..9350530c16c1 100644
--- a/net/netfilter/ipvs/ip_vs_sync.c
+++ b/net/netfilter/ipvs/ip_vs_sync.c
@@ -283,6 +283,7 @@ struct ip_vs_sync_buff {
283 */ 283 */
284static void ntoh_seq(struct ip_vs_seq *no, struct ip_vs_seq *ho) 284static void ntoh_seq(struct ip_vs_seq *no, struct ip_vs_seq *ho)
285{ 285{
286 memset(ho, 0, sizeof(*ho));
286 ho->init_seq = get_unaligned_be32(&no->init_seq); 287 ho->init_seq = get_unaligned_be32(&no->init_seq);
287 ho->delta = get_unaligned_be32(&no->delta); 288 ho->delta = get_unaligned_be32(&no->delta);
288 ho->previous_delta = get_unaligned_be32(&no->previous_delta); 289 ho->previous_delta = get_unaligned_be32(&no->previous_delta);
@@ -917,8 +918,10 @@ static void ip_vs_proc_conn(struct netns_ipvs *ipvs, struct ip_vs_conn_param *pa
917 kfree(param->pe_data); 918 kfree(param->pe_data);
918 } 919 }
919 920
920 if (opt) 921 if (opt) {
921 memcpy(&cp->in_seq, opt, sizeof(*opt)); 922 cp->in_seq = opt->in_seq;
923 cp->out_seq = opt->out_seq;
924 }
922 atomic_set(&cp->in_pkts, sysctl_sync_threshold(ipvs)); 925 atomic_set(&cp->in_pkts, sysctl_sync_threshold(ipvs));
923 cp->state = state; 926 cp->state = state;
924 cp->old_state = cp->state; 927 cp->old_state = cp->state;
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
index df2f5a3901df..0f87e5d21be7 100644
--- a/net/netfilter/nf_conntrack_core.c
+++ b/net/netfilter/nf_conntrack_core.c
@@ -76,6 +76,7 @@ struct conntrack_gc_work {
76 struct delayed_work dwork; 76 struct delayed_work dwork;
77 u32 last_bucket; 77 u32 last_bucket;
78 bool exiting; 78 bool exiting;
79 long next_gc_run;
79}; 80};
80 81
81static __read_mostly struct kmem_cache *nf_conntrack_cachep; 82static __read_mostly struct kmem_cache *nf_conntrack_cachep;
@@ -83,9 +84,11 @@ static __read_mostly spinlock_t nf_conntrack_locks_all_lock;
83static __read_mostly DEFINE_SPINLOCK(nf_conntrack_locks_all_lock); 84static __read_mostly DEFINE_SPINLOCK(nf_conntrack_locks_all_lock);
84static __read_mostly bool nf_conntrack_locks_all; 85static __read_mostly bool nf_conntrack_locks_all;
85 86
87/* every gc cycle scans at most 1/GC_MAX_BUCKETS_DIV part of table */
86#define GC_MAX_BUCKETS_DIV 64u 88#define GC_MAX_BUCKETS_DIV 64u
87#define GC_MAX_BUCKETS 8192u 89/* upper bound of scan intervals */
88#define GC_INTERVAL (5 * HZ) 90#define GC_INTERVAL_MAX (2 * HZ)
91/* maximum conntracks to evict per gc run */
89#define GC_MAX_EVICTS 256u 92#define GC_MAX_EVICTS 256u
90 93
91static struct conntrack_gc_work conntrack_gc_work; 94static struct conntrack_gc_work conntrack_gc_work;
@@ -936,13 +939,13 @@ static noinline int early_drop(struct net *net, unsigned int _hash)
936static void gc_worker(struct work_struct *work) 939static void gc_worker(struct work_struct *work)
937{ 940{
938 unsigned int i, goal, buckets = 0, expired_count = 0; 941 unsigned int i, goal, buckets = 0, expired_count = 0;
939 unsigned long next_run = GC_INTERVAL;
940 unsigned int ratio, scanned = 0;
941 struct conntrack_gc_work *gc_work; 942 struct conntrack_gc_work *gc_work;
943 unsigned int ratio, scanned = 0;
944 unsigned long next_run;
942 945
943 gc_work = container_of(work, struct conntrack_gc_work, dwork.work); 946 gc_work = container_of(work, struct conntrack_gc_work, dwork.work);
944 947
945 goal = min(nf_conntrack_htable_size / GC_MAX_BUCKETS_DIV, GC_MAX_BUCKETS); 948 goal = nf_conntrack_htable_size / GC_MAX_BUCKETS_DIV;
946 i = gc_work->last_bucket; 949 i = gc_work->last_bucket;
947 950
948 do { 951 do {
@@ -982,17 +985,47 @@ static void gc_worker(struct work_struct *work)
982 if (gc_work->exiting) 985 if (gc_work->exiting)
983 return; 986 return;
984 987
988 /*
989 * Eviction will normally happen from the packet path, and not
990 * from this gc worker.
991 *
992 * This worker is only here to reap expired entries when system went
993 * idle after a busy period.
994 *
995 * The heuristics below are supposed to balance conflicting goals:
996 *
997 * 1. Minimize time until we notice a stale entry
998 * 2. Maximize scan intervals to not waste cycles
999 *
1000 * Normally, expired_count will be 0, this increases the next_run time
1001 * to priorize 2) above.
1002 *
1003 * As soon as a timed-out entry is found, move towards 1) and increase
1004 * the scan frequency.
1005 * In case we have lots of evictions next scan is done immediately.
1006 */
985 ratio = scanned ? expired_count * 100 / scanned : 0; 1007 ratio = scanned ? expired_count * 100 / scanned : 0;
986 if (ratio >= 90 || expired_count == GC_MAX_EVICTS) 1008 if (ratio >= 90 || expired_count == GC_MAX_EVICTS) {
1009 gc_work->next_gc_run = 0;
987 next_run = 0; 1010 next_run = 0;
1011 } else if (expired_count) {
1012 gc_work->next_gc_run /= 2U;
1013 next_run = msecs_to_jiffies(1);
1014 } else {
1015 if (gc_work->next_gc_run < GC_INTERVAL_MAX)
1016 gc_work->next_gc_run += msecs_to_jiffies(1);
1017
1018 next_run = gc_work->next_gc_run;
1019 }
988 1020
989 gc_work->last_bucket = i; 1021 gc_work->last_bucket = i;
990 schedule_delayed_work(&gc_work->dwork, next_run); 1022 queue_delayed_work(system_long_wq, &gc_work->dwork, next_run);
991} 1023}
992 1024
993static void conntrack_gc_work_init(struct conntrack_gc_work *gc_work) 1025static void conntrack_gc_work_init(struct conntrack_gc_work *gc_work)
994{ 1026{
995 INIT_DELAYED_WORK(&gc_work->dwork, gc_worker); 1027 INIT_DELAYED_WORK(&gc_work->dwork, gc_worker);
1028 gc_work->next_gc_run = GC_INTERVAL_MAX;
996 gc_work->exiting = false; 1029 gc_work->exiting = false;
997} 1030}
998 1031
@@ -1885,7 +1918,7 @@ int nf_conntrack_init_start(void)
1885 nf_ct_untracked_status_or(IPS_CONFIRMED | IPS_UNTRACKED); 1918 nf_ct_untracked_status_or(IPS_CONFIRMED | IPS_UNTRACKED);
1886 1919
1887 conntrack_gc_work_init(&conntrack_gc_work); 1920 conntrack_gc_work_init(&conntrack_gc_work);
1888 schedule_delayed_work(&conntrack_gc_work.dwork, GC_INTERVAL); 1921 queue_delayed_work(system_long_wq, &conntrack_gc_work.dwork, GC_INTERVAL_MAX);
1889 1922
1890 return 0; 1923 return 0;
1891 1924
diff --git a/net/netfilter/nf_conntrack_helper.c b/net/netfilter/nf_conntrack_helper.c
index 336e21559e01..7341adf7059d 100644
--- a/net/netfilter/nf_conntrack_helper.c
+++ b/net/netfilter/nf_conntrack_helper.c
@@ -138,9 +138,14 @@ __nf_conntrack_helper_find(const char *name, u16 l3num, u8 protonum)
138 138
139 for (i = 0; i < nf_ct_helper_hsize; i++) { 139 for (i = 0; i < nf_ct_helper_hsize; i++) {
140 hlist_for_each_entry_rcu(h, &nf_ct_helper_hash[i], hnode) { 140 hlist_for_each_entry_rcu(h, &nf_ct_helper_hash[i], hnode) {
141 if (!strcmp(h->name, name) && 141 if (strcmp(h->name, name))
142 h->tuple.src.l3num == l3num && 142 continue;
143 h->tuple.dst.protonum == protonum) 143
144 if (h->tuple.src.l3num != NFPROTO_UNSPEC &&
145 h->tuple.src.l3num != l3num)
146 continue;
147
148 if (h->tuple.dst.protonum == protonum)
144 return h; 149 return h;
145 } 150 }
146 } 151 }
diff --git a/net/netfilter/nf_conntrack_sip.c b/net/netfilter/nf_conntrack_sip.c
index 621b81c7bddc..c3fc14e021ec 100644
--- a/net/netfilter/nf_conntrack_sip.c
+++ b/net/netfilter/nf_conntrack_sip.c
@@ -1436,9 +1436,12 @@ static int process_sip_request(struct sk_buff *skb, unsigned int protoff,
1436 handler = &sip_handlers[i]; 1436 handler = &sip_handlers[i];
1437 if (handler->request == NULL) 1437 if (handler->request == NULL)
1438 continue; 1438 continue;
1439 if (*datalen < handler->len || 1439 if (*datalen < handler->len + 2 ||
1440 strncasecmp(*dptr, handler->method, handler->len)) 1440 strncasecmp(*dptr, handler->method, handler->len))
1441 continue; 1441 continue;
1442 if ((*dptr)[handler->len] != ' ' ||
1443 !isalpha((*dptr)[handler->len+1]))
1444 continue;
1442 1445
1443 if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ, 1446 if (ct_sip_get_header(ct, *dptr, 0, *datalen, SIP_HDR_CSEQ,
1444 &matchoff, &matchlen) <= 0) { 1447 &matchoff, &matchlen) <= 0) {
diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c
index bbb8f3df79f7..5b9c884a452e 100644
--- a/net/netfilter/nf_nat_core.c
+++ b/net/netfilter/nf_nat_core.c
@@ -42,7 +42,7 @@ struct nf_nat_conn_key {
42 const struct nf_conntrack_zone *zone; 42 const struct nf_conntrack_zone *zone;
43}; 43};
44 44
45static struct rhashtable nf_nat_bysource_table; 45static struct rhltable nf_nat_bysource_table;
46 46
47inline const struct nf_nat_l3proto * 47inline const struct nf_nat_l3proto *
48__nf_nat_l3proto_find(u8 family) 48__nf_nat_l3proto_find(u8 family)
@@ -193,9 +193,12 @@ static int nf_nat_bysource_cmp(struct rhashtable_compare_arg *arg,
193 const struct nf_nat_conn_key *key = arg->key; 193 const struct nf_nat_conn_key *key = arg->key;
194 const struct nf_conn *ct = obj; 194 const struct nf_conn *ct = obj;
195 195
196 return same_src(ct, key->tuple) && 196 if (!same_src(ct, key->tuple) ||
197 net_eq(nf_ct_net(ct), key->net) && 197 !net_eq(nf_ct_net(ct), key->net) ||
198 nf_ct_zone_equal(ct, key->zone, IP_CT_DIR_ORIGINAL); 198 !nf_ct_zone_equal(ct, key->zone, IP_CT_DIR_ORIGINAL))
199 return 1;
200
201 return 0;
199} 202}
200 203
201static struct rhashtable_params nf_nat_bysource_params = { 204static struct rhashtable_params nf_nat_bysource_params = {
@@ -204,7 +207,6 @@ static struct rhashtable_params nf_nat_bysource_params = {
204 .obj_cmpfn = nf_nat_bysource_cmp, 207 .obj_cmpfn = nf_nat_bysource_cmp,
205 .nelem_hint = 256, 208 .nelem_hint = 256,
206 .min_size = 1024, 209 .min_size = 1024,
207 .nulls_base = (1U << RHT_BASE_SHIFT),
208}; 210};
209 211
210/* Only called for SRC manip */ 212/* Only called for SRC manip */
@@ -223,12 +225,15 @@ find_appropriate_src(struct net *net,
223 .tuple = tuple, 225 .tuple = tuple,
224 .zone = zone 226 .zone = zone
225 }; 227 };
228 struct rhlist_head *hl;
226 229
227 ct = rhashtable_lookup_fast(&nf_nat_bysource_table, &key, 230 hl = rhltable_lookup(&nf_nat_bysource_table, &key,
228 nf_nat_bysource_params); 231 nf_nat_bysource_params);
229 if (!ct) 232 if (!hl)
230 return 0; 233 return 0;
231 234
235 ct = container_of(hl, typeof(*ct), nat_bysource);
236
232 nf_ct_invert_tuplepr(result, 237 nf_ct_invert_tuplepr(result,
233 &ct->tuplehash[IP_CT_DIR_REPLY].tuple); 238 &ct->tuplehash[IP_CT_DIR_REPLY].tuple);
234 result->dst = tuple->dst; 239 result->dst = tuple->dst;
@@ -446,11 +451,17 @@ nf_nat_setup_info(struct nf_conn *ct,
446 } 451 }
447 452
448 if (maniptype == NF_NAT_MANIP_SRC) { 453 if (maniptype == NF_NAT_MANIP_SRC) {
454 struct nf_nat_conn_key key = {
455 .net = nf_ct_net(ct),
456 .tuple = &ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple,
457 .zone = nf_ct_zone(ct),
458 };
449 int err; 459 int err;
450 460
451 err = rhashtable_insert_fast(&nf_nat_bysource_table, 461 err = rhltable_insert_key(&nf_nat_bysource_table,
452 &ct->nat_bysource, 462 &key,
453 nf_nat_bysource_params); 463 &ct->nat_bysource,
464 nf_nat_bysource_params);
454 if (err) 465 if (err)
455 return NF_DROP; 466 return NF_DROP;
456 } 467 }
@@ -567,8 +578,8 @@ static int nf_nat_proto_clean(struct nf_conn *ct, void *data)
567 * will delete entry from already-freed table. 578 * will delete entry from already-freed table.
568 */ 579 */
569 ct->status &= ~IPS_NAT_DONE_MASK; 580 ct->status &= ~IPS_NAT_DONE_MASK;
570 rhashtable_remove_fast(&nf_nat_bysource_table, &ct->nat_bysource, 581 rhltable_remove(&nf_nat_bysource_table, &ct->nat_bysource,
571 nf_nat_bysource_params); 582 nf_nat_bysource_params);
572 583
573 /* don't delete conntrack. Although that would make things a lot 584 /* don't delete conntrack. Although that would make things a lot
574 * simpler, we'd end up flushing all conntracks on nat rmmod. 585 * simpler, we'd end up flushing all conntracks on nat rmmod.
@@ -698,8 +709,8 @@ static void nf_nat_cleanup_conntrack(struct nf_conn *ct)
698 if (!nat) 709 if (!nat)
699 return; 710 return;
700 711
701 rhashtable_remove_fast(&nf_nat_bysource_table, &ct->nat_bysource, 712 rhltable_remove(&nf_nat_bysource_table, &ct->nat_bysource,
702 nf_nat_bysource_params); 713 nf_nat_bysource_params);
703} 714}
704 715
705static struct nf_ct_ext_type nat_extend __read_mostly = { 716static struct nf_ct_ext_type nat_extend __read_mostly = {
@@ -834,13 +845,13 @@ static int __init nf_nat_init(void)
834{ 845{
835 int ret; 846 int ret;
836 847
837 ret = rhashtable_init(&nf_nat_bysource_table, &nf_nat_bysource_params); 848 ret = rhltable_init(&nf_nat_bysource_table, &nf_nat_bysource_params);
838 if (ret) 849 if (ret)
839 return ret; 850 return ret;
840 851
841 ret = nf_ct_extend_register(&nat_extend); 852 ret = nf_ct_extend_register(&nat_extend);
842 if (ret < 0) { 853 if (ret < 0) {
843 rhashtable_destroy(&nf_nat_bysource_table); 854 rhltable_destroy(&nf_nat_bysource_table);
844 printk(KERN_ERR "nf_nat_core: Unable to register extension\n"); 855 printk(KERN_ERR "nf_nat_core: Unable to register extension\n");
845 return ret; 856 return ret;
846 } 857 }
@@ -864,7 +875,7 @@ static int __init nf_nat_init(void)
864 return 0; 875 return 0;
865 876
866 cleanup_extend: 877 cleanup_extend:
867 rhashtable_destroy(&nf_nat_bysource_table); 878 rhltable_destroy(&nf_nat_bysource_table);
868 nf_ct_extend_unregister(&nat_extend); 879 nf_ct_extend_unregister(&nat_extend);
869 return ret; 880 return ret;
870} 881}
@@ -883,7 +894,7 @@ static void __exit nf_nat_cleanup(void)
883 for (i = 0; i < NFPROTO_NUMPROTO; i++) 894 for (i = 0; i < NFPROTO_NUMPROTO; i++)
884 kfree(nf_nat_l4protos[i]); 895 kfree(nf_nat_l4protos[i]);
885 896
886 rhashtable_destroy(&nf_nat_bysource_table); 897 rhltable_destroy(&nf_nat_bysource_table);
887} 898}
888 899
889MODULE_LICENSE("GPL"); 900MODULE_LICENSE("GPL");
diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
index 24db22257586..e5194f6f906c 100644
--- a/net/netfilter/nf_tables_api.c
+++ b/net/netfilter/nf_tables_api.c
@@ -2570,7 +2570,8 @@ static int nf_tables_fill_set(struct sk_buff *skb, const struct nft_ctx *ctx,
2570 } 2570 }
2571 2571
2572 if (set->timeout && 2572 if (set->timeout &&
2573 nla_put_be64(skb, NFTA_SET_TIMEOUT, cpu_to_be64(set->timeout), 2573 nla_put_be64(skb, NFTA_SET_TIMEOUT,
2574 cpu_to_be64(jiffies_to_msecs(set->timeout)),
2574 NFTA_SET_PAD)) 2575 NFTA_SET_PAD))
2575 goto nla_put_failure; 2576 goto nla_put_failure;
2576 if (set->gc_int && 2577 if (set->gc_int &&
@@ -2859,7 +2860,8 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
2859 if (nla[NFTA_SET_TIMEOUT] != NULL) { 2860 if (nla[NFTA_SET_TIMEOUT] != NULL) {
2860 if (!(flags & NFT_SET_TIMEOUT)) 2861 if (!(flags & NFT_SET_TIMEOUT))
2861 return -EINVAL; 2862 return -EINVAL;
2862 timeout = be64_to_cpu(nla_get_be64(nla[NFTA_SET_TIMEOUT])); 2863 timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
2864 nla[NFTA_SET_TIMEOUT])));
2863 } 2865 }
2864 gc_int = 0; 2866 gc_int = 0;
2865 if (nla[NFTA_SET_GC_INTERVAL] != NULL) { 2867 if (nla[NFTA_SET_GC_INTERVAL] != NULL) {
@@ -2956,12 +2958,14 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk,
2956 2958
2957 err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set); 2959 err = nft_trans_set_add(&ctx, NFT_MSG_NEWSET, set);
2958 if (err < 0) 2960 if (err < 0)
2959 goto err2; 2961 goto err3;
2960 2962
2961 list_add_tail_rcu(&set->list, &table->sets); 2963 list_add_tail_rcu(&set->list, &table->sets);
2962 table->use++; 2964 table->use++;
2963 return 0; 2965 return 0;
2964 2966
2967err3:
2968 ops->destroy(set);
2965err2: 2969err2:
2966 kfree(set); 2970 kfree(set);
2967err1: 2971err1:
@@ -3176,7 +3180,8 @@ static int nf_tables_fill_setelem(struct sk_buff *skb,
3176 3180
3177 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT) && 3181 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT) &&
3178 nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT, 3182 nla_put_be64(skb, NFTA_SET_ELEM_TIMEOUT,
3179 cpu_to_be64(*nft_set_ext_timeout(ext)), 3183 cpu_to_be64(jiffies_to_msecs(
3184 *nft_set_ext_timeout(ext))),
3180 NFTA_SET_ELEM_PAD)) 3185 NFTA_SET_ELEM_PAD))
3181 goto nla_put_failure; 3186 goto nla_put_failure;
3182 3187
@@ -3445,21 +3450,22 @@ void *nft_set_elem_init(const struct nft_set *set,
3445 memcpy(nft_set_ext_data(ext), data, set->dlen); 3450 memcpy(nft_set_ext_data(ext), data, set->dlen);
3446 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION)) 3451 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPIRATION))
3447 *nft_set_ext_expiration(ext) = 3452 *nft_set_ext_expiration(ext) =
3448 jiffies + msecs_to_jiffies(timeout); 3453 jiffies + timeout;
3449 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT)) 3454 if (nft_set_ext_exists(ext, NFT_SET_EXT_TIMEOUT))
3450 *nft_set_ext_timeout(ext) = timeout; 3455 *nft_set_ext_timeout(ext) = timeout;
3451 3456
3452 return elem; 3457 return elem;
3453} 3458}
3454 3459
3455void nft_set_elem_destroy(const struct nft_set *set, void *elem) 3460void nft_set_elem_destroy(const struct nft_set *set, void *elem,
3461 bool destroy_expr)
3456{ 3462{
3457 struct nft_set_ext *ext = nft_set_elem_ext(set, elem); 3463 struct nft_set_ext *ext = nft_set_elem_ext(set, elem);
3458 3464
3459 nft_data_uninit(nft_set_ext_key(ext), NFT_DATA_VALUE); 3465 nft_data_uninit(nft_set_ext_key(ext), NFT_DATA_VALUE);
3460 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA)) 3466 if (nft_set_ext_exists(ext, NFT_SET_EXT_DATA))
3461 nft_data_uninit(nft_set_ext_data(ext), set->dtype); 3467 nft_data_uninit(nft_set_ext_data(ext), set->dtype);
3462 if (nft_set_ext_exists(ext, NFT_SET_EXT_EXPR)) 3468 if (destroy_expr && nft_set_ext_exists(ext, NFT_SET_EXT_EXPR))
3463 nf_tables_expr_destroy(NULL, nft_set_ext_expr(ext)); 3469 nf_tables_expr_destroy(NULL, nft_set_ext_expr(ext));
3464 3470
3465 kfree(elem); 3471 kfree(elem);
@@ -3532,7 +3538,8 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
3532 if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) { 3538 if (nla[NFTA_SET_ELEM_TIMEOUT] != NULL) {
3533 if (!(set->flags & NFT_SET_TIMEOUT)) 3539 if (!(set->flags & NFT_SET_TIMEOUT))
3534 return -EINVAL; 3540 return -EINVAL;
3535 timeout = be64_to_cpu(nla_get_be64(nla[NFTA_SET_ELEM_TIMEOUT])); 3541 timeout = msecs_to_jiffies(be64_to_cpu(nla_get_be64(
3542 nla[NFTA_SET_ELEM_TIMEOUT])));
3536 } else if (set->flags & NFT_SET_TIMEOUT) { 3543 } else if (set->flags & NFT_SET_TIMEOUT) {
3537 timeout = set->timeout; 3544 timeout = set->timeout;
3538 } 3545 }
@@ -3565,6 +3572,7 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
3565 dreg = nft_type_to_reg(set->dtype); 3572 dreg = nft_type_to_reg(set->dtype);
3566 list_for_each_entry(binding, &set->bindings, list) { 3573 list_for_each_entry(binding, &set->bindings, list) {
3567 struct nft_ctx bind_ctx = { 3574 struct nft_ctx bind_ctx = {
3575 .net = ctx->net,
3568 .afi = ctx->afi, 3576 .afi = ctx->afi,
3569 .table = ctx->table, 3577 .table = ctx->table,
3570 .chain = (struct nft_chain *)binding->chain, 3578 .chain = (struct nft_chain *)binding->chain,
@@ -3812,7 +3820,7 @@ void nft_set_gc_batch_release(struct rcu_head *rcu)
3812 3820
3813 gcb = container_of(rcu, struct nft_set_gc_batch, head.rcu); 3821 gcb = container_of(rcu, struct nft_set_gc_batch, head.rcu);
3814 for (i = 0; i < gcb->head.cnt; i++) 3822 for (i = 0; i < gcb->head.cnt; i++)
3815 nft_set_elem_destroy(gcb->head.set, gcb->elems[i]); 3823 nft_set_elem_destroy(gcb->head.set, gcb->elems[i], true);
3816 kfree(gcb); 3824 kfree(gcb);
3817} 3825}
3818EXPORT_SYMBOL_GPL(nft_set_gc_batch_release); 3826EXPORT_SYMBOL_GPL(nft_set_gc_batch_release);
@@ -4030,7 +4038,7 @@ static void nf_tables_commit_release(struct nft_trans *trans)
4030 break; 4038 break;
4031 case NFT_MSG_DELSETELEM: 4039 case NFT_MSG_DELSETELEM:
4032 nft_set_elem_destroy(nft_trans_elem_set(trans), 4040 nft_set_elem_destroy(nft_trans_elem_set(trans),
4033 nft_trans_elem(trans).priv); 4041 nft_trans_elem(trans).priv, true);
4034 break; 4042 break;
4035 } 4043 }
4036 kfree(trans); 4044 kfree(trans);
@@ -4171,7 +4179,7 @@ static void nf_tables_abort_release(struct nft_trans *trans)
4171 break; 4179 break;
4172 case NFT_MSG_NEWSETELEM: 4180 case NFT_MSG_NEWSETELEM:
4173 nft_set_elem_destroy(nft_trans_elem_set(trans), 4181 nft_set_elem_destroy(nft_trans_elem_set(trans),
4174 nft_trans_elem(trans).priv); 4182 nft_trans_elem(trans).priv, true);
4175 break; 4183 break;
4176 } 4184 }
4177 kfree(trans); 4185 kfree(trans);
@@ -4421,7 +4429,7 @@ static int nf_tables_check_loops(const struct nft_ctx *ctx,
4421 * Otherwise a 0 is returned and the attribute value is stored in the 4429 * Otherwise a 0 is returned and the attribute value is stored in the
4422 * destination variable. 4430 * destination variable.
4423 */ 4431 */
4424unsigned int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest) 4432int nft_parse_u32_check(const struct nlattr *attr, int max, u32 *dest)
4425{ 4433{
4426 u32 val; 4434 u32 val;
4427 4435
diff --git a/net/netfilter/nft_dynset.c b/net/netfilter/nft_dynset.c
index 517f08767a3c..31ca94793aa9 100644
--- a/net/netfilter/nft_dynset.c
+++ b/net/netfilter/nft_dynset.c
@@ -44,18 +44,22 @@ static void *nft_dynset_new(struct nft_set *set, const struct nft_expr *expr,
44 &regs->data[priv->sreg_key], 44 &regs->data[priv->sreg_key],
45 &regs->data[priv->sreg_data], 45 &regs->data[priv->sreg_data],
46 timeout, GFP_ATOMIC); 46 timeout, GFP_ATOMIC);
47 if (elem == NULL) { 47 if (elem == NULL)
48 if (set->size) 48 goto err1;
49 atomic_dec(&set->nelems);
50 return NULL;
51 }
52 49
53 ext = nft_set_elem_ext(set, elem); 50 ext = nft_set_elem_ext(set, elem);
54 if (priv->expr != NULL && 51 if (priv->expr != NULL &&
55 nft_expr_clone(nft_set_ext_expr(ext), priv->expr) < 0) 52 nft_expr_clone(nft_set_ext_expr(ext), priv->expr) < 0)
56 return NULL; 53 goto err2;
57 54
58 return elem; 55 return elem;
56
57err2:
58 nft_set_elem_destroy(set, elem, false);
59err1:
60 if (set->size)
61 atomic_dec(&set->nelems);
62 return NULL;
59} 63}
60 64
61static void nft_dynset_eval(const struct nft_expr *expr, 65static void nft_dynset_eval(const struct nft_expr *expr,
@@ -139,6 +143,9 @@ static int nft_dynset_init(const struct nft_ctx *ctx,
139 return PTR_ERR(set); 143 return PTR_ERR(set);
140 } 144 }
141 145
146 if (set->ops->update == NULL)
147 return -EOPNOTSUPP;
148
142 if (set->flags & NFT_SET_CONSTANT) 149 if (set->flags & NFT_SET_CONSTANT)
143 return -EBUSY; 150 return -EBUSY;
144 151
diff --git a/net/netfilter/nft_hash.c b/net/netfilter/nft_hash.c
index baf694de3935..d5447a22275c 100644
--- a/net/netfilter/nft_hash.c
+++ b/net/netfilter/nft_hash.c
@@ -53,6 +53,7 @@ static int nft_hash_init(const struct nft_ctx *ctx,
53{ 53{
54 struct nft_hash *priv = nft_expr_priv(expr); 54 struct nft_hash *priv = nft_expr_priv(expr);
55 u32 len; 55 u32 len;
56 int err;
56 57
57 if (!tb[NFTA_HASH_SREG] || 58 if (!tb[NFTA_HASH_SREG] ||
58 !tb[NFTA_HASH_DREG] || 59 !tb[NFTA_HASH_DREG] ||
@@ -67,8 +68,10 @@ static int nft_hash_init(const struct nft_ctx *ctx,
67 priv->sreg = nft_parse_register(tb[NFTA_HASH_SREG]); 68 priv->sreg = nft_parse_register(tb[NFTA_HASH_SREG]);
68 priv->dreg = nft_parse_register(tb[NFTA_HASH_DREG]); 69 priv->dreg = nft_parse_register(tb[NFTA_HASH_DREG]);
69 70
70 len = ntohl(nla_get_be32(tb[NFTA_HASH_LEN])); 71 err = nft_parse_u32_check(tb[NFTA_HASH_LEN], U8_MAX, &len);
71 if (len == 0 || len > U8_MAX) 72 if (err < 0)
73 return err;
74 if (len == 0)
72 return -ERANGE; 75 return -ERANGE;
73 76
74 priv->len = len; 77 priv->len = len;
diff --git a/net/netfilter/nft_range.c b/net/netfilter/nft_range.c
index fbc88009ca2e..8f0aaaea1376 100644
--- a/net/netfilter/nft_range.c
+++ b/net/netfilter/nft_range.c
@@ -59,6 +59,12 @@ static int nft_range_init(const struct nft_ctx *ctx, const struct nft_expr *expr
59 int err; 59 int err;
60 u32 op; 60 u32 op;
61 61
62 if (!tb[NFTA_RANGE_SREG] ||
63 !tb[NFTA_RANGE_OP] ||
64 !tb[NFTA_RANGE_FROM_DATA] ||
65 !tb[NFTA_RANGE_TO_DATA])
66 return -EINVAL;
67
62 err = nft_data_init(NULL, &priv->data_from, sizeof(priv->data_from), 68 err = nft_data_init(NULL, &priv->data_from, sizeof(priv->data_from),
63 &desc_from, tb[NFTA_RANGE_FROM_DATA]); 69 &desc_from, tb[NFTA_RANGE_FROM_DATA]);
64 if (err < 0) 70 if (err < 0)
diff --git a/net/netfilter/nft_set_hash.c b/net/netfilter/nft_set_hash.c
index 3794cb2fc788..a3dface3e6e6 100644
--- a/net/netfilter/nft_set_hash.c
+++ b/net/netfilter/nft_set_hash.c
@@ -98,7 +98,7 @@ static bool nft_hash_update(struct nft_set *set, const u32 *key,
98 const struct nft_set_ext **ext) 98 const struct nft_set_ext **ext)
99{ 99{
100 struct nft_hash *priv = nft_set_priv(set); 100 struct nft_hash *priv = nft_set_priv(set);
101 struct nft_hash_elem *he; 101 struct nft_hash_elem *he, *prev;
102 struct nft_hash_cmp_arg arg = { 102 struct nft_hash_cmp_arg arg = {
103 .genmask = NFT_GENMASK_ANY, 103 .genmask = NFT_GENMASK_ANY,
104 .set = set, 104 .set = set,
@@ -112,15 +112,24 @@ static bool nft_hash_update(struct nft_set *set, const u32 *key,
112 he = new(set, expr, regs); 112 he = new(set, expr, regs);
113 if (he == NULL) 113 if (he == NULL)
114 goto err1; 114 goto err1;
115 if (rhashtable_lookup_insert_key(&priv->ht, &arg, &he->node, 115
116 nft_hash_params)) 116 prev = rhashtable_lookup_get_insert_key(&priv->ht, &arg, &he->node,
117 nft_hash_params);
118 if (IS_ERR(prev))
117 goto err2; 119 goto err2;
120
121 /* Another cpu may race to insert the element with the same key */
122 if (prev) {
123 nft_set_elem_destroy(set, he, true);
124 he = prev;
125 }
126
118out: 127out:
119 *ext = &he->ext; 128 *ext = &he->ext;
120 return true; 129 return true;
121 130
122err2: 131err2:
123 nft_set_elem_destroy(set, he); 132 nft_set_elem_destroy(set, he, true);
124err1: 133err1:
125 return false; 134 return false;
126} 135}
@@ -332,7 +341,7 @@ static int nft_hash_init(const struct nft_set *set,
332 341
333static void nft_hash_elem_destroy(void *ptr, void *arg) 342static void nft_hash_elem_destroy(void *ptr, void *arg)
334{ 343{
335 nft_set_elem_destroy((const struct nft_set *)arg, ptr); 344 nft_set_elem_destroy((const struct nft_set *)arg, ptr, true);
336} 345}
337 346
338static void nft_hash_destroy(const struct nft_set *set) 347static void nft_hash_destroy(const struct nft_set *set)
diff --git a/net/netfilter/nft_set_rbtree.c b/net/netfilter/nft_set_rbtree.c
index 38b5bda242f8..36493a7cae88 100644
--- a/net/netfilter/nft_set_rbtree.c
+++ b/net/netfilter/nft_set_rbtree.c
@@ -266,7 +266,7 @@ static void nft_rbtree_destroy(const struct nft_set *set)
266 while ((node = priv->root.rb_node) != NULL) { 266 while ((node = priv->root.rb_node) != NULL) {
267 rb_erase(node, &priv->root); 267 rb_erase(node, &priv->root);
268 rbe = rb_entry(node, struct nft_rbtree_elem, node); 268 rbe = rb_entry(node, struct nft_rbtree_elem, node);
269 nft_set_elem_destroy(set, rbe); 269 nft_set_elem_destroy(set, rbe, true);
270 } 270 }
271} 271}
272 272
diff --git a/net/netfilter/xt_connmark.c b/net/netfilter/xt_connmark.c
index 69f78e96fdb4..b83e158e116a 100644
--- a/net/netfilter/xt_connmark.c
+++ b/net/netfilter/xt_connmark.c
@@ -44,7 +44,7 @@ connmark_tg(struct sk_buff *skb, const struct xt_action_param *par)
44 u_int32_t newmark; 44 u_int32_t newmark;
45 45
46 ct = nf_ct_get(skb, &ctinfo); 46 ct = nf_ct_get(skb, &ctinfo);
47 if (ct == NULL) 47 if (ct == NULL || nf_ct_is_untracked(ct))
48 return XT_CONTINUE; 48 return XT_CONTINUE;
49 49
50 switch (info->mode) { 50 switch (info->mode) {
@@ -97,7 +97,7 @@ connmark_mt(const struct sk_buff *skb, struct xt_action_param *par)
97 const struct nf_conn *ct; 97 const struct nf_conn *ct;
98 98
99 ct = nf_ct_get(skb, &ctinfo); 99 ct = nf_ct_get(skb, &ctinfo);
100 if (ct == NULL) 100 if (ct == NULL || nf_ct_is_untracked(ct))
101 return false; 101 return false;
102 102
103 return ((ct->mark & info->mask) == info->mark) ^ info->invert; 103 return ((ct->mark & info->mask) == info->mark) ^ info->invert;
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 62bea4591054..246f29d365c0 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -329,7 +329,6 @@ static void netlink_sock_destruct(struct sock *sk)
329 if (nlk->cb_running) { 329 if (nlk->cb_running) {
330 if (nlk->cb.done) 330 if (nlk->cb.done)
331 nlk->cb.done(&nlk->cb); 331 nlk->cb.done(&nlk->cb);
332
333 module_put(nlk->cb.module); 332 module_put(nlk->cb.module);
334 kfree_skb(nlk->cb.skb); 333 kfree_skb(nlk->cb.skb);
335 } 334 }
@@ -346,6 +345,14 @@ static void netlink_sock_destruct(struct sock *sk)
346 WARN_ON(nlk_sk(sk)->groups); 345 WARN_ON(nlk_sk(sk)->groups);
347} 346}
348 347
348static void netlink_sock_destruct_work(struct work_struct *work)
349{
350 struct netlink_sock *nlk = container_of(work, struct netlink_sock,
351 work);
352
353 sk_free(&nlk->sk);
354}
355
349/* This lock without WQ_FLAG_EXCLUSIVE is good on UP and it is _very_ bad on 356/* This lock without WQ_FLAG_EXCLUSIVE is good on UP and it is _very_ bad on
350 * SMP. Look, when several writers sleep and reader wakes them up, all but one 357 * SMP. Look, when several writers sleep and reader wakes them up, all but one
351 * immediately hit write lock and grab all the cpus. Exclusive sleep solves 358 * immediately hit write lock and grab all the cpus. Exclusive sleep solves
@@ -648,8 +655,18 @@ out_module:
648static void deferred_put_nlk_sk(struct rcu_head *head) 655static void deferred_put_nlk_sk(struct rcu_head *head)
649{ 656{
650 struct netlink_sock *nlk = container_of(head, struct netlink_sock, rcu); 657 struct netlink_sock *nlk = container_of(head, struct netlink_sock, rcu);
658 struct sock *sk = &nlk->sk;
659
660 if (!atomic_dec_and_test(&sk->sk_refcnt))
661 return;
662
663 if (nlk->cb_running && nlk->cb.done) {
664 INIT_WORK(&nlk->work, netlink_sock_destruct_work);
665 schedule_work(&nlk->work);
666 return;
667 }
651 668
652 sock_put(&nlk->sk); 669 sk_free(sk);
653} 670}
654 671
655static int netlink_release(struct socket *sock) 672static int netlink_release(struct socket *sock)
diff --git a/net/netlink/af_netlink.h b/net/netlink/af_netlink.h
index 3cfd6cc60504..4fdb38318977 100644
--- a/net/netlink/af_netlink.h
+++ b/net/netlink/af_netlink.h
@@ -3,6 +3,7 @@
3 3
4#include <linux/rhashtable.h> 4#include <linux/rhashtable.h>
5#include <linux/atomic.h> 5#include <linux/atomic.h>
6#include <linux/workqueue.h>
6#include <net/sock.h> 7#include <net/sock.h>
7 8
8#define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8) 9#define NLGRPSZ(x) (ALIGN(x, sizeof(unsigned long) * 8) / 8)
@@ -33,6 +34,7 @@ struct netlink_sock {
33 34
34 struct rhash_head node; 35 struct rhash_head node;
35 struct rcu_head rcu; 36 struct rcu_head rcu;
37 struct work_struct work;
36}; 38};
37 39
38static inline struct netlink_sock *nlk_sk(struct sock *sk) 40static inline struct netlink_sock *nlk_sk(struct sock *sk)
diff --git a/net/netlink/diag.c b/net/netlink/diag.c
index b2f0e986a6f4..a5546249fb10 100644
--- a/net/netlink/diag.c
+++ b/net/netlink/diag.c
@@ -178,11 +178,8 @@ static int netlink_diag_dump(struct sk_buff *skb, struct netlink_callback *cb)
178 } 178 }
179 cb->args[1] = i; 179 cb->args[1] = i;
180 } else { 180 } else {
181 if (req->sdiag_protocol >= MAX_LINKS) { 181 if (req->sdiag_protocol >= MAX_LINKS)
182 read_unlock(&nl_table_lock);
183 rcu_read_unlock();
184 return -ENOENT; 182 return -ENOENT;
185 }
186 183
187 err = __netlink_diag_dump(skb, cb, req->sdiag_protocol, s_num); 184 err = __netlink_diag_dump(skb, cb, req->sdiag_protocol, s_num);
188 } 185 }
diff --git a/net/netlink/genetlink.c b/net/netlink/genetlink.c
index 23cc12639ba7..49c28e8ef01b 100644
--- a/net/netlink/genetlink.c
+++ b/net/netlink/genetlink.c
@@ -404,7 +404,7 @@ int __genl_register_family(struct genl_family *family)
404 404
405 err = genl_validate_assign_mc_groups(family); 405 err = genl_validate_assign_mc_groups(family);
406 if (err) 406 if (err)
407 goto errout_locked; 407 goto errout_free;
408 408
409 list_add_tail(&family->family_list, genl_family_chain(family->id)); 409 list_add_tail(&family->family_list, genl_family_chain(family->id));
410 genl_unlock_all(); 410 genl_unlock_all();
@@ -417,6 +417,8 @@ int __genl_register_family(struct genl_family *family)
417 417
418 return 0; 418 return 0;
419 419
420errout_free:
421 kfree(family->attrbuf);
420errout_locked: 422errout_locked:
421 genl_unlock_all(); 423 genl_unlock_all();
422errout: 424errout:
diff --git a/net/openvswitch/conntrack.c b/net/openvswitch/conntrack.c
index 31045ef44a82..fecefa2dc94e 100644
--- a/net/openvswitch/conntrack.c
+++ b/net/openvswitch/conntrack.c
@@ -370,8 +370,11 @@ static int handle_fragments(struct net *net, struct sw_flow_key *key,
370 skb_orphan(skb); 370 skb_orphan(skb);
371 memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm)); 371 memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm));
372 err = nf_ct_frag6_gather(net, skb, user); 372 err = nf_ct_frag6_gather(net, skb, user);
373 if (err) 373 if (err) {
374 if (err != -EINPROGRESS)
375 kfree_skb(skb);
374 return err; 376 return err;
377 }
375 378
376 key->ip.proto = ipv6_hdr(skb)->nexthdr; 379 key->ip.proto = ipv6_hdr(skb)->nexthdr;
377 ovs_cb.mru = IP6CB(skb)->frag_max_size; 380 ovs_cb.mru = IP6CB(skb)->frag_max_size;
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index d2238b204691..dd2332390c45 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -3648,19 +3648,25 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
3648 3648
3649 if (optlen != sizeof(val)) 3649 if (optlen != sizeof(val))
3650 return -EINVAL; 3650 return -EINVAL;
3651 if (po->rx_ring.pg_vec || po->tx_ring.pg_vec)
3652 return -EBUSY;
3653 if (copy_from_user(&val, optval, sizeof(val))) 3651 if (copy_from_user(&val, optval, sizeof(val)))
3654 return -EFAULT; 3652 return -EFAULT;
3655 switch (val) { 3653 switch (val) {
3656 case TPACKET_V1: 3654 case TPACKET_V1:
3657 case TPACKET_V2: 3655 case TPACKET_V2:
3658 case TPACKET_V3: 3656 case TPACKET_V3:
3659 po->tp_version = val; 3657 break;
3660 return 0;
3661 default: 3658 default:
3662 return -EINVAL; 3659 return -EINVAL;
3663 } 3660 }
3661 lock_sock(sk);
3662 if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) {
3663 ret = -EBUSY;
3664 } else {
3665 po->tp_version = val;
3666 ret = 0;
3667 }
3668 release_sock(sk);
3669 return ret;
3664 } 3670 }
3665 case PACKET_RESERVE: 3671 case PACKET_RESERVE:
3666 { 3672 {
@@ -4164,6 +4170,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
4164 /* Added to avoid minimal code churn */ 4170 /* Added to avoid minimal code churn */
4165 struct tpacket_req *req = &req_u->req; 4171 struct tpacket_req *req = &req_u->req;
4166 4172
4173 lock_sock(sk);
4167 /* Opening a Tx-ring is NOT supported in TPACKET_V3 */ 4174 /* Opening a Tx-ring is NOT supported in TPACKET_V3 */
4168 if (!closing && tx_ring && (po->tp_version > TPACKET_V2)) { 4175 if (!closing && tx_ring && (po->tp_version > TPACKET_V2)) {
4169 net_warn_ratelimited("Tx-ring is not supported.\n"); 4176 net_warn_ratelimited("Tx-ring is not supported.\n");
@@ -4245,7 +4252,6 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
4245 goto out; 4252 goto out;
4246 } 4253 }
4247 4254
4248 lock_sock(sk);
4249 4255
4250 /* Detach socket from network */ 4256 /* Detach socket from network */
4251 spin_lock(&po->bind_lock); 4257 spin_lock(&po->bind_lock);
@@ -4294,11 +4300,11 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
4294 if (!tx_ring) 4300 if (!tx_ring)
4295 prb_shutdown_retire_blk_timer(po, rb_queue); 4301 prb_shutdown_retire_blk_timer(po, rb_queue);
4296 } 4302 }
4297 release_sock(sk);
4298 4303
4299 if (pg_vec) 4304 if (pg_vec)
4300 free_pg_vec(pg_vec, order, req->tp_block_nr); 4305 free_pg_vec(pg_vec, order, req->tp_block_nr);
4301out: 4306out:
4307 release_sock(sk);
4302 return err; 4308 return err;
4303} 4309}
4304 4310
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index fcddacc92e01..20e2923dc827 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -659,6 +659,8 @@ out_recv:
659out_pernet: 659out_pernet:
660 unregister_pernet_subsys(&rds_tcp_net_ops); 660 unregister_pernet_subsys(&rds_tcp_net_ops);
661out_slab: 661out_slab:
662 if (unregister_netdevice_notifier(&rds_tcp_dev_notifier))
663 pr_warn("could not unregister rds_tcp_dev_notifier\n");
662 kmem_cache_destroy(rds_tcp_conn_slab); 664 kmem_cache_destroy(rds_tcp_conn_slab);
663out: 665out:
664 return ret; 666 return ret;
diff --git a/net/sched/act_pedit.c b/net/sched/act_pedit.c
index b54d56d4959b..cf9b2fe8eac6 100644
--- a/net/sched/act_pedit.c
+++ b/net/sched/act_pedit.c
@@ -108,6 +108,17 @@ static void tcf_pedit_cleanup(struct tc_action *a, int bind)
108 kfree(keys); 108 kfree(keys);
109} 109}
110 110
111static bool offset_valid(struct sk_buff *skb, int offset)
112{
113 if (offset > 0 && offset > skb->len)
114 return false;
115
116 if (offset < 0 && -offset > skb_headroom(skb))
117 return false;
118
119 return true;
120}
121
111static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a, 122static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
112 struct tcf_result *res) 123 struct tcf_result *res)
113{ 124{
@@ -134,6 +145,11 @@ static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
134 if (tkey->offmask) { 145 if (tkey->offmask) {
135 char *d, _d; 146 char *d, _d;
136 147
148 if (!offset_valid(skb, off + tkey->at)) {
149 pr_info("tc filter pedit 'at' offset %d out of bounds\n",
150 off + tkey->at);
151 goto bad;
152 }
137 d = skb_header_pointer(skb, off + tkey->at, 1, 153 d = skb_header_pointer(skb, off + tkey->at, 1,
138 &_d); 154 &_d);
139 if (!d) 155 if (!d)
@@ -146,10 +162,10 @@ static int tcf_pedit(struct sk_buff *skb, const struct tc_action *a,
146 " offset must be on 32 bit boundaries\n"); 162 " offset must be on 32 bit boundaries\n");
147 goto bad; 163 goto bad;
148 } 164 }
149 if (offset > 0 && offset > skb->len) { 165
150 pr_info("tc filter pedit" 166 if (!offset_valid(skb, off + offset)) {
151 " offset %d can't exceed pkt length %d\n", 167 pr_info("tc filter pedit offset %d out of bounds\n",
152 offset, skb->len); 168 offset);
153 goto bad; 169 goto bad;
154 } 170 }
155 171
diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
index 2b2a7974e4bb..b05d4a2155b0 100644
--- a/net/sched/cls_api.c
+++ b/net/sched/cls_api.c
@@ -430,7 +430,8 @@ static int tfilter_notify(struct net *net, struct sk_buff *oskb,
430 if (!skb) 430 if (!skb)
431 return -ENOBUFS; 431 return -ENOBUFS;
432 432
433 if (tcf_fill_node(net, skb, tp, fh, portid, n->nlmsg_seq, 0, event) <= 0) { 433 if (tcf_fill_node(net, skb, tp, fh, portid, n->nlmsg_seq,
434 n->nlmsg_flags, event) <= 0) {
434 kfree_skb(skb); 435 kfree_skb(skb);
435 return -EINVAL; 436 return -EINVAL;
436 } 437 }
diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c
index eb219b78cd49..5877f6061b57 100644
--- a/net/sched/cls_basic.c
+++ b/net/sched/cls_basic.c
@@ -62,9 +62,6 @@ static unsigned long basic_get(struct tcf_proto *tp, u32 handle)
62 struct basic_head *head = rtnl_dereference(tp->root); 62 struct basic_head *head = rtnl_dereference(tp->root);
63 struct basic_filter *f; 63 struct basic_filter *f;
64 64
65 if (head == NULL)
66 return 0UL;
67
68 list_for_each_entry(f, &head->flist, link) { 65 list_for_each_entry(f, &head->flist, link) {
69 if (f->handle == handle) { 66 if (f->handle == handle) {
70 l = (unsigned long) f; 67 l = (unsigned long) f;
@@ -109,7 +106,6 @@ static bool basic_destroy(struct tcf_proto *tp, bool force)
109 tcf_unbind_filter(tp, &f->res); 106 tcf_unbind_filter(tp, &f->res);
110 call_rcu(&f->rcu, basic_delete_filter); 107 call_rcu(&f->rcu, basic_delete_filter);
111 } 108 }
112 RCU_INIT_POINTER(tp->root, NULL);
113 kfree_rcu(head, rcu); 109 kfree_rcu(head, rcu);
114 return true; 110 return true;
115} 111}
diff --git a/net/sched/cls_bpf.c b/net/sched/cls_bpf.c
index bb1d5a487081..0a47ba5e6109 100644
--- a/net/sched/cls_bpf.c
+++ b/net/sched/cls_bpf.c
@@ -292,7 +292,6 @@ static bool cls_bpf_destroy(struct tcf_proto *tp, bool force)
292 call_rcu(&prog->rcu, __cls_bpf_delete_prog); 292 call_rcu(&prog->rcu, __cls_bpf_delete_prog);
293 } 293 }
294 294
295 RCU_INIT_POINTER(tp->root, NULL);
296 kfree_rcu(head, rcu); 295 kfree_rcu(head, rcu);
297 return true; 296 return true;
298} 297}
@@ -303,9 +302,6 @@ static unsigned long cls_bpf_get(struct tcf_proto *tp, u32 handle)
303 struct cls_bpf_prog *prog; 302 struct cls_bpf_prog *prog;
304 unsigned long ret = 0UL; 303 unsigned long ret = 0UL;
305 304
306 if (head == NULL)
307 return 0UL;
308
309 list_for_each_entry(prog, &head->plist, link) { 305 list_for_each_entry(prog, &head->plist, link) {
310 if (prog->handle == handle) { 306 if (prog->handle == handle) {
311 ret = (unsigned long) prog; 307 ret = (unsigned long) prog;
diff --git a/net/sched/cls_cgroup.c b/net/sched/cls_cgroup.c
index 85233c470035..c1f20077837f 100644
--- a/net/sched/cls_cgroup.c
+++ b/net/sched/cls_cgroup.c
@@ -137,11 +137,10 @@ static bool cls_cgroup_destroy(struct tcf_proto *tp, bool force)
137 137
138 if (!force) 138 if (!force)
139 return false; 139 return false;
140 140 /* Head can still be NULL due to cls_cgroup_init(). */
141 if (head) { 141 if (head)
142 RCU_INIT_POINTER(tp->root, NULL);
143 call_rcu(&head->rcu, cls_cgroup_destroy_rcu); 142 call_rcu(&head->rcu, cls_cgroup_destroy_rcu);
144 } 143
145 return true; 144 return true;
146} 145}
147 146
diff --git a/net/sched/cls_flow.c b/net/sched/cls_flow.c
index e39672394c7b..6575aba87630 100644
--- a/net/sched/cls_flow.c
+++ b/net/sched/cls_flow.c
@@ -596,7 +596,6 @@ static bool flow_destroy(struct tcf_proto *tp, bool force)
596 list_del_rcu(&f->list); 596 list_del_rcu(&f->list);
597 call_rcu(&f->rcu, flow_destroy_filter); 597 call_rcu(&f->rcu, flow_destroy_filter);
598 } 598 }
599 RCU_INIT_POINTER(tp->root, NULL);
600 kfree_rcu(head, rcu); 599 kfree_rcu(head, rcu);
601 return true; 600 return true;
602} 601}
diff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c
index f6f40fba599b..904442421db3 100644
--- a/net/sched/cls_flower.c
+++ b/net/sched/cls_flower.c
@@ -13,6 +13,7 @@
13#include <linux/init.h> 13#include <linux/init.h>
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/rhashtable.h> 15#include <linux/rhashtable.h>
16#include <linux/workqueue.h>
16 17
17#include <linux/if_ether.h> 18#include <linux/if_ether.h>
18#include <linux/in6.h> 19#include <linux/in6.h>
@@ -64,7 +65,10 @@ struct cls_fl_head {
64 bool mask_assigned; 65 bool mask_assigned;
65 struct list_head filters; 66 struct list_head filters;
66 struct rhashtable_params ht_params; 67 struct rhashtable_params ht_params;
67 struct rcu_head rcu; 68 union {
69 struct work_struct work;
70 struct rcu_head rcu;
71 };
68}; 72};
69 73
70struct cls_fl_filter { 74struct cls_fl_filter {
@@ -269,6 +273,24 @@ static void fl_hw_update_stats(struct tcf_proto *tp, struct cls_fl_filter *f)
269 dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, &tc); 273 dev->netdev_ops->ndo_setup_tc(dev, tp->q->handle, tp->protocol, &tc);
270} 274}
271 275
276static void fl_destroy_sleepable(struct work_struct *work)
277{
278 struct cls_fl_head *head = container_of(work, struct cls_fl_head,
279 work);
280 if (head->mask_assigned)
281 rhashtable_destroy(&head->ht);
282 kfree(head);
283 module_put(THIS_MODULE);
284}
285
286static void fl_destroy_rcu(struct rcu_head *rcu)
287{
288 struct cls_fl_head *head = container_of(rcu, struct cls_fl_head, rcu);
289
290 INIT_WORK(&head->work, fl_destroy_sleepable);
291 schedule_work(&head->work);
292}
293
272static bool fl_destroy(struct tcf_proto *tp, bool force) 294static bool fl_destroy(struct tcf_proto *tp, bool force)
273{ 295{
274 struct cls_fl_head *head = rtnl_dereference(tp->root); 296 struct cls_fl_head *head = rtnl_dereference(tp->root);
@@ -282,10 +304,9 @@ static bool fl_destroy(struct tcf_proto *tp, bool force)
282 list_del_rcu(&f->list); 304 list_del_rcu(&f->list);
283 call_rcu(&f->rcu, fl_destroy_filter); 305 call_rcu(&f->rcu, fl_destroy_filter);
284 } 306 }
285 RCU_INIT_POINTER(tp->root, NULL); 307
286 if (head->mask_assigned) 308 __module_get(THIS_MODULE);
287 rhashtable_destroy(&head->ht); 309 call_rcu(&head->rcu, fl_destroy_rcu);
288 kfree_rcu(head, rcu);
289 return true; 310 return true;
290} 311}
291 312
@@ -711,8 +732,9 @@ static int fl_change(struct net *net, struct sk_buff *in_skb,
711 goto errout; 732 goto errout;
712 733
713 if (fold) { 734 if (fold) {
714 rhashtable_remove_fast(&head->ht, &fold->ht_node, 735 if (!tc_skip_sw(fold->flags))
715 head->ht_params); 736 rhashtable_remove_fast(&head->ht, &fold->ht_node,
737 head->ht_params);
716 fl_hw_destroy_filter(tp, (unsigned long)fold); 738 fl_hw_destroy_filter(tp, (unsigned long)fold);
717 } 739 }
718 740
@@ -739,8 +761,9 @@ static int fl_delete(struct tcf_proto *tp, unsigned long arg)
739 struct cls_fl_head *head = rtnl_dereference(tp->root); 761 struct cls_fl_head *head = rtnl_dereference(tp->root);
740 struct cls_fl_filter *f = (struct cls_fl_filter *) arg; 762 struct cls_fl_filter *f = (struct cls_fl_filter *) arg;
741 763
742 rhashtable_remove_fast(&head->ht, &f->ht_node, 764 if (!tc_skip_sw(f->flags))
743 head->ht_params); 765 rhashtable_remove_fast(&head->ht, &f->ht_node,
766 head->ht_params);
744 list_del_rcu(&f->list); 767 list_del_rcu(&f->list);
745 fl_hw_destroy_filter(tp, (unsigned long)f); 768 fl_hw_destroy_filter(tp, (unsigned long)f);
746 tcf_unbind_filter(tp, &f->res); 769 tcf_unbind_filter(tp, &f->res);
diff --git a/net/sched/cls_matchall.c b/net/sched/cls_matchall.c
index 25927b6c4436..f935429bd5ef 100644
--- a/net/sched/cls_matchall.c
+++ b/net/sched/cls_matchall.c
@@ -114,7 +114,6 @@ static bool mall_destroy(struct tcf_proto *tp, bool force)
114 114
115 call_rcu(&f->rcu, mall_destroy_filter); 115 call_rcu(&f->rcu, mall_destroy_filter);
116 } 116 }
117 RCU_INIT_POINTER(tp->root, NULL);
118 kfree_rcu(head, rcu); 117 kfree_rcu(head, rcu);
119 return true; 118 return true;
120} 119}
diff --git a/net/sched/cls_rsvp.h b/net/sched/cls_rsvp.h
index 4f05a19fb073..322438fb3ffc 100644
--- a/net/sched/cls_rsvp.h
+++ b/net/sched/cls_rsvp.h
@@ -152,7 +152,8 @@ static int rsvp_classify(struct sk_buff *skb, const struct tcf_proto *tp,
152 return -1; 152 return -1;
153 nhptr = ip_hdr(skb); 153 nhptr = ip_hdr(skb);
154#endif 154#endif
155 155 if (unlikely(!head))
156 return -1;
156restart: 157restart:
157 158
158#if RSVP_DST_LEN == 4 159#if RSVP_DST_LEN == 4
diff --git a/net/sched/cls_tcindex.c b/net/sched/cls_tcindex.c
index 96144bdf30db..0751245a6ace 100644
--- a/net/sched/cls_tcindex.c
+++ b/net/sched/cls_tcindex.c
@@ -543,7 +543,6 @@ static bool tcindex_destroy(struct tcf_proto *tp, bool force)
543 walker.fn = tcindex_destroy_element; 543 walker.fn = tcindex_destroy_element;
544 tcindex_walk(tp, &walker); 544 tcindex_walk(tp, &walker);
545 545
546 RCU_INIT_POINTER(tp->root, NULL);
547 call_rcu(&p->rcu, __tcindex_destroy); 546 call_rcu(&p->rcu, __tcindex_destroy);
548 return true; 547 return true;
549} 548}
diff --git a/net/sctp/input.c b/net/sctp/input.c
index a2ea1d1cc06a..a01a56ec8b8c 100644
--- a/net/sctp/input.c
+++ b/net/sctp/input.c
@@ -181,9 +181,10 @@ int sctp_rcv(struct sk_buff *skb)
181 * bound to another interface, via SO_BINDTODEVICE, treat it as OOTB 181 * bound to another interface, via SO_BINDTODEVICE, treat it as OOTB
182 */ 182 */
183 if (sk->sk_bound_dev_if && (sk->sk_bound_dev_if != af->skb_iif(skb))) { 183 if (sk->sk_bound_dev_if && (sk->sk_bound_dev_if != af->skb_iif(skb))) {
184 if (asoc) { 184 if (transport) {
185 sctp_association_put(asoc); 185 sctp_transport_put(transport);
186 asoc = NULL; 186 asoc = NULL;
187 transport = NULL;
187 } else { 188 } else {
188 sctp_endpoint_put(ep); 189 sctp_endpoint_put(ep);
189 ep = NULL; 190 ep = NULL;
@@ -269,8 +270,8 @@ int sctp_rcv(struct sk_buff *skb)
269 bh_unlock_sock(sk); 270 bh_unlock_sock(sk);
270 271
271 /* Release the asoc/ep ref we took in the lookup calls. */ 272 /* Release the asoc/ep ref we took in the lookup calls. */
272 if (asoc) 273 if (transport)
273 sctp_association_put(asoc); 274 sctp_transport_put(transport);
274 else 275 else
275 sctp_endpoint_put(ep); 276 sctp_endpoint_put(ep);
276 277
@@ -283,8 +284,8 @@ discard_it:
283 284
284discard_release: 285discard_release:
285 /* Release the asoc/ep ref we took in the lookup calls. */ 286 /* Release the asoc/ep ref we took in the lookup calls. */
286 if (asoc) 287 if (transport)
287 sctp_association_put(asoc); 288 sctp_transport_put(transport);
288 else 289 else
289 sctp_endpoint_put(ep); 290 sctp_endpoint_put(ep);
290 291
@@ -300,6 +301,7 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
300{ 301{
301 struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; 302 struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
302 struct sctp_inq *inqueue = &chunk->rcvr->inqueue; 303 struct sctp_inq *inqueue = &chunk->rcvr->inqueue;
304 struct sctp_transport *t = chunk->transport;
303 struct sctp_ep_common *rcvr = NULL; 305 struct sctp_ep_common *rcvr = NULL;
304 int backloged = 0; 306 int backloged = 0;
305 307
@@ -351,7 +353,7 @@ int sctp_backlog_rcv(struct sock *sk, struct sk_buff *skb)
351done: 353done:
352 /* Release the refs we took in sctp_add_backlog */ 354 /* Release the refs we took in sctp_add_backlog */
353 if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type) 355 if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
354 sctp_association_put(sctp_assoc(rcvr)); 356 sctp_transport_put(t);
355 else if (SCTP_EP_TYPE_SOCKET == rcvr->type) 357 else if (SCTP_EP_TYPE_SOCKET == rcvr->type)
356 sctp_endpoint_put(sctp_ep(rcvr)); 358 sctp_endpoint_put(sctp_ep(rcvr));
357 else 359 else
@@ -363,6 +365,7 @@ done:
363static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb) 365static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
364{ 366{
365 struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk; 367 struct sctp_chunk *chunk = SCTP_INPUT_CB(skb)->chunk;
368 struct sctp_transport *t = chunk->transport;
366 struct sctp_ep_common *rcvr = chunk->rcvr; 369 struct sctp_ep_common *rcvr = chunk->rcvr;
367 int ret; 370 int ret;
368 371
@@ -373,7 +376,7 @@ static int sctp_add_backlog(struct sock *sk, struct sk_buff *skb)
373 * from us 376 * from us
374 */ 377 */
375 if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type) 378 if (SCTP_EP_TYPE_ASSOCIATION == rcvr->type)
376 sctp_association_hold(sctp_assoc(rcvr)); 379 sctp_transport_hold(t);
377 else if (SCTP_EP_TYPE_SOCKET == rcvr->type) 380 else if (SCTP_EP_TYPE_SOCKET == rcvr->type)
378 sctp_endpoint_hold(sctp_ep(rcvr)); 381 sctp_endpoint_hold(sctp_ep(rcvr));
379 else 382 else
@@ -537,15 +540,15 @@ struct sock *sctp_err_lookup(struct net *net, int family, struct sk_buff *skb,
537 return sk; 540 return sk;
538 541
539out: 542out:
540 sctp_association_put(asoc); 543 sctp_transport_put(transport);
541 return NULL; 544 return NULL;
542} 545}
543 546
544/* Common cleanup code for icmp/icmpv6 error handler. */ 547/* Common cleanup code for icmp/icmpv6 error handler. */
545void sctp_err_finish(struct sock *sk, struct sctp_association *asoc) 548void sctp_err_finish(struct sock *sk, struct sctp_transport *t)
546{ 549{
547 bh_unlock_sock(sk); 550 bh_unlock_sock(sk);
548 sctp_association_put(asoc); 551 sctp_transport_put(t);
549} 552}
550 553
551/* 554/*
@@ -641,7 +644,7 @@ void sctp_v4_err(struct sk_buff *skb, __u32 info)
641 } 644 }
642 645
643out_unlock: 646out_unlock:
644 sctp_err_finish(sk, asoc); 647 sctp_err_finish(sk, transport);
645} 648}
646 649
647/* 650/*
@@ -952,11 +955,8 @@ static struct sctp_association *__sctp_lookup_association(
952 goto out; 955 goto out;
953 956
954 asoc = t->asoc; 957 asoc = t->asoc;
955 sctp_association_hold(asoc);
956 *pt = t; 958 *pt = t;
957 959
958 sctp_transport_put(t);
959
960out: 960out:
961 return asoc; 961 return asoc;
962} 962}
@@ -986,7 +986,7 @@ int sctp_has_association(struct net *net,
986 struct sctp_transport *transport; 986 struct sctp_transport *transport;
987 987
988 if ((asoc = sctp_lookup_association(net, laddr, paddr, &transport))) { 988 if ((asoc = sctp_lookup_association(net, laddr, paddr, &transport))) {
989 sctp_association_put(asoc); 989 sctp_transport_put(transport);
990 return 1; 990 return 1;
991 } 991 }
992 992
@@ -1021,7 +1021,6 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
1021 struct sctphdr *sh = sctp_hdr(skb); 1021 struct sctphdr *sh = sctp_hdr(skb);
1022 union sctp_params params; 1022 union sctp_params params;
1023 sctp_init_chunk_t *init; 1023 sctp_init_chunk_t *init;
1024 struct sctp_transport *transport;
1025 struct sctp_af *af; 1024 struct sctp_af *af;
1026 1025
1027 /* 1026 /*
@@ -1052,7 +1051,7 @@ static struct sctp_association *__sctp_rcv_init_lookup(struct net *net,
1052 1051
1053 af->from_addr_param(paddr, params.addr, sh->source, 0); 1052 af->from_addr_param(paddr, params.addr, sh->source, 0);
1054 1053
1055 asoc = __sctp_lookup_association(net, laddr, paddr, &transport); 1054 asoc = __sctp_lookup_association(net, laddr, paddr, transportp);
1056 if (asoc) 1055 if (asoc)
1057 return asoc; 1056 return asoc;
1058 } 1057 }
diff --git a/net/sctp/ipv6.c b/net/sctp/ipv6.c
index f473779e8b1c..176af3080a2b 100644
--- a/net/sctp/ipv6.c
+++ b/net/sctp/ipv6.c
@@ -198,7 +198,7 @@ static void sctp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
198 } 198 }
199 199
200out_unlock: 200out_unlock:
201 sctp_err_finish(sk, asoc); 201 sctp_err_finish(sk, transport);
202out: 202out:
203 if (likely(idev != NULL)) 203 if (likely(idev != NULL))
204 in6_dev_put(idev); 204 in6_dev_put(idev);
diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 9fbb6feb8c27..f23ad913dc7a 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -1214,9 +1214,12 @@ static int __sctp_connect(struct sock *sk,
1214 1214
1215 timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK); 1215 timeo = sock_sndtimeo(sk, f_flags & O_NONBLOCK);
1216 1216
1217 err = sctp_wait_for_connect(asoc, &timeo); 1217 if (assoc_id)
1218 if ((err == 0 || err == -EINPROGRESS) && assoc_id)
1219 *assoc_id = asoc->assoc_id; 1218 *assoc_id = asoc->assoc_id;
1219 err = sctp_wait_for_connect(asoc, &timeo);
1220 /* Note: the asoc may be freed after the return of
1221 * sctp_wait_for_connect.
1222 */
1220 1223
1221 /* Don't free association on exit. */ 1224 /* Don't free association on exit. */
1222 asoc = NULL; 1225 asoc = NULL;
@@ -4282,19 +4285,18 @@ static void sctp_shutdown(struct sock *sk, int how)
4282{ 4285{
4283 struct net *net = sock_net(sk); 4286 struct net *net = sock_net(sk);
4284 struct sctp_endpoint *ep; 4287 struct sctp_endpoint *ep;
4285 struct sctp_association *asoc;
4286 4288
4287 if (!sctp_style(sk, TCP)) 4289 if (!sctp_style(sk, TCP))
4288 return; 4290 return;
4289 4291
4290 if (how & SEND_SHUTDOWN) { 4292 ep = sctp_sk(sk)->ep;
4293 if (how & SEND_SHUTDOWN && !list_empty(&ep->asocs)) {
4294 struct sctp_association *asoc;
4295
4291 sk->sk_state = SCTP_SS_CLOSING; 4296 sk->sk_state = SCTP_SS_CLOSING;
4292 ep = sctp_sk(sk)->ep; 4297 asoc = list_entry(ep->asocs.next,
4293 if (!list_empty(&ep->asocs)) { 4298 struct sctp_association, asocs);
4294 asoc = list_entry(ep->asocs.next, 4299 sctp_primitive_SHUTDOWN(net, asoc, NULL);
4295 struct sctp_association, asocs);
4296 sctp_primitive_SHUTDOWN(net, asoc, NULL);
4297 }
4298 } 4300 }
4299} 4301}
4300 4302
@@ -4480,12 +4482,9 @@ int sctp_transport_lookup_process(int (*cb)(struct sctp_transport *, void *),
4480 if (!transport || !sctp_transport_hold(transport)) 4482 if (!transport || !sctp_transport_hold(transport))
4481 goto out; 4483 goto out;
4482 4484
4483 sctp_association_hold(transport->asoc);
4484 sctp_transport_put(transport);
4485
4486 rcu_read_unlock(); 4485 rcu_read_unlock();
4487 err = cb(transport, p); 4486 err = cb(transport, p);
4488 sctp_association_put(transport->asoc); 4487 sctp_transport_put(transport);
4489 4488
4490out: 4489out:
4491 return err; 4490 return err;
diff --git a/net/socket.c b/net/socket.c
index 5a9bf5ee2464..73dc69f9681e 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -341,8 +341,23 @@ static const struct xattr_handler sockfs_xattr_handler = {
341 .get = sockfs_xattr_get, 341 .get = sockfs_xattr_get,
342}; 342};
343 343
344static int sockfs_security_xattr_set(const struct xattr_handler *handler,
345 struct dentry *dentry, struct inode *inode,
346 const char *suffix, const void *value,
347 size_t size, int flags)
348{
349 /* Handled by LSM. */
350 return -EAGAIN;
351}
352
353static const struct xattr_handler sockfs_security_xattr_handler = {
354 .prefix = XATTR_SECURITY_PREFIX,
355 .set = sockfs_security_xattr_set,
356};
357
344static const struct xattr_handler *sockfs_xattr_handlers[] = { 358static const struct xattr_handler *sockfs_xattr_handlers[] = {
345 &sockfs_xattr_handler, 359 &sockfs_xattr_handler,
360 &sockfs_security_xattr_handler,
346 NULL 361 NULL
347}; 362};
348 363
@@ -2038,6 +2053,8 @@ int __sys_sendmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen,
2038 if (err) 2053 if (err)
2039 break; 2054 break;
2040 ++datagrams; 2055 ++datagrams;
2056 if (msg_data_left(&msg_sys))
2057 break;
2041 cond_resched(); 2058 cond_resched();
2042 } 2059 }
2043 2060
diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index 34dd7b26ee5f..62a482790937 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -2753,14 +2753,18 @@ EXPORT_SYMBOL_GPL(rpc_cap_max_reconnect_timeout);
2753 2753
2754void rpc_clnt_xprt_switch_put(struct rpc_clnt *clnt) 2754void rpc_clnt_xprt_switch_put(struct rpc_clnt *clnt)
2755{ 2755{
2756 rcu_read_lock();
2756 xprt_switch_put(rcu_dereference(clnt->cl_xpi.xpi_xpswitch)); 2757 xprt_switch_put(rcu_dereference(clnt->cl_xpi.xpi_xpswitch));
2758 rcu_read_unlock();
2757} 2759}
2758EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_put); 2760EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_put);
2759 2761
2760void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt) 2762void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *clnt, struct rpc_xprt *xprt)
2761{ 2763{
2764 rcu_read_lock();
2762 rpc_xprt_switch_add_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch), 2765 rpc_xprt_switch_add_xprt(rcu_dereference(clnt->cl_xpi.xpi_xpswitch),
2763 xprt); 2766 xprt);
2767 rcu_read_unlock();
2764} 2768}
2765EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_add_xprt); 2769EXPORT_SYMBOL_GPL(rpc_clnt_xprt_switch_add_xprt);
2766 2770
@@ -2770,9 +2774,8 @@ bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
2770 struct rpc_xprt_switch *xps; 2774 struct rpc_xprt_switch *xps;
2771 bool ret; 2775 bool ret;
2772 2776
2773 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch);
2774
2775 rcu_read_lock(); 2777 rcu_read_lock();
2778 xps = rcu_dereference(clnt->cl_xpi.xpi_xpswitch);
2776 ret = rpc_xprt_switch_has_addr(xps, sap); 2779 ret = rpc_xprt_switch_has_addr(xps, sap);
2777 rcu_read_unlock(); 2780 rcu_read_unlock();
2778 return ret; 2781 return ret;
diff --git a/net/sunrpc/svc_xprt.c b/net/sunrpc/svc_xprt.c
index c3f652395a80..3bc1d61694cb 100644
--- a/net/sunrpc/svc_xprt.c
+++ b/net/sunrpc/svc_xprt.c
@@ -1002,14 +1002,8 @@ static void svc_age_temp_xprts(unsigned long closure)
1002void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr) 1002void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)
1003{ 1003{
1004 struct svc_xprt *xprt; 1004 struct svc_xprt *xprt;
1005 struct svc_sock *svsk;
1006 struct socket *sock;
1007 struct list_head *le, *next; 1005 struct list_head *le, *next;
1008 LIST_HEAD(to_be_closed); 1006 LIST_HEAD(to_be_closed);
1009 struct linger no_linger = {
1010 .l_onoff = 1,
1011 .l_linger = 0,
1012 };
1013 1007
1014 spin_lock_bh(&serv->sv_lock); 1008 spin_lock_bh(&serv->sv_lock);
1015 list_for_each_safe(le, next, &serv->sv_tempsocks) { 1009 list_for_each_safe(le, next, &serv->sv_tempsocks) {
@@ -1027,10 +1021,7 @@ void svc_age_temp_xprts_now(struct svc_serv *serv, struct sockaddr *server_addr)
1027 list_del_init(le); 1021 list_del_init(le);
1028 xprt = list_entry(le, struct svc_xprt, xpt_list); 1022 xprt = list_entry(le, struct svc_xprt, xpt_list);
1029 dprintk("svc_age_temp_xprts_now: closing %p\n", xprt); 1023 dprintk("svc_age_temp_xprts_now: closing %p\n", xprt);
1030 svsk = container_of(xprt, struct svc_sock, sk_xprt); 1024 xprt->xpt_ops->xpo_kill_temp_xprt(xprt);
1031 sock = svsk->sk_sock;
1032 kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER,
1033 (char *)&no_linger, sizeof(no_linger));
1034 svc_close_xprt(xprt); 1025 svc_close_xprt(xprt);
1035 } 1026 }
1036} 1027}
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
index 57625f64efd5..a4bc98265d88 100644
--- a/net/sunrpc/svcsock.c
+++ b/net/sunrpc/svcsock.c
@@ -438,6 +438,21 @@ static int svc_tcp_has_wspace(struct svc_xprt *xprt)
438 return !test_bit(SOCK_NOSPACE, &svsk->sk_sock->flags); 438 return !test_bit(SOCK_NOSPACE, &svsk->sk_sock->flags);
439} 439}
440 440
441static void svc_tcp_kill_temp_xprt(struct svc_xprt *xprt)
442{
443 struct svc_sock *svsk;
444 struct socket *sock;
445 struct linger no_linger = {
446 .l_onoff = 1,
447 .l_linger = 0,
448 };
449
450 svsk = container_of(xprt, struct svc_sock, sk_xprt);
451 sock = svsk->sk_sock;
452 kernel_setsockopt(sock, SOL_SOCKET, SO_LINGER,
453 (char *)&no_linger, sizeof(no_linger));
454}
455
441/* 456/*
442 * See net/ipv6/ip_sockglue.c : ip_cmsg_recv_pktinfo 457 * See net/ipv6/ip_sockglue.c : ip_cmsg_recv_pktinfo
443 */ 458 */
@@ -648,6 +663,10 @@ static struct svc_xprt *svc_udp_accept(struct svc_xprt *xprt)
648 return NULL; 663 return NULL;
649} 664}
650 665
666static void svc_udp_kill_temp_xprt(struct svc_xprt *xprt)
667{
668}
669
651static struct svc_xprt *svc_udp_create(struct svc_serv *serv, 670static struct svc_xprt *svc_udp_create(struct svc_serv *serv,
652 struct net *net, 671 struct net *net,
653 struct sockaddr *sa, int salen, 672 struct sockaddr *sa, int salen,
@@ -667,6 +686,7 @@ static struct svc_xprt_ops svc_udp_ops = {
667 .xpo_has_wspace = svc_udp_has_wspace, 686 .xpo_has_wspace = svc_udp_has_wspace,
668 .xpo_accept = svc_udp_accept, 687 .xpo_accept = svc_udp_accept,
669 .xpo_secure_port = svc_sock_secure_port, 688 .xpo_secure_port = svc_sock_secure_port,
689 .xpo_kill_temp_xprt = svc_udp_kill_temp_xprt,
670}; 690};
671 691
672static struct svc_xprt_class svc_udp_class = { 692static struct svc_xprt_class svc_udp_class = {
@@ -1242,6 +1262,7 @@ static struct svc_xprt_ops svc_tcp_ops = {
1242 .xpo_has_wspace = svc_tcp_has_wspace, 1262 .xpo_has_wspace = svc_tcp_has_wspace,
1243 .xpo_accept = svc_tcp_accept, 1263 .xpo_accept = svc_tcp_accept,
1244 .xpo_secure_port = svc_sock_secure_port, 1264 .xpo_secure_port = svc_sock_secure_port,
1265 .xpo_kill_temp_xprt = svc_tcp_kill_temp_xprt,
1245}; 1266};
1246 1267
1247static struct svc_xprt_class svc_tcp_class = { 1268static struct svc_xprt_class svc_tcp_class = {
diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c
index 210949562786..26b26beef2d4 100644
--- a/net/sunrpc/xprtrdma/frwr_ops.c
+++ b/net/sunrpc/xprtrdma/frwr_ops.c
@@ -44,18 +44,20 @@
44 * being done. 44 * being done.
45 * 45 *
46 * When the underlying transport disconnects, MRs are left in one of 46 * When the underlying transport disconnects, MRs are left in one of
47 * three states: 47 * four states:
48 * 48 *
49 * INVALID: The MR was not in use before the QP entered ERROR state. 49 * INVALID: The MR was not in use before the QP entered ERROR state.
50 * (Or, the LOCAL_INV WR has not completed or flushed yet).
51 *
52 * STALE: The MR was being registered or unregistered when the QP
53 * entered ERROR state, and the pending WR was flushed.
54 * 50 *
55 * VALID: The MR was registered before the QP entered ERROR state. 51 * VALID: The MR was registered before the QP entered ERROR state.
56 * 52 *
57 * When frwr_op_map encounters STALE and VALID MRs, they are recovered 53 * FLUSHED_FR: The MR was being registered when the QP entered ERROR
58 * with ib_dereg_mr and then are re-initialized. Beause MR recovery 54 * state, and the pending WR was flushed.
55 *
56 * FLUSHED_LI: The MR was being invalidated when the QP entered ERROR
57 * state, and the pending WR was flushed.
58 *
59 * When frwr_op_map encounters FLUSHED and VALID MRs, they are recovered
60 * with ib_dereg_mr and then are re-initialized. Because MR recovery
59 * allocates fresh resources, it is deferred to a workqueue, and the 61 * allocates fresh resources, it is deferred to a workqueue, and the
60 * recovered MRs are placed back on the rb_mws list when recovery is 62 * recovered MRs are placed back on the rb_mws list when recovery is
61 * complete. frwr_op_map allocates another MR for the current RPC while 63 * complete. frwr_op_map allocates another MR for the current RPC while
@@ -177,12 +179,15 @@ __frwr_reset_mr(struct rpcrdma_ia *ia, struct rpcrdma_mw *r)
177static void 179static void
178frwr_op_recover_mr(struct rpcrdma_mw *mw) 180frwr_op_recover_mr(struct rpcrdma_mw *mw)
179{ 181{
182 enum rpcrdma_frmr_state state = mw->frmr.fr_state;
180 struct rpcrdma_xprt *r_xprt = mw->mw_xprt; 183 struct rpcrdma_xprt *r_xprt = mw->mw_xprt;
181 struct rpcrdma_ia *ia = &r_xprt->rx_ia; 184 struct rpcrdma_ia *ia = &r_xprt->rx_ia;
182 int rc; 185 int rc;
183 186
184 rc = __frwr_reset_mr(ia, mw); 187 rc = __frwr_reset_mr(ia, mw);
185 ib_dma_unmap_sg(ia->ri_device, mw->mw_sg, mw->mw_nents, mw->mw_dir); 188 if (state != FRMR_FLUSHED_LI)
189 ib_dma_unmap_sg(ia->ri_device,
190 mw->mw_sg, mw->mw_nents, mw->mw_dir);
186 if (rc) 191 if (rc)
187 goto out_release; 192 goto out_release;
188 193
@@ -262,10 +267,8 @@ frwr_op_maxpages(struct rpcrdma_xprt *r_xprt)
262} 267}
263 268
264static void 269static void
265__frwr_sendcompletion_flush(struct ib_wc *wc, struct rpcrdma_frmr *frmr, 270__frwr_sendcompletion_flush(struct ib_wc *wc, const char *wr)
266 const char *wr)
267{ 271{
268 frmr->fr_state = FRMR_IS_STALE;
269 if (wc->status != IB_WC_WR_FLUSH_ERR) 272 if (wc->status != IB_WC_WR_FLUSH_ERR)
270 pr_err("rpcrdma: %s: %s (%u/0x%x)\n", 273 pr_err("rpcrdma: %s: %s (%u/0x%x)\n",
271 wr, ib_wc_status_msg(wc->status), 274 wr, ib_wc_status_msg(wc->status),
@@ -288,7 +291,8 @@ frwr_wc_fastreg(struct ib_cq *cq, struct ib_wc *wc)
288 if (wc->status != IB_WC_SUCCESS) { 291 if (wc->status != IB_WC_SUCCESS) {
289 cqe = wc->wr_cqe; 292 cqe = wc->wr_cqe;
290 frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe); 293 frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe);
291 __frwr_sendcompletion_flush(wc, frmr, "fastreg"); 294 frmr->fr_state = FRMR_FLUSHED_FR;
295 __frwr_sendcompletion_flush(wc, "fastreg");
292 } 296 }
293} 297}
294 298
@@ -308,7 +312,8 @@ frwr_wc_localinv(struct ib_cq *cq, struct ib_wc *wc)
308 if (wc->status != IB_WC_SUCCESS) { 312 if (wc->status != IB_WC_SUCCESS) {
309 cqe = wc->wr_cqe; 313 cqe = wc->wr_cqe;
310 frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe); 314 frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe);
311 __frwr_sendcompletion_flush(wc, frmr, "localinv"); 315 frmr->fr_state = FRMR_FLUSHED_LI;
316 __frwr_sendcompletion_flush(wc, "localinv");
312 } 317 }
313} 318}
314 319
@@ -328,8 +333,10 @@ frwr_wc_localinv_wake(struct ib_cq *cq, struct ib_wc *wc)
328 /* WARNING: Only wr_cqe and status are reliable at this point */ 333 /* WARNING: Only wr_cqe and status are reliable at this point */
329 cqe = wc->wr_cqe; 334 cqe = wc->wr_cqe;
330 frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe); 335 frmr = container_of(cqe, struct rpcrdma_frmr, fr_cqe);
331 if (wc->status != IB_WC_SUCCESS) 336 if (wc->status != IB_WC_SUCCESS) {
332 __frwr_sendcompletion_flush(wc, frmr, "localinv"); 337 frmr->fr_state = FRMR_FLUSHED_LI;
338 __frwr_sendcompletion_flush(wc, "localinv");
339 }
333 complete(&frmr->fr_linv_done); 340 complete(&frmr->fr_linv_done);
334} 341}
335 342
diff --git a/net/sunrpc/xprtrdma/svc_rdma_transport.c b/net/sunrpc/xprtrdma/svc_rdma_transport.c
index 6864fb967038..1334de2715c2 100644
--- a/net/sunrpc/xprtrdma/svc_rdma_transport.c
+++ b/net/sunrpc/xprtrdma/svc_rdma_transport.c
@@ -67,6 +67,7 @@ static void svc_rdma_detach(struct svc_xprt *xprt);
67static void svc_rdma_free(struct svc_xprt *xprt); 67static void svc_rdma_free(struct svc_xprt *xprt);
68static int svc_rdma_has_wspace(struct svc_xprt *xprt); 68static int svc_rdma_has_wspace(struct svc_xprt *xprt);
69static int svc_rdma_secure_port(struct svc_rqst *); 69static int svc_rdma_secure_port(struct svc_rqst *);
70static void svc_rdma_kill_temp_xprt(struct svc_xprt *);
70 71
71static struct svc_xprt_ops svc_rdma_ops = { 72static struct svc_xprt_ops svc_rdma_ops = {
72 .xpo_create = svc_rdma_create, 73 .xpo_create = svc_rdma_create,
@@ -79,6 +80,7 @@ static struct svc_xprt_ops svc_rdma_ops = {
79 .xpo_has_wspace = svc_rdma_has_wspace, 80 .xpo_has_wspace = svc_rdma_has_wspace,
80 .xpo_accept = svc_rdma_accept, 81 .xpo_accept = svc_rdma_accept,
81 .xpo_secure_port = svc_rdma_secure_port, 82 .xpo_secure_port = svc_rdma_secure_port,
83 .xpo_kill_temp_xprt = svc_rdma_kill_temp_xprt,
82}; 84};
83 85
84struct svc_xprt_class svc_rdma_class = { 86struct svc_xprt_class svc_rdma_class = {
@@ -1317,6 +1319,10 @@ static int svc_rdma_secure_port(struct svc_rqst *rqstp)
1317 return 1; 1319 return 1;
1318} 1320}
1319 1321
1322static void svc_rdma_kill_temp_xprt(struct svc_xprt *xprt)
1323{
1324}
1325
1320int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr) 1326int svc_rdma_send(struct svcxprt_rdma *xprt, struct ib_send_wr *wr)
1321{ 1327{
1322 struct ib_send_wr *bad_wr, *n_wr; 1328 struct ib_send_wr *bad_wr, *n_wr;
diff --git a/net/sunrpc/xprtrdma/xprt_rdma.h b/net/sunrpc/xprtrdma/xprt_rdma.h
index 0d35b761c883..6e1bba358203 100644
--- a/net/sunrpc/xprtrdma/xprt_rdma.h
+++ b/net/sunrpc/xprtrdma/xprt_rdma.h
@@ -216,7 +216,8 @@ struct rpcrdma_rep {
216enum rpcrdma_frmr_state { 216enum rpcrdma_frmr_state {
217 FRMR_IS_INVALID, /* ready to be used */ 217 FRMR_IS_INVALID, /* ready to be used */
218 FRMR_IS_VALID, /* in use */ 218 FRMR_IS_VALID, /* in use */
219 FRMR_IS_STALE, /* failed completion */ 219 FRMR_FLUSHED_FR, /* flushed FASTREG WR */
220 FRMR_FLUSHED_LI, /* flushed LOCALINV WR */
220}; 221};
221 222
222struct rpcrdma_frmr { 223struct rpcrdma_frmr {
diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c
index 975dbeb60ab0..52d74760fb68 100644
--- a/net/tipc/bearer.c
+++ b/net/tipc/bearer.c
@@ -421,6 +421,10 @@ int tipc_enable_l2_media(struct net *net, struct tipc_bearer *b,
421 dev = dev_get_by_name(net, driver_name); 421 dev = dev_get_by_name(net, driver_name);
422 if (!dev) 422 if (!dev)
423 return -ENODEV; 423 return -ENODEV;
424 if (tipc_mtu_bad(dev, 0)) {
425 dev_put(dev);
426 return -EINVAL;
427 }
424 428
425 /* Associate TIPC bearer with L2 bearer */ 429 /* Associate TIPC bearer with L2 bearer */
426 rcu_assign_pointer(b->media_ptr, dev); 430 rcu_assign_pointer(b->media_ptr, dev);
@@ -610,8 +614,6 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
610 if (!b) 614 if (!b)
611 return NOTIFY_DONE; 615 return NOTIFY_DONE;
612 616
613 b->mtu = dev->mtu;
614
615 switch (evt) { 617 switch (evt) {
616 case NETDEV_CHANGE: 618 case NETDEV_CHANGE:
617 if (netif_carrier_ok(dev)) 619 if (netif_carrier_ok(dev))
@@ -624,6 +626,11 @@ static int tipc_l2_device_event(struct notifier_block *nb, unsigned long evt,
624 tipc_reset_bearer(net, b); 626 tipc_reset_bearer(net, b);
625 break; 627 break;
626 case NETDEV_CHANGEMTU: 628 case NETDEV_CHANGEMTU:
629 if (tipc_mtu_bad(dev, 0)) {
630 bearer_disable(net, b);
631 break;
632 }
633 b->mtu = dev->mtu;
627 tipc_reset_bearer(net, b); 634 tipc_reset_bearer(net, b);
628 break; 635 break;
629 case NETDEV_CHANGEADDR: 636 case NETDEV_CHANGEADDR:
diff --git a/net/tipc/bearer.h b/net/tipc/bearer.h
index 78892e2f53e3..278ff7f616f9 100644
--- a/net/tipc/bearer.h
+++ b/net/tipc/bearer.h
@@ -39,6 +39,7 @@
39 39
40#include "netlink.h" 40#include "netlink.h"
41#include "core.h" 41#include "core.h"
42#include "msg.h"
42#include <net/genetlink.h> 43#include <net/genetlink.h>
43 44
44#define MAX_MEDIA 3 45#define MAX_MEDIA 3
@@ -59,6 +60,9 @@
59#define TIPC_MEDIA_TYPE_IB 2 60#define TIPC_MEDIA_TYPE_IB 2
60#define TIPC_MEDIA_TYPE_UDP 3 61#define TIPC_MEDIA_TYPE_UDP 3
61 62
63/* minimum bearer MTU */
64#define TIPC_MIN_BEARER_MTU (MAX_H_SIZE + INT_H_SIZE)
65
62/** 66/**
63 * struct tipc_media_addr - destination address used by TIPC bearers 67 * struct tipc_media_addr - destination address used by TIPC bearers
64 * @value: address info (format defined by media) 68 * @value: address info (format defined by media)
@@ -215,4 +219,13 @@ void tipc_bearer_xmit(struct net *net, u32 bearer_id,
215void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id, 219void tipc_bearer_bc_xmit(struct net *net, u32 bearer_id,
216 struct sk_buff_head *xmitq); 220 struct sk_buff_head *xmitq);
217 221
222/* check if device MTU is too low for tipc headers */
223static inline bool tipc_mtu_bad(struct net_device *dev, unsigned int reserve)
224{
225 if (dev->mtu >= TIPC_MIN_BEARER_MTU + reserve)
226 return false;
227 netdev_warn(dev, "MTU too low for tipc bearer\n");
228 return true;
229}
230
218#endif /* _TIPC_BEARER_H */ 231#endif /* _TIPC_BEARER_H */
diff --git a/net/tipc/link.c b/net/tipc/link.c
index 1055164c6232..bda89bf9f4ff 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -47,8 +47,8 @@
47#include <linux/pkt_sched.h> 47#include <linux/pkt_sched.h>
48 48
49struct tipc_stats { 49struct tipc_stats {
50 u32 sent_info; /* used in counting # sent packets */ 50 u32 sent_pkts;
51 u32 recv_info; /* used in counting # recv'd packets */ 51 u32 recv_pkts;
52 u32 sent_states; 52 u32 sent_states;
53 u32 recv_states; 53 u32 recv_states;
54 u32 sent_probes; 54 u32 sent_probes;
@@ -857,7 +857,6 @@ void tipc_link_reset(struct tipc_link *l)
857 l->acked = 0; 857 l->acked = 0;
858 l->silent_intv_cnt = 0; 858 l->silent_intv_cnt = 0;
859 l->rst_cnt = 0; 859 l->rst_cnt = 0;
860 l->stats.recv_info = 0;
861 l->stale_count = 0; 860 l->stale_count = 0;
862 l->bc_peer_is_up = false; 861 l->bc_peer_is_up = false;
863 memset(&l->mon_state, 0, sizeof(l->mon_state)); 862 memset(&l->mon_state, 0, sizeof(l->mon_state));
@@ -888,6 +887,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
888 struct sk_buff_head *transmq = &l->transmq; 887 struct sk_buff_head *transmq = &l->transmq;
889 struct sk_buff_head *backlogq = &l->backlogq; 888 struct sk_buff_head *backlogq = &l->backlogq;
890 struct sk_buff *skb, *_skb, *bskb; 889 struct sk_buff *skb, *_skb, *bskb;
890 int pkt_cnt = skb_queue_len(list);
891 891
892 /* Match msg importance against this and all higher backlog limits: */ 892 /* Match msg importance against this and all higher backlog limits: */
893 if (!skb_queue_empty(backlogq)) { 893 if (!skb_queue_empty(backlogq)) {
@@ -901,6 +901,11 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
901 return -EMSGSIZE; 901 return -EMSGSIZE;
902 } 902 }
903 903
904 if (pkt_cnt > 1) {
905 l->stats.sent_fragmented++;
906 l->stats.sent_fragments += pkt_cnt;
907 }
908
904 /* Prepare each packet for sending, and add to relevant queue: */ 909 /* Prepare each packet for sending, and add to relevant queue: */
905 while (skb_queue_len(list)) { 910 while (skb_queue_len(list)) {
906 skb = skb_peek(list); 911 skb = skb_peek(list);
@@ -920,6 +925,7 @@ int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list,
920 __skb_queue_tail(xmitq, _skb); 925 __skb_queue_tail(xmitq, _skb);
921 TIPC_SKB_CB(skb)->ackers = l->ackers; 926 TIPC_SKB_CB(skb)->ackers = l->ackers;
922 l->rcv_unacked = 0; 927 l->rcv_unacked = 0;
928 l->stats.sent_pkts++;
923 seqno++; 929 seqno++;
924 continue; 930 continue;
925 } 931 }
@@ -968,6 +974,7 @@ void tipc_link_advance_backlog(struct tipc_link *l, struct sk_buff_head *xmitq)
968 msg_set_ack(hdr, ack); 974 msg_set_ack(hdr, ack);
969 msg_set_bcast_ack(hdr, bc_ack); 975 msg_set_bcast_ack(hdr, bc_ack);
970 l->rcv_unacked = 0; 976 l->rcv_unacked = 0;
977 l->stats.sent_pkts++;
971 seqno++; 978 seqno++;
972 } 979 }
973 l->snd_nxt = seqno; 980 l->snd_nxt = seqno;
@@ -1260,7 +1267,7 @@ int tipc_link_rcv(struct tipc_link *l, struct sk_buff *skb,
1260 1267
1261 /* Deliver packet */ 1268 /* Deliver packet */
1262 l->rcv_nxt++; 1269 l->rcv_nxt++;
1263 l->stats.recv_info++; 1270 l->stats.recv_pkts++;
1264 if (!tipc_data_input(l, skb, l->inputq)) 1271 if (!tipc_data_input(l, skb, l->inputq))
1265 rc |= tipc_link_input(l, skb, l->inputq); 1272 rc |= tipc_link_input(l, skb, l->inputq);
1266 if (unlikely(++l->rcv_unacked >= TIPC_MIN_LINK_WIN)) 1273 if (unlikely(++l->rcv_unacked >= TIPC_MIN_LINK_WIN))
@@ -1492,8 +1499,9 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
1492 if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) 1499 if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL))
1493 l->tolerance = peers_tol; 1500 l->tolerance = peers_tol;
1494 1501
1495 if (peers_prio && in_range(peers_prio, TIPC_MIN_LINK_PRI, 1502 /* Update own prio if peer indicates a different value */
1496 TIPC_MAX_LINK_PRI)) { 1503 if ((peers_prio != l->priority) &&
1504 in_range(peers_prio, 1, TIPC_MAX_LINK_PRI)) {
1497 l->priority = peers_prio; 1505 l->priority = peers_prio;
1498 rc = tipc_link_fsm_evt(l, LINK_FAILURE_EVT); 1506 rc = tipc_link_fsm_evt(l, LINK_FAILURE_EVT);
1499 } 1507 }
@@ -1799,10 +1807,6 @@ void tipc_link_set_queue_limits(struct tipc_link *l, u32 win)
1799void tipc_link_reset_stats(struct tipc_link *l) 1807void tipc_link_reset_stats(struct tipc_link *l)
1800{ 1808{
1801 memset(&l->stats, 0, sizeof(l->stats)); 1809 memset(&l->stats, 0, sizeof(l->stats));
1802 if (!link_is_bc_sndlink(l)) {
1803 l->stats.sent_info = l->snd_nxt;
1804 l->stats.recv_info = l->rcv_nxt;
1805 }
1806} 1810}
1807 1811
1808static void link_print(struct tipc_link *l, const char *str) 1812static void link_print(struct tipc_link *l, const char *str)
@@ -1866,12 +1870,12 @@ static int __tipc_nl_add_stats(struct sk_buff *skb, struct tipc_stats *s)
1866 }; 1870 };
1867 1871
1868 struct nla_map map[] = { 1872 struct nla_map map[] = {
1869 {TIPC_NLA_STATS_RX_INFO, s->recv_info}, 1873 {TIPC_NLA_STATS_RX_INFO, 0},
1870 {TIPC_NLA_STATS_RX_FRAGMENTS, s->recv_fragments}, 1874 {TIPC_NLA_STATS_RX_FRAGMENTS, s->recv_fragments},
1871 {TIPC_NLA_STATS_RX_FRAGMENTED, s->recv_fragmented}, 1875 {TIPC_NLA_STATS_RX_FRAGMENTED, s->recv_fragmented},
1872 {TIPC_NLA_STATS_RX_BUNDLES, s->recv_bundles}, 1876 {TIPC_NLA_STATS_RX_BUNDLES, s->recv_bundles},
1873 {TIPC_NLA_STATS_RX_BUNDLED, s->recv_bundled}, 1877 {TIPC_NLA_STATS_RX_BUNDLED, s->recv_bundled},
1874 {TIPC_NLA_STATS_TX_INFO, s->sent_info}, 1878 {TIPC_NLA_STATS_TX_INFO, 0},
1875 {TIPC_NLA_STATS_TX_FRAGMENTS, s->sent_fragments}, 1879 {TIPC_NLA_STATS_TX_FRAGMENTS, s->sent_fragments},
1876 {TIPC_NLA_STATS_TX_FRAGMENTED, s->sent_fragmented}, 1880 {TIPC_NLA_STATS_TX_FRAGMENTED, s->sent_fragmented},
1877 {TIPC_NLA_STATS_TX_BUNDLES, s->sent_bundles}, 1881 {TIPC_NLA_STATS_TX_BUNDLES, s->sent_bundles},
@@ -1946,9 +1950,9 @@ int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg,
1946 goto attr_msg_full; 1950 goto attr_msg_full;
1947 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_MTU, link->mtu)) 1951 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_MTU, link->mtu))
1948 goto attr_msg_full; 1952 goto attr_msg_full;
1949 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, link->rcv_nxt)) 1953 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, link->stats.recv_pkts))
1950 goto attr_msg_full; 1954 goto attr_msg_full;
1951 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_TX, link->snd_nxt)) 1955 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_TX, link->stats.sent_pkts))
1952 goto attr_msg_full; 1956 goto attr_msg_full;
1953 1957
1954 if (tipc_link_is_up(link)) 1958 if (tipc_link_is_up(link))
@@ -2003,12 +2007,12 @@ static int __tipc_nl_add_bc_link_stat(struct sk_buff *skb,
2003 }; 2007 };
2004 2008
2005 struct nla_map map[] = { 2009 struct nla_map map[] = {
2006 {TIPC_NLA_STATS_RX_INFO, stats->recv_info}, 2010 {TIPC_NLA_STATS_RX_INFO, stats->recv_pkts},
2007 {TIPC_NLA_STATS_RX_FRAGMENTS, stats->recv_fragments}, 2011 {TIPC_NLA_STATS_RX_FRAGMENTS, stats->recv_fragments},
2008 {TIPC_NLA_STATS_RX_FRAGMENTED, stats->recv_fragmented}, 2012 {TIPC_NLA_STATS_RX_FRAGMENTED, stats->recv_fragmented},
2009 {TIPC_NLA_STATS_RX_BUNDLES, stats->recv_bundles}, 2013 {TIPC_NLA_STATS_RX_BUNDLES, stats->recv_bundles},
2010 {TIPC_NLA_STATS_RX_BUNDLED, stats->recv_bundled}, 2014 {TIPC_NLA_STATS_RX_BUNDLED, stats->recv_bundled},
2011 {TIPC_NLA_STATS_TX_INFO, stats->sent_info}, 2015 {TIPC_NLA_STATS_TX_INFO, stats->sent_pkts},
2012 {TIPC_NLA_STATS_TX_FRAGMENTS, stats->sent_fragments}, 2016 {TIPC_NLA_STATS_TX_FRAGMENTS, stats->sent_fragments},
2013 {TIPC_NLA_STATS_TX_FRAGMENTED, stats->sent_fragmented}, 2017 {TIPC_NLA_STATS_TX_FRAGMENTED, stats->sent_fragmented},
2014 {TIPC_NLA_STATS_TX_BUNDLES, stats->sent_bundles}, 2018 {TIPC_NLA_STATS_TX_BUNDLES, stats->sent_bundles},
@@ -2075,9 +2079,9 @@ int tipc_nl_add_bc_link(struct net *net, struct tipc_nl_msg *msg)
2075 goto attr_msg_full; 2079 goto attr_msg_full;
2076 if (nla_put_string(msg->skb, TIPC_NLA_LINK_NAME, bcl->name)) 2080 if (nla_put_string(msg->skb, TIPC_NLA_LINK_NAME, bcl->name))
2077 goto attr_msg_full; 2081 goto attr_msg_full;
2078 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, bcl->rcv_nxt)) 2082 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, 0))
2079 goto attr_msg_full; 2083 goto attr_msg_full;
2080 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_TX, bcl->snd_nxt)) 2084 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_TX, 0))
2081 goto attr_msg_full; 2085 goto attr_msg_full;
2082 2086
2083 prop = nla_nest_start(msg->skb, TIPC_NLA_LINK_PROP); 2087 prop = nla_nest_start(msg->skb, TIPC_NLA_LINK_PROP);
diff --git a/net/tipc/monitor.c b/net/tipc/monitor.c
index ed97a5876ebe..9e109bb1a207 100644
--- a/net/tipc/monitor.c
+++ b/net/tipc/monitor.c
@@ -455,14 +455,14 @@ void tipc_mon_rcv(struct net *net, void *data, u16 dlen, u32 addr,
455 int i, applied_bef; 455 int i, applied_bef;
456 456
457 state->probing = false; 457 state->probing = false;
458 if (!dlen)
459 return;
460 458
461 /* Sanity check received domain record */ 459 /* Sanity check received domain record */
462 if ((dlen < new_dlen) || ntohs(arrv_dom->len) != new_dlen) { 460 if (dlen < dom_rec_len(arrv_dom, 0))
463 pr_warn_ratelimited("Received illegal domain record\n"); 461 return;
462 if (dlen != dom_rec_len(arrv_dom, new_member_cnt))
463 return;
464 if ((dlen < new_dlen) || ntohs(arrv_dom->len) != new_dlen)
464 return; 465 return;
465 }
466 466
467 /* Synch generation numbers with peer if link just came up */ 467 /* Synch generation numbers with peer if link just came up */
468 if (!state->synched) { 468 if (!state->synched) {
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index f9f5f3c3dab5..41f013888f07 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1,7 +1,7 @@
1/* 1/*
2 * net/tipc/socket.c: TIPC socket API 2 * net/tipc/socket.c: TIPC socket API
3 * 3 *
4 * Copyright (c) 2001-2007, 2012-2015, Ericsson AB 4 * Copyright (c) 2001-2007, 2012-2016, Ericsson AB
5 * Copyright (c) 2004-2008, 2010-2013, Wind River Systems 5 * Copyright (c) 2004-2008, 2010-2013, Wind River Systems
6 * All rights reserved. 6 * All rights reserved.
7 * 7 *
@@ -129,54 +129,8 @@ static const struct proto_ops packet_ops;
129static const struct proto_ops stream_ops; 129static const struct proto_ops stream_ops;
130static const struct proto_ops msg_ops; 130static const struct proto_ops msg_ops;
131static struct proto tipc_proto; 131static struct proto tipc_proto;
132
133static const struct rhashtable_params tsk_rht_params; 132static const struct rhashtable_params tsk_rht_params;
134 133
135/*
136 * Revised TIPC socket locking policy:
137 *
138 * Most socket operations take the standard socket lock when they start
139 * and hold it until they finish (or until they need to sleep). Acquiring
140 * this lock grants the owner exclusive access to the fields of the socket
141 * data structures, with the exception of the backlog queue. A few socket
142 * operations can be done without taking the socket lock because they only
143 * read socket information that never changes during the life of the socket.
144 *
145 * Socket operations may acquire the lock for the associated TIPC port if they
146 * need to perform an operation on the port. If any routine needs to acquire
147 * both the socket lock and the port lock it must take the socket lock first
148 * to avoid the risk of deadlock.
149 *
150 * The dispatcher handling incoming messages cannot grab the socket lock in
151 * the standard fashion, since invoked it runs at the BH level and cannot block.
152 * Instead, it checks to see if the socket lock is currently owned by someone,
153 * and either handles the message itself or adds it to the socket's backlog
154 * queue; in the latter case the queued message is processed once the process
155 * owning the socket lock releases it.
156 *
157 * NOTE: Releasing the socket lock while an operation is sleeping overcomes
158 * the problem of a blocked socket operation preventing any other operations
159 * from occurring. However, applications must be careful if they have
160 * multiple threads trying to send (or receive) on the same socket, as these
161 * operations might interfere with each other. For example, doing a connect
162 * and a receive at the same time might allow the receive to consume the
163 * ACK message meant for the connect. While additional work could be done
164 * to try and overcome this, it doesn't seem to be worthwhile at the present.
165 *
166 * NOTE: Releasing the socket lock while an operation is sleeping also ensures
167 * that another operation that must be performed in a non-blocking manner is
168 * not delayed for very long because the lock has already been taken.
169 *
170 * NOTE: This code assumes that certain fields of a port/socket pair are
171 * constant over its lifetime; such fields can be examined without taking
172 * the socket lock and/or port lock, and do not need to be re-read even
173 * after resuming processing after waiting. These fields include:
174 * - socket type
175 * - pointer to socket sk structure (aka tipc_sock structure)
176 * - pointer to port structure
177 * - port reference
178 */
179
180static u32 tsk_own_node(struct tipc_sock *tsk) 134static u32 tsk_own_node(struct tipc_sock *tsk)
181{ 135{
182 return msg_prevnode(&tsk->phdr); 136 return msg_prevnode(&tsk->phdr);
@@ -232,7 +186,7 @@ static struct tipc_sock *tipc_sk(const struct sock *sk)
232 186
233static bool tsk_conn_cong(struct tipc_sock *tsk) 187static bool tsk_conn_cong(struct tipc_sock *tsk)
234{ 188{
235 return tsk->snt_unacked >= tsk->snd_win; 189 return tsk->snt_unacked > tsk->snd_win;
236} 190}
237 191
238/* tsk_blocks(): translate a buffer size in bytes to number of 192/* tsk_blocks(): translate a buffer size in bytes to number of
diff --git a/net/tipc/udp_media.c b/net/tipc/udp_media.c
index 78cab9c5a445..b58dc95f3d35 100644
--- a/net/tipc/udp_media.c
+++ b/net/tipc/udp_media.c
@@ -697,6 +697,11 @@ static int tipc_udp_enable(struct net *net, struct tipc_bearer *b,
697 udp_conf.local_ip.s_addr = htonl(INADDR_ANY); 697 udp_conf.local_ip.s_addr = htonl(INADDR_ANY);
698 udp_conf.use_udp_checksums = false; 698 udp_conf.use_udp_checksums = false;
699 ub->ifindex = dev->ifindex; 699 ub->ifindex = dev->ifindex;
700 if (tipc_mtu_bad(dev, sizeof(struct iphdr) +
701 sizeof(struct udphdr))) {
702 err = -EINVAL;
703 goto err;
704 }
700 b->mtu = dev->mtu - sizeof(struct iphdr) 705 b->mtu = dev->mtu - sizeof(struct iphdr)
701 - sizeof(struct udphdr); 706 - sizeof(struct udphdr);
702#if IS_ENABLED(CONFIG_IPV6) 707#if IS_ENABLED(CONFIG_IPV6)
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
index 145082e2ba36..2358f2690ec5 100644
--- a/net/unix/af_unix.c
+++ b/net/unix/af_unix.c
@@ -2199,7 +2199,8 @@ out:
2199 * Sleep until more data has arrived. But check for races.. 2199 * Sleep until more data has arrived. But check for races..
2200 */ 2200 */
2201static long unix_stream_data_wait(struct sock *sk, long timeo, 2201static long unix_stream_data_wait(struct sock *sk, long timeo,
2202 struct sk_buff *last, unsigned int last_len) 2202 struct sk_buff *last, unsigned int last_len,
2203 bool freezable)
2203{ 2204{
2204 struct sk_buff *tail; 2205 struct sk_buff *tail;
2205 DEFINE_WAIT(wait); 2206 DEFINE_WAIT(wait);
@@ -2220,7 +2221,10 @@ static long unix_stream_data_wait(struct sock *sk, long timeo,
2220 2221
2221 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk); 2222 sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
2222 unix_state_unlock(sk); 2223 unix_state_unlock(sk);
2223 timeo = freezable_schedule_timeout(timeo); 2224 if (freezable)
2225 timeo = freezable_schedule_timeout(timeo);
2226 else
2227 timeo = schedule_timeout(timeo);
2224 unix_state_lock(sk); 2228 unix_state_lock(sk);
2225 2229
2226 if (sock_flag(sk, SOCK_DEAD)) 2230 if (sock_flag(sk, SOCK_DEAD))
@@ -2250,7 +2254,8 @@ struct unix_stream_read_state {
2250 unsigned int splice_flags; 2254 unsigned int splice_flags;
2251}; 2255};
2252 2256
2253static int unix_stream_read_generic(struct unix_stream_read_state *state) 2257static int unix_stream_read_generic(struct unix_stream_read_state *state,
2258 bool freezable)
2254{ 2259{
2255 struct scm_cookie scm; 2260 struct scm_cookie scm;
2256 struct socket *sock = state->socket; 2261 struct socket *sock = state->socket;
@@ -2330,7 +2335,7 @@ again:
2330 mutex_unlock(&u->iolock); 2335 mutex_unlock(&u->iolock);
2331 2336
2332 timeo = unix_stream_data_wait(sk, timeo, last, 2337 timeo = unix_stream_data_wait(sk, timeo, last,
2333 last_len); 2338 last_len, freezable);
2334 2339
2335 if (signal_pending(current)) { 2340 if (signal_pending(current)) {
2336 err = sock_intr_errno(timeo); 2341 err = sock_intr_errno(timeo);
@@ -2472,7 +2477,7 @@ static int unix_stream_recvmsg(struct socket *sock, struct msghdr *msg,
2472 .flags = flags 2477 .flags = flags
2473 }; 2478 };
2474 2479
2475 return unix_stream_read_generic(&state); 2480 return unix_stream_read_generic(&state, true);
2476} 2481}
2477 2482
2478static int unix_stream_splice_actor(struct sk_buff *skb, 2483static int unix_stream_splice_actor(struct sk_buff *skb,
@@ -2503,7 +2508,7 @@ static ssize_t unix_stream_splice_read(struct socket *sock, loff_t *ppos,
2503 flags & SPLICE_F_NONBLOCK) 2508 flags & SPLICE_F_NONBLOCK)
2504 state.flags = MSG_DONTWAIT; 2509 state.flags = MSG_DONTWAIT;
2505 2510
2506 return unix_stream_read_generic(&state); 2511 return unix_stream_read_generic(&state, false);
2507} 2512}
2508 2513
2509static int unix_shutdown(struct socket *sock, int mode) 2514static int unix_shutdown(struct socket *sock, int mode)
@@ -2812,7 +2817,8 @@ static int unix_seq_show(struct seq_file *seq, void *v)
2812 i++; 2817 i++;
2813 } 2818 }
2814 for ( ; i < len; i++) 2819 for ( ; i < len; i++)
2815 seq_putc(seq, u->addr->name->sun_path[i]); 2820 seq_putc(seq, u->addr->name->sun_path[i] ?:
2821 '@');
2816 } 2822 }
2817 unix_state_unlock(s); 2823 unix_state_unlock(s);
2818 seq_putc(seq, '\n'); 2824 seq_putc(seq, '\n');
diff --git a/net/wireless/core.h b/net/wireless/core.h
index 08d2e948c9ad..f0c0c8a48c92 100644
--- a/net/wireless/core.h
+++ b/net/wireless/core.h
@@ -71,6 +71,7 @@ struct cfg80211_registered_device {
71 struct list_head bss_list; 71 struct list_head bss_list;
72 struct rb_root bss_tree; 72 struct rb_root bss_tree;
73 u32 bss_generation; 73 u32 bss_generation;
74 u32 bss_entries;
74 struct cfg80211_scan_request *scan_req; /* protected by RTNL */ 75 struct cfg80211_scan_request *scan_req; /* protected by RTNL */
75 struct sk_buff *scan_msg; 76 struct sk_buff *scan_msg;
76 struct cfg80211_sched_scan_request __rcu *sched_scan_req; 77 struct cfg80211_sched_scan_request __rcu *sched_scan_req;
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index b5bd58d0f731..35ad69fd0838 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -57,6 +57,19 @@
57 * also linked into the probe response struct. 57 * also linked into the probe response struct.
58 */ 58 */
59 59
60/*
61 * Limit the number of BSS entries stored in mac80211. Each one is
62 * a bit over 4k at most, so this limits to roughly 4-5M of memory.
63 * If somebody wants to really attack this though, they'd likely
64 * use small beacons, and only one type of frame, limiting each of
65 * the entries to a much smaller size (in order to generate more
66 * entries in total, so overhead is bigger.)
67 */
68static int bss_entries_limit = 1000;
69module_param(bss_entries_limit, int, 0644);
70MODULE_PARM_DESC(bss_entries_limit,
71 "limit to number of scan BSS entries (per wiphy, default 1000)");
72
60#define IEEE80211_SCAN_RESULT_EXPIRE (30 * HZ) 73#define IEEE80211_SCAN_RESULT_EXPIRE (30 * HZ)
61 74
62static void bss_free(struct cfg80211_internal_bss *bss) 75static void bss_free(struct cfg80211_internal_bss *bss)
@@ -137,6 +150,10 @@ static bool __cfg80211_unlink_bss(struct cfg80211_registered_device *rdev,
137 150
138 list_del_init(&bss->list); 151 list_del_init(&bss->list);
139 rb_erase(&bss->rbn, &rdev->bss_tree); 152 rb_erase(&bss->rbn, &rdev->bss_tree);
153 rdev->bss_entries--;
154 WARN_ONCE((rdev->bss_entries == 0) ^ list_empty(&rdev->bss_list),
155 "rdev bss entries[%d]/list[empty:%d] corruption\n",
156 rdev->bss_entries, list_empty(&rdev->bss_list));
140 bss_ref_put(rdev, bss); 157 bss_ref_put(rdev, bss);
141 return true; 158 return true;
142} 159}
@@ -163,6 +180,40 @@ static void __cfg80211_bss_expire(struct cfg80211_registered_device *rdev,
163 rdev->bss_generation++; 180 rdev->bss_generation++;
164} 181}
165 182
183static bool cfg80211_bss_expire_oldest(struct cfg80211_registered_device *rdev)
184{
185 struct cfg80211_internal_bss *bss, *oldest = NULL;
186 bool ret;
187
188 lockdep_assert_held(&rdev->bss_lock);
189
190 list_for_each_entry(bss, &rdev->bss_list, list) {
191 if (atomic_read(&bss->hold))
192 continue;
193
194 if (!list_empty(&bss->hidden_list) &&
195 !bss->pub.hidden_beacon_bss)
196 continue;
197
198 if (oldest && time_before(oldest->ts, bss->ts))
199 continue;
200 oldest = bss;
201 }
202
203 if (WARN_ON(!oldest))
204 return false;
205
206 /*
207 * The callers make sure to increase rdev->bss_generation if anything
208 * gets removed (and a new entry added), so there's no need to also do
209 * it here.
210 */
211
212 ret = __cfg80211_unlink_bss(rdev, oldest);
213 WARN_ON(!ret);
214 return ret;
215}
216
166void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev, 217void ___cfg80211_scan_done(struct cfg80211_registered_device *rdev,
167 bool send_message) 218 bool send_message)
168{ 219{
@@ -689,6 +740,7 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
689 const u8 *ie; 740 const u8 *ie;
690 int i, ssidlen; 741 int i, ssidlen;
691 u8 fold = 0; 742 u8 fold = 0;
743 u32 n_entries = 0;
692 744
693 ies = rcu_access_pointer(new->pub.beacon_ies); 745 ies = rcu_access_pointer(new->pub.beacon_ies);
694 if (WARN_ON(!ies)) 746 if (WARN_ON(!ies))
@@ -712,6 +764,12 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
712 /* This is the bad part ... */ 764 /* This is the bad part ... */
713 765
714 list_for_each_entry(bss, &rdev->bss_list, list) { 766 list_for_each_entry(bss, &rdev->bss_list, list) {
767 /*
768 * we're iterating all the entries anyway, so take the
769 * opportunity to validate the list length accounting
770 */
771 n_entries++;
772
715 if (!ether_addr_equal(bss->pub.bssid, new->pub.bssid)) 773 if (!ether_addr_equal(bss->pub.bssid, new->pub.bssid))
716 continue; 774 continue;
717 if (bss->pub.channel != new->pub.channel) 775 if (bss->pub.channel != new->pub.channel)
@@ -740,6 +798,10 @@ static bool cfg80211_combine_bsses(struct cfg80211_registered_device *rdev,
740 new->pub.beacon_ies); 798 new->pub.beacon_ies);
741 } 799 }
742 800
801 WARN_ONCE(n_entries != rdev->bss_entries,
802 "rdev bss entries[%d]/list[len:%d] corruption\n",
803 rdev->bss_entries, n_entries);
804
743 return true; 805 return true;
744} 806}
745 807
@@ -894,7 +956,14 @@ cfg80211_bss_update(struct cfg80211_registered_device *rdev,
894 } 956 }
895 } 957 }
896 958
959 if (rdev->bss_entries >= bss_entries_limit &&
960 !cfg80211_bss_expire_oldest(rdev)) {
961 kfree(new);
962 goto drop;
963 }
964
897 list_add_tail(&new->list, &rdev->bss_list); 965 list_add_tail(&new->list, &rdev->bss_list);
966 rdev->bss_entries++;
898 rb_insert_bss(rdev, new); 967 rb_insert_bss(rdev, new);
899 found = new; 968 found = new;
900 } 969 }
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 5ea12afc7706..659b507b347d 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -1158,7 +1158,8 @@ static u32 cfg80211_calculate_bitrate_vht(struct rate_info *rate)
1158 58500000, 1158 58500000,
1159 65000000, 1159 65000000,
1160 78000000, 1160 78000000,
1161 0, 1161 /* not in the spec, but some devices use this: */
1162 86500000,
1162 }, 1163 },
1163 { 13500000, 1164 { 13500000,
1164 27000000, 1165 27000000,
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index fd6986634e6f..5bf7e1bfeac7 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1268,12 +1268,14 @@ static struct xfrm_policy *xfrm_sk_policy_lookup(const struct sock *sk, int dir,
1268 err = security_xfrm_policy_lookup(pol->security, 1268 err = security_xfrm_policy_lookup(pol->security,
1269 fl->flowi_secid, 1269 fl->flowi_secid,
1270 policy_to_flow_dir(dir)); 1270 policy_to_flow_dir(dir));
1271 if (!err && !xfrm_pol_hold_rcu(pol)) 1271 if (!err) {
1272 goto again; 1272 if (!xfrm_pol_hold_rcu(pol))
1273 else if (err == -ESRCH) 1273 goto again;
1274 } else if (err == -ESRCH) {
1274 pol = NULL; 1275 pol = NULL;
1275 else 1276 } else {
1276 pol = ERR_PTR(err); 1277 pol = ERR_PTR(err);
1278 }
1277 } else 1279 } else
1278 pol = NULL; 1280 pol = NULL;
1279 } 1281 }
diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c
index 08892091cfe3..671a1d0333f0 100644
--- a/net/xfrm/xfrm_user.c
+++ b/net/xfrm/xfrm_user.c
@@ -2450,7 +2450,7 @@ static int xfrm_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh)
2450 2450
2451#ifdef CONFIG_COMPAT 2451#ifdef CONFIG_COMPAT
2452 if (in_compat_syscall()) 2452 if (in_compat_syscall())
2453 return -ENOTSUPP; 2453 return -EOPNOTSUPP;
2454#endif 2454#endif
2455 2455
2456 type = nlh->nlmsg_type; 2456 type = nlh->nlmsg_type;
diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile
index 12b7304d55dc..72c58675973e 100644
--- a/samples/bpf/Makefile
+++ b/samples/bpf/Makefile
@@ -27,6 +27,7 @@ hostprogs-y += xdp2
27hostprogs-y += test_current_task_under_cgroup 27hostprogs-y += test_current_task_under_cgroup
28hostprogs-y += trace_event 28hostprogs-y += trace_event
29hostprogs-y += sampleip 29hostprogs-y += sampleip
30hostprogs-y += tc_l2_redirect
30 31
31test_verifier-objs := test_verifier.o libbpf.o 32test_verifier-objs := test_verifier.o libbpf.o
32test_maps-objs := test_maps.o libbpf.o 33test_maps-objs := test_maps.o libbpf.o
@@ -56,6 +57,7 @@ test_current_task_under_cgroup-objs := bpf_load.o libbpf.o \
56 test_current_task_under_cgroup_user.o 57 test_current_task_under_cgroup_user.o
57trace_event-objs := bpf_load.o libbpf.o trace_event_user.o 58trace_event-objs := bpf_load.o libbpf.o trace_event_user.o
58sampleip-objs := bpf_load.o libbpf.o sampleip_user.o 59sampleip-objs := bpf_load.o libbpf.o sampleip_user.o
60tc_l2_redirect-objs := bpf_load.o libbpf.o tc_l2_redirect_user.o
59 61
60# Tell kbuild to always build the programs 62# Tell kbuild to always build the programs
61always := $(hostprogs-y) 63always := $(hostprogs-y)
@@ -72,6 +74,7 @@ always += test_probe_write_user_kern.o
72always += trace_output_kern.o 74always += trace_output_kern.o
73always += tcbpf1_kern.o 75always += tcbpf1_kern.o
74always += tcbpf2_kern.o 76always += tcbpf2_kern.o
77always += tc_l2_redirect_kern.o
75always += lathist_kern.o 78always += lathist_kern.o
76always += offwaketime_kern.o 79always += offwaketime_kern.o
77always += spintest_kern.o 80always += spintest_kern.o
@@ -111,6 +114,7 @@ HOSTLOADLIBES_xdp2 += -lelf
111HOSTLOADLIBES_test_current_task_under_cgroup += -lelf 114HOSTLOADLIBES_test_current_task_under_cgroup += -lelf
112HOSTLOADLIBES_trace_event += -lelf 115HOSTLOADLIBES_trace_event += -lelf
113HOSTLOADLIBES_sampleip += -lelf 116HOSTLOADLIBES_sampleip += -lelf
117HOSTLOADLIBES_tc_l2_redirect += -l elf
114 118
115# Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline: 119# Allows pointing LLC/CLANG to a LLVM backend with bpf support, redefine on cmdline:
116# make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang 120# make samples/bpf/ LLC=~/git/llvm/build/bin/llc CLANG=~/git/llvm/build/bin/clang
diff --git a/samples/bpf/bpf_helpers.h b/samples/bpf/bpf_helpers.h
index 90f44bd2045e..dadd5161bd91 100644
--- a/samples/bpf/bpf_helpers.h
+++ b/samples/bpf/bpf_helpers.h
@@ -113,7 +113,7 @@ static int (*bpf_skb_under_cgroup)(void *ctx, void *map, int index) =
113#define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */ 113#define PT_REGS_FP(x) ((x)->gprs[11]) /* Works only with CONFIG_FRAME_POINTER */
114#define PT_REGS_RC(x) ((x)->gprs[2]) 114#define PT_REGS_RC(x) ((x)->gprs[2])
115#define PT_REGS_SP(x) ((x)->gprs[15]) 115#define PT_REGS_SP(x) ((x)->gprs[15])
116#define PT_REGS_IP(x) ((x)->ip) 116#define PT_REGS_IP(x) ((x)->psw.addr)
117 117
118#elif defined(__aarch64__) 118#elif defined(__aarch64__)
119 119
diff --git a/samples/bpf/sampleip_kern.c b/samples/bpf/sampleip_kern.c
index 774a681f374a..ceabf31079cf 100644
--- a/samples/bpf/sampleip_kern.c
+++ b/samples/bpf/sampleip_kern.c
@@ -25,7 +25,7 @@ int do_sample(struct bpf_perf_event_data *ctx)
25 u64 ip; 25 u64 ip;
26 u32 *value, init_val = 1; 26 u32 *value, init_val = 1;
27 27
28 ip = ctx->regs.ip; 28 ip = PT_REGS_IP(&ctx->regs);
29 value = bpf_map_lookup_elem(&ip_map, &ip); 29 value = bpf_map_lookup_elem(&ip_map, &ip);
30 if (value) 30 if (value)
31 *value += 1; 31 *value += 1;
diff --git a/samples/bpf/tc_l2_redirect.sh b/samples/bpf/tc_l2_redirect.sh
new file mode 100755
index 000000000000..80a05591a140
--- /dev/null
+++ b/samples/bpf/tc_l2_redirect.sh
@@ -0,0 +1,173 @@
1#!/bin/bash
2
3[[ -z $TC ]] && TC='tc'
4[[ -z $IP ]] && IP='ip'
5
6REDIRECT_USER='./tc_l2_redirect'
7REDIRECT_BPF='./tc_l2_redirect_kern.o'
8
9RP_FILTER=$(< /proc/sys/net/ipv4/conf/all/rp_filter)
10IPV6_FORWARDING=$(< /proc/sys/net/ipv6/conf/all/forwarding)
11
12function config_common {
13 local tun_type=$1
14
15 $IP netns add ns1
16 $IP netns add ns2
17 $IP link add ve1 type veth peer name vens1
18 $IP link add ve2 type veth peer name vens2
19 $IP link set dev ve1 up
20 $IP link set dev ve2 up
21 $IP link set dev ve1 mtu 1500
22 $IP link set dev ve2 mtu 1500
23 $IP link set dev vens1 netns ns1
24 $IP link set dev vens2 netns ns2
25
26 $IP -n ns1 link set dev lo up
27 $IP -n ns1 link set dev vens1 up
28 $IP -n ns1 addr add 10.1.1.101/24 dev vens1
29 $IP -n ns1 addr add 2401:db01::65/64 dev vens1 nodad
30 $IP -n ns1 route add default via 10.1.1.1 dev vens1
31 $IP -n ns1 route add default via 2401:db01::1 dev vens1
32
33 $IP -n ns2 link set dev lo up
34 $IP -n ns2 link set dev vens2 up
35 $IP -n ns2 addr add 10.2.1.102/24 dev vens2
36 $IP -n ns2 addr add 2401:db02::66/64 dev vens2 nodad
37 $IP -n ns2 addr add 10.10.1.102 dev lo
38 $IP -n ns2 addr add 2401:face::66/64 dev lo nodad
39 $IP -n ns2 link add ipt2 type ipip local 10.2.1.102 remote 10.2.1.1
40 $IP -n ns2 link add ip6t2 type ip6tnl mode any local 2401:db02::66 remote 2401:db02::1
41 $IP -n ns2 link set dev ipt2 up
42 $IP -n ns2 link set dev ip6t2 up
43 $IP netns exec ns2 $TC qdisc add dev vens2 clsact
44 $IP netns exec ns2 $TC filter add dev vens2 ingress bpf da obj $REDIRECT_BPF sec drop_non_tun_vip
45 if [[ $tun_type == "ipip" ]]; then
46 $IP -n ns2 route add 10.1.1.0/24 dev ipt2
47 $IP netns exec ns2 sysctl -q -w net.ipv4.conf.all.rp_filter=0
48 $IP netns exec ns2 sysctl -q -w net.ipv4.conf.ipt2.rp_filter=0
49 else
50 $IP -n ns2 route add 10.1.1.0/24 dev ip6t2
51 $IP -n ns2 route add 2401:db01::/64 dev ip6t2
52 $IP netns exec ns2 sysctl -q -w net.ipv4.conf.all.rp_filter=0
53 $IP netns exec ns2 sysctl -q -w net.ipv4.conf.ip6t2.rp_filter=0
54 fi
55
56 $IP addr add 10.1.1.1/24 dev ve1
57 $IP addr add 2401:db01::1/64 dev ve1 nodad
58 $IP addr add 10.2.1.1/24 dev ve2
59 $IP addr add 2401:db02::1/64 dev ve2 nodad
60
61 $TC qdisc add dev ve2 clsact
62 $TC filter add dev ve2 ingress bpf da obj $REDIRECT_BPF sec l2_to_iptun_ingress_forward
63
64 sysctl -q -w net.ipv4.conf.all.rp_filter=0
65 sysctl -q -w net.ipv6.conf.all.forwarding=1
66}
67
68function cleanup {
69 set +e
70 [[ -z $DEBUG ]] || set +x
71 $IP netns delete ns1 >& /dev/null
72 $IP netns delete ns2 >& /dev/null
73 $IP link del ve1 >& /dev/null
74 $IP link del ve2 >& /dev/null
75 $IP link del ipt >& /dev/null
76 $IP link del ip6t >& /dev/null
77 sysctl -q -w net.ipv4.conf.all.rp_filter=$RP_FILTER
78 sysctl -q -w net.ipv6.conf.all.forwarding=$IPV6_FORWARDING
79 rm -f /sys/fs/bpf/tc/globals/tun_iface
80 [[ -z $DEBUG ]] || set -x
81 set -e
82}
83
84function l2_to_ipip {
85 echo -n "l2_to_ipip $1: "
86
87 local dir=$1
88
89 config_common ipip
90
91 $IP link add ipt type ipip external
92 $IP link set dev ipt up
93 sysctl -q -w net.ipv4.conf.ipt.rp_filter=0
94 sysctl -q -w net.ipv4.conf.ipt.forwarding=1
95
96 if [[ $dir == "egress" ]]; then
97 $IP route add 10.10.1.0/24 via 10.2.1.102 dev ve2
98 $TC filter add dev ve2 egress bpf da obj $REDIRECT_BPF sec l2_to_iptun_ingress_redirect
99 sysctl -q -w net.ipv4.conf.ve1.forwarding=1
100 else
101 $TC qdisc add dev ve1 clsact
102 $TC filter add dev ve1 ingress bpf da obj $REDIRECT_BPF sec l2_to_iptun_ingress_redirect
103 fi
104
105 $REDIRECT_USER -U /sys/fs/bpf/tc/globals/tun_iface -i $(< /sys/class/net/ipt/ifindex)
106
107 $IP netns exec ns1 ping -c1 10.10.1.102 >& /dev/null
108
109 if [[ $dir == "egress" ]]; then
110 # test direct egress to ve2 (i.e. not forwarding from
111 # ve1 to ve2).
112 ping -c1 10.10.1.102 >& /dev/null
113 fi
114
115 cleanup
116
117 echo "OK"
118}
119
120function l2_to_ip6tnl {
121 echo -n "l2_to_ip6tnl $1: "
122
123 local dir=$1
124
125 config_common ip6tnl
126
127 $IP link add ip6t type ip6tnl mode any external
128 $IP link set dev ip6t up
129 sysctl -q -w net.ipv4.conf.ip6t.rp_filter=0
130 sysctl -q -w net.ipv4.conf.ip6t.forwarding=1
131
132 if [[ $dir == "egress" ]]; then
133 $IP route add 10.10.1.0/24 via 10.2.1.102 dev ve2
134 $IP route add 2401:face::/64 via 2401:db02::66 dev ve2
135 $TC filter add dev ve2 egress bpf da obj $REDIRECT_BPF sec l2_to_ip6tun_ingress_redirect
136 sysctl -q -w net.ipv4.conf.ve1.forwarding=1
137 else
138 $TC qdisc add dev ve1 clsact
139 $TC filter add dev ve1 ingress bpf da obj $REDIRECT_BPF sec l2_to_ip6tun_ingress_redirect
140 fi
141
142 $REDIRECT_USER -U /sys/fs/bpf/tc/globals/tun_iface -i $(< /sys/class/net/ip6t/ifindex)
143
144 $IP netns exec ns1 ping -c1 10.10.1.102 >& /dev/null
145 $IP netns exec ns1 ping -6 -c1 2401:face::66 >& /dev/null
146
147 if [[ $dir == "egress" ]]; then
148 # test direct egress to ve2 (i.e. not forwarding from
149 # ve1 to ve2).
150 ping -c1 10.10.1.102 >& /dev/null
151 ping -6 -c1 2401:face::66 >& /dev/null
152 fi
153
154 cleanup
155
156 echo "OK"
157}
158
159cleanup
160test_names="l2_to_ipip l2_to_ip6tnl"
161test_dirs="ingress egress"
162if [[ $# -ge 2 ]]; then
163 test_names=$1
164 test_dirs=$2
165elif [[ $# -ge 1 ]]; then
166 test_names=$1
167fi
168
169for t in $test_names; do
170 for d in $test_dirs; do
171 $t $d
172 done
173done
diff --git a/samples/bpf/tc_l2_redirect_kern.c b/samples/bpf/tc_l2_redirect_kern.c
new file mode 100644
index 000000000000..92a44729dbe4
--- /dev/null
+++ b/samples/bpf/tc_l2_redirect_kern.c
@@ -0,0 +1,236 @@
1/* Copyright (c) 2016 Facebook
2 *
3 * This program is free software; you can redistribute it and/or
4 * modify it under the terms of version 2 of the GNU General Public
5 * License as published by the Free Software Foundation.
6 */
7#include <uapi/linux/bpf.h>
8#include <uapi/linux/if_ether.h>
9#include <uapi/linux/if_packet.h>
10#include <uapi/linux/ip.h>
11#include <uapi/linux/ipv6.h>
12#include <uapi/linux/in.h>
13#include <uapi/linux/tcp.h>
14#include <uapi/linux/filter.h>
15#include <uapi/linux/pkt_cls.h>
16#include <net/ipv6.h>
17#include "bpf_helpers.h"
18
19#define _htonl __builtin_bswap32
20
21#define PIN_GLOBAL_NS 2
22struct bpf_elf_map {
23 __u32 type;
24 __u32 size_key;
25 __u32 size_value;
26 __u32 max_elem;
27 __u32 flags;
28 __u32 id;
29 __u32 pinning;
30};
31
32/* copy of 'struct ethhdr' without __packed */
33struct eth_hdr {
34 unsigned char h_dest[ETH_ALEN];
35 unsigned char h_source[ETH_ALEN];
36 unsigned short h_proto;
37};
38
39struct bpf_elf_map SEC("maps") tun_iface = {
40 .type = BPF_MAP_TYPE_ARRAY,
41 .size_key = sizeof(int),
42 .size_value = sizeof(int),
43 .pinning = PIN_GLOBAL_NS,
44 .max_elem = 1,
45};
46
47static __always_inline bool is_vip_addr(__be16 eth_proto, __be32 daddr)
48{
49 if (eth_proto == htons(ETH_P_IP))
50 return (_htonl(0xffffff00) & daddr) == _htonl(0x0a0a0100);
51 else if (eth_proto == htons(ETH_P_IPV6))
52 return (daddr == _htonl(0x2401face));
53
54 return false;
55}
56
57SEC("l2_to_iptun_ingress_forward")
58int _l2_to_iptun_ingress_forward(struct __sk_buff *skb)
59{
60 struct bpf_tunnel_key tkey = {};
61 void *data = (void *)(long)skb->data;
62 struct eth_hdr *eth = data;
63 void *data_end = (void *)(long)skb->data_end;
64 int key = 0, *ifindex;
65
66 int ret;
67
68 if (data + sizeof(*eth) > data_end)
69 return TC_ACT_OK;
70
71 ifindex = bpf_map_lookup_elem(&tun_iface, &key);
72 if (!ifindex)
73 return TC_ACT_OK;
74
75 if (eth->h_proto == htons(ETH_P_IP)) {
76 char fmt4[] = "ingress forward to ifindex:%d daddr4:%x\n";
77 struct iphdr *iph = data + sizeof(*eth);
78
79 if (data + sizeof(*eth) + sizeof(*iph) > data_end)
80 return TC_ACT_OK;
81
82 if (iph->protocol != IPPROTO_IPIP)
83 return TC_ACT_OK;
84
85 bpf_trace_printk(fmt4, sizeof(fmt4), *ifindex,
86 _htonl(iph->daddr));
87 return bpf_redirect(*ifindex, BPF_F_INGRESS);
88 } else if (eth->h_proto == htons(ETH_P_IPV6)) {
89 char fmt6[] = "ingress forward to ifindex:%d daddr6:%x::%x\n";
90 struct ipv6hdr *ip6h = data + sizeof(*eth);
91
92 if (data + sizeof(*eth) + sizeof(*ip6h) > data_end)
93 return TC_ACT_OK;
94
95 if (ip6h->nexthdr != IPPROTO_IPIP &&
96 ip6h->nexthdr != IPPROTO_IPV6)
97 return TC_ACT_OK;
98
99 bpf_trace_printk(fmt6, sizeof(fmt6), *ifindex,
100 _htonl(ip6h->daddr.s6_addr32[0]),
101 _htonl(ip6h->daddr.s6_addr32[3]));
102 return bpf_redirect(*ifindex, BPF_F_INGRESS);
103 }
104
105 return TC_ACT_OK;
106}
107
108SEC("l2_to_iptun_ingress_redirect")
109int _l2_to_iptun_ingress_redirect(struct __sk_buff *skb)
110{
111 struct bpf_tunnel_key tkey = {};
112 void *data = (void *)(long)skb->data;
113 struct eth_hdr *eth = data;
114 void *data_end = (void *)(long)skb->data_end;
115 int key = 0, *ifindex;
116
117 int ret;
118
119 if (data + sizeof(*eth) > data_end)
120 return TC_ACT_OK;
121
122 ifindex = bpf_map_lookup_elem(&tun_iface, &key);
123 if (!ifindex)
124 return TC_ACT_OK;
125
126 if (eth->h_proto == htons(ETH_P_IP)) {
127 char fmt4[] = "e/ingress redirect daddr4:%x to ifindex:%d\n";
128 struct iphdr *iph = data + sizeof(*eth);
129 __be32 daddr = iph->daddr;
130
131 if (data + sizeof(*eth) + sizeof(*iph) > data_end)
132 return TC_ACT_OK;
133
134 if (!is_vip_addr(eth->h_proto, daddr))
135 return TC_ACT_OK;
136
137 bpf_trace_printk(fmt4, sizeof(fmt4), _htonl(daddr), *ifindex);
138 } else {
139 return TC_ACT_OK;
140 }
141
142 tkey.tunnel_id = 10000;
143 tkey.tunnel_ttl = 64;
144 tkey.remote_ipv4 = 0x0a020166; /* 10.2.1.102 */
145 bpf_skb_set_tunnel_key(skb, &tkey, sizeof(tkey), 0);
146 return bpf_redirect(*ifindex, 0);
147}
148
149SEC("l2_to_ip6tun_ingress_redirect")
150int _l2_to_ip6tun_ingress_redirect(struct __sk_buff *skb)
151{
152 struct bpf_tunnel_key tkey = {};
153 void *data = (void *)(long)skb->data;
154 struct eth_hdr *eth = data;
155 void *data_end = (void *)(long)skb->data_end;
156 int key = 0, *ifindex;
157
158 if (data + sizeof(*eth) > data_end)
159 return TC_ACT_OK;
160
161 ifindex = bpf_map_lookup_elem(&tun_iface, &key);
162 if (!ifindex)
163 return TC_ACT_OK;
164
165 if (eth->h_proto == htons(ETH_P_IP)) {
166 char fmt4[] = "e/ingress redirect daddr4:%x to ifindex:%d\n";
167 struct iphdr *iph = data + sizeof(*eth);
168
169 if (data + sizeof(*eth) + sizeof(*iph) > data_end)
170 return TC_ACT_OK;
171
172 if (!is_vip_addr(eth->h_proto, iph->daddr))
173 return TC_ACT_OK;
174
175 bpf_trace_printk(fmt4, sizeof(fmt4), _htonl(iph->daddr),
176 *ifindex);
177 } else if (eth->h_proto == htons(ETH_P_IPV6)) {
178 char fmt6[] = "e/ingress redirect daddr6:%x to ifindex:%d\n";
179 struct ipv6hdr *ip6h = data + sizeof(*eth);
180
181 if (data + sizeof(*eth) + sizeof(*ip6h) > data_end)
182 return TC_ACT_OK;
183
184 if (!is_vip_addr(eth->h_proto, ip6h->daddr.s6_addr32[0]))
185 return TC_ACT_OK;
186
187 bpf_trace_printk(fmt6, sizeof(fmt6),
188 _htonl(ip6h->daddr.s6_addr32[0]), *ifindex);
189 } else {
190 return TC_ACT_OK;
191 }
192
193 tkey.tunnel_id = 10000;
194 tkey.tunnel_ttl = 64;
195 /* 2401:db02:0:0:0:0:0:66 */
196 tkey.remote_ipv6[0] = _htonl(0x2401db02);
197 tkey.remote_ipv6[1] = 0;
198 tkey.remote_ipv6[2] = 0;
199 tkey.remote_ipv6[3] = _htonl(0x00000066);
200 bpf_skb_set_tunnel_key(skb, &tkey, sizeof(tkey), BPF_F_TUNINFO_IPV6);
201 return bpf_redirect(*ifindex, 0);
202}
203
204SEC("drop_non_tun_vip")
205int _drop_non_tun_vip(struct __sk_buff *skb)
206{
207 struct bpf_tunnel_key tkey = {};
208 void *data = (void *)(long)skb->data;
209 struct eth_hdr *eth = data;
210 void *data_end = (void *)(long)skb->data_end;
211
212 if (data + sizeof(*eth) > data_end)
213 return TC_ACT_OK;
214
215 if (eth->h_proto == htons(ETH_P_IP)) {
216 struct iphdr *iph = data + sizeof(*eth);
217
218 if (data + sizeof(*eth) + sizeof(*iph) > data_end)
219 return TC_ACT_OK;
220
221 if (is_vip_addr(eth->h_proto, iph->daddr))
222 return TC_ACT_SHOT;
223 } else if (eth->h_proto == htons(ETH_P_IPV6)) {
224 struct ipv6hdr *ip6h = data + sizeof(*eth);
225
226 if (data + sizeof(*eth) + sizeof(*ip6h) > data_end)
227 return TC_ACT_OK;
228
229 if (is_vip_addr(eth->h_proto, ip6h->daddr.s6_addr32[0]))
230 return TC_ACT_SHOT;
231 }
232
233 return TC_ACT_OK;
234}
235
236char _license[] SEC("license") = "GPL";
diff --git a/samples/bpf/tc_l2_redirect_user.c b/samples/bpf/tc_l2_redirect_user.c
new file mode 100644
index 000000000000..4013c5337b91
--- /dev/null
+++ b/samples/bpf/tc_l2_redirect_user.c
@@ -0,0 +1,73 @@
1/* Copyright (c) 2016 Facebook
2 *
3 * This program is free software; you can redistribute it and/or
4 * modify it under the terms of version 2 of the GNU General Public
5 * License as published by the Free Software Foundation.
6 */
7#include <linux/unistd.h>
8#include <linux/bpf.h>
9
10#include <stdlib.h>
11#include <stdio.h>
12#include <unistd.h>
13#include <string.h>
14#include <errno.h>
15
16#include "libbpf.h"
17
18static void usage(void)
19{
20 printf("Usage: tc_l2_ipip_redirect [...]\n");
21 printf(" -U <file> Update an already pinned BPF array\n");
22 printf(" -i <ifindex> Interface index\n");
23 printf(" -h Display this help\n");
24}
25
26int main(int argc, char **argv)
27{
28 const char *pinned_file = NULL;
29 int ifindex = -1;
30 int array_key = 0;
31 int array_fd = -1;
32 int ret = -1;
33 int opt;
34
35 while ((opt = getopt(argc, argv, "F:U:i:")) != -1) {
36 switch (opt) {
37 /* General args */
38 case 'U':
39 pinned_file = optarg;
40 break;
41 case 'i':
42 ifindex = atoi(optarg);
43 break;
44 default:
45 usage();
46 goto out;
47 }
48 }
49
50 if (ifindex < 0 || !pinned_file) {
51 usage();
52 goto out;
53 }
54
55 array_fd = bpf_obj_get(pinned_file);
56 if (array_fd < 0) {
57 fprintf(stderr, "bpf_obj_get(%s): %s(%d)\n",
58 pinned_file, strerror(errno), errno);
59 goto out;
60 }
61
62 /* bpf_tunnel_key.remote_ipv4 expects host byte orders */
63 ret = bpf_update_elem(array_fd, &array_key, &ifindex, 0);
64 if (ret) {
65 perror("bpf_update_elem");
66 goto out;
67 }
68
69out:
70 if (array_fd != -1)
71 close(array_fd);
72 return ret;
73}
diff --git a/samples/bpf/trace_event_kern.c b/samples/bpf/trace_event_kern.c
index 71a8ed32823e..41b6115a32eb 100644
--- a/samples/bpf/trace_event_kern.c
+++ b/samples/bpf/trace_event_kern.c
@@ -50,7 +50,7 @@ int bpf_prog1(struct bpf_perf_event_data *ctx)
50 key.userstack = bpf_get_stackid(ctx, &stackmap, USER_STACKID_FLAGS); 50 key.userstack = bpf_get_stackid(ctx, &stackmap, USER_STACKID_FLAGS);
51 if ((int)key.kernstack < 0 && (int)key.userstack < 0) { 51 if ((int)key.kernstack < 0 && (int)key.userstack < 0) {
52 bpf_trace_printk(fmt, sizeof(fmt), cpu, ctx->sample_period, 52 bpf_trace_printk(fmt, sizeof(fmt), cpu, ctx->sample_period,
53 ctx->regs.ip); 53 PT_REGS_IP(&ctx->regs));
54 return 0; 54 return 0;
55 } 55 }
56 56
diff --git a/scripts/Makefile.build b/scripts/Makefile.build
index de46ab03f063..7675d11ee65e 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -159,7 +159,8 @@ cmd_cpp_i_c = $(CPP) $(c_flags) -o $@ $<
159$(obj)/%.i: $(src)/%.c FORCE 159$(obj)/%.i: $(src)/%.c FORCE
160 $(call if_changed_dep,cpp_i_c) 160 $(call if_changed_dep,cpp_i_c)
161 161
162cmd_gensymtypes = \ 162# These mirror gensymtypes_S and co below, keep them in synch.
163cmd_gensymtypes_c = \
163 $(CPP) -D__GENKSYMS__ $(c_flags) $< | \ 164 $(CPP) -D__GENKSYMS__ $(c_flags) $< | \
164 $(GENKSYMS) $(if $(1), -T $(2)) \ 165 $(GENKSYMS) $(if $(1), -T $(2)) \
165 $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \ 166 $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \
@@ -169,7 +170,7 @@ cmd_gensymtypes = \
169quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@ 170quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
170cmd_cc_symtypes_c = \ 171cmd_cc_symtypes_c = \
171 set -e; \ 172 set -e; \
172 $(call cmd_gensymtypes,true,$@) >/dev/null; \ 173 $(call cmd_gensymtypes_c,true,$@) >/dev/null; \
173 test -s $@ || rm -f $@ 174 test -s $@ || rm -f $@
174 175
175$(obj)/%.symtypes : $(src)/%.c FORCE 176$(obj)/%.symtypes : $(src)/%.c FORCE
@@ -198,9 +199,10 @@ else
198# the actual value of the checksum generated by genksyms 199# the actual value of the checksum generated by genksyms
199 200
200cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $< 201cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
201cmd_modversions = \ 202
203cmd_modversions_c = \
202 if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \ 204 if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
203 $(call cmd_gensymtypes,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \ 205 $(call cmd_gensymtypes_c,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
204 > $(@D)/.tmp_$(@F:.o=.ver); \ 206 > $(@D)/.tmp_$(@F:.o=.ver); \
205 \ 207 \
206 $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \ 208 $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
@@ -268,13 +270,14 @@ endif # CONFIG_STACK_VALIDATION
268define rule_cc_o_c 270define rule_cc_o_c
269 $(call echo-cmd,checksrc) $(cmd_checksrc) \ 271 $(call echo-cmd,checksrc) $(cmd_checksrc) \
270 $(call cmd_and_fixdep,cc_o_c) \ 272 $(call cmd_and_fixdep,cc_o_c) \
271 $(cmd_modversions) \ 273 $(cmd_modversions_c) \
272 $(cmd_objtool) \ 274 $(cmd_objtool) \
273 $(call echo-cmd,record_mcount) $(cmd_record_mcount) 275 $(call echo-cmd,record_mcount) $(cmd_record_mcount)
274endef 276endef
275 277
276define rule_as_o_S 278define rule_as_o_S
277 $(call cmd_and_fixdep,as_o_S) \ 279 $(call cmd_and_fixdep,as_o_S) \
280 $(cmd_modversions_S) \
278 $(cmd_objtool) 281 $(cmd_objtool)
279endef 282endef
280 283
@@ -314,6 +317,39 @@ modkern_aflags := $(KBUILD_AFLAGS_KERNEL) $(AFLAGS_KERNEL)
314$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 317$(real-objs-m) : modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
315$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE) 318$(real-objs-m:.o=.s): modkern_aflags := $(KBUILD_AFLAGS_MODULE) $(AFLAGS_MODULE)
316 319
320# .S file exports must have their C prototypes defined in asm/asm-prototypes.h
321# or a file that it includes, in order to get versioned symbols. We build a
322# dummy C file that includes asm-prototypes and the EXPORT_SYMBOL lines from
323# the .S file (with trailing ';'), and run genksyms on that, to extract vers.
324#
325# This is convoluted. The .S file must first be preprocessed to run guards and
326# expand names, then the resulting exports must be constructed into plain
327# EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
328# to make the genksyms input.
329#
330# These mirror gensymtypes_c and co above, keep them in synch.
331cmd_gensymtypes_S = \
332 (echo "\#include <linux/kernel.h>" ; \
333 echo "\#include <asm/asm-prototypes.h>" ; \
334 $(CPP) $(a_flags) $< | \
335 grep "\<___EXPORT_SYMBOL\>" | \
336 sed 's/.*___EXPORT_SYMBOL[[:space:]]*\([a-zA-Z0-9_]*\)[[:space:]]*,.*/EXPORT_SYMBOL(\1);/' ) | \
337 $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | \
338 $(GENKSYMS) $(if $(1), -T $(2)) \
339 $(patsubst y,-s _,$(CONFIG_HAVE_UNDERSCORE_SYMBOL_PREFIX)) \
340 $(if $(KBUILD_PRESERVE),-p) \
341 -r $(firstword $(wildcard $(2:.symtypes=.symref) /dev/null))
342
343quiet_cmd_cc_symtypes_S = SYM $(quiet_modtag) $@
344cmd_cc_symtypes_S = \
345 set -e; \
346 $(call cmd_gensymtypes_S,true,$@) >/dev/null; \
347 test -s $@ || rm -f $@
348
349$(obj)/%.symtypes : $(src)/%.S FORCE
350 $(call cmd,cc_symtypes_S)
351
352
317quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@ 353quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
318cmd_cpp_s_S = $(CPP) $(a_flags) -o $@ $< 354cmd_cpp_s_S = $(CPP) $(a_flags) -o $@ $<
319 355
@@ -321,7 +357,37 @@ $(obj)/%.s: $(src)/%.S FORCE
321 $(call if_changed_dep,cpp_s_S) 357 $(call if_changed_dep,cpp_s_S)
322 358
323quiet_cmd_as_o_S = AS $(quiet_modtag) $@ 359quiet_cmd_as_o_S = AS $(quiet_modtag) $@
324cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $< 360
361ifndef CONFIG_MODVERSIONS
362cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
363
364else
365
366ASM_PROTOTYPES := $(wildcard $(srctree)/arch/$(SRCARCH)/include/asm/asm-prototypes.h)
367
368ifeq ($(ASM_PROTOTYPES),)
369cmd_as_o_S = $(CC) $(a_flags) -c -o $@ $<
370
371else
372
373# versioning matches the C process described above, with difference that
374# we parse asm-prototypes.h C header to get function definitions.
375
376cmd_as_o_S = $(CC) $(a_flags) -c -o $(@D)/.tmp_$(@F) $<
377
378cmd_modversions_S = \
379 if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then \
380 $(call cmd_gensymtypes_S,$(KBUILD_SYMTYPES),$(@:.o=.symtypes)) \
381 > $(@D)/.tmp_$(@F:.o=.ver); \
382 \
383 $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
384 -T $(@D)/.tmp_$(@F:.o=.ver); \
385 rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \
386 else \
387 mv -f $(@D)/.tmp_$(@F) $@; \
388 fi;
389endif
390endif
325 391
326$(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE 392$(obj)/%.o: $(src)/%.S $(objtool_obj) FORCE
327 $(call if_changed_rule,as_o_S) 393 $(call if_changed_rule,as_o_S)
@@ -430,6 +496,9 @@ cmd_export_list = $(OBJDUMP) -h $< | \
430 496
431$(obj)/lib-ksyms.o: $(lib-target) FORCE 497$(obj)/lib-ksyms.o: $(lib-target) FORCE
432 $(call if_changed,export_list) 498 $(call if_changed,export_list)
499
500targets += $(obj)/lib-ksyms.o
501
433endif 502endif
434 503
435# 504#
diff --git a/scripts/Makefile.extrawarn b/scripts/Makefile.extrawarn
index 53449a6ff6aa..7c321a603b07 100644
--- a/scripts/Makefile.extrawarn
+++ b/scripts/Makefile.extrawarn
@@ -36,6 +36,7 @@ warning-2 += -Wshadow
36warning-2 += $(call cc-option, -Wlogical-op) 36warning-2 += $(call cc-option, -Wlogical-op)
37warning-2 += $(call cc-option, -Wmissing-field-initializers) 37warning-2 += $(call cc-option, -Wmissing-field-initializers)
38warning-2 += $(call cc-option, -Wsign-compare) 38warning-2 += $(call cc-option, -Wsign-compare)
39warning-2 += $(call cc-option, -Wmaybe-uninitialized)
39 40
40warning-3 := -Wbad-function-cast 41warning-3 := -Wbad-function-cast
41warning-3 += -Wcast-qual 42warning-3 += -Wcast-qual
diff --git a/scripts/Makefile.ubsan b/scripts/Makefile.ubsan
index dd779c40c8e6..3b1b13818d59 100644
--- a/scripts/Makefile.ubsan
+++ b/scripts/Makefile.ubsan
@@ -17,4 +17,8 @@ endif
17ifdef CONFIG_UBSAN_NULL 17ifdef CONFIG_UBSAN_NULL
18 CFLAGS_UBSAN += $(call cc-option, -fsanitize=null) 18 CFLAGS_UBSAN += $(call cc-option, -fsanitize=null)
19endif 19endif
20
21 # -fsanitize=* options makes GCC less smart than usual and
22 # increase number of 'maybe-uninitialized false-positives
23 CFLAGS_UBSAN += $(call cc-option, -Wno-maybe-uninitialized)
20endif 24endif
diff --git a/scripts/bloat-o-meter b/scripts/bloat-o-meter
index 19f5adfd877d..d9ff038c1b28 100755
--- a/scripts/bloat-o-meter
+++ b/scripts/bloat-o-meter
@@ -8,6 +8,9 @@
8# of the GNU General Public License, incorporated herein by reference. 8# of the GNU General Public License, incorporated herein by reference.
9 9
10import sys, os, re 10import sys, os, re
11from signal import signal, SIGPIPE, SIG_DFL
12
13signal(SIGPIPE, SIG_DFL)
11 14
12if len(sys.argv) != 3: 15if len(sys.argv) != 3:
13 sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0]) 16 sys.stderr.write("usage: %s file1 file2\n" % sys.argv[0])
diff --git a/scripts/gcc-x86_64-has-stack-protector.sh b/scripts/gcc-x86_64-has-stack-protector.sh
index 973e8c141567..17867e723a51 100755
--- a/scripts/gcc-x86_64-has-stack-protector.sh
+++ b/scripts/gcc-x86_64-has-stack-protector.sh
@@ -1,6 +1,6 @@
1#!/bin/sh 1#!/bin/sh
2 2
3echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fstack-protector - -o - 2> /dev/null | grep -q "%gs" 3echo "int foo(void) { char X[200]; return 3; }" | $* -S -x c -c -O0 -mcmodel=kernel -fno-PIE -fstack-protector - -o - 2> /dev/null | grep -q "%gs"
4if [ "$?" -eq "0" ] ; then 4if [ "$?" -eq "0" ] ; then
5 echo y 5 echo y
6else 6else
diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
index ebced77deb9c..90a091b6ae4d 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
@@ -35,6 +35,8 @@ nconfig: $(obj)/nconf
35 35
36silentoldconfig: $(obj)/conf 36silentoldconfig: $(obj)/conf
37 $(Q)mkdir -p include/config include/generated 37 $(Q)mkdir -p include/config include/generated
38 $(Q)test -e include/generated/autoksyms.h || \
39 touch include/generated/autoksyms.h
38 $< $(silent) --$@ $(Kconfig) 40 $< $(silent) --$@ $(Kconfig)
39 41
40localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf 42localyesconfig localmodconfig: $(obj)/streamline_config.pl $(obj)/conf
diff --git a/security/apparmor/domain.c b/security/apparmor/domain.c
index fc3036b34e51..a4d90aa1045a 100644
--- a/security/apparmor/domain.c
+++ b/security/apparmor/domain.c
@@ -621,8 +621,8 @@ int aa_change_hat(const char *hats[], int count, u64 token, bool permtest)
621 /* released below */ 621 /* released below */
622 cred = get_current_cred(); 622 cred = get_current_cred();
623 cxt = cred_cxt(cred); 623 cxt = cred_cxt(cred);
624 profile = aa_cred_profile(cred); 624 profile = aa_get_newest_profile(aa_cred_profile(cred));
625 previous_profile = cxt->previous; 625 previous_profile = aa_get_newest_profile(cxt->previous);
626 626
627 if (unconfined(profile)) { 627 if (unconfined(profile)) {
628 info = "unconfined"; 628 info = "unconfined";
@@ -718,6 +718,8 @@ audit:
718out: 718out:
719 aa_put_profile(hat); 719 aa_put_profile(hat);
720 kfree(name); 720 kfree(name);
721 aa_put_profile(profile);
722 aa_put_profile(previous_profile);
721 put_cred(cred); 723 put_cred(cred);
722 724
723 return error; 725 return error;
diff --git a/sound/soc/atmel/Kconfig b/sound/soc/atmel/Kconfig
index 22aec9a1e9a4..4a56f3dfba51 100644
--- a/sound/soc/atmel/Kconfig
+++ b/sound/soc/atmel/Kconfig
@@ -78,4 +78,14 @@ config SND_ATMEL_SOC_PDMIC
78 help 78 help
79 Say Y if you want to add support for Atmel ASoC driver for boards using 79 Say Y if you want to add support for Atmel ASoC driver for boards using
80 PDMIC. 80 PDMIC.
81
82config SND_ATMEL_SOC_TSE850_PCM5142
83 tristate "ASoC driver for the Axentia TSE-850"
84 depends on ARCH_AT91 && OF
85 depends on ATMEL_SSC && I2C
86 select SND_ATMEL_SOC_SSC_DMA
87 select SND_SOC_PCM512x_I2C
88 help
89 Say Y if you want to add support for the ASoC driver for the
90 Axentia TSE-850 with a PCM5142 codec.
81endif 91endif
diff --git a/sound/soc/atmel/Makefile b/sound/soc/atmel/Makefile
index a2b127bd9c87..67e10cbd4ed7 100644
--- a/sound/soc/atmel/Makefile
+++ b/sound/soc/atmel/Makefile
@@ -13,9 +13,11 @@ snd-atmel-soc-wm8904-objs := atmel_wm8904.o
13snd-soc-sam9x5-wm8731-objs := sam9x5_wm8731.o 13snd-soc-sam9x5-wm8731-objs := sam9x5_wm8731.o
14snd-atmel-soc-classd-objs := atmel-classd.o 14snd-atmel-soc-classd-objs := atmel-classd.o
15snd-atmel-soc-pdmic-objs := atmel-pdmic.o 15snd-atmel-soc-pdmic-objs := atmel-pdmic.o
16snd-atmel-soc-tse850-pcm5142-objs := tse850-pcm5142.o
16 17
17obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o 18obj-$(CONFIG_SND_AT91_SOC_SAM9G20_WM8731) += snd-soc-sam9g20-wm8731.o
18obj-$(CONFIG_SND_ATMEL_SOC_WM8904) += snd-atmel-soc-wm8904.o 19obj-$(CONFIG_SND_ATMEL_SOC_WM8904) += snd-atmel-soc-wm8904.o
19obj-$(CONFIG_SND_AT91_SOC_SAM9X5_WM8731) += snd-soc-sam9x5-wm8731.o 20obj-$(CONFIG_SND_AT91_SOC_SAM9X5_WM8731) += snd-soc-sam9x5-wm8731.o
20obj-$(CONFIG_SND_ATMEL_SOC_CLASSD) += snd-atmel-soc-classd.o 21obj-$(CONFIG_SND_ATMEL_SOC_CLASSD) += snd-atmel-soc-classd.o
21obj-$(CONFIG_SND_ATMEL_SOC_PDMIC) += snd-atmel-soc-pdmic.o 22obj-$(CONFIG_SND_ATMEL_SOC_PDMIC) += snd-atmel-soc-pdmic.o
23obj-$(CONFIG_SND_ATMEL_SOC_TSE850_PCM5142) += snd-atmel-soc-tse850-pcm5142.o
diff --git a/sound/soc/atmel/atmel_ssc_dai.c b/sound/soc/atmel/atmel_ssc_dai.c
index 16e459aedffe..a1e2c5682dcd 100644
--- a/sound/soc/atmel/atmel_ssc_dai.c
+++ b/sound/soc/atmel/atmel_ssc_dai.c
@@ -380,6 +380,7 @@ static void atmel_ssc_shutdown(struct snd_pcm_substream *substream,
380 ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST)); 380 ssc_writel(ssc_p->ssc->regs, CR, SSC_BIT(CR_SWRST));
381 /* Clear the SSC dividers */ 381 /* Clear the SSC dividers */
382 ssc_p->cmr_div = ssc_p->tcmr_period = ssc_p->rcmr_period = 0; 382 ssc_p->cmr_div = ssc_p->tcmr_period = ssc_p->rcmr_period = 0;
383 ssc_p->forced_divider = 0;
383 } 384 }
384 spin_unlock_irq(&ssc_p->lock); 385 spin_unlock_irq(&ssc_p->lock);
385 386
@@ -426,14 +427,17 @@ static int atmel_ssc_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
426 else 427 else
427 if (div != ssc_p->cmr_div) 428 if (div != ssc_p->cmr_div)
428 return -EBUSY; 429 return -EBUSY;
430 ssc_p->forced_divider |= BIT(ATMEL_SSC_CMR_DIV);
429 break; 431 break;
430 432
431 case ATMEL_SSC_TCMR_PERIOD: 433 case ATMEL_SSC_TCMR_PERIOD:
432 ssc_p->tcmr_period = div; 434 ssc_p->tcmr_period = div;
435 ssc_p->forced_divider |= BIT(ATMEL_SSC_TCMR_PERIOD);
433 break; 436 break;
434 437
435 case ATMEL_SSC_RCMR_PERIOD: 438 case ATMEL_SSC_RCMR_PERIOD:
436 ssc_p->rcmr_period = div; 439 ssc_p->rcmr_period = div;
440 ssc_p->forced_divider |= BIT(ATMEL_SSC_RCMR_PERIOD);
437 break; 441 break;
438 442
439 default: 443 default:
@@ -443,6 +447,28 @@ static int atmel_ssc_set_dai_clkdiv(struct snd_soc_dai *cpu_dai,
443 return 0; 447 return 0;
444} 448}
445 449
450/* Is the cpu-dai master of the frame clock? */
451static int atmel_ssc_cfs(struct atmel_ssc_info *ssc_p)
452{
453 switch (ssc_p->daifmt & SND_SOC_DAIFMT_MASTER_MASK) {
454 case SND_SOC_DAIFMT_CBM_CFS:
455 case SND_SOC_DAIFMT_CBS_CFS:
456 return 1;
457 }
458 return 0;
459}
460
461/* Is the cpu-dai master of the bit clock? */
462static int atmel_ssc_cbs(struct atmel_ssc_info *ssc_p)
463{
464 switch (ssc_p->daifmt & SND_SOC_DAIFMT_MASTER_MASK) {
465 case SND_SOC_DAIFMT_CBS_CFM:
466 case SND_SOC_DAIFMT_CBS_CFS:
467 return 1;
468 }
469 return 0;
470}
471
446/* 472/*
447 * Configure the SSC. 473 * Configure the SSC.
448 */ 474 */
@@ -459,6 +485,9 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
459 u32 tfmr, rfmr, tcmr, rcmr; 485 u32 tfmr, rfmr, tcmr, rcmr;
460 int ret; 486 int ret;
461 int fslen, fslen_ext; 487 int fslen, fslen_ext;
488 u32 cmr_div;
489 u32 tcmr_period;
490 u32 rcmr_period;
462 491
463 /* 492 /*
464 * Currently, there is only one set of dma params for 493 * Currently, there is only one set of dma params for
@@ -470,6 +499,46 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
470 else 499 else
471 dir = 1; 500 dir = 1;
472 501
502 /*
503 * If the cpu dai should provide BCLK, but noone has provided the
504 * divider needed for that to work, fall back to something sensible.
505 */
506 cmr_div = ssc_p->cmr_div;
507 if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_CMR_DIV)) &&
508 atmel_ssc_cbs(ssc_p)) {
509 int bclk_rate = snd_soc_params_to_bclk(params);
510
511 if (bclk_rate < 0) {
512 dev_err(dai->dev, "unable to calculate cmr_div: %d\n",
513 bclk_rate);
514 return bclk_rate;
515 }
516
517 cmr_div = DIV_ROUND_CLOSEST(ssc_p->mck_rate, 2 * bclk_rate);
518 }
519
520 /*
521 * If the cpu dai should provide LRCLK, but noone has provided the
522 * dividers needed for that to work, fall back to something sensible.
523 */
524 tcmr_period = ssc_p->tcmr_period;
525 rcmr_period = ssc_p->rcmr_period;
526 if (atmel_ssc_cfs(ssc_p)) {
527 int frame_size = snd_soc_params_to_frame_size(params);
528
529 if (frame_size < 0) {
530 dev_err(dai->dev,
531 "unable to calculate tx/rx cmr_period: %d\n",
532 frame_size);
533 return frame_size;
534 }
535
536 if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_TCMR_PERIOD)))
537 tcmr_period = frame_size / 2 - 1;
538 if (!(ssc_p->forced_divider & BIT(ATMEL_SSC_RCMR_PERIOD)))
539 rcmr_period = frame_size / 2 - 1;
540 }
541
473 dma_params = ssc_p->dma_params[dir]; 542 dma_params = ssc_p->dma_params[dir];
474 543
475 channels = params_channels(params); 544 channels = params_channels(params);
@@ -524,7 +593,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
524 fslen_ext = (bits - 1) / 16; 593 fslen_ext = (bits - 1) / 16;
525 fslen = (bits - 1) % 16; 594 fslen = (bits - 1) % 16;
526 595
527 rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) 596 rcmr = SSC_BF(RCMR_PERIOD, rcmr_period)
528 | SSC_BF(RCMR_STTDLY, START_DELAY) 597 | SSC_BF(RCMR_STTDLY, START_DELAY)
529 | SSC_BF(RCMR_START, SSC_START_FALLING_RF) 598 | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
530 | SSC_BF(RCMR_CKI, SSC_CKI_RISING) 599 | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
@@ -540,7 +609,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
540 | SSC_BF(RFMR_LOOP, 0) 609 | SSC_BF(RFMR_LOOP, 0)
541 | SSC_BF(RFMR_DATLEN, (bits - 1)); 610 | SSC_BF(RFMR_DATLEN, (bits - 1));
542 611
543 tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) 612 tcmr = SSC_BF(TCMR_PERIOD, tcmr_period)
544 | SSC_BF(TCMR_STTDLY, START_DELAY) 613 | SSC_BF(TCMR_STTDLY, START_DELAY)
545 | SSC_BF(TCMR_START, SSC_START_FALLING_RF) 614 | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
546 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) 615 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
@@ -606,7 +675,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
606 fslen_ext = (bits - 1) / 16; 675 fslen_ext = (bits - 1) / 16;
607 fslen = (bits - 1) % 16; 676 fslen = (bits - 1) % 16;
608 677
609 rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) 678 rcmr = SSC_BF(RCMR_PERIOD, rcmr_period)
610 | SSC_BF(RCMR_STTDLY, START_DELAY) 679 | SSC_BF(RCMR_STTDLY, START_DELAY)
611 | SSC_BF(RCMR_START, SSC_START_FALLING_RF) 680 | SSC_BF(RCMR_START, SSC_START_FALLING_RF)
612 | SSC_BF(RCMR_CKI, SSC_CKI_RISING) 681 | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
@@ -623,7 +692,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
623 | SSC_BF(RFMR_LOOP, 0) 692 | SSC_BF(RFMR_LOOP, 0)
624 | SSC_BF(RFMR_DATLEN, (bits - 1)); 693 | SSC_BF(RFMR_DATLEN, (bits - 1));
625 694
626 tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) 695 tcmr = SSC_BF(TCMR_PERIOD, tcmr_period)
627 | SSC_BF(TCMR_STTDLY, START_DELAY) 696 | SSC_BF(TCMR_STTDLY, START_DELAY)
628 | SSC_BF(TCMR_START, SSC_START_FALLING_RF) 697 | SSC_BF(TCMR_START, SSC_START_FALLING_RF)
629 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) 698 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
@@ -650,7 +719,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
650 * MCK divider, and the BCLK signal is output 719 * MCK divider, and the BCLK signal is output
651 * on the SSC TK line. 720 * on the SSC TK line.
652 */ 721 */
653 rcmr = SSC_BF(RCMR_PERIOD, ssc_p->rcmr_period) 722 rcmr = SSC_BF(RCMR_PERIOD, rcmr_period)
654 | SSC_BF(RCMR_STTDLY, 1) 723 | SSC_BF(RCMR_STTDLY, 1)
655 | SSC_BF(RCMR_START, SSC_START_RISING_RF) 724 | SSC_BF(RCMR_START, SSC_START_RISING_RF)
656 | SSC_BF(RCMR_CKI, SSC_CKI_RISING) 725 | SSC_BF(RCMR_CKI, SSC_CKI_RISING)
@@ -665,7 +734,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
665 | SSC_BF(RFMR_LOOP, 0) 734 | SSC_BF(RFMR_LOOP, 0)
666 | SSC_BF(RFMR_DATLEN, (bits - 1)); 735 | SSC_BF(RFMR_DATLEN, (bits - 1));
667 736
668 tcmr = SSC_BF(TCMR_PERIOD, ssc_p->tcmr_period) 737 tcmr = SSC_BF(TCMR_PERIOD, tcmr_period)
669 | SSC_BF(TCMR_STTDLY, 1) 738 | SSC_BF(TCMR_STTDLY, 1)
670 | SSC_BF(TCMR_START, SSC_START_RISING_RF) 739 | SSC_BF(TCMR_START, SSC_START_RISING_RF)
671 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING) 740 | SSC_BF(TCMR_CKI, SSC_CKI_FALLING)
@@ -760,7 +829,7 @@ static int atmel_ssc_hw_params(struct snd_pcm_substream *substream,
760 } 829 }
761 830
762 /* set SSC clock mode register */ 831 /* set SSC clock mode register */
763 ssc_writel(ssc_p->ssc->regs, CMR, ssc_p->cmr_div); 832 ssc_writel(ssc_p->ssc->regs, CMR, cmr_div);
764 833
765 /* set receive clock mode and format */ 834 /* set receive clock mode and format */
766 ssc_writel(ssc_p->ssc->regs, RCMR, rcmr); 835 ssc_writel(ssc_p->ssc->regs, RCMR, rcmr);
diff --git a/sound/soc/atmel/atmel_ssc_dai.h b/sound/soc/atmel/atmel_ssc_dai.h
index 80b153857a88..75194f582131 100644
--- a/sound/soc/atmel/atmel_ssc_dai.h
+++ b/sound/soc/atmel/atmel_ssc_dai.h
@@ -113,6 +113,7 @@ struct atmel_ssc_info {
113 unsigned short cmr_div; 113 unsigned short cmr_div;
114 unsigned short tcmr_period; 114 unsigned short tcmr_period;
115 unsigned short rcmr_period; 115 unsigned short rcmr_period;
116 unsigned int forced_divider;
116 struct atmel_pcm_dma_params *dma_params[2]; 117 struct atmel_pcm_dma_params *dma_params[2];
117 struct atmel_ssc_state ssc_state; 118 struct atmel_ssc_state ssc_state;
118 unsigned long mck_rate; 119 unsigned long mck_rate;
diff --git a/sound/soc/atmel/atmel_wm8904.c b/sound/soc/atmel/atmel_wm8904.c
index fdd28ed3e0b9..fbc10f61eb55 100644
--- a/sound/soc/atmel/atmel_wm8904.c
+++ b/sound/soc/atmel/atmel_wm8904.c
@@ -53,7 +53,7 @@ static int atmel_asoc_wm8904_hw_params(struct snd_pcm_substream *substream,
53 return 0; 53 return 0;
54} 54}
55 55
56static struct snd_soc_ops atmel_asoc_wm8904_ops = { 56static const struct snd_soc_ops atmel_asoc_wm8904_ops = {
57 .hw_params = atmel_asoc_wm8904_hw_params, 57 .hw_params = atmel_asoc_wm8904_hw_params,
58}; 58};
59 59
diff --git a/sound/soc/atmel/tse850-pcm5142.c b/sound/soc/atmel/tse850-pcm5142.c
new file mode 100644
index 000000000000..ac6a814c8ecf
--- /dev/null
+++ b/sound/soc/atmel/tse850-pcm5142.c
@@ -0,0 +1,472 @@
1/*
2 * TSE-850 audio - ASoC driver for the Axentia TSE-850 with a PCM5142 codec
3 *
4 * Copyright (C) 2016 Axentia Technologies AB
5 *
6 * Author: Peter Rosin <peda@axentia.se>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13/*
14 * loop1 relays
15 * IN1 +---o +------------+ o---+ OUT1
16 * \ /
17 * + +
18 * | / |
19 * +--o +--. |
20 * | add | |
21 * | V |
22 * | .---. |
23 * DAC +----------->|Sum|---+
24 * | '---' |
25 * | |
26 * + +
27 *
28 * IN2 +---o--+------------+--o---+ OUT2
29 * loop2 relays
30 *
31 * The 'loop1' gpio pin controlls two relays, which are either in loop
32 * position, meaning that input and output are directly connected, or
33 * they are in mixer position, meaning that the signal is passed through
34 * the 'Sum' mixer. Similarly for 'loop2'.
35 *
36 * In the above, the 'loop1' relays are inactive, thus feeding IN1 to the
37 * mixer (if 'add' is active) and feeding the mixer output to OUT1. The
38 * 'loop2' relays are active, short-cutting the TSE-850 from channel 2.
39 * IN1, IN2, OUT1 and OUT2 are TSE-850 connectors and DAC is the PCB name
40 * of the (filtered) output from the PCM5142 codec.
41 */
42
43#include <linux/clk.h>
44#include <linux/gpio.h>
45#include <linux/module.h>
46#include <linux/of.h>
47#include <linux/of_device.h>
48#include <linux/of_gpio.h>
49#include <linux/regulator/consumer.h>
50
51#include <sound/soc.h>
52#include <sound/pcm_params.h>
53
54#include "atmel_ssc_dai.h"
55
56struct tse850_priv {
57 int ssc_id;
58
59 struct gpio_desc *add;
60 struct gpio_desc *loop1;
61 struct gpio_desc *loop2;
62
63 struct regulator *ana;
64
65 int add_cache;
66 int loop1_cache;
67 int loop2_cache;
68};
69
70static int tse850_get_mux1(struct snd_kcontrol *kctrl,
71 struct snd_ctl_elem_value *ucontrol)
72{
73 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
74 struct snd_soc_card *card = dapm->card;
75 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
76
77 ucontrol->value.enumerated.item[0] = tse850->loop1_cache;
78
79 return 0;
80}
81
82static int tse850_put_mux1(struct snd_kcontrol *kctrl,
83 struct snd_ctl_elem_value *ucontrol)
84{
85 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
86 struct snd_soc_card *card = dapm->card;
87 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
88 struct soc_enum *e = (struct soc_enum *)kctrl->private_value;
89 unsigned int val = ucontrol->value.enumerated.item[0];
90
91 if (val >= e->items)
92 return -EINVAL;
93
94 gpiod_set_value_cansleep(tse850->loop1, val);
95 tse850->loop1_cache = val;
96
97 return snd_soc_dapm_put_enum_double(kctrl, ucontrol);
98}
99
100static int tse850_get_mux2(struct snd_kcontrol *kctrl,
101 struct snd_ctl_elem_value *ucontrol)
102{
103 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
104 struct snd_soc_card *card = dapm->card;
105 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
106
107 ucontrol->value.enumerated.item[0] = tse850->loop2_cache;
108
109 return 0;
110}
111
112static int tse850_put_mux2(struct snd_kcontrol *kctrl,
113 struct snd_ctl_elem_value *ucontrol)
114{
115 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
116 struct snd_soc_card *card = dapm->card;
117 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
118 struct soc_enum *e = (struct soc_enum *)kctrl->private_value;
119 unsigned int val = ucontrol->value.enumerated.item[0];
120
121 if (val >= e->items)
122 return -EINVAL;
123
124 gpiod_set_value_cansleep(tse850->loop2, val);
125 tse850->loop2_cache = val;
126
127 return snd_soc_dapm_put_enum_double(kctrl, ucontrol);
128}
129
130int tse850_get_mix(struct snd_kcontrol *kctrl,
131 struct snd_ctl_elem_value *ucontrol)
132{
133 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
134 struct snd_soc_card *card = dapm->card;
135 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
136
137 ucontrol->value.enumerated.item[0] = tse850->add_cache;
138
139 return 0;
140}
141
142int tse850_put_mix(struct snd_kcontrol *kctrl,
143 struct snd_ctl_elem_value *ucontrol)
144{
145 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
146 struct snd_soc_card *card = dapm->card;
147 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
148 int connect = !!ucontrol->value.integer.value[0];
149
150 if (tse850->add_cache == connect)
151 return 0;
152
153 /*
154 * Hmmm, this gpiod_set_value_cansleep call should probably happen
155 * inside snd_soc_dapm_mixer_update_power in the loop.
156 */
157 gpiod_set_value_cansleep(tse850->add, connect);
158 tse850->add_cache = connect;
159
160 snd_soc_dapm_mixer_update_power(dapm, kctrl, connect, NULL);
161 return 1;
162}
163
164int tse850_get_ana(struct snd_kcontrol *kctrl,
165 struct snd_ctl_elem_value *ucontrol)
166{
167 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
168 struct snd_soc_card *card = dapm->card;
169 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
170 int ret;
171
172 ret = regulator_get_voltage(tse850->ana);
173 if (ret < 0)
174 return ret;
175
176 /*
177 * Map regulator output values like so:
178 * -11.5V to "Low" (enum 0)
179 * 11.5V-12.5V to "12V" (enum 1)
180 * 12.5V-13.5V to "13V" (enum 2)
181 * ...
182 * 18.5V-19.5V to "19V" (enum 8)
183 * 19.5V- to "20V" (enum 9)
184 */
185 if (ret < 11000000)
186 ret = 11000000;
187 else if (ret > 20000000)
188 ret = 20000000;
189 ret -= 11000000;
190 ret = (ret + 500000) / 1000000;
191
192 ucontrol->value.enumerated.item[0] = ret;
193
194 return 0;
195}
196
197int tse850_put_ana(struct snd_kcontrol *kctrl,
198 struct snd_ctl_elem_value *ucontrol)
199{
200 struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kctrl);
201 struct snd_soc_card *card = dapm->card;
202 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
203 struct soc_enum *e = (struct soc_enum *)kctrl->private_value;
204 unsigned int uV = ucontrol->value.enumerated.item[0];
205 int ret;
206
207 if (uV >= e->items)
208 return -EINVAL;
209
210 /*
211 * Map enum zero (Low) to 2 volts on the regulator, do this since
212 * the ana regulator is supplied by the system 12V voltage and
213 * requesting anything below the system voltage causes the system
214 * voltage to be passed through the regulator. Also, the ana
215 * regulator induces noise when requesting voltages near the
216 * system voltage. So, by mapping Low to 2V, that noise is
217 * eliminated when all that is needed is 12V (the system voltage).
218 */
219 if (uV)
220 uV = 11000000 + (1000000 * uV);
221 else
222 uV = 2000000;
223
224 ret = regulator_set_voltage(tse850->ana, uV, uV);
225 if (ret < 0)
226 return ret;
227
228 return snd_soc_dapm_put_enum_double(kctrl, ucontrol);
229}
230
231static const char * const mux_text[] = { "Mixer", "Loop" };
232
233static const struct soc_enum mux_enum =
234 SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 2, mux_text);
235
236static const struct snd_kcontrol_new mux1 =
237 SOC_DAPM_ENUM_EXT("MUX1", mux_enum, tse850_get_mux1, tse850_put_mux1);
238
239static const struct snd_kcontrol_new mux2 =
240 SOC_DAPM_ENUM_EXT("MUX2", mux_enum, tse850_get_mux2, tse850_put_mux2);
241
242#define TSE850_DAPM_SINGLE_EXT(xname, reg, shift, max, invert, xget, xput) \
243{ .iface = SNDRV_CTL_ELEM_IFACE_MIXER, .name = xname, \
244 .info = snd_soc_info_volsw, \
245 .get = xget, \
246 .put = xput, \
247 .private_value = SOC_SINGLE_VALUE(reg, shift, max, invert, 0) }
248
249static const struct snd_kcontrol_new mix[] = {
250 TSE850_DAPM_SINGLE_EXT("IN Switch", SND_SOC_NOPM, 0, 1, 0,
251 tse850_get_mix, tse850_put_mix),
252};
253
254static const char * const ana_text[] = {
255 "Low", "12V", "13V", "14V", "15V", "16V", "17V", "18V", "19V", "20V"
256};
257
258static const struct soc_enum ana_enum =
259 SOC_ENUM_SINGLE(SND_SOC_NOPM, 0, 9, ana_text);
260
261static const struct snd_kcontrol_new out =
262 SOC_DAPM_ENUM_EXT("ANA", ana_enum, tse850_get_ana, tse850_put_ana);
263
264static const struct snd_soc_dapm_widget tse850_dapm_widgets[] = {
265 SND_SOC_DAPM_LINE("OUT1", NULL),
266 SND_SOC_DAPM_LINE("OUT2", NULL),
267 SND_SOC_DAPM_LINE("IN1", NULL),
268 SND_SOC_DAPM_LINE("IN2", NULL),
269 SND_SOC_DAPM_INPUT("DAC"),
270 SND_SOC_DAPM_AIF_IN("AIFINL", "Playback", 0, SND_SOC_NOPM, 0, 0),
271 SND_SOC_DAPM_AIF_IN("AIFINR", "Playback", 1, SND_SOC_NOPM, 0, 0),
272 SOC_MIXER_ARRAY("MIX", SND_SOC_NOPM, 0, 0, mix),
273 SND_SOC_DAPM_MUX("MUX1", SND_SOC_NOPM, 0, 0, &mux1),
274 SND_SOC_DAPM_MUX("MUX2", SND_SOC_NOPM, 0, 0, &mux2),
275 SND_SOC_DAPM_OUT_DRV("OUT", SND_SOC_NOPM, 0, 0, &out, 1),
276};
277
278/*
279 * These connections are not entirely correct, since both IN1 and IN2
280 * are always fed to MIX (if the "IN switch" is set so), i.e. without
281 * regard to the loop1 and loop2 relays that according to this only
282 * control MUX1 and MUX2 but in fact also control how the input signals
283 * are routed.
284 * But, 1) I don't know how to do it right, and 2) it doesn't seem to
285 * matter in practice since nothing is powered in those sections anyway.
286 */
287static const struct snd_soc_dapm_route tse850_intercon[] = {
288 { "OUT1", NULL, "MUX1" },
289 { "OUT2", NULL, "MUX2" },
290
291 { "MUX1", "Loop", "IN1" },
292 { "MUX1", "Mixer", "OUT" },
293
294 { "MUX2", "Loop", "IN2" },
295 { "MUX2", "Mixer", "OUT" },
296
297 { "OUT", NULL, "MIX" },
298
299 { "MIX", NULL, "DAC" },
300 { "MIX", "IN Switch", "IN1" },
301 { "MIX", "IN Switch", "IN2" },
302
303 /* connect board input to the codec left channel output pin */
304 { "DAC", NULL, "OUTL" },
305};
306
307static struct snd_soc_dai_link tse850_dailink = {
308 .name = "TSE-850",
309 .stream_name = "TSE-850-PCM",
310 .codec_dai_name = "pcm512x-hifi",
311 .dai_fmt = SND_SOC_DAIFMT_I2S
312 | SND_SOC_DAIFMT_NB_NF
313 | SND_SOC_DAIFMT_CBM_CFS,
314};
315
316static struct snd_soc_card tse850_card = {
317 .name = "TSE-850-ASoC",
318 .owner = THIS_MODULE,
319 .dai_link = &tse850_dailink,
320 .num_links = 1,
321 .dapm_widgets = tse850_dapm_widgets,
322 .num_dapm_widgets = ARRAY_SIZE(tse850_dapm_widgets),
323 .dapm_routes = tse850_intercon,
324 .num_dapm_routes = ARRAY_SIZE(tse850_intercon),
325 .fully_routed = true,
326};
327
328static int tse850_dt_init(struct platform_device *pdev)
329{
330 struct device_node *np = pdev->dev.of_node;
331 struct device_node *codec_np, *cpu_np;
332 struct snd_soc_card *card = &tse850_card;
333 struct snd_soc_dai_link *dailink = &tse850_dailink;
334 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
335
336 if (!np) {
337 dev_err(&pdev->dev, "only device tree supported\n");
338 return -EINVAL;
339 }
340
341 cpu_np = of_parse_phandle(np, "axentia,ssc-controller", 0);
342 if (!cpu_np) {
343 dev_err(&pdev->dev, "failed to get dai and pcm info\n");
344 return -EINVAL;
345 }
346 dailink->cpu_of_node = cpu_np;
347 dailink->platform_of_node = cpu_np;
348 tse850->ssc_id = of_alias_get_id(cpu_np, "ssc");
349 of_node_put(cpu_np);
350
351 codec_np = of_parse_phandle(np, "axentia,audio-codec", 0);
352 if (!codec_np) {
353 dev_err(&pdev->dev, "failed to get codec info\n");
354 return -EINVAL;
355 }
356 dailink->codec_of_node = codec_np;
357 of_node_put(codec_np);
358
359 return 0;
360}
361
362static int tse850_probe(struct platform_device *pdev)
363{
364 struct snd_soc_card *card = &tse850_card;
365 struct device *dev = card->dev = &pdev->dev;
366 struct tse850_priv *tse850;
367 int ret;
368
369 tse850 = devm_kzalloc(dev, sizeof(*tse850), GFP_KERNEL);
370 if (!tse850)
371 return -ENOMEM;
372
373 snd_soc_card_set_drvdata(card, tse850);
374
375 ret = tse850_dt_init(pdev);
376 if (ret) {
377 dev_err(dev, "failed to init dt info\n");
378 return ret;
379 }
380
381 tse850->add = devm_gpiod_get(dev, "axentia,add", GPIOD_OUT_HIGH);
382 if (IS_ERR(tse850->add)) {
383 if (PTR_ERR(tse850->add) != -EPROBE_DEFER)
384 dev_err(dev, "failed to get 'add' gpio\n");
385 return PTR_ERR(tse850->add);
386 }
387 tse850->add_cache = 1;
388
389 tse850->loop1 = devm_gpiod_get(dev, "axentia,loop1", GPIOD_OUT_HIGH);
390 if (IS_ERR(tse850->loop1)) {
391 if (PTR_ERR(tse850->loop1) != -EPROBE_DEFER)
392 dev_err(dev, "failed to get 'loop1' gpio\n");
393 return PTR_ERR(tse850->loop1);
394 }
395 tse850->loop1_cache = 1;
396
397 tse850->loop2 = devm_gpiod_get(dev, "axentia,loop2", GPIOD_OUT_HIGH);
398 if (IS_ERR(tse850->loop2)) {
399 if (PTR_ERR(tse850->loop2) != -EPROBE_DEFER)
400 dev_err(dev, "failed to get 'loop2' gpio\n");
401 return PTR_ERR(tse850->loop2);
402 }
403 tse850->loop2_cache = 1;
404
405 tse850->ana = devm_regulator_get(dev, "axentia,ana");
406 if (IS_ERR(tse850->ana)) {
407 if (PTR_ERR(tse850->ana) != -EPROBE_DEFER)
408 dev_err(dev, "failed to get 'ana' regulator\n");
409 return PTR_ERR(tse850->ana);
410 }
411
412 ret = regulator_enable(tse850->ana);
413 if (ret < 0) {
414 dev_err(dev, "failed to enable the 'ana' regulator\n");
415 return ret;
416 }
417
418 ret = atmel_ssc_set_audio(tse850->ssc_id);
419 if (ret != 0) {
420 dev_err(dev,
421 "failed to set SSC %d for audio\n", tse850->ssc_id);
422 goto err_disable_ana;
423 }
424
425 ret = snd_soc_register_card(card);
426 if (ret) {
427 dev_err(dev, "snd_soc_register_card failed\n");
428 goto err_put_audio;
429 }
430
431 return 0;
432
433err_put_audio:
434 atmel_ssc_put_audio(tse850->ssc_id);
435err_disable_ana:
436 regulator_disable(tse850->ana);
437 return ret;
438}
439
440static int tse850_remove(struct platform_device *pdev)
441{
442 struct snd_soc_card *card = platform_get_drvdata(pdev);
443 struct tse850_priv *tse850 = snd_soc_card_get_drvdata(card);
444
445 snd_soc_unregister_card(card);
446 atmel_ssc_put_audio(tse850->ssc_id);
447 regulator_disable(tse850->ana);
448
449 return 0;
450}
451
452static const struct of_device_id tse850_dt_ids[] = {
453 { .compatible = "axentia,tse850-pcm5142", },
454 { /* sentinel */ }
455};
456MODULE_DEVICE_TABLE(of, tse850_dt_ids);
457
458static struct platform_driver tse850_driver = {
459 .driver = {
460 .name = "axentia-tse850-pcm5142",
461 .of_match_table = of_match_ptr(tse850_dt_ids),
462 },
463 .probe = tse850_probe,
464 .remove = tse850_remove,
465};
466
467module_platform_driver(tse850_driver);
468
469/* Module information */
470MODULE_AUTHOR("Peter Rosin <peda@axentia.se>");
471MODULE_DESCRIPTION("ALSA SoC driver for TSE-850 with PCM5142 codec");
472MODULE_LICENSE("GPL");
diff --git a/sound/soc/bcm/Kconfig b/sound/soc/bcm/Kconfig
index d528aaceaad9..edf367100ebd 100644
--- a/sound/soc/bcm/Kconfig
+++ b/sound/soc/bcm/Kconfig
@@ -11,6 +11,7 @@ config SND_BCM2835_SOC_I2S
11config SND_SOC_CYGNUS 11config SND_SOC_CYGNUS
12 tristate "SoC platform audio for Broadcom Cygnus chips" 12 tristate "SoC platform audio for Broadcom Cygnus chips"
13 depends on ARCH_BCM_CYGNUS || COMPILE_TEST 13 depends on ARCH_BCM_CYGNUS || COMPILE_TEST
14 depends on HAS_DMA
14 help 15 help
15 Say Y if you want to add support for ASoC audio on Broadcom 16 Say Y if you want to add support for ASoC audio on Broadcom
16 Cygnus chips (bcm958300, bcm958305, bcm911360) 17 Cygnus chips (bcm958300, bcm958305, bcm911360)
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig
index c67667bb970f..9e1718a8cb1c 100644
--- a/sound/soc/codecs/Kconfig
+++ b/sound/soc/codecs/Kconfig
@@ -48,6 +48,8 @@ config SND_SOC_ALL_CODECS
48 select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC 48 select SND_SOC_CQ0093VC if MFD_DAVINCI_VOICECODEC
49 select SND_SOC_CS35L32 if I2C 49 select SND_SOC_CS35L32 if I2C
50 select SND_SOC_CS35L33 if I2C 50 select SND_SOC_CS35L33 if I2C
51 select SND_SOC_CS35L34 if I2C
52 select SND_SOC_CS42L42 if I2C
51 select SND_SOC_CS42L51_I2C if I2C 53 select SND_SOC_CS42L51_I2C if I2C
52 select SND_SOC_CS42L52 if I2C && INPUT 54 select SND_SOC_CS42L52 if I2C && INPUT
53 select SND_SOC_CS42L56 if I2C && INPUT 55 select SND_SOC_CS42L56 if I2C && INPUT
@@ -83,6 +85,7 @@ config SND_SOC_ALL_CODECS
83 select SND_SOC_MAX98095 if I2C 85 select SND_SOC_MAX98095 if I2C
84 select SND_SOC_MAX98357A if GPIOLIB 86 select SND_SOC_MAX98357A if GPIOLIB
85 select SND_SOC_MAX98371 if I2C 87 select SND_SOC_MAX98371 if I2C
88 select SND_SOC_MAX98504 if I2C
86 select SND_SOC_MAX9867 if I2C 89 select SND_SOC_MAX9867 if I2C
87 select SND_SOC_MAX98925 if I2C 90 select SND_SOC_MAX98925 if I2C
88 select SND_SOC_MAX98926 if I2C 91 select SND_SOC_MAX98926 if I2C
@@ -114,6 +117,7 @@ config SND_SOC_ALL_CODECS
114 select SND_SOC_RT5651 if I2C 117 select SND_SOC_RT5651 if I2C
115 select SND_SOC_RT5659 if I2C 118 select SND_SOC_RT5659 if I2C
116 select SND_SOC_RT5660 if I2C 119 select SND_SOC_RT5660 if I2C
120 select SND_SOC_RT5665 if I2C
117 select SND_SOC_RT5663 if I2C 121 select SND_SOC_RT5663 if I2C
118 select SND_SOC_RT5670 if I2C 122 select SND_SOC_RT5670 if I2C
119 select SND_SOC_RT5677 if I2C && SPI_MASTER 123 select SND_SOC_RT5677 if I2C && SPI_MASTER
@@ -399,6 +403,14 @@ config SND_SOC_CS35L33
399 tristate "Cirrus Logic CS35L33 CODEC" 403 tristate "Cirrus Logic CS35L33 CODEC"
400 depends on I2C 404 depends on I2C
401 405
406config SND_SOC_CS35L34
407 tristate "Cirrus Logic CS35L34 CODEC"
408 depends on I2C
409
410config SND_SOC_CS42L42
411 tristate "Cirrus Logic CS42L42 CODEC"
412 depends on I2C
413
402config SND_SOC_CS42L51 414config SND_SOC_CS42L51
403 tristate 415 tristate
404 416
@@ -581,6 +593,13 @@ config SND_SOC_MAX9860
581 depends on I2C 593 depends on I2C
582 select REGMAP_I2C 594 select REGMAP_I2C
583 595
596config SND_SOC_MSM8916_WCD_ANALOG
597 tristate "Qualcomm MSM8916 WCD Analog Codec"
598 depends on SPMI || COMPILE_TEST
599
600config SND_SOC_MSM8916_WCD_DIGITAL
601 tristate "Qualcomm MSM8916 WCD DIGITAL Codec"
602
584config SND_SOC_PCM1681 603config SND_SOC_PCM1681
585 tristate "Texas Instruments PCM1681 CODEC" 604 tristate "Texas Instruments PCM1681 CODEC"
586 depends on I2C 605 depends on I2C
@@ -649,6 +668,7 @@ config SND_SOC_RL6231
649 default y if SND_SOC_RT5651=y 668 default y if SND_SOC_RT5651=y
650 default y if SND_SOC_RT5659=y 669 default y if SND_SOC_RT5659=y
651 default y if SND_SOC_RT5660=y 670 default y if SND_SOC_RT5660=y
671 default y if SND_SOC_RT5665=y
652 default y if SND_SOC_RT5663=y 672 default y if SND_SOC_RT5663=y
653 default y if SND_SOC_RT5670=y 673 default y if SND_SOC_RT5670=y
654 default y if SND_SOC_RT5677=y 674 default y if SND_SOC_RT5677=y
@@ -659,6 +679,7 @@ config SND_SOC_RL6231
659 default m if SND_SOC_RT5651=m 679 default m if SND_SOC_RT5651=m
660 default m if SND_SOC_RT5659=m 680 default m if SND_SOC_RT5659=m
661 default m if SND_SOC_RT5660=m 681 default m if SND_SOC_RT5660=m
682 default m if SND_SOC_RT5665=m
662 default m if SND_SOC_RT5663=m 683 default m if SND_SOC_RT5663=m
663 default m if SND_SOC_RT5670=m 684 default m if SND_SOC_RT5670=m
664 default m if SND_SOC_RT5677=m 685 default m if SND_SOC_RT5677=m
@@ -672,7 +693,6 @@ config SND_SOC_RL6347A
672 693
673config SND_SOC_RT286 694config SND_SOC_RT286
674 tristate 695 tristate
675 select SND_SOC_RT5663
676 depends on I2C 696 depends on I2C
677 697
678config SND_SOC_RT298 698config SND_SOC_RT298
@@ -708,6 +728,9 @@ config SND_SOC_RT5659
708config SND_SOC_RT5660 728config SND_SOC_RT5660
709 tristate 729 tristate
710 730
731config SND_SOC_RT5665
732 tristate
733
711config SND_SOC_RT5663 734config SND_SOC_RT5663
712 tristate 735 tristate
713 736
@@ -874,6 +897,7 @@ config SND_SOC_UDA134X
874 897
875config SND_SOC_UDA1380 898config SND_SOC_UDA1380
876 tristate 899 tristate
900 depends on I2C
877 901
878config SND_SOC_WL1273 902config SND_SOC_WL1273
879 tristate 903 tristate
@@ -914,7 +938,7 @@ config SND_SOC_WM8523
914 depends on I2C 938 depends on I2C
915 939
916config SND_SOC_WM8580 940config SND_SOC_WM8580
917 tristate "Wolfson Microelectronics WM8523 CODEC" 941 tristate "Wolfson Microelectronics WM8580 and WM8581 CODECs"
918 depends on I2C 942 depends on I2C
919 943
920config SND_SOC_WM8711 944config SND_SOC_WM8711
@@ -1048,15 +1072,18 @@ config SND_SOC_WM8998
1048 1072
1049config SND_SOC_WM9081 1073config SND_SOC_WM9081
1050 tristate 1074 tristate
1075 depends on I2C
1051 1076
1052config SND_SOC_WM9090 1077config SND_SOC_WM9090
1053 tristate 1078 tristate
1054 1079
1055config SND_SOC_WM9705 1080config SND_SOC_WM9705
1056 tristate 1081 tristate
1082 select REGMAP_AC97
1057 1083
1058config SND_SOC_WM9712 1084config SND_SOC_WM9712
1059 tristate 1085 tristate
1086 select REGMAP_AC97
1060 1087
1061config SND_SOC_WM9713 1088config SND_SOC_WM9713
1062 tristate 1089 tristate
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile
index 958cd4912fbc..7e1dad79610b 100644
--- a/sound/soc/codecs/Makefile
+++ b/sound/soc/codecs/Makefile
@@ -38,6 +38,8 @@ snd-soc-bt-sco-objs := bt-sco.o
38snd-soc-cq93vc-objs := cq93vc.o 38snd-soc-cq93vc-objs := cq93vc.o
39snd-soc-cs35l32-objs := cs35l32.o 39snd-soc-cs35l32-objs := cs35l32.o
40snd-soc-cs35l33-objs := cs35l33.o 40snd-soc-cs35l33-objs := cs35l33.o
41snd-soc-cs35l34-objs := cs35l34.o
42snd-soc-cs42l42-objs := cs42l42.o
41snd-soc-cs42l51-objs := cs42l51.o 43snd-soc-cs42l51-objs := cs42l51.o
42snd-soc-cs42l51-i2c-objs := cs42l51-i2c.o 44snd-soc-cs42l51-i2c-objs := cs42l51-i2c.o
43snd-soc-cs42l52-objs := cs42l52.o 45snd-soc-cs42l52-objs := cs42l52.o
@@ -86,6 +88,8 @@ snd-soc-max9850-objs := max9850.o
86snd-soc-max9860-objs := max9860.o 88snd-soc-max9860-objs := max9860.o
87snd-soc-mc13783-objs := mc13783.o 89snd-soc-mc13783-objs := mc13783.o
88snd-soc-ml26124-objs := ml26124.o 90snd-soc-ml26124-objs := ml26124.o
91snd-soc-msm8916-analog-objs := msm8916-wcd-analog.o
92snd-soc-msm8916-digital-objs := msm8916-wcd-digital.o
89snd-soc-nau8810-objs := nau8810.o 93snd-soc-nau8810-objs := nau8810.o
90snd-soc-nau8825-objs := nau8825.o 94snd-soc-nau8825-objs := nau8825.o
91snd-soc-hdmi-codec-objs := hdmi-codec.o 95snd-soc-hdmi-codec-objs := hdmi-codec.o
@@ -114,6 +118,7 @@ snd-soc-rt5645-objs := rt5645.o
114snd-soc-rt5651-objs := rt5651.o 118snd-soc-rt5651-objs := rt5651.o
115snd-soc-rt5659-objs := rt5659.o 119snd-soc-rt5659-objs := rt5659.o
116snd-soc-rt5660-objs := rt5660.o 120snd-soc-rt5660-objs := rt5660.o
121snd-soc-rt5665-objs := rt5665.o
117snd-soc-rt5663-objs := rt5663.o 122snd-soc-rt5663-objs := rt5663.o
118snd-soc-rt5670-objs := rt5670.o 123snd-soc-rt5670-objs := rt5670.o
119snd-soc-rt5677-objs := rt5677.o 124snd-soc-rt5677-objs := rt5677.o
@@ -214,7 +219,6 @@ snd-soc-wm9705-objs := wm9705.o
214snd-soc-wm9712-objs := wm9712.o 219snd-soc-wm9712-objs := wm9712.o
215snd-soc-wm9713-objs := wm9713.o 220snd-soc-wm9713-objs := wm9713.o
216snd-soc-wm-hubs-objs := wm_hubs.o 221snd-soc-wm-hubs-objs := wm_hubs.o
217
218# Amp 222# Amp
219snd-soc-max9877-objs := max9877.o 223snd-soc-max9877-objs := max9877.o
220snd-soc-max98504-objs := max98504.o 224snd-soc-max98504-objs := max98504.o
@@ -263,6 +267,8 @@ obj-$(CONFIG_SND_SOC_BT_SCO) += snd-soc-bt-sco.o
263obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o 267obj-$(CONFIG_SND_SOC_CQ0093VC) += snd-soc-cq93vc.o
264obj-$(CONFIG_SND_SOC_CS35L32) += snd-soc-cs35l32.o 268obj-$(CONFIG_SND_SOC_CS35L32) += snd-soc-cs35l32.o
265obj-$(CONFIG_SND_SOC_CS35L33) += snd-soc-cs35l33.o 269obj-$(CONFIG_SND_SOC_CS35L33) += snd-soc-cs35l33.o
270obj-$(CONFIG_SND_SOC_CS35L34) += snd-soc-cs35l34.o
271obj-$(CONFIG_SND_SOC_CS42L42) += snd-soc-cs42l42.o
266obj-$(CONFIG_SND_SOC_CS42L51) += snd-soc-cs42l51.o 272obj-$(CONFIG_SND_SOC_CS42L51) += snd-soc-cs42l51.o
267obj-$(CONFIG_SND_SOC_CS42L51_I2C) += snd-soc-cs42l51-i2c.o 273obj-$(CONFIG_SND_SOC_CS42L51_I2C) += snd-soc-cs42l51-i2c.o
268obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o 274obj-$(CONFIG_SND_SOC_CS42L52) += snd-soc-cs42l52.o
@@ -310,6 +316,8 @@ obj-$(CONFIG_SND_SOC_MAX9850) += snd-soc-max9850.o
310obj-$(CONFIG_SND_SOC_MAX9860) += snd-soc-max9860.o 316obj-$(CONFIG_SND_SOC_MAX9860) += snd-soc-max9860.o
311obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o 317obj-$(CONFIG_SND_SOC_MC13783) += snd-soc-mc13783.o
312obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o 318obj-$(CONFIG_SND_SOC_ML26124) += snd-soc-ml26124.o
319obj-$(CONFIG_SND_SOC_MSM8916_WCD_ANALOG) +=snd-soc-msm8916-analog.o
320obj-$(CONFIG_SND_SOC_MSM8916_WCD_DIGITAL) +=snd-soc-msm8916-digital.o
313obj-$(CONFIG_SND_SOC_NAU8810) += snd-soc-nau8810.o 321obj-$(CONFIG_SND_SOC_NAU8810) += snd-soc-nau8810.o
314obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o 322obj-$(CONFIG_SND_SOC_NAU8825) += snd-soc-nau8825.o
315obj-$(CONFIG_SND_SOC_HDMI_CODEC) += snd-soc-hdmi-codec.o 323obj-$(CONFIG_SND_SOC_HDMI_CODEC) += snd-soc-hdmi-codec.o
@@ -338,6 +346,7 @@ obj-$(CONFIG_SND_SOC_RT5645) += snd-soc-rt5645.o
338obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o 346obj-$(CONFIG_SND_SOC_RT5651) += snd-soc-rt5651.o
339obj-$(CONFIG_SND_SOC_RT5659) += snd-soc-rt5659.o 347obj-$(CONFIG_SND_SOC_RT5659) += snd-soc-rt5659.o
340obj-$(CONFIG_SND_SOC_RT5660) += snd-soc-rt5660.o 348obj-$(CONFIG_SND_SOC_RT5660) += snd-soc-rt5660.o
349obj-$(CONFIG_SND_SOC_RT5665) += snd-soc-rt5665.o
341obj-$(CONFIG_SND_SOC_RT5663) += snd-soc-rt5663.o 350obj-$(CONFIG_SND_SOC_RT5663) += snd-soc-rt5663.o
342obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o 351obj-$(CONFIG_SND_SOC_RT5670) += snd-soc-rt5670.o
343obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o 352obj-$(CONFIG_SND_SOC_RT5677) += snd-soc-rt5677.o
diff --git a/sound/soc/codecs/ab8500-codec.c b/sound/soc/codecs/ab8500-codec.c
index 935ff7cb71c5..312b2a11abb6 100644
--- a/sound/soc/codecs/ab8500-codec.c
+++ b/sound/soc/codecs/ab8500-codec.c
@@ -2587,8 +2587,6 @@ static struct platform_driver ab8500_codec_platform_driver = {
2587 }, 2587 },
2588 .probe = ab8500_codec_driver_probe, 2588 .probe = ab8500_codec_driver_probe,
2589 .remove = ab8500_codec_driver_remove, 2589 .remove = ab8500_codec_driver_remove,
2590 .suspend = NULL,
2591 .resume = NULL,
2592}; 2590};
2593module_platform_driver(ab8500_codec_platform_driver); 2591module_platform_driver(ab8500_codec_platform_driver);
2594 2592
diff --git a/sound/soc/codecs/adau17x1.c b/sound/soc/codecs/adau17x1.c
index 439aa3ff1f99..b36511d965c8 100644
--- a/sound/soc/codecs/adau17x1.c
+++ b/sound/soc/codecs/adau17x1.c
@@ -160,7 +160,7 @@ static int adau17x1_dsp_mux_enum_put(struct snd_kcontrol *kcontrol,
160 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 160 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
161 struct adau *adau = snd_soc_codec_get_drvdata(codec); 161 struct adau *adau = snd_soc_codec_get_drvdata(codec);
162 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; 162 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
163 struct snd_soc_dapm_update update; 163 struct snd_soc_dapm_update update = { 0 };
164 unsigned int stream = e->shift_l; 164 unsigned int stream = e->shift_l;
165 unsigned int val, change; 165 unsigned int val, change;
166 int reg; 166 int reg;
diff --git a/sound/soc/codecs/ak4641.c b/sound/soc/codecs/ak4641.c
index c91717d08513..ebdaf56c1d61 100644
--- a/sound/soc/codecs/ak4641.c
+++ b/sound/soc/codecs/ak4641.c
@@ -27,7 +27,27 @@
27#include <sound/tlv.h> 27#include <sound/tlv.h>
28#include <sound/ak4641.h> 28#include <sound/ak4641.h>
29 29
30#include "ak4641.h" 30/* AK4641 register space */
31#define AK4641_PM1 0x00
32#define AK4641_PM2 0x01
33#define AK4641_SIG1 0x02
34#define AK4641_SIG2 0x03
35#define AK4641_MODE1 0x04
36#define AK4641_MODE2 0x05
37#define AK4641_DAC 0x06
38#define AK4641_MIC 0x07
39#define AK4641_TIMER 0x08
40#define AK4641_ALC1 0x09
41#define AK4641_ALC2 0x0a
42#define AK4641_PGA 0x0b
43#define AK4641_LATT 0x0c
44#define AK4641_RATT 0x0d
45#define AK4641_VOL 0x0e
46#define AK4641_STATUS 0x0f
47#define AK4641_EQLO 0x10
48#define AK4641_EQMID 0x11
49#define AK4641_EQHI 0x12
50#define AK4641_BTIF 0x13
31 51
32/* codec private data */ 52/* codec private data */
33struct ak4641_priv { 53struct ak4641_priv {
diff --git a/sound/soc/codecs/ak4641.h b/sound/soc/codecs/ak4641.h
deleted file mode 100644
index 4a263248efea..000000000000
--- a/sound/soc/codecs/ak4641.h
+++ /dev/null
@@ -1,47 +0,0 @@
1/*
2 * ak4641.h -- AK4641 SoC Audio driver
3 *
4 * Copyright 2008 Harald Welte <laforge@gnufiish.org>
5 *
6 * Based on ak4535.h
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef _AK4641_H
14#define _AK4641_H
15
16/* AK4641 register space */
17
18#define AK4641_PM1 0x00
19#define AK4641_PM2 0x01
20#define AK4641_SIG1 0x02
21#define AK4641_SIG2 0x03
22#define AK4641_MODE1 0x04
23#define AK4641_MODE2 0x05
24#define AK4641_DAC 0x06
25#define AK4641_MIC 0x07
26#define AK4641_TIMER 0x08
27#define AK4641_ALC1 0x09
28#define AK4641_ALC2 0x0a
29#define AK4641_PGA 0x0b
30#define AK4641_LATT 0x0c
31#define AK4641_RATT 0x0d
32#define AK4641_VOL 0x0e
33#define AK4641_STATUS 0x0f
34#define AK4641_EQLO 0x10
35#define AK4641_EQMID 0x11
36#define AK4641_EQHI 0x12
37#define AK4641_BTIF 0x13
38
39#define AK4641_CACHEREGNUM 0x14
40
41
42
43#define AK4641_DAI_HIFI 0
44#define AK4641_DAI_VOICE 1
45
46
47#endif
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index 846ca079845f..0a734d910850 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -191,6 +191,14 @@ int arizona_init_spk(struct snd_soc_codec *codec)
191 break; 191 break;
192 } 192 }
193 193
194 return 0;
195}
196EXPORT_SYMBOL_GPL(arizona_init_spk);
197
198int arizona_init_spk_irqs(struct arizona *arizona)
199{
200 int ret;
201
194 ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN, 202 ret = arizona_request_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN,
195 "Thermal warning", arizona_thermal_warn, 203 "Thermal warning", arizona_thermal_warn,
196 arizona); 204 arizona);
@@ -209,19 +217,16 @@ int arizona_init_spk(struct snd_soc_codec *codec)
209 217
210 return 0; 218 return 0;
211} 219}
212EXPORT_SYMBOL_GPL(arizona_init_spk); 220EXPORT_SYMBOL_GPL(arizona_init_spk_irqs);
213 221
214int arizona_free_spk(struct snd_soc_codec *codec) 222int arizona_free_spk_irqs(struct arizona *arizona)
215{ 223{
216 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
217 struct arizona *arizona = priv->arizona;
218
219 arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN, arizona); 224 arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT_WARN, arizona);
220 arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT, arizona); 225 arizona_free_irq(arizona, ARIZONA_IRQ_SPK_OVERHEAT, arizona);
221 226
222 return 0; 227 return 0;
223} 228}
224EXPORT_SYMBOL_GPL(arizona_free_spk); 229EXPORT_SYMBOL_GPL(arizona_free_spk_irqs);
225 230
226static const struct snd_soc_dapm_route arizona_mono_routes[] = { 231static const struct snd_soc_dapm_route arizona_mono_routes[] = {
227 { "OUT1R", NULL, "OUT1L" }, 232 { "OUT1R", NULL, "OUT1L" },
@@ -252,6 +257,7 @@ EXPORT_SYMBOL_GPL(arizona_init_mono);
252int arizona_init_gpio(struct snd_soc_codec *codec) 257int arizona_init_gpio(struct snd_soc_codec *codec)
253{ 258{
254 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 259 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
260 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
255 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec); 261 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
256 struct arizona *arizona = priv->arizona; 262 struct arizona *arizona = priv->arizona;
257 int i; 263 int i;
@@ -259,21 +265,24 @@ int arizona_init_gpio(struct snd_soc_codec *codec)
259 switch (arizona->type) { 265 switch (arizona->type) {
260 case WM5110: 266 case WM5110:
261 case WM8280: 267 case WM8280:
262 snd_soc_dapm_disable_pin(dapm, "DRC2 Signal Activity"); 268 snd_soc_component_disable_pin(component,
269 "DRC2 Signal Activity");
263 break; 270 break;
264 default: 271 default:
265 break; 272 break;
266 } 273 }
267 274
268 snd_soc_dapm_disable_pin(dapm, "DRC1 Signal Activity"); 275 snd_soc_component_disable_pin(component, "DRC1 Signal Activity");
269 276
270 for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) { 277 for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
271 switch (arizona->pdata.gpio_defaults[i] & ARIZONA_GPN_FN_MASK) { 278 switch (arizona->pdata.gpio_defaults[i] & ARIZONA_GPN_FN_MASK) {
272 case ARIZONA_GP_FN_DRC1_SIGNAL_DETECT: 279 case ARIZONA_GP_FN_DRC1_SIGNAL_DETECT:
273 snd_soc_dapm_enable_pin(dapm, "DRC1 Signal Activity"); 280 snd_soc_component_enable_pin(component,
281 "DRC1 Signal Activity");
274 break; 282 break;
275 case ARIZONA_GP_FN_DRC2_SIGNAL_DETECT: 283 case ARIZONA_GP_FN_DRC2_SIGNAL_DETECT:
276 snd_soc_dapm_enable_pin(dapm, "DRC2 Signal Activity"); 284 snd_soc_component_enable_pin(component,
285 "DRC2 Signal Activity");
277 break; 286 break;
278 default: 287 default:
279 break; 288 break;
@@ -1233,6 +1242,46 @@ static int arizona_set_opclk(struct snd_soc_codec *codec, unsigned int clk,
1233 return -EINVAL; 1242 return -EINVAL;
1234} 1243}
1235 1244
1245int arizona_clk_ev(struct snd_soc_dapm_widget *w,
1246 struct snd_kcontrol *kcontrol, int event)
1247{
1248 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1249 struct arizona *arizona = dev_get_drvdata(codec->dev->parent);
1250 unsigned int val;
1251 int clk_idx;
1252 int ret;
1253
1254 ret = regmap_read(arizona->regmap, w->reg, &val);
1255 if (ret) {
1256 dev_err(codec->dev, "Failed to check clock source: %d\n", ret);
1257 return ret;
1258 }
1259
1260 val = (val & ARIZONA_SYSCLK_SRC_MASK) >> ARIZONA_SYSCLK_SRC_SHIFT;
1261
1262 switch (val) {
1263 case ARIZONA_CLK_SRC_MCLK1:
1264 clk_idx = ARIZONA_MCLK1;
1265 break;
1266 case ARIZONA_CLK_SRC_MCLK2:
1267 clk_idx = ARIZONA_MCLK2;
1268 break;
1269 default:
1270 return 0;
1271 }
1272
1273 switch (event) {
1274 case SND_SOC_DAPM_PRE_PMU:
1275 return clk_prepare_enable(arizona->mclk[clk_idx]);
1276 case SND_SOC_DAPM_POST_PMD:
1277 clk_disable_unprepare(arizona->mclk[clk_idx]);
1278 return 0;
1279 default:
1280 return 0;
1281 }
1282}
1283EXPORT_SYMBOL_GPL(arizona_clk_ev);
1284
1236int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id, 1285int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
1237 int source, unsigned int freq, int dir) 1286 int source, unsigned int freq, int dir)
1238{ 1287{
@@ -2242,6 +2291,42 @@ static int arizona_is_enabled_fll(struct arizona_fll *fll, int base)
2242 return reg & ARIZONA_FLL1_ENA; 2291 return reg & ARIZONA_FLL1_ENA;
2243} 2292}
2244 2293
2294static int arizona_set_fll_clks(struct arizona_fll *fll, int base, bool ena)
2295{
2296 struct arizona *arizona = fll->arizona;
2297 unsigned int val;
2298 struct clk *clk;
2299 int ret;
2300
2301 ret = regmap_read(arizona->regmap, base + 6, &val);
2302 if (ret != 0) {
2303 arizona_fll_err(fll, "Failed to read current source: %d\n",
2304 ret);
2305 return ret;
2306 }
2307
2308 val &= ARIZONA_FLL1_CLK_REF_SRC_MASK;
2309 val >>= ARIZONA_FLL1_CLK_REF_SRC_SHIFT;
2310
2311 switch (val) {
2312 case ARIZONA_FLL_SRC_MCLK1:
2313 clk = arizona->mclk[ARIZONA_MCLK1];
2314 break;
2315 case ARIZONA_FLL_SRC_MCLK2:
2316 clk = arizona->mclk[ARIZONA_MCLK2];
2317 break;
2318 default:
2319 return 0;
2320 }
2321
2322 if (ena) {
2323 return clk_prepare_enable(clk);
2324 } else {
2325 clk_disable_unprepare(clk);
2326 return 0;
2327 }
2328}
2329
2245static int arizona_enable_fll(struct arizona_fll *fll) 2330static int arizona_enable_fll(struct arizona_fll *fll)
2246{ 2331{
2247 struct arizona *arizona = fll->arizona; 2332 struct arizona *arizona = fll->arizona;
@@ -2264,6 +2349,10 @@ static int arizona_enable_fll(struct arizona_fll *fll)
2264 udelay(32); 2349 udelay(32);
2265 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9, 2350 regmap_update_bits_async(fll->arizona->regmap, fll->base + 0x9,
2266 ARIZONA_FLL1_GAIN_MASK, 0); 2351 ARIZONA_FLL1_GAIN_MASK, 0);
2352
2353 if (arizona_is_enabled_fll(fll, fll->base + 0x10) > 0)
2354 arizona_set_fll_clks(fll, fll->base + 0x10, false);
2355 arizona_set_fll_clks(fll, fll->base, false);
2267 } 2356 }
2268 2357
2269 /* 2358 /*
@@ -2318,10 +2407,13 @@ static int arizona_enable_fll(struct arizona_fll *fll)
2318 if (!already_enabled) 2407 if (!already_enabled)
2319 pm_runtime_get_sync(arizona->dev); 2408 pm_runtime_get_sync(arizona->dev);
2320 2409
2321 if (use_sync) 2410 if (use_sync) {
2411 arizona_set_fll_clks(fll, fll->base + 0x10, true);
2322 regmap_update_bits_async(arizona->regmap, fll->base + 0x11, 2412 regmap_update_bits_async(arizona->regmap, fll->base + 0x11,
2323 ARIZONA_FLL1_SYNC_ENA, 2413 ARIZONA_FLL1_SYNC_ENA,
2324 ARIZONA_FLL1_SYNC_ENA); 2414 ARIZONA_FLL1_SYNC_ENA);
2415 }
2416 arizona_set_fll_clks(fll, fll->base, true);
2325 regmap_update_bits_async(arizona->regmap, fll->base + 1, 2417 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2326 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA); 2418 ARIZONA_FLL1_ENA, ARIZONA_FLL1_ENA);
2327 2419
@@ -2354,19 +2446,24 @@ static int arizona_enable_fll(struct arizona_fll *fll)
2354static void arizona_disable_fll(struct arizona_fll *fll) 2446static void arizona_disable_fll(struct arizona_fll *fll)
2355{ 2447{
2356 struct arizona *arizona = fll->arizona; 2448 struct arizona *arizona = fll->arizona;
2357 bool change; 2449 bool ref_change, sync_change;
2358 2450
2359 regmap_update_bits_async(arizona->regmap, fll->base + 1, 2451 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2360 ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN); 2452 ARIZONA_FLL1_FREERUN, ARIZONA_FLL1_FREERUN);
2361 regmap_update_bits_check(arizona->regmap, fll->base + 1, 2453 regmap_update_bits_check(arizona->regmap, fll->base + 1,
2362 ARIZONA_FLL1_ENA, 0, &change); 2454 ARIZONA_FLL1_ENA, 0, &ref_change);
2363 regmap_update_bits(arizona->regmap, fll->base + 0x11, 2455 regmap_update_bits_check(arizona->regmap, fll->base + 0x11,
2364 ARIZONA_FLL1_SYNC_ENA, 0); 2456 ARIZONA_FLL1_SYNC_ENA, 0, &sync_change);
2365 regmap_update_bits_async(arizona->regmap, fll->base + 1, 2457 regmap_update_bits_async(arizona->regmap, fll->base + 1,
2366 ARIZONA_FLL1_FREERUN, 0); 2458 ARIZONA_FLL1_FREERUN, 0);
2367 2459
2368 if (change) 2460 if (sync_change)
2461 arizona_set_fll_clks(fll, fll->base + 0x10, false);
2462
2463 if (ref_change) {
2464 arizona_set_fll_clks(fll, fll->base, false);
2369 pm_runtime_put_autosuspend(arizona->dev); 2465 pm_runtime_put_autosuspend(arizona->dev);
2466 }
2370} 2467}
2371 2468
2372int arizona_set_fll_refclk(struct arizona_fll *fll, int source, 2469int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
@@ -2598,30 +2695,6 @@ int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol,
2598} 2695}
2599EXPORT_SYMBOL_GPL(arizona_lhpf_coeff_put); 2696EXPORT_SYMBOL_GPL(arizona_lhpf_coeff_put);
2600 2697
2601int arizona_register_notifier(struct snd_soc_codec *codec,
2602 struct notifier_block *nb,
2603 int (*notify)(struct notifier_block *nb,
2604 unsigned long action, void *data))
2605{
2606 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
2607 struct arizona *arizona = priv->arizona;
2608
2609 nb->notifier_call = notify;
2610
2611 return blocking_notifier_chain_register(&arizona->notifier, nb);
2612}
2613EXPORT_SYMBOL_GPL(arizona_register_notifier);
2614
2615int arizona_unregister_notifier(struct snd_soc_codec *codec,
2616 struct notifier_block *nb)
2617{
2618 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
2619 struct arizona *arizona = priv->arizona;
2620
2621 return blocking_notifier_chain_unregister(&arizona->notifier, nb);
2622}
2623EXPORT_SYMBOL_GPL(arizona_unregister_notifier);
2624
2625MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support"); 2698MODULE_DESCRIPTION("ASoC Wolfson Arizona class device support");
2626MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 2699MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
2627MODULE_LICENSE("GPL"); 2700MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h
index 850aa338ba29..56707860657c 100644
--- a/sound/soc/codecs/arizona.h
+++ b/sound/soc/codecs/arizona.h
@@ -14,6 +14,8 @@
14#define _ASOC_ARIZONA_H 14#define _ASOC_ARIZONA_H
15 15
16#include <linux/completion.h> 16#include <linux/completion.h>
17#include <linux/notifier.h>
18#include <linux/mfd/arizona/core.h>
17 19
18#include <sound/soc.h> 20#include <sound/soc.h>
19 21
@@ -66,7 +68,6 @@
66/* Notifier events */ 68/* Notifier events */
67#define ARIZONA_NOTIFY_VOICE_TRIGGER 0x1 69#define ARIZONA_NOTIFY_VOICE_TRIGGER 0x1
68 70
69struct arizona;
70struct wm_adsp; 71struct wm_adsp;
71 72
72struct arizona_dai_priv { 73struct arizona_dai_priv {
@@ -255,26 +256,24 @@ extern const struct soc_enum arizona_output_anc_src[];
255 256
256extern const struct snd_kcontrol_new arizona_voice_trigger_switch[]; 257extern const struct snd_kcontrol_new arizona_voice_trigger_switch[];
257 258
258extern int arizona_in_ev(struct snd_soc_dapm_widget *w, 259int arizona_in_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
259 struct snd_kcontrol *kcontrol, 260 int event);
260 int event); 261int arizona_out_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
261extern int arizona_out_ev(struct snd_soc_dapm_widget *w, 262 int event);
262 struct snd_kcontrol *kcontrol, 263int arizona_hp_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
263 int event); 264 int event);
264extern int arizona_hp_ev(struct snd_soc_dapm_widget *w, 265int arizona_anc_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
265 struct snd_kcontrol *kcontrol, 266 int event);
266 int event); 267
267extern int arizona_anc_ev(struct snd_soc_dapm_widget *w, 268int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol,
268 struct snd_kcontrol *kcontrol, 269 struct snd_ctl_elem_value *ucontrol);
269 int event); 270int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol,
270 271 struct snd_ctl_elem_value *ucontrol);
271extern int arizona_eq_coeff_put(struct snd_kcontrol *kcontrol, 272
272 struct snd_ctl_elem_value *ucontrol); 273int arizona_clk_ev(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol,
273extern int arizona_lhpf_coeff_put(struct snd_kcontrol *kcontrol, 274 int event);
274 struct snd_ctl_elem_value *ucontrol); 275int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id, int source,
275 276 unsigned int freq, int dir);
276extern int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
277 int source, unsigned int freq, int dir);
278 277
279extern const struct snd_soc_dai_ops arizona_dai_ops; 278extern const struct snd_soc_dai_ops arizona_dai_ops;
280extern const struct snd_soc_dai_ops arizona_simple_dai_ops; 279extern const struct snd_soc_dai_ops arizona_simple_dai_ops;
@@ -297,41 +296,57 @@ struct arizona_fll {
297 char clock_ok_name[ARIZONA_FLL_NAME_LEN]; 296 char clock_ok_name[ARIZONA_FLL_NAME_LEN];
298}; 297};
299 298
300extern int arizona_dvfs_up(struct snd_soc_codec *codec, unsigned int flags); 299int arizona_dvfs_up(struct snd_soc_codec *codec, unsigned int flags);
301extern int arizona_dvfs_down(struct snd_soc_codec *codec, unsigned int flags); 300int arizona_dvfs_down(struct snd_soc_codec *codec, unsigned int flags);
302extern int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w, 301int arizona_dvfs_sysclk_ev(struct snd_soc_dapm_widget *w,
303 struct snd_kcontrol *kcontrol, int event); 302 struct snd_kcontrol *kcontrol, int event);
304extern void arizona_init_dvfs(struct arizona_priv *priv); 303void arizona_init_dvfs(struct arizona_priv *priv);
305 304
306extern int arizona_init_fll(struct arizona *arizona, int id, int base, 305int arizona_init_fll(struct arizona *arizona, int id, int base,
307 int lock_irq, int ok_irq, struct arizona_fll *fll); 306 int lock_irq, int ok_irq, struct arizona_fll *fll);
308extern int arizona_set_fll_refclk(struct arizona_fll *fll, int source, 307int arizona_set_fll_refclk(struct arizona_fll *fll, int source,
309 unsigned int Fref, unsigned int Fout);
310extern int arizona_set_fll(struct arizona_fll *fll, int source,
311 unsigned int Fref, unsigned int Fout); 308 unsigned int Fref, unsigned int Fout);
309int arizona_set_fll(struct arizona_fll *fll, int source,
310 unsigned int Fref, unsigned int Fout);
312 311
313extern int arizona_init_spk(struct snd_soc_codec *codec); 312int arizona_init_spk(struct snd_soc_codec *codec);
314extern int arizona_init_gpio(struct snd_soc_codec *codec); 313int arizona_init_gpio(struct snd_soc_codec *codec);
315extern int arizona_init_mono(struct snd_soc_codec *codec); 314int arizona_init_mono(struct snd_soc_codec *codec);
316extern int arizona_init_notifiers(struct snd_soc_codec *codec); 315int arizona_init_notifiers(struct snd_soc_codec *codec);
317 316
318extern int arizona_free_spk(struct snd_soc_codec *codec); 317int arizona_init_spk_irqs(struct arizona *arizona);
318int arizona_free_spk_irqs(struct arizona *arizona);
319 319
320extern int arizona_init_dai(struct arizona_priv *priv, int dai); 320int arizona_init_dai(struct arizona_priv *priv, int dai);
321 321
322int arizona_set_output_mode(struct snd_soc_codec *codec, int output, 322int arizona_set_output_mode(struct snd_soc_codec *codec, int output,
323 bool diff); 323 bool diff);
324 324
325extern bool arizona_input_analog(struct snd_soc_codec *codec, int shift); 325bool arizona_input_analog(struct snd_soc_codec *codec, int shift);
326
327const char *arizona_sample_rate_val_to_name(unsigned int rate_val);
328
329static inline int arizona_register_notifier(struct snd_soc_codec *codec,
330 struct notifier_block *nb,
331 int (*notify)
332 (struct notifier_block *nb,
333 unsigned long action, void *data))
334{
335 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
336 struct arizona *arizona = priv->arizona;
337
338 nb->notifier_call = notify;
339
340 return blocking_notifier_chain_register(&arizona->notifier, nb);
341}
326 342
327extern const char *arizona_sample_rate_val_to_name(unsigned int rate_val); 343static inline int arizona_unregister_notifier(struct snd_soc_codec *codec,
344 struct notifier_block *nb)
345{
346 struct arizona_priv *priv = snd_soc_codec_get_drvdata(codec);
347 struct arizona *arizona = priv->arizona;
328 348
329extern int arizona_register_notifier(struct snd_soc_codec *codec, 349 return blocking_notifier_chain_unregister(&arizona->notifier, nb);
330 struct notifier_block *nb, 350}
331 int (*notify)(struct notifier_block *nb,
332 unsigned long action,
333 void *data));
334extern int arizona_unregister_notifier(struct snd_soc_codec *codec,
335 struct notifier_block *nb);
336 351
337#endif 352#endif
diff --git a/sound/soc/codecs/cs35l34.c b/sound/soc/codecs/cs35l34.c
new file mode 100644
index 000000000000..7c5d1510cf2c
--- /dev/null
+++ b/sound/soc/codecs/cs35l34.c
@@ -0,0 +1,1251 @@
1/*
2 * cs35l34.c -- CS35l34 ALSA SoC audio driver
3 *
4 * Copyright 2016 Cirrus Logic, Inc.
5 *
6 * Author: Paul Handrigan <Paul.Handrigan@cirrus.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#include <linux/module.h>
15#include <linux/moduleparam.h>
16#include <linux/kernel.h>
17#include <linux/init.h>
18#include <linux/delay.h>
19#include <linux/i2c.h>
20#include <linux/slab.h>
21#include <linux/workqueue.h>
22#include <linux/platform_device.h>
23#include <linux/regulator/consumer.h>
24#include <linux/regulator/machine.h>
25#include <linux/pm_runtime.h>
26#include <linux/of_device.h>
27#include <linux/of_gpio.h>
28#include <linux/of_irq.h>
29#include <sound/core.h>
30#include <sound/pcm.h>
31#include <sound/pcm_params.h>
32#include <sound/soc.h>
33#include <sound/soc-dapm.h>
34#include <linux/gpio.h>
35#include <linux/gpio/consumer.h>
36#include <sound/initval.h>
37#include <sound/tlv.h>
38#include <sound/cs35l34.h>
39
40#include "cs35l34.h"
41
42#define PDN_DONE_ATTEMPTS 10
43#define CS35L34_START_DELAY 50
44
45struct cs35l34_private {
46 struct snd_soc_codec *codec;
47 struct cs35l34_platform_data pdata;
48 struct regmap *regmap;
49 struct regulator_bulk_data core_supplies[2];
50 int num_core_supplies;
51 int mclk_int;
52 bool tdm_mode;
53 struct gpio_desc *reset_gpio; /* Active-low reset GPIO */
54};
55
56static const struct reg_default cs35l34_reg[] = {
57 {CS35L34_PWRCTL1, 0x01},
58 {CS35L34_PWRCTL2, 0x19},
59 {CS35L34_PWRCTL3, 0x01},
60 {CS35L34_ADSP_CLK_CTL, 0x08},
61 {CS35L34_MCLK_CTL, 0x11},
62 {CS35L34_AMP_INP_DRV_CTL, 0x01},
63 {CS35L34_AMP_DIG_VOL_CTL, 0x12},
64 {CS35L34_AMP_DIG_VOL, 0x00},
65 {CS35L34_AMP_ANLG_GAIN_CTL, 0x0F},
66 {CS35L34_PROTECT_CTL, 0x06},
67 {CS35L34_AMP_KEEP_ALIVE_CTL, 0x04},
68 {CS35L34_BST_CVTR_V_CTL, 0x00},
69 {CS35L34_BST_PEAK_I, 0x10},
70 {CS35L34_BST_RAMP_CTL, 0x87},
71 {CS35L34_BST_CONV_COEF_1, 0x24},
72 {CS35L34_BST_CONV_COEF_2, 0x24},
73 {CS35L34_BST_CONV_SLOPE_COMP, 0x4E},
74 {CS35L34_BST_CONV_SW_FREQ, 0x08},
75 {CS35L34_CLASS_H_CTL, 0x0D},
76 {CS35L34_CLASS_H_HEADRM_CTL, 0x0D},
77 {CS35L34_CLASS_H_RELEASE_RATE, 0x08},
78 {CS35L34_CLASS_H_FET_DRIVE_CTL, 0x41},
79 {CS35L34_CLASS_H_STATUS, 0x05},
80 {CS35L34_VPBR_CTL, 0x0A},
81 {CS35L34_VPBR_VOL_CTL, 0x90},
82 {CS35L34_VPBR_TIMING_CTL, 0x6A},
83 {CS35L34_PRED_MAX_ATTEN_SPK_LOAD, 0x95},
84 {CS35L34_PRED_BROWNOUT_THRESH, 0x1C},
85 {CS35L34_PRED_BROWNOUT_VOL_CTL, 0x00},
86 {CS35L34_PRED_BROWNOUT_RATE_CTL, 0x10},
87 {CS35L34_PRED_WAIT_CTL, 0x10},
88 {CS35L34_PRED_ZVP_INIT_IMP_CTL, 0x08},
89 {CS35L34_PRED_MAN_SAFE_VPI_CTL, 0x80},
90 {CS35L34_VPBR_ATTEN_STATUS, 0x00},
91 {CS35L34_PRED_BRWNOUT_ATT_STATUS, 0x00},
92 {CS35L34_SPKR_MON_CTL, 0xC6},
93 {CS35L34_ADSP_I2S_CTL, 0x00},
94 {CS35L34_ADSP_TDM_CTL, 0x00},
95 {CS35L34_TDM_TX_CTL_1_VMON, 0x00},
96 {CS35L34_TDM_TX_CTL_2_IMON, 0x04},
97 {CS35L34_TDM_TX_CTL_3_VPMON, 0x03},
98 {CS35L34_TDM_TX_CTL_4_VBSTMON, 0x07},
99 {CS35L34_TDM_TX_CTL_5_FLAG1, 0x08},
100 {CS35L34_TDM_TX_CTL_6_FLAG2, 0x09},
101 {CS35L34_TDM_TX_SLOT_EN_1, 0x00},
102 {CS35L34_TDM_TX_SLOT_EN_2, 0x00},
103 {CS35L34_TDM_TX_SLOT_EN_3, 0x00},
104 {CS35L34_TDM_TX_SLOT_EN_4, 0x00},
105 {CS35L34_TDM_RX_CTL_1_AUDIN, 0x40},
106 {CS35L34_TDM_RX_CTL_3_ALIVE, 0x04},
107 {CS35L34_MULT_DEV_SYNCH1, 0x00},
108 {CS35L34_MULT_DEV_SYNCH2, 0x80},
109 {CS35L34_PROT_RELEASE_CTL, 0x00},
110 {CS35L34_DIAG_MODE_REG_LOCK, 0x00},
111 {CS35L34_DIAG_MODE_CTL_1, 0x00},
112 {CS35L34_DIAG_MODE_CTL_2, 0x00},
113 {CS35L34_INT_MASK_1, 0xFF},
114 {CS35L34_INT_MASK_2, 0xFF},
115 {CS35L34_INT_MASK_3, 0xFF},
116 {CS35L34_INT_MASK_4, 0xFF},
117 {CS35L34_INT_STATUS_1, 0x30},
118 {CS35L34_INT_STATUS_2, 0x05},
119 {CS35L34_INT_STATUS_3, 0x00},
120 {CS35L34_INT_STATUS_4, 0x00},
121 {CS35L34_OTP_TRIM_STATUS, 0x00},
122};
123
124static bool cs35l34_volatile_register(struct device *dev, unsigned int reg)
125{
126 switch (reg) {
127 case CS35L34_DEVID_AB:
128 case CS35L34_DEVID_CD:
129 case CS35L34_DEVID_E:
130 case CS35L34_FAB_ID:
131 case CS35L34_REV_ID:
132 case CS35L34_INT_STATUS_1:
133 case CS35L34_INT_STATUS_2:
134 case CS35L34_INT_STATUS_3:
135 case CS35L34_INT_STATUS_4:
136 case CS35L34_CLASS_H_STATUS:
137 case CS35L34_VPBR_ATTEN_STATUS:
138 case CS35L34_OTP_TRIM_STATUS:
139 return true;
140 default:
141 return false;
142 }
143}
144
145static bool cs35l34_readable_register(struct device *dev, unsigned int reg)
146{
147 switch (reg) {
148 case CS35L34_DEVID_AB:
149 case CS35L34_DEVID_CD:
150 case CS35L34_DEVID_E:
151 case CS35L34_FAB_ID:
152 case CS35L34_REV_ID:
153 case CS35L34_PWRCTL1:
154 case CS35L34_PWRCTL2:
155 case CS35L34_PWRCTL3:
156 case CS35L34_ADSP_CLK_CTL:
157 case CS35L34_MCLK_CTL:
158 case CS35L34_AMP_INP_DRV_CTL:
159 case CS35L34_AMP_DIG_VOL_CTL:
160 case CS35L34_AMP_DIG_VOL:
161 case CS35L34_AMP_ANLG_GAIN_CTL:
162 case CS35L34_PROTECT_CTL:
163 case CS35L34_AMP_KEEP_ALIVE_CTL:
164 case CS35L34_BST_CVTR_V_CTL:
165 case CS35L34_BST_PEAK_I:
166 case CS35L34_BST_RAMP_CTL:
167 case CS35L34_BST_CONV_COEF_1:
168 case CS35L34_BST_CONV_COEF_2:
169 case CS35L34_BST_CONV_SLOPE_COMP:
170 case CS35L34_BST_CONV_SW_FREQ:
171 case CS35L34_CLASS_H_CTL:
172 case CS35L34_CLASS_H_HEADRM_CTL:
173 case CS35L34_CLASS_H_RELEASE_RATE:
174 case CS35L34_CLASS_H_FET_DRIVE_CTL:
175 case CS35L34_CLASS_H_STATUS:
176 case CS35L34_VPBR_CTL:
177 case CS35L34_VPBR_VOL_CTL:
178 case CS35L34_VPBR_TIMING_CTL:
179 case CS35L34_PRED_MAX_ATTEN_SPK_LOAD:
180 case CS35L34_PRED_BROWNOUT_THRESH:
181 case CS35L34_PRED_BROWNOUT_VOL_CTL:
182 case CS35L34_PRED_BROWNOUT_RATE_CTL:
183 case CS35L34_PRED_WAIT_CTL:
184 case CS35L34_PRED_ZVP_INIT_IMP_CTL:
185 case CS35L34_PRED_MAN_SAFE_VPI_CTL:
186 case CS35L34_VPBR_ATTEN_STATUS:
187 case CS35L34_PRED_BRWNOUT_ATT_STATUS:
188 case CS35L34_SPKR_MON_CTL:
189 case CS35L34_ADSP_I2S_CTL:
190 case CS35L34_ADSP_TDM_CTL:
191 case CS35L34_TDM_TX_CTL_1_VMON:
192 case CS35L34_TDM_TX_CTL_2_IMON:
193 case CS35L34_TDM_TX_CTL_3_VPMON:
194 case CS35L34_TDM_TX_CTL_4_VBSTMON:
195 case CS35L34_TDM_TX_CTL_5_FLAG1:
196 case CS35L34_TDM_TX_CTL_6_FLAG2:
197 case CS35L34_TDM_TX_SLOT_EN_1:
198 case CS35L34_TDM_TX_SLOT_EN_2:
199 case CS35L34_TDM_TX_SLOT_EN_3:
200 case CS35L34_TDM_TX_SLOT_EN_4:
201 case CS35L34_TDM_RX_CTL_1_AUDIN:
202 case CS35L34_TDM_RX_CTL_3_ALIVE:
203 case CS35L34_MULT_DEV_SYNCH1:
204 case CS35L34_MULT_DEV_SYNCH2:
205 case CS35L34_PROT_RELEASE_CTL:
206 case CS35L34_DIAG_MODE_REG_LOCK:
207 case CS35L34_DIAG_MODE_CTL_1:
208 case CS35L34_DIAG_MODE_CTL_2:
209 case CS35L34_INT_MASK_1:
210 case CS35L34_INT_MASK_2:
211 case CS35L34_INT_MASK_3:
212 case CS35L34_INT_MASK_4:
213 case CS35L34_INT_STATUS_1:
214 case CS35L34_INT_STATUS_2:
215 case CS35L34_INT_STATUS_3:
216 case CS35L34_INT_STATUS_4:
217 case CS35L34_OTP_TRIM_STATUS:
218 return true;
219 default:
220 return false;
221 }
222}
223
224static bool cs35l34_precious_register(struct device *dev, unsigned int reg)
225{
226 switch (reg) {
227 case CS35L34_INT_STATUS_1:
228 case CS35L34_INT_STATUS_2:
229 case CS35L34_INT_STATUS_3:
230 case CS35L34_INT_STATUS_4:
231 return true;
232 default:
233 return false;
234 }
235}
236
237static int cs35l34_sdin_event(struct snd_soc_dapm_widget *w,
238 struct snd_kcontrol *kcontrol, int event)
239{
240 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
241 struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec);
242 int ret;
243
244 switch (event) {
245 case SND_SOC_DAPM_PRE_PMU:
246 if (priv->tdm_mode)
247 regmap_update_bits(priv->regmap, CS35L34_PWRCTL3,
248 CS35L34_PDN_TDM, 0x00);
249
250 ret = regmap_update_bits(priv->regmap, CS35L34_PWRCTL1,
251 CS35L34_PDN_ALL, 0);
252 if (ret < 0) {
253 dev_err(codec->dev, "Cannot set Power bits %d\n", ret);
254 return ret;
255 }
256 usleep_range(5000, 5100);
257 break;
258 case SND_SOC_DAPM_POST_PMD:
259 if (priv->tdm_mode) {
260 regmap_update_bits(priv->regmap, CS35L34_PWRCTL3,
261 CS35L34_PDN_TDM, CS35L34_PDN_TDM);
262 }
263 ret = regmap_update_bits(priv->regmap, CS35L34_PWRCTL1,
264 CS35L34_PDN_ALL, CS35L34_PDN_ALL);
265 break;
266 default:
267 pr_err("Invalid event = 0x%x\n", event);
268 }
269 return 0;
270}
271
272static int cs35l34_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
273 unsigned int rx_mask, int slots, int slot_width)
274{
275 struct snd_soc_codec *codec = dai->codec;
276 struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec);
277 unsigned int reg, bit_pos;
278 int slot, slot_num;
279
280 if (slot_width != 8)
281 return -EINVAL;
282
283 priv->tdm_mode = true;
284 /* scan rx_mask for aud slot */
285 slot = ffs(rx_mask) - 1;
286 if (slot >= 0)
287 snd_soc_update_bits(codec, CS35L34_TDM_RX_CTL_1_AUDIN,
288 CS35L34_X_LOC, slot);
289
290 /* scan tx_mask: vmon(2 slots); imon (2 slots); vpmon (1 slot)
291 * vbstmon (1 slot)
292 */
293 slot = ffs(tx_mask) - 1;
294 slot_num = 0;
295
296 /* disable vpmon/vbstmon: enable later if set in tx_mask */
297 snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_3_VPMON,
298 CS35L34_X_STATE | CS35L34_X_LOC,
299 CS35L34_X_STATE | CS35L34_X_LOC);
300 snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_4_VBSTMON,
301 CS35L34_X_STATE | CS35L34_X_LOC,
302 CS35L34_X_STATE | CS35L34_X_LOC);
303
304 /* disconnect {vp,vbst}_mon routes: eanble later if set in tx_mask*/
305 while (slot >= 0) {
306 /* configure VMON_TX_LOC */
307 if (slot_num == 0)
308 snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_1_VMON,
309 CS35L34_X_STATE | CS35L34_X_LOC, slot);
310
311 /* configure IMON_TX_LOC */
312 if (slot_num == 4) {
313 snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_2_IMON,
314 CS35L34_X_STATE | CS35L34_X_LOC, slot);
315 }
316 /* configure VPMON_TX_LOC */
317 if (slot_num == 3) {
318 snd_soc_update_bits(codec, CS35L34_TDM_TX_CTL_3_VPMON,
319 CS35L34_X_STATE | CS35L34_X_LOC, slot);
320 }
321 /* configure VBSTMON_TX_LOC */
322 if (slot_num == 7) {
323 snd_soc_update_bits(codec,
324 CS35L34_TDM_TX_CTL_4_VBSTMON,
325 CS35L34_X_STATE | CS35L34_X_LOC, slot);
326 }
327
328 /* Enable the relevant tx slot */
329 reg = CS35L34_TDM_TX_SLOT_EN_4 - (slot/8);
330 bit_pos = slot - ((slot / 8) * (8));
331 snd_soc_update_bits(codec, reg,
332 1 << bit_pos, 1 << bit_pos);
333
334 tx_mask &= ~(1 << slot);
335 slot = ffs(tx_mask) - 1;
336 slot_num++;
337 }
338
339 return 0;
340}
341
342static int cs35l34_main_amp_event(struct snd_soc_dapm_widget *w,
343 struct snd_kcontrol *kcontrol, int event)
344{
345 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
346 struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec);
347
348 switch (event) {
349 case SND_SOC_DAPM_POST_PMU:
350 regmap_update_bits(priv->regmap, CS35L34_BST_CVTR_V_CTL,
351 CS35L34_BST_CVTL_MASK, priv->pdata.boost_vtge);
352 usleep_range(5000, 5100);
353 regmap_update_bits(priv->regmap, CS35L34_PROTECT_CTL,
354 CS35L34_MUTE, 0);
355 break;
356 case SND_SOC_DAPM_POST_PMD:
357 regmap_update_bits(priv->regmap, CS35L34_BST_CVTR_V_CTL,
358 CS35L34_BST_CVTL_MASK, 0);
359 regmap_update_bits(priv->regmap, CS35L34_PROTECT_CTL,
360 CS35L34_MUTE, CS35L34_MUTE);
361 usleep_range(5000, 5100);
362 break;
363 default:
364 pr_err("Invalid event = 0x%x\n", event);
365 }
366 return 0;
367}
368
369static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10200, 50, 0);
370
371static DECLARE_TLV_DB_SCALE(amp_gain_tlv, 300, 100, 0);
372
373
374static const struct snd_kcontrol_new cs35l34_snd_controls[] = {
375 SOC_SINGLE_SX_TLV("Digital Volume", CS35L34_AMP_DIG_VOL,
376 0, 0x34, 0xE4, dig_vol_tlv),
377 SOC_SINGLE_TLV("Amp Gain Volume", CS35L34_AMP_ANLG_GAIN_CTL,
378 0, 0xF, 0, amp_gain_tlv),
379};
380
381
382static int cs35l34_mclk_event(struct snd_soc_dapm_widget *w,
383 struct snd_kcontrol *kcontrol, int event)
384{
385 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
386 struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec);
387 int ret, i;
388 unsigned int reg;
389
390 switch (event) {
391 case SND_SOC_DAPM_PRE_PMD:
392 ret = regmap_read(priv->regmap, CS35L34_AMP_DIG_VOL_CTL,
393 &reg);
394 if (ret != 0) {
395 pr_err("%s regmap read failure %d\n", __func__, ret);
396 return ret;
397 }
398 if (reg & CS35L34_AMP_DIGSFT)
399 msleep(40);
400 else
401 usleep_range(2000, 2100);
402
403 for (i = 0; i < PDN_DONE_ATTEMPTS; i++) {
404 ret = regmap_read(priv->regmap, CS35L34_INT_STATUS_2,
405 &reg);
406 if (ret != 0) {
407 pr_err("%s regmap read failure %d\n",
408 __func__, ret);
409 return ret;
410 }
411 if (reg & CS35L34_PDN_DONE)
412 break;
413
414 usleep_range(5000, 5100);
415 }
416 if (i == PDN_DONE_ATTEMPTS)
417 pr_err("%s Device did not power down properly\n",
418 __func__);
419 break;
420 default:
421 pr_err("Invalid event = 0x%x\n", event);
422 break;
423 }
424 return 0;
425}
426
427static const struct snd_soc_dapm_widget cs35l34_dapm_widgets[] = {
428 SND_SOC_DAPM_AIF_IN_E("SDIN", NULL, 0, CS35L34_PWRCTL3,
429 1, 1, cs35l34_sdin_event,
430 SND_SOC_DAPM_PRE_PMU |
431 SND_SOC_DAPM_POST_PMD),
432 SND_SOC_DAPM_AIF_OUT("SDOUT", NULL, 0, CS35L34_PWRCTL3, 2, 1),
433
434 SND_SOC_DAPM_SUPPLY("EXTCLK", CS35L34_PWRCTL3, 7, 1,
435 cs35l34_mclk_event, SND_SOC_DAPM_PRE_PMD),
436
437 SND_SOC_DAPM_OUTPUT("SPK"),
438
439 SND_SOC_DAPM_INPUT("VP"),
440 SND_SOC_DAPM_INPUT("VPST"),
441 SND_SOC_DAPM_INPUT("ISENSE"),
442 SND_SOC_DAPM_INPUT("VSENSE"),
443
444 SND_SOC_DAPM_ADC("VMON ADC", NULL, CS35L34_PWRCTL2, 7, 1),
445 SND_SOC_DAPM_ADC("IMON ADC", NULL, CS35L34_PWRCTL2, 6, 1),
446 SND_SOC_DAPM_ADC("VPMON ADC", NULL, CS35L34_PWRCTL3, 3, 1),
447 SND_SOC_DAPM_ADC("VBSTMON ADC", NULL, CS35L34_PWRCTL3, 4, 1),
448 SND_SOC_DAPM_ADC("CLASS H", NULL, CS35L34_PWRCTL2, 5, 1),
449 SND_SOC_DAPM_ADC("BOOST", NULL, CS35L34_PWRCTL2, 2, 1),
450
451 SND_SOC_DAPM_OUT_DRV_E("Main AMP", CS35L34_PWRCTL2, 0, 1, NULL, 0,
452 cs35l34_main_amp_event, SND_SOC_DAPM_POST_PMU |
453 SND_SOC_DAPM_POST_PMD),
454};
455
456static const struct snd_soc_dapm_route cs35l34_audio_map[] = {
457 {"SDIN", NULL, "AMP Playback"},
458 {"BOOST", NULL, "SDIN"},
459 {"CLASS H", NULL, "BOOST"},
460 {"Main AMP", NULL, "CLASS H"},
461 {"SPK", NULL, "Main AMP"},
462
463 {"VPMON ADC", NULL, "CLASS H"},
464 {"VBSTMON ADC", NULL, "CLASS H"},
465 {"SPK", NULL, "VPMON ADC"},
466 {"SPK", NULL, "VBSTMON ADC"},
467
468 {"IMON ADC", NULL, "ISENSE"},
469 {"VMON ADC", NULL, "VSENSE"},
470 {"SDOUT", NULL, "IMON ADC"},
471 {"SDOUT", NULL, "VMON ADC"},
472 {"AMP Capture", NULL, "SDOUT"},
473
474 {"SDIN", NULL, "EXTCLK"},
475 {"SDOUT", NULL, "EXTCLK"},
476};
477
478struct cs35l34_mclk_div {
479 int mclk;
480 int srate;
481 u8 adsp_rate;
482};
483
484static struct cs35l34_mclk_div cs35l34_mclk_coeffs[] = {
485
486 /* MCLK, Sample Rate, adsp_rate */
487
488 {5644800, 11025, 0x1},
489 {5644800, 22050, 0x4},
490 {5644800, 44100, 0x7},
491
492 {6000000, 8000, 0x0},
493 {6000000, 11025, 0x1},
494 {6000000, 12000, 0x2},
495 {6000000, 16000, 0x3},
496 {6000000, 22050, 0x4},
497 {6000000, 24000, 0x5},
498 {6000000, 32000, 0x6},
499 {6000000, 44100, 0x7},
500 {6000000, 48000, 0x8},
501
502 {6144000, 8000, 0x0},
503 {6144000, 11025, 0x1},
504 {6144000, 12000, 0x2},
505 {6144000, 16000, 0x3},
506 {6144000, 22050, 0x4},
507 {6144000, 24000, 0x5},
508 {6144000, 32000, 0x6},
509 {6144000, 44100, 0x7},
510 {6144000, 48000, 0x8},
511};
512
513static int cs35l34_get_mclk_coeff(int mclk, int srate)
514{
515 int i;
516
517 for (i = 0; i < ARRAY_SIZE(cs35l34_mclk_coeffs); i++) {
518 if (cs35l34_mclk_coeffs[i].mclk == mclk &&
519 cs35l34_mclk_coeffs[i].srate == srate)
520 return i;
521 }
522 return -EINVAL;
523}
524
525static int cs35l34_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
526{
527 struct snd_soc_codec *codec = codec_dai->codec;
528 struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec);
529
530 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
531 case SND_SOC_DAIFMT_CBM_CFM:
532 regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL,
533 0x80, 0x80);
534 break;
535 case SND_SOC_DAIFMT_CBS_CFS:
536 regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL,
537 0x80, 0x00);
538 break;
539 default:
540 return -EINVAL;
541 }
542 return 0;
543}
544
545static int cs35l34_pcm_hw_params(struct snd_pcm_substream *substream,
546 struct snd_pcm_hw_params *params,
547 struct snd_soc_dai *dai)
548{
549 struct snd_soc_codec *codec = dai->codec;
550 struct cs35l34_private *priv = snd_soc_codec_get_drvdata(codec);
551 int srate = params_rate(params);
552 int ret;
553
554 int coeff = cs35l34_get_mclk_coeff(priv->mclk_int, srate);
555
556 if (coeff < 0) {
557 dev_err(codec->dev, "ERROR: Invalid mclk %d and/or srate %d\n",
558 priv->mclk_int, srate);
559 return coeff;
560 }
561
562 ret = regmap_update_bits(priv->regmap, CS35L34_ADSP_CLK_CTL,
563 CS35L34_ADSP_RATE, cs35l34_mclk_coeffs[coeff].adsp_rate);
564 if (ret != 0)
565 dev_err(codec->dev, "Failed to set clock state %d\n", ret);
566
567 return ret;
568}
569
570static unsigned int cs35l34_src_rates[] = {
571 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000
572};
573
574
575static struct snd_pcm_hw_constraint_list cs35l34_constraints = {
576 .count = ARRAY_SIZE(cs35l34_src_rates),
577 .list = cs35l34_src_rates,
578};
579
580static int cs35l34_pcm_startup(struct snd_pcm_substream *substream,
581 struct snd_soc_dai *dai)
582{
583
584 snd_pcm_hw_constraint_list(substream->runtime, 0,
585 SNDRV_PCM_HW_PARAM_RATE, &cs35l34_constraints);
586 return 0;
587}
588
589
590static int cs35l34_set_tristate(struct snd_soc_dai *dai, int tristate)
591{
592
593 struct snd_soc_codec *codec = dai->codec;
594
595 if (tristate)
596 snd_soc_update_bits(codec, CS35L34_PWRCTL3,
597 CS35L34_PDN_SDOUT, CS35L34_PDN_SDOUT);
598 else
599 snd_soc_update_bits(codec, CS35L34_PWRCTL3,
600 CS35L34_PDN_SDOUT, 0);
601 return 0;
602}
603
604static int cs35l34_dai_set_sysclk(struct snd_soc_dai *dai,
605 int clk_id, unsigned int freq, int dir)
606{
607 struct snd_soc_codec *codec = dai->codec;
608 struct cs35l34_private *cs35l34 = snd_soc_codec_get_drvdata(codec);
609 unsigned int value;
610
611 switch (freq) {
612 case CS35L34_MCLK_5644:
613 value = CS35L34_MCLK_RATE_5P6448;
614 cs35l34->mclk_int = freq;
615 break;
616 case CS35L34_MCLK_6:
617 value = CS35L34_MCLK_RATE_6P0000;
618 cs35l34->mclk_int = freq;
619 break;
620 case CS35L34_MCLK_6144:
621 value = CS35L34_MCLK_RATE_6P1440;
622 cs35l34->mclk_int = freq;
623 break;
624 case CS35L34_MCLK_11289:
625 value = CS35L34_MCLK_DIV | CS35L34_MCLK_RATE_5P6448;
626 cs35l34->mclk_int = freq / 2;
627 break;
628 case CS35L34_MCLK_12:
629 value = CS35L34_MCLK_DIV | CS35L34_MCLK_RATE_6P0000;
630 cs35l34->mclk_int = freq / 2;
631 break;
632 case CS35L34_MCLK_12288:
633 value = CS35L34_MCLK_DIV | CS35L34_MCLK_RATE_6P1440;
634 cs35l34->mclk_int = freq / 2;
635 break;
636 default:
637 dev_err(codec->dev, "ERROR: Invalid Frequency %d\n", freq);
638 cs35l34->mclk_int = 0;
639 return -EINVAL;
640 }
641 regmap_update_bits(cs35l34->regmap, CS35L34_MCLK_CTL,
642 CS35L34_MCLK_DIV | CS35L34_MCLK_RATE_MASK, value);
643 return 0;
644}
645
646static const struct snd_soc_dai_ops cs35l34_ops = {
647 .startup = cs35l34_pcm_startup,
648 .set_tristate = cs35l34_set_tristate,
649 .set_fmt = cs35l34_set_dai_fmt,
650 .hw_params = cs35l34_pcm_hw_params,
651 .set_sysclk = cs35l34_dai_set_sysclk,
652 .set_tdm_slot = cs35l34_set_tdm_slot,
653};
654
655static struct snd_soc_dai_driver cs35l34_dai = {
656 .name = "cs35l34",
657 .id = 0,
658 .playback = {
659 .stream_name = "AMP Playback",
660 .channels_min = 1,
661 .channels_max = 8,
662 .rates = CS35L34_RATES,
663 .formats = CS35L34_FORMATS,
664 },
665 .capture = {
666 .stream_name = "AMP Capture",
667 .channels_min = 1,
668 .channels_max = 8,
669 .rates = CS35L34_RATES,
670 .formats = CS35L34_FORMATS,
671 },
672 .ops = &cs35l34_ops,
673 .symmetric_rates = 1,
674};
675
676static int cs35l34_boost_inductor(struct cs35l34_private *cs35l34,
677 unsigned int inductor)
678{
679 struct snd_soc_codec *codec = cs35l34->codec;
680
681 switch (inductor) {
682 case 1000: /* 1 uH */
683 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x24);
684 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x24);
685 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP,
686 0x4E);
687 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 0);
688 break;
689 case 1200: /* 1.2 uH */
690 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x20);
691 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x20);
692 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP,
693 0x47);
694 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 1);
695 break;
696 case 1500: /* 1.5uH */
697 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x20);
698 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x20);
699 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP,
700 0x3C);
701 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 2);
702 break;
703 case 2200: /* 2.2uH */
704 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_1, 0x19);
705 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_COEF_2, 0x25);
706 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SLOPE_COMP,
707 0x23);
708 regmap_write(cs35l34->regmap, CS35L34_BST_CONV_SW_FREQ, 3);
709 break;
710 default:
711 dev_err(codec->dev, "%s Invalid Inductor Value %d uH\n",
712 __func__, inductor);
713 return -EINVAL;
714 }
715 return 0;
716}
717
718static int cs35l34_probe(struct snd_soc_codec *codec)
719{
720 int ret = 0;
721 struct cs35l34_private *cs35l34 = snd_soc_codec_get_drvdata(codec);
722
723 pm_runtime_get_sync(codec->dev);
724
725 /* Set over temperature warning attenuation to 6 dB */
726 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL,
727 CS35L34_OTW_ATTN_MASK, 0x8);
728
729 /* Set Power control registers 2 and 3 to have everything
730 * powered down at initialization
731 */
732 regmap_write(cs35l34->regmap, CS35L34_PWRCTL2, 0xFD);
733 regmap_write(cs35l34->regmap, CS35L34_PWRCTL3, 0x1F);
734
735 /* Set mute bit at startup */
736 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL,
737 CS35L34_MUTE, CS35L34_MUTE);
738
739 /* Set Platform Data */
740 if (cs35l34->pdata.boost_peak)
741 regmap_update_bits(cs35l34->regmap, CS35L34_BST_PEAK_I,
742 CS35L34_BST_PEAK_MASK,
743 cs35l34->pdata.boost_peak);
744
745 if (cs35l34->pdata.gain_zc_disable)
746 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL,
747 CS35L34_GAIN_ZC_MASK, 0);
748 else
749 regmap_update_bits(cs35l34->regmap, CS35L34_PROTECT_CTL,
750 CS35L34_GAIN_ZC_MASK, CS35L34_GAIN_ZC_MASK);
751
752 if (cs35l34->pdata.aif_half_drv)
753 regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_CLK_CTL,
754 CS35L34_ADSP_DRIVE, 0);
755
756 if (cs35l34->pdata.digsft_disable)
757 regmap_update_bits(cs35l34->regmap, CS35L34_AMP_DIG_VOL_CTL,
758 CS35L34_AMP_DIGSFT, 0);
759
760 if (cs35l34->pdata.amp_inv)
761 regmap_update_bits(cs35l34->regmap, CS35L34_AMP_DIG_VOL_CTL,
762 CS35L34_INV, CS35L34_INV);
763
764 if (cs35l34->pdata.boost_ind)
765 ret = cs35l34_boost_inductor(cs35l34, cs35l34->pdata.boost_ind);
766
767 if (cs35l34->pdata.i2s_sdinloc)
768 regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_I2S_CTL,
769 CS35L34_I2S_LOC_MASK,
770 cs35l34->pdata.i2s_sdinloc << CS35L34_I2S_LOC_SHIFT);
771
772 if (cs35l34->pdata.tdm_rising_edge)
773 regmap_update_bits(cs35l34->regmap, CS35L34_ADSP_TDM_CTL,
774 1, 1);
775
776 pm_runtime_put_sync(codec->dev);
777
778 return ret;
779}
780
781
782static struct snd_soc_codec_driver soc_codec_dev_cs35l34 = {
783 .probe = cs35l34_probe,
784
785 .component_driver = {
786 .dapm_widgets = cs35l34_dapm_widgets,
787 .num_dapm_widgets = ARRAY_SIZE(cs35l34_dapm_widgets),
788 .dapm_routes = cs35l34_audio_map,
789 .num_dapm_routes = ARRAY_SIZE(cs35l34_audio_map),
790 .controls = cs35l34_snd_controls,
791 .num_controls = ARRAY_SIZE(cs35l34_snd_controls),
792 },
793};
794
795static struct regmap_config cs35l34_regmap = {
796 .reg_bits = 8,
797 .val_bits = 8,
798
799 .max_register = CS35L34_MAX_REGISTER,
800 .reg_defaults = cs35l34_reg,
801 .num_reg_defaults = ARRAY_SIZE(cs35l34_reg),
802 .volatile_reg = cs35l34_volatile_register,
803 .readable_reg = cs35l34_readable_register,
804 .precious_reg = cs35l34_precious_register,
805 .cache_type = REGCACHE_RBTREE,
806};
807
808static int cs35l34_handle_of_data(struct i2c_client *i2c_client,
809 struct cs35l34_platform_data *pdata)
810{
811 struct device_node *np = i2c_client->dev.of_node;
812 unsigned int val;
813
814 if (of_property_read_u32(np, "cirrus,boost-vtge-millivolt",
815 &val) >= 0) {
816 /* Boost Voltage has a maximum of 8V */
817 if (val > 8000 || (val < 3300 && val > 0)) {
818 dev_err(&i2c_client->dev,
819 "Invalid Boost Voltage %d mV\n", val);
820 return -EINVAL;
821 }
822 if (val == 0)
823 pdata->boost_vtge = 0; /* Use VP */
824 else
825 pdata->boost_vtge = ((val - 3300)/100) + 1;
826 } else {
827 dev_warn(&i2c_client->dev,
828 "Boost Voltage not specified. Using VP\n");
829 }
830
831 if (of_property_read_u32(np, "cirrus,boost-ind-nanohenry", &val) >= 0) {
832 pdata->boost_ind = val;
833 } else {
834 dev_err(&i2c_client->dev, "Inductor not specified.\n");
835 return -EINVAL;
836 }
837
838 if (of_property_read_u32(np, "cirrus,boost-peak-milliamp", &val) >= 0) {
839 if (val > 3840 || val < 1200) {
840 dev_err(&i2c_client->dev,
841 "Invalid Boost Peak Current %d mA\n", val);
842 return -EINVAL;
843 }
844 pdata->boost_peak = ((val - 1200)/80) + 1;
845 }
846
847 pdata->aif_half_drv = of_property_read_bool(np,
848 "cirrus,aif-half-drv");
849 pdata->digsft_disable = of_property_read_bool(np,
850 "cirrus,digsft-disable");
851
852 pdata->gain_zc_disable = of_property_read_bool(np,
853 "cirrus,gain-zc-disable");
854 pdata->amp_inv = of_property_read_bool(np, "cirrus,amp-inv");
855
856 if (of_property_read_u32(np, "cirrus,i2s-sdinloc", &val) >= 0)
857 pdata->i2s_sdinloc = val;
858 if (of_property_read_u32(np, "cirrus,tdm-rising-edge", &val) >= 0)
859 pdata->tdm_rising_edge = val;
860
861 return 0;
862}
863
864static irqreturn_t cs35l34_irq_thread(int irq, void *data)
865{
866 struct cs35l34_private *cs35l34 = data;
867 struct snd_soc_codec *codec = cs35l34->codec;
868 unsigned int sticky1, sticky2, sticky3, sticky4;
869 unsigned int mask1, mask2, mask3, mask4, current1;
870
871
872 /* ack the irq by reading all status registers */
873 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_4, &sticky4);
874 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_3, &sticky3);
875 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_2, &sticky2);
876 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_1, &sticky1);
877
878 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_4, &mask4);
879 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_3, &mask3);
880 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_2, &mask2);
881 regmap_read(cs35l34->regmap, CS35L34_INT_MASK_1, &mask1);
882
883 if (!(sticky1 & ~mask1) && !(sticky2 & ~mask2) && !(sticky3 & ~mask3)
884 && !(sticky4 & ~mask4))
885 return IRQ_NONE;
886
887 regmap_read(cs35l34->regmap, CS35L34_INT_STATUS_1, &current1);
888
889 if (sticky1 & CS35L34_CAL_ERR) {
890 dev_err(codec->dev, "Cal error\n");
891
892 /* error is no longer asserted; safe to reset */
893 if (!(current1 & CS35L34_CAL_ERR)) {
894 dev_dbg(codec->dev, "Cal error release\n");
895 regmap_update_bits(cs35l34->regmap,
896 CS35L34_PROT_RELEASE_CTL,
897 CS35L34_CAL_ERR_RLS, 0);
898 regmap_update_bits(cs35l34->regmap,
899 CS35L34_PROT_RELEASE_CTL,
900 CS35L34_CAL_ERR_RLS,
901 CS35L34_CAL_ERR_RLS);
902 regmap_update_bits(cs35l34->regmap,
903 CS35L34_PROT_RELEASE_CTL,
904 CS35L34_CAL_ERR_RLS, 0);
905 /* note: amp will re-calibrate on next resume */
906 }
907 }
908
909 if (sticky1 & CS35L34_ALIVE_ERR)
910 dev_err(codec->dev, "Alive error\n");
911
912 if (sticky1 & CS35L34_AMP_SHORT) {
913 dev_crit(codec->dev, "Amp short error\n");
914
915 /* error is no longer asserted; safe to reset */
916 if (!(current1 & CS35L34_AMP_SHORT)) {
917 dev_dbg(codec->dev,
918 "Amp short error release\n");
919 regmap_update_bits(cs35l34->regmap,
920 CS35L34_PROT_RELEASE_CTL,
921 CS35L34_SHORT_RLS, 0);
922 regmap_update_bits(cs35l34->regmap,
923 CS35L34_PROT_RELEASE_CTL,
924 CS35L34_SHORT_RLS,
925 CS35L34_SHORT_RLS);
926 regmap_update_bits(cs35l34->regmap,
927 CS35L34_PROT_RELEASE_CTL,
928 CS35L34_SHORT_RLS, 0);
929 }
930 }
931
932 if (sticky1 & CS35L34_OTW) {
933 dev_crit(codec->dev, "Over temperature warning\n");
934
935 /* error is no longer asserted; safe to reset */
936 if (!(current1 & CS35L34_OTW)) {
937 dev_dbg(codec->dev,
938 "Over temperature warning release\n");
939 regmap_update_bits(cs35l34->regmap,
940 CS35L34_PROT_RELEASE_CTL,
941 CS35L34_OTW_RLS, 0);
942 regmap_update_bits(cs35l34->regmap,
943 CS35L34_PROT_RELEASE_CTL,
944 CS35L34_OTW_RLS,
945 CS35L34_OTW_RLS);
946 regmap_update_bits(cs35l34->regmap,
947 CS35L34_PROT_RELEASE_CTL,
948 CS35L34_OTW_RLS, 0);
949 }
950 }
951
952 if (sticky1 & CS35L34_OTE) {
953 dev_crit(codec->dev, "Over temperature error\n");
954
955 /* error is no longer asserted; safe to reset */
956 if (!(current1 & CS35L34_OTE)) {
957 dev_dbg(codec->dev,
958 "Over temperature error release\n");
959 regmap_update_bits(cs35l34->regmap,
960 CS35L34_PROT_RELEASE_CTL,
961 CS35L34_OTE_RLS, 0);
962 regmap_update_bits(cs35l34->regmap,
963 CS35L34_PROT_RELEASE_CTL,
964 CS35L34_OTE_RLS,
965 CS35L34_OTE_RLS);
966 regmap_update_bits(cs35l34->regmap,
967 CS35L34_PROT_RELEASE_CTL,
968 CS35L34_OTE_RLS, 0);
969 }
970 }
971
972 if (sticky3 & CS35L34_BST_HIGH) {
973 dev_crit(codec->dev, "VBST too high error; powering off!\n");
974 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL2,
975 CS35L34_PDN_AMP, CS35L34_PDN_AMP);
976 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL1,
977 CS35L34_PDN_ALL, CS35L34_PDN_ALL);
978 }
979
980 if (sticky3 & CS35L34_LBST_SHORT) {
981 dev_crit(codec->dev, "LBST short error; powering off!\n");
982 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL2,
983 CS35L34_PDN_AMP, CS35L34_PDN_AMP);
984 regmap_update_bits(cs35l34->regmap, CS35L34_PWRCTL1,
985 CS35L34_PDN_ALL, CS35L34_PDN_ALL);
986 }
987
988 return IRQ_HANDLED;
989}
990
991static const char * const cs35l34_core_supplies[] = {
992 "VA",
993 "VP",
994};
995
996static int cs35l34_i2c_probe(struct i2c_client *i2c_client,
997 const struct i2c_device_id *id)
998{
999 struct cs35l34_private *cs35l34;
1000 struct cs35l34_platform_data *pdata =
1001 dev_get_platdata(&i2c_client->dev);
1002 int i;
1003 int ret;
1004 unsigned int devid = 0;
1005 unsigned int reg;
1006
1007 cs35l34 = devm_kzalloc(&i2c_client->dev,
1008 sizeof(struct cs35l34_private),
1009 GFP_KERNEL);
1010 if (!cs35l34) {
1011 dev_err(&i2c_client->dev, "could not allocate codec\n");
1012 return -ENOMEM;
1013 }
1014
1015 i2c_set_clientdata(i2c_client, cs35l34);
1016 cs35l34->regmap = devm_regmap_init_i2c(i2c_client, &cs35l34_regmap);
1017 if (IS_ERR(cs35l34->regmap)) {
1018 ret = PTR_ERR(cs35l34->regmap);
1019 dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret);
1020 return ret;
1021 }
1022
1023 cs35l34->num_core_supplies = ARRAY_SIZE(cs35l34_core_supplies);
1024 for (i = 0; i < ARRAY_SIZE(cs35l34_core_supplies); i++)
1025 cs35l34->core_supplies[i].supply = cs35l34_core_supplies[i];
1026
1027 ret = devm_regulator_bulk_get(&i2c_client->dev,
1028 cs35l34->num_core_supplies,
1029 cs35l34->core_supplies);
1030 if (ret != 0) {
1031 dev_err(&i2c_client->dev,
1032 "Failed to request core supplies %d\n", ret);
1033 return ret;
1034 }
1035
1036 ret = regulator_bulk_enable(cs35l34->num_core_supplies,
1037 cs35l34->core_supplies);
1038 if (ret != 0) {
1039 dev_err(&i2c_client->dev,
1040 "Failed to enable core supplies: %d\n", ret);
1041 return ret;
1042 }
1043
1044 if (pdata) {
1045 cs35l34->pdata = *pdata;
1046 } else {
1047 pdata = devm_kzalloc(&i2c_client->dev,
1048 sizeof(struct cs35l34_platform_data),
1049 GFP_KERNEL);
1050 if (!pdata) {
1051 dev_err(&i2c_client->dev,
1052 "could not allocate pdata\n");
1053 return -ENOMEM;
1054 }
1055 if (i2c_client->dev.of_node) {
1056 ret = cs35l34_handle_of_data(i2c_client, pdata);
1057 if (ret != 0)
1058 return ret;
1059
1060 }
1061 cs35l34->pdata = *pdata;
1062 }
1063
1064 ret = devm_request_threaded_irq(&i2c_client->dev, i2c_client->irq, NULL,
1065 cs35l34_irq_thread, IRQF_ONESHOT | IRQF_TRIGGER_LOW,
1066 "cs35l34", cs35l34);
1067 if (ret != 0)
1068 dev_err(&i2c_client->dev, "Failed to request IRQ: %d\n", ret);
1069
1070 cs35l34->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
1071 "reset-gpios", GPIOD_OUT_LOW);
1072 if (IS_ERR(cs35l34->reset_gpio))
1073 return PTR_ERR(cs35l34->reset_gpio);
1074
1075 gpiod_set_value_cansleep(cs35l34->reset_gpio, 1);
1076
1077 msleep(CS35L34_START_DELAY);
1078
1079 ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_AB, &reg);
1080
1081 devid = (reg & 0xFF) << 12;
1082 ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_CD, &reg);
1083 devid |= (reg & 0xFF) << 4;
1084 ret = regmap_read(cs35l34->regmap, CS35L34_DEVID_E, &reg);
1085 devid |= (reg & 0xF0) >> 4;
1086
1087 if (devid != CS35L34_CHIP_ID) {
1088 dev_err(&i2c_client->dev,
1089 "CS35l34 Device ID (%X). Expected ID %X\n",
1090 devid, CS35L34_CHIP_ID);
1091 ret = -ENODEV;
1092 goto err_regulator;
1093 }
1094
1095 ret = regmap_read(cs35l34->regmap, CS35L34_REV_ID, &reg);
1096 if (ret < 0) {
1097 dev_err(&i2c_client->dev, "Get Revision ID failed\n");
1098 goto err_regulator;
1099 }
1100
1101 dev_info(&i2c_client->dev,
1102 "Cirrus Logic CS35l34 (%x), Revision: %02X\n", devid,
1103 reg & 0xFF);
1104
1105 /* Unmask critical interrupts */
1106 regmap_update_bits(cs35l34->regmap, CS35L34_INT_MASK_1,
1107 CS35L34_M_CAL_ERR | CS35L34_M_ALIVE_ERR |
1108 CS35L34_M_AMP_SHORT | CS35L34_M_OTW |
1109 CS35L34_M_OTE, 0);
1110 regmap_update_bits(cs35l34->regmap, CS35L34_INT_MASK_3,
1111 CS35L34_M_BST_HIGH | CS35L34_M_LBST_SHORT, 0);
1112
1113 pm_runtime_set_autosuspend_delay(&i2c_client->dev, 100);
1114 pm_runtime_use_autosuspend(&i2c_client->dev);
1115 pm_runtime_set_active(&i2c_client->dev);
1116 pm_runtime_enable(&i2c_client->dev);
1117
1118 ret = snd_soc_register_codec(&i2c_client->dev,
1119 &soc_codec_dev_cs35l34, &cs35l34_dai, 1);
1120 if (ret < 0) {
1121 dev_err(&i2c_client->dev,
1122 "%s: Register codec failed\n", __func__);
1123 goto err_regulator;
1124 }
1125
1126 return 0;
1127
1128err_regulator:
1129 regulator_bulk_disable(cs35l34->num_core_supplies,
1130 cs35l34->core_supplies);
1131
1132 return ret;
1133}
1134
1135static int cs35l34_i2c_remove(struct i2c_client *client)
1136{
1137 struct cs35l34_private *cs35l34 = i2c_get_clientdata(client);
1138
1139 snd_soc_unregister_codec(&client->dev);
1140
1141 if (cs35l34->reset_gpio)
1142 gpiod_set_value_cansleep(cs35l34->reset_gpio, 0);
1143
1144 pm_runtime_disable(&client->dev);
1145 regulator_bulk_disable(cs35l34->num_core_supplies,
1146 cs35l34->core_supplies);
1147
1148 return 0;
1149}
1150
1151static int __maybe_unused cs35l34_runtime_resume(struct device *dev)
1152{
1153 struct cs35l34_private *cs35l34 = dev_get_drvdata(dev);
1154 int ret;
1155
1156 ret = regulator_bulk_enable(cs35l34->num_core_supplies,
1157 cs35l34->core_supplies);
1158
1159 if (ret != 0) {
1160 dev_err(dev, "Failed to enable core supplies: %d\n",
1161 ret);
1162 return ret;
1163 }
1164
1165 regcache_cache_only(cs35l34->regmap, false);
1166
1167 gpiod_set_value_cansleep(cs35l34->reset_gpio, 1);
1168 msleep(CS35L34_START_DELAY);
1169
1170 ret = regcache_sync(cs35l34->regmap);
1171 if (ret != 0) {
1172 dev_err(dev, "Failed to restore register cache\n");
1173 goto err;
1174 }
1175 return 0;
1176err:
1177 regcache_cache_only(cs35l34->regmap, true);
1178 regulator_bulk_disable(cs35l34->num_core_supplies,
1179 cs35l34->core_supplies);
1180
1181 return ret;
1182}
1183
1184static int __maybe_unused cs35l34_runtime_suspend(struct device *dev)
1185{
1186 struct cs35l34_private *cs35l34 = dev_get_drvdata(dev);
1187
1188 regcache_cache_only(cs35l34->regmap, true);
1189 regcache_mark_dirty(cs35l34->regmap);
1190
1191 gpiod_set_value_cansleep(cs35l34->reset_gpio, 0);
1192
1193 regulator_bulk_disable(cs35l34->num_core_supplies,
1194 cs35l34->core_supplies);
1195
1196 return 0;
1197}
1198
1199static const struct dev_pm_ops cs35l34_pm_ops = {
1200 SET_RUNTIME_PM_OPS(cs35l34_runtime_suspend,
1201 cs35l34_runtime_resume,
1202 NULL)
1203};
1204
1205static const struct of_device_id cs35l34_of_match[] = {
1206 {.compatible = "cirrus,cs35l34"},
1207 {},
1208};
1209MODULE_DEVICE_TABLE(of, cs35l34_of_match);
1210
1211static const struct i2c_device_id cs35l34_id[] = {
1212 {"cs35l34", 0},
1213 {}
1214};
1215MODULE_DEVICE_TABLE(i2c, cs35l34_id);
1216
1217static struct i2c_driver cs35l34_i2c_driver = {
1218 .driver = {
1219 .name = "cs35l34",
1220 .pm = &cs35l34_pm_ops,
1221 .of_match_table = cs35l34_of_match,
1222
1223 },
1224 .id_table = cs35l34_id,
1225 .probe = cs35l34_i2c_probe,
1226 .remove = cs35l34_i2c_remove,
1227
1228};
1229
1230static int __init cs35l34_modinit(void)
1231{
1232 int ret;
1233
1234 ret = i2c_add_driver(&cs35l34_i2c_driver);
1235 if (ret != 0) {
1236 pr_err("Failed to register CS35l34 I2C driver: %d\n", ret);
1237 return ret;
1238 }
1239 return 0;
1240}
1241module_init(cs35l34_modinit);
1242
1243static void __exit cs35l34_exit(void)
1244{
1245 i2c_del_driver(&cs35l34_i2c_driver);
1246}
1247module_exit(cs35l34_exit);
1248
1249MODULE_DESCRIPTION("ASoC CS35l34 driver");
1250MODULE_AUTHOR("Paul Handrigan, Cirrus Logic Inc, <Paul.Handrigan@cirrus.com>");
1251MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/cs35l34.h b/sound/soc/codecs/cs35l34.h
new file mode 100644
index 000000000000..bcd54f127559
--- /dev/null
+++ b/sound/soc/codecs/cs35l34.h
@@ -0,0 +1,269 @@
1/*
2 * cs35l34.h -- CS35L34 ALSA SoC audio driver
3 *
4 * Copyright 2016 Cirrus Logic, Inc.
5 *
6 * Author: Paul Handrigan <Paul.Handrigan@cirrus.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 *
12 */
13
14#ifndef __CS35L34_H__
15#define __CS35L34_H__
16
17#define CS35L34_CHIP_ID 0x00035A34
18#define CS35L34_DEVID_AB 0x01 /* Device ID A & B [RO] */
19#define CS35L34_DEVID_CD 0x02 /* Device ID C & D [RO] */
20#define CS35L34_DEVID_E 0x03 /* Device ID E [RO] */
21#define CS35L34_FAB_ID 0x04 /* Fab ID [RO] */
22#define CS35L34_REV_ID 0x05 /* Revision ID [RO] */
23#define CS35L34_PWRCTL1 0x06 /* Power Ctl 1 */
24#define CS35L34_PWRCTL2 0x07 /* Power Ctl 2 */
25#define CS35L34_PWRCTL3 0x08 /* Power Ctl 3 */
26#define CS35L34_ADSP_CLK_CTL 0x0A /* (ADSP) Clock Ctl */
27#define CS35L34_MCLK_CTL 0x0B /* Master Clocking Ctl */
28#define CS35L34_AMP_INP_DRV_CTL 0x14 /* Amp Input Drive Ctl */
29#define CS35L34_AMP_DIG_VOL_CTL 0x15 /* Amplifier Dig Volume Ctl */
30#define CS35L34_AMP_DIG_VOL 0x16 /* Amplifier Dig Volume */
31#define CS35L34_AMP_ANLG_GAIN_CTL 0x17 /* Amplifier Analog Gain Ctl */
32#define CS35L34_PROTECT_CTL 0x18 /* Amp Gain - Prot Ctl Param */
33#define CS35L34_AMP_KEEP_ALIVE_CTL 0x1A /* Amplifier Keep Alive Ctl */
34#define CS35L34_BST_CVTR_V_CTL 0x1D /* Boost Conv Voltage Ctl */
35#define CS35L34_BST_PEAK_I 0x1E /* Boost Conv Peak Current */
36#define CS35L34_BST_RAMP_CTL 0x20 /* Boost Conv Soft Ramp Ctl */
37#define CS35L34_BST_CONV_COEF_1 0x21 /* Boost Conv Coefficients 1 */
38#define CS35L34_BST_CONV_COEF_2 0x22 /* Boost Conv Coefficients 2 */
39#define CS35L34_BST_CONV_SLOPE_COMP 0x23 /* Boost Conv Slope Comp */
40#define CS35L34_BST_CONV_SW_FREQ 0x24 /* Boost Conv L BST SW Freq */
41#define CS35L34_CLASS_H_CTL 0x30 /* CLS H Control */
42#define CS35L34_CLASS_H_HEADRM_CTL 0x31 /* CLS H Headroom Ctl */
43#define CS35L34_CLASS_H_RELEASE_RATE 0x32 /* CLS H Release Rate */
44#define CS35L34_CLASS_H_FET_DRIVE_CTL 0x33 /* CLS H Weak FET Drive Ctl */
45#define CS35L34_CLASS_H_STATUS 0x38 /* CLS H Status */
46#define CS35L34_VPBR_CTL 0x3A /* VPBR Ctl */
47#define CS35L34_VPBR_VOL_CTL 0x3B /* VPBR Volume Ctl */
48#define CS35L34_VPBR_TIMING_CTL 0x3C /* VPBR Timing Ctl */
49#define CS35L34_PRED_MAX_ATTEN_SPK_LOAD 0x40 /* PRD Max Atten / Spkr Load */
50#define CS35L34_PRED_BROWNOUT_THRESH 0x41 /* PRD Brownout Threshold */
51#define CS35L34_PRED_BROWNOUT_VOL_CTL 0x42 /* PRD Brownout Volume Ctl */
52#define CS35L34_PRED_BROWNOUT_RATE_CTL 0x43 /* PRD Brownout Rate Ctl */
53#define CS35L34_PRED_WAIT_CTL 0x44 /* PRD Wait Ctl */
54#define CS35L34_PRED_ZVP_INIT_IMP_CTL 0x46 /* PRD ZVP Initial Imp Ctl */
55#define CS35L34_PRED_MAN_SAFE_VPI_CTL 0x47 /* PRD Manual Safe VPI Ctl */
56#define CS35L34_VPBR_ATTEN_STATUS 0x4B /* VPBR Attenuation Status */
57#define CS35L34_PRED_BRWNOUT_ATT_STATUS 0x4C /* PRD Brownout Atten Status */
58#define CS35L34_SPKR_MON_CTL 0x4E /* Speaker Monitoring Ctl */
59#define CS35L34_ADSP_I2S_CTL 0x50 /* ADSP I2S Ctl */
60#define CS35L34_ADSP_TDM_CTL 0x51 /* ADSP TDM Ctl */
61#define CS35L34_TDM_TX_CTL_1_VMON 0x52 /* TDM TX Ctl 1 (VMON) */
62#define CS35L34_TDM_TX_CTL_2_IMON 0x53 /* TDM TX Ctl 2 (IMON) */
63#define CS35L34_TDM_TX_CTL_3_VPMON 0x54 /* TDM TX Ctl 3 (VPMON) */
64#define CS35L34_TDM_TX_CTL_4_VBSTMON 0x55 /* TDM TX Ctl 4 (VBSTMON) */
65#define CS35L34_TDM_TX_CTL_5_FLAG1 0x56 /* TDM TX Ctl 5 (FLAG1) */
66#define CS35L34_TDM_TX_CTL_6_FLAG2 0x57 /* TDM TX Ctl 6 (FLAG2) */
67#define CS35L34_TDM_TX_SLOT_EN_1 0x5A /* TDM TX Slot Enable */
68#define CS35L34_TDM_TX_SLOT_EN_2 0x5B /* TDM TX Slot Enable */
69#define CS35L34_TDM_TX_SLOT_EN_3 0x5C /* TDM TX Slot Enable */
70#define CS35L34_TDM_TX_SLOT_EN_4 0x5D /* TDM TX Slot Enable */
71#define CS35L34_TDM_RX_CTL_1_AUDIN 0x5E /* TDM RX Ctl 1 */
72#define CS35L34_TDM_RX_CTL_3_ALIVE 0x60 /* TDM RX Ctl 3 (ALIVE) */
73#define CS35L34_MULT_DEV_SYNCH1 0x62 /* Multidevice Synch */
74#define CS35L34_MULT_DEV_SYNCH2 0x63 /* Multidevice Synch 2 */
75#define CS35L34_PROT_RELEASE_CTL 0x64 /* Protection Release Ctl */
76#define CS35L34_DIAG_MODE_REG_LOCK 0x68 /* Diagnostic Mode Reg Lock */
77#define CS35L34_DIAG_MODE_CTL_1 0x69 /* Diagnostic Mode Ctl 1 */
78#define CS35L34_DIAG_MODE_CTL_2 0x6A /* Diagnostic Mode Ctl 2 */
79#define CS35L34_INT_MASK_1 0x70 /* Interrupt Mask 1 */
80#define CS35L34_INT_MASK_2 0x71 /* Interrupt Mask 2 */
81#define CS35L34_INT_MASK_3 0x72 /* Interrupt Mask 3 */
82#define CS35L34_INT_MASK_4 0x73 /* Interrupt Mask 4 */
83#define CS35L34_INT_STATUS_1 0x74 /* Interrupt Status 1 */
84#define CS35L34_INT_STATUS_2 0x75 /* Interrupt Status 2 */
85#define CS35L34_INT_STATUS_3 0x76 /* Interrupt Status 3 */
86#define CS35L34_INT_STATUS_4 0x77 /* Interrupt Status 4 */
87#define CS35L34_OTP_TRIM_STATUS 0x7E /* OTP Trim Status */
88
89#define CS35L34_MAX_REGISTER 0x7F
90#define CS35L34_REGISTER_COUNT 0x4E
91
92#define CS35L34_MCLK_5644 5644800
93#define CS35L34_MCLK_6144 6144000
94#define CS35L34_MCLK_6 6000000
95#define CS35L34_MCLK_11289 11289600
96#define CS35L34_MCLK_12 12000000
97#define CS35L34_MCLK_12288 12288000
98
99/* CS35L34_PWRCTL1 */
100#define CS35L34_SFT_RST (1 << 7)
101#define CS35L34_DISCHG_FLT (1 << 1)
102#define CS35L34_PDN_ALL 1
103
104/* CS35L34_PWRCTL2 */
105#define CS35L34_PDN_VMON (1 << 7)
106#define CS35L34_PDN_IMON (1 << 6)
107#define CS35L34_PDN_CLASSH (1 << 5)
108#define CS35L34_PDN_VPBR (1 << 4)
109#define CS35L34_PDN_PRED (1 << 3)
110#define CS35L34_PDN_BST (1 << 2)
111#define CS35L34_PDN_AMP 1
112
113/* CS35L34_PWRCTL3 */
114#define CS35L34_MCLK_DIS (1 << 7)
115#define CS35L34_PDN_VBSTMON_OUT (1 << 4)
116#define CS35L34_PDN_VMON_OUT (1 << 3)
117/* Tristate the ADSP SDOUT when in I2C mode */
118#define CS35L34_PDN_SDOUT (1 << 2)
119#define CS35L34_PDN_SDIN (1 << 1)
120#define CS35L34_PDN_TDM 1
121
122/* CS35L34_ADSP_CLK_CTL */
123#define CS35L34_ADSP_RATE 0xF
124#define CS35L34_ADSP_DRIVE (1 << 4)
125#define CS35L34_ADSP_M_S (1 << 7)
126
127/* CS35L34_MCLK_CTL */
128#define CS35L34_MCLK_DIV (1 << 4)
129#define CS35L34_MCLK_RATE_MASK 0x7
130#define CS35L34_MCLK_RATE_6P1440 0x2
131#define CS35L34_MCLK_RATE_6P0000 0x1
132#define CS35L34_MCLK_RATE_5P6448 0x0
133#define CS35L34_MCLKDIS (1 << 7)
134#define CS35L34_MCLKDIV2 (1 << 6)
135#define CS35L34_SDOUT_3ST_TDM (1 << 5)
136#define CS35L34_INT_FS_RATE (1 << 4)
137#define CS35L34_ADSP_FS 0xF
138
139/* CS35L34_AMP_INP_DRV_CTL */
140#define CS35L34_DRV_STR_SRC (1 << 1)
141#define CS35L34_DRV_STR 1
142
143/* CS35L34_AMP_DIG_VOL_CTL */
144#define CS35L34_AMP_DSR_RATE_MASK 0xF0
145#define CS35L34_AMP_DSR_RATE_SHIFT (1 << 4)
146#define CS35L34_NOTCH_DIS (1 << 3)
147#define CS35L34_AMP_DIGSFT (1 << 1)
148#define CS35L34_INV 1
149
150/* CS35L34_PROTECT_CTL */
151#define CS35L34_OTW_ATTN_MASK 0xC
152#define CS35L34_OTW_THRD_MASK 0x3
153#define CS35L34_MUTE (1 << 5)
154#define CS35L34_GAIN_ZC (1 << 4)
155#define CS35L34_GAIN_ZC_MASK 0x10
156#define CS35L34_GAIN_ZC_SHIFT 4
157
158/* CS35L34_AMP_KEEP_ALIVE_CTL */
159#define CS35L34_ALIVE_WD_DIS (1 << 2)
160
161/* CS35L34_BST_CVTR_V_CTL */
162#define CS35L34_BST_CVTL_MASK 0x3F
163
164/* CS35L34_BST_PEAK_I */
165#define CS35L34_BST_PEAK_MASK 0x3F
166
167/* CS35L34_ADSP_I2S_CTL */
168#define CS35L34_I2S_LOC_MASK 0xC
169#define CS35L34_I2S_LOC_SHIFT 2
170
171/* CS35L34_MULT_DEV_SYNCH2 */
172#define CS35L34_SYNC2_MASK 0xF
173
174/* CS35L34_PROT_RELEASE_CTL */
175#define CS35L34_CAL_ERR_RLS (1 << 7)
176#define CS35L34_SHORT_RLS (1 << 2)
177#define CS35L34_OTW_RLS (1 << 1)
178#define CS35L34_OTE_RLS 1
179
180/* CS35L34_INT_MASK_1 */
181#define CS35L34_M_CAL_ERR_SHIFT 7
182#define CS35L34_M_CAL_ERR (1 << CS35L34_M_CAL_ERR_SHIFT)
183#define CS35L34_M_ALIVE_ERR_SHIFT 5
184#define CS35L34_M_ALIVE_ERR (1 << CS35L34_M_ALIVE_ERR_SHIFT)
185#define CS35L34_M_ADSP_CLK_SHIFT 4
186#define CS35L34_M_ADSP_CLK_ERR (1 << CS35L34_M_ADSP_CLK_SHIFT)
187#define CS35L34_M_MCLK_SHIFT 3
188#define CS35L34_M_MCLK_ERR (1 << CS35L34_M_MCLK_SHIFT)
189#define CS35L34_M_AMP_SHORT_SHIFT 2
190#define CS35L34_M_AMP_SHORT (1 << CS35L34_M_AMP_SHORT_SHIFT)
191#define CS35L34_M_OTW_SHIFT 1
192#define CS35L34_M_OTW (1 << CS35L34_M_OTW_SHIFT)
193#define CS35L34_M_OTE_SHIFT 0
194#define CS35L34_M_OTE (1 << CS35L34_M_OTE_SHIFT)
195
196/* CS35L34_INT_MASK_2 */
197#define CS35L34_M_PDN_DONE_SHIFT 4
198#define CS35L34_M_PDN_DONE (1 << CS35L34_M_PDN_DONE_SHIFT)
199#define CS35L34_M_PRED_SHIFT 3
200#define CS35L34_M_PRED_ERR (1 << CS35L34_M_PRED_SHIFT)
201#define CS35L34_M_PRED_CLR_SHIFT 2
202#define CS35L34_M_PRED_CLR (1 << CS35L34_M_PRED_CLR_SHIFT)
203#define CS35L34_M_VPBR_SHIFT 1
204#define CS35L34_M_VPBR_ERR (1 << CS35L34_M_VPBR_SHIFT)
205#define CS35L34_M_VPBR_CLR_SHIFT 0
206#define CS35L34_M_VPBR_CLR (1 << CS35L34_M_VPBR_CLR_SHIFT)
207
208/* CS35L34_INT_MASK_3 */
209#define CS35L34_M_BST_HIGH_SHIFT 4
210#define CS35L34_M_BST_HIGH (1 << CS35L34_M_BST_HIGH_SHIFT)
211#define CS35L34_M_BST_HIGH_FLAG_SHIFT 3
212#define CS35L34_M_BST_HIGH_FLAG (1 << CS35L34_M_BST_HIGH_FLAG_SHIFT)
213#define CS35L34_M_BST_IPK_FLAG_SHIFT 2
214#define CS35L34_M_BST_IPK_FLAG (1 << CS35L34_M_BST_IPK_FLAG_SHIFT)
215#define CS35L34_M_LBST_SHORT_SHIFT 0
216#define CS35L34_M_LBST_SHORT (1 << CS35L34_M_LBST_SHORT_SHIFT)
217
218/* CS35L34_INT_MASK_4 */
219#define CS35L34_M_VMON_OVFL_SHIFT 3
220#define CS35L34_M_VMON_OVFL (1 << CS35L34_M_VMON_OVFL_SHIFT)
221#define CS35L34_M_IMON_OVFL_SHIFT 2
222#define CS35L34_M_IMON_OVFL (1 << CS35L34_M_IMON_OVFL_SHIFT)
223#define CS35L34_M_VPMON_OVFL_SHIFT 1
224#define CS35L34_M_VPMON_OVFL (1 << CS35L34_M_VPMON_OVFL_SHIFT)
225#define CS35L34_M_VBSTMON_OVFL_SHIFT 1
226#define CS35L34_M_VBSTMON_OVFL (1 << CS35L34_M_VBSTMON_OVFL_SHIFT)
227
228/* CS35L34_INT_1 */
229#define CS35L34_CAL_ERR (1 << CS35L34_M_CAL_ERR_SHIFT)
230#define CS35L34_ALIVE_ERR (1 << CS35L34_M_ALIVE_ERR_SHIFT)
231#define CS35L34_M_ADSP_CLK_ERR (1 << CS35L34_M_ADSP_CLK_SHIFT)
232#define CS35L34_MCLK_ERR (1 << CS35L34_M_MCLK_SHIFT)
233#define CS35L34_AMP_SHORT (1 << CS35L34_M_AMP_SHORT_SHIFT)
234#define CS35L34_OTW (1 << CS35L34_M_OTW_SHIFT)
235#define CS35L34_OTE (1 << CS35L34_M_OTE_SHIFT)
236
237/* CS35L34_INT_2 */
238#define CS35L34_PDN_DONE (1 << CS35L34_M_PDN_DONE_SHIFT)
239#define CS35L34_PRED_ERR (1 << CS35L34_M_PRED_SHIFT)
240#define CS35L34_PRED_CLR (1 << CS35L34_M_PRED_CLR_SHIFT)
241#define CS35L34_VPBR_ERR (1 << CS35L34_M_VPBR_SHIFT)
242#define CS35L34_VPBR_CLR (1 << CS35L34_M_VPBR_CLR_SHIFT)
243
244/* CS35L34_INT_3 */
245#define CS35L34_BST_HIGH (1 << CS35L34_M_BST_HIGH_SHIFT)
246#define CS35L34_BST_HIGH_FLAG (1 << CS35L34_M_BST_HIGH_FLAG_SHIFT)
247#define CS35L34_BST_IPK_FLAG (1 << CS35L34_M_BST_IPK_FLAG_SHIFT)
248#define CS35L34_LBST_SHORT (1 << CS35L34_M_LBST_SHORT_SHIFT)
249
250/* CS35L34_INT_4 */
251#define CS35L34_VMON_OVFL (1 << CS35L34_M_VMON_OVFL_SHIFT)
252#define CS35L34_IMON_OVFL (1 << CS35L34_M_IMON_OVFL_SHIFT)
253#define CS35L34_VPMON_OVFL (1 << CS35L34_M_VPMON_OVFL_SHIFT)
254#define CS35L34_VBSTMON_OVFL (1 << CS35L34_M_VBSTMON_OVFL_SHIFT)
255
256/* CS35L34_{RX,TX}_X */
257#define CS35L34_X_STATE_SHIFT 7
258#define CS35L34_X_STATE (1 << CS35L34_X_STATE_SHIFT)
259#define CS35L34_X_LOC_SHIFT 0
260#define CS35L34_X_LOC (0x1F << CS35L34_X_LOC_SHIFT)
261
262#define CS35L34_RATES (SNDRV_PCM_RATE_48000 | \
263 SNDRV_PCM_RATE_44100 | \
264 SNDRV_PCM_RATE_32000)
265#define CS35L34_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
266 SNDRV_PCM_FMTBIT_S24_LE | \
267 SNDRV_PCM_FMTBIT_S32_LE)
268
269#endif
diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c
new file mode 100644
index 000000000000..55e4520cdcaf
--- /dev/null
+++ b/sound/soc/codecs/cs42l42.c
@@ -0,0 +1,1986 @@
1/*
2 * cs42l42.c -- CS42L42 ALSA SoC audio driver
3 *
4 * Copyright 2016 Cirrus Logic, Inc.
5 *
6 * Author: James Schulman <james.schulman@cirrus.com>
7 * Author: Brian Austin <brian.austin@cirrus.com>
8 * Author: Michael White <michael.white@cirrus.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 */
15
16#include <linux/module.h>
17#include <linux/moduleparam.h>
18#include <linux/version.h>
19#include <linux/kernel.h>
20#include <linux/init.h>
21#include <linux/delay.h>
22#include <linux/i2c.h>
23#include <linux/gpio.h>
24#include <linux/regmap.h>
25#include <linux/slab.h>
26#include <linux/platform_device.h>
27#include <linux/regulator/consumer.h>
28#include <linux/gpio/consumer.h>
29#include <linux/of.h>
30#include <linux/of_gpio.h>
31#include <linux/of_device.h>
32#include <sound/core.h>
33#include <sound/pcm.h>
34#include <sound/pcm_params.h>
35#include <sound/soc.h>
36#include <sound/soc-dapm.h>
37#include <sound/initval.h>
38#include <sound/tlv.h>
39#include <dt-bindings/sound/cs42l42.h>
40
41#include "cs42l42.h"
42
43static const struct reg_default cs42l42_reg_defaults[] = {
44 { CS42L42_FRZ_CTL, 0x00 },
45 { CS42L42_SRC_CTL, 0x10 },
46 { CS42L42_MCLK_STATUS, 0x02 },
47 { CS42L42_MCLK_CTL, 0x02 },
48 { CS42L42_SFTRAMP_RATE, 0xA4 },
49 { CS42L42_I2C_DEBOUNCE, 0x88 },
50 { CS42L42_I2C_STRETCH, 0x03 },
51 { CS42L42_I2C_TIMEOUT, 0xB7 },
52 { CS42L42_PWR_CTL1, 0xFF },
53 { CS42L42_PWR_CTL2, 0x84 },
54 { CS42L42_PWR_CTL3, 0x20 },
55 { CS42L42_RSENSE_CTL1, 0x40 },
56 { CS42L42_RSENSE_CTL2, 0x00 },
57 { CS42L42_OSC_SWITCH, 0x00 },
58 { CS42L42_OSC_SWITCH_STATUS, 0x05 },
59 { CS42L42_RSENSE_CTL3, 0x1B },
60 { CS42L42_TSENSE_CTL, 0x1B },
61 { CS42L42_TSRS_INT_DISABLE, 0x00 },
62 { CS42L42_TRSENSE_STATUS, 0x00 },
63 { CS42L42_HSDET_CTL1, 0x77 },
64 { CS42L42_HSDET_CTL2, 0x00 },
65 { CS42L42_HS_SWITCH_CTL, 0xF3 },
66 { CS42L42_HS_DET_STATUS, 0x00 },
67 { CS42L42_HS_CLAMP_DISABLE, 0x00 },
68 { CS42L42_MCLK_SRC_SEL, 0x00 },
69 { CS42L42_SPDIF_CLK_CFG, 0x00 },
70 { CS42L42_FSYNC_PW_LOWER, 0x00 },
71 { CS42L42_FSYNC_PW_UPPER, 0x00 },
72 { CS42L42_FSYNC_P_LOWER, 0xF9 },
73 { CS42L42_FSYNC_P_UPPER, 0x00 },
74 { CS42L42_ASP_CLK_CFG, 0x00 },
75 { CS42L42_ASP_FRM_CFG, 0x10 },
76 { CS42L42_FS_RATE_EN, 0x00 },
77 { CS42L42_IN_ASRC_CLK, 0x00 },
78 { CS42L42_OUT_ASRC_CLK, 0x00 },
79 { CS42L42_PLL_DIV_CFG1, 0x00 },
80 { CS42L42_ADC_OVFL_STATUS, 0x00 },
81 { CS42L42_MIXER_STATUS, 0x00 },
82 { CS42L42_SRC_STATUS, 0x00 },
83 { CS42L42_ASP_RX_STATUS, 0x00 },
84 { CS42L42_ASP_TX_STATUS, 0x00 },
85 { CS42L42_CODEC_STATUS, 0x00 },
86 { CS42L42_DET_INT_STATUS1, 0x00 },
87 { CS42L42_DET_INT_STATUS2, 0x00 },
88 { CS42L42_SRCPL_INT_STATUS, 0x00 },
89 { CS42L42_VPMON_STATUS, 0x00 },
90 { CS42L42_PLL_LOCK_STATUS, 0x00 },
91 { CS42L42_TSRS_PLUG_STATUS, 0x00 },
92 { CS42L42_ADC_OVFL_INT_MASK, 0x01 },
93 { CS42L42_MIXER_INT_MASK, 0x0F },
94 { CS42L42_SRC_INT_MASK, 0x0F },
95 { CS42L42_ASP_RX_INT_MASK, 0x1F },
96 { CS42L42_ASP_TX_INT_MASK, 0x0F },
97 { CS42L42_CODEC_INT_MASK, 0x03 },
98 { CS42L42_SRCPL_INT_MASK, 0xFF },
99 { CS42L42_VPMON_INT_MASK, 0x01 },
100 { CS42L42_PLL_LOCK_INT_MASK, 0x01 },
101 { CS42L42_TSRS_PLUG_INT_MASK, 0x0F },
102 { CS42L42_PLL_CTL1, 0x00 },
103 { CS42L42_PLL_DIV_FRAC0, 0x00 },
104 { CS42L42_PLL_DIV_FRAC1, 0x00 },
105 { CS42L42_PLL_DIV_FRAC2, 0x00 },
106 { CS42L42_PLL_DIV_INT, 0x40 },
107 { CS42L42_PLL_CTL3, 0x10 },
108 { CS42L42_PLL_CAL_RATIO, 0x80 },
109 { CS42L42_PLL_CTL4, 0x03 },
110 { CS42L42_LOAD_DET_RCSTAT, 0x00 },
111 { CS42L42_LOAD_DET_DONE, 0x00 },
112 { CS42L42_LOAD_DET_EN, 0x00 },
113 { CS42L42_HSBIAS_SC_AUTOCTL, 0x03 },
114 { CS42L42_WAKE_CTL, 0xC0 },
115 { CS42L42_ADC_DISABLE_MUTE, 0x00 },
116 { CS42L42_TIPSENSE_CTL, 0x02 },
117 { CS42L42_MISC_DET_CTL, 0x03 },
118 { CS42L42_MIC_DET_CTL1, 0x1F },
119 { CS42L42_MIC_DET_CTL2, 0x2F },
120 { CS42L42_DET_STATUS1, 0x00 },
121 { CS42L42_DET_STATUS2, 0x00 },
122 { CS42L42_DET_INT1_MASK, 0xE0 },
123 { CS42L42_DET_INT2_MASK, 0xFF },
124 { CS42L42_HS_BIAS_CTL, 0xC2 },
125 { CS42L42_ADC_CTL, 0x00 },
126 { CS42L42_ADC_VOLUME, 0x00 },
127 { CS42L42_ADC_WNF_HPF_CTL, 0x71 },
128 { CS42L42_DAC_CTL1, 0x00 },
129 { CS42L42_DAC_CTL2, 0x02 },
130 { CS42L42_HP_CTL, 0x0D },
131 { CS42L42_CLASSH_CTL, 0x07 },
132 { CS42L42_MIXER_CHA_VOL, 0x3F },
133 { CS42L42_MIXER_ADC_VOL, 0x3F },
134 { CS42L42_MIXER_CHB_VOL, 0x3F },
135 { CS42L42_EQ_COEF_IN0, 0x22 },
136 { CS42L42_EQ_COEF_IN1, 0x00 },
137 { CS42L42_EQ_COEF_IN2, 0x00 },
138 { CS42L42_EQ_COEF_IN3, 0x00 },
139 { CS42L42_EQ_COEF_RW, 0x00 },
140 { CS42L42_EQ_COEF_OUT0, 0x00 },
141 { CS42L42_EQ_COEF_OUT1, 0x00 },
142 { CS42L42_EQ_COEF_OUT2, 0x00 },
143 { CS42L42_EQ_COEF_OUT3, 0x00 },
144 { CS42L42_EQ_INIT_STAT, 0x00 },
145 { CS42L42_EQ_START_FILT, 0x00 },
146 { CS42L42_EQ_MUTE_CTL, 0x00 },
147 { CS42L42_SP_RX_CH_SEL, 0x04 },
148 { CS42L42_SP_RX_ISOC_CTL, 0x04 },
149 { CS42L42_SP_RX_FS, 0x8C },
150 { CS42l42_SPDIF_CH_SEL, 0x0E },
151 { CS42L42_SP_TX_ISOC_CTL, 0x04 },
152 { CS42L42_SP_TX_FS, 0xCC },
153 { CS42L42_SPDIF_SW_CTL1, 0x3F },
154 { CS42L42_SRC_SDIN_FS, 0x40 },
155 { CS42L42_SRC_SDOUT_FS, 0x40 },
156 { CS42L42_SPDIF_CTL1, 0x01 },
157 { CS42L42_SPDIF_CTL2, 0x00 },
158 { CS42L42_SPDIF_CTL3, 0x00 },
159 { CS42L42_SPDIF_CTL4, 0x42 },
160 { CS42L42_ASP_TX_SZ_EN, 0x00 },
161 { CS42L42_ASP_TX_CH_EN, 0x00 },
162 { CS42L42_ASP_TX_CH_AP_RES, 0x0F },
163 { CS42L42_ASP_TX_CH1_BIT_MSB, 0x00 },
164 { CS42L42_ASP_TX_CH1_BIT_LSB, 0x00 },
165 { CS42L42_ASP_TX_HIZ_DLY_CFG, 0x00 },
166 { CS42L42_ASP_TX_CH2_BIT_MSB, 0x00 },
167 { CS42L42_ASP_TX_CH2_BIT_LSB, 0x00 },
168 { CS42L42_ASP_RX_DAI0_EN, 0x00 },
169 { CS42L42_ASP_RX_DAI0_CH1_AP_RES, 0x03 },
170 { CS42L42_ASP_RX_DAI0_CH1_BIT_MSB, 0x00 },
171 { CS42L42_ASP_RX_DAI0_CH1_BIT_LSB, 0x00 },
172 { CS42L42_ASP_RX_DAI0_CH2_AP_RES, 0x03 },
173 { CS42L42_ASP_RX_DAI0_CH2_BIT_MSB, 0x00 },
174 { CS42L42_ASP_RX_DAI0_CH2_BIT_LSB, 0x00 },
175 { CS42L42_ASP_RX_DAI0_CH3_AP_RES, 0x03 },
176 { CS42L42_ASP_RX_DAI0_CH3_BIT_MSB, 0x00 },
177 { CS42L42_ASP_RX_DAI0_CH3_BIT_LSB, 0x00 },
178 { CS42L42_ASP_RX_DAI0_CH4_AP_RES, 0x03 },
179 { CS42L42_ASP_RX_DAI0_CH4_BIT_MSB, 0x00 },
180 { CS42L42_ASP_RX_DAI0_CH4_BIT_LSB, 0x00 },
181 { CS42L42_ASP_RX_DAI1_CH1_AP_RES, 0x03 },
182 { CS42L42_ASP_RX_DAI1_CH1_BIT_MSB, 0x00 },
183 { CS42L42_ASP_RX_DAI1_CH1_BIT_LSB, 0x00 },
184 { CS42L42_ASP_RX_DAI1_CH2_AP_RES, 0x03 },
185 { CS42L42_ASP_RX_DAI1_CH2_BIT_MSB, 0x00 },
186 { CS42L42_ASP_RX_DAI1_CH2_BIT_LSB, 0x00 },
187 { CS42L42_SUB_REVID, 0x03 },
188};
189
190static bool cs42l42_readable_register(struct device *dev, unsigned int reg)
191{
192 switch (reg) {
193 case CS42L42_PAGE_REGISTER:
194 case CS42L42_DEVID_AB:
195 case CS42L42_DEVID_CD:
196 case CS42L42_DEVID_E:
197 case CS42L42_FABID:
198 case CS42L42_REVID:
199 case CS42L42_FRZ_CTL:
200 case CS42L42_SRC_CTL:
201 case CS42L42_MCLK_STATUS:
202 case CS42L42_MCLK_CTL:
203 case CS42L42_SFTRAMP_RATE:
204 case CS42L42_I2C_DEBOUNCE:
205 case CS42L42_I2C_STRETCH:
206 case CS42L42_I2C_TIMEOUT:
207 case CS42L42_PWR_CTL1:
208 case CS42L42_PWR_CTL2:
209 case CS42L42_PWR_CTL3:
210 case CS42L42_RSENSE_CTL1:
211 case CS42L42_RSENSE_CTL2:
212 case CS42L42_OSC_SWITCH:
213 case CS42L42_OSC_SWITCH_STATUS:
214 case CS42L42_RSENSE_CTL3:
215 case CS42L42_TSENSE_CTL:
216 case CS42L42_TSRS_INT_DISABLE:
217 case CS42L42_TRSENSE_STATUS:
218 case CS42L42_HSDET_CTL1:
219 case CS42L42_HSDET_CTL2:
220 case CS42L42_HS_SWITCH_CTL:
221 case CS42L42_HS_DET_STATUS:
222 case CS42L42_HS_CLAMP_DISABLE:
223 case CS42L42_MCLK_SRC_SEL:
224 case CS42L42_SPDIF_CLK_CFG:
225 case CS42L42_FSYNC_PW_LOWER:
226 case CS42L42_FSYNC_PW_UPPER:
227 case CS42L42_FSYNC_P_LOWER:
228 case CS42L42_FSYNC_P_UPPER:
229 case CS42L42_ASP_CLK_CFG:
230 case CS42L42_ASP_FRM_CFG:
231 case CS42L42_FS_RATE_EN:
232 case CS42L42_IN_ASRC_CLK:
233 case CS42L42_OUT_ASRC_CLK:
234 case CS42L42_PLL_DIV_CFG1:
235 case CS42L42_ADC_OVFL_STATUS:
236 case CS42L42_MIXER_STATUS:
237 case CS42L42_SRC_STATUS:
238 case CS42L42_ASP_RX_STATUS:
239 case CS42L42_ASP_TX_STATUS:
240 case CS42L42_CODEC_STATUS:
241 case CS42L42_DET_INT_STATUS1:
242 case CS42L42_DET_INT_STATUS2:
243 case CS42L42_SRCPL_INT_STATUS:
244 case CS42L42_VPMON_STATUS:
245 case CS42L42_PLL_LOCK_STATUS:
246 case CS42L42_TSRS_PLUG_STATUS:
247 case CS42L42_ADC_OVFL_INT_MASK:
248 case CS42L42_MIXER_INT_MASK:
249 case CS42L42_SRC_INT_MASK:
250 case CS42L42_ASP_RX_INT_MASK:
251 case CS42L42_ASP_TX_INT_MASK:
252 case CS42L42_CODEC_INT_MASK:
253 case CS42L42_SRCPL_INT_MASK:
254 case CS42L42_VPMON_INT_MASK:
255 case CS42L42_PLL_LOCK_INT_MASK:
256 case CS42L42_TSRS_PLUG_INT_MASK:
257 case CS42L42_PLL_CTL1:
258 case CS42L42_PLL_DIV_FRAC0:
259 case CS42L42_PLL_DIV_FRAC1:
260 case CS42L42_PLL_DIV_FRAC2:
261 case CS42L42_PLL_DIV_INT:
262 case CS42L42_PLL_CTL3:
263 case CS42L42_PLL_CAL_RATIO:
264 case CS42L42_PLL_CTL4:
265 case CS42L42_LOAD_DET_RCSTAT:
266 case CS42L42_LOAD_DET_DONE:
267 case CS42L42_LOAD_DET_EN:
268 case CS42L42_HSBIAS_SC_AUTOCTL:
269 case CS42L42_WAKE_CTL:
270 case CS42L42_ADC_DISABLE_MUTE:
271 case CS42L42_TIPSENSE_CTL:
272 case CS42L42_MISC_DET_CTL:
273 case CS42L42_MIC_DET_CTL1:
274 case CS42L42_MIC_DET_CTL2:
275 case CS42L42_DET_STATUS1:
276 case CS42L42_DET_STATUS2:
277 case CS42L42_DET_INT1_MASK:
278 case CS42L42_DET_INT2_MASK:
279 case CS42L42_HS_BIAS_CTL:
280 case CS42L42_ADC_CTL:
281 case CS42L42_ADC_VOLUME:
282 case CS42L42_ADC_WNF_HPF_CTL:
283 case CS42L42_DAC_CTL1:
284 case CS42L42_DAC_CTL2:
285 case CS42L42_HP_CTL:
286 case CS42L42_CLASSH_CTL:
287 case CS42L42_MIXER_CHA_VOL:
288 case CS42L42_MIXER_ADC_VOL:
289 case CS42L42_MIXER_CHB_VOL:
290 case CS42L42_EQ_COEF_IN0:
291 case CS42L42_EQ_COEF_IN1:
292 case CS42L42_EQ_COEF_IN2:
293 case CS42L42_EQ_COEF_IN3:
294 case CS42L42_EQ_COEF_RW:
295 case CS42L42_EQ_COEF_OUT0:
296 case CS42L42_EQ_COEF_OUT1:
297 case CS42L42_EQ_COEF_OUT2:
298 case CS42L42_EQ_COEF_OUT3:
299 case CS42L42_EQ_INIT_STAT:
300 case CS42L42_EQ_START_FILT:
301 case CS42L42_EQ_MUTE_CTL:
302 case CS42L42_SP_RX_CH_SEL:
303 case CS42L42_SP_RX_ISOC_CTL:
304 case CS42L42_SP_RX_FS:
305 case CS42l42_SPDIF_CH_SEL:
306 case CS42L42_SP_TX_ISOC_CTL:
307 case CS42L42_SP_TX_FS:
308 case CS42L42_SPDIF_SW_CTL1:
309 case CS42L42_SRC_SDIN_FS:
310 case CS42L42_SRC_SDOUT_FS:
311 case CS42L42_SPDIF_CTL1:
312 case CS42L42_SPDIF_CTL2:
313 case CS42L42_SPDIF_CTL3:
314 case CS42L42_SPDIF_CTL4:
315 case CS42L42_ASP_TX_SZ_EN:
316 case CS42L42_ASP_TX_CH_EN:
317 case CS42L42_ASP_TX_CH_AP_RES:
318 case CS42L42_ASP_TX_CH1_BIT_MSB:
319 case CS42L42_ASP_TX_CH1_BIT_LSB:
320 case CS42L42_ASP_TX_HIZ_DLY_CFG:
321 case CS42L42_ASP_TX_CH2_BIT_MSB:
322 case CS42L42_ASP_TX_CH2_BIT_LSB:
323 case CS42L42_ASP_RX_DAI0_EN:
324 case CS42L42_ASP_RX_DAI0_CH1_AP_RES:
325 case CS42L42_ASP_RX_DAI0_CH1_BIT_MSB:
326 case CS42L42_ASP_RX_DAI0_CH1_BIT_LSB:
327 case CS42L42_ASP_RX_DAI0_CH2_AP_RES:
328 case CS42L42_ASP_RX_DAI0_CH2_BIT_MSB:
329 case CS42L42_ASP_RX_DAI0_CH2_BIT_LSB:
330 case CS42L42_ASP_RX_DAI0_CH3_AP_RES:
331 case CS42L42_ASP_RX_DAI0_CH3_BIT_MSB:
332 case CS42L42_ASP_RX_DAI0_CH3_BIT_LSB:
333 case CS42L42_ASP_RX_DAI0_CH4_AP_RES:
334 case CS42L42_ASP_RX_DAI0_CH4_BIT_MSB:
335 case CS42L42_ASP_RX_DAI0_CH4_BIT_LSB:
336 case CS42L42_ASP_RX_DAI1_CH1_AP_RES:
337 case CS42L42_ASP_RX_DAI1_CH1_BIT_MSB:
338 case CS42L42_ASP_RX_DAI1_CH1_BIT_LSB:
339 case CS42L42_ASP_RX_DAI1_CH2_AP_RES:
340 case CS42L42_ASP_RX_DAI1_CH2_BIT_MSB:
341 case CS42L42_ASP_RX_DAI1_CH2_BIT_LSB:
342 case CS42L42_SUB_REVID:
343 return true;
344 default:
345 return false;
346 }
347}
348
349static bool cs42l42_volatile_register(struct device *dev, unsigned int reg)
350{
351 switch (reg) {
352 case CS42L42_DEVID_AB:
353 case CS42L42_DEVID_CD:
354 case CS42L42_DEVID_E:
355 case CS42L42_MCLK_STATUS:
356 case CS42L42_TRSENSE_STATUS:
357 case CS42L42_HS_DET_STATUS:
358 case CS42L42_ADC_OVFL_STATUS:
359 case CS42L42_MIXER_STATUS:
360 case CS42L42_SRC_STATUS:
361 case CS42L42_ASP_RX_STATUS:
362 case CS42L42_ASP_TX_STATUS:
363 case CS42L42_CODEC_STATUS:
364 case CS42L42_DET_INT_STATUS1:
365 case CS42L42_DET_INT_STATUS2:
366 case CS42L42_SRCPL_INT_STATUS:
367 case CS42L42_VPMON_STATUS:
368 case CS42L42_PLL_LOCK_STATUS:
369 case CS42L42_TSRS_PLUG_STATUS:
370 case CS42L42_LOAD_DET_RCSTAT:
371 case CS42L42_LOAD_DET_DONE:
372 case CS42L42_DET_STATUS1:
373 case CS42L42_DET_STATUS2:
374 return true;
375 default:
376 return false;
377 }
378}
379
380static const struct regmap_range_cfg cs42l42_page_range = {
381 .name = "Pages",
382 .range_min = 0,
383 .range_max = CS42L42_MAX_REGISTER,
384 .selector_reg = CS42L42_PAGE_REGISTER,
385 .selector_mask = 0xff,
386 .selector_shift = 0,
387 .window_start = 0,
388 .window_len = 256,
389};
390
391static const struct regmap_config cs42l42_regmap = {
392 .reg_bits = 8,
393 .val_bits = 8,
394
395 .readable_reg = cs42l42_readable_register,
396 .volatile_reg = cs42l42_volatile_register,
397
398 .ranges = &cs42l42_page_range,
399 .num_ranges = 1,
400
401 .max_register = CS42L42_MAX_REGISTER,
402 .reg_defaults = cs42l42_reg_defaults,
403 .num_reg_defaults = ARRAY_SIZE(cs42l42_reg_defaults),
404 .cache_type = REGCACHE_RBTREE,
405};
406
407static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false);
408static DECLARE_TLV_DB_SCALE(mixer_tlv, -6200, 100, false);
409
410static const char * const cs42l42_hpf_freq_text[] = {
411 "1.86Hz", "120Hz", "235Hz", "466Hz"
412};
413
414static SOC_ENUM_SINGLE_DECL(cs42l42_hpf_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
415 CS42L42_ADC_HPF_CF_SHIFT,
416 cs42l42_hpf_freq_text);
417
418static const char * const cs42l42_wnf3_freq_text[] = {
419 "160Hz", "180Hz", "200Hz", "220Hz",
420 "240Hz", "260Hz", "280Hz", "300Hz"
421};
422
423static SOC_ENUM_SINGLE_DECL(cs42l42_wnf3_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
424 CS42L42_ADC_WNF_CF_SHIFT,
425 cs42l42_wnf3_freq_text);
426
427static const char * const cs42l42_wnf05_freq_text[] = {
428 "280Hz", "315Hz", "350Hz", "385Hz",
429 "420Hz", "455Hz", "490Hz", "525Hz"
430};
431
432static SOC_ENUM_SINGLE_DECL(cs42l42_wnf05_freq_enum, CS42L42_ADC_WNF_HPF_CTL,
433 CS42L42_ADC_WNF_CF_SHIFT,
434 cs42l42_wnf05_freq_text);
435
436static const struct snd_kcontrol_new cs42l42_snd_controls[] = {
437 /* ADC Volume and Filter Controls */
438 SOC_SINGLE("ADC Notch Switch", CS42L42_ADC_CTL,
439 CS42L42_ADC_NOTCH_DIS_SHIFT, true, false),
440 SOC_SINGLE("ADC Weak Force Switch", CS42L42_ADC_CTL,
441 CS42L42_ADC_FORCE_WEAK_VCM_SHIFT, true, false),
442 SOC_SINGLE("ADC Invert Switch", CS42L42_ADC_CTL,
443 CS42L42_ADC_INV_SHIFT, true, false),
444 SOC_SINGLE("ADC Boost Switch", CS42L42_ADC_CTL,
445 CS42L42_ADC_DIG_BOOST_SHIFT, true, false),
446 SOC_SINGLE_SX_TLV("ADC Volume", CS42L42_ADC_VOLUME,
447 CS42L42_ADC_VOL_SHIFT, 0xA0, 0x6C, adc_tlv),
448 SOC_SINGLE("ADC WNF Switch", CS42L42_ADC_WNF_HPF_CTL,
449 CS42L42_ADC_WNF_EN_SHIFT, true, false),
450 SOC_SINGLE("ADC HPF Switch", CS42L42_ADC_WNF_HPF_CTL,
451 CS42L42_ADC_HPF_EN_SHIFT, true, false),
452 SOC_ENUM("HPF Corner Freq", cs42l42_hpf_freq_enum),
453 SOC_ENUM("WNF 3dB Freq", cs42l42_wnf3_freq_enum),
454 SOC_ENUM("WNF 05dB Freq", cs42l42_wnf05_freq_enum),
455
456 /* DAC Volume and Filter Controls */
457 SOC_SINGLE("DACA Invert Switch", CS42L42_DAC_CTL1,
458 CS42L42_DACA_INV_SHIFT, true, false),
459 SOC_SINGLE("DACB Invert Switch", CS42L42_DAC_CTL1,
460 CS42L42_DACB_INV_SHIFT, true, false),
461 SOC_SINGLE("DAC HPF Switch", CS42L42_DAC_CTL2,
462 CS42L42_DAC_HPF_EN_SHIFT, true, false),
463 SOC_DOUBLE_R_TLV("Mixer Volume", CS42L42_MIXER_CHA_VOL,
464 CS42L42_MIXER_CHB_VOL, CS42L42_MIXER_CH_VOL_SHIFT,
465 0x3e, 1, mixer_tlv)
466};
467
468static int cs42l42_hpdrv_evt(struct snd_soc_dapm_widget *w,
469 struct snd_kcontrol *kcontrol, int event)
470{
471 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
472
473 if (event & SND_SOC_DAPM_POST_PMU) {
474 /* Enable the channels */
475 snd_soc_update_bits(codec, CS42L42_ASP_RX_DAI0_EN,
476 CS42L42_ASP_RX0_CH_EN_MASK,
477 (CS42L42_ASP_RX0_CH1_EN |
478 CS42L42_ASP_RX0_CH2_EN) <<
479 CS42L42_ASP_RX0_CH_EN_SHIFT);
480
481 /* Power up */
482 snd_soc_update_bits(codec, CS42L42_PWR_CTL1,
483 CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK |
484 CS42L42_HP_PDN_MASK, 0);
485 } else if (event & SND_SOC_DAPM_PRE_PMD) {
486 /* Disable the channels */
487 snd_soc_update_bits(codec, CS42L42_ASP_RX_DAI0_EN,
488 CS42L42_ASP_RX0_CH_EN_MASK, 0);
489
490 /* Power down */
491 snd_soc_update_bits(codec, CS42L42_PWR_CTL1,
492 CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK |
493 CS42L42_HP_PDN_MASK,
494 CS42L42_ASP_DAI_PDN_MASK | CS42L42_MIXER_PDN_MASK |
495 CS42L42_HP_PDN_MASK);
496 } else {
497 dev_err(codec->dev, "Invalid event 0x%x\n", event);
498 }
499 return 0;
500}
501
502static const struct snd_soc_dapm_widget cs42l42_dapm_widgets[] = {
503 SND_SOC_DAPM_OUTPUT("HP"),
504 SND_SOC_DAPM_AIF_IN("SDIN", NULL, 0, CS42L42_ASP_CLK_CFG,
505 CS42L42_ASP_SCLK_EN_SHIFT, false),
506 SND_SOC_DAPM_OUT_DRV_E("HPDRV", SND_SOC_NOPM, 0,
507 0, NULL, 0, cs42l42_hpdrv_evt,
508 SND_SOC_DAPM_POST_PMU |
509 SND_SOC_DAPM_PRE_PMD)
510};
511
512static const struct snd_soc_dapm_route cs42l42_audio_map[] = {
513 {"SDIN", NULL, "Playback"},
514 {"HPDRV", NULL, "SDIN"},
515 {"HP", NULL, "HPDRV"}
516};
517
518static int cs42l42_set_bias_level(struct snd_soc_codec *codec,
519 enum snd_soc_bias_level level)
520{
521 struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec);
522 int ret;
523
524 switch (level) {
525 case SND_SOC_BIAS_ON:
526 break;
527 case SND_SOC_BIAS_PREPARE:
528 break;
529 case SND_SOC_BIAS_STANDBY:
530 if (snd_soc_codec_get_bias_level(codec) == SND_SOC_BIAS_OFF) {
531 regcache_cache_only(cs42l42->regmap, false);
532 regcache_sync(cs42l42->regmap);
533 ret = regulator_bulk_enable(
534 ARRAY_SIZE(cs42l42->supplies),
535 cs42l42->supplies);
536 if (ret != 0) {
537 dev_err(codec->dev,
538 "Failed to enable regulators: %d\n",
539 ret);
540 return ret;
541 }
542 }
543 break;
544 case SND_SOC_BIAS_OFF:
545
546 regcache_cache_only(cs42l42->regmap, true);
547 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies),
548 cs42l42->supplies);
549 break;
550 }
551
552 return 0;
553}
554
555static int cs42l42_codec_probe(struct snd_soc_codec *codec)
556{
557 struct cs42l42_private *cs42l42 =
558 (struct cs42l42_private *)snd_soc_codec_get_drvdata(codec);
559
560 cs42l42->codec = codec;
561
562 return 0;
563}
564
565static const struct snd_soc_codec_driver soc_codec_dev_cs42l42 = {
566 .probe = cs42l42_codec_probe,
567 .set_bias_level = cs42l42_set_bias_level,
568 .ignore_pmdown_time = true,
569
570 .component_driver = {
571 .dapm_widgets = cs42l42_dapm_widgets,
572 .num_dapm_widgets = ARRAY_SIZE(cs42l42_dapm_widgets),
573 .dapm_routes = cs42l42_audio_map,
574 .num_dapm_routes = ARRAY_SIZE(cs42l42_audio_map),
575
576 .controls = cs42l42_snd_controls,
577 .num_controls = ARRAY_SIZE(cs42l42_snd_controls),
578 },
579};
580
581struct cs42l42_pll_params {
582 u32 sclk;
583 u8 mclk_div;
584 u8 mclk_src_sel;
585 u8 sclk_prediv;
586 u8 pll_div_int;
587 u32 pll_div_frac;
588 u8 pll_mode;
589 u8 pll_divout;
590 u32 mclk_int;
591 u8 pll_cal_ratio;
592};
593
594/*
595 * Common PLL Settings for given SCLK
596 * Table 4-5 from the Datasheet
597 */
598static const struct cs42l42_pll_params pll_ratio_table[] = {
599 { 1536000, 0, 1, 0x00, 0x7D, 0x000000, 0x03, 0x10, 12000000, 125 },
600 { 2822400, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 11289600, 128 },
601 { 3000000, 0, 1, 0x00, 0x40, 0x000000, 0x03, 0x10, 12000000, 128 },
602 { 3072000, 0, 1, 0x00, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125 },
603 { 4000000, 0, 1, 0x00, 0x30, 0x800000, 0x03, 0x10, 12000000, 96 },
604 { 4096000, 0, 1, 0x00, 0x2E, 0xE00000, 0x03, 0x10, 12000000, 94 },
605 { 5644800, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 11289600, 128 },
606 { 6000000, 0, 1, 0x01, 0x40, 0x000000, 0x03, 0x10, 12000000, 128 },
607 { 6144000, 0, 1, 0x01, 0x3E, 0x800000, 0x03, 0x10, 12000000, 125 },
608 { 11289600, 0, 0, 0, 0, 0, 0, 0, 11289600, 0 },
609 { 12000000, 0, 0, 0, 0, 0, 0, 0, 12000000, 0 },
610 { 12288000, 0, 0, 0, 0, 0, 0, 0, 12288000, 0 },
611 { 22579200, 1, 0, 0, 0, 0, 0, 0, 22579200, 0 },
612 { 24000000, 1, 0, 0, 0, 0, 0, 0, 24000000, 0 },
613 { 24576000, 1, 0, 0, 0, 0, 0, 0, 24576000, 0 }
614};
615
616static int cs42l42_pll_config(struct snd_soc_codec *codec)
617{
618 struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec);
619 int i;
620 u32 fsync;
621
622 for (i = 0; i < ARRAY_SIZE(pll_ratio_table); i++) {
623 if (pll_ratio_table[i].sclk == cs42l42->sclk) {
624 /* Configure the internal sample rate */
625 snd_soc_update_bits(codec, CS42L42_MCLK_CTL,
626 CS42L42_INTERNAL_FS_MASK,
627 ((pll_ratio_table[i].mclk_int !=
628 12000000) &&
629 (pll_ratio_table[i].mclk_int !=
630 24000000)) <<
631 CS42L42_INTERNAL_FS_SHIFT);
632 /* Set the MCLK src (PLL or SCLK) and the divide
633 * ratio
634 */
635 snd_soc_update_bits(codec, CS42L42_MCLK_SRC_SEL,
636 CS42L42_MCLK_SRC_SEL_MASK |
637 CS42L42_MCLKDIV_MASK,
638 (pll_ratio_table[i].mclk_src_sel
639 << CS42L42_MCLK_SRC_SEL_SHIFT) |
640 (pll_ratio_table[i].mclk_div <<
641 CS42L42_MCLKDIV_SHIFT));
642 /* Set up the LRCLK */
643 fsync = cs42l42->sclk / cs42l42->srate;
644 if (((fsync * cs42l42->srate) != cs42l42->sclk)
645 || ((fsync % 2) != 0)) {
646 dev_err(codec->dev,
647 "Unsupported sclk %d/sample rate %d\n",
648 cs42l42->sclk,
649 cs42l42->srate);
650 return -EINVAL;
651 }
652 /* Set the LRCLK period */
653 snd_soc_update_bits(codec,
654 CS42L42_FSYNC_P_LOWER,
655 CS42L42_FSYNC_PERIOD_MASK,
656 CS42L42_FRAC0_VAL(fsync - 1) <<
657 CS42L42_FSYNC_PERIOD_SHIFT);
658 snd_soc_update_bits(codec,
659 CS42L42_FSYNC_P_UPPER,
660 CS42L42_FSYNC_PERIOD_MASK,
661 CS42L42_FRAC1_VAL(fsync - 1) <<
662 CS42L42_FSYNC_PERIOD_SHIFT);
663 /* Set the LRCLK to 50% duty cycle */
664 fsync = fsync / 2;
665 snd_soc_update_bits(codec,
666 CS42L42_FSYNC_PW_LOWER,
667 CS42L42_FSYNC_PULSE_WIDTH_MASK,
668 CS42L42_FRAC0_VAL(fsync - 1) <<
669 CS42L42_FSYNC_PULSE_WIDTH_SHIFT);
670 snd_soc_update_bits(codec,
671 CS42L42_FSYNC_PW_UPPER,
672 CS42L42_FSYNC_PULSE_WIDTH_MASK,
673 CS42L42_FRAC1_VAL(fsync - 1) <<
674 CS42L42_FSYNC_PULSE_WIDTH_SHIFT);
675 snd_soc_update_bits(codec,
676 CS42L42_ASP_FRM_CFG,
677 CS42L42_ASP_5050_MASK,
678 CS42L42_ASP_5050_MASK);
679 /* Set the frame delay to 1.0 SCLK clocks */
680 snd_soc_update_bits(codec, CS42L42_ASP_FRM_CFG,
681 CS42L42_ASP_FSD_MASK,
682 CS42L42_ASP_FSD_1_0 <<
683 CS42L42_ASP_FSD_SHIFT);
684 /* Set the sample rates (96k or lower) */
685 snd_soc_update_bits(codec, CS42L42_FS_RATE_EN,
686 CS42L42_FS_EN_MASK,
687 (CS42L42_FS_EN_IASRC_96K |
688 CS42L42_FS_EN_OASRC_96K) <<
689 CS42L42_FS_EN_SHIFT);
690 /* Set the input/output internal MCLK clock ~12 MHz */
691 snd_soc_update_bits(codec, CS42L42_IN_ASRC_CLK,
692 CS42L42_CLK_IASRC_SEL_MASK,
693 CS42L42_CLK_IASRC_SEL_12 <<
694 CS42L42_CLK_IASRC_SEL_SHIFT);
695 snd_soc_update_bits(codec,
696 CS42L42_OUT_ASRC_CLK,
697 CS42L42_CLK_OASRC_SEL_MASK,
698 CS42L42_CLK_OASRC_SEL_12 <<
699 CS42L42_CLK_OASRC_SEL_SHIFT);
700 /* channel 1 on low LRCLK, 32 bit */
701 snd_soc_update_bits(codec,
702 CS42L42_ASP_RX_DAI0_CH1_AP_RES,
703 CS42L42_ASP_RX_CH_AP_MASK |
704 CS42L42_ASP_RX_CH_RES_MASK,
705 (CS42L42_ASP_RX_CH_AP_LOW <<
706 CS42L42_ASP_RX_CH_AP_SHIFT) |
707 (CS42L42_ASP_RX_CH_RES_32 <<
708 CS42L42_ASP_RX_CH_RES_SHIFT));
709 /* Channel 2 on high LRCLK, 32 bit */
710 snd_soc_update_bits(codec,
711 CS42L42_ASP_RX_DAI0_CH2_AP_RES,
712 CS42L42_ASP_RX_CH_AP_MASK |
713 CS42L42_ASP_RX_CH_RES_MASK,
714 (CS42L42_ASP_RX_CH_AP_HI <<
715 CS42L42_ASP_RX_CH_AP_SHIFT) |
716 (CS42L42_ASP_RX_CH_RES_32 <<
717 CS42L42_ASP_RX_CH_RES_SHIFT));
718 if (pll_ratio_table[i].mclk_src_sel == 0) {
719 /* Pass the clock straight through */
720 snd_soc_update_bits(codec,
721 CS42L42_PLL_CTL1,
722 CS42L42_PLL_START_MASK, 0);
723 } else {
724 /* Configure PLL per table 4-5 */
725 snd_soc_update_bits(codec,
726 CS42L42_PLL_DIV_CFG1,
727 CS42L42_SCLK_PREDIV_MASK,
728 pll_ratio_table[i].sclk_prediv
729 << CS42L42_SCLK_PREDIV_SHIFT);
730 snd_soc_update_bits(codec,
731 CS42L42_PLL_DIV_INT,
732 CS42L42_PLL_DIV_INT_MASK,
733 pll_ratio_table[i].pll_div_int
734 << CS42L42_PLL_DIV_INT_SHIFT);
735 snd_soc_update_bits(codec,
736 CS42L42_PLL_DIV_FRAC0,
737 CS42L42_PLL_DIV_FRAC_MASK,
738 CS42L42_FRAC0_VAL(
739 pll_ratio_table[i].pll_div_frac)
740 << CS42L42_PLL_DIV_FRAC_SHIFT);
741 snd_soc_update_bits(codec,
742 CS42L42_PLL_DIV_FRAC1,
743 CS42L42_PLL_DIV_FRAC_MASK,
744 CS42L42_FRAC1_VAL(
745 pll_ratio_table[i].pll_div_frac)
746 << CS42L42_PLL_DIV_FRAC_SHIFT);
747 snd_soc_update_bits(codec,
748 CS42L42_PLL_DIV_FRAC2,
749 CS42L42_PLL_DIV_FRAC_MASK,
750 CS42L42_FRAC2_VAL(
751 pll_ratio_table[i].pll_div_frac)
752 << CS42L42_PLL_DIV_FRAC_SHIFT);
753 snd_soc_update_bits(codec,
754 CS42L42_PLL_CTL4,
755 CS42L42_PLL_MODE_MASK,
756 pll_ratio_table[i].pll_mode
757 << CS42L42_PLL_MODE_SHIFT);
758 snd_soc_update_bits(codec,
759 CS42L42_PLL_CTL3,
760 CS42L42_PLL_DIVOUT_MASK,
761 pll_ratio_table[i].pll_divout
762 << CS42L42_PLL_DIVOUT_SHIFT);
763 snd_soc_update_bits(codec,
764 CS42L42_PLL_CAL_RATIO,
765 CS42L42_PLL_CAL_RATIO_MASK,
766 pll_ratio_table[i].pll_cal_ratio
767 << CS42L42_PLL_CAL_RATIO_SHIFT);
768 }
769 return 0;
770 }
771 }
772
773 return -EINVAL;
774}
775
776static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
777{
778 struct snd_soc_codec *codec = codec_dai->codec;
779 u32 asp_cfg_val = 0;
780
781 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
782 case SND_SOC_DAIFMT_CBS_CFM:
783 asp_cfg_val |= CS42L42_ASP_MASTER_MODE <<
784 CS42L42_ASP_MODE_SHIFT;
785 break;
786 case SND_SOC_DAIFMT_CBS_CFS:
787 asp_cfg_val |= CS42L42_ASP_SLAVE_MODE <<
788 CS42L42_ASP_MODE_SHIFT;
789 break;
790 default:
791 return -EINVAL;
792 }
793
794 /* interface format */
795 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
796 case SND_SOC_DAIFMT_I2S:
797 case SND_SOC_DAIFMT_LEFT_J:
798 break;
799 default:
800 return -EINVAL;
801 }
802
803 /* Bitclock/frame inversion */
804 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
805 case SND_SOC_DAIFMT_NB_NF:
806 break;
807 case SND_SOC_DAIFMT_NB_IF:
808 asp_cfg_val |= CS42L42_ASP_POL_INV <<
809 CS42L42_ASP_LCPOL_IN_SHIFT;
810 break;
811 case SND_SOC_DAIFMT_IB_NF:
812 asp_cfg_val |= CS42L42_ASP_POL_INV <<
813 CS42L42_ASP_SCPOL_IN_DAC_SHIFT;
814 break;
815 case SND_SOC_DAIFMT_IB_IF:
816 asp_cfg_val |= CS42L42_ASP_POL_INV <<
817 CS42L42_ASP_LCPOL_IN_SHIFT;
818 asp_cfg_val |= CS42L42_ASP_POL_INV <<
819 CS42L42_ASP_SCPOL_IN_DAC_SHIFT;
820 break;
821 }
822
823 snd_soc_update_bits(codec, CS42L42_ASP_CLK_CFG,
824 CS42L42_ASP_MODE_MASK |
825 CS42L42_ASP_SCPOL_IN_DAC_MASK |
826 CS42L42_ASP_LCPOL_IN_MASK, asp_cfg_val);
827
828 return 0;
829}
830
831static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream,
832 struct snd_pcm_hw_params *params,
833 struct snd_soc_dai *dai)
834{
835 struct snd_soc_codec *codec = dai->codec;
836 struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec);
837 int retval;
838
839 cs42l42->srate = params_rate(params);
840 cs42l42->swidth = params_width(params);
841
842 retval = cs42l42_pll_config(codec);
843
844 return retval;
845}
846
847static int cs42l42_set_sysclk(struct snd_soc_dai *dai,
848 int clk_id, unsigned int freq, int dir)
849{
850 struct snd_soc_codec *codec = dai->codec;
851 struct cs42l42_private *cs42l42 = snd_soc_codec_get_drvdata(codec);
852
853 cs42l42->sclk = freq;
854
855 return 0;
856}
857
858static int cs42l42_digital_mute(struct snd_soc_dai *dai, int mute)
859{
860 struct snd_soc_codec *codec = dai->codec;
861 unsigned int regval;
862 u8 fullScaleVol;
863
864 if (mute) {
865 /* Mark SCLK as not present to turn on the internal
866 * oscillator.
867 */
868 snd_soc_update_bits(codec, CS42L42_OSC_SWITCH,
869 CS42L42_SCLK_PRESENT_MASK, 0);
870
871 snd_soc_update_bits(codec, CS42L42_PLL_CTL1,
872 CS42L42_PLL_START_MASK,
873 0 << CS42L42_PLL_START_SHIFT);
874
875 /* Mute the headphone */
876 snd_soc_update_bits(codec, CS42L42_HP_CTL,
877 CS42L42_HP_ANA_AMUTE_MASK |
878 CS42L42_HP_ANA_BMUTE_MASK,
879 CS42L42_HP_ANA_AMUTE_MASK |
880 CS42L42_HP_ANA_BMUTE_MASK);
881 } else {
882 snd_soc_update_bits(codec, CS42L42_PLL_CTL1,
883 CS42L42_PLL_START_MASK,
884 1 << CS42L42_PLL_START_SHIFT);
885 /* Read the headphone load */
886 regval = snd_soc_read(codec, CS42L42_LOAD_DET_RCSTAT);
887 if (((regval & CS42L42_RLA_STAT_MASK) >>
888 CS42L42_RLA_STAT_SHIFT) == CS42L42_RLA_STAT_15_OHM) {
889 fullScaleVol = CS42L42_HP_FULL_SCALE_VOL_MASK;
890 } else {
891 fullScaleVol = 0;
892 }
893
894 /* Un-mute the headphone, set the full scale volume flag */
895 snd_soc_update_bits(codec, CS42L42_HP_CTL,
896 CS42L42_HP_ANA_AMUTE_MASK |
897 CS42L42_HP_ANA_BMUTE_MASK |
898 CS42L42_HP_FULL_SCALE_VOL_MASK, fullScaleVol);
899
900 /* Mark SCLK as present, turn off internal oscillator */
901 snd_soc_update_bits(codec, CS42L42_OSC_SWITCH,
902 CS42L42_SCLK_PRESENT_MASK,
903 CS42L42_SCLK_PRESENT_MASK);
904 }
905
906 return 0;
907}
908
909#define CS42L42_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \
910 SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE | \
911 SNDRV_PCM_FMTBIT_S32_LE)
912
913
914static struct snd_soc_dai_ops cs42l42_ops = {
915 .hw_params = cs42l42_pcm_hw_params,
916 .set_fmt = cs42l42_set_dai_fmt,
917 .set_sysclk = cs42l42_set_sysclk,
918 .digital_mute = cs42l42_digital_mute
919};
920
921static struct snd_soc_dai_driver cs42l42_dai = {
922 .name = "cs42l42",
923 .playback = {
924 .stream_name = "Playback",
925 .channels_min = 1,
926 .channels_max = 2,
927 .rates = SNDRV_PCM_RATE_8000_192000,
928 .formats = CS42L42_FORMATS,
929 },
930 .capture = {
931 .stream_name = "Capture",
932 .channels_min = 1,
933 .channels_max = 2,
934 .rates = SNDRV_PCM_RATE_8000_192000,
935 .formats = CS42L42_FORMATS,
936 },
937 .ops = &cs42l42_ops,
938};
939
940static void cs42l42_process_hs_type_detect(struct cs42l42_private *cs42l42)
941{
942 unsigned int hs_det_status;
943 unsigned int int_status;
944
945 /* Mask the auto detect interrupt */
946 regmap_update_bits(cs42l42->regmap,
947 CS42L42_CODEC_INT_MASK,
948 CS42L42_PDN_DONE_MASK |
949 CS42L42_HSDET_AUTO_DONE_MASK,
950 (1 << CS42L42_PDN_DONE_SHIFT) |
951 (1 << CS42L42_HSDET_AUTO_DONE_SHIFT));
952
953 /* Set hs detect to automatic, disabled mode */
954 regmap_update_bits(cs42l42->regmap,
955 CS42L42_HSDET_CTL2,
956 CS42L42_HSDET_CTRL_MASK |
957 CS42L42_HSDET_SET_MASK |
958 CS42L42_HSBIAS_REF_MASK |
959 CS42L42_HSDET_AUTO_TIME_MASK,
960 (2 << CS42L42_HSDET_CTRL_SHIFT) |
961 (2 << CS42L42_HSDET_SET_SHIFT) |
962 (0 << CS42L42_HSBIAS_REF_SHIFT) |
963 (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
964
965 /* Read and save the hs detection result */
966 regmap_read(cs42l42->regmap, CS42L42_HS_DET_STATUS, &hs_det_status);
967
968 cs42l42->hs_type = (hs_det_status & CS42L42_HSDET_TYPE_MASK) >>
969 CS42L42_HSDET_TYPE_SHIFT;
970
971 /* Set up button detection */
972 if ((cs42l42->hs_type == CS42L42_PLUG_CTIA) ||
973 (cs42l42->hs_type == CS42L42_PLUG_OMTP)) {
974 /* Set auto HS bias settings to default */
975 regmap_update_bits(cs42l42->regmap,
976 CS42L42_HSBIAS_SC_AUTOCTL,
977 CS42L42_HSBIAS_SENSE_EN_MASK |
978 CS42L42_AUTO_HSBIAS_HIZ_MASK |
979 CS42L42_TIP_SENSE_EN_MASK |
980 CS42L42_HSBIAS_SENSE_TRIP_MASK,
981 (0 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
982 (0 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
983 (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
984 (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
985
986 /* Set up hs detect level sensitivity */
987 regmap_update_bits(cs42l42->regmap,
988 CS42L42_MIC_DET_CTL1,
989 CS42L42_LATCH_TO_VP_MASK |
990 CS42L42_EVENT_STAT_SEL_MASK |
991 CS42L42_HS_DET_LEVEL_MASK,
992 (1 << CS42L42_LATCH_TO_VP_SHIFT) |
993 (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
994 (cs42l42->bias_thresholds[0] <<
995 CS42L42_HS_DET_LEVEL_SHIFT));
996
997 /* Set auto HS bias settings to default */
998 regmap_update_bits(cs42l42->regmap,
999 CS42L42_HSBIAS_SC_AUTOCTL,
1000 CS42L42_HSBIAS_SENSE_EN_MASK |
1001 CS42L42_AUTO_HSBIAS_HIZ_MASK |
1002 CS42L42_TIP_SENSE_EN_MASK |
1003 CS42L42_HSBIAS_SENSE_TRIP_MASK,
1004 (1 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
1005 (1 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
1006 (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
1007 (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
1008
1009 /* Turn on level detect circuitry */
1010 regmap_update_bits(cs42l42->regmap,
1011 CS42L42_MISC_DET_CTL,
1012 CS42L42_DETECT_MODE_MASK |
1013 CS42L42_HSBIAS_CTL_MASK |
1014 CS42L42_PDN_MIC_LVL_DET_MASK,
1015 (0 << CS42L42_DETECT_MODE_SHIFT) |
1016 (3 << CS42L42_HSBIAS_CTL_SHIFT) |
1017 (0 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
1018
1019 msleep(cs42l42->btn_det_init_dbnce);
1020
1021 /* Clear any button interrupts before unmasking them */
1022 regmap_read(cs42l42->regmap, CS42L42_DET_INT_STATUS2,
1023 &int_status);
1024
1025 /* Unmask button detect interrupts */
1026 regmap_update_bits(cs42l42->regmap,
1027 CS42L42_DET_INT2_MASK,
1028 CS42L42_M_DETECT_TF_MASK |
1029 CS42L42_M_DETECT_FT_MASK |
1030 CS42L42_M_HSBIAS_HIZ_MASK |
1031 CS42L42_M_SHORT_RLS_MASK |
1032 CS42L42_M_SHORT_DET_MASK,
1033 (0 << CS42L42_M_DETECT_TF_SHIFT) |
1034 (0 << CS42L42_M_DETECT_FT_SHIFT) |
1035 (0 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
1036 (1 << CS42L42_M_SHORT_RLS_SHIFT) |
1037 (1 << CS42L42_M_SHORT_DET_SHIFT));
1038 } else {
1039 /* Make sure button detect and HS bias circuits are off */
1040 regmap_update_bits(cs42l42->regmap,
1041 CS42L42_MISC_DET_CTL,
1042 CS42L42_DETECT_MODE_MASK |
1043 CS42L42_HSBIAS_CTL_MASK |
1044 CS42L42_PDN_MIC_LVL_DET_MASK,
1045 (0 << CS42L42_DETECT_MODE_SHIFT) |
1046 (1 << CS42L42_HSBIAS_CTL_SHIFT) |
1047 (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
1048 }
1049
1050 regmap_update_bits(cs42l42->regmap,
1051 CS42L42_DAC_CTL2,
1052 CS42L42_HPOUT_PULLDOWN_MASK |
1053 CS42L42_HPOUT_LOAD_MASK |
1054 CS42L42_HPOUT_CLAMP_MASK |
1055 CS42L42_DAC_HPF_EN_MASK |
1056 CS42L42_DAC_MON_EN_MASK,
1057 (0 << CS42L42_HPOUT_PULLDOWN_SHIFT) |
1058 (0 << CS42L42_HPOUT_LOAD_SHIFT) |
1059 (0 << CS42L42_HPOUT_CLAMP_SHIFT) |
1060 (1 << CS42L42_DAC_HPF_EN_SHIFT) |
1061 (0 << CS42L42_DAC_MON_EN_SHIFT));
1062
1063 /* Unmask tip sense interrupts */
1064 regmap_update_bits(cs42l42->regmap,
1065 CS42L42_TSRS_PLUG_INT_MASK,
1066 CS42L42_RS_PLUG_MASK |
1067 CS42L42_RS_UNPLUG_MASK |
1068 CS42L42_TS_PLUG_MASK |
1069 CS42L42_TS_UNPLUG_MASK,
1070 (1 << CS42L42_RS_PLUG_SHIFT) |
1071 (1 << CS42L42_RS_UNPLUG_SHIFT) |
1072 (0 << CS42L42_TS_PLUG_SHIFT) |
1073 (0 << CS42L42_TS_UNPLUG_SHIFT));
1074}
1075
1076static void cs42l42_init_hs_type_detect(struct cs42l42_private *cs42l42)
1077{
1078 /* Mask tip sense interrupts */
1079 regmap_update_bits(cs42l42->regmap,
1080 CS42L42_TSRS_PLUG_INT_MASK,
1081 CS42L42_RS_PLUG_MASK |
1082 CS42L42_RS_UNPLUG_MASK |
1083 CS42L42_TS_PLUG_MASK |
1084 CS42L42_TS_UNPLUG_MASK,
1085 (1 << CS42L42_RS_PLUG_SHIFT) |
1086 (1 << CS42L42_RS_UNPLUG_SHIFT) |
1087 (1 << CS42L42_TS_PLUG_SHIFT) |
1088 (1 << CS42L42_TS_UNPLUG_SHIFT));
1089
1090 /* Make sure button detect and HS bias circuits are off */
1091 regmap_update_bits(cs42l42->regmap,
1092 CS42L42_MISC_DET_CTL,
1093 CS42L42_DETECT_MODE_MASK |
1094 CS42L42_HSBIAS_CTL_MASK |
1095 CS42L42_PDN_MIC_LVL_DET_MASK,
1096 (0 << CS42L42_DETECT_MODE_SHIFT) |
1097 (1 << CS42L42_HSBIAS_CTL_SHIFT) |
1098 (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
1099
1100 /* Set auto HS bias settings to default */
1101 regmap_update_bits(cs42l42->regmap,
1102 CS42L42_HSBIAS_SC_AUTOCTL,
1103 CS42L42_HSBIAS_SENSE_EN_MASK |
1104 CS42L42_AUTO_HSBIAS_HIZ_MASK |
1105 CS42L42_TIP_SENSE_EN_MASK |
1106 CS42L42_HSBIAS_SENSE_TRIP_MASK,
1107 (0 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
1108 (0 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
1109 (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
1110 (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
1111
1112 /* Set hs detect to manual, disabled mode */
1113 regmap_update_bits(cs42l42->regmap,
1114 CS42L42_HSDET_CTL2,
1115 CS42L42_HSDET_CTRL_MASK |
1116 CS42L42_HSDET_SET_MASK |
1117 CS42L42_HSBIAS_REF_MASK |
1118 CS42L42_HSDET_AUTO_TIME_MASK,
1119 (0 << CS42L42_HSDET_CTRL_SHIFT) |
1120 (2 << CS42L42_HSDET_SET_SHIFT) |
1121 (0 << CS42L42_HSBIAS_REF_SHIFT) |
1122 (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
1123
1124 regmap_update_bits(cs42l42->regmap,
1125 CS42L42_DAC_CTL2,
1126 CS42L42_HPOUT_PULLDOWN_MASK |
1127 CS42L42_HPOUT_LOAD_MASK |
1128 CS42L42_HPOUT_CLAMP_MASK |
1129 CS42L42_DAC_HPF_EN_MASK |
1130 CS42L42_DAC_MON_EN_MASK,
1131 (8 << CS42L42_HPOUT_PULLDOWN_SHIFT) |
1132 (0 << CS42L42_HPOUT_LOAD_SHIFT) |
1133 (1 << CS42L42_HPOUT_CLAMP_SHIFT) |
1134 (1 << CS42L42_DAC_HPF_EN_SHIFT) |
1135 (1 << CS42L42_DAC_MON_EN_SHIFT));
1136
1137 /* Power up HS bias to 2.7V */
1138 regmap_update_bits(cs42l42->regmap,
1139 CS42L42_MISC_DET_CTL,
1140 CS42L42_DETECT_MODE_MASK |
1141 CS42L42_HSBIAS_CTL_MASK |
1142 CS42L42_PDN_MIC_LVL_DET_MASK,
1143 (0 << CS42L42_DETECT_MODE_SHIFT) |
1144 (3 << CS42L42_HSBIAS_CTL_SHIFT) |
1145 (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
1146
1147 /* Wait for HS bias to ramp up */
1148 msleep(cs42l42->hs_bias_ramp_time);
1149
1150 /* Unmask auto detect interrupt */
1151 regmap_update_bits(cs42l42->regmap,
1152 CS42L42_CODEC_INT_MASK,
1153 CS42L42_PDN_DONE_MASK |
1154 CS42L42_HSDET_AUTO_DONE_MASK,
1155 (1 << CS42L42_PDN_DONE_SHIFT) |
1156 (0 << CS42L42_HSDET_AUTO_DONE_SHIFT));
1157
1158 /* Set hs detect to automatic, enabled mode */
1159 regmap_update_bits(cs42l42->regmap,
1160 CS42L42_HSDET_CTL2,
1161 CS42L42_HSDET_CTRL_MASK |
1162 CS42L42_HSDET_SET_MASK |
1163 CS42L42_HSBIAS_REF_MASK |
1164 CS42L42_HSDET_AUTO_TIME_MASK,
1165 (3 << CS42L42_HSDET_CTRL_SHIFT) |
1166 (2 << CS42L42_HSDET_SET_SHIFT) |
1167 (0 << CS42L42_HSBIAS_REF_SHIFT) |
1168 (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
1169}
1170
1171static void cs42l42_cancel_hs_type_detect(struct cs42l42_private *cs42l42)
1172{
1173 /* Mask button detect interrupts */
1174 regmap_update_bits(cs42l42->regmap,
1175 CS42L42_DET_INT2_MASK,
1176 CS42L42_M_DETECT_TF_MASK |
1177 CS42L42_M_DETECT_FT_MASK |
1178 CS42L42_M_HSBIAS_HIZ_MASK |
1179 CS42L42_M_SHORT_RLS_MASK |
1180 CS42L42_M_SHORT_DET_MASK,
1181 (1 << CS42L42_M_DETECT_TF_SHIFT) |
1182 (1 << CS42L42_M_DETECT_FT_SHIFT) |
1183 (1 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
1184 (1 << CS42L42_M_SHORT_RLS_SHIFT) |
1185 (1 << CS42L42_M_SHORT_DET_SHIFT));
1186
1187 /* Ground HS bias */
1188 regmap_update_bits(cs42l42->regmap,
1189 CS42L42_MISC_DET_CTL,
1190 CS42L42_DETECT_MODE_MASK |
1191 CS42L42_HSBIAS_CTL_MASK |
1192 CS42L42_PDN_MIC_LVL_DET_MASK,
1193 (0 << CS42L42_DETECT_MODE_SHIFT) |
1194 (1 << CS42L42_HSBIAS_CTL_SHIFT) |
1195 (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT));
1196
1197 /* Set auto HS bias settings to default */
1198 regmap_update_bits(cs42l42->regmap,
1199 CS42L42_HSBIAS_SC_AUTOCTL,
1200 CS42L42_HSBIAS_SENSE_EN_MASK |
1201 CS42L42_AUTO_HSBIAS_HIZ_MASK |
1202 CS42L42_TIP_SENSE_EN_MASK |
1203 CS42L42_HSBIAS_SENSE_TRIP_MASK,
1204 (0 << CS42L42_HSBIAS_SENSE_EN_SHIFT) |
1205 (0 << CS42L42_AUTO_HSBIAS_HIZ_SHIFT) |
1206 (0 << CS42L42_TIP_SENSE_EN_SHIFT) |
1207 (3 << CS42L42_HSBIAS_SENSE_TRIP_SHIFT));
1208
1209 /* Set hs detect to manual, disabled mode */
1210 regmap_update_bits(cs42l42->regmap,
1211 CS42L42_HSDET_CTL2,
1212 CS42L42_HSDET_CTRL_MASK |
1213 CS42L42_HSDET_SET_MASK |
1214 CS42L42_HSBIAS_REF_MASK |
1215 CS42L42_HSDET_AUTO_TIME_MASK,
1216 (0 << CS42L42_HSDET_CTRL_SHIFT) |
1217 (2 << CS42L42_HSDET_SET_SHIFT) |
1218 (0 << CS42L42_HSBIAS_REF_SHIFT) |
1219 (3 << CS42L42_HSDET_AUTO_TIME_SHIFT));
1220}
1221
1222static void cs42l42_handle_button_press(struct cs42l42_private *cs42l42)
1223{
1224 int bias_level;
1225 unsigned int detect_status;
1226
1227 /* Mask button detect interrupts */
1228 regmap_update_bits(cs42l42->regmap,
1229 CS42L42_DET_INT2_MASK,
1230 CS42L42_M_DETECT_TF_MASK |
1231 CS42L42_M_DETECT_FT_MASK |
1232 CS42L42_M_HSBIAS_HIZ_MASK |
1233 CS42L42_M_SHORT_RLS_MASK |
1234 CS42L42_M_SHORT_DET_MASK,
1235 (1 << CS42L42_M_DETECT_TF_SHIFT) |
1236 (1 << CS42L42_M_DETECT_FT_SHIFT) |
1237 (1 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
1238 (1 << CS42L42_M_SHORT_RLS_SHIFT) |
1239 (1 << CS42L42_M_SHORT_DET_SHIFT));
1240
1241 usleep_range(cs42l42->btn_det_event_dbnce * 1000,
1242 cs42l42->btn_det_event_dbnce * 2000);
1243
1244 /* Test all 4 level detect biases */
1245 bias_level = 1;
1246 do {
1247 /* Adjust button detect level sensitivity */
1248 regmap_update_bits(cs42l42->regmap,
1249 CS42L42_MIC_DET_CTL1,
1250 CS42L42_LATCH_TO_VP_MASK |
1251 CS42L42_EVENT_STAT_SEL_MASK |
1252 CS42L42_HS_DET_LEVEL_MASK,
1253 (1 << CS42L42_LATCH_TO_VP_SHIFT) |
1254 (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
1255 (cs42l42->bias_thresholds[bias_level] <<
1256 CS42L42_HS_DET_LEVEL_SHIFT));
1257
1258 regmap_read(cs42l42->regmap, CS42L42_DET_STATUS2,
1259 &detect_status);
1260 } while ((detect_status & CS42L42_HS_TRUE_MASK) &&
1261 (++bias_level < CS42L42_NUM_BIASES));
1262
1263 switch (bias_level) {
1264 case 1: /* Function C button press */
1265 dev_dbg(cs42l42->codec->dev, "Function C button press\n");
1266 break;
1267 case 2: /* Function B button press */
1268 dev_dbg(cs42l42->codec->dev, "Function B button press\n");
1269 break;
1270 case 3: /* Function D button press */
1271 dev_dbg(cs42l42->codec->dev, "Function D button press\n");
1272 break;
1273 case 4: /* Function A button press */
1274 dev_dbg(cs42l42->codec->dev, "Function A button press\n");
1275 break;
1276 }
1277
1278 /* Set button detect level sensitivity back to default */
1279 regmap_update_bits(cs42l42->regmap,
1280 CS42L42_MIC_DET_CTL1,
1281 CS42L42_LATCH_TO_VP_MASK |
1282 CS42L42_EVENT_STAT_SEL_MASK |
1283 CS42L42_HS_DET_LEVEL_MASK,
1284 (1 << CS42L42_LATCH_TO_VP_SHIFT) |
1285 (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
1286 (cs42l42->bias_thresholds[0] << CS42L42_HS_DET_LEVEL_SHIFT));
1287
1288 /* Clear any button interrupts before unmasking them */
1289 regmap_read(cs42l42->regmap, CS42L42_DET_INT_STATUS2,
1290 &detect_status);
1291
1292 /* Unmask button detect interrupts */
1293 regmap_update_bits(cs42l42->regmap,
1294 CS42L42_DET_INT2_MASK,
1295 CS42L42_M_DETECT_TF_MASK |
1296 CS42L42_M_DETECT_FT_MASK |
1297 CS42L42_M_HSBIAS_HIZ_MASK |
1298 CS42L42_M_SHORT_RLS_MASK |
1299 CS42L42_M_SHORT_DET_MASK,
1300 (0 << CS42L42_M_DETECT_TF_SHIFT) |
1301 (0 << CS42L42_M_DETECT_FT_SHIFT) |
1302 (0 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
1303 (1 << CS42L42_M_SHORT_RLS_SHIFT) |
1304 (1 << CS42L42_M_SHORT_DET_SHIFT));
1305}
1306
1307struct cs42l42_irq_params {
1308 u16 status_addr;
1309 u16 mask_addr;
1310 u8 mask;
1311};
1312
1313static const struct cs42l42_irq_params irq_params_table[] = {
1314 {CS42L42_ADC_OVFL_STATUS, CS42L42_ADC_OVFL_INT_MASK,
1315 CS42L42_ADC_OVFL_VAL_MASK},
1316 {CS42L42_MIXER_STATUS, CS42L42_MIXER_INT_MASK,
1317 CS42L42_MIXER_VAL_MASK},
1318 {CS42L42_SRC_STATUS, CS42L42_SRC_INT_MASK,
1319 CS42L42_SRC_VAL_MASK},
1320 {CS42L42_ASP_RX_STATUS, CS42L42_ASP_RX_INT_MASK,
1321 CS42L42_ASP_RX_VAL_MASK},
1322 {CS42L42_ASP_TX_STATUS, CS42L42_ASP_TX_INT_MASK,
1323 CS42L42_ASP_TX_VAL_MASK},
1324 {CS42L42_CODEC_STATUS, CS42L42_CODEC_INT_MASK,
1325 CS42L42_CODEC_VAL_MASK},
1326 {CS42L42_DET_INT_STATUS1, CS42L42_DET_INT1_MASK,
1327 CS42L42_DET_INT_VAL1_MASK},
1328 {CS42L42_DET_INT_STATUS2, CS42L42_DET_INT2_MASK,
1329 CS42L42_DET_INT_VAL2_MASK},
1330 {CS42L42_SRCPL_INT_STATUS, CS42L42_SRCPL_INT_MASK,
1331 CS42L42_SRCPL_VAL_MASK},
1332 {CS42L42_VPMON_STATUS, CS42L42_VPMON_INT_MASK,
1333 CS42L42_VPMON_VAL_MASK},
1334 {CS42L42_PLL_LOCK_STATUS, CS42L42_PLL_LOCK_INT_MASK,
1335 CS42L42_PLL_LOCK_VAL_MASK},
1336 {CS42L42_TSRS_PLUG_STATUS, CS42L42_TSRS_PLUG_INT_MASK,
1337 CS42L42_TSRS_PLUG_VAL_MASK}
1338};
1339
1340static irqreturn_t cs42l42_irq_thread(int irq, void *data)
1341{
1342 struct cs42l42_private *cs42l42 = (struct cs42l42_private *)data;
1343 struct snd_soc_codec *codec = cs42l42->codec;
1344 unsigned int stickies[12];
1345 unsigned int masks[12];
1346 unsigned int current_plug_status;
1347 unsigned int current_button_status;
1348 unsigned int i;
1349
1350 /* Read sticky registers to clear interurpt */
1351 for (i = 0; i < ARRAY_SIZE(stickies); i++) {
1352 regmap_read(cs42l42->regmap, irq_params_table[i].status_addr,
1353 &(stickies[i]));
1354 regmap_read(cs42l42->regmap, irq_params_table[i].mask_addr,
1355 &(masks[i]));
1356 stickies[i] = stickies[i] & (~masks[i]) &
1357 irq_params_table[i].mask;
1358 }
1359
1360 /* Read tip sense status before handling type detect */
1361 current_plug_status = (stickies[11] &
1362 (CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK)) >>
1363 CS42L42_TS_PLUG_SHIFT;
1364
1365 /* Read button sense status */
1366 current_button_status = stickies[7] &
1367 (CS42L42_M_DETECT_TF_MASK |
1368 CS42L42_M_DETECT_FT_MASK |
1369 CS42L42_M_HSBIAS_HIZ_MASK);
1370
1371 /* Check auto-detect status */
1372 if ((~masks[5]) & irq_params_table[5].mask) {
1373 if (stickies[5] & CS42L42_HSDET_AUTO_DONE_MASK) {
1374 cs42l42_process_hs_type_detect(cs42l42);
1375 dev_dbg(codec->dev,
1376 "Auto detect done (%d)\n",
1377 cs42l42->hs_type);
1378 }
1379 }
1380
1381 /* Check tip sense status */
1382 if ((~masks[11]) & irq_params_table[11].mask) {
1383 switch (current_plug_status) {
1384 case CS42L42_TS_PLUG:
1385 if (cs42l42->plug_state != CS42L42_TS_PLUG) {
1386 cs42l42->plug_state = CS42L42_TS_PLUG;
1387 cs42l42_init_hs_type_detect(cs42l42);
1388 }
1389 break;
1390
1391 case CS42L42_TS_UNPLUG:
1392 if (cs42l42->plug_state != CS42L42_TS_UNPLUG) {
1393 cs42l42->plug_state = CS42L42_TS_UNPLUG;
1394 cs42l42_cancel_hs_type_detect(cs42l42);
1395 dev_dbg(codec->dev,
1396 "Unplug event\n");
1397 }
1398 break;
1399
1400 default:
1401 if (cs42l42->plug_state != CS42L42_TS_TRANS)
1402 cs42l42->plug_state = CS42L42_TS_TRANS;
1403 }
1404 }
1405
1406 /* Check button detect status */
1407 if ((~masks[7]) & irq_params_table[7].mask) {
1408 if (!(current_button_status &
1409 CS42L42_M_HSBIAS_HIZ_MASK)) {
1410
1411 if (current_button_status &
1412 CS42L42_M_DETECT_TF_MASK) {
1413 dev_dbg(codec->dev,
1414 "Button released\n");
1415 } else if (current_button_status &
1416 CS42L42_M_DETECT_FT_MASK) {
1417 cs42l42_handle_button_press(cs42l42);
1418 }
1419 }
1420 }
1421
1422 return IRQ_HANDLED;
1423}
1424
1425static void cs42l42_set_interrupt_masks(struct cs42l42_private *cs42l42)
1426{
1427 regmap_update_bits(cs42l42->regmap, CS42L42_ADC_OVFL_INT_MASK,
1428 CS42L42_ADC_OVFL_MASK,
1429 (1 << CS42L42_ADC_OVFL_SHIFT));
1430
1431 regmap_update_bits(cs42l42->regmap, CS42L42_MIXER_INT_MASK,
1432 CS42L42_MIX_CHB_OVFL_MASK |
1433 CS42L42_MIX_CHA_OVFL_MASK |
1434 CS42L42_EQ_OVFL_MASK |
1435 CS42L42_EQ_BIQUAD_OVFL_MASK,
1436 (1 << CS42L42_MIX_CHB_OVFL_SHIFT) |
1437 (1 << CS42L42_MIX_CHA_OVFL_SHIFT) |
1438 (1 << CS42L42_EQ_OVFL_SHIFT) |
1439 (1 << CS42L42_EQ_BIQUAD_OVFL_SHIFT));
1440
1441 regmap_update_bits(cs42l42->regmap, CS42L42_SRC_INT_MASK,
1442 CS42L42_SRC_ILK_MASK |
1443 CS42L42_SRC_OLK_MASK |
1444 CS42L42_SRC_IUNLK_MASK |
1445 CS42L42_SRC_OUNLK_MASK,
1446 (1 << CS42L42_SRC_ILK_SHIFT) |
1447 (1 << CS42L42_SRC_OLK_SHIFT) |
1448 (1 << CS42L42_SRC_IUNLK_SHIFT) |
1449 (1 << CS42L42_SRC_OUNLK_SHIFT));
1450
1451 regmap_update_bits(cs42l42->regmap, CS42L42_ASP_RX_INT_MASK,
1452 CS42L42_ASPRX_NOLRCK_MASK |
1453 CS42L42_ASPRX_EARLY_MASK |
1454 CS42L42_ASPRX_LATE_MASK |
1455 CS42L42_ASPRX_ERROR_MASK |
1456 CS42L42_ASPRX_OVLD_MASK,
1457 (1 << CS42L42_ASPRX_NOLRCK_SHIFT) |
1458 (1 << CS42L42_ASPRX_EARLY_SHIFT) |
1459 (1 << CS42L42_ASPRX_LATE_SHIFT) |
1460 (1 << CS42L42_ASPRX_ERROR_SHIFT) |
1461 (1 << CS42L42_ASPRX_OVLD_SHIFT));
1462
1463 regmap_update_bits(cs42l42->regmap, CS42L42_ASP_TX_INT_MASK,
1464 CS42L42_ASPTX_NOLRCK_MASK |
1465 CS42L42_ASPTX_EARLY_MASK |
1466 CS42L42_ASPTX_LATE_MASK |
1467 CS42L42_ASPTX_SMERROR_MASK,
1468 (1 << CS42L42_ASPTX_NOLRCK_SHIFT) |
1469 (1 << CS42L42_ASPTX_EARLY_SHIFT) |
1470 (1 << CS42L42_ASPTX_LATE_SHIFT) |
1471 (1 << CS42L42_ASPTX_SMERROR_SHIFT));
1472
1473 regmap_update_bits(cs42l42->regmap, CS42L42_CODEC_INT_MASK,
1474 CS42L42_PDN_DONE_MASK |
1475 CS42L42_HSDET_AUTO_DONE_MASK,
1476 (1 << CS42L42_PDN_DONE_SHIFT) |
1477 (1 << CS42L42_HSDET_AUTO_DONE_SHIFT));
1478
1479 regmap_update_bits(cs42l42->regmap, CS42L42_SRCPL_INT_MASK,
1480 CS42L42_SRCPL_ADC_LK_MASK |
1481 CS42L42_SRCPL_DAC_LK_MASK |
1482 CS42L42_SRCPL_ADC_UNLK_MASK |
1483 CS42L42_SRCPL_DAC_UNLK_MASK,
1484 (1 << CS42L42_SRCPL_ADC_LK_SHIFT) |
1485 (1 << CS42L42_SRCPL_DAC_LK_SHIFT) |
1486 (1 << CS42L42_SRCPL_ADC_UNLK_SHIFT) |
1487 (1 << CS42L42_SRCPL_DAC_UNLK_SHIFT));
1488
1489 regmap_update_bits(cs42l42->regmap, CS42L42_DET_INT1_MASK,
1490 CS42L42_TIP_SENSE_UNPLUG_MASK |
1491 CS42L42_TIP_SENSE_PLUG_MASK |
1492 CS42L42_HSBIAS_SENSE_MASK,
1493 (1 << CS42L42_TIP_SENSE_UNPLUG_SHIFT) |
1494 (1 << CS42L42_TIP_SENSE_PLUG_SHIFT) |
1495 (1 << CS42L42_HSBIAS_SENSE_SHIFT));
1496
1497 regmap_update_bits(cs42l42->regmap, CS42L42_DET_INT2_MASK,
1498 CS42L42_M_DETECT_TF_MASK |
1499 CS42L42_M_DETECT_FT_MASK |
1500 CS42L42_M_HSBIAS_HIZ_MASK |
1501 CS42L42_M_SHORT_RLS_MASK |
1502 CS42L42_M_SHORT_DET_MASK,
1503 (1 << CS42L42_M_DETECT_TF_SHIFT) |
1504 (1 << CS42L42_M_DETECT_FT_SHIFT) |
1505 (1 << CS42L42_M_HSBIAS_HIZ_SHIFT) |
1506 (1 << CS42L42_M_SHORT_RLS_SHIFT) |
1507 (1 << CS42L42_M_SHORT_DET_SHIFT));
1508
1509 regmap_update_bits(cs42l42->regmap, CS42L42_VPMON_INT_MASK,
1510 CS42L42_VPMON_MASK,
1511 (1 << CS42L42_VPMON_SHIFT));
1512
1513 regmap_update_bits(cs42l42->regmap, CS42L42_PLL_LOCK_INT_MASK,
1514 CS42L42_PLL_LOCK_MASK,
1515 (1 << CS42L42_PLL_LOCK_SHIFT));
1516
1517 regmap_update_bits(cs42l42->regmap, CS42L42_TSRS_PLUG_INT_MASK,
1518 CS42L42_RS_PLUG_MASK |
1519 CS42L42_RS_UNPLUG_MASK |
1520 CS42L42_TS_PLUG_MASK |
1521 CS42L42_TS_UNPLUG_MASK,
1522 (1 << CS42L42_RS_PLUG_SHIFT) |
1523 (1 << CS42L42_RS_UNPLUG_SHIFT) |
1524 (0 << CS42L42_TS_PLUG_SHIFT) |
1525 (0 << CS42L42_TS_UNPLUG_SHIFT));
1526}
1527
1528static void cs42l42_setup_hs_type_detect(struct cs42l42_private *cs42l42)
1529{
1530 unsigned int reg;
1531
1532 cs42l42->hs_type = CS42L42_PLUG_INVALID;
1533
1534 /* Latch analog controls to VP power domain */
1535 regmap_update_bits(cs42l42->regmap, CS42L42_MIC_DET_CTL1,
1536 CS42L42_LATCH_TO_VP_MASK |
1537 CS42L42_EVENT_STAT_SEL_MASK |
1538 CS42L42_HS_DET_LEVEL_MASK,
1539 (1 << CS42L42_LATCH_TO_VP_SHIFT) |
1540 (0 << CS42L42_EVENT_STAT_SEL_SHIFT) |
1541 (cs42l42->bias_thresholds[0] <<
1542 CS42L42_HS_DET_LEVEL_SHIFT));
1543
1544 /* Remove ground noise-suppression clamps */
1545 regmap_update_bits(cs42l42->regmap,
1546 CS42L42_HS_CLAMP_DISABLE,
1547 CS42L42_HS_CLAMP_DISABLE_MASK,
1548 (1 << CS42L42_HS_CLAMP_DISABLE_SHIFT));
1549
1550 /* Enable the tip sense circuit */
1551 regmap_update_bits(cs42l42->regmap, CS42L42_TIPSENSE_CTL,
1552 CS42L42_TIP_SENSE_CTRL_MASK |
1553 CS42L42_TIP_SENSE_INV_MASK |
1554 CS42L42_TIP_SENSE_DEBOUNCE_MASK,
1555 (3 << CS42L42_TIP_SENSE_CTRL_SHIFT) |
1556 (0 << CS42L42_TIP_SENSE_INV_SHIFT) |
1557 (2 << CS42L42_TIP_SENSE_DEBOUNCE_SHIFT));
1558
1559 /* Save the initial status of the tip sense */
1560 regmap_read(cs42l42->regmap,
1561 CS42L42_TSRS_PLUG_STATUS,
1562 &reg);
1563 cs42l42->plug_state = (((char) reg) &
1564 (CS42L42_TS_PLUG_MASK | CS42L42_TS_UNPLUG_MASK)) >>
1565 CS42L42_TS_PLUG_SHIFT;
1566}
1567
1568static const unsigned int threshold_defaults[] = {
1569 CS42L42_HS_DET_LEVEL_15,
1570 CS42L42_HS_DET_LEVEL_8,
1571 CS42L42_HS_DET_LEVEL_4,
1572 CS42L42_HS_DET_LEVEL_1
1573};
1574
1575static int cs42l42_handle_device_data(struct i2c_client *i2c_client,
1576 struct cs42l42_private *cs42l42)
1577{
1578 struct device_node *np = i2c_client->dev.of_node;
1579 unsigned int val;
1580 unsigned int thresholds[CS42L42_NUM_BIASES];
1581 int ret;
1582 int i;
1583
1584 ret = of_property_read_u32(np, "cirrus,ts-inv", &val);
1585
1586 if (!ret) {
1587 switch (val) {
1588 case CS42L42_TS_INV_EN:
1589 case CS42L42_TS_INV_DIS:
1590 cs42l42->ts_inv = val;
1591 break;
1592 default:
1593 dev_err(&i2c_client->dev,
1594 "Wrong cirrus,ts-inv DT value %d\n",
1595 val);
1596 cs42l42->ts_inv = CS42L42_TS_INV_DIS;
1597 }
1598 } else {
1599 cs42l42->ts_inv = CS42L42_TS_INV_DIS;
1600 }
1601
1602 regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL,
1603 CS42L42_TS_INV_MASK,
1604 (cs42l42->ts_inv << CS42L42_TS_INV_SHIFT));
1605
1606 ret = of_property_read_u32(np, "cirrus,ts-dbnc-rise", &val);
1607
1608 if (!ret) {
1609 switch (val) {
1610 case CS42L42_TS_DBNCE_0:
1611 case CS42L42_TS_DBNCE_125:
1612 case CS42L42_TS_DBNCE_250:
1613 case CS42L42_TS_DBNCE_500:
1614 case CS42L42_TS_DBNCE_750:
1615 case CS42L42_TS_DBNCE_1000:
1616 case CS42L42_TS_DBNCE_1250:
1617 case CS42L42_TS_DBNCE_1500:
1618 cs42l42->ts_dbnc_rise = val;
1619 break;
1620 default:
1621 dev_err(&i2c_client->dev,
1622 "Wrong cirrus,ts-dbnc-rise DT value %d\n",
1623 val);
1624 cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000;
1625 }
1626 } else {
1627 cs42l42->ts_dbnc_rise = CS42L42_TS_DBNCE_1000;
1628 }
1629
1630 regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL,
1631 CS42L42_TS_RISE_DBNCE_TIME_MASK,
1632 (cs42l42->ts_dbnc_rise <<
1633 CS42L42_TS_RISE_DBNCE_TIME_SHIFT));
1634
1635 ret = of_property_read_u32(np, "cirrus,ts-dbnc-fall", &val);
1636
1637 if (!ret) {
1638 switch (val) {
1639 case CS42L42_TS_DBNCE_0:
1640 case CS42L42_TS_DBNCE_125:
1641 case CS42L42_TS_DBNCE_250:
1642 case CS42L42_TS_DBNCE_500:
1643 case CS42L42_TS_DBNCE_750:
1644 case CS42L42_TS_DBNCE_1000:
1645 case CS42L42_TS_DBNCE_1250:
1646 case CS42L42_TS_DBNCE_1500:
1647 cs42l42->ts_dbnc_fall = val;
1648 break;
1649 default:
1650 dev_err(&i2c_client->dev,
1651 "Wrong cirrus,ts-dbnc-fall DT value %d\n",
1652 val);
1653 cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0;
1654 }
1655 } else {
1656 cs42l42->ts_dbnc_fall = CS42L42_TS_DBNCE_0;
1657 }
1658
1659 regmap_update_bits(cs42l42->regmap, CS42L42_TSENSE_CTL,
1660 CS42L42_TS_FALL_DBNCE_TIME_MASK,
1661 (cs42l42->ts_dbnc_fall <<
1662 CS42L42_TS_FALL_DBNCE_TIME_SHIFT));
1663
1664 ret = of_property_read_u32(np, "cirrus,btn-det-init-dbnce", &val);
1665
1666 if (!ret) {
1667 if ((val >= CS42L42_BTN_DET_INIT_DBNCE_MIN) &&
1668 (val <= CS42L42_BTN_DET_INIT_DBNCE_MAX))
1669 cs42l42->btn_det_init_dbnce = val;
1670 else {
1671 dev_err(&i2c_client->dev,
1672 "Wrong cirrus,btn-det-init-dbnce DT value %d\n",
1673 val);
1674 cs42l42->btn_det_init_dbnce =
1675 CS42L42_BTN_DET_INIT_DBNCE_DEFAULT;
1676 }
1677 } else {
1678 cs42l42->btn_det_init_dbnce =
1679 CS42L42_BTN_DET_INIT_DBNCE_DEFAULT;
1680 }
1681
1682 ret = of_property_read_u32(np, "cirrus,btn-det-event-dbnce", &val);
1683
1684 if (!ret) {
1685 if ((val >= CS42L42_BTN_DET_EVENT_DBNCE_MIN) &&
1686 (val <= CS42L42_BTN_DET_EVENT_DBNCE_MAX))
1687 cs42l42->btn_det_event_dbnce = val;
1688 else {
1689 dev_err(&i2c_client->dev,
1690 "Wrong cirrus,btn-det-event-dbnce DT value %d\n", val);
1691 cs42l42->btn_det_event_dbnce =
1692 CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT;
1693 }
1694 } else {
1695 cs42l42->btn_det_event_dbnce =
1696 CS42L42_BTN_DET_EVENT_DBNCE_DEFAULT;
1697 }
1698
1699 ret = of_property_read_u32_array(np, "cirrus,bias-lvls",
1700 (u32 *)thresholds, CS42L42_NUM_BIASES);
1701
1702 if (!ret) {
1703 for (i = 0; i < CS42L42_NUM_BIASES; i++) {
1704 if ((thresholds[i] >= CS42L42_HS_DET_LEVEL_MIN) &&
1705 (thresholds[i] <= CS42L42_HS_DET_LEVEL_MAX))
1706 cs42l42->bias_thresholds[i] = thresholds[i];
1707 else {
1708 dev_err(&i2c_client->dev,
1709 "Wrong cirrus,bias-lvls[%d] DT value %d\n", i,
1710 thresholds[i]);
1711 cs42l42->bias_thresholds[i] =
1712 threshold_defaults[i];
1713 }
1714 }
1715 } else {
1716 for (i = 0; i < CS42L42_NUM_BIASES; i++)
1717 cs42l42->bias_thresholds[i] = threshold_defaults[i];
1718 }
1719
1720 ret = of_property_read_u32(np, "cirrus,hs-bias-ramp-rate", &val);
1721
1722 if (!ret) {
1723 switch (val) {
1724 case CS42L42_HSBIAS_RAMP_FAST_RISE_SLOW_FALL:
1725 cs42l42->hs_bias_ramp_rate = val;
1726 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME0;
1727 break;
1728 case CS42L42_HSBIAS_RAMP_FAST:
1729 cs42l42->hs_bias_ramp_rate = val;
1730 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME1;
1731 break;
1732 case CS42L42_HSBIAS_RAMP_SLOW:
1733 cs42l42->hs_bias_ramp_rate = val;
1734 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2;
1735 break;
1736 case CS42L42_HSBIAS_RAMP_SLOWEST:
1737 cs42l42->hs_bias_ramp_rate = val;
1738 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME3;
1739 break;
1740 default:
1741 dev_err(&i2c_client->dev,
1742 "Wrong cirrus,hs-bias-ramp-rate DT value %d\n",
1743 val);
1744 cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW;
1745 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2;
1746 }
1747 } else {
1748 cs42l42->hs_bias_ramp_rate = CS42L42_HSBIAS_RAMP_SLOW;
1749 cs42l42->hs_bias_ramp_time = CS42L42_HSBIAS_RAMP_TIME2;
1750 }
1751
1752 regmap_update_bits(cs42l42->regmap, CS42L42_HS_BIAS_CTL,
1753 CS42L42_HSBIAS_RAMP_MASK,
1754 (cs42l42->hs_bias_ramp_rate <<
1755 CS42L42_HSBIAS_RAMP_SHIFT));
1756
1757 return 0;
1758}
1759
1760static int cs42l42_i2c_probe(struct i2c_client *i2c_client,
1761 const struct i2c_device_id *id)
1762{
1763 struct cs42l42_private *cs42l42;
1764 int ret, i;
1765 unsigned int devid = 0;
1766 unsigned int reg;
1767
1768 cs42l42 = devm_kzalloc(&i2c_client->dev, sizeof(struct cs42l42_private),
1769 GFP_KERNEL);
1770 if (!cs42l42)
1771 return -ENOMEM;
1772
1773 i2c_set_clientdata(i2c_client, cs42l42);
1774
1775 cs42l42->regmap = devm_regmap_init_i2c(i2c_client, &cs42l42_regmap);
1776 if (IS_ERR(cs42l42->regmap)) {
1777 ret = PTR_ERR(cs42l42->regmap);
1778 dev_err(&i2c_client->dev, "regmap_init() failed: %d\n", ret);
1779 return ret;
1780 }
1781
1782 for (i = 0; i < ARRAY_SIZE(cs42l42->supplies); i++)
1783 cs42l42->supplies[i].supply = cs42l42_supply_names[i];
1784
1785 ret = devm_regulator_bulk_get(&i2c_client->dev,
1786 ARRAY_SIZE(cs42l42->supplies),
1787 cs42l42->supplies);
1788 if (ret != 0) {
1789 dev_err(&i2c_client->dev,
1790 "Failed to request supplies: %d\n", ret);
1791 return ret;
1792 }
1793
1794 ret = regulator_bulk_enable(ARRAY_SIZE(cs42l42->supplies),
1795 cs42l42->supplies);
1796 if (ret != 0) {
1797 dev_err(&i2c_client->dev,
1798 "Failed to enable supplies: %d\n", ret);
1799 return ret;
1800 }
1801
1802 /* Reset the Device */
1803 cs42l42->reset_gpio = devm_gpiod_get_optional(&i2c_client->dev,
1804 "reset", GPIOD_OUT_LOW);
1805 if (IS_ERR(cs42l42->reset_gpio))
1806 return PTR_ERR(cs42l42->reset_gpio);
1807
1808 if (cs42l42->reset_gpio) {
1809 dev_dbg(&i2c_client->dev, "Found reset GPIO\n");
1810 gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
1811 }
1812 mdelay(3);
1813
1814 /* Request IRQ */
1815 ret = devm_request_threaded_irq(&i2c_client->dev,
1816 i2c_client->irq,
1817 NULL, cs42l42_irq_thread,
1818 IRQF_ONESHOT | IRQF_TRIGGER_LOW,
1819 "cs42l42", cs42l42);
1820
1821 if (ret != 0)
1822 dev_err(&i2c_client->dev,
1823 "Failed to request IRQ: %d\n", ret);
1824
1825 /* initialize codec */
1826 ret = regmap_read(cs42l42->regmap, CS42L42_DEVID_AB, &reg);
1827 devid = (reg & 0xFF) << 12;
1828
1829 ret = regmap_read(cs42l42->regmap, CS42L42_DEVID_CD, &reg);
1830 devid |= (reg & 0xFF) << 4;
1831
1832 ret = regmap_read(cs42l42->regmap, CS42L42_DEVID_E, &reg);
1833 devid |= (reg & 0xF0) >> 4;
1834
1835 if (devid != CS42L42_CHIP_ID) {
1836 ret = -ENODEV;
1837 dev_err(&i2c_client->dev,
1838 "CS42L42 Device ID (%X). Expected %X\n",
1839 devid, CS42L42_CHIP_ID);
1840 return ret;
1841 }
1842
1843 ret = regmap_read(cs42l42->regmap, CS42L42_REVID, &reg);
1844 if (ret < 0) {
1845 dev_err(&i2c_client->dev, "Get Revision ID failed\n");
1846 return ret;
1847 }
1848
1849 dev_info(&i2c_client->dev,
1850 "Cirrus Logic CS42L42, Revision: %02X\n", reg & 0xFF);
1851
1852 /* Power up the codec */
1853 regmap_update_bits(cs42l42->regmap, CS42L42_PWR_CTL1,
1854 CS42L42_ASP_DAO_PDN_MASK |
1855 CS42L42_ASP_DAI_PDN_MASK |
1856 CS42L42_MIXER_PDN_MASK |
1857 CS42L42_EQ_PDN_MASK |
1858 CS42L42_HP_PDN_MASK |
1859 CS42L42_ADC_PDN_MASK |
1860 CS42L42_PDN_ALL_MASK,
1861 (1 << CS42L42_ASP_DAO_PDN_SHIFT) |
1862 (1 << CS42L42_ASP_DAI_PDN_SHIFT) |
1863 (1 << CS42L42_MIXER_PDN_SHIFT) |
1864 (1 << CS42L42_EQ_PDN_SHIFT) |
1865 (1 << CS42L42_HP_PDN_SHIFT) |
1866 (1 << CS42L42_ADC_PDN_SHIFT) |
1867 (0 << CS42L42_PDN_ALL_SHIFT));
1868
1869 if (i2c_client->dev.of_node) {
1870 ret = cs42l42_handle_device_data(i2c_client, cs42l42);
1871 if (ret != 0)
1872 return ret;
1873 }
1874
1875 /* Setup headset detection */
1876 cs42l42_setup_hs_type_detect(cs42l42);
1877
1878 /* Mask/Unmask Interrupts */
1879 cs42l42_set_interrupt_masks(cs42l42);
1880
1881 /* Register codec for machine driver */
1882 ret = snd_soc_register_codec(&i2c_client->dev,
1883 &soc_codec_dev_cs42l42, &cs42l42_dai, 1);
1884 if (ret < 0)
1885 goto err_disable;
1886 return 0;
1887
1888err_disable:
1889 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies),
1890 cs42l42->supplies);
1891 return ret;
1892}
1893
1894static int cs42l42_i2c_remove(struct i2c_client *i2c_client)
1895{
1896 struct cs42l42_private *cs42l42 = i2c_get_clientdata(i2c_client);
1897
1898 snd_soc_unregister_codec(&i2c_client->dev);
1899
1900 /* Hold down reset */
1901 if (cs42l42->reset_gpio)
1902 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
1903
1904 return 0;
1905}
1906
1907#ifdef CONFIG_PM
1908static int cs42l42_runtime_suspend(struct device *dev)
1909{
1910 struct cs42l42_private *cs42l42 = dev_get_drvdata(dev);
1911
1912 regcache_cache_only(cs42l42->regmap, true);
1913 regcache_mark_dirty(cs42l42->regmap);
1914
1915 /* Hold down reset */
1916 if (cs42l42->reset_gpio)
1917 gpiod_set_value_cansleep(cs42l42->reset_gpio, 0);
1918
1919 /* remove power */
1920 regulator_bulk_disable(ARRAY_SIZE(cs42l42->supplies),
1921 cs42l42->supplies);
1922
1923 return 0;
1924}
1925
1926static int cs42l42_runtime_resume(struct device *dev)
1927{
1928 struct cs42l42_private *cs42l42 = dev_get_drvdata(dev);
1929 int ret;
1930
1931 /* Enable power */
1932 ret = regulator_bulk_enable(ARRAY_SIZE(cs42l42->supplies),
1933 cs42l42->supplies);
1934 if (ret != 0) {
1935 dev_err(dev, "Failed to enable supplies: %d\n",
1936 ret);
1937 return ret;
1938 }
1939
1940 if (cs42l42->reset_gpio)
1941 gpiod_set_value_cansleep(cs42l42->reset_gpio, 1);
1942
1943 regcache_cache_only(cs42l42->regmap, false);
1944 regcache_sync(cs42l42->regmap);
1945
1946 return 0;
1947}
1948#endif
1949
1950static const struct dev_pm_ops cs42l42_runtime_pm = {
1951 SET_RUNTIME_PM_OPS(cs42l42_runtime_suspend, cs42l42_runtime_resume,
1952 NULL)
1953};
1954
1955static const struct of_device_id cs42l42_of_match[] = {
1956 { .compatible = "cirrus,cs42l42", },
1957 {},
1958};
1959MODULE_DEVICE_TABLE(of, cs42l42_of_match);
1960
1961
1962static const struct i2c_device_id cs42l42_id[] = {
1963 {"cs42l42", 0},
1964 {}
1965};
1966
1967MODULE_DEVICE_TABLE(i2c, cs42l42_id);
1968
1969static struct i2c_driver cs42l42_i2c_driver = {
1970 .driver = {
1971 .name = "cs42l42",
1972 .pm = &cs42l42_runtime_pm,
1973 .of_match_table = cs42l42_of_match,
1974 },
1975 .id_table = cs42l42_id,
1976 .probe = cs42l42_i2c_probe,
1977 .remove = cs42l42_i2c_remove,
1978};
1979
1980module_i2c_driver(cs42l42_i2c_driver);
1981
1982MODULE_DESCRIPTION("ASoC CS42L42 driver");
1983MODULE_AUTHOR("James Schulman, Cirrus Logic Inc, <james.schulman@cirrus.com>");
1984MODULE_AUTHOR("Brian Austin, Cirrus Logic Inc, <brian.austin@cirrus.com>");
1985MODULE_AUTHOR("Michael White, Cirrus Logic Inc, <michael.white@cirrus.com>");
1986MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h
new file mode 100644
index 000000000000..d87a0a5322d5
--- /dev/null
+++ b/sound/soc/codecs/cs42l42.h
@@ -0,0 +1,776 @@
1/*
2 * cs42l42.h -- CS42L42 ALSA SoC audio driver header
3 *
4 * Copyright 2016 Cirrus Logic, Inc.
5 *
6 * Author: James Schulman <james.schulman@cirrus.com>
7 * Author: Brian Austin <brian.austin@cirrus.com>
8 * Author: Michael White <michael.white@cirrus.com>
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 *
14 */
15
16#ifndef __CS42L42_H__
17#define __CS42L42_H__
18
19#define CS42L42_PAGE_REGISTER 0x00 /* Page Select Register */
20#define CS42L42_WIN_START 0x00
21#define CS42L42_WIN_LEN 0x100
22#define CS42L42_RANGE_MIN 0x00
23#define CS42L42_RANGE_MAX 0x7F
24
25#define CS42L42_PAGE_10 0x1000
26#define CS42L42_PAGE_11 0x1100
27#define CS42L42_PAGE_12 0x1200
28#define CS42L42_PAGE_13 0x1300
29#define CS42L42_PAGE_15 0x1500
30#define CS42L42_PAGE_19 0x1900
31#define CS42L42_PAGE_1B 0x1B00
32#define CS42L42_PAGE_1C 0x1C00
33#define CS42L42_PAGE_1D 0x1D00
34#define CS42L42_PAGE_1F 0x1F00
35#define CS42L42_PAGE_20 0x2000
36#define CS42L42_PAGE_21 0x2100
37#define CS42L42_PAGE_23 0x2300
38#define CS42L42_PAGE_24 0x2400
39#define CS42L42_PAGE_25 0x2500
40#define CS42L42_PAGE_26 0x2600
41#define CS42L42_PAGE_28 0x2800
42#define CS42L42_PAGE_29 0x2900
43#define CS42L42_PAGE_2A 0x2A00
44#define CS42L42_PAGE_30 0x3000
45
46#define CS42L42_CHIP_ID 0x42A42
47
48/* Page 0x10 Global Registers */
49#define CS42L42_DEVID_AB (CS42L42_PAGE_10 + 0x01)
50#define CS42L42_DEVID_CD (CS42L42_PAGE_10 + 0x02)
51#define CS42L42_DEVID_E (CS42L42_PAGE_10 + 0x03)
52#define CS42L42_FABID (CS42L42_PAGE_10 + 0x04)
53#define CS42L42_REVID (CS42L42_PAGE_10 + 0x05)
54#define CS42L42_FRZ_CTL (CS42L42_PAGE_10 + 0x06)
55
56#define CS42L42_SRC_CTL (CS42L42_PAGE_10 + 0x07)
57#define CS42L42_SRC_BYPASS_DAC_SHIFT 1
58#define CS42L42_SRC_BYPASS_DAC_MASK (1 << CS42L42_SRC_BYPASS_DAC_SHIFT)
59
60#define CS42L42_MCLK_STATUS (CS42L42_PAGE_10 + 0x08)
61
62#define CS42L42_MCLK_CTL (CS42L42_PAGE_10 + 0x09)
63#define CS42L42_INTERNAL_FS_SHIFT 1
64#define CS42L42_INTERNAL_FS_MASK (1 << CS42L42_INTERNAL_FS_SHIFT)
65
66#define CS42L42_SFTRAMP_RATE (CS42L42_PAGE_10 + 0x0A)
67#define CS42L42_I2C_DEBOUNCE (CS42L42_PAGE_10 + 0x0E)
68#define CS42L42_I2C_STRETCH (CS42L42_PAGE_10 + 0x0F)
69#define CS42L42_I2C_TIMEOUT (CS42L42_PAGE_10 + 0x10)
70
71/* Page 0x11 Power and Headset Detect Registers */
72#define CS42L42_PWR_CTL1 (CS42L42_PAGE_11 + 0x01)
73#define CS42L42_ASP_DAO_PDN_SHIFT 7
74#define CS42L42_ASP_DAO_PDN_MASK (1 << CS42L42_ASP_DAO_PDN_SHIFT)
75#define CS42L42_ASP_DAI_PDN_SHIFT 6
76#define CS42L42_ASP_DAI_PDN_MASK (1 << CS42L42_ASP_DAI_PDN_SHIFT)
77#define CS42L42_MIXER_PDN_SHIFT 5
78#define CS42L42_MIXER_PDN_MASK (1 << CS42L42_MIXER_PDN_SHIFT)
79#define CS42L42_EQ_PDN_SHIFT 4
80#define CS42L42_EQ_PDN_MASK (1 << CS42L42_EQ_PDN_SHIFT)
81#define CS42L42_HP_PDN_SHIFT 3
82#define CS42L42_HP_PDN_MASK (1 << CS42L42_HP_PDN_SHIFT)
83#define CS42L42_ADC_PDN_SHIFT 2
84#define CS42L42_ADC_PDN_MASK (1 << CS42L42_HP_PDN_SHIFT)
85#define CS42L42_PDN_ALL_SHIFT 0
86#define CS42L42_PDN_ALL_MASK (1 << CS42L42_PDN_ALL_SHIFT)
87
88#define CS42L42_PWR_CTL2 (CS42L42_PAGE_11 + 0x02)
89#define CS42L42_ADC_SRC_PDNB_SHIFT 0
90#define CS42L42_ADC_SRC_PDNB_MASK (1 << CS42L42_ADC_SRC_PDNB_SHIFT)
91#define CS42L42_DAC_SRC_PDNB_SHIFT 1
92#define CS42L42_DAC_SRC_PDNB_MASK (1 << CS42L42_DAC_SRC_PDNB_SHIFT)
93#define CS42L42_ASP_DAI1_PDN_SHIFT 2
94#define CS42L42_ASP_DAI1_PDN_MASK (1 << CS42L42_ASP_DAI1_PDN_SHIFT)
95#define CS42L42_SRC_PDN_OVERRIDE_SHIFT 3
96#define CS42L42_SRC_PDN_OVERRIDE_MASK (1 << CS42L42_SRC_PDN_OVERRIDE_SHIFT)
97#define CS42L42_DISCHARGE_FILT_SHIFT 4
98#define CS42L42_DISCHARGE_FILT_MASK (1 << CS42L42_DISCHARGE_FILT_SHIFT)
99
100#define CS42L42_PWR_CTL3 (CS42L42_PAGE_11 + 0x03)
101#define CS42L42_RING_SENSE_PDNB_SHIFT 1
102#define CS42L42_RING_SENSE_PDNB_MASK (1 << \
103 CS42L42_RING_SENSE_PDNB_SHIFT)
104#define CS42L42_VPMON_PDNB_SHIFT 2
105#define CS42L42_VPMON_PDNB_MASK (1 << \
106 CS42L42_VPMON_PDNB_SHIFT)
107#define CS42L42_SW_CLK_STP_STAT_SEL_SHIFT 5
108#define CS42L42_SW_CLK_STP_STAT_SEL_MASK (3 << \
109 CS42L42_SW_CLK_STP_STAT_SEL_SHIFT)
110
111#define CS42L42_RSENSE_CTL1 (CS42L42_PAGE_11 + 0x04)
112#define CS42L42_RS_TRIM_R_SHIFT 0
113#define CS42L42_RS_TRIM_R_MASK (1 << \
114 CS42L42_RS_TRIM_R_SHIFT)
115#define CS42L42_RS_TRIM_T_SHIFT 1
116#define CS42L42_RS_TRIM_T_MASK (1 << \
117 CS42L42_RS_TRIM_T_SHIFT)
118#define CS42L42_HPREF_RS_SHIFT 2
119#define CS42L42_HPREF_RS_MASK (1 << \
120 CS42L42_HPREF_RS_SHIFT)
121#define CS42L42_HSBIAS_FILT_REF_RS_SHIFT 3
122#define CS42L42_HSBIAS_FILT_REF_RS_MASK (1 << \
123 CS42L42_HSBIAS_FILT_REF_RS_SHIFT)
124#define CS42L42_RING_SENSE_PU_HIZ_SHIFT 6
125#define CS42L42_RING_SENSE_PU_HIZ_MASK (1 << \
126 CS42L42_RING_SENSE_PU_HIZ_SHIFT)
127
128#define CS42L42_RSENSE_CTL2 (CS42L42_PAGE_11 + 0x05)
129#define CS42L42_TS_RS_GATE_SHIFT 7
130#define CS42L42_TS_RS_GATE_MAS (1 << CS42L42_TS_RS_GATE_SHIFT)
131
132#define CS42L42_OSC_SWITCH (CS42L42_PAGE_11 + 0x07)
133#define CS42L42_SCLK_PRESENT_SHIFT 0
134#define CS42L42_SCLK_PRESENT_MASK (1 << CS42L42_SCLK_PRESENT_SHIFT)
135
136#define CS42L42_OSC_SWITCH_STATUS (CS42L42_PAGE_11 + 0x09)
137#define CS42L42_OSC_SW_SEL_STAT_SHIFT 0
138#define CS42L42_OSC_SW_SEL_STAT_MASK (3 << CS42L42_OSC_SW_SEL_STAT_SHIFT)
139#define CS42L42_OSC_PDNB_STAT_SHIFT 2
140#define CS42L42_OSC_PDNB_STAT_MASK (1 << CS42L42_OSC_SW_SEL_STAT_SHIFT)
141
142#define CS42L42_RSENSE_CTL3 (CS42L42_PAGE_11 + 0x12)
143#define CS42L42_RS_RISE_DBNCE_TIME_SHIFT 0
144#define CS42L42_RS_RISE_DBNCE_TIME_MASK (7 << \
145 CS42L42_RS_RISE_DBNCE_TIME_SHIFT)
146#define CS42L42_RS_FALL_DBNCE_TIME_SHIFT 3
147#define CS42L42_RS_FALL_DBNCE_TIME_MASK (7 << \
148 CS42L42_RS_FALL_DBNCE_TIME_SHIFT)
149#define CS42L42_RS_PU_EN_SHIFT 6
150#define CS42L42_RS_PU_EN_MASK (1 << \
151 CS42L42_RS_PU_EN_SHIFT)
152#define CS42L42_RS_INV_SHIFT 7
153#define CS42L42_RS_INV_MASK (1 << \
154 CS42L42_RS_INV_SHIFT)
155
156#define CS42L42_TSENSE_CTL (CS42L42_PAGE_11 + 0x13)
157#define CS42L42_TS_RISE_DBNCE_TIME_SHIFT 0
158#define CS42L42_TS_RISE_DBNCE_TIME_MASK (7 << \
159 CS42L42_TS_RISE_DBNCE_TIME_SHIFT)
160#define CS42L42_TS_FALL_DBNCE_TIME_SHIFT 3
161#define CS42L42_TS_FALL_DBNCE_TIME_MASK (7 << \
162 CS42L42_TS_FALL_DBNCE_TIME_SHIFT)
163#define CS42L42_TS_INV_SHIFT 7
164#define CS42L42_TS_INV_MASK (1 << \
165 CS42L42_TS_INV_SHIFT)
166
167#define CS42L42_TSRS_INT_DISABLE (CS42L42_PAGE_11 + 0x14)
168#define CS42L42_D_RS_PLUG_DBNC_SHIFT 0
169#define CS42L42_D_RS_PLUG_DBNC_MASK (1 << CS42L42_D_RS_PLUG_DBNC_SHIFT)
170#define CS42L42_D_RS_UNPLUG_DBNC_SHIFT 1
171#define CS42L42_D_RS_UNPLUG_DBNC_MASK (1 << CS42L42_D_RS_UNPLUG_DBNC_SHIFT)
172#define CS42L42_D_TS_PLUG_DBNC_SHIFT 2
173#define CS42L42_D_TS_PLUG_DBNC_MASK (1 << CS42L42_D_TS_PLUG_DBNC_SHIFT)
174#define CS42L42_D_TS_UNPLUG_DBNC_SHIFT 3
175#define CS42L42_D_TS_UNPLUG_DBNC_MASK (1 << CS42L42_D_TS_UNPLUG_DBNC_SHIFT)
176
177#define CS42L42_TRSENSE_STATUS (CS42L42_PAGE_11 + 0x15)
178#define CS42L42_RS_PLUG_DBNC_SHIFT 0
179#define CS42L42_RS_PLUG_DBNC_MASK (1 << CS42L42_RS_PLUG_DBNC_SHIFT)
180#define CS42L42_RS_UNPLUG_DBNC_SHIFT 1
181#define CS42L42_RS_UNPLUG_DBNC_MASK (1 << CS42L42_RS_UNPLUG_DBNC_SHIFT)
182#define CS42L42_TS_PLUG_DBNC_SHIFT 2
183#define CS42L42_TS_PLUG_DBNC_MASK (1 << CS42L42_TS_PLUG_DBNC_SHIFT)
184#define CS42L42_TS_UNPLUG_DBNC_SHIFT 3
185#define CS42L42_TS_UNPLUG_DBNC_MASK (1 << CS42L42_TS_UNPLUG_DBNC_SHIFT)
186
187#define CS42L42_HSDET_CTL1 (CS42L42_PAGE_11 + 0x1F)
188#define CS42L42_HSDET_COMP1_LVL_SHIFT 0
189#define CS42L42_HSDET_COMP1_LVL_MASK (15 << CS42L42_HSDET_COMP1_LVL_SHIFT)
190#define CS42L42_HSDET_COMP2_LVL_SHIFT 4
191#define CS42L42_HSDET_COMP2_LVL_MASK (15 << CS42L42_HSDET_COMP2_LVL_SHIFT)
192
193#define CS42L42_HSDET_CTL2 (CS42L42_PAGE_11 + 0x20)
194#define CS42L42_HSDET_AUTO_TIME_SHIFT 0
195#define CS42L42_HSDET_AUTO_TIME_MASK (3 << CS42L42_HSDET_AUTO_TIME_SHIFT)
196#define CS42L42_HSBIAS_REF_SHIFT 3
197#define CS42L42_HSBIAS_REF_MASK (1 << CS42L42_HSBIAS_REF_SHIFT)
198#define CS42L42_HSDET_SET_SHIFT 4
199#define CS42L42_HSDET_SET_MASK (3 << CS42L42_HSDET_SET_SHIFT)
200#define CS42L42_HSDET_CTRL_SHIFT 6
201#define CS42L42_HSDET_CTRL_MASK (3 << CS42L42_HSDET_CTRL_SHIFT)
202
203#define CS42L42_HS_SWITCH_CTL (CS42L42_PAGE_11 + 0x21)
204#define CS42L42_SW_GNDHS_HS4_SHIFT 0
205#define CS42L42_SW_GNDHS_HS4_MASK (1 << CS42L42_SW_GNDHS_HS4_SHIFT)
206#define CS42L42_SW_GNDHS_HS3_SHIFT 1
207#define CS42L42_SW_GNDHS_HS3_MASK (1 << CS42L42_SW_GNDHS_HS3_SHIFT)
208#define CS42L42_SW_HSB_HS4_SHIFT 2
209#define CS42L42_SW_HSB_HS4_MASK (1 << CS42L42_SW_HSB_HS4_SHIFT)
210#define CS42L42_SW_HSB_HS3_SHIFT 3
211#define CS42L42_SW_HSB_HS3_MASK (1 << CS42L42_SW_HSB_HS3_SHIFT)
212#define CS42L42_SW_HSB_FILT_HS4_SHIFT 4
213#define CS42L42_SW_HSB_FILT_HS4_MASK (1 << CS42L42_SW_HSB_FILT_HS4_SHIFT)
214#define CS42L42_SW_HSB_FILT_HS3_SHIFT 5
215#define CS42L42_SW_HSB_FILT_HS3_MASK (1 << CS42L42_SW_HSB_FILT_HS3_SHIFT)
216#define CS42L42_SW_REF_HS4_SHIFT 6
217#define CS42L42_SW_REF_HS4_MASK (1 << CS42L42_SW_REF_HS4_SHIFT)
218#define CS42L42_SW_REF_HS3_SHIFT 7
219#define CS42L42_SW_REF_HS3_MASK (1 << CS42L42_SW_REF_HS3_SHIFT)
220
221#define CS42L42_HS_DET_STATUS (CS42L42_PAGE_11 + 0x24)
222#define CS42L42_HSDET_TYPE_SHIFT 0
223#define CS42L42_HSDET_TYPE_MASK (3 << CS42L42_HSDET_TYPE_SHIFT)
224#define CS42L42_HSDET_COMP1_OUT_SHIFT 6
225#define CS42L42_HSDET_COMP1_OUT_MASK (1 << CS42L42_HSDET_COMP1_OUT_SHIFT)
226#define CS42L42_HSDET_COMP2_OUT_SHIFT 7
227#define CS42L42_HSDET_COMP2_OUT_MASK (1 << CS42L42_HSDET_COMP2_OUT_SHIFT)
228#define CS42L42_PLUG_CTIA 0
229#define CS42L42_PLUG_OMTP 1
230#define CS42L42_PLUG_HEADPHONE 2
231#define CS42L42_PLUG_INVALID 3
232
233#define CS42L42_HS_CLAMP_DISABLE (CS42L42_PAGE_11 + 0x29)
234#define CS42L42_HS_CLAMP_DISABLE_SHIFT 0
235#define CS42L42_HS_CLAMP_DISABLE_MASK (1 << CS42L42_HS_CLAMP_DISABLE_SHIFT)
236
237/* Page 0x12 Clocking Registers */
238#define CS42L42_MCLK_SRC_SEL (CS42L42_PAGE_12 + 0x01)
239#define CS42L42_MCLKDIV_SHIFT 1
240#define CS42L42_MCLKDIV_MASK (1 << CS42L42_MCLKDIV_SHIFT)
241#define CS42L42_MCLK_SRC_SEL_SHIFT 0
242#define CS42L42_MCLK_SRC_SEL_MASK (1 << CS42L42_MCLK_SRC_SEL_SHIFT)
243
244#define CS42L42_SPDIF_CLK_CFG (CS42L42_PAGE_12 + 0x02)
245#define CS42L42_FSYNC_PW_LOWER (CS42L42_PAGE_12 + 0x03)
246
247#define CS42L42_FSYNC_PW_UPPER (CS42L42_PAGE_12 + 0x04)
248#define CS42L42_FSYNC_PULSE_WIDTH_SHIFT 0
249#define CS42L42_FSYNC_PULSE_WIDTH_MASK (0xff << \
250 CS42L42_FSYNC_PULSE_WIDTH_SHIFT)
251
252#define CS42L42_FSYNC_P_LOWER (CS42L42_PAGE_12 + 0x05)
253
254#define CS42L42_FSYNC_P_UPPER (CS42L42_PAGE_12 + 0x06)
255#define CS42L42_FSYNC_PERIOD_SHIFT 0
256#define CS42L42_FSYNC_PERIOD_MASK (0xff << CS42L42_FSYNC_PERIOD_SHIFT)
257
258#define CS42L42_ASP_CLK_CFG (CS42L42_PAGE_12 + 0x07)
259#define CS42L42_ASP_SCLK_EN_SHIFT 5
260#define CS42L42_ASP_SCLK_EN_MASK (1 << CS42L42_ASP_SCLK_EN_SHIFT)
261#define CS42L42_ASP_MASTER_MODE 0x01
262#define CS42L42_ASP_SLAVE_MODE 0x00
263#define CS42L42_ASP_MODE_SHIFT 4
264#define CS42L42_ASP_MODE_MASK (1 << CS42L42_ASP_MODE_SHIFT)
265#define CS42L42_ASP_SCPOL_IN_DAC_SHIFT 2
266#define CS42L42_ASP_SCPOL_IN_DAC_MASK (1 << CS42L42_ASP_SCPOL_IN_DAC_SHIFT)
267#define CS42L42_ASP_LCPOL_IN_SHIFT 0
268#define CS42L42_ASP_LCPOL_IN_MASK (1 << CS42L42_ASP_LCPOL_IN_SHIFT)
269#define CS42L42_ASP_POL_INV 1
270
271#define CS42L42_ASP_FRM_CFG (CS42L42_PAGE_12 + 0x08)
272#define CS42L42_ASP_STP_SHIFT 4
273#define CS42L42_ASP_STP_MASK (1 << CS42L42_ASP_STP_SHIFT)
274#define CS42L42_ASP_5050_SHIFT 3
275#define CS42L42_ASP_5050_MASK (1 << CS42L42_ASP_5050_SHIFT)
276#define CS42L42_ASP_FSD_SHIFT 0
277#define CS42L42_ASP_FSD_MASK (7 << CS42L42_ASP_FSD_SHIFT)
278#define CS42L42_ASP_FSD_0_5 1
279#define CS42L42_ASP_FSD_1_0 2
280#define CS42L42_ASP_FSD_1_5 3
281#define CS42L42_ASP_FSD_2_0 4
282
283#define CS42L42_FS_RATE_EN (CS42L42_PAGE_12 + 0x09)
284#define CS42L42_FS_EN_SHIFT 0
285#define CS42L42_FS_EN_MASK (0xf << CS42L42_FS_EN_SHIFT)
286#define CS42L42_FS_EN_IASRC_96K 0x1
287#define CS42L42_FS_EN_OASRC_96K 0x2
288
289#define CS42L42_IN_ASRC_CLK (CS42L42_PAGE_12 + 0x0A)
290#define CS42L42_CLK_IASRC_SEL_SHIFT 0
291#define CS42L42_CLK_IASRC_SEL_MASK (1 << CS42L42_CLK_IASRC_SEL_SHIFT)
292#define CS42L42_CLK_IASRC_SEL_12 1
293
294#define CS42L42_OUT_ASRC_CLK (CS42L42_PAGE_12 + 0x0B)
295#define CS42L42_CLK_OASRC_SEL_SHIFT 0
296#define CS42L42_CLK_OASRC_SEL_MASK (1 << CS42L42_CLK_OASRC_SEL_SHIFT)
297#define CS42L42_CLK_OASRC_SEL_12 1
298
299#define CS42L42_PLL_DIV_CFG1 (CS42L42_PAGE_12 + 0x0C)
300#define CS42L42_SCLK_PREDIV_SHIFT 0
301#define CS42L42_SCLK_PREDIV_MASK (3 << CS42L42_SCLK_PREDIV_SHIFT)
302
303/* Page 0x13 Interrupt Registers */
304/* Interrupts */
305#define CS42L42_ADC_OVFL_STATUS (CS42L42_PAGE_13 + 0x01)
306#define CS42L42_MIXER_STATUS (CS42L42_PAGE_13 + 0x02)
307#define CS42L42_SRC_STATUS (CS42L42_PAGE_13 + 0x03)
308#define CS42L42_ASP_RX_STATUS (CS42L42_PAGE_13 + 0x04)
309#define CS42L42_ASP_TX_STATUS (CS42L42_PAGE_13 + 0x05)
310#define CS42L42_CODEC_STATUS (CS42L42_PAGE_13 + 0x08)
311#define CS42L42_DET_INT_STATUS1 (CS42L42_PAGE_13 + 0x09)
312#define CS42L42_DET_INT_STATUS2 (CS42L42_PAGE_13 + 0x0A)
313#define CS42L42_SRCPL_INT_STATUS (CS42L42_PAGE_13 + 0x0B)
314#define CS42L42_VPMON_STATUS (CS42L42_PAGE_13 + 0x0D)
315#define CS42L42_PLL_LOCK_STATUS (CS42L42_PAGE_13 + 0x0E)
316#define CS42L42_TSRS_PLUG_STATUS (CS42L42_PAGE_13 + 0x0F)
317/* Masks */
318#define CS42L42_ADC_OVFL_INT_MASK (CS42L42_PAGE_13 + 0x16)
319#define CS42L42_ADC_OVFL_SHIFT 0
320#define CS42L42_ADC_OVFL_MASK (1 << CS42L42_ADC_OVFL_SHIFT)
321#define CS42L42_ADC_OVFL_VAL_MASK CS42L42_ADC_OVFL_MASK
322
323#define CS42L42_MIXER_INT_MASK (CS42L42_PAGE_13 + 0x17)
324#define CS42L42_MIX_CHB_OVFL_SHIFT 0
325#define CS42L42_MIX_CHB_OVFL_MASK (1 << CS42L42_MIX_CHB_OVFL_SHIFT)
326#define CS42L42_MIX_CHA_OVFL_SHIFT 1
327#define CS42L42_MIX_CHA_OVFL_MASK (1 << CS42L42_MIX_CHA_OVFL_SHIFT)
328#define CS42L42_EQ_OVFL_SHIFT 2
329#define CS42L42_EQ_OVFL_MASK (1 << CS42L42_EQ_OVFL_SHIFT)
330#define CS42L42_EQ_BIQUAD_OVFL_SHIFT 3
331#define CS42L42_EQ_BIQUAD_OVFL_MASK (1 << CS42L42_EQ_BIQUAD_OVFL_SHIFT)
332#define CS42L42_MIXER_VAL_MASK (CS42L42_MIX_CHB_OVFL_MASK | \
333 CS42L42_MIX_CHA_OVFL_MASK | \
334 CS42L42_EQ_OVFL_MASK | \
335 CS42L42_EQ_BIQUAD_OVFL_MASK)
336
337#define CS42L42_SRC_INT_MASK (CS42L42_PAGE_13 + 0x18)
338#define CS42L42_SRC_ILK_SHIFT 0
339#define CS42L42_SRC_ILK_MASK (1 << CS42L42_SRC_ILK_SHIFT)
340#define CS42L42_SRC_OLK_SHIFT 1
341#define CS42L42_SRC_OLK_MASK (1 << CS42L42_SRC_OLK_SHIFT)
342#define CS42L42_SRC_IUNLK_SHIFT 2
343#define CS42L42_SRC_IUNLK_MASK (1 << CS42L42_SRC_IUNLK_SHIFT)
344#define CS42L42_SRC_OUNLK_SHIFT 3
345#define CS42L42_SRC_OUNLK_MASK (1 << CS42L42_SRC_OUNLK_SHIFT)
346#define CS42L42_SRC_VAL_MASK (CS42L42_SRC_ILK_MASK | \
347 CS42L42_SRC_OLK_MASK | \
348 CS42L42_SRC_IUNLK_MASK | \
349 CS42L42_SRC_OUNLK_MASK)
350
351#define CS42L42_ASP_RX_INT_MASK (CS42L42_PAGE_13 + 0x19)
352#define CS42L42_ASPRX_NOLRCK_SHIFT 0
353#define CS42L42_ASPRX_NOLRCK_MASK (1 << CS42L42_ASPRX_NOLRCK_SHIFT)
354#define CS42L42_ASPRX_EARLY_SHIFT 1
355#define CS42L42_ASPRX_EARLY_MASK (1 << CS42L42_ASPRX_EARLY_SHIFT)
356#define CS42L42_ASPRX_LATE_SHIFT 2
357#define CS42L42_ASPRX_LATE_MASK (1 << CS42L42_ASPRX_LATE_SHIFT)
358#define CS42L42_ASPRX_ERROR_SHIFT 3
359#define CS42L42_ASPRX_ERROR_MASK (1 << CS42L42_ASPRX_ERROR_SHIFT)
360#define CS42L42_ASPRX_OVLD_SHIFT 4
361#define CS42L42_ASPRX_OVLD_MASK (1 << CS42L42_ASPRX_OVLD_SHIFT)
362#define CS42L42_ASP_RX_VAL_MASK (CS42L42_ASPRX_NOLRCK_MASK | \
363 CS42L42_ASPRX_EARLY_MASK | \
364 CS42L42_ASPRX_LATE_MASK | \
365 CS42L42_ASPRX_ERROR_MASK | \
366 CS42L42_ASPRX_OVLD_MASK)
367
368#define CS42L42_ASP_TX_INT_MASK (CS42L42_PAGE_13 + 0x1A)
369#define CS42L42_ASPTX_NOLRCK_SHIFT 0
370#define CS42L42_ASPTX_NOLRCK_MASK (1 << CS42L42_ASPTX_NOLRCK_SHIFT)
371#define CS42L42_ASPTX_EARLY_SHIFT 1
372#define CS42L42_ASPTX_EARLY_MASK (1 << CS42L42_ASPTX_EARLY_SHIFT)
373#define CS42L42_ASPTX_LATE_SHIFT 2
374#define CS42L42_ASPTX_LATE_MASK (1 << CS42L42_ASPTX_LATE_SHIFT)
375#define CS42L42_ASPTX_SMERROR_SHIFT 3
376#define CS42L42_ASPTX_SMERROR_MASK (1 << CS42L42_ASPTX_SMERROR_SHIFT)
377#define CS42L42_ASP_TX_VAL_MASK (CS42L42_ASPTX_NOLRCK_MASK | \
378 CS42L42_ASPTX_EARLY_MASK | \
379 CS42L42_ASPTX_LATE_MASK | \
380 CS42L42_ASPTX_SMERROR_MASK)
381
382#define CS42L42_CODEC_INT_MASK (CS42L42_PAGE_13 + 0x1B)
383#define CS42L42_PDN_DONE_SHIFT 0
384#define CS42L42_PDN_DONE_MASK (1 << CS42L42_PDN_DONE_SHIFT)
385#define CS42L42_HSDET_AUTO_DONE_SHIFT 1
386#define CS42L42_HSDET_AUTO_DONE_MASK (1 << CS42L42_HSDET_AUTO_DONE_SHIFT)
387#define CS42L42_CODEC_VAL_MASK (CS42L42_PDN_DONE_MASK | \
388 CS42L42_HSDET_AUTO_DONE_MASK)
389
390#define CS42L42_SRCPL_INT_MASK (CS42L42_PAGE_13 + 0x1C)
391#define CS42L42_SRCPL_ADC_LK_SHIFT 0
392#define CS42L42_SRCPL_ADC_LK_MASK (1 << CS42L42_SRCPL_ADC_LK_SHIFT)
393#define CS42L42_SRCPL_DAC_LK_SHIFT 2
394#define CS42L42_SRCPL_DAC_LK_MASK (1 << CS42L42_SRCPL_DAC_LK_SHIFT)
395#define CS42L42_SRCPL_ADC_UNLK_SHIFT 5
396#define CS42L42_SRCPL_ADC_UNLK_MASK (1 << CS42L42_SRCPL_ADC_UNLK_SHIFT)
397#define CS42L42_SRCPL_DAC_UNLK_SHIFT 6
398#define CS42L42_SRCPL_DAC_UNLK_MASK (1 << CS42L42_SRCPL_DAC_UNLK_SHIFT)
399#define CS42L42_SRCPL_VAL_MASK (CS42L42_SRCPL_ADC_LK_MASK | \
400 CS42L42_SRCPL_DAC_LK_MASK | \
401 CS42L42_SRCPL_ADC_UNLK_MASK | \
402 CS42L42_SRCPL_DAC_UNLK_MASK)
403
404#define CS42L42_VPMON_INT_MASK (CS42L42_PAGE_13 + 0x1E)
405#define CS42L42_VPMON_SHIFT 0
406#define CS42L42_VPMON_MASK (1 << CS42L42_VPMON_SHIFT)
407#define CS42L42_VPMON_VAL_MASK CS42L42_VPMON_MASK
408
409#define CS42L42_PLL_LOCK_INT_MASK (CS42L42_PAGE_13 + 0x1F)
410#define CS42L42_PLL_LOCK_SHIFT 0
411#define CS42L42_PLL_LOCK_MASK (1 << CS42L42_PLL_LOCK_SHIFT)
412#define CS42L42_PLL_LOCK_VAL_MASK CS42L42_PLL_LOCK_MASK
413
414#define CS42L42_TSRS_PLUG_INT_MASK (CS42L42_PAGE_13 + 0x20)
415#define CS42L42_RS_PLUG_SHIFT 0
416#define CS42L42_RS_PLUG_MASK (1 << CS42L42_RS_PLUG_SHIFT)
417#define CS42L42_RS_UNPLUG_SHIFT 1
418#define CS42L42_RS_UNPLUG_MASK (1 << CS42L42_RS_UNPLUG_SHIFT)
419#define CS42L42_TS_PLUG_SHIFT 2
420#define CS42L42_TS_PLUG_MASK (1 << CS42L42_TS_PLUG_SHIFT)
421#define CS42L42_TS_UNPLUG_SHIFT 3
422#define CS42L42_TS_UNPLUG_MASK (1 << CS42L42_TS_UNPLUG_SHIFT)
423#define CS42L42_TSRS_PLUG_VAL_MASK (CS42L42_RS_PLUG_MASK | \
424 CS42L42_RS_UNPLUG_MASK | \
425 CS42L42_TS_PLUG_MASK | \
426 CS42L42_TS_UNPLUG_MASK)
427#define CS42L42_TS_PLUG 3
428#define CS42L42_TS_UNPLUG 0
429#define CS42L42_TS_TRANS 1
430
431/* Page 0x15 Fractional-N PLL Registers */
432#define CS42L42_PLL_CTL1 (CS42L42_PAGE_15 + 0x01)
433#define CS42L42_PLL_START_SHIFT 0
434#define CS42L42_PLL_START_MASK (1 << CS42L42_PLL_START_SHIFT)
435
436#define CS42L42_PLL_DIV_FRAC0 (CS42L42_PAGE_15 + 0x02)
437#define CS42L42_PLL_DIV_FRAC_SHIFT 0
438#define CS42L42_PLL_DIV_FRAC_MASK (0xff << CS42L42_PLL_DIV_FRAC_SHIFT)
439
440#define CS42L42_PLL_DIV_FRAC1 (CS42L42_PAGE_15 + 0x03)
441#define CS42L42_PLL_DIV_FRAC2 (CS42L42_PAGE_15 + 0x04)
442
443#define CS42L42_PLL_DIV_INT (CS42L42_PAGE_15 + 0x05)
444#define CS42L42_PLL_DIV_INT_SHIFT 0
445#define CS42L42_PLL_DIV_INT_MASK (0xff << CS42L42_PLL_DIV_INT_SHIFT)
446
447#define CS42L42_PLL_CTL3 (CS42L42_PAGE_15 + 0x08)
448#define CS42L42_PLL_DIVOUT_SHIFT 0
449#define CS42L42_PLL_DIVOUT_MASK (0xff << CS42L42_PLL_DIVOUT_SHIFT)
450
451#define CS42L42_PLL_CAL_RATIO (CS42L42_PAGE_15 + 0x0A)
452#define CS42L42_PLL_CAL_RATIO_SHIFT 0
453#define CS42L42_PLL_CAL_RATIO_MASK (0xff << CS42L42_PLL_CAL_RATIO_SHIFT)
454
455#define CS42L42_PLL_CTL4 (CS42L42_PAGE_15 + 0x1B)
456#define CS42L42_PLL_MODE_SHIFT 0
457#define CS42L42_PLL_MODE_MASK (3 << CS42L42_PLL_MODE_SHIFT)
458
459/* Page 0x19 HP Load Detect Registers */
460#define CS42L42_LOAD_DET_RCSTAT (CS42L42_PAGE_19 + 0x25)
461#define CS42L42_RLA_STAT_SHIFT 0
462#define CS42L42_RLA_STAT_MASK (3 << CS42L42_RLA_STAT_SHIFT)
463#define CS42L42_RLA_STAT_15_OHM 0
464
465#define CS42L42_LOAD_DET_DONE (CS42L42_PAGE_19 + 0x26)
466#define CS42L42_HPLOAD_DET_DONE_SHIFT 0
467#define CS42L42_HPLOAD_DET_DONE_MASK (1 << CS42L42_HPLOAD_DET_DONE_SHIFT)
468
469#define CS42L42_LOAD_DET_EN (CS42L42_PAGE_19 + 0x27)
470#define CS42L42_HP_LD_EN_SHIFT 0
471#define CS42L42_HP_LD_EN_MASK (1 << CS42L42_HP_LD_EN_SHIFT)
472
473/* Page 0x1B Headset Interface Registers */
474#define CS42L42_HSBIAS_SC_AUTOCTL (CS42L42_PAGE_1B + 0x70)
475#define CS42L42_HSBIAS_SENSE_TRIP_SHIFT 0
476#define CS42L42_HSBIAS_SENSE_TRIP_MASK (7 << \
477 CS42L42_HSBIAS_SENSE_TRIP_SHIFT)
478#define CS42L42_TIP_SENSE_EN_SHIFT 5
479#define CS42L42_TIP_SENSE_EN_MASK (1 << \
480 CS42L42_TIP_SENSE_EN_SHIFT)
481#define CS42L42_AUTO_HSBIAS_HIZ_SHIFT 6
482#define CS42L42_AUTO_HSBIAS_HIZ_MASK (1 << \
483 CS42L42_AUTO_HSBIAS_HIZ_SHIFT)
484#define CS42L42_HSBIAS_SENSE_EN_SHIFT 7
485#define CS42L42_HSBIAS_SENSE_EN_MASK (1 << \
486 CS42L42_HSBIAS_SENSE_EN_SHIFT)
487
488#define CS42L42_WAKE_CTL (CS42L42_PAGE_1B + 0x71)
489#define CS42L42_WAKEB_CLEAR_SHIFT 0
490#define CS42L42_WAKEB_CLEAR_MASK (1 << CS42L42_WAKEB_CLEAR_SHIFT)
491#define CS42L42_WAKEB_MODE_SHIFT 5
492#define CS42L42_WAKEB_MODE_MASK (1 << CS42L42_WAKEB_MODE_SHIFT)
493#define CS42L42_M_HP_WAKE_SHIFT 6
494#define CS42L42_M_HP_WAKE_MASK (1 << CS42L42_M_HP_WAKE_SHIFT)
495#define CS42L42_M_MIC_WAKE_SHIFT 7
496#define CS42L42_M_MIC_WAKE_MASK (1 << CS42L42_M_MIC_WAKE_SHIFT)
497
498#define CS42L42_ADC_DISABLE_MUTE (CS42L42_PAGE_1B + 0x72)
499#define CS42L42_ADC_DISABLE_S0_MUTE_SHIFT 7
500#define CS42L42_ADC_DISABLE_S0_MUTE_MASK (1 << \
501 CS42L42_ADC_DISABLE_S0_MUTE_SHIFT)
502
503#define CS42L42_TIPSENSE_CTL (CS42L42_PAGE_1B + 0x73)
504#define CS42L42_TIP_SENSE_DEBOUNCE_SHIFT 0
505#define CS42L42_TIP_SENSE_DEBOUNCE_MASK (3 << \
506 CS42L42_TIP_SENSE_DEBOUNCE_SHIFT)
507#define CS42L42_TIP_SENSE_INV_SHIFT 5
508#define CS42L42_TIP_SENSE_INV_MASK (1 << \
509 CS42L42_TIP_SENSE_INV_SHIFT)
510#define CS42L42_TIP_SENSE_CTRL_SHIFT 6
511#define CS42L42_TIP_SENSE_CTRL_MASK (3 << \
512 CS42L42_TIP_SENSE_CTRL_SHIFT)
513
514#define CS42L42_MISC_DET_CTL (CS42L42_PAGE_1B + 0x74)
515#define CS42L42_PDN_MIC_LVL_DET_SHIFT 0
516#define CS42L42_PDN_MIC_LVL_DET_MASK (1 << CS42L42_PDN_MIC_LVL_DET_SHIFT)
517#define CS42L42_HSBIAS_CTL_SHIFT 1
518#define CS42L42_HSBIAS_CTL_MASK (3 << CS42L42_HSBIAS_CTL_SHIFT)
519#define CS42L42_DETECT_MODE_SHIFT 3
520#define CS42L42_DETECT_MODE_MASK (3 << CS42L42_DETECT_MODE_SHIFT)
521
522#define CS42L42_MIC_DET_CTL1 (CS42L42_PAGE_1B + 0x75)
523#define CS42L42_HS_DET_LEVEL_SHIFT 0
524#define CS42L42_HS_DET_LEVEL_MASK (0x3F << CS42L42_HS_DET_LEVEL_SHIFT)
525#define CS42L42_EVENT_STAT_SEL_SHIFT 6
526#define CS42L42_EVENT_STAT_SEL_MASK (1 << CS42L42_EVENT_STAT_SEL_SHIFT)
527#define CS42L42_LATCH_TO_VP_SHIFT 7
528#define CS42L42_LATCH_TO_VP_MASK (1 << CS42L42_LATCH_TO_VP_SHIFT)
529
530#define CS42L42_MIC_DET_CTL2 (CS42L42_PAGE_1B + 0x76)
531#define CS42L42_DEBOUNCE_TIME_SHIFT 5
532#define CS42L42_DEBOUNCE_TIME_MASK (0x07 << CS42L42_DEBOUNCE_TIME_SHIFT)
533
534#define CS42L42_DET_STATUS1 (CS42L42_PAGE_1B + 0x77)
535#define CS42L42_HSBIAS_HIZ_MODE_SHIFT 6
536#define CS42L42_HSBIAS_HIZ_MODE_MASK (1 << CS42L42_HSBIAS_HIZ_MODE_SHIFT)
537#define CS42L42_TIP_SENSE_SHIFT 7
538#define CS42L42_TIP_SENSE_MASK (1 << CS42L42_TIP_SENSE_SHIFT)
539
540#define CS42L42_DET_STATUS2 (CS42L42_PAGE_1B + 0x78)
541#define CS42L42_SHORT_TRUE_SHIFT 0
542#define CS42L42_SHORT_TRUE_MASK (1 << CS42L42_SHORT_TRUE_SHIFT)
543#define CS42L42_HS_TRUE_SHIFT 1
544#define CS42L42_HS_TRUE_MASK (1 << CS42L42_HS_TRUE_SHIFT)
545
546#define CS42L42_DET_INT1_MASK (CS42L42_PAGE_1B + 0x79)
547#define CS42L42_TIP_SENSE_UNPLUG_SHIFT 5
548#define CS42L42_TIP_SENSE_UNPLUG_MASK (1 << CS42L42_TIP_SENSE_UNPLUG_SHIFT)
549#define CS42L42_TIP_SENSE_PLUG_SHIFT 6
550#define CS42L42_TIP_SENSE_PLUG_MASK (1 << CS42L42_TIP_SENSE_PLUG_SHIFT)
551#define CS42L42_HSBIAS_SENSE_SHIFT 7
552#define CS42L42_HSBIAS_SENSE_MASK (1 << CS42L42_HSBIAS_SENSE_SHIFT)
553#define CS42L42_DET_INT_VAL1_MASK (CS42L42_TIP_SENSE_UNPLUG_MASK | \
554 CS42L42_TIP_SENSE_PLUG_MASK | \
555 CS42L42_HSBIAS_SENSE_MASK)
556
557#define CS42L42_DET_INT2_MASK (CS42L42_PAGE_1B + 0x7A)
558#define CS42L42_M_SHORT_DET_SHIFT 0
559#define CS42L42_M_SHORT_DET_MASK (1 << \
560 CS42L42_M_SHORT_DET_SHIFT)
561#define CS42L42_M_SHORT_RLS_SHIFT 1
562#define CS42L42_M_SHORT_RLS_MASK (1 << \
563 CS42L42_M_SHORT_RLS_SHIFT)
564#define CS42L42_M_HSBIAS_HIZ_SHIFT 2
565#define CS42L42_M_HSBIAS_HIZ_MASK (1 << \
566 CS42L42_M_HSBIAS_HIZ_SHIFT)
567#define CS42L42_M_DETECT_FT_SHIFT 6
568#define CS42L42_M_DETECT_FT_MASK (1 << \
569 CS42L42_M_DETECT_FT_SHIFT)
570#define CS42L42_M_DETECT_TF_SHIFT 7
571#define CS42L42_M_DETECT_TF_MASK (1 << \
572 CS42L42_M_DETECT_TF_SHIFT)
573#define CS42L42_DET_INT_VAL2_MASK (CS42L42_M_SHORT_DET_MASK | \
574 CS42L42_M_SHORT_RLS_MASK | \
575 CS42L42_M_HSBIAS_HIZ_MASK | \
576 CS42L42_M_DETECT_FT_MASK | \
577 CS42L42_M_DETECT_TF_MASK)
578
579/* Page 0x1C Headset Bias Registers */
580#define CS42L42_HS_BIAS_CTL (CS42L42_PAGE_1C + 0x03)
581#define CS42L42_HSBIAS_RAMP_SHIFT 0
582#define CS42L42_HSBIAS_RAMP_MASK (3 << CS42L42_HSBIAS_RAMP_SHIFT)
583#define CS42L42_HSBIAS_PD_SHIFT 4
584#define CS42L42_HSBIAS_PD_MASK (1 << CS42L42_HSBIAS_PD_SHIFT)
585#define CS42L42_HSBIAS_CAPLESS_SHIFT 7
586#define CS42L42_HSBIAS_CAPLESS_MASK (1 << CS42L42_HSBIAS_CAPLESS_SHIFT)
587
588/* Page 0x1D ADC Registers */
589#define CS42L42_ADC_CTL (CS42L42_PAGE_1D + 0x01)
590#define CS42L42_ADC_NOTCH_DIS_SHIFT 5
591#define CS42L42_ADC_FORCE_WEAK_VCM_SHIFT 4
592#define CS42L42_ADC_INV_SHIFT 2
593#define CS42L42_ADC_DIG_BOOST_SHIFT 0
594
595#define CS42L42_ADC_VOLUME (CS42L42_PAGE_1D + 0x03)
596#define CS42L42_ADC_VOL_SHIFT 0
597
598#define CS42L42_ADC_WNF_HPF_CTL (CS42L42_PAGE_1D + 0x04)
599#define CS42L42_ADC_WNF_CF_SHIFT 4
600#define CS42L42_ADC_WNF_EN_SHIFT 3
601#define CS42L42_ADC_HPF_CF_SHIFT 1
602#define CS42L42_ADC_HPF_EN_SHIFT 0
603
604/* Page 0x1F DAC Registers */
605#define CS42L42_DAC_CTL1 (CS42L42_PAGE_1F + 0x01)
606#define CS42L42_DACB_INV_SHIFT 1
607#define CS42L42_DACA_INV_SHIFT 0
608
609#define CS42L42_DAC_CTL2 (CS42L42_PAGE_1F + 0x06)
610#define CS42L42_HPOUT_PULLDOWN_SHIFT 4
611#define CS42L42_HPOUT_PULLDOWN_MASK (15 << CS42L42_HPOUT_PULLDOWN_SHIFT)
612#define CS42L42_HPOUT_LOAD_SHIFT 3
613#define CS42L42_HPOUT_LOAD_MASK (1 << CS42L42_HPOUT_LOAD_SHIFT)
614#define CS42L42_HPOUT_CLAMP_SHIFT 2
615#define CS42L42_HPOUT_CLAMP_MASK (1 << CS42L42_HPOUT_CLAMP_SHIFT)
616#define CS42L42_DAC_HPF_EN_SHIFT 1
617#define CS42L42_DAC_HPF_EN_MASK (1 << CS42L42_DAC_HPF_EN_SHIFT)
618#define CS42L42_DAC_MON_EN_SHIFT 0
619#define CS42L42_DAC_MON_EN_MASK (1 << CS42L42_DAC_MON_EN_SHIFT)
620
621/* Page 0x20 HP CTL Registers */
622#define CS42L42_HP_CTL (CS42L42_PAGE_20 + 0x01)
623#define CS42L42_HP_ANA_BMUTE_SHIFT 3
624#define CS42L42_HP_ANA_BMUTE_MASK (1 << CS42L42_HP_ANA_BMUTE_SHIFT)
625#define CS42L42_HP_ANA_AMUTE_SHIFT 2
626#define CS42L42_HP_ANA_AMUTE_MASK (1 << CS42L42_HP_ANA_AMUTE_SHIFT)
627#define CS42L42_HP_FULL_SCALE_VOL_SHIFT 1
628#define CS42L42_HP_FULL_SCALE_VOL_MASK (1 << CS42L42_HP_FULL_SCALE_VOL_SHIFT)
629
630/* Page 0x21 Class H Registers */
631#define CS42L42_CLASSH_CTL (CS42L42_PAGE_21 + 0x01)
632
633/* Page 0x23 Mixer Volume Registers */
634#define CS42L42_MIXER_CHA_VOL (CS42L42_PAGE_23 + 0x01)
635#define CS42L42_MIXER_ADC_VOL (CS42L42_PAGE_23 + 0x02)
636
637#define CS42L42_MIXER_CHB_VOL (CS42L42_PAGE_23 + 0x03)
638#define CS42L42_MIXER_CH_VOL_SHIFT 0
639#define CS42L42_MIXER_CH_VOL_MASK (0x3f << CS42L42_MIXER_CH_VOL_SHIFT)
640
641/* Page 0x24 EQ Registers */
642#define CS42L42_EQ_COEF_IN0 (CS42L42_PAGE_24 + 0x01)
643#define CS42L42_EQ_COEF_IN1 (CS42L42_PAGE_24 + 0x02)
644#define CS42L42_EQ_COEF_IN2 (CS42L42_PAGE_24 + 0x03)
645#define CS42L42_EQ_COEF_IN3 (CS42L42_PAGE_24 + 0x04)
646#define CS42L42_EQ_COEF_RW (CS42L42_PAGE_24 + 0x06)
647#define CS42L42_EQ_COEF_OUT0 (CS42L42_PAGE_24 + 0x07)
648#define CS42L42_EQ_COEF_OUT1 (CS42L42_PAGE_24 + 0x08)
649#define CS42L42_EQ_COEF_OUT2 (CS42L42_PAGE_24 + 0x09)
650#define CS42L42_EQ_COEF_OUT3 (CS42L42_PAGE_24 + 0x0A)
651#define CS42L42_EQ_INIT_STAT (CS42L42_PAGE_24 + 0x0B)
652#define CS42L42_EQ_START_FILT (CS42L42_PAGE_24 + 0x0C)
653#define CS42L42_EQ_MUTE_CTL (CS42L42_PAGE_24 + 0x0E)
654
655/* Page 0x25 Audio Port Registers */
656#define CS42L42_SP_RX_CH_SEL (CS42L42_PAGE_25 + 0x01)
657
658#define CS42L42_SP_RX_ISOC_CTL (CS42L42_PAGE_25 + 0x02)
659#define CS42L42_SP_RX_RSYNC_SHIFT 6
660#define CS42L42_SP_RX_RSYNC_MASK (1 << CS42L42_SP_RX_RSYNC_SHIFT)
661#define CS42L42_SP_RX_NSB_POS_SHIFT 3
662#define CS42L42_SP_RX_NSB_POS_MASK (7 << CS42L42_SP_RX_NSB_POS_SHIFT)
663#define CS42L42_SP_RX_NFS_NSBB_SHIFT 2
664#define CS42L42_SP_RX_NFS_NSBB_MASK (1 << CS42L42_SP_RX_NFS_NSBB_SHIFT)
665#define CS42L42_SP_RX_ISOC_MODE_SHIFT 0
666#define CS42L42_SP_RX_ISOC_MODE_MASK (3 << CS42L42_SP_RX_ISOC_MODE_SHIFT)
667
668#define CS42L42_SP_RX_FS (CS42L42_PAGE_25 + 0x03)
669#define CS42l42_SPDIF_CH_SEL (CS42L42_PAGE_25 + 0x04)
670#define CS42L42_SP_TX_ISOC_CTL (CS42L42_PAGE_25 + 0x05)
671#define CS42L42_SP_TX_FS (CS42L42_PAGE_25 + 0x06)
672#define CS42L42_SPDIF_SW_CTL1 (CS42L42_PAGE_25 + 0x07)
673
674/* Page 0x26 SRC Registers */
675#define CS42L42_SRC_SDIN_FS (CS42L42_PAGE_26 + 0x01)
676#define CS42L42_SRC_SDIN_FS_SHIFT 0
677#define CS42L42_SRC_SDIN_FS_MASK (0x1f << CS42L42_SRC_SDIN_FS_SHIFT)
678
679#define CS42L42_SRC_SDOUT_FS (CS42L42_PAGE_26 + 0x09)
680
681/* Page 0x28 S/PDIF Registers */
682#define CS42L42_SPDIF_CTL1 (CS42L42_PAGE_28 + 0x01)
683#define CS42L42_SPDIF_CTL2 (CS42L42_PAGE_28 + 0x02)
684#define CS42L42_SPDIF_CTL3 (CS42L42_PAGE_28 + 0x03)
685#define CS42L42_SPDIF_CTL4 (CS42L42_PAGE_28 + 0x04)
686
687/* Page 0x29 Serial Port TX Registers */
688#define CS42L42_ASP_TX_SZ_EN (CS42L42_PAGE_29 + 0x01)
689#define CS42L42_ASP_TX_CH_EN (CS42L42_PAGE_29 + 0x02)
690#define CS42L42_ASP_TX_CH_AP_RES (CS42L42_PAGE_29 + 0x03)
691#define CS42L42_ASP_TX_CH1_BIT_MSB (CS42L42_PAGE_29 + 0x04)
692#define CS42L42_ASP_TX_CH1_BIT_LSB (CS42L42_PAGE_29 + 0x05)
693#define CS42L42_ASP_TX_HIZ_DLY_CFG (CS42L42_PAGE_29 + 0x06)
694#define CS42L42_ASP_TX_CH2_BIT_MSB (CS42L42_PAGE_29 + 0x0A)
695#define CS42L42_ASP_TX_CH2_BIT_LSB (CS42L42_PAGE_29 + 0x0B)
696
697/* Page 0x2A Serial Port RX Registers */
698#define CS42L42_ASP_RX_DAI0_EN (CS42L42_PAGE_2A + 0x01)
699#define CS42L42_ASP_RX0_CH_EN_SHIFT 2
700#define CS42L42_ASP_RX0_CH_EN_MASK (0xf << CS42L42_ASP_RX0_CH_EN_SHIFT)
701#define CS42L42_ASP_RX0_CH1_EN 1
702#define CS42L42_ASP_RX0_CH2_EN 2
703#define CS42L42_ASP_RX0_CH3_EN 4
704#define CS42L42_ASP_RX0_CH4_EN 8
705
706#define CS42L42_ASP_RX_DAI0_CH1_AP_RES (CS42L42_PAGE_2A + 0x02)
707#define CS42L42_ASP_RX_DAI0_CH1_BIT_MSB (CS42L42_PAGE_2A + 0x03)
708#define CS42L42_ASP_RX_DAI0_CH1_BIT_LSB (CS42L42_PAGE_2A + 0x04)
709#define CS42L42_ASP_RX_DAI0_CH2_AP_RES (CS42L42_PAGE_2A + 0x05)
710#define CS42L42_ASP_RX_DAI0_CH2_BIT_MSB (CS42L42_PAGE_2A + 0x06)
711#define CS42L42_ASP_RX_DAI0_CH2_BIT_LSB (CS42L42_PAGE_2A + 0x07)
712#define CS42L42_ASP_RX_DAI0_CH3_AP_RES (CS42L42_PAGE_2A + 0x08)
713#define CS42L42_ASP_RX_DAI0_CH3_BIT_MSB (CS42L42_PAGE_2A + 0x09)
714#define CS42L42_ASP_RX_DAI0_CH3_BIT_LSB (CS42L42_PAGE_2A + 0x0A)
715#define CS42L42_ASP_RX_DAI0_CH4_AP_RES (CS42L42_PAGE_2A + 0x0B)
716#define CS42L42_ASP_RX_DAI0_CH4_BIT_MSB (CS42L42_PAGE_2A + 0x0C)
717#define CS42L42_ASP_RX_DAI0_CH4_BIT_LSB (CS42L42_PAGE_2A + 0x0D)
718#define CS42L42_ASP_RX_DAI1_CH1_AP_RES (CS42L42_PAGE_2A + 0x0E)
719#define CS42L42_ASP_RX_DAI1_CH1_BIT_MSB (CS42L42_PAGE_2A + 0x0F)
720#define CS42L42_ASP_RX_DAI1_CH1_BIT_LSB (CS42L42_PAGE_2A + 0x10)
721#define CS42L42_ASP_RX_DAI1_CH2_AP_RES (CS42L42_PAGE_2A + 0x11)
722#define CS42L42_ASP_RX_DAI1_CH2_BIT_MSB (CS42L42_PAGE_2A + 0x12)
723#define CS42L42_ASP_RX_DAI1_CH2_BIT_LSB (CS42L42_PAGE_2A + 0x13)
724
725#define CS42L42_ASP_RX_CH_AP_SHIFT 6
726#define CS42L42_ASP_RX_CH_AP_MASK (1 << CS42L42_ASP_RX_CH_AP_SHIFT)
727#define CS42L42_ASP_RX_CH_AP_LOW 0
728#define CS42L42_ASP_RX_CH_AP_HI 1
729#define CS42L42_ASP_RX_CH_RES_SHIFT 0
730#define CS42L42_ASP_RX_CH_RES_MASK (3 << CS42L42_ASP_RX_CH_RES_SHIFT)
731#define CS42L42_ASP_RX_CH_RES_32 3
732#define CS42L42_ASP_RX_CH_RES_16 1
733#define CS42L42_ASP_RX_CH_BIT_ST_SHIFT 0
734#define CS42L42_ASP_RX_CH_BIT_ST_MASK (0xff << CS42L42_ASP_RX_CH_BIT_ST_SHIFT)
735
736/* Page 0x30 ID Registers */
737#define CS42L42_SUB_REVID (CS42L42_PAGE_30 + 0x14)
738#define CS42L42_MAX_REGISTER (CS42L42_PAGE_30 + 0x14)
739
740/* Defines for fracturing values spread across multiple registers */
741#define CS42L42_FRAC0_VAL(val) ((val) & 0x0000ff)
742#define CS42L42_FRAC1_VAL(val) (((val) & 0x00ff00) >> 8)
743#define CS42L42_FRAC2_VAL(val) (((val) & 0xff0000) >> 16)
744
745#define CS42L42_NUM_SUPPLIES 5
746
747static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = {
748 "VA",
749 "VP",
750 "VCP",
751 "VD_FILT",
752 "VL",
753};
754
755struct cs42l42_private {
756 struct regmap *regmap;
757 struct snd_soc_codec *codec;
758 struct regulator_bulk_data supplies[CS42L42_NUM_SUPPLIES];
759 struct gpio_desc *reset_gpio;
760 struct completion pdn_done;
761 u32 sclk;
762 u32 srate;
763 u32 swidth;
764 u8 plug_state;
765 u8 hs_type;
766 u8 ts_inv;
767 u8 ts_dbnc_rise;
768 u8 ts_dbnc_fall;
769 u8 btn_det_init_dbnce;
770 u8 btn_det_event_dbnce;
771 u8 bias_thresholds[CS42L42_NUM_BIASES];
772 u8 hs_bias_ramp_rate;
773 u8 hs_bias_ramp_time;
774};
775
776#endif /* __CS42L42_H__ */
diff --git a/sound/soc/codecs/cs42l56.c b/sound/soc/codecs/cs42l56.c
index 54c1768bc818..cb6ca85f1536 100644
--- a/sound/soc/codecs/cs42l56.c
+++ b/sound/soc/codecs/cs42l56.c
@@ -64,8 +64,6 @@ struct cs42l56_private {
64}; 64};
65 65
66static const struct reg_default cs42l56_reg_defaults[] = { 66static const struct reg_default cs42l56_reg_defaults[] = {
67 { 1, 0x56 }, /* r01 - ID 1 */
68 { 2, 0x04 }, /* r02 - ID 2 */
69 { 3, 0x7f }, /* r03 - Power Ctl 1 */ 67 { 3, 0x7f }, /* r03 - Power Ctl 1 */
70 { 4, 0xff }, /* r04 - Power Ctl 2 */ 68 { 4, 0xff }, /* r04 - Power Ctl 2 */
71 { 5, 0x00 }, /* ro5 - Clocking Ctl 1 */ 69 { 5, 0x00 }, /* ro5 - Clocking Ctl 1 */
@@ -1262,8 +1260,6 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client,
1262 return ret; 1260 return ret;
1263 } 1261 }
1264 1262
1265 regcache_cache_bypass(cs42l56->regmap, true);
1266
1267 ret = regmap_read(cs42l56->regmap, CS42L56_CHIP_ID_1, &reg); 1263 ret = regmap_read(cs42l56->regmap, CS42L56_CHIP_ID_1, &reg);
1268 devid = reg & CS42L56_CHIP_ID_MASK; 1264 devid = reg & CS42L56_CHIP_ID_MASK;
1269 if (devid != CS42L56_DEVID) { 1265 if (devid != CS42L56_DEVID) {
@@ -1279,23 +1275,25 @@ static int cs42l56_i2c_probe(struct i2c_client *i2c_client,
1279 dev_info(&i2c_client->dev, "Alpha Rev %X Metal Rev %X\n", 1275 dev_info(&i2c_client->dev, "Alpha Rev %X Metal Rev %X\n",
1280 alpha_rev, metal_rev); 1276 alpha_rev, metal_rev);
1281 1277
1282 regcache_cache_bypass(cs42l56->regmap, false);
1283
1284 if (cs42l56->pdata.ain1a_ref_cfg) 1278 if (cs42l56->pdata.ain1a_ref_cfg)
1285 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX, 1279 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1286 CS42L56_AIN1A_REF_MASK, 1); 1280 CS42L56_AIN1A_REF_MASK,
1281 CS42L56_AIN1A_REF_MASK);
1287 1282
1288 if (cs42l56->pdata.ain1b_ref_cfg) 1283 if (cs42l56->pdata.ain1b_ref_cfg)
1289 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX, 1284 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1290 CS42L56_AIN1B_REF_MASK, 1); 1285 CS42L56_AIN1B_REF_MASK,
1286 CS42L56_AIN1B_REF_MASK);
1291 1287
1292 if (cs42l56->pdata.ain2a_ref_cfg) 1288 if (cs42l56->pdata.ain2a_ref_cfg)
1293 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX, 1289 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1294 CS42L56_AIN2A_REF_MASK, 1); 1290 CS42L56_AIN2A_REF_MASK,
1291 CS42L56_AIN2A_REF_MASK);
1295 1292
1296 if (cs42l56->pdata.ain2b_ref_cfg) 1293 if (cs42l56->pdata.ain2b_ref_cfg)
1297 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX, 1294 regmap_update_bits(cs42l56->regmap, CS42L56_AIN_REFCFG_ADC_MUX,
1298 CS42L56_AIN2B_REF_MASK, 1); 1295 CS42L56_AIN2B_REF_MASK,
1296 CS42L56_AIN2B_REF_MASK);
1299 1297
1300 if (cs42l56->pdata.micbias_lvl) 1298 if (cs42l56->pdata.micbias_lvl)
1301 regmap_update_bits(cs42l56->regmap, CS42L56_GAIN_BIAS_CTL, 1299 regmap_update_bits(cs42l56->regmap, CS42L56_GAIN_BIAS_CTL,
diff --git a/sound/soc/codecs/cs42l73.c b/sound/soc/codecs/cs42l73.c
index 71ba5605495f..3df2c473ab88 100644
--- a/sound/soc/codecs/cs42l73.c
+++ b/sound/soc/codecs/cs42l73.c
@@ -1337,8 +1337,6 @@ static int cs42l73_i2c_probe(struct i2c_client *i2c_client,
1337 gpio_set_value_cansleep(cs42l73->pdata.reset_gpio, 1); 1337 gpio_set_value_cansleep(cs42l73->pdata.reset_gpio, 1);
1338 } 1338 }
1339 1339
1340 regcache_cache_bypass(cs42l73->regmap, true);
1341
1342 /* initialize codec */ 1340 /* initialize codec */
1343 ret = regmap_read(cs42l73->regmap, CS42L73_DEVID_AB, &reg); 1341 ret = regmap_read(cs42l73->regmap, CS42L73_DEVID_AB, &reg);
1344 devid = (reg & 0xFF) << 12; 1342 devid = (reg & 0xFF) << 12;
@@ -1366,8 +1364,6 @@ static int cs42l73_i2c_probe(struct i2c_client *i2c_client,
1366 dev_info(&i2c_client->dev, 1364 dev_info(&i2c_client->dev,
1367 "Cirrus Logic CS42L73, Revision: %02X\n", reg & 0xFF); 1365 "Cirrus Logic CS42L73, Revision: %02X\n", reg & 0xFF);
1368 1366
1369 regcache_cache_bypass(cs42l73->regmap, false);
1370
1371 ret = snd_soc_register_codec(&i2c_client->dev, 1367 ret = snd_soc_register_codec(&i2c_client->dev,
1372 &soc_codec_dev_cs42l73, cs42l73_dai, 1368 &soc_codec_dev_cs42l73, cs42l73_dai,
1373 ARRAY_SIZE(cs42l73_dai)); 1369 ARRAY_SIZE(cs42l73_dai));
diff --git a/sound/soc/codecs/cs42xx8.c b/sound/soc/codecs/cs42xx8.c
index b4d87379d2bc..c1785bd4ff19 100644
--- a/sound/soc/codecs/cs42xx8.c
+++ b/sound/soc/codecs/cs42xx8.c
@@ -321,7 +321,6 @@ static struct snd_soc_dai_driver cs42xx8_dai = {
321}; 321};
322 322
323static const struct reg_default cs42xx8_reg[] = { 323static const struct reg_default cs42xx8_reg[] = {
324 { 0x01, 0x01 }, /* Chip I.D. and Revision Register */
325 { 0x02, 0x00 }, /* Power Control */ 324 { 0x02, 0x00 }, /* Power Control */
326 { 0x03, 0xF0 }, /* Functional Mode */ 325 { 0x03, 0xF0 }, /* Functional Mode */
327 { 0x04, 0x46 }, /* Interface Formats */ 326 { 0x04, 0x46 }, /* Interface Formats */
@@ -498,13 +497,6 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap)
498 /* Make sure hardware reset done */ 497 /* Make sure hardware reset done */
499 msleep(5); 498 msleep(5);
500 499
501 /*
502 * We haven't marked the chip revision as volatile due to
503 * sharing a register with the right input volume; explicitly
504 * bypass the cache to read it.
505 */
506 regcache_cache_bypass(cs42xx8->regmap, true);
507
508 /* Validate the chip ID */ 500 /* Validate the chip ID */
509 ret = regmap_read(cs42xx8->regmap, CS42XX8_CHIPID, &val); 501 ret = regmap_read(cs42xx8->regmap, CS42XX8_CHIPID, &val);
510 if (ret < 0) { 502 if (ret < 0) {
@@ -523,8 +515,6 @@ int cs42xx8_probe(struct device *dev, struct regmap *regmap)
523 dev_info(dev, "found device, revision %X\n", 515 dev_info(dev, "found device, revision %X\n",
524 val & CS42XX8_CHIPID_REV_ID_MASK); 516 val & CS42XX8_CHIPID_REV_ID_MASK);
525 517
526 regcache_cache_bypass(cs42xx8->regmap, false);
527
528 cs42xx8_dai.name = cs42xx8->drvdata->name; 518 cs42xx8_dai.name = cs42xx8->drvdata->name;
529 519
530 /* Each adc supports stereo input */ 520 /* Each adc supports stereo input */
diff --git a/sound/soc/codecs/cs47l24.c b/sound/soc/codecs/cs47l24.c
index 5b22564f037c..73559ae864b6 100644
--- a/sound/soc/codecs/cs47l24.c
+++ b/sound/soc/codecs/cs47l24.c
@@ -335,9 +335,11 @@ static const struct snd_kcontrol_new cs47l24_aec_loopback_mux =
335 335
336static const struct snd_soc_dapm_widget cs47l24_dapm_widgets[] = { 336static const struct snd_soc_dapm_widget cs47l24_dapm_widgets[] = {
337SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, 337SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
338 ARIZONA_SYSCLK_ENA_SHIFT, 0, NULL, 0), 338 ARIZONA_SYSCLK_ENA_SHIFT, 0, arizona_clk_ev,
339 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
339SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, 340SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
340 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), 341 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
342 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
341SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, 343SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
342 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0), 344 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
343SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK, 345SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
@@ -1064,7 +1066,7 @@ static struct snd_soc_dai_driver cs47l24_dai[] = {
1064static int cs47l24_open(struct snd_compr_stream *stream) 1066static int cs47l24_open(struct snd_compr_stream *stream)
1065{ 1067{
1066 struct snd_soc_pcm_runtime *rtd = stream->private_data; 1068 struct snd_soc_pcm_runtime *rtd = stream->private_data;
1067 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(rtd->codec); 1069 struct cs47l24_priv *priv = snd_soc_platform_get_drvdata(rtd->platform);
1068 struct arizona *arizona = priv->core.arizona; 1070 struct arizona *arizona = priv->core.arizona;
1069 int n_adsp; 1071 int n_adsp;
1070 1072
@@ -1113,8 +1115,8 @@ static irqreturn_t cs47l24_adsp2_irq(int irq, void *data)
1113static int cs47l24_codec_probe(struct snd_soc_codec *codec) 1115static int cs47l24_codec_probe(struct snd_soc_codec *codec)
1114{ 1116{
1115 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 1117 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1118 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
1116 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec); 1119 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec);
1117 struct arizona *arizona = priv->core.arizona;
1118 int ret; 1120 int ret;
1119 1121
1120 priv->core.arizona->dapm = dapm; 1122 priv->core.arizona->dapm = dapm;
@@ -1124,14 +1126,6 @@ static int cs47l24_codec_probe(struct snd_soc_codec *codec)
1124 arizona_init_mono(codec); 1126 arizona_init_mono(codec);
1125 arizona_init_notifiers(codec); 1127 arizona_init_notifiers(codec);
1126 1128
1127 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
1128 "ADSP2 Compressed IRQ", cs47l24_adsp2_irq,
1129 priv);
1130 if (ret != 0) {
1131 dev_err(codec->dev, "Failed to request DSP IRQ: %d\n", ret);
1132 return ret;
1133 }
1134
1135 ret = wm_adsp2_codec_probe(&priv->core.adsp[1], codec); 1129 ret = wm_adsp2_codec_probe(&priv->core.adsp[1], codec);
1136 if (ret) 1130 if (ret)
1137 goto err_adsp2_codec_probe; 1131 goto err_adsp2_codec_probe;
@@ -1145,7 +1139,7 @@ static int cs47l24_codec_probe(struct snd_soc_codec *codec)
1145 if (ret) 1139 if (ret)
1146 goto err_adsp2_codec_probe; 1140 goto err_adsp2_codec_probe;
1147 1141
1148 snd_soc_dapm_disable_pin(dapm, "HAPTICS"); 1142 snd_soc_component_disable_pin(component, "HAPTICS");
1149 1143
1150 return 0; 1144 return 0;
1151 1145
@@ -1159,17 +1153,12 @@ err_adsp2_codec_probe:
1159static int cs47l24_codec_remove(struct snd_soc_codec *codec) 1153static int cs47l24_codec_remove(struct snd_soc_codec *codec)
1160{ 1154{
1161 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec); 1155 struct cs47l24_priv *priv = snd_soc_codec_get_drvdata(codec);
1162 struct arizona *arizona = priv->core.arizona;
1163 1156
1164 wm_adsp2_codec_remove(&priv->core.adsp[1], codec); 1157 wm_adsp2_codec_remove(&priv->core.adsp[1], codec);
1165 wm_adsp2_codec_remove(&priv->core.adsp[2], codec); 1158 wm_adsp2_codec_remove(&priv->core.adsp[2], codec);
1166 1159
1167 priv->core.arizona->dapm = NULL; 1160 priv->core.arizona->dapm = NULL;
1168 1161
1169 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
1170
1171 arizona_free_spk(codec);
1172
1173 return 0; 1162 return 0;
1174} 1163}
1175 1164
@@ -1285,25 +1274,47 @@ static int cs47l24_probe(struct platform_device *pdev)
1285 pm_runtime_enable(&pdev->dev); 1274 pm_runtime_enable(&pdev->dev);
1286 pm_runtime_idle(&pdev->dev); 1275 pm_runtime_idle(&pdev->dev);
1287 1276
1277 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
1278 "ADSP2 Compressed IRQ", cs47l24_adsp2_irq,
1279 cs47l24);
1280 if (ret != 0) {
1281 dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
1282 return ret;
1283 }
1284
1285 ret = arizona_init_spk_irqs(arizona);
1286 if (ret < 0)
1287 goto err_dsp_irq;
1288
1288 ret = snd_soc_register_platform(&pdev->dev, &cs47l24_compr_platform); 1289 ret = snd_soc_register_platform(&pdev->dev, &cs47l24_compr_platform);
1289 if (ret < 0) { 1290 if (ret < 0) {
1290 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); 1291 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
1291 return ret; 1292 goto err_spk_irqs;
1292 } 1293 }
1293 1294
1294 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24, 1295 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_cs47l24,
1295 cs47l24_dai, ARRAY_SIZE(cs47l24_dai)); 1296 cs47l24_dai, ARRAY_SIZE(cs47l24_dai));
1296 if (ret < 0) { 1297 if (ret < 0) {
1297 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); 1298 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
1298 snd_soc_unregister_platform(&pdev->dev); 1299 goto err_platform;
1299 } 1300 }
1300 1301
1301 return ret; 1302 return ret;
1303
1304err_platform:
1305 snd_soc_unregister_platform(&pdev->dev);
1306err_spk_irqs:
1307 arizona_free_spk_irqs(arizona);
1308err_dsp_irq:
1309 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, cs47l24);
1310
1311 return ret;
1302} 1312}
1303 1313
1304static int cs47l24_remove(struct platform_device *pdev) 1314static int cs47l24_remove(struct platform_device *pdev)
1305{ 1315{
1306 struct cs47l24_priv *cs47l24 = platform_get_drvdata(pdev); 1316 struct cs47l24_priv *cs47l24 = platform_get_drvdata(pdev);
1317 struct arizona *arizona = cs47l24->core.arizona;
1307 1318
1308 snd_soc_unregister_platform(&pdev->dev); 1319 snd_soc_unregister_platform(&pdev->dev);
1309 snd_soc_unregister_codec(&pdev->dev); 1320 snd_soc_unregister_codec(&pdev->dev);
@@ -1312,6 +1323,10 @@ static int cs47l24_remove(struct platform_device *pdev)
1312 wm_adsp2_remove(&cs47l24->core.adsp[1]); 1323 wm_adsp2_remove(&cs47l24->core.adsp[1]);
1313 wm_adsp2_remove(&cs47l24->core.adsp[2]); 1324 wm_adsp2_remove(&cs47l24->core.adsp[2]);
1314 1325
1326 arizona_free_spk_irqs(arizona);
1327
1328 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, cs47l24);
1329
1315 return 0; 1330 return 0;
1316} 1331}
1317 1332
diff --git a/sound/soc/codecs/da7219-aad.c b/sound/soc/codecs/da7219-aad.c
index 2b8914dd5990..6274d79c1353 100644
--- a/sound/soc/codecs/da7219-aad.c
+++ b/sound/soc/codecs/da7219-aad.c
@@ -204,10 +204,19 @@ static void da7219_aad_hptest_work(struct work_struct *work)
204 snd_soc_update_bits(codec, DA7219_MIXOUT_R_CTRL, 204 snd_soc_update_bits(codec, DA7219_MIXOUT_R_CTRL,
205 DA7219_MIXOUT_R_AMP_EN_MASK, 205 DA7219_MIXOUT_R_AMP_EN_MASK,
206 DA7219_MIXOUT_R_AMP_EN_MASK); 206 DA7219_MIXOUT_R_AMP_EN_MASK);
207 snd_soc_write(codec, DA7219_HP_L_CTRL, 207 snd_soc_update_bits(codec, DA7219_HP_L_CTRL,
208 DA7219_HP_L_AMP_OE_MASK | DA7219_HP_L_AMP_EN_MASK); 208 DA7219_HP_L_AMP_OE_MASK | DA7219_HP_L_AMP_EN_MASK,
209 snd_soc_write(codec, DA7219_HP_R_CTRL, 209 DA7219_HP_L_AMP_OE_MASK | DA7219_HP_L_AMP_EN_MASK);
210 DA7219_HP_R_AMP_OE_MASK | DA7219_HP_R_AMP_EN_MASK); 210 snd_soc_update_bits(codec, DA7219_HP_R_CTRL,
211 DA7219_HP_R_AMP_OE_MASK | DA7219_HP_R_AMP_EN_MASK,
212 DA7219_HP_R_AMP_OE_MASK | DA7219_HP_R_AMP_EN_MASK);
213 msleep(DA7219_SETTLING_DELAY);
214 snd_soc_update_bits(codec, DA7219_HP_L_CTRL,
215 DA7219_HP_L_AMP_MUTE_EN_MASK |
216 DA7219_HP_L_AMP_MIN_GAIN_EN_MASK, 0);
217 snd_soc_update_bits(codec, DA7219_HP_R_CTRL,
218 DA7219_HP_R_AMP_MUTE_EN_MASK |
219 DA7219_HP_R_AMP_MIN_GAIN_EN_MASK, 0);
211 220
212 /* 221 /*
213 * If we're running from the internal oscillator then give audio paths 222 * If we're running from the internal oscillator then give audio paths
@@ -244,6 +253,7 @@ static void da7219_aad_hptest_work(struct work_struct *work)
244 regcache_mark_dirty(da7219->regmap); 253 regcache_mark_dirty(da7219->regmap);
245 regcache_sync_region(da7219->regmap, DA7219_HP_L_CTRL, 254 regcache_sync_region(da7219->regmap, DA7219_HP_L_CTRL,
246 DA7219_HP_R_CTRL); 255 DA7219_HP_R_CTRL);
256 msleep(DA7219_SETTLING_DELAY);
247 regcache_sync_region(da7219->regmap, DA7219_MIXOUT_L_CTRL, 257 regcache_sync_region(da7219->regmap, DA7219_MIXOUT_L_CTRL,
248 DA7219_MIXOUT_R_CTRL); 258 DA7219_MIXOUT_R_CTRL);
249 regcache_sync_region(da7219->regmap, DA7219_DROUTING_ST_OUTFILT_1L, 259 regcache_sync_region(da7219->regmap, DA7219_DROUTING_ST_OUTFILT_1L,
diff --git a/sound/soc/codecs/da7219.c b/sound/soc/codecs/da7219.c
index cf37936bfe3a..99601627f83c 100644
--- a/sound/soc/codecs/da7219.c
+++ b/sound/soc/codecs/da7219.c
@@ -823,6 +823,85 @@ static int da7219_dai_event(struct snd_soc_dapm_widget *w,
823 } 823 }
824} 824}
825 825
826static int da7219_settling_event(struct snd_soc_dapm_widget *w,
827 struct snd_kcontrol *kcontrol, int event)
828{
829 switch (event) {
830 case SND_SOC_DAPM_POST_PMU:
831 case SND_SOC_DAPM_POST_PMD:
832 msleep(DA7219_SETTLING_DELAY);
833 break;
834 default:
835 break;
836 }
837
838 return 0;
839}
840
841static int da7219_mixout_event(struct snd_soc_dapm_widget *w,
842 struct snd_kcontrol *kcontrol, int event)
843{
844 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
845 u8 hp_ctrl, min_gain_mask;
846
847 switch (w->reg) {
848 case DA7219_MIXOUT_L_CTRL:
849 hp_ctrl = DA7219_HP_L_CTRL;
850 min_gain_mask = DA7219_HP_L_AMP_MIN_GAIN_EN_MASK;
851 break;
852 case DA7219_MIXOUT_R_CTRL:
853 hp_ctrl = DA7219_HP_R_CTRL;
854 min_gain_mask = DA7219_HP_R_AMP_MIN_GAIN_EN_MASK;
855 break;
856 default:
857 return -EINVAL;
858 }
859
860 switch (event) {
861 case SND_SOC_DAPM_PRE_PMD:
862 /* Enable minimum gain on HP to avoid pops */
863 snd_soc_update_bits(codec, hp_ctrl, min_gain_mask,
864 min_gain_mask);
865
866 msleep(DA7219_MIN_GAIN_DELAY);
867
868 break;
869 case SND_SOC_DAPM_POST_PMU:
870 /* Remove minimum gain on HP */
871 snd_soc_update_bits(codec, hp_ctrl, min_gain_mask, 0);
872
873 break;
874 }
875
876 return 0;
877}
878
879static int da7219_gain_ramp_event(struct snd_soc_dapm_widget *w,
880 struct snd_kcontrol *kcontrol, int event)
881{
882 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
883 struct da7219_priv *da7219 = snd_soc_codec_get_drvdata(codec);
884
885 switch (event) {
886 case SND_SOC_DAPM_PRE_PMU:
887 case SND_SOC_DAPM_PRE_PMD:
888 /* Ensure nominal gain ramping for DAPM sequence */
889 da7219->gain_ramp_ctrl =
890 snd_soc_read(codec, DA7219_GAIN_RAMP_CTRL);
891 snd_soc_write(codec, DA7219_GAIN_RAMP_CTRL,
892 DA7219_GAIN_RAMP_RATE_NOMINAL);
893 break;
894 case SND_SOC_DAPM_POST_PMU:
895 case SND_SOC_DAPM_POST_PMD:
896 /* Restore previous gain ramp settings */
897 snd_soc_write(codec, DA7219_GAIN_RAMP_CTRL,
898 da7219->gain_ramp_ctrl);
899 break;
900 }
901
902 return 0;
903}
904
826 905
827/* 906/*
828 * DAPM Widgets 907 * DAPM Widgets
@@ -907,30 +986,46 @@ static const struct snd_soc_dapm_widget da7219_dapm_widgets[] = {
907 ARRAY_SIZE(da7219_st_out_filtr_mix_controls)), 986 ARRAY_SIZE(da7219_st_out_filtr_mix_controls)),
908 987
909 /* DACs */ 988 /* DACs */
910 SND_SOC_DAPM_DAC("DACL", NULL, DA7219_DAC_L_CTRL, DA7219_DAC_L_EN_SHIFT, 989 SND_SOC_DAPM_DAC_E("DACL", NULL, DA7219_DAC_L_CTRL,
911 DA7219_NO_INVERT), 990 DA7219_DAC_L_EN_SHIFT, DA7219_NO_INVERT,
912 SND_SOC_DAPM_DAC("DACR", NULL, DA7219_DAC_R_CTRL, DA7219_DAC_R_EN_SHIFT, 991 da7219_settling_event,
913 DA7219_NO_INVERT), 992 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
993 SND_SOC_DAPM_DAC_E("DACR", NULL, DA7219_DAC_R_CTRL,
994 DA7219_DAC_R_EN_SHIFT, DA7219_NO_INVERT,
995 da7219_settling_event,
996 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
914 997
915 /* Output PGAs */ 998 /* Output PGAs */
916 SND_SOC_DAPM_PGA("Mixout Left PGA", DA7219_MIXOUT_L_CTRL, 999 SND_SOC_DAPM_PGA_E("Mixout Left PGA", DA7219_MIXOUT_L_CTRL,
917 DA7219_MIXOUT_L_AMP_EN_SHIFT, DA7219_NO_INVERT, 1000 DA7219_MIXOUT_L_AMP_EN_SHIFT, DA7219_NO_INVERT,
918 NULL, 0), 1001 NULL, 0, da7219_mixout_event,
919 SND_SOC_DAPM_PGA("Mixout Right PGA", DA7219_MIXOUT_R_CTRL, 1002 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
920 DA7219_MIXOUT_R_AMP_EN_SHIFT, DA7219_NO_INVERT, 1003 SND_SOC_DAPM_PGA_E("Mixout Right PGA", DA7219_MIXOUT_R_CTRL,
921 NULL, 0), 1004 DA7219_MIXOUT_R_AMP_EN_SHIFT, DA7219_NO_INVERT,
922 SND_SOC_DAPM_PGA("Headphone Left PGA", DA7219_HP_L_CTRL, 1005 NULL, 0, da7219_mixout_event,
923 DA7219_HP_L_AMP_EN_SHIFT, DA7219_NO_INVERT, NULL, 0), 1006 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
924 SND_SOC_DAPM_PGA("Headphone Right PGA", DA7219_HP_R_CTRL, 1007 SND_SOC_DAPM_SUPPLY_S("Headphone Left PGA", 1, DA7219_HP_L_CTRL,
925 DA7219_HP_R_AMP_EN_SHIFT, DA7219_NO_INVERT, NULL, 0), 1008 DA7219_HP_L_AMP_EN_SHIFT, DA7219_NO_INVERT,
1009 da7219_settling_event,
1010 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
1011 SND_SOC_DAPM_SUPPLY_S("Headphone Right PGA", 1, DA7219_HP_R_CTRL,
1012 DA7219_HP_R_AMP_EN_SHIFT, DA7219_NO_INVERT,
1013 da7219_settling_event,
1014 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
926 1015
927 /* Output Supplies */ 1016 /* Output Supplies */
928 SND_SOC_DAPM_SUPPLY("Charge Pump", DA7219_CP_CTRL, DA7219_CP_EN_SHIFT, 1017 SND_SOC_DAPM_SUPPLY_S("Charge Pump", 0, DA7219_CP_CTRL,
929 DA7219_NO_INVERT, NULL, 0), 1018 DA7219_CP_EN_SHIFT, DA7219_NO_INVERT,
1019 da7219_settling_event,
1020 SND_SOC_DAPM_POST_PMU),
930 1021
931 /* Outputs */ 1022 /* Outputs */
932 SND_SOC_DAPM_OUTPUT("HPL"), 1023 SND_SOC_DAPM_OUTPUT("HPL"),
933 SND_SOC_DAPM_OUTPUT("HPR"), 1024 SND_SOC_DAPM_OUTPUT("HPR"),
1025
1026 /* Pre/Post Power */
1027 SND_SOC_DAPM_PRE("Pre Power Gain Ramp", da7219_gain_ramp_event),
1028 SND_SOC_DAPM_POST("Post Power Gain Ramp", da7219_gain_ramp_event),
934}; 1029};
935 1030
936 1031
@@ -1003,8 +1098,8 @@ static const struct snd_soc_dapm_route da7219_audio_map[] = {
1003 {"Mixout Left PGA", NULL, "DACL"}, 1098 {"Mixout Left PGA", NULL, "DACL"},
1004 {"Mixout Right PGA", NULL, "DACR"}, 1099 {"Mixout Right PGA", NULL, "DACR"},
1005 1100
1006 {"Headphone Left PGA", NULL, "Mixout Left PGA"}, 1101 {"HPL", NULL, "Mixout Left PGA"},
1007 {"Headphone Right PGA", NULL, "Mixout Right PGA"}, 1102 {"HPR", NULL, "Mixout Right PGA"},
1008 1103
1009 {"HPL", NULL, "Headphone Left PGA"}, 1104 {"HPL", NULL, "Headphone Left PGA"},
1010 {"HPR", NULL, "Headphone Right PGA"}, 1105 {"HPR", NULL, "Headphone Right PGA"},
@@ -1712,6 +1807,14 @@ static int da7219_probe(struct snd_soc_codec *codec)
1712 DA7219_HP_R_AMP_RAMP_EN_MASK, 1807 DA7219_HP_R_AMP_RAMP_EN_MASK,
1713 DA7219_HP_R_AMP_RAMP_EN_MASK); 1808 DA7219_HP_R_AMP_RAMP_EN_MASK);
1714 1809
1810 /* Default minimum gain on HP to avoid pops during DAPM sequencing */
1811 snd_soc_update_bits(codec, DA7219_HP_L_CTRL,
1812 DA7219_HP_L_AMP_MIN_GAIN_EN_MASK,
1813 DA7219_HP_L_AMP_MIN_GAIN_EN_MASK);
1814 snd_soc_update_bits(codec, DA7219_HP_R_CTRL,
1815 DA7219_HP_R_AMP_MIN_GAIN_EN_MASK,
1816 DA7219_HP_R_AMP_MIN_GAIN_EN_MASK);
1817
1715 /* Default infinite tone gen, start/stop by Kcontrol */ 1818 /* Default infinite tone gen, start/stop by Kcontrol */
1716 snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK); 1819 snd_soc_write(codec, DA7219_TONE_GEN_CYCLES, DA7219_BEEP_CYCLES_MASK);
1717 1820
diff --git a/sound/soc/codecs/da7219.h b/sound/soc/codecs/da7219.h
index 66d3bad86739..6baba7455fa1 100644
--- a/sound/soc/codecs/da7219.h
+++ b/sound/soc/codecs/da7219.h
@@ -777,6 +777,10 @@
777#define DA7219_SYS_STAT_CHECK_RETRIES 6 777#define DA7219_SYS_STAT_CHECK_RETRIES 6
778#define DA7219_SYS_STAT_CHECK_DELAY 50 778#define DA7219_SYS_STAT_CHECK_DELAY 50
779 779
780/* Power up/down Delays */
781#define DA7219_SETTLING_DELAY 40
782#define DA7219_MIN_GAIN_DELAY 30
783
780enum da7219_clk_src { 784enum da7219_clk_src {
781 DA7219_CLKSRC_MCLK = 0, 785 DA7219_CLKSRC_MCLK = 0,
782 DA7219_CLKSRC_MCLK_SQR, 786 DA7219_CLKSRC_MCLK_SQR,
@@ -814,6 +818,7 @@ struct da7219_priv {
814 818
815 bool master; 819 bool master;
816 bool alc_en; 820 bool alc_en;
821 u8 gain_ramp_ctrl;
817}; 822};
818 823
819#endif /* __DA7219_H */ 824#endif /* __DA7219_H */
diff --git a/sound/soc/codecs/es8328.h b/sound/soc/codecs/es8328.h
index 1a736e72a929..8930322d712b 100644
--- a/sound/soc/codecs/es8328.h
+++ b/sound/soc/codecs/es8328.h
@@ -278,43 +278,6 @@ int es8328_probe(struct device *dev, struct regmap *regmap);
278 278
279#define ES8328_REG_MAX 0x35 279#define ES8328_REG_MAX 0x35
280 280
281#define ES8328_PLL1 0
282#define ES8328_PLL2 1
283
284/* clock inputs */
285#define ES8328_MCLK 0
286#define ES8328_PCMCLK 1
287
288/* clock divider id's */
289#define ES8328_PCMDIV 0
290#define ES8328_BCLKDIV 1
291#define ES8328_VXCLKDIV 2
292
293/* PCM clock dividers */
294#define ES8328_PCM_DIV_1 (0 << 6)
295#define ES8328_PCM_DIV_3 (2 << 6)
296#define ES8328_PCM_DIV_5_5 (3 << 6)
297#define ES8328_PCM_DIV_2 (4 << 6)
298#define ES8328_PCM_DIV_4 (5 << 6)
299#define ES8328_PCM_DIV_6 (6 << 6)
300#define ES8328_PCM_DIV_8 (7 << 6)
301
302/* BCLK clock dividers */
303#define ES8328_BCLK_DIV_1 (0 << 7)
304#define ES8328_BCLK_DIV_2 (1 << 7)
305#define ES8328_BCLK_DIV_4 (2 << 7)
306#define ES8328_BCLK_DIV_8 (3 << 7)
307
308/* VXCLK clock dividers */
309#define ES8328_VXCLK_DIV_1 (0 << 6)
310#define ES8328_VXCLK_DIV_2 (1 << 6)
311#define ES8328_VXCLK_DIV_4 (2 << 6)
312#define ES8328_VXCLK_DIV_8 (3 << 6)
313#define ES8328_VXCLK_DIV_16 (4 << 6)
314
315#define ES8328_DAI_HIFI 0
316#define ES8328_DAI_VOICE 1
317
318#define ES8328_1536FS 1536 281#define ES8328_1536FS 1536
319#define ES8328_1024FS 1024 282#define ES8328_1024FS 1024
320#define ES8328_768FS 768 283#define ES8328_768FS 768
diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c
new file mode 100644
index 000000000000..d8e8590746af
--- /dev/null
+++ b/sound/soc/codecs/msm8916-wcd-analog.c
@@ -0,0 +1,890 @@
1#include <linux/module.h>
2#include <linux/err.h>
3#include <linux/kernel.h>
4#include <linux/delay.h>
5#include <linux/regulator/consumer.h>
6#include <linux/types.h>
7#include <linux/clk.h>
8#include <linux/of.h>
9#include <linux/platform_device.h>
10#include <linux/regmap.h>
11#include <sound/soc.h>
12#include <sound/pcm.h>
13#include <sound/pcm_params.h>
14#include <sound/tlv.h>
15
16#define CDC_D_REVISION1 (0xf000)
17#define CDC_D_PERPH_SUBTYPE (0xf005)
18#define CDC_D_CDC_RST_CTL (0xf046)
19#define RST_CTL_DIG_SW_RST_N_MASK BIT(7)
20#define RST_CTL_DIG_SW_RST_N_RESET 0
21#define RST_CTL_DIG_SW_RST_N_REMOVE_RESET BIT(7)
22
23#define CDC_D_CDC_TOP_CLK_CTL (0xf048)
24#define TOP_CLK_CTL_A_MCLK_MCLK2_EN_MASK (BIT(2) | BIT(3))
25#define TOP_CLK_CTL_A_MCLK_EN_ENABLE BIT(2)
26#define TOP_CLK_CTL_A_MCLK2_EN_ENABLE BIT(3)
27
28#define CDC_D_CDC_ANA_CLK_CTL (0xf049)
29#define ANA_CLK_CTL_EAR_HPHR_CLK_EN_MASK BIT(0)
30#define ANA_CLK_CTL_EAR_HPHR_CLK_EN BIT(0)
31#define ANA_CLK_CTL_EAR_HPHL_CLK_EN BIT(1)
32#define ANA_CLK_CTL_SPKR_CLK_EN_MASK BIT(4)
33#define ANA_CLK_CTL_SPKR_CLK_EN BIT(4)
34#define ANA_CLK_CTL_TXA_CLK25_EN BIT(5)
35
36#define CDC_D_CDC_DIG_CLK_CTL (0xf04A)
37#define DIG_CLK_CTL_RXD1_CLK_EN BIT(0)
38#define DIG_CLK_CTL_RXD2_CLK_EN BIT(1)
39#define DIG_CLK_CTL_RXD3_CLK_EN BIT(3)
40#define DIG_CLK_CTL_TXD_CLK_EN BIT(4)
41#define DIG_CLK_CTL_NCP_CLK_EN_MASK BIT(6)
42#define DIG_CLK_CTL_NCP_CLK_EN BIT(6)
43#define DIG_CLK_CTL_RXD_PDM_CLK_EN_MASK BIT(7)
44#define DIG_CLK_CTL_RXD_PDM_CLK_EN BIT(7)
45
46#define CDC_D_CDC_CONN_TX1_CTL (0xf050)
47#define CONN_TX1_SERIAL_TX1_MUX GENMASK(1, 0)
48#define CONN_TX1_SERIAL_TX1_ADC_1 0x0
49#define CONN_TX1_SERIAL_TX1_RX_PDM_LB 0x1
50#define CONN_TX1_SERIAL_TX1_ZERO 0x2
51
52#define CDC_D_CDC_CONN_TX2_CTL (0xf051)
53#define CONN_TX2_SERIAL_TX2_MUX GENMASK(1, 0)
54#define CONN_TX2_SERIAL_TX2_ADC_2 0x0
55#define CONN_TX2_SERIAL_TX2_RX_PDM_LB 0x1
56#define CONN_TX2_SERIAL_TX2_ZERO 0x2
57#define CDC_D_CDC_CONN_HPHR_DAC_CTL (0xf052)
58#define CDC_D_CDC_CONN_RX1_CTL (0xf053)
59#define CDC_D_CDC_CONN_RX2_CTL (0xf054)
60#define CDC_D_CDC_CONN_RX3_CTL (0xf055)
61#define CDC_D_CDC_CONN_RX_LB_CTL (0xf056)
62#define CDC_D_SEC_ACCESS (0xf0D0)
63#define CDC_D_PERPH_RESET_CTL3 (0xf0DA)
64#define CDC_D_PERPH_RESET_CTL4 (0xf0DB)
65#define CDC_A_REVISION1 (0xf100)
66#define CDC_A_REVISION2 (0xf101)
67#define CDC_A_REVISION3 (0xf102)
68#define CDC_A_REVISION4 (0xf103)
69#define CDC_A_PERPH_TYPE (0xf104)
70#define CDC_A_PERPH_SUBTYPE (0xf105)
71#define CDC_A_INT_RT_STS (0xf110)
72#define CDC_A_INT_SET_TYPE (0xf111)
73#define CDC_A_INT_POLARITY_HIGH (0xf112)
74#define CDC_A_INT_POLARITY_LOW (0xf113)
75#define CDC_A_INT_LATCHED_CLR (0xf114)
76#define CDC_A_INT_EN_SET (0xf115)
77#define CDC_A_INT_EN_CLR (0xf116)
78#define CDC_A_INT_LATCHED_STS (0xf118)
79#define CDC_A_INT_PENDING_STS (0xf119)
80#define CDC_A_INT_MID_SEL (0xf11A)
81#define CDC_A_INT_PRIORITY (0xf11B)
82#define CDC_A_MICB_1_EN (0xf140)
83#define MICB_1_EN_MICB_ENABLE BIT(7)
84#define MICB_1_EN_BYP_CAP_MASK BIT(6)
85#define MICB_1_EN_NO_EXT_BYP_CAP BIT(6)
86#define MICB_1_EN_EXT_BYP_CAP 0
87#define MICB_1_EN_PULL_DOWN_EN_MASK BIT(5)
88#define MICB_1_EN_PULL_DOWN_EN_ENABLE BIT(5)
89#define MICB_1_EN_OPA_STG2_TAIL_CURR_MASK GENMASK(3, 1)
90#define MICB_1_EN_OPA_STG2_TAIL_CURR_1_60UA (0x4)
91#define MICB_1_EN_PULL_UP_EN_MASK BIT(4)
92#define MICB_1_EN_TX3_GND_SEL_MASK BIT(0)
93#define MICB_1_EN_TX3_GND_SEL_TX_GND 0
94
95#define CDC_A_MICB_1_VAL (0xf141)
96#define MICB_1_VAL_MICB_OUT_VAL_MASK GENMASK(7, 3)
97#define MICB_1_VAL_MICB_OUT_VAL_V2P70V ((0x16) << 3)
98#define CDC_A_MICB_1_CTL (0xf142)
99
100#define MICB_1_CTL_CFILT_REF_SEL_MASK BIT(1)
101#define MICB_1_CTL_CFILT_REF_SEL_HPF_REF BIT(1)
102#define MICB_1_CTL_EXT_PRECHARG_EN_MASK BIT(5)
103#define MICB_1_CTL_EXT_PRECHARG_EN_ENABLE BIT(5)
104#define MICB_1_CTL_INT_PRECHARG_BYP_MASK BIT(6)
105#define MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL BIT(6)
106
107#define CDC_A_MICB_1_INT_RBIAS (0xf143)
108#define MICB_1_INT_TX1_INT_RBIAS_EN_MASK BIT(7)
109#define MICB_1_INT_TX1_INT_RBIAS_EN_ENABLE BIT(7)
110#define MICB_1_INT_TX1_INT_RBIAS_EN_DISABLE 0
111
112#define MICB_1_INT_TX1_INT_PULLUP_EN_MASK BIT(6)
113#define MICB_1_INT_TX1_INT_PULLUP_EN_TX1N_TO_MICBIAS BIT(6)
114#define MICB_1_INT_TX1_INT_PULLUP_EN_TX1N_TO_GND 0
115
116#define MICB_1_INT_TX2_INT_RBIAS_EN_MASK BIT(4)
117#define MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE BIT(4)
118#define MICB_1_INT_TX2_INT_RBIAS_EN_DISABLE 0
119#define MICB_1_INT_TX2_INT_PULLUP_EN_MASK BIT(3)
120#define MICB_1_INT_TX2_INT_PULLUP_EN_TX1N_TO_MICBIAS BIT(3)
121#define MICB_1_INT_TX2_INT_PULLUP_EN_TX1N_TO_GND 0
122
123#define MICB_1_INT_TX3_INT_RBIAS_EN_MASK BIT(1)
124#define MICB_1_INT_TX3_INT_RBIAS_EN_ENABLE BIT(1)
125#define MICB_1_INT_TX3_INT_RBIAS_EN_DISABLE 0
126#define MICB_1_INT_TX3_INT_PULLUP_EN_MASK BIT(0)
127#define MICB_1_INT_TX3_INT_PULLUP_EN_TX1N_TO_MICBIAS BIT(0)
128#define MICB_1_INT_TX3_INT_PULLUP_EN_TX1N_TO_GND 0
129
130#define CDC_A_MICB_2_EN (0xf144)
131#define CDC_A_TX_1_2_ATEST_CTL_2 (0xf145)
132#define CDC_A_MASTER_BIAS_CTL (0xf146)
133#define CDC_A_TX_1_EN (0xf160)
134#define CDC_A_TX_2_EN (0xf161)
135#define CDC_A_TX_1_2_TEST_CTL_1 (0xf162)
136#define CDC_A_TX_1_2_TEST_CTL_2 (0xf163)
137#define CDC_A_TX_1_2_ATEST_CTL (0xf164)
138#define CDC_A_TX_1_2_OPAMP_BIAS (0xf165)
139#define CDC_A_TX_3_EN (0xf167)
140#define CDC_A_NCP_EN (0xf180)
141#define CDC_A_NCP_CLK (0xf181)
142#define CDC_A_NCP_FBCTRL (0xf183)
143#define CDC_A_NCP_FBCTRL_FB_CLK_INV_MASK BIT(5)
144#define CDC_A_NCP_FBCTRL_FB_CLK_INV BIT(5)
145#define CDC_A_NCP_BIAS (0xf184)
146#define CDC_A_NCP_VCTRL (0xf185)
147#define CDC_A_NCP_TEST (0xf186)
148#define CDC_A_NCP_CLIM_ADDR (0xf187)
149#define CDC_A_RX_CLOCK_DIVIDER (0xf190)
150#define CDC_A_RX_COM_OCP_CTL (0xf191)
151#define CDC_A_RX_COM_OCP_COUNT (0xf192)
152#define CDC_A_RX_COM_BIAS_DAC (0xf193)
153#define RX_COM_BIAS_DAC_RX_BIAS_EN_MASK BIT(7)
154#define RX_COM_BIAS_DAC_RX_BIAS_EN_ENABLE BIT(7)
155#define RX_COM_BIAS_DAC_DAC_REF_EN_MASK BIT(0)
156#define RX_COM_BIAS_DAC_DAC_REF_EN_ENABLE BIT(0)
157
158#define CDC_A_RX_HPH_BIAS_PA (0xf194)
159#define CDC_A_RX_HPH_BIAS_LDO_OCP (0xf195)
160#define CDC_A_RX_HPH_BIAS_CNP (0xf196)
161#define CDC_A_RX_HPH_CNP_EN (0xf197)
162#define CDC_A_RX_HPH_L_PA_DAC_CTL (0xf19B)
163#define RX_HPA_L_PA_DAC_CTL_DATA_RESET_MASK BIT(1)
164#define RX_HPA_L_PA_DAC_CTL_DATA_RESET_RESET BIT(1)
165#define CDC_A_RX_HPH_R_PA_DAC_CTL (0xf19D)
166#define RX_HPH_R_PA_DAC_CTL_DATA_RESET BIT(1)
167#define RX_HPH_R_PA_DAC_CTL_DATA_RESET_MASK BIT(1)
168
169#define CDC_A_RX_EAR_CTL (0xf19E)
170#define RX_EAR_CTL_SPK_VBAT_LDO_EN_MASK BIT(0)
171#define RX_EAR_CTL_SPK_VBAT_LDO_EN_ENABLE BIT(0)
172
173#define CDC_A_SPKR_DAC_CTL (0xf1B0)
174#define SPKR_DAC_CTL_DAC_RESET_MASK BIT(4)
175#define SPKR_DAC_CTL_DAC_RESET_NORMAL 0
176
177#define CDC_A_SPKR_DRV_CTL (0xf1B2)
178#define SPKR_DRV_CTL_DEF_MASK 0xEF
179#define SPKR_DRV_CLASSD_PA_EN_MASK BIT(7)
180#define SPKR_DRV_CLASSD_PA_EN_ENABLE BIT(7)
181#define SPKR_DRV_CAL_EN BIT(6)
182#define SPKR_DRV_SETTLE_EN BIT(5)
183#define SPKR_DRV_FW_EN BIT(3)
184#define SPKR_DRV_BOOST_SET BIT(2)
185#define SPKR_DRV_CMFB_SET BIT(1)
186#define SPKR_DRV_GAIN_SET BIT(0)
187#define SPKR_DRV_CTL_DEF_VAL (SPKR_DRV_CLASSD_PA_EN_ENABLE | \
188 SPKR_DRV_CAL_EN | SPKR_DRV_SETTLE_EN | \
189 SPKR_DRV_FW_EN | SPKR_DRV_BOOST_SET | \
190 SPKR_DRV_CMFB_SET | SPKR_DRV_GAIN_SET)
191#define CDC_A_SPKR_OCP_CTL (0xf1B4)
192#define CDC_A_SPKR_PWRSTG_CTL (0xf1B5)
193#define SPKR_PWRSTG_CTL_DAC_EN_MASK BIT(0)
194#define SPKR_PWRSTG_CTL_DAC_EN BIT(0)
195#define SPKR_PWRSTG_CTL_MASK 0xE0
196#define SPKR_PWRSTG_CTL_BBM_MASK BIT(7)
197#define SPKR_PWRSTG_CTL_BBM_EN BIT(7)
198#define SPKR_PWRSTG_CTL_HBRDGE_EN_MASK BIT(6)
199#define SPKR_PWRSTG_CTL_HBRDGE_EN BIT(6)
200#define SPKR_PWRSTG_CTL_CLAMP_EN_MASK BIT(5)
201#define SPKR_PWRSTG_CTL_CLAMP_EN BIT(5)
202
203#define CDC_A_SPKR_DRV_DBG (0xf1B7)
204#define CDC_A_CURRENT_LIMIT (0xf1C0)
205#define CDC_A_BOOST_EN_CTL (0xf1C3)
206#define CDC_A_SLOPE_COMP_IP_ZERO (0xf1C4)
207#define CDC_A_SEC_ACCESS (0xf1D0)
208#define CDC_A_PERPH_RESET_CTL3 (0xf1DA)
209#define CDC_A_PERPH_RESET_CTL4 (0xf1DB)
210
211#define MSM8916_WCD_ANALOG_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
212 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000)
213#define MSM8916_WCD_ANALOG_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
214 SNDRV_PCM_FMTBIT_S24_LE)
215
216static const char * const supply_names[] = {
217 "vdd-cdc-io",
218 "vdd-cdc-tx-rx-cx",
219};
220
221struct pm8916_wcd_analog_priv {
222 u16 pmic_rev;
223 u16 codec_version;
224 struct clk *mclk;
225 struct regulator_bulk_data supplies[ARRAY_SIZE(supply_names)];
226 bool micbias1_cap_mode;
227 bool micbias2_cap_mode;
228};
229
230static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
231static const char *const rdac2_mux_text[] = { "ZERO", "RX2", "RX1" };
232static const char *const hph_text[] = { "ZERO", "Switch", };
233
234static const struct soc_enum hph_enum = SOC_ENUM_SINGLE_VIRT(
235 ARRAY_SIZE(hph_text), hph_text);
236
237static const struct snd_kcontrol_new hphl_mux = SOC_DAPM_ENUM("HPHL", hph_enum);
238static const struct snd_kcontrol_new hphr_mux = SOC_DAPM_ENUM("HPHR", hph_enum);
239
240/* ADC2 MUX */
241static const struct soc_enum adc2_enum = SOC_ENUM_SINGLE_VIRT(
242 ARRAY_SIZE(adc2_mux_text), adc2_mux_text);
243
244/* RDAC2 MUX */
245static const struct soc_enum rdac2_mux_enum = SOC_ENUM_SINGLE(
246 CDC_D_CDC_CONN_HPHR_DAC_CTL, 0, 3, rdac2_mux_text);
247
248static const struct snd_kcontrol_new spkr_switch[] = {
249 SOC_DAPM_SINGLE("Switch", CDC_A_SPKR_DAC_CTL, 7, 1, 0)
250};
251
252static const struct snd_kcontrol_new rdac2_mux = SOC_DAPM_ENUM(
253 "RDAC2 MUX Mux", rdac2_mux_enum);
254static const struct snd_kcontrol_new tx_adc2_mux = SOC_DAPM_ENUM(
255 "ADC2 MUX Mux", adc2_enum);
256
257/* Analog Gain control 0 dB to +24 dB in 6 dB steps */
258static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 600, 0);
259
260static const struct snd_kcontrol_new pm8916_wcd_analog_snd_controls[] = {
261 SOC_SINGLE_TLV("ADC1 Volume", CDC_A_TX_1_EN, 3, 8, 0, analog_gain),
262 SOC_SINGLE_TLV("ADC2 Volume", CDC_A_TX_2_EN, 3, 8, 0, analog_gain),
263 SOC_SINGLE_TLV("ADC3 Volume", CDC_A_TX_3_EN, 3, 8, 0, analog_gain),
264};
265
266static void pm8916_wcd_analog_micbias_enable(struct snd_soc_codec *codec)
267{
268 snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
269 MICB_1_CTL_EXT_PRECHARG_EN_MASK |
270 MICB_1_CTL_INT_PRECHARG_BYP_MASK,
271 MICB_1_CTL_INT_PRECHARG_BYP_EXT_PRECHRG_SEL
272 | MICB_1_CTL_EXT_PRECHARG_EN_ENABLE);
273
274 snd_soc_write(codec, CDC_A_MICB_1_VAL, MICB_1_VAL_MICB_OUT_VAL_V2P70V);
275 /*
276 * Special headset needs MICBIAS as 2.7V so wait for
277 * 50 msec for the MICBIAS to reach 2.7 volts.
278 */
279 msleep(50);
280 snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
281 MICB_1_CTL_EXT_PRECHARG_EN_MASK |
282 MICB_1_CTL_INT_PRECHARG_BYP_MASK, 0);
283
284}
285
286static int pm8916_wcd_analog_enable_micbias_ext(struct snd_soc_codec
287 *codec, int event,
288 int reg, u32 cap_mode)
289{
290 switch (event) {
291 case SND_SOC_DAPM_POST_PMU:
292 pm8916_wcd_analog_micbias_enable(codec);
293 snd_soc_update_bits(codec, CDC_A_MICB_1_EN,
294 MICB_1_EN_BYP_CAP_MASK, cap_mode);
295 break;
296 }
297
298 return 0;
299}
300
301static int pm8916_wcd_analog_enable_micbias_int(struct snd_soc_codec
302 *codec, int event,
303 int reg, u32 cap_mode)
304{
305
306 switch (event) {
307 case SND_SOC_DAPM_PRE_PMU:
308 snd_soc_update_bits(codec, CDC_A_MICB_1_INT_RBIAS,
309 MICB_1_INT_TX2_INT_RBIAS_EN_MASK,
310 MICB_1_INT_TX2_INT_RBIAS_EN_ENABLE);
311 snd_soc_update_bits(codec, reg, MICB_1_EN_PULL_DOWN_EN_MASK, 0);
312 snd_soc_update_bits(codec, CDC_A_MICB_1_EN,
313 MICB_1_EN_OPA_STG2_TAIL_CURR_MASK,
314 MICB_1_EN_OPA_STG2_TAIL_CURR_1_60UA);
315
316 break;
317 case SND_SOC_DAPM_POST_PMU:
318 pm8916_wcd_analog_micbias_enable(codec);
319 snd_soc_update_bits(codec, CDC_A_MICB_1_EN,
320 MICB_1_EN_BYP_CAP_MASK, cap_mode);
321 break;
322 }
323
324 return 0;
325}
326
327static int pm8916_wcd_analog_enable_micbias_ext1(struct
328 snd_soc_dapm_widget
329 *w, struct snd_kcontrol
330 *kcontrol, int event)
331{
332 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
333 struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
334
335 return pm8916_wcd_analog_enable_micbias_ext(codec, event, w->reg,
336 wcd->micbias1_cap_mode);
337}
338
339static int pm8916_wcd_analog_enable_micbias_ext2(struct
340 snd_soc_dapm_widget
341 *w, struct snd_kcontrol
342 *kcontrol, int event)
343{
344 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
345 struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
346
347 return pm8916_wcd_analog_enable_micbias_ext(codec, event, w->reg,
348 wcd->micbias2_cap_mode);
349
350}
351
352static int pm8916_wcd_analog_enable_micbias_int1(struct
353 snd_soc_dapm_widget
354 *w, struct snd_kcontrol
355 *kcontrol, int event)
356{
357 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
358 struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
359
360 return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg,
361 wcd->micbias1_cap_mode);
362}
363
364static int pm8916_wcd_analog_enable_micbias_int2(struct
365 snd_soc_dapm_widget
366 *w, struct snd_kcontrol
367 *kcontrol, int event)
368{
369 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
370 struct pm8916_wcd_analog_priv *wcd = snd_soc_codec_get_drvdata(codec);
371
372 return pm8916_wcd_analog_enable_micbias_int(codec, event, w->reg,
373 wcd->micbias2_cap_mode);
374}
375
376static int pm8916_wcd_analog_enable_adc(struct snd_soc_dapm_widget *w,
377 struct snd_kcontrol *kcontrol,
378 int event)
379{
380 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
381 u16 adc_reg = CDC_A_TX_1_2_TEST_CTL_2;
382 u8 init_bit_shift;
383
384 if (w->reg == CDC_A_TX_1_EN)
385 init_bit_shift = 5;
386 else
387 init_bit_shift = 4;
388
389 switch (event) {
390 case SND_SOC_DAPM_PRE_PMU:
391 if (w->reg == CDC_A_TX_2_EN)
392 snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
393 MICB_1_CTL_CFILT_REF_SEL_MASK,
394 MICB_1_CTL_CFILT_REF_SEL_HPF_REF);
395 /*
396 * Add delay of 10 ms to give sufficient time for the voltage
397 * to shoot up and settle so that the txfe init does not
398 * happen when the input voltage is changing too much.
399 */
400 usleep_range(10000, 10010);
401 snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift,
402 1 << init_bit_shift);
403 switch (w->reg) {
404 case CDC_A_TX_1_EN:
405 snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX1_CTL,
406 CONN_TX1_SERIAL_TX1_MUX,
407 CONN_TX1_SERIAL_TX1_ADC_1);
408 break;
409 case CDC_A_TX_2_EN:
410 case CDC_A_TX_3_EN:
411 snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX2_CTL,
412 CONN_TX2_SERIAL_TX2_MUX,
413 CONN_TX2_SERIAL_TX2_ADC_2);
414 break;
415 }
416 break;
417 case SND_SOC_DAPM_POST_PMU:
418 /*
419 * Add delay of 12 ms before deasserting the init
420 * to reduce the tx pop
421 */
422 usleep_range(12000, 12010);
423 snd_soc_update_bits(codec, adc_reg, 1 << init_bit_shift, 0x00);
424 break;
425 case SND_SOC_DAPM_POST_PMD:
426 switch (w->reg) {
427 case CDC_A_TX_1_EN:
428 snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX1_CTL,
429 CONN_TX1_SERIAL_TX1_MUX,
430 CONN_TX1_SERIAL_TX1_ZERO);
431 break;
432 case CDC_A_TX_2_EN:
433 snd_soc_update_bits(codec, CDC_A_MICB_1_CTL,
434 MICB_1_CTL_CFILT_REF_SEL_MASK, 0);
435 case CDC_A_TX_3_EN:
436 snd_soc_update_bits(codec, CDC_D_CDC_CONN_TX2_CTL,
437 CONN_TX2_SERIAL_TX2_MUX,
438 CONN_TX2_SERIAL_TX2_ZERO);
439 break;
440 }
441
442
443 break;
444 }
445 return 0;
446}
447
448static int pm8916_wcd_analog_enable_spk_pa(struct snd_soc_dapm_widget *w,
449 struct snd_kcontrol *kcontrol,
450 int event)
451{
452 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
453
454 switch (event) {
455 case SND_SOC_DAPM_PRE_PMU:
456 snd_soc_update_bits(codec, CDC_A_SPKR_PWRSTG_CTL,
457 SPKR_PWRSTG_CTL_DAC_EN_MASK |
458 SPKR_PWRSTG_CTL_BBM_MASK |
459 SPKR_PWRSTG_CTL_HBRDGE_EN_MASK |
460 SPKR_PWRSTG_CTL_CLAMP_EN_MASK,
461 SPKR_PWRSTG_CTL_DAC_EN|
462 SPKR_PWRSTG_CTL_BBM_EN |
463 SPKR_PWRSTG_CTL_HBRDGE_EN |
464 SPKR_PWRSTG_CTL_CLAMP_EN);
465
466 snd_soc_update_bits(codec, CDC_A_RX_EAR_CTL,
467 RX_EAR_CTL_SPK_VBAT_LDO_EN_MASK,
468 RX_EAR_CTL_SPK_VBAT_LDO_EN_ENABLE);
469 break;
470 case SND_SOC_DAPM_POST_PMU:
471 snd_soc_update_bits(codec, CDC_A_SPKR_DRV_CTL,
472 SPKR_DRV_CTL_DEF_MASK,
473 SPKR_DRV_CTL_DEF_VAL);
474 snd_soc_update_bits(codec, w->reg,
475 SPKR_DRV_CLASSD_PA_EN_MASK,
476 SPKR_DRV_CLASSD_PA_EN_ENABLE);
477 break;
478 case SND_SOC_DAPM_POST_PMD:
479 snd_soc_update_bits(codec, CDC_A_SPKR_PWRSTG_CTL,
480 SPKR_PWRSTG_CTL_DAC_EN_MASK|
481 SPKR_PWRSTG_CTL_BBM_MASK |
482 SPKR_PWRSTG_CTL_HBRDGE_EN_MASK |
483 SPKR_PWRSTG_CTL_CLAMP_EN_MASK, 0);
484
485 snd_soc_update_bits(codec, CDC_A_SPKR_DAC_CTL,
486 SPKR_DAC_CTL_DAC_RESET_MASK,
487 SPKR_DAC_CTL_DAC_RESET_NORMAL);
488 snd_soc_update_bits(codec, CDC_A_RX_EAR_CTL,
489 RX_EAR_CTL_SPK_VBAT_LDO_EN_MASK, 0);
490 break;
491 }
492 return 0;
493}
494
495static const struct reg_default wcd_reg_defaults_2_0[] = {
496 {CDC_A_RX_COM_OCP_CTL, 0xD1},
497 {CDC_A_RX_COM_OCP_COUNT, 0xFF},
498 {CDC_D_SEC_ACCESS, 0xA5},
499 {CDC_D_PERPH_RESET_CTL3, 0x0F},
500 {CDC_A_TX_1_2_OPAMP_BIAS, 0x4F},
501 {CDC_A_NCP_FBCTRL, 0x28},
502 {CDC_A_SPKR_DRV_CTL, 0x69},
503 {CDC_A_SPKR_DRV_DBG, 0x01},
504 {CDC_A_BOOST_EN_CTL, 0x5F},
505 {CDC_A_SLOPE_COMP_IP_ZERO, 0x88},
506 {CDC_A_SEC_ACCESS, 0xA5},
507 {CDC_A_PERPH_RESET_CTL3, 0x0F},
508 {CDC_A_CURRENT_LIMIT, 0x82},
509 {CDC_A_SPKR_DAC_CTL, 0x03},
510 {CDC_A_SPKR_OCP_CTL, 0xE1},
511 {CDC_A_MASTER_BIAS_CTL, 0x30},
512};
513
514static int pm8916_wcd_analog_probe(struct snd_soc_codec *codec)
515{
516 struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev);
517 int err, reg;
518
519 err = regulator_bulk_enable(ARRAY_SIZE(priv->supplies), priv->supplies);
520 if (err != 0) {
521 dev_err(codec->dev, "failed to enable regulators (%d)\n", err);
522 return err;
523 }
524
525 snd_soc_codec_set_drvdata(codec, priv);
526 priv->pmic_rev = snd_soc_read(codec, CDC_D_REVISION1);
527 priv->codec_version = snd_soc_read(codec, CDC_D_PERPH_SUBTYPE);
528
529 dev_info(codec->dev, "PMIC REV: %d\t CODEC Version: %d\n",
530 priv->pmic_rev, priv->codec_version);
531
532 snd_soc_write(codec, CDC_D_PERPH_RESET_CTL4, 0x01);
533 snd_soc_write(codec, CDC_A_PERPH_RESET_CTL4, 0x01);
534
535 for (reg = 0; reg < ARRAY_SIZE(wcd_reg_defaults_2_0); reg++)
536 snd_soc_write(codec, wcd_reg_defaults_2_0[reg].reg,
537 wcd_reg_defaults_2_0[reg].def);
538
539 return 0;
540}
541
542static int pm8916_wcd_analog_remove(struct snd_soc_codec *codec)
543{
544 struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(codec->dev);
545
546 return regulator_bulk_disable(ARRAY_SIZE(priv->supplies),
547 priv->supplies);
548}
549
550static const struct snd_soc_dapm_route pm8916_wcd_analog_audio_map[] = {
551
552 {"PDM_RX1", NULL, "PDM Playback"},
553 {"PDM_RX2", NULL, "PDM Playback"},
554 {"PDM_RX3", NULL, "PDM Playback"},
555 {"PDM Capture", NULL, "PDM_TX"},
556
557 /* ADC Connections */
558 {"PDM_TX", NULL, "ADC2"},
559 {"PDM_TX", NULL, "ADC3"},
560 {"ADC2", NULL, "ADC2 MUX"},
561 {"ADC3", NULL, "ADC2 MUX"},
562 {"ADC2 MUX", "INP2", "ADC2_INP2"},
563 {"ADC2 MUX", "INP3", "ADC2_INP3"},
564
565 {"PDM_TX", NULL, "ADC1"},
566 {"ADC1", NULL, "AMIC1"},
567 {"ADC2_INP2", NULL, "AMIC2"},
568 {"ADC2_INP3", NULL, "AMIC3"},
569
570 /* RDAC Connections */
571 {"HPHR DAC", NULL, "RDAC2 MUX"},
572 {"RDAC2 MUX", "RX1", "PDM_RX1"},
573 {"RDAC2 MUX", "RX2", "PDM_RX2"},
574 {"HPHL DAC", NULL, "PDM_RX1"},
575 {"PDM_RX1", NULL, "RXD1_CLK"},
576 {"PDM_RX2", NULL, "RXD2_CLK"},
577 {"PDM_RX3", NULL, "RXD3_CLK"},
578
579 {"PDM_RX1", NULL, "RXD_PDM_CLK"},
580 {"PDM_RX2", NULL, "RXD_PDM_CLK"},
581 {"PDM_RX3", NULL, "RXD_PDM_CLK"},
582
583 {"ADC1", NULL, "TXD_CLK"},
584 {"ADC2", NULL, "TXD_CLK"},
585 {"ADC3", NULL, "TXD_CLK"},
586
587 {"ADC1", NULL, "TXA_CLK25"},
588 {"ADC2", NULL, "TXA_CLK25"},
589 {"ADC3", NULL, "TXA_CLK25"},
590
591 {"PDM_RX1", NULL, "A_MCLK2"},
592 {"PDM_RX2", NULL, "A_MCLK2"},
593 {"PDM_RX3", NULL, "A_MCLK2"},
594
595 {"PDM_TX", NULL, "A_MCLK2"},
596 {"A_MCLK2", NULL, "A_MCLK"},
597
598 /* Headset (RX MIX1 and RX MIX2) */
599 {"HEADPHONE", NULL, "HPHL PA"},
600 {"HEADPHONE", NULL, "HPHR PA"},
601
602 {"HPHL PA", NULL, "EAR_HPHL_CLK"},
603 {"HPHR PA", NULL, "EAR_HPHR_CLK"},
604
605 {"CP", NULL, "NCP_CLK"},
606
607 {"HPHL PA", NULL, "HPHL"},
608 {"HPHR PA", NULL, "HPHR"},
609 {"HPHL PA", NULL, "CP"},
610 {"HPHL PA", NULL, "RX_BIAS"},
611 {"HPHR PA", NULL, "CP"},
612 {"HPHR PA", NULL, "RX_BIAS"},
613 {"HPHL", "Switch", "HPHL DAC"},
614 {"HPHR", "Switch", "HPHR DAC"},
615
616 {"RX_BIAS", NULL, "DAC_REF"},
617
618 {"SPK_OUT", NULL, "SPK PA"},
619 {"SPK PA", NULL, "RX_BIAS"},
620 {"SPK PA", NULL, "SPKR_CLK"},
621 {"SPK PA", NULL, "SPK DAC"},
622 {"SPK DAC", "Switch", "PDM_RX3"},
623
624 {"MIC BIAS Internal1", NULL, "INT_LDO_H"},
625 {"MIC BIAS Internal2", NULL, "INT_LDO_H"},
626 {"MIC BIAS External1", NULL, "INT_LDO_H"},
627 {"MIC BIAS External2", NULL, "INT_LDO_H"},
628 {"MIC BIAS Internal1", NULL, "vdd-micbias"},
629 {"MIC BIAS Internal2", NULL, "vdd-micbias"},
630 {"MIC BIAS External1", NULL, "vdd-micbias"},
631 {"MIC BIAS External2", NULL, "vdd-micbias"},
632};
633
634static const struct snd_soc_dapm_widget pm8916_wcd_analog_dapm_widgets[] = {
635
636 SND_SOC_DAPM_AIF_IN("PDM_RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
637 SND_SOC_DAPM_AIF_IN("PDM_RX2", NULL, 0, SND_SOC_NOPM, 0, 0),
638 SND_SOC_DAPM_AIF_IN("PDM_RX3", NULL, 0, SND_SOC_NOPM, 0, 0),
639 SND_SOC_DAPM_AIF_OUT("PDM_TX", NULL, 0, SND_SOC_NOPM, 0, 0),
640
641 SND_SOC_DAPM_INPUT("AMIC1"),
642 SND_SOC_DAPM_INPUT("AMIC3"),
643 SND_SOC_DAPM_INPUT("AMIC2"),
644 SND_SOC_DAPM_OUTPUT("HEADPHONE"),
645
646 /* RX stuff */
647 SND_SOC_DAPM_SUPPLY("INT_LDO_H", SND_SOC_NOPM, 1, 0, NULL, 0),
648
649 SND_SOC_DAPM_PGA("HPHL PA", CDC_A_RX_HPH_CNP_EN, 5, 0, NULL, 0),
650 SND_SOC_DAPM_MUX("HPHL", SND_SOC_NOPM, 0, 0, &hphl_mux),
651 SND_SOC_DAPM_MIXER("HPHL DAC", CDC_A_RX_HPH_L_PA_DAC_CTL, 3, 0, NULL,
652 0),
653 SND_SOC_DAPM_PGA("HPHR PA", CDC_A_RX_HPH_CNP_EN, 4, 0, NULL, 0),
654 SND_SOC_DAPM_MUX("HPHR", SND_SOC_NOPM, 0, 0, &hphr_mux),
655 SND_SOC_DAPM_MIXER("HPHR DAC", CDC_A_RX_HPH_R_PA_DAC_CTL, 3, 0, NULL,
656 0),
657 SND_SOC_DAPM_MIXER("SPK DAC", SND_SOC_NOPM, 0, 0,
658 spkr_switch, ARRAY_SIZE(spkr_switch)),
659
660 /* Speaker */
661 SND_SOC_DAPM_OUTPUT("SPK_OUT"),
662 SND_SOC_DAPM_PGA_E("SPK PA", CDC_A_SPKR_DRV_CTL,
663 6, 0, NULL, 0,
664 pm8916_wcd_analog_enable_spk_pa,
665 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
666 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
667 SND_SOC_DAPM_REGULATOR_SUPPLY("vdd-micbias", 0, 0),
668 SND_SOC_DAPM_SUPPLY("CP", CDC_A_NCP_EN, 0, 0, NULL, 0),
669
670 SND_SOC_DAPM_SUPPLY("DAC_REF", CDC_A_RX_COM_BIAS_DAC, 0, 0, NULL, 0),
671 SND_SOC_DAPM_SUPPLY("RX_BIAS", CDC_A_RX_COM_BIAS_DAC, 7, 0, NULL, 0),
672
673 /* TX */
674 SND_SOC_DAPM_SUPPLY("MIC BIAS Internal1", CDC_A_MICB_1_EN, 7, 0,
675 pm8916_wcd_analog_enable_micbias_int1,
676 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
677 SND_SOC_DAPM_POST_PMD),
678 SND_SOC_DAPM_SUPPLY("MIC BIAS Internal2", CDC_A_MICB_2_EN, 7, 0,
679 pm8916_wcd_analog_enable_micbias_int2,
680 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
681 SND_SOC_DAPM_POST_PMD),
682
683 SND_SOC_DAPM_SUPPLY("MIC BIAS External1", CDC_A_MICB_1_EN, 7, 0,
684 pm8916_wcd_analog_enable_micbias_ext1,
685 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
686 SND_SOC_DAPM_SUPPLY("MIC BIAS External2", CDC_A_MICB_2_EN, 7, 0,
687 pm8916_wcd_analog_enable_micbias_ext2,
688 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
689
690 SND_SOC_DAPM_ADC_E("ADC1", NULL, CDC_A_TX_1_EN, 7, 0,
691 pm8916_wcd_analog_enable_adc,
692 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
693 SND_SOC_DAPM_POST_PMD),
694 SND_SOC_DAPM_ADC_E("ADC2_INP2", NULL, CDC_A_TX_2_EN, 7, 0,
695 pm8916_wcd_analog_enable_adc,
696 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
697 SND_SOC_DAPM_POST_PMD),
698 SND_SOC_DAPM_ADC_E("ADC2_INP3", NULL, CDC_A_TX_3_EN, 7, 0,
699 pm8916_wcd_analog_enable_adc,
700 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
701 SND_SOC_DAPM_POST_PMD),
702
703 SND_SOC_DAPM_MIXER("ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
704 SND_SOC_DAPM_MIXER("ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
705
706 SND_SOC_DAPM_MUX("ADC2 MUX", SND_SOC_NOPM, 0, 0, &tx_adc2_mux),
707 SND_SOC_DAPM_MUX("RDAC2 MUX", SND_SOC_NOPM, 0, 0, &rdac2_mux),
708
709 /* Analog path clocks */
710 SND_SOC_DAPM_SUPPLY("EAR_HPHR_CLK", CDC_D_CDC_ANA_CLK_CTL, 0, 0, NULL,
711 0),
712 SND_SOC_DAPM_SUPPLY("EAR_HPHL_CLK", CDC_D_CDC_ANA_CLK_CTL, 1, 0, NULL,
713 0),
714 SND_SOC_DAPM_SUPPLY("SPKR_CLK", CDC_D_CDC_ANA_CLK_CTL, 4, 0, NULL, 0),
715 SND_SOC_DAPM_SUPPLY("TXA_CLK25", CDC_D_CDC_ANA_CLK_CTL, 5, 0, NULL, 0),
716
717 /* Digital path clocks */
718
719 SND_SOC_DAPM_SUPPLY("RXD1_CLK", CDC_D_CDC_DIG_CLK_CTL, 0, 0, NULL, 0),
720 SND_SOC_DAPM_SUPPLY("RXD2_CLK", CDC_D_CDC_DIG_CLK_CTL, 1, 0, NULL, 0),
721 SND_SOC_DAPM_SUPPLY("RXD3_CLK", CDC_D_CDC_DIG_CLK_CTL, 2, 0, NULL, 0),
722
723 SND_SOC_DAPM_SUPPLY("TXD_CLK", CDC_D_CDC_DIG_CLK_CTL, 4, 0, NULL, 0),
724 SND_SOC_DAPM_SUPPLY("NCP_CLK", CDC_D_CDC_DIG_CLK_CTL, 6, 0, NULL, 0),
725 SND_SOC_DAPM_SUPPLY("RXD_PDM_CLK", CDC_D_CDC_DIG_CLK_CTL, 7, 0, NULL,
726 0),
727
728 /* System Clock source */
729 SND_SOC_DAPM_SUPPLY("A_MCLK", CDC_D_CDC_TOP_CLK_CTL, 2, 0, NULL, 0),
730 /* TX ADC and RX DAC Clock source. */
731 SND_SOC_DAPM_SUPPLY("A_MCLK2", CDC_D_CDC_TOP_CLK_CTL, 3, 0, NULL, 0),
732};
733
734static struct regmap *pm8916_get_regmap(struct device *dev)
735{
736 return dev_get_regmap(dev->parent, NULL);
737}
738
739static int pm8916_wcd_analog_startup(struct snd_pcm_substream *substream,
740 struct snd_soc_dai *dai)
741{
742 snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL,
743 RST_CTL_DIG_SW_RST_N_MASK,
744 RST_CTL_DIG_SW_RST_N_REMOVE_RESET);
745
746 return 0;
747}
748
749static void pm8916_wcd_analog_shutdown(struct snd_pcm_substream *substream,
750 struct snd_soc_dai *dai)
751{
752 snd_soc_update_bits(dai->codec, CDC_D_CDC_RST_CTL,
753 RST_CTL_DIG_SW_RST_N_MASK, 0);
754}
755
756static struct snd_soc_dai_ops pm8916_wcd_analog_dai_ops = {
757 .startup = pm8916_wcd_analog_startup,
758 .shutdown = pm8916_wcd_analog_shutdown,
759};
760
761static struct snd_soc_dai_driver pm8916_wcd_analog_dai[] = {
762 [0] = {
763 .name = "pm8916_wcd_analog_pdm_rx",
764 .id = 0,
765 .playback = {
766 .stream_name = "PDM Playback",
767 .rates = MSM8916_WCD_ANALOG_RATES,
768 .formats = MSM8916_WCD_ANALOG_FORMATS,
769 .channels_min = 1,
770 .channels_max = 3,
771 },
772 .ops = &pm8916_wcd_analog_dai_ops,
773 },
774 [1] = {
775 .name = "pm8916_wcd_analog_pdm_tx",
776 .id = 1,
777 .capture = {
778 .stream_name = "PDM Capture",
779 .rates = MSM8916_WCD_ANALOG_RATES,
780 .formats = MSM8916_WCD_ANALOG_FORMATS,
781 .channels_min = 1,
782 .channels_max = 4,
783 },
784 .ops = &pm8916_wcd_analog_dai_ops,
785 },
786};
787
788static struct snd_soc_codec_driver pm8916_wcd_analog = {
789 .probe = pm8916_wcd_analog_probe,
790 .remove = pm8916_wcd_analog_remove,
791 .get_regmap = pm8916_get_regmap,
792 .component_driver = {
793 .controls = pm8916_wcd_analog_snd_controls,
794 .num_controls = ARRAY_SIZE(pm8916_wcd_analog_snd_controls),
795 .dapm_widgets = pm8916_wcd_analog_dapm_widgets,
796 .num_dapm_widgets = ARRAY_SIZE(pm8916_wcd_analog_dapm_widgets),
797 .dapm_routes = pm8916_wcd_analog_audio_map,
798 .num_dapm_routes = ARRAY_SIZE(pm8916_wcd_analog_audio_map),
799 },
800};
801
802static int pm8916_wcd_analog_parse_dt(struct device *dev,
803 struct pm8916_wcd_analog_priv *priv)
804{
805
806 if (of_property_read_bool(dev->of_node, "qcom,micbias1-ext-cap"))
807 priv->micbias1_cap_mode = MICB_1_EN_EXT_BYP_CAP;
808 else
809 priv->micbias1_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP;
810
811 if (of_property_read_bool(dev->of_node, "qcom,micbias2-ext-cap"))
812 priv->micbias2_cap_mode = MICB_1_EN_EXT_BYP_CAP;
813 else
814 priv->micbias2_cap_mode = MICB_1_EN_NO_EXT_BYP_CAP;
815
816 return 0;
817}
818
819static int pm8916_wcd_analog_spmi_probe(struct platform_device *pdev)
820{
821 struct pm8916_wcd_analog_priv *priv;
822 struct device *dev = &pdev->dev;
823 int ret, i;
824
825 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
826 if (!priv)
827 return -ENOMEM;
828
829 ret = pm8916_wcd_analog_parse_dt(dev, priv);
830 if (ret < 0)
831 return ret;
832
833 priv->mclk = devm_clk_get(dev, "mclk");
834 if (IS_ERR(priv->mclk)) {
835 dev_err(dev, "failed to get mclk\n");
836 return PTR_ERR(priv->mclk);
837 }
838
839 for (i = 0; i < ARRAY_SIZE(supply_names); i++)
840 priv->supplies[i].supply = supply_names[i];
841
842 ret = devm_regulator_bulk_get(dev, ARRAY_SIZE(priv->supplies),
843 priv->supplies);
844 if (ret) {
845 dev_err(dev, "Failed to get regulator supplies %d\n", ret);
846 return ret;
847 }
848
849 ret = clk_prepare_enable(priv->mclk);
850 if (ret < 0) {
851 dev_err(dev, "failed to enable mclk %d\n", ret);
852 return ret;
853 }
854
855 dev_set_drvdata(dev, priv);
856
857 return snd_soc_register_codec(dev, &pm8916_wcd_analog,
858 pm8916_wcd_analog_dai,
859 ARRAY_SIZE(pm8916_wcd_analog_dai));
860}
861
862static int pm8916_wcd_analog_spmi_remove(struct platform_device *pdev)
863{
864 struct pm8916_wcd_analog_priv *priv = dev_get_drvdata(&pdev->dev);
865
866 snd_soc_unregister_codec(&pdev->dev);
867 clk_disable_unprepare(priv->mclk);
868
869 return 0;
870}
871
872static const struct of_device_id pm8916_wcd_analog_spmi_match_table[] = {
873 { .compatible = "qcom,pm8916-wcd-analog-codec", },
874 { }
875};
876
877static struct platform_driver pm8916_wcd_analog_spmi_driver = {
878 .driver = {
879 .name = "qcom,pm8916-wcd-spmi-codec",
880 .of_match_table = pm8916_wcd_analog_spmi_match_table,
881 },
882 .probe = pm8916_wcd_analog_spmi_probe,
883 .remove = pm8916_wcd_analog_spmi_remove,
884};
885
886module_platform_driver(pm8916_wcd_analog_spmi_driver);
887
888MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org>");
889MODULE_DESCRIPTION("PMIC PM8916 WCD Analog Codec driver");
890MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/msm8916-wcd-digital.c b/sound/soc/codecs/msm8916-wcd-digital.c
new file mode 100644
index 000000000000..f690442af8c9
--- /dev/null
+++ b/sound/soc/codecs/msm8916-wcd-digital.c
@@ -0,0 +1,923 @@
1/* Copyright (c) 2016, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/module.h>
14#include <linux/err.h>
15#include <linux/kernel.h>
16#include <linux/delay.h>
17#include <linux/types.h>
18#include <linux/clk.h>
19#include <linux/of.h>
20#include <linux/platform_device.h>
21#include <linux/regmap.h>
22#include <linux/mfd/syscon.h>
23#include <sound/soc.h>
24#include <sound/pcm.h>
25#include <sound/pcm_params.h>
26#include <sound/tlv.h>
27
28#define LPASS_CDC_CLK_RX_RESET_CTL (0x000)
29#define LPASS_CDC_CLK_TX_RESET_B1_CTL (0x004)
30#define CLK_RX_RESET_B1_CTL_TX1_RESET_MASK BIT(0)
31#define CLK_RX_RESET_B1_CTL_TX2_RESET_MASK BIT(1)
32#define LPASS_CDC_CLK_DMIC_B1_CTL (0x008)
33#define DMIC_B1_CTL_DMIC0_CLK_SEL_MASK GENMASK(3, 1)
34#define DMIC_B1_CTL_DMIC0_CLK_SEL_DIV2 (0x0 << 1)
35#define DMIC_B1_CTL_DMIC0_CLK_SEL_DIV3 (0x1 << 1)
36#define DMIC_B1_CTL_DMIC0_CLK_SEL_DIV4 (0x2 << 1)
37#define DMIC_B1_CTL_DMIC0_CLK_SEL_DIV6 (0x3 << 1)
38#define DMIC_B1_CTL_DMIC0_CLK_SEL_DIV16 (0x4 << 1)
39#define DMIC_B1_CTL_DMIC0_CLK_EN_MASK BIT(0)
40#define DMIC_B1_CTL_DMIC0_CLK_EN_ENABLE BIT(0)
41
42#define LPASS_CDC_CLK_RX_I2S_CTL (0x00C)
43#define RX_I2S_CTL_RX_I2S_MODE_MASK BIT(5)
44#define RX_I2S_CTL_RX_I2S_MODE_16 BIT(5)
45#define RX_I2S_CTL_RX_I2S_MODE_32 0
46#define RX_I2S_CTL_RX_I2S_FS_RATE_MASK GENMASK(2, 0)
47#define RX_I2S_CTL_RX_I2S_FS_RATE_F_8_KHZ 0x0
48#define RX_I2S_CTL_RX_I2S_FS_RATE_F_16_KHZ 0x1
49#define RX_I2S_CTL_RX_I2S_FS_RATE_F_32_KHZ 0x2
50#define RX_I2S_CTL_RX_I2S_FS_RATE_F_48_KHZ 0x3
51#define RX_I2S_CTL_RX_I2S_FS_RATE_F_96_KHZ 0x4
52#define RX_I2S_CTL_RX_I2S_FS_RATE_F_192_KHZ 0x5
53#define LPASS_CDC_CLK_TX_I2S_CTL (0x010)
54#define TX_I2S_CTL_TX_I2S_MODE_MASK BIT(5)
55#define TX_I2S_CTL_TX_I2S_MODE_16 BIT(5)
56#define TX_I2S_CTL_TX_I2S_MODE_32 0
57#define TX_I2S_CTL_TX_I2S_FS_RATE_MASK GENMASK(2, 0)
58#define TX_I2S_CTL_TX_I2S_FS_RATE_F_8_KHZ 0x0
59#define TX_I2S_CTL_TX_I2S_FS_RATE_F_16_KHZ 0x1
60#define TX_I2S_CTL_TX_I2S_FS_RATE_F_32_KHZ 0x2
61#define TX_I2S_CTL_TX_I2S_FS_RATE_F_48_KHZ 0x3
62#define TX_I2S_CTL_TX_I2S_FS_RATE_F_96_KHZ 0x4
63#define TX_I2S_CTL_TX_I2S_FS_RATE_F_192_KHZ 0x5
64
65#define LPASS_CDC_CLK_OTHR_RESET_B1_CTL (0x014)
66#define LPASS_CDC_CLK_TX_CLK_EN_B1_CTL (0x018)
67#define LPASS_CDC_CLK_OTHR_CTL (0x01C)
68#define LPASS_CDC_CLK_RX_B1_CTL (0x020)
69#define LPASS_CDC_CLK_MCLK_CTL (0x024)
70#define MCLK_CTL_MCLK_EN_MASK BIT(0)
71#define MCLK_CTL_MCLK_EN_ENABLE BIT(0)
72#define MCLK_CTL_MCLK_EN_DISABLE 0
73#define LPASS_CDC_CLK_PDM_CTL (0x028)
74#define LPASS_CDC_CLK_PDM_CTL_PDM_EN_MASK BIT(0)
75#define LPASS_CDC_CLK_PDM_CTL_PDM_EN BIT(0)
76#define LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK BIT(1)
77#define LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_FB BIT(1)
78#define LPASS_CDC_CLK_PDM_CTL_PDM_CLK_PDM_CLK 0
79
80#define LPASS_CDC_CLK_SD_CTL (0x02C)
81#define LPASS_CDC_RX1_B1_CTL (0x040)
82#define LPASS_CDC_RX2_B1_CTL (0x060)
83#define LPASS_CDC_RX3_B1_CTL (0x080)
84#define LPASS_CDC_RX1_B2_CTL (0x044)
85#define LPASS_CDC_RX2_B2_CTL (0x064)
86#define LPASS_CDC_RX3_B2_CTL (0x084)
87#define LPASS_CDC_RX1_B3_CTL (0x048)
88#define LPASS_CDC_RX2_B3_CTL (0x068)
89#define LPASS_CDC_RX3_B3_CTL (0x088)
90#define LPASS_CDC_RX1_B4_CTL (0x04C)
91#define LPASS_CDC_RX2_B4_CTL (0x06C)
92#define LPASS_CDC_RX3_B4_CTL (0x08C)
93#define LPASS_CDC_RX1_B5_CTL (0x050)
94#define LPASS_CDC_RX2_B5_CTL (0x070)
95#define LPASS_CDC_RX3_B5_CTL (0x090)
96#define LPASS_CDC_RX1_B6_CTL (0x054)
97#define RXn_B6_CTL_MUTE_MASK BIT(0)
98#define RXn_B6_CTL_MUTE_ENABLE BIT(0)
99#define RXn_B6_CTL_MUTE_DISABLE 0
100#define LPASS_CDC_RX2_B6_CTL (0x074)
101#define LPASS_CDC_RX3_B6_CTL (0x094)
102#define LPASS_CDC_RX1_VOL_CTL_B1_CTL (0x058)
103#define LPASS_CDC_RX2_VOL_CTL_B1_CTL (0x078)
104#define LPASS_CDC_RX3_VOL_CTL_B1_CTL (0x098)
105#define LPASS_CDC_RX1_VOL_CTL_B2_CTL (0x05C)
106#define LPASS_CDC_RX2_VOL_CTL_B2_CTL (0x07C)
107#define LPASS_CDC_RX3_VOL_CTL_B2_CTL (0x09C)
108#define LPASS_CDC_TOP_GAIN_UPDATE (0x0A0)
109#define LPASS_CDC_TOP_CTL (0x0A4)
110#define TOP_CTL_DIG_MCLK_FREQ_MASK BIT(0)
111#define TOP_CTL_DIG_MCLK_FREQ_F_12_288MHZ 0
112#define TOP_CTL_DIG_MCLK_FREQ_F_9_6MHZ BIT(0)
113
114#define LPASS_CDC_DEBUG_DESER1_CTL (0x0E0)
115#define LPASS_CDC_DEBUG_DESER2_CTL (0x0E4)
116#define LPASS_CDC_DEBUG_B1_CTL_CFG (0x0E8)
117#define LPASS_CDC_DEBUG_B2_CTL_CFG (0x0EC)
118#define LPASS_CDC_DEBUG_B3_CTL_CFG (0x0F0)
119#define LPASS_CDC_IIR1_GAIN_B1_CTL (0x100)
120#define LPASS_CDC_IIR2_GAIN_B1_CTL (0x140)
121#define LPASS_CDC_IIR1_GAIN_B2_CTL (0x104)
122#define LPASS_CDC_IIR2_GAIN_B2_CTL (0x144)
123#define LPASS_CDC_IIR1_GAIN_B3_CTL (0x108)
124#define LPASS_CDC_IIR2_GAIN_B3_CTL (0x148)
125#define LPASS_CDC_IIR1_GAIN_B4_CTL (0x10C)
126#define LPASS_CDC_IIR2_GAIN_B4_CTL (0x14C)
127#define LPASS_CDC_IIR1_GAIN_B5_CTL (0x110)
128#define LPASS_CDC_IIR2_GAIN_B5_CTL (0x150)
129#define LPASS_CDC_IIR1_GAIN_B6_CTL (0x114)
130#define LPASS_CDC_IIR2_GAIN_B6_CTL (0x154)
131#define LPASS_CDC_IIR1_GAIN_B7_CTL (0x118)
132#define LPASS_CDC_IIR2_GAIN_B7_CTL (0x158)
133#define LPASS_CDC_IIR1_GAIN_B8_CTL (0x11C)
134#define LPASS_CDC_IIR2_GAIN_B8_CTL (0x15C)
135#define LPASS_CDC_IIR1_CTL (0x120)
136#define LPASS_CDC_IIR2_CTL (0x160)
137#define LPASS_CDC_IIR1_GAIN_TIMER_CTL (0x124)
138#define LPASS_CDC_IIR2_GAIN_TIMER_CTL (0x164)
139#define LPASS_CDC_IIR1_COEF_B1_CTL (0x128)
140#define LPASS_CDC_IIR2_COEF_B1_CTL (0x168)
141#define LPASS_CDC_IIR1_COEF_B2_CTL (0x12C)
142#define LPASS_CDC_IIR2_COEF_B2_CTL (0x16C)
143#define LPASS_CDC_CONN_RX1_B1_CTL (0x180)
144#define LPASS_CDC_CONN_RX1_B2_CTL (0x184)
145#define LPASS_CDC_CONN_RX1_B3_CTL (0x188)
146#define LPASS_CDC_CONN_RX2_B1_CTL (0x18C)
147#define LPASS_CDC_CONN_RX2_B2_CTL (0x190)
148#define LPASS_CDC_CONN_RX2_B3_CTL (0x194)
149#define LPASS_CDC_CONN_RX3_B1_CTL (0x198)
150#define LPASS_CDC_CONN_RX3_B2_CTL (0x19C)
151#define LPASS_CDC_CONN_TX_B1_CTL (0x1A0)
152#define LPASS_CDC_CONN_EQ1_B1_CTL (0x1A8)
153#define LPASS_CDC_CONN_EQ1_B2_CTL (0x1AC)
154#define LPASS_CDC_CONN_EQ1_B3_CTL (0x1B0)
155#define LPASS_CDC_CONN_EQ1_B4_CTL (0x1B4)
156#define LPASS_CDC_CONN_EQ2_B1_CTL (0x1B8)
157#define LPASS_CDC_CONN_EQ2_B2_CTL (0x1BC)
158#define LPASS_CDC_CONN_EQ2_B3_CTL (0x1C0)
159#define LPASS_CDC_CONN_EQ2_B4_CTL (0x1C4)
160#define LPASS_CDC_CONN_TX_I2S_SD1_CTL (0x1C8)
161#define LPASS_CDC_TX1_VOL_CTL_TIMER (0x280)
162#define LPASS_CDC_TX2_VOL_CTL_TIMER (0x2A0)
163#define LPASS_CDC_TX1_VOL_CTL_GAIN (0x284)
164#define LPASS_CDC_TX2_VOL_CTL_GAIN (0x2A4)
165#define LPASS_CDC_TX1_VOL_CTL_CFG (0x288)
166#define TX_VOL_CTL_CFG_MUTE_EN_MASK BIT(0)
167#define TX_VOL_CTL_CFG_MUTE_EN_ENABLE BIT(0)
168
169#define LPASS_CDC_TX2_VOL_CTL_CFG (0x2A8)
170#define LPASS_CDC_TX1_MUX_CTL (0x28C)
171#define TX_MUX_CTL_CUT_OFF_FREQ_MASK GENMASK(5, 4)
172#define TX_MUX_CTL_CUT_OFF_FREQ_SHIFT 4
173#define TX_MUX_CTL_CF_NEG_3DB_4HZ (0x0 << 4)
174#define TX_MUX_CTL_CF_NEG_3DB_75HZ (0x1 << 4)
175#define TX_MUX_CTL_CF_NEG_3DB_150HZ (0x2 << 4)
176#define TX_MUX_CTL_HPF_BP_SEL_MASK BIT(3)
177#define TX_MUX_CTL_HPF_BP_SEL_BYPASS BIT(3)
178#define TX_MUX_CTL_HPF_BP_SEL_NO_BYPASS 0
179
180#define LPASS_CDC_TX2_MUX_CTL (0x2AC)
181#define LPASS_CDC_TX1_CLK_FS_CTL (0x290)
182#define LPASS_CDC_TX2_CLK_FS_CTL (0x2B0)
183#define LPASS_CDC_TX1_DMIC_CTL (0x294)
184#define LPASS_CDC_TX2_DMIC_CTL (0x2B4)
185#define TXN_DMIC_CTL_CLK_SEL_MASK GENMASK(2, 0)
186#define TXN_DMIC_CTL_CLK_SEL_DIV2 0x0
187#define TXN_DMIC_CTL_CLK_SEL_DIV3 0x1
188#define TXN_DMIC_CTL_CLK_SEL_DIV4 0x2
189#define TXN_DMIC_CTL_CLK_SEL_DIV6 0x3
190#define TXN_DMIC_CTL_CLK_SEL_DIV16 0x4
191
192#define MSM8916_WCD_DIGITAL_RATES (SNDRV_PCM_RATE_8000 | \
193 SNDRV_PCM_RATE_16000 | \
194 SNDRV_PCM_RATE_32000 | \
195 SNDRV_PCM_RATE_48000)
196#define MSM8916_WCD_DIGITAL_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
197 SNDRV_PCM_FMTBIT_S24_LE)
198
199struct msm8916_wcd_digital_priv {
200 struct clk *ahbclk, *mclk;
201};
202
203static const unsigned long rx_gain_reg[] = {
204 LPASS_CDC_RX1_VOL_CTL_B2_CTL,
205 LPASS_CDC_RX2_VOL_CTL_B2_CTL,
206 LPASS_CDC_RX3_VOL_CTL_B2_CTL,
207};
208
209static const unsigned long tx_gain_reg[] = {
210 LPASS_CDC_TX1_VOL_CTL_GAIN,
211 LPASS_CDC_TX2_VOL_CTL_GAIN,
212};
213
214static const char *const rx_mix1_text[] = {
215 "ZERO", "IIR1", "IIR2", "RX1", "RX2", "RX3"
216};
217
218static const char *const dec_mux_text[] = {
219 "ZERO", "ADC1", "ADC2", "ADC3", "DMIC1", "DMIC2"
220};
221static const char *const rx_mix2_text[] = { "ZERO", "IIR1", "IIR2" };
222static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" };
223
224/* RX1 MIX1 */
225static const struct soc_enum rx_mix1_inp_enum[] = {
226 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX1_B1_CTL, 0, 6, rx_mix1_text),
227 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX1_B1_CTL, 3, 6, rx_mix1_text),
228 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX1_B2_CTL, 0, 6, rx_mix1_text),
229};
230
231/* RX1 MIX2 */
232static const struct soc_enum rx_mix2_inp1_chain_enum = SOC_ENUM_SINGLE(
233 LPASS_CDC_CONN_RX1_B3_CTL, 0, 3, rx_mix2_text);
234
235/* RX2 MIX1 */
236static const struct soc_enum rx2_mix1_inp_enum[] = {
237 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX2_B1_CTL, 0, 6, rx_mix1_text),
238 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX2_B1_CTL, 3, 6, rx_mix1_text),
239 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX2_B1_CTL, 0, 6, rx_mix1_text),
240};
241
242/* RX2 MIX2 */
243static const struct soc_enum rx2_mix2_inp1_chain_enum = SOC_ENUM_SINGLE(
244 LPASS_CDC_CONN_RX2_B3_CTL, 0, 3, rx_mix2_text);
245
246/* RX3 MIX1 */
247static const struct soc_enum rx3_mix1_inp_enum[] = {
248 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX3_B1_CTL, 0, 6, rx_mix1_text),
249 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX3_B1_CTL, 3, 6, rx_mix1_text),
250 SOC_ENUM_SINGLE(LPASS_CDC_CONN_RX3_B1_CTL, 0, 6, rx_mix1_text),
251};
252
253/* DEC */
254static const struct soc_enum dec1_mux_enum = SOC_ENUM_SINGLE(
255 LPASS_CDC_CONN_TX_B1_CTL, 0, 6, dec_mux_text);
256static const struct soc_enum dec2_mux_enum = SOC_ENUM_SINGLE(
257 LPASS_CDC_CONN_TX_B1_CTL, 3, 6, dec_mux_text);
258
259/* RDAC2 MUX */
260static const struct snd_kcontrol_new dec1_mux = SOC_DAPM_ENUM(
261 "DEC1 MUX Mux", dec1_mux_enum);
262static const struct snd_kcontrol_new dec2_mux = SOC_DAPM_ENUM(
263 "DEC2 MUX Mux", dec2_mux_enum);
264static const struct snd_kcontrol_new rx_mix1_inp1_mux = SOC_DAPM_ENUM(
265 "RX1 MIX1 INP1 Mux", rx_mix1_inp_enum[0]);
266static const struct snd_kcontrol_new rx_mix1_inp2_mux = SOC_DAPM_ENUM(
267 "RX1 MIX1 INP2 Mux", rx_mix1_inp_enum[1]);
268static const struct snd_kcontrol_new rx_mix1_inp3_mux = SOC_DAPM_ENUM(
269 "RX1 MIX1 INP3 Mux", rx_mix1_inp_enum[2]);
270static const struct snd_kcontrol_new rx2_mix1_inp1_mux = SOC_DAPM_ENUM(
271 "RX2 MIX1 INP1 Mux", rx2_mix1_inp_enum[0]);
272static const struct snd_kcontrol_new rx2_mix1_inp2_mux = SOC_DAPM_ENUM(
273 "RX2 MIX1 INP2 Mux", rx2_mix1_inp_enum[1]);
274static const struct snd_kcontrol_new rx2_mix1_inp3_mux = SOC_DAPM_ENUM(
275 "RX2 MIX1 INP3 Mux", rx2_mix1_inp_enum[2]);
276static const struct snd_kcontrol_new rx3_mix1_inp1_mux = SOC_DAPM_ENUM(
277 "RX3 MIX1 INP1 Mux", rx3_mix1_inp_enum[0]);
278static const struct snd_kcontrol_new rx3_mix1_inp2_mux = SOC_DAPM_ENUM(
279 "RX3 MIX1 INP2 Mux", rx3_mix1_inp_enum[1]);
280static const struct snd_kcontrol_new rx3_mix1_inp3_mux = SOC_DAPM_ENUM(
281 "RX3 MIX1 INP3 Mux", rx3_mix1_inp_enum[2]);
282
283/* Digital Gain control -38.4 dB to +38.4 dB in 0.3 dB steps */
284static const DECLARE_TLV_DB_SCALE(digital_gain, -3840, 30, 0);
285
286/* Cutoff Freq for High Pass Filter at -3dB */
287static const char * const hpf_cutoff_text[] = {
288 "4Hz", "75Hz", "150Hz",
289};
290
291static SOC_ENUM_SINGLE_DECL(tx1_hpf_cutoff_enum, LPASS_CDC_TX1_MUX_CTL, 4,
292 hpf_cutoff_text);
293static SOC_ENUM_SINGLE_DECL(tx2_hpf_cutoff_enum, LPASS_CDC_TX2_MUX_CTL, 4,
294 hpf_cutoff_text);
295
296/* cut off for dc blocker inside rx chain */
297static const char * const dc_blocker_cutoff_text[] = {
298 "4Hz", "75Hz", "150Hz",
299};
300
301static SOC_ENUM_SINGLE_DECL(rx1_dcb_cutoff_enum, LPASS_CDC_RX1_B4_CTL, 0,
302 dc_blocker_cutoff_text);
303static SOC_ENUM_SINGLE_DECL(rx2_dcb_cutoff_enum, LPASS_CDC_RX2_B4_CTL, 0,
304 dc_blocker_cutoff_text);
305static SOC_ENUM_SINGLE_DECL(rx3_dcb_cutoff_enum, LPASS_CDC_RX3_B4_CTL, 0,
306 dc_blocker_cutoff_text);
307
308static const struct snd_kcontrol_new msm8916_wcd_digital_snd_controls[] = {
309 SOC_SINGLE_S8_TLV("RX1 Digital Volume", LPASS_CDC_RX1_VOL_CTL_B2_CTL,
310 -128, 127, digital_gain),
311 SOC_SINGLE_S8_TLV("RX2 Digital Volume", LPASS_CDC_RX2_VOL_CTL_B2_CTL,
312 -128, 127, digital_gain),
313 SOC_SINGLE_S8_TLV("RX3 Digital Volume", LPASS_CDC_RX3_VOL_CTL_B2_CTL,
314 -128, 127, digital_gain),
315 SOC_SINGLE_S8_TLV("TX1 Digital Volume", LPASS_CDC_TX1_VOL_CTL_GAIN,
316 -128, 127, digital_gain),
317 SOC_SINGLE_S8_TLV("TX2 Digital Volume", LPASS_CDC_TX2_VOL_CTL_GAIN,
318 -128, 127, digital_gain),
319 SOC_ENUM("TX1 HPF Cutoff", tx1_hpf_cutoff_enum),
320 SOC_ENUM("TX2 HPF Cutoff", tx2_hpf_cutoff_enum),
321 SOC_SINGLE("TX1 HPF Switch", LPASS_CDC_TX1_MUX_CTL, 3, 1, 0),
322 SOC_SINGLE("TX2 HPF Switch", LPASS_CDC_TX2_MUX_CTL, 3, 1, 0),
323 SOC_ENUM("RX1 DCB Cutoff", rx1_dcb_cutoff_enum),
324 SOC_ENUM("RX2 DCB Cutoff", rx2_dcb_cutoff_enum),
325 SOC_ENUM("RX3 DCB Cutoff", rx3_dcb_cutoff_enum),
326 SOC_SINGLE("RX1 DCB Switch", LPASS_CDC_RX1_B5_CTL, 2, 1, 0),
327 SOC_SINGLE("RX2 DCB Switch", LPASS_CDC_RX2_B5_CTL, 2, 1, 0),
328 SOC_SINGLE("RX3 DCB Switch", LPASS_CDC_RX3_B5_CTL, 2, 1, 0),
329 SOC_SINGLE("RX1 Mute Switch", LPASS_CDC_RX1_B6_CTL, 0, 1, 0),
330 SOC_SINGLE("RX2 Mute Switch", LPASS_CDC_RX2_B6_CTL, 0, 1, 0),
331 SOC_SINGLE("RX3 Mute Switch", LPASS_CDC_RX3_B6_CTL, 0, 1, 0),
332};
333
334static int msm8916_wcd_digital_enable_interpolator(
335 struct snd_soc_dapm_widget *w,
336 struct snd_kcontrol *kcontrol,
337 int event)
338{
339 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
340
341 switch (event) {
342 case SND_SOC_DAPM_POST_PMU:
343 /* apply the digital gain after the interpolator is enabled */
344 usleep_range(10000, 10100);
345 snd_soc_write(codec, rx_gain_reg[w->shift],
346 snd_soc_read(codec, rx_gain_reg[w->shift]));
347 break;
348 }
349 return 0;
350}
351
352static int msm8916_wcd_digital_enable_dec(struct snd_soc_dapm_widget *w,
353 struct snd_kcontrol *kcontrol,
354 int event)
355{
356 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
357 unsigned int decimator = w->shift + 1;
358 u16 dec_reset_reg, tx_vol_ctl_reg, tx_mux_ctl_reg;
359 u8 dec_hpf_cut_of_freq;
360
361 dec_reset_reg = LPASS_CDC_CLK_TX_RESET_B1_CTL;
362 tx_vol_ctl_reg = LPASS_CDC_TX1_VOL_CTL_CFG + 32 * (decimator - 1);
363 tx_mux_ctl_reg = LPASS_CDC_TX1_MUX_CTL + 32 * (decimator - 1);
364
365 switch (event) {
366 case SND_SOC_DAPM_PRE_PMU:
367 /* Enable TX digital mute */
368 snd_soc_update_bits(codec, tx_vol_ctl_reg,
369 TX_VOL_CTL_CFG_MUTE_EN_MASK,
370 TX_VOL_CTL_CFG_MUTE_EN_ENABLE);
371 dec_hpf_cut_of_freq = snd_soc_read(codec, tx_mux_ctl_reg) &
372 TX_MUX_CTL_CUT_OFF_FREQ_MASK;
373 dec_hpf_cut_of_freq >>= TX_MUX_CTL_CUT_OFF_FREQ_SHIFT;
374 if (dec_hpf_cut_of_freq != TX_MUX_CTL_CF_NEG_3DB_150HZ) {
375 /* set cut of freq to CF_MIN_3DB_150HZ (0x1) */
376 snd_soc_update_bits(codec, tx_mux_ctl_reg,
377 TX_MUX_CTL_CUT_OFF_FREQ_MASK,
378 TX_MUX_CTL_CF_NEG_3DB_150HZ);
379 }
380 break;
381 case SND_SOC_DAPM_POST_PMU:
382 /* enable HPF */
383 snd_soc_update_bits(codec, tx_mux_ctl_reg,
384 TX_MUX_CTL_HPF_BP_SEL_MASK,
385 TX_MUX_CTL_HPF_BP_SEL_NO_BYPASS);
386 /* apply the digital gain after the decimator is enabled */
387 snd_soc_write(codec, tx_gain_reg[w->shift],
388 snd_soc_read(codec, tx_gain_reg[w->shift]));
389 snd_soc_update_bits(codec, tx_vol_ctl_reg,
390 TX_VOL_CTL_CFG_MUTE_EN_MASK, 0);
391 break;
392 case SND_SOC_DAPM_PRE_PMD:
393 snd_soc_update_bits(codec, tx_vol_ctl_reg,
394 TX_VOL_CTL_CFG_MUTE_EN_MASK,
395 TX_VOL_CTL_CFG_MUTE_EN_ENABLE);
396 snd_soc_update_bits(codec, tx_mux_ctl_reg,
397 TX_MUX_CTL_HPF_BP_SEL_MASK,
398 TX_MUX_CTL_HPF_BP_SEL_BYPASS);
399 break;
400 case SND_SOC_DAPM_POST_PMD:
401 snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift,
402 1 << w->shift);
403 snd_soc_update_bits(codec, dec_reset_reg, 1 << w->shift, 0x0);
404 snd_soc_update_bits(codec, tx_mux_ctl_reg,
405 TX_MUX_CTL_HPF_BP_SEL_MASK,
406 TX_MUX_CTL_HPF_BP_SEL_BYPASS);
407 snd_soc_update_bits(codec, tx_vol_ctl_reg,
408 TX_VOL_CTL_CFG_MUTE_EN_MASK, 0);
409 break;
410 }
411
412 return 0;
413}
414
415static int msm8916_wcd_digital_enable_dmic(struct snd_soc_dapm_widget *w,
416 struct snd_kcontrol *kcontrol,
417 int event)
418{
419 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
420 unsigned int dmic;
421 int ret;
422 /* get dmic number out of widget name */
423 char *dmic_num = strpbrk(w->name, "12");
424
425 if (dmic_num == NULL) {
426 dev_err(codec->dev, "Invalid DMIC\n");
427 return -EINVAL;
428 }
429 ret = kstrtouint(dmic_num, 10, &dmic);
430 if (ret < 0 || dmic > 2) {
431 dev_err(codec->dev, "Invalid DMIC line on the codec\n");
432 return -EINVAL;
433 }
434
435 switch (event) {
436 case SND_SOC_DAPM_PRE_PMU:
437 snd_soc_update_bits(codec, LPASS_CDC_CLK_DMIC_B1_CTL,
438 DMIC_B1_CTL_DMIC0_CLK_SEL_MASK,
439 DMIC_B1_CTL_DMIC0_CLK_SEL_DIV3);
440 switch (dmic) {
441 case 1:
442 snd_soc_update_bits(codec, LPASS_CDC_TX1_DMIC_CTL,
443 TXN_DMIC_CTL_CLK_SEL_MASK,
444 TXN_DMIC_CTL_CLK_SEL_DIV3);
445 break;
446 case 2:
447 snd_soc_update_bits(codec, LPASS_CDC_TX2_DMIC_CTL,
448 TXN_DMIC_CTL_CLK_SEL_MASK,
449 TXN_DMIC_CTL_CLK_SEL_DIV3);
450 break;
451 }
452 break;
453 }
454
455 return 0;
456}
457
458static const struct snd_soc_dapm_widget msm8916_wcd_digital_dapm_widgets[] = {
459 /*RX stuff */
460 SND_SOC_DAPM_AIF_IN("I2S RX1", NULL, 0, SND_SOC_NOPM, 0, 0),
461 SND_SOC_DAPM_AIF_IN("I2S RX2", NULL, 0, SND_SOC_NOPM, 0, 0),
462 SND_SOC_DAPM_AIF_IN("I2S RX3", NULL, 0, SND_SOC_NOPM, 0, 0),
463
464 SND_SOC_DAPM_OUTPUT("PDM_RX1"),
465 SND_SOC_DAPM_OUTPUT("PDM_RX2"),
466 SND_SOC_DAPM_OUTPUT("PDM_RX3"),
467
468 SND_SOC_DAPM_INPUT("LPASS_PDM_TX"),
469
470 SND_SOC_DAPM_MIXER("RX1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
471 SND_SOC_DAPM_MIXER("RX2 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
472 SND_SOC_DAPM_MIXER("RX3 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
473
474 /* Interpolator */
475 SND_SOC_DAPM_MIXER_E("RX1 INT", LPASS_CDC_CLK_RX_B1_CTL, 0, 0, NULL,
476 0, msm8916_wcd_digital_enable_interpolator,
477 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
478 SND_SOC_DAPM_MIXER_E("RX2 INT", LPASS_CDC_CLK_RX_B1_CTL, 1, 0, NULL,
479 0, msm8916_wcd_digital_enable_interpolator,
480 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
481 SND_SOC_DAPM_MIXER_E("RX3 INT", LPASS_CDC_CLK_RX_B1_CTL, 2, 0, NULL,
482 0, msm8916_wcd_digital_enable_interpolator,
483 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
484 SND_SOC_DAPM_MUX("RX1 MIX1 INP1", SND_SOC_NOPM, 0, 0,
485 &rx_mix1_inp1_mux),
486 SND_SOC_DAPM_MUX("RX1 MIX1 INP2", SND_SOC_NOPM, 0, 0,
487 &rx_mix1_inp2_mux),
488 SND_SOC_DAPM_MUX("RX1 MIX1 INP3", SND_SOC_NOPM, 0, 0,
489 &rx_mix1_inp3_mux),
490 SND_SOC_DAPM_MUX("RX2 MIX1 INP1", SND_SOC_NOPM, 0, 0,
491 &rx2_mix1_inp1_mux),
492 SND_SOC_DAPM_MUX("RX2 MIX1 INP2", SND_SOC_NOPM, 0, 0,
493 &rx2_mix1_inp2_mux),
494 SND_SOC_DAPM_MUX("RX2 MIX1 INP3", SND_SOC_NOPM, 0, 0,
495 &rx2_mix1_inp3_mux),
496 SND_SOC_DAPM_MUX("RX3 MIX1 INP1", SND_SOC_NOPM, 0, 0,
497 &rx3_mix1_inp1_mux),
498 SND_SOC_DAPM_MUX("RX3 MIX1 INP2", SND_SOC_NOPM, 0, 0,
499 &rx3_mix1_inp2_mux),
500 SND_SOC_DAPM_MUX("RX3 MIX1 INP3", SND_SOC_NOPM, 0, 0,
501 &rx3_mix1_inp3_mux),
502
503 /* TX */
504 SND_SOC_DAPM_MIXER("ADC1", SND_SOC_NOPM, 0, 0, NULL, 0),
505 SND_SOC_DAPM_MIXER("ADC2", SND_SOC_NOPM, 0, 0, NULL, 0),
506 SND_SOC_DAPM_MIXER("ADC3", SND_SOC_NOPM, 0, 0, NULL, 0),
507
508 SND_SOC_DAPM_MUX_E("DEC1 MUX", LPASS_CDC_CLK_TX_CLK_EN_B1_CTL, 0, 0,
509 &dec1_mux, msm8916_wcd_digital_enable_dec,
510 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
511 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
512 SND_SOC_DAPM_MUX_E("DEC2 MUX", LPASS_CDC_CLK_TX_CLK_EN_B1_CTL, 1, 0,
513 &dec2_mux, msm8916_wcd_digital_enable_dec,
514 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
515 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
516 SND_SOC_DAPM_AIF_OUT("I2S TX1", NULL, 0, SND_SOC_NOPM, 0, 0),
517 SND_SOC_DAPM_AIF_OUT("I2S TX2", NULL, 0, SND_SOC_NOPM, 0, 0),
518 SND_SOC_DAPM_AIF_OUT("I2S TX3", NULL, 0, SND_SOC_NOPM, 0, 0),
519
520 /* Digital Mic Inputs */
521 SND_SOC_DAPM_ADC_E("DMIC1", NULL, SND_SOC_NOPM, 0, 0,
522 msm8916_wcd_digital_enable_dmic,
523 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
524 SND_SOC_DAPM_ADC_E("DMIC2", NULL, SND_SOC_NOPM, 0, 0,
525 msm8916_wcd_digital_enable_dmic,
526 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
527 SND_SOC_DAPM_SUPPLY("DMIC_CLK", LPASS_CDC_CLK_DMIC_B1_CTL, 0, 0,
528 NULL, 0),
529 SND_SOC_DAPM_SUPPLY("RX_I2S_CLK", LPASS_CDC_CLK_RX_I2S_CTL,
530 4, 0, NULL, 0),
531 SND_SOC_DAPM_SUPPLY("TX_I2S_CLK", LPASS_CDC_CLK_TX_I2S_CTL, 4, 0,
532 NULL, 0),
533
534 SND_SOC_DAPM_SUPPLY("MCLK", SND_SOC_NOPM, 0, 0, NULL, 0),
535 SND_SOC_DAPM_SUPPLY("PDM_CLK", LPASS_CDC_CLK_PDM_CTL, 0, 0, NULL, 0),
536 /* Connectivity Clock */
537 SND_SOC_DAPM_SUPPLY_S("CDC_CONN", -2, LPASS_CDC_CLK_OTHR_CTL, 2, 0,
538 NULL, 0),
539
540};
541
542static int msm8916_wcd_digital_get_clks(struct platform_device *pdev,
543 struct msm8916_wcd_digital_priv *priv)
544{
545 struct device *dev = &pdev->dev;
546
547 priv->ahbclk = devm_clk_get(dev, "ahbix-clk");
548 if (IS_ERR(priv->ahbclk)) {
549 dev_err(dev, "failed to get ahbix clk\n");
550 return PTR_ERR(priv->ahbclk);
551 }
552
553 priv->mclk = devm_clk_get(dev, "mclk");
554 if (IS_ERR(priv->mclk)) {
555 dev_err(dev, "failed to get mclk\n");
556 return PTR_ERR(priv->mclk);
557 }
558
559 return 0;
560}
561
562static int msm8916_wcd_digital_codec_probe(struct snd_soc_codec *codec)
563{
564 struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(codec->dev);
565
566 snd_soc_codec_set_drvdata(codec, priv);
567
568 return 0;
569}
570
571static int msm8916_wcd_digital_hw_params(struct snd_pcm_substream *substream,
572 struct snd_pcm_hw_params *params,
573 struct snd_soc_dai *dai)
574{
575 u8 tx_fs_rate;
576 u8 rx_fs_rate;
577
578 switch (params_rate(params)) {
579 case 8000:
580 tx_fs_rate = TX_I2S_CTL_TX_I2S_FS_RATE_F_8_KHZ;
581 rx_fs_rate = RX_I2S_CTL_RX_I2S_FS_RATE_F_8_KHZ;
582 break;
583 case 16000:
584 tx_fs_rate = TX_I2S_CTL_TX_I2S_FS_RATE_F_16_KHZ;
585 rx_fs_rate = RX_I2S_CTL_RX_I2S_FS_RATE_F_16_KHZ;
586 break;
587 case 32000:
588 tx_fs_rate = TX_I2S_CTL_TX_I2S_FS_RATE_F_32_KHZ;
589 rx_fs_rate = RX_I2S_CTL_RX_I2S_FS_RATE_F_32_KHZ;
590 break;
591 case 48000:
592 tx_fs_rate = TX_I2S_CTL_TX_I2S_FS_RATE_F_48_KHZ;
593 rx_fs_rate = RX_I2S_CTL_RX_I2S_FS_RATE_F_48_KHZ;
594 break;
595 default:
596 dev_err(dai->codec->dev, "Invalid sampling rate %d\n",
597 params_rate(params));
598 return -EINVAL;
599 }
600
601 switch (substream->stream) {
602 case SNDRV_PCM_STREAM_CAPTURE:
603 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL,
604 TX_I2S_CTL_TX_I2S_FS_RATE_MASK, tx_fs_rate);
605 break;
606 case SNDRV_PCM_STREAM_PLAYBACK:
607 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_RX_I2S_CTL,
608 RX_I2S_CTL_RX_I2S_FS_RATE_MASK, rx_fs_rate);
609 break;
610 default:
611 return -EINVAL;
612 }
613
614 switch (params_format(params)) {
615 case SNDRV_PCM_FORMAT_S16_LE:
616 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL,
617 TX_I2S_CTL_TX_I2S_MODE_MASK,
618 TX_I2S_CTL_TX_I2S_MODE_16);
619 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_RX_I2S_CTL,
620 RX_I2S_CTL_RX_I2S_MODE_MASK,
621 RX_I2S_CTL_RX_I2S_MODE_16);
622 break;
623 case SNDRV_PCM_FORMAT_S24_LE:
624 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_TX_I2S_CTL,
625 TX_I2S_CTL_TX_I2S_MODE_MASK,
626 TX_I2S_CTL_TX_I2S_MODE_32);
627 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_RX_I2S_CTL,
628 RX_I2S_CTL_RX_I2S_MODE_MASK,
629 RX_I2S_CTL_RX_I2S_MODE_32);
630 break;
631 default:
632 dev_err(dai->dev, "%s: wrong format selected\n", __func__);
633 return -EINVAL;
634 }
635
636 return 0;
637}
638
639static const struct snd_soc_dapm_route msm8916_wcd_digital_audio_map[] = {
640
641 {"I2S RX1", NULL, "AIF1 Playback"},
642 {"I2S RX2", NULL, "AIF1 Playback"},
643 {"I2S RX3", NULL, "AIF1 Playback"},
644
645 {"AIF1 Capture", NULL, "I2S TX1"},
646 {"AIF1 Capture", NULL, "I2S TX2"},
647 {"AIF1 Capture", NULL, "I2S TX3"},
648
649 /* Decimator Inputs */
650 {"DEC1 MUX", "DMIC1", "DMIC1"},
651 {"DEC1 MUX", "DMIC2", "DMIC2"},
652 {"DEC1 MUX", "ADC1", "ADC1"},
653 {"DEC1 MUX", "ADC2", "ADC2"},
654 {"DEC1 MUX", "ADC3", "ADC3"},
655 {"DEC1 MUX", NULL, "CDC_CONN"},
656
657 {"DEC2 MUX", "DMIC1", "DMIC1"},
658 {"DEC2 MUX", "DMIC2", "DMIC2"},
659 {"DEC2 MUX", "ADC1", "ADC1"},
660 {"DEC2 MUX", "ADC2", "ADC2"},
661 {"DEC2 MUX", "ADC3", "ADC3"},
662 {"DEC2 MUX", NULL, "CDC_CONN"},
663
664 {"DMIC1", NULL, "DMIC_CLK"},
665 {"DMIC2", NULL, "DMIC_CLK"},
666
667 {"I2S TX1", NULL, "DEC1 MUX"},
668 {"I2S TX2", NULL, "DEC2 MUX"},
669
670 {"I2S TX1", NULL, "TX_I2S_CLK"},
671 {"I2S TX2", NULL, "TX_I2S_CLK"},
672
673 {"TX_I2S_CLK", NULL, "MCLK"},
674 {"TX_I2S_CLK", NULL, "PDM_CLK"},
675
676 {"ADC1", NULL, "LPASS_PDM_TX"},
677 {"ADC2", NULL, "LPASS_PDM_TX"},
678 {"ADC3", NULL, "LPASS_PDM_TX"},
679
680 {"I2S RX1", NULL, "RX_I2S_CLK"},
681 {"I2S RX2", NULL, "RX_I2S_CLK"},
682 {"I2S RX3", NULL, "RX_I2S_CLK"},
683
684 {"RX_I2S_CLK", NULL, "PDM_CLK"},
685 {"RX_I2S_CLK", NULL, "MCLK"},
686 {"RX_I2S_CLK", NULL, "CDC_CONN"},
687
688 /* RX1 PATH.. */
689 {"PDM_RX1", NULL, "RX1 INT"},
690 {"RX1 INT", NULL, "RX1 MIX1"},
691
692 {"RX1 MIX1", NULL, "RX1 MIX1 INP1"},
693 {"RX1 MIX1", NULL, "RX1 MIX1 INP2"},
694 {"RX1 MIX1", NULL, "RX1 MIX1 INP3"},
695
696 {"RX1 MIX1 INP1", "RX1", "I2S RX1"},
697 {"RX1 MIX1 INP1", "RX2", "I2S RX2"},
698 {"RX1 MIX1 INP1", "RX3", "I2S RX3"},
699
700 {"RX1 MIX1 INP2", "RX1", "I2S RX1"},
701 {"RX1 MIX1 INP2", "RX2", "I2S RX2"},
702 {"RX1 MIX1 INP2", "RX3", "I2S RX3"},
703
704 {"RX1 MIX1 INP3", "RX1", "I2S RX1"},
705 {"RX1 MIX1 INP3", "RX2", "I2S RX2"},
706 {"RX1 MIX1 INP3", "RX3", "I2S RX3"},
707
708 /* RX2 PATH */
709 {"PDM_RX2", NULL, "RX2 INT"},
710 {"RX2 INT", NULL, "RX2 MIX1"},
711
712 {"RX2 MIX1", NULL, "RX2 MIX1 INP1"},
713 {"RX2 MIX1", NULL, "RX2 MIX1 INP2"},
714 {"RX2 MIX1", NULL, "RX2 MIX1 INP3"},
715
716 {"RX2 MIX1 INP1", "RX1", "I2S RX1"},
717 {"RX2 MIX1 INP1", "RX2", "I2S RX2"},
718 {"RX2 MIX1 INP1", "RX3", "I2S RX3"},
719
720 {"RX2 MIX1 INP2", "RX1", "I2S RX1"},
721 {"RX2 MIX1 INP2", "RX2", "I2S RX2"},
722 {"RX2 MIX1 INP2", "RX3", "I2S RX3"},
723
724 {"RX2 MIX1 INP3", "RX1", "I2S RX1"},
725 {"RX2 MIX1 INP3", "RX2", "I2S RX2"},
726 {"RX2 MIX1 INP3", "RX3", "I2S RX3"},
727
728 /* RX3 PATH */
729 {"PDM_RX3", NULL, "RX3 INT"},
730 {"RX3 INT", NULL, "RX3 MIX1"},
731
732 {"RX3 MIX1", NULL, "RX3 MIX1 INP1"},
733 {"RX3 MIX1", NULL, "RX3 MIX1 INP2"},
734 {"RX3 MIX1", NULL, "RX3 MIX1 INP3"},
735
736 {"RX3 MIX1 INP1", "RX1", "I2S RX1"},
737 {"RX3 MIX1 INP1", "RX2", "I2S RX2"},
738 {"RX3 MIX1 INP1", "RX3", "I2S RX3"},
739
740 {"RX3 MIX1 INP2", "RX1", "I2S RX1"},
741 {"RX3 MIX1 INP2", "RX2", "I2S RX2"},
742 {"RX3 MIX1 INP2", "RX3", "I2S RX3"},
743
744 {"RX3 MIX1 INP3", "RX1", "I2S RX1"},
745 {"RX3 MIX1 INP3", "RX2", "I2S RX2"},
746 {"RX3 MIX1 INP3", "RX3", "I2S RX3"},
747
748};
749
750static int msm8916_wcd_digital_startup(struct snd_pcm_substream *substream,
751 struct snd_soc_dai *dai)
752{
753 struct snd_soc_codec *codec = dai->codec;
754 struct msm8916_wcd_digital_priv *msm8916_wcd;
755 unsigned long mclk_rate;
756
757 msm8916_wcd = snd_soc_codec_get_drvdata(codec);
758 snd_soc_update_bits(codec, LPASS_CDC_CLK_MCLK_CTL,
759 MCLK_CTL_MCLK_EN_MASK,
760 MCLK_CTL_MCLK_EN_ENABLE);
761 snd_soc_update_bits(codec, LPASS_CDC_CLK_PDM_CTL,
762 LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK,
763 LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_FB);
764
765 mclk_rate = clk_get_rate(msm8916_wcd->mclk);
766 switch (mclk_rate) {
767 case 12288000:
768 snd_soc_update_bits(codec, LPASS_CDC_TOP_CTL,
769 TOP_CTL_DIG_MCLK_FREQ_MASK,
770 TOP_CTL_DIG_MCLK_FREQ_F_12_288MHZ);
771 break;
772 case 9600000:
773 snd_soc_update_bits(codec, LPASS_CDC_TOP_CTL,
774 TOP_CTL_DIG_MCLK_FREQ_MASK,
775 TOP_CTL_DIG_MCLK_FREQ_F_9_6MHZ);
776 break;
777 default:
778 dev_err(codec->dev, "Invalid mclk rate %ld\n", mclk_rate);
779 break;
780 }
781 return 0;
782}
783
784static void msm8916_wcd_digital_shutdown(struct snd_pcm_substream *substream,
785 struct snd_soc_dai *dai)
786{
787 snd_soc_update_bits(dai->codec, LPASS_CDC_CLK_PDM_CTL,
788 LPASS_CDC_CLK_PDM_CTL_PDM_CLK_SEL_MASK, 0);
789}
790
791static struct snd_soc_dai_ops msm8916_wcd_digital_dai_ops = {
792 .startup = msm8916_wcd_digital_startup,
793 .shutdown = msm8916_wcd_digital_shutdown,
794 .hw_params = msm8916_wcd_digital_hw_params,
795};
796
797static struct snd_soc_dai_driver msm8916_wcd_digital_dai[] = {
798 [0] = {
799 .name = "msm8916_wcd_digital_i2s_rx1",
800 .id = 0,
801 .playback = {
802 .stream_name = "AIF1 Playback",
803 .rates = MSM8916_WCD_DIGITAL_RATES,
804 .formats = MSM8916_WCD_DIGITAL_FORMATS,
805 .channels_min = 1,
806 .channels_max = 3,
807 },
808 .ops = &msm8916_wcd_digital_dai_ops,
809 },
810 [1] = {
811 .name = "msm8916_wcd_digital_i2s_tx1",
812 .id = 1,
813 .capture = {
814 .stream_name = "AIF1 Capture",
815 .rates = MSM8916_WCD_DIGITAL_RATES,
816 .formats = MSM8916_WCD_DIGITAL_FORMATS,
817 .channels_min = 1,
818 .channels_max = 4,
819 },
820 .ops = &msm8916_wcd_digital_dai_ops,
821 },
822};
823
824static struct snd_soc_codec_driver msm8916_wcd_digital = {
825 .probe = msm8916_wcd_digital_codec_probe,
826 .component_driver = {
827 .controls = msm8916_wcd_digital_snd_controls,
828 .num_controls = ARRAY_SIZE(msm8916_wcd_digital_snd_controls),
829 .dapm_widgets = msm8916_wcd_digital_dapm_widgets,
830 .num_dapm_widgets =
831 ARRAY_SIZE(msm8916_wcd_digital_dapm_widgets),
832 .dapm_routes = msm8916_wcd_digital_audio_map,
833 .num_dapm_routes = ARRAY_SIZE(msm8916_wcd_digital_audio_map),
834 },
835};
836
837static const struct regmap_config msm8916_codec_regmap_config = {
838 .reg_bits = 32,
839 .reg_stride = 4,
840 .val_bits = 32,
841 .max_register = LPASS_CDC_TX2_DMIC_CTL,
842 .cache_type = REGCACHE_FLAT,
843};
844
845static int msm8916_wcd_digital_probe(struct platform_device *pdev)
846{
847 struct msm8916_wcd_digital_priv *priv;
848 struct device *dev = &pdev->dev;
849 void __iomem *base;
850 struct resource *mem_res;
851 struct regmap *digital_map;
852 int ret;
853
854 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
855 if (!priv)
856 return -ENOMEM;
857
858 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
859 base = devm_ioremap_resource(&pdev->dev, mem_res);
860 if (IS_ERR(base))
861 return PTR_ERR(base);
862
863 digital_map =
864 devm_regmap_init_mmio(&pdev->dev, base,
865 &msm8916_codec_regmap_config);
866 if (IS_ERR(digital_map))
867 return PTR_ERR(digital_map);
868
869 ret = msm8916_wcd_digital_get_clks(pdev, priv);
870 if (ret < 0)
871 return ret;
872
873 ret = clk_prepare_enable(priv->ahbclk);
874 if (ret < 0) {
875 dev_err(dev, "failed to enable ahbclk %d\n", ret);
876 return ret;
877 }
878
879 ret = clk_prepare_enable(priv->mclk);
880 if (ret < 0) {
881 dev_err(dev, "failed to enable mclk %d\n", ret);
882 return ret;
883 }
884
885 dev_set_drvdata(dev, priv);
886
887 return snd_soc_register_codec(dev, &msm8916_wcd_digital,
888 msm8916_wcd_digital_dai,
889 ARRAY_SIZE(msm8916_wcd_digital_dai));
890}
891
892static int msm8916_wcd_digital_remove(struct platform_device *pdev)
893{
894 struct msm8916_wcd_digital_priv *priv = dev_get_drvdata(&pdev->dev);
895
896 snd_soc_unregister_codec(&pdev->dev);
897 clk_disable_unprepare(priv->mclk);
898 clk_disable_unprepare(priv->ahbclk);
899
900 return 0;
901}
902
903static const struct of_device_id msm8916_wcd_digital_match_table[] = {
904 { .compatible = "qcom,msm8916-wcd-digital-codec" },
905 { }
906};
907
908MODULE_DEVICE_TABLE(of, msm8916_wcd_digital_match_table);
909
910static struct platform_driver msm8916_wcd_digital_driver = {
911 .driver = {
912 .name = "msm8916-wcd-digital-codec",
913 .of_match_table = msm8916_wcd_digital_match_table,
914 },
915 .probe = msm8916_wcd_digital_probe,
916 .remove = msm8916_wcd_digital_remove,
917};
918
919module_platform_driver(msm8916_wcd_digital_driver);
920
921MODULE_AUTHOR("Srinivas Kandagatla <srinivas.kandagatla@linaro.org>");
922MODULE_DESCRIPTION("MSM8916 WCD Digital Codec driver");
923MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/nau8825.c b/sound/soc/codecs/nau8825.c
index e643be91d762..efe3a44658d5 100644
--- a/sound/soc/codecs/nau8825.c
+++ b/sound/soc/codecs/nau8825.c
@@ -43,6 +43,8 @@
43#define GAIN_AUGMENT 22500 43#define GAIN_AUGMENT 22500
44#define SIDETONE_BASE 207000 44#define SIDETONE_BASE 207000
45 45
46/* the maximum frequency of CLK_ADC and CLK_DAC */
47#define CLK_DA_AD_MAX 6144000
46 48
47static int nau8825_configure_sysclk(struct nau8825 *nau8825, 49static int nau8825_configure_sysclk(struct nau8825 *nau8825,
48 int clk_id, unsigned int freq); 50 int clk_id, unsigned int freq);
@@ -95,6 +97,27 @@ static const struct nau8825_fll_attr fll_pre_scalar[] = {
95 { 8, 0x3 }, 97 { 8, 0x3 },
96}; 98};
97 99
100/* over sampling rate */
101struct nau8825_osr_attr {
102 unsigned int osr;
103 unsigned int clk_src;
104};
105
106static const struct nau8825_osr_attr osr_dac_sel[] = {
107 { 64, 2 }, /* OSR 64, SRC 1/4 */
108 { 256, 0 }, /* OSR 256, SRC 1 */
109 { 128, 1 }, /* OSR 128, SRC 1/2 */
110 { 0, 0 },
111 { 32, 3 }, /* OSR 32, SRC 1/8 */
112};
113
114static const struct nau8825_osr_attr osr_adc_sel[] = {
115 { 32, 3 }, /* OSR 32, SRC 1/8 */
116 { 64, 2 }, /* OSR 64, SRC 1/4 */
117 { 128, 1 }, /* OSR 128, SRC 1/2 */
118 { 256, 0 }, /* OSR 256, SRC 1 */
119};
120
98static const struct reg_default nau8825_reg_defaults[] = { 121static const struct reg_default nau8825_reg_defaults[] = {
99 { NAU8825_REG_ENA_CTRL, 0x00ff }, 122 { NAU8825_REG_ENA_CTRL, 0x00ff },
100 { NAU8825_REG_IIC_ADDR_SET, 0x0 }, 123 { NAU8825_REG_IIC_ADDR_SET, 0x0 },
@@ -1179,15 +1202,64 @@ static const struct snd_soc_dapm_route nau8825_dapm_routes[] = {
1179 {"HPOR", NULL, "Class G"}, 1202 {"HPOR", NULL, "Class G"},
1180}; 1203};
1181 1204
1205static int nau8825_clock_check(struct nau8825 *nau8825,
1206 int stream, int rate, int osr)
1207{
1208 int osrate;
1209
1210 if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
1211 if (osr >= ARRAY_SIZE(osr_dac_sel))
1212 return -EINVAL;
1213 osrate = osr_dac_sel[osr].osr;
1214 } else {
1215 if (osr >= ARRAY_SIZE(osr_adc_sel))
1216 return -EINVAL;
1217 osrate = osr_adc_sel[osr].osr;
1218 }
1219
1220 if (!osrate || rate * osr > CLK_DA_AD_MAX) {
1221 dev_err(nau8825->dev, "exceed the maximum frequency of CLK_ADC or CLK_DAC\n");
1222 return -EINVAL;
1223 }
1224
1225 return 0;
1226}
1227
1182static int nau8825_hw_params(struct snd_pcm_substream *substream, 1228static int nau8825_hw_params(struct snd_pcm_substream *substream,
1183 struct snd_pcm_hw_params *params, 1229 struct snd_pcm_hw_params *params,
1184 struct snd_soc_dai *dai) 1230 struct snd_soc_dai *dai)
1185{ 1231{
1186 struct snd_soc_codec *codec = dai->codec; 1232 struct snd_soc_codec *codec = dai->codec;
1187 struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); 1233 struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
1188 unsigned int val_len = 0; 1234 unsigned int val_len = 0, osr;
1235
1236 nau8825_sema_acquire(nau8825, 3 * HZ);
1189 1237
1190 nau8825_sema_acquire(nau8825, 2 * HZ); 1238 /* CLK_DAC or CLK_ADC = OSR * FS
1239 * DAC or ADC clock frequency is defined as Over Sampling Rate (OSR)
1240 * multiplied by the audio sample rate (Fs). Note that the OSR and Fs
1241 * values must be selected such that the maximum frequency is less
1242 * than 6.144 MHz.
1243 */
1244 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
1245 regmap_read(nau8825->regmap, NAU8825_REG_DAC_CTRL1, &osr);
1246 osr &= NAU8825_DAC_OVERSAMPLE_MASK;
1247 if (nau8825_clock_check(nau8825, substream->stream,
1248 params_rate(params), osr))
1249 return -EINVAL;
1250 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER,
1251 NAU8825_CLK_DAC_SRC_MASK,
1252 osr_dac_sel[osr].clk_src << NAU8825_CLK_DAC_SRC_SFT);
1253 } else {
1254 regmap_read(nau8825->regmap, NAU8825_REG_ADC_RATE, &osr);
1255 osr &= NAU8825_ADC_SYNC_DOWN_MASK;
1256 if (nau8825_clock_check(nau8825, substream->stream,
1257 params_rate(params), osr))
1258 return -EINVAL;
1259 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER,
1260 NAU8825_CLK_ADC_SRC_MASK,
1261 osr_adc_sel[osr].clk_src << NAU8825_CLK_ADC_SRC_SFT);
1262 }
1191 1263
1192 switch (params_width(params)) { 1264 switch (params_width(params)) {
1193 case 16: 1265 case 16:
@@ -1221,7 +1293,7 @@ static int nau8825_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
1221 struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec); 1293 struct nau8825 *nau8825 = snd_soc_codec_get_drvdata(codec);
1222 unsigned int ctrl1_val = 0, ctrl2_val = 0; 1294 unsigned int ctrl1_val = 0, ctrl2_val = 0;
1223 1295
1224 nau8825_sema_acquire(nau8825, 2 * HZ); 1296 nau8825_sema_acquire(nau8825, 3 * HZ);
1225 1297
1226 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) { 1298 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
1227 case SND_SOC_DAIFMT_CBM_CFM: 1299 case SND_SOC_DAIFMT_CBM_CFM:
@@ -1774,9 +1846,10 @@ static void nau8825_init_regs(struct nau8825 *nau8825)
1774 * (audible hiss). Set it to something better. 1846 * (audible hiss). Set it to something better.
1775 */ 1847 */
1776 regmap_update_bits(regmap, NAU8825_REG_ADC_RATE, 1848 regmap_update_bits(regmap, NAU8825_REG_ADC_RATE,
1777 NAU8825_ADC_SYNC_DOWN_MASK, NAU8825_ADC_SYNC_DOWN_128); 1849 NAU8825_ADC_SYNC_DOWN_MASK | NAU8825_ADC_SINC4_EN,
1850 NAU8825_ADC_SYNC_DOWN_64);
1778 regmap_update_bits(regmap, NAU8825_REG_DAC_CTRL1, 1851 regmap_update_bits(regmap, NAU8825_REG_DAC_CTRL1,
1779 NAU8825_DAC_OVERSAMPLE_MASK, NAU8825_DAC_OVERSAMPLE_128); 1852 NAU8825_DAC_OVERSAMPLE_MASK, NAU8825_DAC_OVERSAMPLE_64);
1780 /* Disable DACR/L power */ 1853 /* Disable DACR/L power */
1781 regmap_update_bits(regmap, NAU8825_REG_CHARGE_PUMP, 1854 regmap_update_bits(regmap, NAU8825_REG_CHARGE_PUMP,
1782 NAU8825_POWER_DOWN_DACR | NAU8825_POWER_DOWN_DACL, 1855 NAU8825_POWER_DOWN_DACR | NAU8825_POWER_DOWN_DACL,
@@ -1811,6 +1884,9 @@ static void nau8825_init_regs(struct nau8825 *nau8825)
1811 NAU8825_DACL_CH_SEL_MASK, NAU8825_DACL_CH_SEL_L); 1884 NAU8825_DACL_CH_SEL_MASK, NAU8825_DACL_CH_SEL_L);
1812 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACR_CTRL, 1885 regmap_update_bits(nau8825->regmap, NAU8825_REG_DACR_CTRL,
1813 NAU8825_DACL_CH_SEL_MASK, NAU8825_DACL_CH_SEL_R); 1886 NAU8825_DACL_CH_SEL_MASK, NAU8825_DACL_CH_SEL_R);
1887 /* Disable short Frame Sync detection logic */
1888 regmap_update_bits(regmap, NAU8825_REG_LEFT_TIME_SLOT,
1889 NAU8825_DIS_FS_SHORT_DET, NAU8825_DIS_FS_SHORT_DET);
1814} 1890}
1815 1891
1816static const struct regmap_config nau8825_regmap_config = { 1892static const struct regmap_config nau8825_regmap_config = {
@@ -1919,8 +1995,10 @@ static void nau8825_fll_apply(struct nau8825 *nau8825,
1919 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER, 1995 regmap_update_bits(nau8825->regmap, NAU8825_REG_CLK_DIVIDER,
1920 NAU8825_CLK_SRC_MASK | NAU8825_CLK_MCLK_SRC_MASK, 1996 NAU8825_CLK_SRC_MASK | NAU8825_CLK_MCLK_SRC_MASK,
1921 NAU8825_CLK_SRC_MCLK | fll_param->mclk_src); 1997 NAU8825_CLK_SRC_MCLK | fll_param->mclk_src);
1998 /* Make DSP operate at high speed for better performance. */
1922 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL1, 1999 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL1,
1923 NAU8825_FLL_RATIO_MASK, fll_param->ratio); 2000 NAU8825_FLL_RATIO_MASK | NAU8825_ICTRL_LATCH_MASK,
2001 fll_param->ratio | (0x6 << NAU8825_ICTRL_LATCH_SFT));
1924 /* FLL 16-bit fractional input */ 2002 /* FLL 16-bit fractional input */
1925 regmap_write(nau8825->regmap, NAU8825_REG_FLL2, fll_param->fll_frac); 2003 regmap_write(nau8825->regmap, NAU8825_REG_FLL2, fll_param->fll_frac);
1926 /* FLL 10-bit integer input */ 2004 /* FLL 10-bit integer input */
@@ -1936,19 +2014,22 @@ static void nau8825_fll_apply(struct nau8825 *nau8825,
1936 regmap_update_bits(nau8825->regmap, 2014 regmap_update_bits(nau8825->regmap,
1937 NAU8825_REG_FLL6, NAU8825_DCO_EN, 0); 2015 NAU8825_REG_FLL6, NAU8825_DCO_EN, 0);
1938 if (fll_param->fll_frac) { 2016 if (fll_param->fll_frac) {
2017 /* set FLL loop filter enable and cutoff frequency at 500Khz */
1939 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, 2018 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5,
1940 NAU8825_FLL_PDB_DAC_EN | NAU8825_FLL_LOOP_FTR_EN | 2019 NAU8825_FLL_PDB_DAC_EN | NAU8825_FLL_LOOP_FTR_EN |
1941 NAU8825_FLL_FTR_SW_MASK, 2020 NAU8825_FLL_FTR_SW_MASK,
1942 NAU8825_FLL_PDB_DAC_EN | NAU8825_FLL_LOOP_FTR_EN | 2021 NAU8825_FLL_PDB_DAC_EN | NAU8825_FLL_LOOP_FTR_EN |
1943 NAU8825_FLL_FTR_SW_FILTER); 2022 NAU8825_FLL_FTR_SW_FILTER);
1944 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6, 2023 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6,
1945 NAU8825_SDM_EN, NAU8825_SDM_EN); 2024 NAU8825_SDM_EN | NAU8825_CUTOFF500,
2025 NAU8825_SDM_EN | NAU8825_CUTOFF500);
1946 } else { 2026 } else {
2027 /* disable FLL loop filter and cutoff frequency */
1947 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5, 2028 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL5,
1948 NAU8825_FLL_PDB_DAC_EN | NAU8825_FLL_LOOP_FTR_EN | 2029 NAU8825_FLL_PDB_DAC_EN | NAU8825_FLL_LOOP_FTR_EN |
1949 NAU8825_FLL_FTR_SW_MASK, NAU8825_FLL_FTR_SW_ACCU); 2030 NAU8825_FLL_FTR_SW_MASK, NAU8825_FLL_FTR_SW_ACCU);
1950 regmap_update_bits(nau8825->regmap, 2031 regmap_update_bits(nau8825->regmap, NAU8825_REG_FLL6,
1951 NAU8825_REG_FLL6, NAU8825_SDM_EN, 0); 2032 NAU8825_SDM_EN | NAU8825_CUTOFF500, 0);
1952 } 2033 }
1953} 2034}
1954 2035
@@ -2014,6 +2095,9 @@ static void nau8825_configure_mclk_as_sysclk(struct regmap *regmap)
2014 NAU8825_CLK_SRC_MASK, NAU8825_CLK_SRC_MCLK); 2095 NAU8825_CLK_SRC_MASK, NAU8825_CLK_SRC_MCLK);
2015 regmap_update_bits(regmap, NAU8825_REG_FLL6, 2096 regmap_update_bits(regmap, NAU8825_REG_FLL6,
2016 NAU8825_DCO_EN, 0); 2097 NAU8825_DCO_EN, 0);
2098 /* Make DSP operate as default setting for power saving. */
2099 regmap_update_bits(regmap, NAU8825_REG_FLL1,
2100 NAU8825_ICTRL_LATCH_MASK, 0);
2017} 2101}
2018 2102
2019static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id, 2103static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
@@ -2038,7 +2122,7 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
2038 * fered by cross talk process, the driver make the playback 2122 * fered by cross talk process, the driver make the playback
2039 * preparation halted until cross talk process finish. 2123 * preparation halted until cross talk process finish.
2040 */ 2124 */
2041 nau8825_sema_acquire(nau8825, 2 * HZ); 2125 nau8825_sema_acquire(nau8825, 3 * HZ);
2042 nau8825_configure_mclk_as_sysclk(regmap); 2126 nau8825_configure_mclk_as_sysclk(regmap);
2043 /* MCLK not changed by clock tree */ 2127 /* MCLK not changed by clock tree */
2044 regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER, 2128 regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
@@ -2057,10 +2141,13 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
2057 NAU8825_DCO_EN, NAU8825_DCO_EN); 2141 NAU8825_DCO_EN, NAU8825_DCO_EN);
2058 regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER, 2142 regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
2059 NAU8825_CLK_SRC_MASK, NAU8825_CLK_SRC_VCO); 2143 NAU8825_CLK_SRC_MASK, NAU8825_CLK_SRC_VCO);
2060 /* Decrease the VCO frequency for power saving */ 2144 /* Decrease the VCO frequency and make DSP operate
2145 * as default setting for power saving.
2146 */
2061 regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER, 2147 regmap_update_bits(regmap, NAU8825_REG_CLK_DIVIDER,
2062 NAU8825_CLK_MCLK_SRC_MASK, 0xf); 2148 NAU8825_CLK_MCLK_SRC_MASK, 0xf);
2063 regmap_update_bits(regmap, NAU8825_REG_FLL1, 2149 regmap_update_bits(regmap, NAU8825_REG_FLL1,
2150 NAU8825_ICTRL_LATCH_MASK |
2064 NAU8825_FLL_RATIO_MASK, 0x10); 2151 NAU8825_FLL_RATIO_MASK, 0x10);
2065 regmap_update_bits(regmap, NAU8825_REG_FLL6, 2152 regmap_update_bits(regmap, NAU8825_REG_FLL6,
2066 NAU8825_SDM_EN, NAU8825_SDM_EN); 2153 NAU8825_SDM_EN, NAU8825_SDM_EN);
@@ -2083,9 +2170,14 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
2083 * fered by cross talk process, the driver make the playback 2170 * fered by cross talk process, the driver make the playback
2084 * preparation halted until cross talk process finish. 2171 * preparation halted until cross talk process finish.
2085 */ 2172 */
2086 nau8825_sema_acquire(nau8825, 2 * HZ); 2173 nau8825_sema_acquire(nau8825, 3 * HZ);
2174 /* Higher FLL reference input frequency can only set lower
2175 * gain error, such as 0000 for input reference from MCLK
2176 * 12.288Mhz.
2177 */
2087 regmap_update_bits(regmap, NAU8825_REG_FLL3, 2178 regmap_update_bits(regmap, NAU8825_REG_FLL3,
2088 NAU8825_FLL_CLK_SRC_MASK, NAU8825_FLL_CLK_SRC_MCLK); 2179 NAU8825_FLL_CLK_SRC_MASK | NAU8825_GAIN_ERR_MASK,
2180 NAU8825_FLL_CLK_SRC_MCLK | 0);
2089 /* Release the semaphone. */ 2181 /* Release the semaphone. */
2090 nau8825_sema_release(nau8825); 2182 nau8825_sema_release(nau8825);
2091 2183
@@ -2100,9 +2192,17 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
2100 * fered by cross talk process, the driver make the playback 2192 * fered by cross talk process, the driver make the playback
2101 * preparation halted until cross talk process finish. 2193 * preparation halted until cross talk process finish.
2102 */ 2194 */
2103 nau8825_sema_acquire(nau8825, 2 * HZ); 2195 nau8825_sema_acquire(nau8825, 3 * HZ);
2196 /* If FLL reference input is from low frequency source,
2197 * higher error gain can apply such as 0xf which has
2198 * the most sensitive gain error correction threshold,
2199 * Therefore, FLL has the most accurate DCO to
2200 * target frequency.
2201 */
2104 regmap_update_bits(regmap, NAU8825_REG_FLL3, 2202 regmap_update_bits(regmap, NAU8825_REG_FLL3,
2105 NAU8825_FLL_CLK_SRC_MASK, NAU8825_FLL_CLK_SRC_BLK); 2203 NAU8825_FLL_CLK_SRC_MASK | NAU8825_GAIN_ERR_MASK,
2204 NAU8825_FLL_CLK_SRC_BLK |
2205 (0xf << NAU8825_GAIN_ERR_SFT));
2106 /* Release the semaphone. */ 2206 /* Release the semaphone. */
2107 nau8825_sema_release(nau8825); 2207 nau8825_sema_release(nau8825);
2108 2208
@@ -2118,9 +2218,17 @@ static int nau8825_configure_sysclk(struct nau8825 *nau8825, int clk_id,
2118 * fered by cross talk process, the driver make the playback 2218 * fered by cross talk process, the driver make the playback
2119 * preparation halted until cross talk process finish. 2219 * preparation halted until cross talk process finish.
2120 */ 2220 */
2121 nau8825_sema_acquire(nau8825, 2 * HZ); 2221 nau8825_sema_acquire(nau8825, 3 * HZ);
2222 /* If FLL reference input is from low frequency source,
2223 * higher error gain can apply such as 0xf which has
2224 * the most sensitive gain error correction threshold,
2225 * Therefore, FLL has the most accurate DCO to
2226 * target frequency.
2227 */
2122 regmap_update_bits(regmap, NAU8825_REG_FLL3, 2228 regmap_update_bits(regmap, NAU8825_REG_FLL3,
2123 NAU8825_FLL_CLK_SRC_MASK, NAU8825_FLL_CLK_SRC_FS); 2229 NAU8825_FLL_CLK_SRC_MASK | NAU8825_GAIN_ERR_MASK,
2230 NAU8825_FLL_CLK_SRC_FS |
2231 (0xf << NAU8825_GAIN_ERR_SFT));
2124 /* Release the semaphone. */ 2232 /* Release the semaphone. */
2125 nau8825_sema_release(nau8825); 2233 nau8825_sema_release(nau8825);
2126 2234
diff --git a/sound/soc/codecs/nau8825.h b/sound/soc/codecs/nau8825.h
index 1c63e2abafa9..5d1704e73241 100644
--- a/sound/soc/codecs/nau8825.h
+++ b/sound/soc/codecs/nau8825.h
@@ -115,12 +115,20 @@
115#define NAU8825_CLK_SRC_MASK (1 << NAU8825_CLK_SRC_SFT) 115#define NAU8825_CLK_SRC_MASK (1 << NAU8825_CLK_SRC_SFT)
116#define NAU8825_CLK_SRC_VCO (1 << NAU8825_CLK_SRC_SFT) 116#define NAU8825_CLK_SRC_VCO (1 << NAU8825_CLK_SRC_SFT)
117#define NAU8825_CLK_SRC_MCLK (0 << NAU8825_CLK_SRC_SFT) 117#define NAU8825_CLK_SRC_MCLK (0 << NAU8825_CLK_SRC_SFT)
118#define NAU8825_CLK_ADC_SRC_SFT 6
119#define NAU8825_CLK_ADC_SRC_MASK (0x3 << NAU8825_CLK_ADC_SRC_SFT)
120#define NAU8825_CLK_DAC_SRC_SFT 4
121#define NAU8825_CLK_DAC_SRC_MASK (0x3 << NAU8825_CLK_DAC_SRC_SFT)
118#define NAU8825_CLK_MCLK_SRC_MASK (0xf << 0) 122#define NAU8825_CLK_MCLK_SRC_MASK (0xf << 0)
119 123
120/* FLL1 (0x04) */ 124/* FLL1 (0x04) */
125#define NAU8825_ICTRL_LATCH_SFT 10
126#define NAU8825_ICTRL_LATCH_MASK (0x7 << NAU8825_ICTRL_LATCH_SFT)
121#define NAU8825_FLL_RATIO_MASK (0x7f << 0) 127#define NAU8825_FLL_RATIO_MASK (0x7f << 0)
122 128
123/* FLL3 (0x06) */ 129/* FLL3 (0x06) */
130#define NAU8825_GAIN_ERR_SFT 12
131#define NAU8825_GAIN_ERR_MASK (0xf << NAU8825_GAIN_ERR_SFT)
124#define NAU8825_FLL_INTEGER_MASK (0x3ff << 0) 132#define NAU8825_FLL_INTEGER_MASK (0x3ff << 0)
125#define NAU8825_FLL_CLK_SRC_SFT 10 133#define NAU8825_FLL_CLK_SRC_SFT 10
126#define NAU8825_FLL_CLK_SRC_MASK (0x3 << NAU8825_FLL_CLK_SRC_SFT) 134#define NAU8825_FLL_CLK_SRC_MASK (0x3 << NAU8825_FLL_CLK_SRC_SFT)
@@ -144,6 +152,7 @@
144/* FLL6 (0x9) */ 152/* FLL6 (0x9) */
145#define NAU8825_DCO_EN (0x1 << 15) 153#define NAU8825_DCO_EN (0x1 << 15)
146#define NAU8825_SDM_EN (0x1 << 14) 154#define NAU8825_SDM_EN (0x1 << 14)
155#define NAU8825_CUTOFF500 (0x1 << 13)
147 156
148/* HSD_CTRL (0xc) */ 157/* HSD_CTRL (0xc) */
149#define NAU8825_HSD_AUTO_MODE (1 << 6) 158#define NAU8825_HSD_AUTO_MODE (1 << 6)
@@ -246,6 +255,11 @@
246#define NAU8825_I2S_MS_SLAVE (0 << NAU8825_I2S_MS_SFT) 255#define NAU8825_I2S_MS_SLAVE (0 << NAU8825_I2S_MS_SFT)
247#define NAU8825_I2S_BLK_DIV_MASK 0x7 256#define NAU8825_I2S_BLK_DIV_MASK 0x7
248 257
258/* LEFT_TIME_SLOT (0x1e) */
259#define NAU8825_FS_ERR_CMP_SEL_SFT 14
260#define NAU8825_FS_ERR_CMP_SEL_MASK (0x3 << NAU8825_FS_ERR_CMP_SEL_SFT)
261#define NAU8825_DIS_FS_SHORT_DET (1 << 13)
262
249/* BIQ_CTRL (0x20) */ 263/* BIQ_CTRL (0x20) */
250#define NAU8825_BIQ_WRT_SFT 4 264#define NAU8825_BIQ_WRT_SFT 4
251#define NAU8825_BIQ_WRT_EN (1 << NAU8825_BIQ_WRT_SFT) 265#define NAU8825_BIQ_WRT_EN (1 << NAU8825_BIQ_WRT_SFT)
@@ -255,6 +269,8 @@
255#define NAU8825_BIQ_PATH_DAC (1 << NAU8825_BIQ_PATH_SFT) 269#define NAU8825_BIQ_PATH_DAC (1 << NAU8825_BIQ_PATH_SFT)
256 270
257/* ADC_RATE (0x2b) */ 271/* ADC_RATE (0x2b) */
272#define NAU8825_ADC_SINC4_SFT 4
273#define NAU8825_ADC_SINC4_EN (1 << NAU8825_ADC_SINC4_SFT)
258#define NAU8825_ADC_SYNC_DOWN_SFT 0 274#define NAU8825_ADC_SYNC_DOWN_SFT 0
259#define NAU8825_ADC_SYNC_DOWN_MASK 0x3 275#define NAU8825_ADC_SYNC_DOWN_MASK 0x3
260#define NAU8825_ADC_SYNC_DOWN_32 0 276#define NAU8825_ADC_SYNC_DOWN_32 0
diff --git a/sound/soc/codecs/rl6231.c b/sound/soc/codecs/rl6231.c
index 1dc68ab08a17..7b447d0b173a 100644
--- a/sound/soc/codecs/rl6231.c
+++ b/sound/soc/codecs/rl6231.c
@@ -102,6 +102,7 @@ struct pll_calc_map {
102}; 102};
103 103
104static const struct pll_calc_map pll_preset_table[] = { 104static const struct pll_calc_map pll_preset_table[] = {
105 {19200000, 4096000, 23, 14, 1, false},
105 {19200000, 24576000, 3, 30, 3, false}, 106 {19200000, 24576000, 3, 30, 3, false},
106}; 107};
107 108
diff --git a/sound/soc/codecs/rl6347a.c b/sound/soc/codecs/rl6347a.c
index a4b910efbd45..8f571cf8edd4 100644
--- a/sound/soc/codecs/rl6347a.c
+++ b/sound/soc/codecs/rl6347a.c
@@ -51,7 +51,7 @@ int rl6347a_hw_write(void *context, unsigned int reg, unsigned int value)
51 if (ret == 4) 51 if (ret == 4)
52 return 0; 52 return 0;
53 else 53 else
54 pr_err("ret=%d\n", ret); 54 dev_err(&client->dev, "I2C error %d\n", ret);
55 if (ret < 0) 55 if (ret < 0)
56 return ret; 56 return ret;
57 else 57 else
diff --git a/sound/soc/codecs/rt298.c b/sound/soc/codecs/rt298.c
index 2db8179047ae..7150a407ffd9 100644
--- a/sound/soc/codecs/rt298.c
+++ b/sound/soc/codecs/rt298.c
@@ -326,11 +326,31 @@ static void rt298_jack_detect_work(struct work_struct *work)
326int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack) 326int rt298_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
327{ 327{
328 struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec); 328 struct rt298_priv *rt298 = snd_soc_codec_get_drvdata(codec);
329 struct snd_soc_dapm_context *dapm;
330 bool hp = false;
331 bool mic = false;
332 int status = 0;
333
334 /* If jack in NULL, disable HS jack */
335 if (!jack) {
336 regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x0);
337 dapm = snd_soc_codec_get_dapm(codec);
338 snd_soc_dapm_disable_pin(dapm, "LDO1");
339 snd_soc_dapm_sync(dapm);
340 return 0;
341 }
329 342
330 rt298->jack = jack; 343 rt298->jack = jack;
344 regmap_update_bits(rt298->regmap, RT298_IRQ_CTRL, 0x2, 0x2);
331 345
332 /* Send an initial empty report */ 346 rt298_jack_detect(rt298, &hp, &mic);
333 snd_soc_jack_report(rt298->jack, 0, 347 if (hp == true)
348 status |= SND_JACK_HEADPHONE;
349
350 if (mic == true)
351 status |= SND_JACK_MICROPHONE;
352
353 snd_soc_jack_report(rt298->jack, status,
334 SND_JACK_MICROPHONE | SND_JACK_HEADPHONE); 354 SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
335 355
336 return 0; 356 return 0;
diff --git a/sound/soc/codecs/rt5514-spi.c b/sound/soc/codecs/rt5514-spi.c
index 09103aab0cb2..0901e25d6db6 100644
--- a/sound/soc/codecs/rt5514-spi.c
+++ b/sound/soc/codecs/rt5514-spi.c
@@ -20,7 +20,6 @@
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/gpio.h> 21#include <linux/gpio.h>
22#include <linux/sched.h> 22#include <linux/sched.h>
23#include <linux/kthread.h>
24#include <linux/uaccess.h> 23#include <linux/uaccess.h>
25#include <linux/miscdevice.h> 24#include <linux/miscdevice.h>
26#include <linux/regulator/consumer.h> 25#include <linux/regulator/consumer.h>
diff --git a/sound/soc/codecs/rt5514.c b/sound/soc/codecs/rt5514.c
index f24b7cfd3a89..b281a46d769d 100644
--- a/sound/soc/codecs/rt5514.c
+++ b/sound/soc/codecs/rt5514.c
@@ -452,6 +452,9 @@ static int rt5514_set_dmic_clk(struct snd_soc_dapm_widget *w,
452 RT5514_CLK_DMIC_OUT_SEL_MASK, 452 RT5514_CLK_DMIC_OUT_SEL_MASK,
453 idx << RT5514_CLK_DMIC_OUT_SEL_SFT); 453 idx << RT5514_CLK_DMIC_OUT_SEL_SFT);
454 454
455 if (rt5514->pdata.dmic_init_delay)
456 msleep(rt5514->pdata.dmic_init_delay);
457
455 return idx; 458 return idx;
456} 459}
457 460
@@ -1073,9 +1076,18 @@ static const struct of_device_id rt5514_of_match[] = {
1073MODULE_DEVICE_TABLE(of, rt5514_of_match); 1076MODULE_DEVICE_TABLE(of, rt5514_of_match);
1074#endif 1077#endif
1075 1078
1079static int rt5514_parse_dt(struct rt5514_priv *rt5514, struct device *dev)
1080{
1081 device_property_read_u32(dev, "realtek,dmic-init-delay-ms",
1082 &rt5514->pdata.dmic_init_delay);
1083
1084 return 0;
1085}
1086
1076static int rt5514_i2c_probe(struct i2c_client *i2c, 1087static int rt5514_i2c_probe(struct i2c_client *i2c,
1077 const struct i2c_device_id *id) 1088 const struct i2c_device_id *id)
1078{ 1089{
1090 struct rt5514_platform_data *pdata = dev_get_platdata(&i2c->dev);
1079 struct rt5514_priv *rt5514; 1091 struct rt5514_priv *rt5514;
1080 int ret; 1092 int ret;
1081 unsigned int val; 1093 unsigned int val;
@@ -1087,6 +1099,11 @@ static int rt5514_i2c_probe(struct i2c_client *i2c,
1087 1099
1088 i2c_set_clientdata(i2c, rt5514); 1100 i2c_set_clientdata(i2c, rt5514);
1089 1101
1102 if (pdata)
1103 rt5514->pdata = *pdata;
1104 else if (i2c->dev.of_node)
1105 rt5514_parse_dt(rt5514, &i2c->dev);
1106
1090 rt5514->i2c_regmap = devm_regmap_init_i2c(i2c, &rt5514_i2c_regmap); 1107 rt5514->i2c_regmap = devm_regmap_init_i2c(i2c, &rt5514_i2c_regmap);
1091 if (IS_ERR(rt5514->i2c_regmap)) { 1108 if (IS_ERR(rt5514->i2c_regmap)) {
1092 ret = PTR_ERR(rt5514->i2c_regmap); 1109 ret = PTR_ERR(rt5514->i2c_regmap);
diff --git a/sound/soc/codecs/rt5514.h b/sound/soc/codecs/rt5514.h
index 229de0e2c88c..5d343fb6d125 100644
--- a/sound/soc/codecs/rt5514.h
+++ b/sound/soc/codecs/rt5514.h
@@ -13,6 +13,7 @@
13#define __RT5514_H__ 13#define __RT5514_H__
14 14
15#include <linux/clk.h> 15#include <linux/clk.h>
16#include <sound/rt5514.h>
16 17
17#define RT5514_DEVICE_ID 0x10ec5514 18#define RT5514_DEVICE_ID 0x10ec5514
18 19
@@ -243,6 +244,7 @@ enum {
243}; 244};
244 245
245struct rt5514_priv { 246struct rt5514_priv {
247 struct rt5514_platform_data pdata;
246 struct snd_soc_codec *codec; 248 struct snd_soc_codec *codec;
247 struct regmap *i2c_regmap, *regmap; 249 struct regmap *i2c_regmap, *regmap;
248 struct clk *mclk; 250 struct clk *mclk;
diff --git a/sound/soc/codecs/rt5616.c b/sound/soc/codecs/rt5616.c
index d1f273b24991..7d6e0823f98f 100644
--- a/sound/soc/codecs/rt5616.c
+++ b/sound/soc/codecs/rt5616.c
@@ -960,8 +960,7 @@ static int rt5616_hw_params(struct snd_pcm_substream *substream,
960 struct snd_pcm_hw_params *params, 960 struct snd_pcm_hw_params *params,
961 struct snd_soc_dai *dai) 961 struct snd_soc_dai *dai)
962{ 962{
963 struct snd_soc_pcm_runtime *rtd = substream->private_data; 963 struct snd_soc_codec *codec = dai->codec;
964 struct snd_soc_codec *codec = rtd->codec;
965 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec); 964 struct rt5616_priv *rt5616 = snd_soc_codec_get_drvdata(codec);
966 unsigned int val_len = 0, val_clk, mask_clk; 965 unsigned int val_len = 0, val_clk, mask_clk;
967 int pre_div, bclk_ms, frame_size; 966 int pre_div, bclk_ms, frame_size;
diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c
index 3cc1135fc2cd..e29a6defefa0 100644
--- a/sound/soc/codecs/rt5640.c
+++ b/sound/soc/codecs/rt5640.c
@@ -423,6 +423,8 @@ static const struct snd_kcontrol_new rt5640_snd_controls[] = {
423 SOC_DOUBLE_TLV("ADC Capture Volume", RT5640_ADC_DIG_VOL, 423 SOC_DOUBLE_TLV("ADC Capture Volume", RT5640_ADC_DIG_VOL,
424 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 424 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
425 127, 0, adc_vol_tlv), 425 127, 0, adc_vol_tlv),
426 SOC_DOUBLE("Mono ADC Capture Switch", RT5640_DUMMY1,
427 RT5640_M_MONO_ADC_L_SFT, RT5640_M_MONO_ADC_R_SFT, 1, 1),
426 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5640_ADC_DATA, 428 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5640_ADC_DATA,
427 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT, 429 RT5640_L_VOL_SFT, RT5640_R_VOL_SFT,
428 127, 0, adc_vol_tlv), 430 127, 0, adc_vol_tlv),
@@ -2407,6 +2409,9 @@ static int rt5640_i2c_probe(struct i2c_client *i2c,
2407 if (ret != 0) 2409 if (ret != 0)
2408 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); 2410 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
2409 2411
2412 regmap_update_bits(rt5640->regmap, RT5640_DUMMY1,
2413 RT5640_MCLK_DET, RT5640_MCLK_DET);
2414
2410 if (rt5640->pdata.in1_diff) 2415 if (rt5640->pdata.in1_diff)
2411 regmap_update_bits(rt5640->regmap, RT5640_IN1_IN2, 2416 regmap_update_bits(rt5640->regmap, RT5640_IN1_IN2,
2412 RT5640_IN_DF1, RT5640_IN_DF1); 2417 RT5640_IN_DF1, RT5640_IN_DF1);
diff --git a/sound/soc/codecs/rt5640.h b/sound/soc/codecs/rt5640.h
index 90c88711c72a..b8a811732a52 100644
--- a/sound/soc/codecs/rt5640.h
+++ b/sound/soc/codecs/rt5640.h
@@ -1970,6 +1970,12 @@
1970#define RT5640_ZCD_HP_DIS (0x0 << 15) 1970#define RT5640_ZCD_HP_DIS (0x0 << 15)
1971#define RT5640_ZCD_HP_EN (0x1 << 15) 1971#define RT5640_ZCD_HP_EN (0x1 << 15)
1972 1972
1973/* General Control 1 (0xfa) */
1974#define RT5640_M_MONO_ADC_L (0x1 << 13)
1975#define RT5640_M_MONO_ADC_L_SFT 13
1976#define RT5640_M_MONO_ADC_R (0x1 << 12)
1977#define RT5640_M_MONO_ADC_R_SFT 12
1978#define RT5640_MCLK_DET (0x1 << 11)
1973 1979
1974/* Codec Private Register definition */ 1980/* Codec Private Register definition */
1975/* 3D Speaker Control (0x63) */ 1981/* 3D Speaker Control (0x63) */
diff --git a/sound/soc/codecs/rt5660.c b/sound/soc/codecs/rt5660.c
index 9f0933ced804..76cf76a2e9b6 100644
--- a/sound/soc/codecs/rt5660.c
+++ b/sound/soc/codecs/rt5660.c
@@ -1311,6 +1311,10 @@ static int rt5660_i2c_probe(struct i2c_client *i2c,
1311 if (ret != 0) 1311 if (ret != 0)
1312 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); 1312 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
1313 1313
1314 regmap_update_bits(rt5660->regmap, RT5660_GEN_CTRL1,
1315 RT5660_AUTO_DIS_AMP | RT5660_MCLK_DET | RT5660_POW_CLKDET,
1316 RT5660_AUTO_DIS_AMP | RT5660_MCLK_DET | RT5660_POW_CLKDET);
1317
1314 if (rt5660->pdata.dmic1_data_pin) { 1318 if (rt5660->pdata.dmic1_data_pin) {
1315 regmap_update_bits(rt5660->regmap, RT5660_GPIO_CTRL1, 1319 regmap_update_bits(rt5660->regmap, RT5660_GPIO_CTRL1,
1316 RT5660_GP1_PIN_MASK, RT5660_GP1_PIN_DMIC1_SCL); 1320 RT5660_GP1_PIN_MASK, RT5660_GP1_PIN_DMIC1_SCL);
diff --git a/sound/soc/codecs/rt5660.h b/sound/soc/codecs/rt5660.h
index 6cdb9269ec9e..bba18fb66b6f 100644
--- a/sound/soc/codecs/rt5660.h
+++ b/sound/soc/codecs/rt5660.h
@@ -810,6 +810,9 @@
810/* General Control 1 (0xfa) */ 810/* General Control 1 (0xfa) */
811#define RT5660_PWR_VREF_HP (0x1 << 11) 811#define RT5660_PWR_VREF_HP (0x1 << 11)
812#define RT5660_PWR_VREF_HP_SFT 11 812#define RT5660_PWR_VREF_HP_SFT 11
813#define RT5660_AUTO_DIS_AMP (0x1 << 6)
814#define RT5660_MCLK_DET (0x1 << 5)
815#define RT5660_POW_CLKDET (0x1 << 1)
813#define RT5660_DIG_GATE_CTRL (0x1) 816#define RT5660_DIG_GATE_CTRL (0x1)
814#define RT5660_DIG_GATE_CTRL_SFT 0 817#define RT5660_DIG_GATE_CTRL_SFT 0
815 818
diff --git a/sound/soc/codecs/rt5663.c b/sound/soc/codecs/rt5663.c
index 00ff2788879e..a32508d7dcfd 100644
--- a/sound/soc/codecs/rt5663.c
+++ b/sound/soc/codecs/rt5663.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * rt5663.c -- RT5668/RT5663 ALSA SoC audio codec driver 2 * rt5663.c -- RT5663 ALSA SoC audio codec driver
3 * 3 *
4 * Copyright 2016 Realtek Semiconductor Corp. 4 * Copyright 2016 Realtek Semiconductor Corp.
5 * Author: Jack Yu <jack.yu@realtek.com> 5 * Author: Jack Yu <jack.yu@realtek.com>
@@ -30,12 +30,12 @@
30#include "rt5663.h" 30#include "rt5663.h"
31#include "rl6231.h" 31#include "rl6231.h"
32 32
33#define RT5668_DEVICE_ID 0x6451 33#define RT5663_DEVICE_ID_2 0x6451
34#define RT5663_DEVICE_ID 0x6406 34#define RT5663_DEVICE_ID_1 0x6406
35 35
36enum { 36enum {
37 CODEC_TYPE_RT5668, 37 CODEC_VER_1,
38 CODEC_TYPE_RT5663, 38 CODEC_VER_0,
39}; 39};
40 40
41struct rt5663_priv { 41struct rt5663_priv {
@@ -45,7 +45,7 @@ struct rt5663_priv {
45 struct snd_soc_jack *hs_jack; 45 struct snd_soc_jack *hs_jack;
46 struct timer_list btn_check_timer; 46 struct timer_list btn_check_timer;
47 47
48 int codec_type; 48 int codec_ver;
49 int sysclk; 49 int sysclk;
50 int sysclk_src; 50 int sysclk_src;
51 int lrck; 51 int lrck;
@@ -57,7 +57,7 @@ struct rt5663_priv {
57 int jack_type; 57 int jack_type;
58}; 58};
59 59
60static const struct reg_default rt5668_reg[] = { 60static const struct reg_default rt5663_v2_reg[] = {
61 { 0x0000, 0x0000 }, 61 { 0x0000, 0x0000 },
62 { 0x0001, 0xc8c8 }, 62 { 0x0001, 0xc8c8 },
63 { 0x0002, 0x8080 }, 63 { 0x0002, 0x8080 },
@@ -730,7 +730,7 @@ static bool rt5663_volatile_register(struct device *dev, unsigned int reg)
730 case RT5663_ADC_EQ_1: 730 case RT5663_ADC_EQ_1:
731 case RT5663_INT_ST_1: 731 case RT5663_INT_ST_1:
732 case RT5663_INT_ST_2: 732 case RT5663_INT_ST_2:
733 case RT5663_GPIO_STA: 733 case RT5663_GPIO_STA1:
734 case RT5663_SIN_GEN_1: 734 case RT5663_SIN_GEN_1:
735 case RT5663_IL_CMD_1: 735 case RT5663_IL_CMD_1:
736 case RT5663_IL_CMD_5: 736 case RT5663_IL_CMD_5:
@@ -846,7 +846,7 @@ static bool rt5663_readable_register(struct device *dev, unsigned int reg)
846 case RT5663_INT_ST_2: 846 case RT5663_INT_ST_2:
847 case RT5663_GPIO_1: 847 case RT5663_GPIO_1:
848 case RT5663_GPIO_2: 848 case RT5663_GPIO_2:
849 case RT5663_GPIO_STA: 849 case RT5663_GPIO_STA1:
850 case RT5663_SIN_GEN_1: 850 case RT5663_SIN_GEN_1:
851 case RT5663_SIN_GEN_2: 851 case RT5663_SIN_GEN_2:
852 case RT5663_SIN_GEN_3: 852 case RT5663_SIN_GEN_3:
@@ -1036,23 +1036,23 @@ static bool rt5663_readable_register(struct device *dev, unsigned int reg)
1036 } 1036 }
1037} 1037}
1038 1038
1039static bool rt5668_volatile_register(struct device *dev, unsigned int reg) 1039static bool rt5663_v2_volatile_register(struct device *dev, unsigned int reg)
1040{ 1040{
1041 switch (reg) { 1041 switch (reg) {
1042 case RT5663_RESET: 1042 case RT5663_RESET:
1043 case RT5668_CBJ_TYPE_2: 1043 case RT5663_CBJ_TYPE_2:
1044 case RT5668_PDM_OUT_CTL: 1044 case RT5663_PDM_OUT_CTL:
1045 case RT5668_PDM_I2C_DATA_CTL1: 1045 case RT5663_PDM_I2C_DATA_CTL1:
1046 case RT5668_PDM_I2C_DATA_CTL4: 1046 case RT5663_PDM_I2C_DATA_CTL4:
1047 case RT5668_ALC_BK_GAIN: 1047 case RT5663_ALC_BK_GAIN:
1048 case RT5663_PLL_2: 1048 case RT5663_PLL_2:
1049 case RT5663_MICBIAS_1: 1049 case RT5663_MICBIAS_1:
1050 case RT5663_ADC_EQ_1: 1050 case RT5663_ADC_EQ_1:
1051 case RT5663_INT_ST_1: 1051 case RT5663_INT_ST_1:
1052 case RT5668_GPIO_STA: 1052 case RT5663_GPIO_STA2:
1053 case RT5663_IL_CMD_1: 1053 case RT5663_IL_CMD_1:
1054 case RT5663_IL_CMD_5: 1054 case RT5663_IL_CMD_5:
1055 case RT5668_A_JD_CTRL: 1055 case RT5663_A_JD_CTRL:
1056 case RT5663_JD_CTRL2: 1056 case RT5663_JD_CTRL2:
1057 case RT5663_VENDOR_ID: 1057 case RT5663_VENDOR_ID:
1058 case RT5663_VENDOR_ID_1: 1058 case RT5663_VENDOR_ID_1:
@@ -1061,15 +1061,15 @@ static bool rt5668_volatile_register(struct device *dev, unsigned int reg)
1061 case RT5663_STO_DRE_5: 1061 case RT5663_STO_DRE_5:
1062 case RT5663_STO_DRE_6: 1062 case RT5663_STO_DRE_6:
1063 case RT5663_STO_DRE_7: 1063 case RT5663_STO_DRE_7:
1064 case RT5668_MONO_DYNA_6: 1064 case RT5663_MONO_DYNA_6:
1065 case RT5668_STO1_SIL_DET: 1065 case RT5663_STO1_SIL_DET:
1066 case RT5668_MONOL_SIL_DET: 1066 case RT5663_MONOL_SIL_DET:
1067 case RT5668_MONOR_SIL_DET: 1067 case RT5663_MONOR_SIL_DET:
1068 case RT5668_STO2_DAC_SIL: 1068 case RT5663_STO2_DAC_SIL:
1069 case RT5668_MONO_AMP_CAL_ST1: 1069 case RT5663_MONO_AMP_CAL_ST1:
1070 case RT5668_MONO_AMP_CAL_ST2: 1070 case RT5663_MONO_AMP_CAL_ST2:
1071 case RT5668_MONO_AMP_CAL_ST3: 1071 case RT5663_MONO_AMP_CAL_ST3:
1072 case RT5668_MONO_AMP_CAL_ST4: 1072 case RT5663_MONO_AMP_CAL_ST4:
1073 case RT5663_HP_IMP_SEN_2: 1073 case RT5663_HP_IMP_SEN_2:
1074 case RT5663_HP_IMP_SEN_3: 1074 case RT5663_HP_IMP_SEN_3:
1075 case RT5663_HP_IMP_SEN_4: 1075 case RT5663_HP_IMP_SEN_4:
@@ -1083,218 +1083,218 @@ static bool rt5668_volatile_register(struct device *dev, unsigned int reg)
1083 case RT5663_HP_CALIB_ST7: 1083 case RT5663_HP_CALIB_ST7:
1084 case RT5663_HP_CALIB_ST8: 1084 case RT5663_HP_CALIB_ST8:
1085 case RT5663_HP_CALIB_ST9: 1085 case RT5663_HP_CALIB_ST9:
1086 case RT5668_HP_CALIB_ST10: 1086 case RT5663_HP_CALIB_ST10:
1087 case RT5668_HP_CALIB_ST11: 1087 case RT5663_HP_CALIB_ST11:
1088 return true; 1088 return true;
1089 default: 1089 default:
1090 return false; 1090 return false;
1091 } 1091 }
1092} 1092}
1093 1093
1094static bool rt5668_readable_register(struct device *dev, unsigned int reg) 1094static bool rt5663_v2_readable_register(struct device *dev, unsigned int reg)
1095{ 1095{
1096 switch (reg) { 1096 switch (reg) {
1097 case RT5668_LOUT_CTRL: 1097 case RT5663_LOUT_CTRL:
1098 case RT5668_HP_AMP_2: 1098 case RT5663_HP_AMP_2:
1099 case RT5668_MONO_OUT: 1099 case RT5663_MONO_OUT:
1100 case RT5668_MONO_GAIN: 1100 case RT5663_MONO_GAIN:
1101 case RT5668_AEC_BST: 1101 case RT5663_AEC_BST:
1102 case RT5668_IN1_IN2: 1102 case RT5663_IN1_IN2:
1103 case RT5668_IN3_IN4: 1103 case RT5663_IN3_IN4:
1104 case RT5668_INL1_INR1: 1104 case RT5663_INL1_INR1:
1105 case RT5668_CBJ_TYPE_2: 1105 case RT5663_CBJ_TYPE_2:
1106 case RT5668_CBJ_TYPE_3: 1106 case RT5663_CBJ_TYPE_3:
1107 case RT5668_CBJ_TYPE_4: 1107 case RT5663_CBJ_TYPE_4:
1108 case RT5668_CBJ_TYPE_5: 1108 case RT5663_CBJ_TYPE_5:
1109 case RT5668_CBJ_TYPE_8: 1109 case RT5663_CBJ_TYPE_8:
1110 case RT5668_DAC3_DIG_VOL: 1110 case RT5663_DAC3_DIG_VOL:
1111 case RT5668_DAC3_CTRL: 1111 case RT5663_DAC3_CTRL:
1112 case RT5668_MONO_ADC_DIG_VOL: 1112 case RT5663_MONO_ADC_DIG_VOL:
1113 case RT5668_STO2_ADC_DIG_VOL: 1113 case RT5663_STO2_ADC_DIG_VOL:
1114 case RT5668_MONO_ADC_BST_GAIN: 1114 case RT5663_MONO_ADC_BST_GAIN:
1115 case RT5668_STO2_ADC_BST_GAIN: 1115 case RT5663_STO2_ADC_BST_GAIN:
1116 case RT5668_SIDETONE_CTRL: 1116 case RT5663_SIDETONE_CTRL:
1117 case RT5668_MONO1_ADC_MIXER: 1117 case RT5663_MONO1_ADC_MIXER:
1118 case RT5668_STO2_ADC_MIXER: 1118 case RT5663_STO2_ADC_MIXER:
1119 case RT5668_MONO_DAC_MIXER: 1119 case RT5663_MONO_DAC_MIXER:
1120 case RT5668_DAC2_SRC_CTRL: 1120 case RT5663_DAC2_SRC_CTRL:
1121 case RT5668_IF_3_4_DATA_CTL: 1121 case RT5663_IF_3_4_DATA_CTL:
1122 case RT5668_IF_5_DATA_CTL: 1122 case RT5663_IF_5_DATA_CTL:
1123 case RT5668_PDM_OUT_CTL: 1123 case RT5663_PDM_OUT_CTL:
1124 case RT5668_PDM_I2C_DATA_CTL1: 1124 case RT5663_PDM_I2C_DATA_CTL1:
1125 case RT5668_PDM_I2C_DATA_CTL2: 1125 case RT5663_PDM_I2C_DATA_CTL2:
1126 case RT5668_PDM_I2C_DATA_CTL3: 1126 case RT5663_PDM_I2C_DATA_CTL3:
1127 case RT5668_PDM_I2C_DATA_CTL4: 1127 case RT5663_PDM_I2C_DATA_CTL4:
1128 case RT5668_RECMIX1_NEW: 1128 case RT5663_RECMIX1_NEW:
1129 case RT5668_RECMIX1L_0: 1129 case RT5663_RECMIX1L_0:
1130 case RT5668_RECMIX1L: 1130 case RT5663_RECMIX1L:
1131 case RT5668_RECMIX1R_0: 1131 case RT5663_RECMIX1R_0:
1132 case RT5668_RECMIX1R: 1132 case RT5663_RECMIX1R:
1133 case RT5668_RECMIX2_NEW: 1133 case RT5663_RECMIX2_NEW:
1134 case RT5668_RECMIX2_L_2: 1134 case RT5663_RECMIX2_L_2:
1135 case RT5668_RECMIX2_R: 1135 case RT5663_RECMIX2_R:
1136 case RT5668_RECMIX2_R_2: 1136 case RT5663_RECMIX2_R_2:
1137 case RT5668_CALIB_REC_LR: 1137 case RT5663_CALIB_REC_LR:
1138 case RT5668_ALC_BK_GAIN: 1138 case RT5663_ALC_BK_GAIN:
1139 case RT5668_MONOMIX_GAIN: 1139 case RT5663_MONOMIX_GAIN:
1140 case RT5668_MONOMIX_IN_GAIN: 1140 case RT5663_MONOMIX_IN_GAIN:
1141 case RT5668_OUT_MIXL_GAIN: 1141 case RT5663_OUT_MIXL_GAIN:
1142 case RT5668_OUT_LMIX_IN_GAIN: 1142 case RT5663_OUT_LMIX_IN_GAIN:
1143 case RT5668_OUT_RMIX_IN_GAIN: 1143 case RT5663_OUT_RMIX_IN_GAIN:
1144 case RT5668_OUT_RMIX_IN_GAIN1: 1144 case RT5663_OUT_RMIX_IN_GAIN1:
1145 case RT5668_LOUT_MIXER_CTRL: 1145 case RT5663_LOUT_MIXER_CTRL:
1146 case RT5668_PWR_VOL: 1146 case RT5663_PWR_VOL:
1147 case RT5668_ADCDAC_RST: 1147 case RT5663_ADCDAC_RST:
1148 case RT5668_I2S34_SDP: 1148 case RT5663_I2S34_SDP:
1149 case RT5668_I2S5_SDP: 1149 case RT5663_I2S5_SDP:
1150 case RT5668_TDM_5: 1150 case RT5663_TDM_6:
1151 case RT5668_TDM_6: 1151 case RT5663_TDM_7:
1152 case RT5668_TDM_7: 1152 case RT5663_TDM_8:
1153 case RT5668_TDM_8: 1153 case RT5663_TDM_9:
1154 case RT5668_ASRC_3: 1154 case RT5663_ASRC_3:
1155 case RT5668_ASRC_6: 1155 case RT5663_ASRC_6:
1156 case RT5668_ASRC_7: 1156 case RT5663_ASRC_7:
1157 case RT5668_PLL_TRK_13: 1157 case RT5663_PLL_TRK_13:
1158 case RT5668_I2S_M_CLK_CTL: 1158 case RT5663_I2S_M_CLK_CTL:
1159 case RT5668_FDIV_I2S34_M_CLK: 1159 case RT5663_FDIV_I2S34_M_CLK:
1160 case RT5668_FDIV_I2S34_M_CLK2: 1160 case RT5663_FDIV_I2S34_M_CLK2:
1161 case RT5668_FDIV_I2S5_M_CLK: 1161 case RT5663_FDIV_I2S5_M_CLK:
1162 case RT5668_FDIV_I2S5_M_CLK2: 1162 case RT5663_FDIV_I2S5_M_CLK2:
1163 case RT5668_IRQ_4: 1163 case RT5663_V2_IRQ_4:
1164 case RT5668_GPIO_3: 1164 case RT5663_GPIO_3:
1165 case RT5668_GPIO_4: 1165 case RT5663_GPIO_4:
1166 case RT5668_GPIO_STA: 1166 case RT5663_GPIO_STA2:
1167 case RT5668_HP_AMP_DET1: 1167 case RT5663_HP_AMP_DET1:
1168 case RT5668_HP_AMP_DET2: 1168 case RT5663_HP_AMP_DET2:
1169 case RT5668_HP_AMP_DET3: 1169 case RT5663_HP_AMP_DET3:
1170 case RT5668_MID_BD_HP_AMP: 1170 case RT5663_MID_BD_HP_AMP:
1171 case RT5668_LOW_BD_HP_AMP: 1171 case RT5663_LOW_BD_HP_AMP:
1172 case RT5668_SOF_VOL_ZC2: 1172 case RT5663_SOF_VOL_ZC2:
1173 case RT5668_ADC_STO2_ADJ1: 1173 case RT5663_ADC_STO2_ADJ1:
1174 case RT5668_ADC_STO2_ADJ2: 1174 case RT5663_ADC_STO2_ADJ2:
1175 case RT5668_A_JD_CTRL: 1175 case RT5663_A_JD_CTRL:
1176 case RT5668_JD1_TRES_CTRL: 1176 case RT5663_JD1_TRES_CTRL:
1177 case RT5668_JD2_TRES_CTRL: 1177 case RT5663_JD2_TRES_CTRL:
1178 case RT5668_JD_CTRL2: 1178 case RT5663_V2_JD_CTRL2:
1179 case RT5668_DUM_REG_2: 1179 case RT5663_DUM_REG_2:
1180 case RT5668_DUM_REG_3: 1180 case RT5663_DUM_REG_3:
1181 case RT5663_VENDOR_ID: 1181 case RT5663_VENDOR_ID:
1182 case RT5663_VENDOR_ID_1: 1182 case RT5663_VENDOR_ID_1:
1183 case RT5663_VENDOR_ID_2: 1183 case RT5663_VENDOR_ID_2:
1184 case RT5668_DACADC_DIG_VOL2: 1184 case RT5663_DACADC_DIG_VOL2:
1185 case RT5668_DIG_IN_PIN2: 1185 case RT5663_DIG_IN_PIN2:
1186 case RT5668_PAD_DRV_CTL1: 1186 case RT5663_PAD_DRV_CTL1:
1187 case RT5668_SOF_RAM_DEPOP: 1187 case RT5663_SOF_RAM_DEPOP:
1188 case RT5668_VOL_TEST: 1188 case RT5663_VOL_TEST:
1189 case RT5668_TEST_MODE_3: 1189 case RT5663_TEST_MODE_4:
1190 case RT5668_TEST_MODE_4: 1190 case RT5663_TEST_MODE_5:
1191 case RT5663_STO_DRE_9: 1191 case RT5663_STO_DRE_9:
1192 case RT5668_MONO_DYNA_1: 1192 case RT5663_MONO_DYNA_1:
1193 case RT5668_MONO_DYNA_2: 1193 case RT5663_MONO_DYNA_2:
1194 case RT5668_MONO_DYNA_3: 1194 case RT5663_MONO_DYNA_3:
1195 case RT5668_MONO_DYNA_4: 1195 case RT5663_MONO_DYNA_4:
1196 case RT5668_MONO_DYNA_5: 1196 case RT5663_MONO_DYNA_5:
1197 case RT5668_MONO_DYNA_6: 1197 case RT5663_MONO_DYNA_6:
1198 case RT5668_STO1_SIL_DET: 1198 case RT5663_STO1_SIL_DET:
1199 case RT5668_MONOL_SIL_DET: 1199 case RT5663_MONOL_SIL_DET:
1200 case RT5668_MONOR_SIL_DET: 1200 case RT5663_MONOR_SIL_DET:
1201 case RT5668_STO2_DAC_SIL: 1201 case RT5663_STO2_DAC_SIL:
1202 case RT5668_PWR_SAV_CTL1: 1202 case RT5663_PWR_SAV_CTL1:
1203 case RT5668_PWR_SAV_CTL2: 1203 case RT5663_PWR_SAV_CTL2:
1204 case RT5668_PWR_SAV_CTL3: 1204 case RT5663_PWR_SAV_CTL3:
1205 case RT5668_PWR_SAV_CTL4: 1205 case RT5663_PWR_SAV_CTL4:
1206 case RT5668_PWR_SAV_CTL5: 1206 case RT5663_PWR_SAV_CTL5:
1207 case RT5668_PWR_SAV_CTL6: 1207 case RT5663_PWR_SAV_CTL6:
1208 case RT5668_MONO_AMP_CAL1: 1208 case RT5663_MONO_AMP_CAL1:
1209 case RT5668_MONO_AMP_CAL2: 1209 case RT5663_MONO_AMP_CAL2:
1210 case RT5668_MONO_AMP_CAL3: 1210 case RT5663_MONO_AMP_CAL3:
1211 case RT5668_MONO_AMP_CAL4: 1211 case RT5663_MONO_AMP_CAL4:
1212 case RT5668_MONO_AMP_CAL5: 1212 case RT5663_MONO_AMP_CAL5:
1213 case RT5668_MONO_AMP_CAL6: 1213 case RT5663_MONO_AMP_CAL6:
1214 case RT5668_MONO_AMP_CAL7: 1214 case RT5663_MONO_AMP_CAL7:
1215 case RT5668_MONO_AMP_CAL_ST1: 1215 case RT5663_MONO_AMP_CAL_ST1:
1216 case RT5668_MONO_AMP_CAL_ST2: 1216 case RT5663_MONO_AMP_CAL_ST2:
1217 case RT5668_MONO_AMP_CAL_ST3: 1217 case RT5663_MONO_AMP_CAL_ST3:
1218 case RT5668_MONO_AMP_CAL_ST4: 1218 case RT5663_MONO_AMP_CAL_ST4:
1219 case RT5668_MONO_AMP_CAL_ST5: 1219 case RT5663_MONO_AMP_CAL_ST5:
1220 case RT5668_HP_IMP_SEN_13: 1220 case RT5663_V2_HP_IMP_SEN_13:
1221 case RT5668_HP_IMP_SEN_14: 1221 case RT5663_V2_HP_IMP_SEN_14:
1222 case RT5668_HP_IMP_SEN_6: 1222 case RT5663_V2_HP_IMP_SEN_6:
1223 case RT5668_HP_IMP_SEN_7: 1223 case RT5663_V2_HP_IMP_SEN_7:
1224 case RT5668_HP_IMP_SEN_8: 1224 case RT5663_V2_HP_IMP_SEN_8:
1225 case RT5668_HP_IMP_SEN_9: 1225 case RT5663_V2_HP_IMP_SEN_9:
1226 case RT5668_HP_IMP_SEN_10: 1226 case RT5663_V2_HP_IMP_SEN_10:
1227 case RT5668_HP_LOGIC_3: 1227 case RT5663_HP_LOGIC_3:
1228 case RT5668_HP_CALIB_ST10: 1228 case RT5663_HP_CALIB_ST10:
1229 case RT5668_HP_CALIB_ST11: 1229 case RT5663_HP_CALIB_ST11:
1230 case RT5668_PRO_REG_TBL_4: 1230 case RT5663_PRO_REG_TBL_4:
1231 case RT5668_PRO_REG_TBL_5: 1231 case RT5663_PRO_REG_TBL_5:
1232 case RT5668_PRO_REG_TBL_6: 1232 case RT5663_PRO_REG_TBL_6:
1233 case RT5668_PRO_REG_TBL_7: 1233 case RT5663_PRO_REG_TBL_7:
1234 case RT5668_PRO_REG_TBL_8: 1234 case RT5663_PRO_REG_TBL_8:
1235 case RT5668_PRO_REG_TBL_9: 1235 case RT5663_PRO_REG_TBL_9:
1236 case RT5668_SAR_ADC_INL_1: 1236 case RT5663_SAR_ADC_INL_1:
1237 case RT5668_SAR_ADC_INL_2: 1237 case RT5663_SAR_ADC_INL_2:
1238 case RT5668_SAR_ADC_INL_3: 1238 case RT5663_SAR_ADC_INL_3:
1239 case RT5668_SAR_ADC_INL_4: 1239 case RT5663_SAR_ADC_INL_4:
1240 case RT5668_SAR_ADC_INL_5: 1240 case RT5663_SAR_ADC_INL_5:
1241 case RT5668_SAR_ADC_INL_6: 1241 case RT5663_SAR_ADC_INL_6:
1242 case RT5668_SAR_ADC_INL_7: 1242 case RT5663_SAR_ADC_INL_7:
1243 case RT5668_SAR_ADC_INL_8: 1243 case RT5663_SAR_ADC_INL_8:
1244 case RT5668_SAR_ADC_INL_9: 1244 case RT5663_SAR_ADC_INL_9:
1245 case RT5668_SAR_ADC_INL_10: 1245 case RT5663_SAR_ADC_INL_10:
1246 case RT5668_SAR_ADC_INL_11: 1246 case RT5663_SAR_ADC_INL_11:
1247 case RT5668_SAR_ADC_INL_12: 1247 case RT5663_SAR_ADC_INL_12:
1248 case RT5668_DRC_CTRL_1: 1248 case RT5663_DRC_CTRL_1:
1249 case RT5668_DRC1_CTRL_2: 1249 case RT5663_DRC1_CTRL_2:
1250 case RT5668_DRC1_CTRL_3: 1250 case RT5663_DRC1_CTRL_3:
1251 case RT5668_DRC1_CTRL_4: 1251 case RT5663_DRC1_CTRL_4:
1252 case RT5668_DRC1_CTRL_5: 1252 case RT5663_DRC1_CTRL_5:
1253 case RT5668_DRC1_CTRL_6: 1253 case RT5663_DRC1_CTRL_6:
1254 case RT5668_DRC1_HD_CTRL_1: 1254 case RT5663_DRC1_HD_CTRL_1:
1255 case RT5668_DRC1_HD_CTRL_2: 1255 case RT5663_DRC1_HD_CTRL_2:
1256 case RT5668_DRC1_PRI_REG_1: 1256 case RT5663_DRC1_PRI_REG_1:
1257 case RT5668_DRC1_PRI_REG_2: 1257 case RT5663_DRC1_PRI_REG_2:
1258 case RT5668_DRC1_PRI_REG_3: 1258 case RT5663_DRC1_PRI_REG_3:
1259 case RT5668_DRC1_PRI_REG_4: 1259 case RT5663_DRC1_PRI_REG_4:
1260 case RT5668_DRC1_PRI_REG_5: 1260 case RT5663_DRC1_PRI_REG_5:
1261 case RT5668_DRC1_PRI_REG_6: 1261 case RT5663_DRC1_PRI_REG_6:
1262 case RT5668_DRC1_PRI_REG_7: 1262 case RT5663_DRC1_PRI_REG_7:
1263 case RT5668_DRC1_PRI_REG_8: 1263 case RT5663_DRC1_PRI_REG_8:
1264 case RT5668_ALC_PGA_CTL_1: 1264 case RT5663_ALC_PGA_CTL_1:
1265 case RT5668_ALC_PGA_CTL_2: 1265 case RT5663_ALC_PGA_CTL_2:
1266 case RT5668_ALC_PGA_CTL_3: 1266 case RT5663_ALC_PGA_CTL_3:
1267 case RT5668_ALC_PGA_CTL_4: 1267 case RT5663_ALC_PGA_CTL_4:
1268 case RT5668_ALC_PGA_CTL_5: 1268 case RT5663_ALC_PGA_CTL_5:
1269 case RT5668_ALC_PGA_CTL_6: 1269 case RT5663_ALC_PGA_CTL_6:
1270 case RT5668_ALC_PGA_CTL_7: 1270 case RT5663_ALC_PGA_CTL_7:
1271 case RT5668_ALC_PGA_CTL_8: 1271 case RT5663_ALC_PGA_CTL_8:
1272 case RT5668_ALC_PGA_REG_1: 1272 case RT5663_ALC_PGA_REG_1:
1273 case RT5668_ALC_PGA_REG_2: 1273 case RT5663_ALC_PGA_REG_2:
1274 case RT5668_ALC_PGA_REG_3: 1274 case RT5663_ALC_PGA_REG_3:
1275 case RT5668_ADC_EQ_RECOV_1: 1275 case RT5663_ADC_EQ_RECOV_1:
1276 case RT5668_ADC_EQ_RECOV_2: 1276 case RT5663_ADC_EQ_RECOV_2:
1277 case RT5668_ADC_EQ_RECOV_3: 1277 case RT5663_ADC_EQ_RECOV_3:
1278 case RT5668_ADC_EQ_RECOV_4: 1278 case RT5663_ADC_EQ_RECOV_4:
1279 case RT5668_ADC_EQ_RECOV_5: 1279 case RT5663_ADC_EQ_RECOV_5:
1280 case RT5668_ADC_EQ_RECOV_6: 1280 case RT5663_ADC_EQ_RECOV_6:
1281 case RT5668_ADC_EQ_RECOV_7: 1281 case RT5663_ADC_EQ_RECOV_7:
1282 case RT5668_ADC_EQ_RECOV_8: 1282 case RT5663_ADC_EQ_RECOV_8:
1283 case RT5668_ADC_EQ_RECOV_9: 1283 case RT5663_ADC_EQ_RECOV_9:
1284 case RT5668_ADC_EQ_RECOV_10: 1284 case RT5663_ADC_EQ_RECOV_10:
1285 case RT5668_ADC_EQ_RECOV_11: 1285 case RT5663_ADC_EQ_RECOV_11:
1286 case RT5668_ADC_EQ_RECOV_12: 1286 case RT5663_ADC_EQ_RECOV_12:
1287 case RT5668_ADC_EQ_RECOV_13: 1287 case RT5663_ADC_EQ_RECOV_13:
1288 case RT5668_VID_HIDDEN: 1288 case RT5663_VID_HIDDEN:
1289 case RT5668_VID_CUSTOMER: 1289 case RT5663_VID_CUSTOMER:
1290 case RT5668_SCAN_MODE: 1290 case RT5663_SCAN_MODE:
1291 case RT5668_I2C_BYPA: 1291 case RT5663_I2C_BYPA:
1292 return true; 1292 return true;
1293 case RT5663_TDM_1: 1293 case RT5663_TDM_1:
1294 case RT5663_DEPOP_3: 1294 case RT5663_DEPOP_3:
1295 case RT5663_ASRC_11_2: 1295 case RT5663_ASRC_11_2:
1296 case RT5663_INT_ST_2: 1296 case RT5663_INT_ST_2:
1297 case RT5663_GPIO_STA: 1297 case RT5663_GPIO_STA1:
1298 case RT5663_SIN_GEN_1: 1298 case RT5663_SIN_GEN_1:
1299 case RT5663_SIN_GEN_2: 1299 case RT5663_SIN_GEN_2:
1300 case RT5663_SIN_GEN_3: 1300 case RT5663_SIN_GEN_3:
@@ -1344,7 +1344,7 @@ static bool rt5668_readable_register(struct device *dev, unsigned int reg)
1344} 1344}
1345 1345
1346static const DECLARE_TLV_DB_SCALE(rt5663_hp_vol_tlv, -2400, 150, 0); 1346static const DECLARE_TLV_DB_SCALE(rt5663_hp_vol_tlv, -2400, 150, 0);
1347static const DECLARE_TLV_DB_SCALE(rt5668_hp_vol_tlv, -2250, 150, 0); 1347static const DECLARE_TLV_DB_SCALE(rt5663_v2_hp_vol_tlv, -2250, 150, 0);
1348static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0); 1348static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6525, 75, 0);
1349static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0); 1349static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -1725, 75, 0);
1350 1350
@@ -1374,57 +1374,57 @@ static void rt5663_enable_push_button_irq(struct snd_soc_codec *codec,
1374 1374
1375 if (enable) { 1375 if (enable) {
1376 snd_soc_update_bits(codec, RT5663_IL_CMD_6, 1376 snd_soc_update_bits(codec, RT5663_IL_CMD_6,
1377 RT5668_EN_4BTN_INL_MASK, RT5668_EN_4BTN_INL_EN); 1377 RT5663_EN_4BTN_INL_MASK, RT5663_EN_4BTN_INL_EN);
1378 /* reset in-line command */ 1378 /* reset in-line command */
1379 snd_soc_update_bits(codec, RT5663_IL_CMD_6, 1379 snd_soc_update_bits(codec, RT5663_IL_CMD_6,
1380 RT5668_RESET_4BTN_INL_MASK, 1380 RT5663_RESET_4BTN_INL_MASK,
1381 RT5668_RESET_4BTN_INL_RESET); 1381 RT5663_RESET_4BTN_INL_RESET);
1382 snd_soc_update_bits(codec, RT5663_IL_CMD_6, 1382 snd_soc_update_bits(codec, RT5663_IL_CMD_6,
1383 RT5668_RESET_4BTN_INL_MASK, 1383 RT5663_RESET_4BTN_INL_MASK,
1384 RT5668_RESET_4BTN_INL_NOR); 1384 RT5663_RESET_4BTN_INL_NOR);
1385 switch (rt5663->codec_type) { 1385 switch (rt5663->codec_ver) {
1386 case CODEC_TYPE_RT5668: 1386 case CODEC_VER_1:
1387 snd_soc_update_bits(codec, RT5663_IRQ_3, 1387 snd_soc_update_bits(codec, RT5663_IRQ_3,
1388 RT5668_EN_IRQ_INLINE_MASK, 1388 RT5663_V2_EN_IRQ_INLINE_MASK,
1389 RT5668_EN_IRQ_INLINE_NOR); 1389 RT5663_V2_EN_IRQ_INLINE_NOR);
1390 break; 1390 break;
1391 case CODEC_TYPE_RT5663: 1391 case CODEC_VER_0:
1392 snd_soc_update_bits(codec, RT5663_IRQ_2, 1392 snd_soc_update_bits(codec, RT5663_IRQ_2,
1393 RT5663_EN_IRQ_INLINE_MASK, 1393 RT5663_EN_IRQ_INLINE_MASK,
1394 RT5663_EN_IRQ_INLINE_NOR); 1394 RT5663_EN_IRQ_INLINE_NOR);
1395 break; 1395 break;
1396 default: 1396 default:
1397 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1397 dev_err(codec->dev, "Unknown CODEC Version\n");
1398 } 1398 }
1399 } else { 1399 } else {
1400 switch (rt5663->codec_type) { 1400 switch (rt5663->codec_ver) {
1401 case CODEC_TYPE_RT5668: 1401 case CODEC_VER_1:
1402 snd_soc_update_bits(codec, RT5663_IRQ_3, 1402 snd_soc_update_bits(codec, RT5663_IRQ_3,
1403 RT5668_EN_IRQ_INLINE_MASK, 1403 RT5663_V2_EN_IRQ_INLINE_MASK,
1404 RT5668_EN_IRQ_INLINE_BYP); 1404 RT5663_V2_EN_IRQ_INLINE_BYP);
1405 break; 1405 break;
1406 case CODEC_TYPE_RT5663: 1406 case CODEC_VER_0:
1407 snd_soc_update_bits(codec, RT5663_IRQ_2, 1407 snd_soc_update_bits(codec, RT5663_IRQ_2,
1408 RT5663_EN_IRQ_INLINE_MASK, 1408 RT5663_EN_IRQ_INLINE_MASK,
1409 RT5663_EN_IRQ_INLINE_BYP); 1409 RT5663_EN_IRQ_INLINE_BYP);
1410 break; 1410 break;
1411 default: 1411 default:
1412 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1412 dev_err(codec->dev, "Unknown CODEC Version\n");
1413 } 1413 }
1414 snd_soc_update_bits(codec, RT5663_IL_CMD_6, 1414 snd_soc_update_bits(codec, RT5663_IL_CMD_6,
1415 RT5668_EN_4BTN_INL_MASK, RT5668_EN_4BTN_INL_DIS); 1415 RT5663_EN_4BTN_INL_MASK, RT5663_EN_4BTN_INL_DIS);
1416 /* reset in-line command */ 1416 /* reset in-line command */
1417 snd_soc_update_bits(codec, RT5663_IL_CMD_6, 1417 snd_soc_update_bits(codec, RT5663_IL_CMD_6,
1418 RT5668_RESET_4BTN_INL_MASK, 1418 RT5663_RESET_4BTN_INL_MASK,
1419 RT5668_RESET_4BTN_INL_RESET); 1419 RT5663_RESET_4BTN_INL_RESET);
1420 snd_soc_update_bits(codec, RT5663_IL_CMD_6, 1420 snd_soc_update_bits(codec, RT5663_IL_CMD_6,
1421 RT5668_RESET_4BTN_INL_MASK, 1421 RT5663_RESET_4BTN_INL_MASK,
1422 RT5668_RESET_4BTN_INL_NOR); 1422 RT5663_RESET_4BTN_INL_NOR);
1423 } 1423 }
1424} 1424}
1425 1425
1426/** 1426/**
1427 * rt5668_jack_detect - Detect headset. 1427 * rt5663_v2_jack_detect - Detect headset.
1428 * @codec: SoC audio codec device. 1428 * @codec: SoC audio codec device.
1429 * @jack_insert: Jack insert or not. 1429 * @jack_insert: Jack insert or not.
1430 * 1430 *
@@ -1433,16 +1433,16 @@ static void rt5663_enable_push_button_irq(struct snd_soc_codec *codec,
1433 * Returns detect status. 1433 * Returns detect status.
1434 */ 1434 */
1435 1435
1436static int rt5668_jack_detect(struct snd_soc_codec *codec, int jack_insert) 1436static int rt5663_v2_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1437{ 1437{
1438 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 1438 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1439 struct rt5663_priv *rt5668 = snd_soc_codec_get_drvdata(codec); 1439 struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec);
1440 int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30}; 1440 int val, i = 0, sleep_time[5] = {300, 150, 100, 50, 30};
1441 1441
1442 dev_dbg(codec->dev, "%s jack_insert:%d\n", __func__, jack_insert); 1442 dev_dbg(codec->dev, "%s jack_insert:%d\n", __func__, jack_insert);
1443 if (jack_insert) { 1443 if (jack_insert) {
1444 snd_soc_write(codec, RT5668_CBJ_TYPE_2, 0x8040); 1444 snd_soc_write(codec, RT5663_CBJ_TYPE_2, 0x8040);
1445 snd_soc_write(codec, RT5668_CBJ_TYPE_3, 0x1484); 1445 snd_soc_write(codec, RT5663_CBJ_TYPE_3, 0x1484);
1446 1446
1447 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1"); 1447 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
1448 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS2"); 1448 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS2");
@@ -1450,12 +1450,12 @@ static int rt5668_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1450 snd_soc_dapm_force_enable_pin(dapm, "CBJ Power"); 1450 snd_soc_dapm_force_enable_pin(dapm, "CBJ Power");
1451 snd_soc_dapm_sync(dapm); 1451 snd_soc_dapm_sync(dapm);
1452 snd_soc_update_bits(codec, RT5663_RC_CLK, 1452 snd_soc_update_bits(codec, RT5663_RC_CLK,
1453 RT5668_DIG_1M_CLK_MASK, RT5668_DIG_1M_CLK_EN); 1453 RT5663_DIG_1M_CLK_MASK, RT5663_DIG_1M_CLK_EN);
1454 snd_soc_update_bits(codec, RT5663_RECMIX, 0x8, 0x8); 1454 snd_soc_update_bits(codec, RT5663_RECMIX, 0x8, 0x8);
1455 1455
1456 while (i < 5) { 1456 while (i < 5) {
1457 msleep(sleep_time[i]); 1457 msleep(sleep_time[i]);
1458 val = snd_soc_read(codec, RT5668_CBJ_TYPE_2) & 0x0003; 1458 val = snd_soc_read(codec, RT5663_CBJ_TYPE_2) & 0x0003;
1459 if (val == 0x1 || val == 0x2 || val == 0x3) 1459 if (val == 0x1 || val == 0x2 || val == 0x3)
1460 break; 1460 break;
1461 dev_dbg(codec->dev, "%s: MX-0011 val=%x sleep %d\n", 1461 dev_dbg(codec->dev, "%s: MX-0011 val=%x sleep %d\n",
@@ -1466,7 +1466,7 @@ static int rt5668_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1466 switch (val) { 1466 switch (val) {
1467 case 1: 1467 case 1:
1468 case 2: 1468 case 2:
1469 rt5668->jack_type = SND_JACK_HEADSET; 1469 rt5663->jack_type = SND_JACK_HEADSET;
1470 rt5663_enable_push_button_irq(codec, true); 1470 rt5663_enable_push_button_irq(codec, true);
1471 break; 1471 break;
1472 default: 1472 default:
@@ -1475,13 +1475,13 @@ static int rt5668_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1475 snd_soc_dapm_disable_pin(dapm, "Mic Det Power"); 1475 snd_soc_dapm_disable_pin(dapm, "Mic Det Power");
1476 snd_soc_dapm_disable_pin(dapm, "CBJ Power"); 1476 snd_soc_dapm_disable_pin(dapm, "CBJ Power");
1477 snd_soc_dapm_sync(dapm); 1477 snd_soc_dapm_sync(dapm);
1478 rt5668->jack_type = SND_JACK_HEADPHONE; 1478 rt5663->jack_type = SND_JACK_HEADPHONE;
1479 break; 1479 break;
1480 } 1480 }
1481 } else { 1481 } else {
1482 snd_soc_update_bits(codec, RT5663_RECMIX, 0x8, 0x0); 1482 snd_soc_update_bits(codec, RT5663_RECMIX, 0x8, 0x0);
1483 1483
1484 if (rt5668->jack_type == SND_JACK_HEADSET) { 1484 if (rt5663->jack_type == SND_JACK_HEADSET) {
1485 rt5663_enable_push_button_irq(codec, false); 1485 rt5663_enable_push_button_irq(codec, false);
1486 snd_soc_dapm_disable_pin(dapm, "MICBIAS1"); 1486 snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
1487 snd_soc_dapm_disable_pin(dapm, "MICBIAS2"); 1487 snd_soc_dapm_disable_pin(dapm, "MICBIAS2");
@@ -1489,11 +1489,11 @@ static int rt5668_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1489 snd_soc_dapm_disable_pin(dapm, "CBJ Power"); 1489 snd_soc_dapm_disable_pin(dapm, "CBJ Power");
1490 snd_soc_dapm_sync(dapm); 1490 snd_soc_dapm_sync(dapm);
1491 } 1491 }
1492 rt5668->jack_type = 0; 1492 rt5663->jack_type = 0;
1493 } 1493 }
1494 1494
1495 dev_dbg(codec->dev, "jack_type = %d\n", rt5668->jack_type); 1495 dev_dbg(codec->dev, "jack_type = %d\n", rt5663->jack_type);
1496 return rt5668->jack_type; 1496 return rt5663->jack_type;
1497} 1497}
1498 1498
1499/** 1499/**
@@ -1514,11 +1514,11 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1514 1514
1515 if (jack_insert) { 1515 if (jack_insert) {
1516 snd_soc_update_bits(codec, RT5663_DIG_MISC, 1516 snd_soc_update_bits(codec, RT5663_DIG_MISC,
1517 RT5668_DIG_GATE_CTRL_MASK, RT5668_DIG_GATE_CTRL_EN); 1517 RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_EN);
1518 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, 1518 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1,
1519 RT5663_SI_HP_MASK | RT5668_OSW_HP_L_MASK | 1519 RT5663_SI_HP_MASK | RT5663_OSW_HP_L_MASK |
1520 RT5668_OSW_HP_R_MASK, RT5663_SI_HP_EN | 1520 RT5663_OSW_HP_R_MASK, RT5663_SI_HP_EN |
1521 RT5668_OSW_HP_L_DIS | RT5668_OSW_HP_R_DIS); 1521 RT5663_OSW_HP_L_DIS | RT5663_OSW_HP_R_DIS);
1522 snd_soc_update_bits(codec, RT5663_DUMMY_1, 1522 snd_soc_update_bits(codec, RT5663_DUMMY_1,
1523 RT5663_EMB_CLK_MASK | RT5663_HPA_CPL_BIAS_MASK | 1523 RT5663_EMB_CLK_MASK | RT5663_HPA_CPL_BIAS_MASK |
1524 RT5663_HPA_CPR_BIAS_MASK, RT5663_EMB_CLK_EN | 1524 RT5663_HPA_CPR_BIAS_MASK, RT5663_EMB_CLK_EN |
@@ -1530,17 +1530,17 @@ static int rt5663_jack_detect(struct snd_soc_codec *codec, int jack_insert)
1530 RT5663_PWR_MIC_DET_MASK, RT5663_PWR_MIC_DET_ON); 1530 RT5663_PWR_MIC_DET_MASK, RT5663_PWR_MIC_DET_ON);
1531 /* BST1 power on for JD */ 1531 /* BST1 power on for JD */
1532 snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, 1532 snd_soc_update_bits(codec, RT5663_PWR_ANLG_2,
1533 RT5668_PWR_BST1_MASK, RT5668_PWR_BST1_ON); 1533 RT5663_PWR_BST1_MASK, RT5663_PWR_BST1_ON);
1534 snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1, 1534 snd_soc_update_bits(codec, RT5663_EM_JACK_TYPE_1,
1535 RT5663_CBJ_DET_MASK | RT5663_EXT_JD_MASK | 1535 RT5663_CBJ_DET_MASK | RT5663_EXT_JD_MASK |
1536 RT5663_POL_EXT_JD_MASK, RT5663_CBJ_DET_EN | 1536 RT5663_POL_EXT_JD_MASK, RT5663_CBJ_DET_EN |
1537 RT5663_EXT_JD_EN | RT5663_POL_EXT_JD_EN); 1537 RT5663_EXT_JD_EN | RT5663_POL_EXT_JD_EN);
1538 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, 1538 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1,
1539 RT5668_PWR_MB_MASK | RT5668_LDO1_DVO_MASK | 1539 RT5663_PWR_MB_MASK | RT5663_LDO1_DVO_MASK |
1540 RT5668_AMP_HP_MASK, RT5668_PWR_MB | 1540 RT5663_AMP_HP_MASK, RT5663_PWR_MB |
1541 RT5668_LDO1_DVO_0_9V | RT5668_AMP_HP_3X); 1541 RT5663_LDO1_DVO_0_9V | RT5663_AMP_HP_3X);
1542 snd_soc_update_bits(codec, RT5663_AUTO_1MRC_CLK, 1542 snd_soc_update_bits(codec, RT5663_AUTO_1MRC_CLK,
1543 RT5668_IRQ_POW_SAV_MASK, RT5668_IRQ_POW_SAV_EN); 1543 RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN);
1544 snd_soc_update_bits(codec, RT5663_IRQ_1, 1544 snd_soc_update_bits(codec, RT5663_IRQ_1,
1545 RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN); 1545 RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN);
1546 while (i < 5) { 1546 while (i < 5) {
@@ -1619,13 +1619,13 @@ static bool rt5663_check_jd_status(struct snd_soc_codec *codec)
1619 dev_dbg(codec->dev, "%s val=%x\n", __func__, val); 1619 dev_dbg(codec->dev, "%s val=%x\n", __func__, val);
1620 1620
1621 /* JD1 */ 1621 /* JD1 */
1622 switch (rt5663->codec_type) { 1622 switch (rt5663->codec_ver) {
1623 case CODEC_TYPE_RT5668: 1623 case CODEC_VER_1:
1624 return !(val & 0x2000); 1624 return !(val & 0x2000);
1625 case CODEC_TYPE_RT5663: 1625 case CODEC_VER_0:
1626 return !(val & 0x1000); 1626 return !(val & 0x1000);
1627 default: 1627 default:
1628 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1628 dev_err(codec->dev, "Unknown CODEC Version\n");
1629 } 1629 }
1630 1630
1631 return false; 1631 return false;
@@ -1645,15 +1645,16 @@ static void rt5663_jack_detect_work(struct work_struct *work)
1645 /* jack in */ 1645 /* jack in */
1646 if (rt5663->jack_type == 0) { 1646 if (rt5663->jack_type == 0) {
1647 /* jack was out, report jack type */ 1647 /* jack was out, report jack type */
1648 switch (rt5663->codec_type) { 1648 switch (rt5663->codec_ver) {
1649 case CODEC_TYPE_RT5668: 1649 case CODEC_VER_1:
1650 report = rt5668_jack_detect(rt5663->codec, 1); 1650 report = rt5663_v2_jack_detect(
1651 rt5663->codec, 1);
1651 break; 1652 break;
1652 case CODEC_TYPE_RT5663: 1653 case CODEC_VER_0:
1653 report = rt5663_jack_detect(rt5663->codec, 1); 1654 report = rt5663_jack_detect(rt5663->codec, 1);
1654 break; 1655 break;
1655 default: 1656 default:
1656 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1657 dev_err(codec->dev, "Unknown CODEC Version\n");
1657 } 1658 }
1658 } else { 1659 } else {
1659 /* jack is already in, report button event */ 1660 /* jack is already in, report button event */
@@ -1702,15 +1703,15 @@ static void rt5663_jack_detect_work(struct work_struct *work)
1702 } 1703 }
1703 } else { 1704 } else {
1704 /* jack out */ 1705 /* jack out */
1705 switch (rt5663->codec_type) { 1706 switch (rt5663->codec_ver) {
1706 case CODEC_TYPE_RT5668: 1707 case CODEC_VER_1:
1707 report = rt5668_jack_detect(rt5663->codec, 0); 1708 report = rt5663_v2_jack_detect(rt5663->codec, 0);
1708 break; 1709 break;
1709 case CODEC_TYPE_RT5663: 1710 case CODEC_VER_0:
1710 report = rt5663_jack_detect(rt5663->codec, 0); 1711 report = rt5663_jack_detect(rt5663->codec, 0);
1711 break; 1712 break;
1712 default: 1713 default:
1713 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1714 dev_err(codec->dev, "Unknown CODEC Version\n");
1714 } 1715 }
1715 } 1716 }
1716 dev_dbg(codec->dev, "%s jack report: 0x%04x\n", __func__, report); 1717 dev_dbg(codec->dev, "%s jack report: 0x%04x\n", __func__, report);
@@ -1722,24 +1723,24 @@ static void rt5663_jack_detect_work(struct work_struct *work)
1722static const struct snd_kcontrol_new rt5663_snd_controls[] = { 1723static const struct snd_kcontrol_new rt5663_snd_controls[] = {
1723 /* DAC Digital Volume */ 1724 /* DAC Digital Volume */
1724 SOC_DOUBLE_TLV("DAC Playback Volume", RT5663_STO1_DAC_DIG_VOL, 1725 SOC_DOUBLE_TLV("DAC Playback Volume", RT5663_STO1_DAC_DIG_VOL,
1725 RT5668_DAC_L1_VOL_SHIFT + 1, RT5668_DAC_R1_VOL_SHIFT + 1, 1726 RT5663_DAC_L1_VOL_SHIFT + 1, RT5663_DAC_R1_VOL_SHIFT + 1,
1726 87, 0, dac_vol_tlv), 1727 87, 0, dac_vol_tlv),
1727 /* ADC Digital Volume Control */ 1728 /* ADC Digital Volume Control */
1728 SOC_DOUBLE("ADC Capture Switch", RT5663_STO1_ADC_DIG_VOL, 1729 SOC_DOUBLE("ADC Capture Switch", RT5663_STO1_ADC_DIG_VOL,
1729 RT5668_ADC_L_MUTE_SHIFT, RT5668_ADC_R_MUTE_SHIFT, 1, 1), 1730 RT5663_ADC_L_MUTE_SHIFT, RT5663_ADC_R_MUTE_SHIFT, 1, 1),
1730 SOC_DOUBLE_TLV("ADC Capture Volume", RT5663_STO1_ADC_DIG_VOL, 1731 SOC_DOUBLE_TLV("ADC Capture Volume", RT5663_STO1_ADC_DIG_VOL,
1731 RT5668_ADC_L_VOL_SHIFT + 1, RT5668_ADC_R_VOL_SHIFT + 1, 1732 RT5663_ADC_L_VOL_SHIFT + 1, RT5663_ADC_R_VOL_SHIFT + 1,
1732 63, 0, adc_vol_tlv), 1733 63, 0, adc_vol_tlv),
1733}; 1734};
1734 1735
1735static const struct snd_kcontrol_new rt5668_specific_controls[] = { 1736static const struct snd_kcontrol_new rt5663_v2_specific_controls[] = {
1736 /* Headphone Output Volume */ 1737 /* Headphone Output Volume */
1737 SOC_DOUBLE_R_TLV("Headphone Playback Volume", RT5663_HP_LCH_DRE, 1738 SOC_DOUBLE_R_TLV("Headphone Playback Volume", RT5663_HP_LCH_DRE,
1738 RT5663_HP_RCH_DRE, RT5668_GAIN_HP_SHIFT, 15, 1, 1739 RT5663_HP_RCH_DRE, RT5663_GAIN_HP_SHIFT, 15, 1,
1739 rt5668_hp_vol_tlv), 1740 rt5663_v2_hp_vol_tlv),
1740 /* Mic Boost Volume */ 1741 /* Mic Boost Volume */
1741 SOC_SINGLE_TLV("IN1 Capture Volume", RT5668_AEC_BST, 1742 SOC_SINGLE_TLV("IN1 Capture Volume", RT5663_AEC_BST,
1742 RT5668_GAIN_CBJ_SHIFT, 8, 0, in_bst_tlv), 1743 RT5663_GAIN_CBJ_SHIFT, 8, 0, in_bst_tlv),
1743}; 1744};
1744 1745
1745static const struct snd_kcontrol_new rt5663_specific_controls[] = { 1746static const struct snd_kcontrol_new rt5663_specific_controls[] = {
@@ -1775,15 +1776,15 @@ static int rt5663_is_using_asrc(struct snd_soc_dapm_widget *w,
1775 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 1776 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1776 struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec); 1777 struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec);
1777 1778
1778 if (rt5663->codec_type == CODEC_TYPE_RT5668) { 1779 if (rt5663->codec_ver == CODEC_VER_1) {
1779 switch (w->shift) { 1780 switch (w->shift) {
1780 case RT5668_ADC_STO1_ASRC_SHIFT: 1781 case RT5663_ADC_STO1_ASRC_SHIFT:
1781 reg = RT5668_ASRC_3; 1782 reg = RT5663_ASRC_3;
1782 shift = RT5668_AD_STO1_TRACK_SHIFT; 1783 shift = RT5663_V2_AD_STO1_TRACK_SHIFT;
1783 break; 1784 break;
1784 case RT5668_DAC_STO1_ASRC_SHIFT: 1785 case RT5663_DAC_STO1_ASRC_SHIFT:
1785 reg = RT5663_ASRC_2; 1786 reg = RT5663_ASRC_2;
1786 shift = RT5668_DA_STO1_TRACK_SHIFT; 1787 shift = RT5663_DA_STO1_TRACK_SHIFT;
1787 break; 1788 break;
1788 default: 1789 default:
1789 return 0; 1790 return 0;
@@ -1820,17 +1821,17 @@ static int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source,
1820 1821
1821 da_asrc_en = (snd_soc_read(codec, RT5663_ASRC_2) & 1822 da_asrc_en = (snd_soc_read(codec, RT5663_ASRC_2) &
1822 RT5663_DA_STO1_TRACK_MASK) ? 1 : 0; 1823 RT5663_DA_STO1_TRACK_MASK) ? 1 : 0;
1823 switch (rt5663->codec_type) { 1824 switch (rt5663->codec_ver) {
1824 case CODEC_TYPE_RT5668: 1825 case CODEC_VER_1:
1825 ad_asrc_en = (snd_soc_read(codec, RT5668_ASRC_3) & 1826 ad_asrc_en = (snd_soc_read(codec, RT5663_ASRC_3) &
1826 RT5668_AD_STO1_TRACK_MASK) ? 1 : 0; 1827 RT5663_V2_AD_STO1_TRACK_MASK) ? 1 : 0;
1827 break; 1828 break;
1828 case CODEC_TYPE_RT5663: 1829 case CODEC_VER_0:
1829 ad_asrc_en = (snd_soc_read(codec, RT5663_ASRC_2) & 1830 ad_asrc_en = (snd_soc_read(codec, RT5663_ASRC_2) &
1830 RT5663_AD_STO1_TRACK_MASK) ? 1 : 0; 1831 RT5663_AD_STO1_TRACK_MASK) ? 1 : 0;
1831 break; 1832 break;
1832 default: 1833 default:
1833 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1834 dev_err(codec->dev, "Unknown CODEC Version\n");
1834 return 1; 1835 return 1;
1835 } 1836 }
1836 1837
@@ -1849,7 +1850,7 @@ static int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source,
1849 * @filter_mask: mask of filters. 1850 * @filter_mask: mask of filters.
1850 * @clk_src: clock source 1851 * @clk_src: clock source
1851 * 1852 *
1852 * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5668 can 1853 * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5663 can
1853 * only support standard 32fs or 64fs i2s format, ASRC should be enabled to 1854 * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
1854 * support special i2s clock format such as Intel's 100fs(100 * sampling rate). 1855 * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
1855 * ASRC function will track i2s clock and generate a corresponding system clock 1856 * ASRC function will track i2s clock and generate a corresponding system clock
@@ -1860,7 +1861,7 @@ static int rt5663_i2s_use_asrc(struct snd_soc_dapm_widget *source,
1860int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec, 1861int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec,
1861 unsigned int filter_mask, unsigned int clk_src) 1862 unsigned int filter_mask, unsigned int clk_src)
1862{ 1863{
1863 struct rt5663_priv *rt5668 = snd_soc_codec_get_drvdata(codec); 1864 struct rt5663_priv *rt5663 = snd_soc_codec_get_drvdata(codec);
1864 unsigned int asrc2_mask = 0; 1865 unsigned int asrc2_mask = 0;
1865 unsigned int asrc2_value = 0; 1866 unsigned int asrc2_value = 0;
1866 unsigned int asrc3_mask = 0; 1867 unsigned int asrc3_mask = 0;
@@ -1876,22 +1877,22 @@ int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec,
1876 } 1877 }
1877 1878
1878 if (filter_mask & RT5663_DA_STEREO_FILTER) { 1879 if (filter_mask & RT5663_DA_STEREO_FILTER) {
1879 asrc2_mask |= RT5668_DA_STO1_TRACK_MASK; 1880 asrc2_mask |= RT5663_DA_STO1_TRACK_MASK;
1880 asrc2_value |= clk_src << RT5668_DA_STO1_TRACK_SHIFT; 1881 asrc2_value |= clk_src << RT5663_DA_STO1_TRACK_SHIFT;
1881 } 1882 }
1882 1883
1883 if (filter_mask & RT5663_AD_STEREO_FILTER) { 1884 if (filter_mask & RT5663_AD_STEREO_FILTER) {
1884 switch (rt5668->codec_type) { 1885 switch (rt5663->codec_ver) {
1885 case CODEC_TYPE_RT5668: 1886 case CODEC_VER_1:
1886 asrc3_mask |= RT5668_AD_STO1_TRACK_MASK; 1887 asrc3_mask |= RT5663_V2_AD_STO1_TRACK_MASK;
1887 asrc3_value |= clk_src << RT5668_AD_STO1_TRACK_SHIFT; 1888 asrc3_value |= clk_src << RT5663_V2_AD_STO1_TRACK_SHIFT;
1888 break; 1889 break;
1889 case CODEC_TYPE_RT5663: 1890 case CODEC_VER_0:
1890 asrc2_mask |= RT5663_AD_STO1_TRACK_MASK; 1891 asrc2_mask |= RT5663_AD_STO1_TRACK_MASK;
1891 asrc2_value |= clk_src << RT5663_AD_STO1_TRACK_SHIFT; 1892 asrc2_value |= clk_src << RT5663_AD_STO1_TRACK_SHIFT;
1892 break; 1893 break;
1893 default: 1894 default:
1894 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 1895 dev_err(codec->dev, "Unknown CODEC Version\n");
1895 } 1896 }
1896 } 1897 }
1897 1898
@@ -1900,7 +1901,7 @@ int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec,
1900 asrc2_value); 1901 asrc2_value);
1901 1902
1902 if (asrc3_mask) 1903 if (asrc3_mask)
1903 snd_soc_update_bits(codec, RT5668_ASRC_3, asrc3_mask, 1904 snd_soc_update_bits(codec, RT5663_ASRC_3, asrc3_mask,
1904 asrc3_value); 1905 asrc3_value);
1905 1906
1906 return 0; 1907 return 0;
@@ -1908,82 +1909,82 @@ int rt5663_sel_asrc_clk_src(struct snd_soc_codec *codec,
1908EXPORT_SYMBOL_GPL(rt5663_sel_asrc_clk_src); 1909EXPORT_SYMBOL_GPL(rt5663_sel_asrc_clk_src);
1909 1910
1910/* Analog Mixer */ 1911/* Analog Mixer */
1911static const struct snd_kcontrol_new rt5668_recmix1l[] = { 1912static const struct snd_kcontrol_new rt5663_recmix1l[] = {
1912 SOC_DAPM_SINGLE("BST2 Switch", RT5668_RECMIX1L, 1913 SOC_DAPM_SINGLE("BST2 Switch", RT5663_RECMIX1L,
1913 RT5668_RECMIX1L_BST2_SHIFT, 1, 1), 1914 RT5663_RECMIX1L_BST2_SHIFT, 1, 1),
1914 SOC_DAPM_SINGLE("BST1 CBJ Switch", RT5668_RECMIX1L, 1915 SOC_DAPM_SINGLE("BST1 CBJ Switch", RT5663_RECMIX1L,
1915 RT5668_RECMIX1L_BST1_CBJ_SHIFT, 1, 1), 1916 RT5663_RECMIX1L_BST1_CBJ_SHIFT, 1, 1),
1916}; 1917};
1917 1918
1918static const struct snd_kcontrol_new rt5668_recmix1r[] = { 1919static const struct snd_kcontrol_new rt5663_recmix1r[] = {
1919 SOC_DAPM_SINGLE("BST2 Switch", RT5668_RECMIX1R, 1920 SOC_DAPM_SINGLE("BST2 Switch", RT5663_RECMIX1R,
1920 RT5668_RECMIX1R_BST2_SHIFT, 1, 1), 1921 RT5663_RECMIX1R_BST2_SHIFT, 1, 1),
1921}; 1922};
1922 1923
1923/* Digital Mixer */ 1924/* Digital Mixer */
1924static const struct snd_kcontrol_new rt5663_sto1_adc_l_mix[] = { 1925static const struct snd_kcontrol_new rt5663_sto1_adc_l_mix[] = {
1925 SOC_DAPM_SINGLE("ADC1 Switch", RT5663_STO1_ADC_MIXER, 1926 SOC_DAPM_SINGLE("ADC1 Switch", RT5663_STO1_ADC_MIXER,
1926 RT5668_M_STO1_ADC_L1_SHIFT, 1, 1), 1927 RT5663_M_STO1_ADC_L1_SHIFT, 1, 1),
1927 SOC_DAPM_SINGLE("ADC2 Switch", RT5663_STO1_ADC_MIXER, 1928 SOC_DAPM_SINGLE("ADC2 Switch", RT5663_STO1_ADC_MIXER,
1928 RT5668_M_STO1_ADC_L2_SHIFT, 1, 1), 1929 RT5663_M_STO1_ADC_L2_SHIFT, 1, 1),
1929}; 1930};
1930 1931
1931static const struct snd_kcontrol_new rt5668_sto1_adc_r_mix[] = { 1932static const struct snd_kcontrol_new rt5663_sto1_adc_r_mix[] = {
1932 SOC_DAPM_SINGLE("ADC1 Switch", RT5663_STO1_ADC_MIXER, 1933 SOC_DAPM_SINGLE("ADC1 Switch", RT5663_STO1_ADC_MIXER,
1933 RT5668_M_STO1_ADC_R1_SHIFT, 1, 1), 1934 RT5663_M_STO1_ADC_R1_SHIFT, 1, 1),
1934 SOC_DAPM_SINGLE("ADC2 Switch", RT5663_STO1_ADC_MIXER, 1935 SOC_DAPM_SINGLE("ADC2 Switch", RT5663_STO1_ADC_MIXER,
1935 RT5668_M_STO1_ADC_R2_SHIFT, 1, 1), 1936 RT5663_M_STO1_ADC_R2_SHIFT, 1, 1),
1936}; 1937};
1937 1938
1938static const struct snd_kcontrol_new rt5663_adda_l_mix[] = { 1939static const struct snd_kcontrol_new rt5663_adda_l_mix[] = {
1939 SOC_DAPM_SINGLE("ADC L Switch", RT5663_AD_DA_MIXER, 1940 SOC_DAPM_SINGLE("ADC L Switch", RT5663_AD_DA_MIXER,
1940 RT5668_M_ADCMIX_L_SHIFT, 1, 1), 1941 RT5663_M_ADCMIX_L_SHIFT, 1, 1),
1941 SOC_DAPM_SINGLE("DAC L Switch", RT5663_AD_DA_MIXER, 1942 SOC_DAPM_SINGLE("DAC L Switch", RT5663_AD_DA_MIXER,
1942 RT5668_M_DAC1_L_SHIFT, 1, 1), 1943 RT5663_M_DAC1_L_SHIFT, 1, 1),
1943}; 1944};
1944 1945
1945static const struct snd_kcontrol_new rt5663_adda_r_mix[] = { 1946static const struct snd_kcontrol_new rt5663_adda_r_mix[] = {
1946 SOC_DAPM_SINGLE("ADC R Switch", RT5663_AD_DA_MIXER, 1947 SOC_DAPM_SINGLE("ADC R Switch", RT5663_AD_DA_MIXER,
1947 RT5668_M_ADCMIX_R_SHIFT, 1, 1), 1948 RT5663_M_ADCMIX_R_SHIFT, 1, 1),
1948 SOC_DAPM_SINGLE("DAC R Switch", RT5663_AD_DA_MIXER, 1949 SOC_DAPM_SINGLE("DAC R Switch", RT5663_AD_DA_MIXER,
1949 RT5668_M_DAC1_R_SHIFT, 1, 1), 1950 RT5663_M_DAC1_R_SHIFT, 1, 1),
1950}; 1951};
1951 1952
1952static const struct snd_kcontrol_new rt5663_sto1_dac_l_mix[] = { 1953static const struct snd_kcontrol_new rt5663_sto1_dac_l_mix[] = {
1953 SOC_DAPM_SINGLE("DAC L Switch", RT5663_STO_DAC_MIXER, 1954 SOC_DAPM_SINGLE("DAC L Switch", RT5663_STO_DAC_MIXER,
1954 RT5668_M_DAC_L1_STO_L_SHIFT, 1, 1), 1955 RT5663_M_DAC_L1_STO_L_SHIFT, 1, 1),
1955 SOC_DAPM_SINGLE("DAC R Switch", RT5663_STO_DAC_MIXER, 1956 SOC_DAPM_SINGLE("DAC R Switch", RT5663_STO_DAC_MIXER,
1956 RT5668_M_DAC_R1_STO_L_SHIFT, 1, 1), 1957 RT5663_M_DAC_R1_STO_L_SHIFT, 1, 1),
1957}; 1958};
1958 1959
1959static const struct snd_kcontrol_new rt5663_sto1_dac_r_mix[] = { 1960static const struct snd_kcontrol_new rt5663_sto1_dac_r_mix[] = {
1960 SOC_DAPM_SINGLE("DAC L Switch", RT5663_STO_DAC_MIXER, 1961 SOC_DAPM_SINGLE("DAC L Switch", RT5663_STO_DAC_MIXER,
1961 RT5668_M_DAC_L1_STO_R_SHIFT, 1, 1), 1962 RT5663_M_DAC_L1_STO_R_SHIFT, 1, 1),
1962 SOC_DAPM_SINGLE("DAC R Switch", RT5663_STO_DAC_MIXER, 1963 SOC_DAPM_SINGLE("DAC R Switch", RT5663_STO_DAC_MIXER,
1963 RT5668_M_DAC_R1_STO_R_SHIFT, 1, 1), 1964 RT5663_M_DAC_R1_STO_R_SHIFT, 1, 1),
1964}; 1965};
1965 1966
1966/* Out Switch */ 1967/* Out Switch */
1967static const struct snd_kcontrol_new rt5668_hpo_switch = 1968static const struct snd_kcontrol_new rt5663_hpo_switch =
1968 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5668_HP_AMP_2, 1969 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5663_HP_AMP_2,
1969 RT5668_EN_DAC_HPO_SHIFT, 1, 0); 1970 RT5663_EN_DAC_HPO_SHIFT, 1, 0);
1970 1971
1971/* Stereo ADC source */ 1972/* Stereo ADC source */
1972static const char * const rt5668_sto1_adc_src[] = { 1973static const char * const rt5663_sto1_adc_src[] = {
1973 "ADC L", "ADC R" 1974 "ADC L", "ADC R"
1974}; 1975};
1975 1976
1976static SOC_ENUM_SINGLE_DECL(rt5668_sto1_adcl_enum, RT5663_STO1_ADC_MIXER, 1977static SOC_ENUM_SINGLE_DECL(rt5663_sto1_adcl_enum, RT5663_STO1_ADC_MIXER,
1977 RT5668_STO1_ADC_L_SRC_SHIFT, rt5668_sto1_adc_src); 1978 RT5663_STO1_ADC_L_SRC_SHIFT, rt5663_sto1_adc_src);
1978 1979
1979static const struct snd_kcontrol_new rt5668_sto1_adcl_mux = 1980static const struct snd_kcontrol_new rt5663_sto1_adcl_mux =
1980 SOC_DAPM_ENUM("STO1 ADC L Mux", rt5668_sto1_adcl_enum); 1981 SOC_DAPM_ENUM("STO1 ADC L Mux", rt5663_sto1_adcl_enum);
1981 1982
1982static SOC_ENUM_SINGLE_DECL(rt5668_sto1_adcr_enum, RT5663_STO1_ADC_MIXER, 1983static SOC_ENUM_SINGLE_DECL(rt5663_sto1_adcr_enum, RT5663_STO1_ADC_MIXER,
1983 RT5668_STO1_ADC_R_SRC_SHIFT, rt5668_sto1_adc_src); 1984 RT5663_STO1_ADC_R_SRC_SHIFT, rt5663_sto1_adc_src);
1984 1985
1985static const struct snd_kcontrol_new rt5668_sto1_adcr_mux = 1986static const struct snd_kcontrol_new rt5663_sto1_adcr_mux =
1986 SOC_DAPM_ENUM("STO1 ADC R Mux", rt5668_sto1_adcr_enum); 1987 SOC_DAPM_ENUM("STO1 ADC R Mux", rt5663_sto1_adcr_enum);
1987 1988
1988/* RT5663: Analog DACL1 input source */ 1989/* RT5663: Analog DACL1 input source */
1989static const char * const rt5663_alg_dacl_src[] = { 1990static const char * const rt5663_alg_dacl_src[] = {
@@ -2015,12 +2016,12 @@ static int rt5663_hp_event(struct snd_soc_dapm_widget *w,
2015 2016
2016 switch (event) { 2017 switch (event) {
2017 case SND_SOC_DAPM_POST_PMU: 2018 case SND_SOC_DAPM_POST_PMU:
2018 if (rt5663->codec_type == CODEC_TYPE_RT5668) { 2019 if (rt5663->codec_ver == CODEC_VER_1) {
2019 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, 2020 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1,
2020 RT5668_SEL_PM_HP_SHIFT, RT5668_SEL_PM_HP_HIGH); 2021 RT5663_SEL_PM_HP_SHIFT, RT5663_SEL_PM_HP_HIGH);
2021 snd_soc_update_bits(codec, RT5663_HP_LOGIC_2, 2022 snd_soc_update_bits(codec, RT5663_HP_LOGIC_2,
2022 RT5668_HP_SIG_SRC1_MASK, 2023 RT5663_HP_SIG_SRC1_MASK,
2023 RT5668_HP_SIG_SRC1_SILENCE); 2024 RT5663_HP_SIG_SRC1_SILENCE);
2024 } else { 2025 } else {
2025 snd_soc_write(codec, RT5663_DEPOP_2, 0x3003); 2026 snd_soc_write(codec, RT5663_DEPOP_2, 0x3003);
2026 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x000b, 2027 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x000b,
@@ -2028,7 +2029,7 @@ static int rt5663_hp_event(struct snd_soc_dapm_widget *w,
2028 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, 2029 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030,
2029 0x0030); 2030 0x0030);
2030 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, 2031 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1,
2031 RT5668_OVCD_HP_MASK, RT5668_OVCD_HP_DIS); 2032 RT5663_OVCD_HP_MASK, RT5663_OVCD_HP_DIS);
2032 snd_soc_write(codec, RT5663_HP_CHARGE_PUMP_2, 0x1371); 2033 snd_soc_write(codec, RT5663_HP_CHARGE_PUMP_2, 0x1371);
2033 snd_soc_write(codec, RT5663_HP_BIAS, 0xabba); 2034 snd_soc_write(codec, RT5663_HP_BIAS, 0xabba);
2034 snd_soc_write(codec, RT5663_CHARGE_PUMP_1, 0x2224); 2035 snd_soc_write(codec, RT5663_CHARGE_PUMP_1, 0x2224);
@@ -2041,14 +2042,14 @@ static int rt5663_hp_event(struct snd_soc_dapm_widget *w,
2041 break; 2042 break;
2042 2043
2043 case SND_SOC_DAPM_PRE_PMD: 2044 case SND_SOC_DAPM_PRE_PMD:
2044 if (rt5663->codec_type == CODEC_TYPE_RT5668) { 2045 if (rt5663->codec_ver == CODEC_VER_1) {
2045 snd_soc_update_bits(codec, RT5663_HP_LOGIC_2, 2046 snd_soc_update_bits(codec, RT5663_HP_LOGIC_2,
2046 RT5668_HP_SIG_SRC1_MASK, 2047 RT5663_HP_SIG_SRC1_MASK,
2047 RT5668_HP_SIG_SRC1_REG); 2048 RT5663_HP_SIG_SRC1_REG);
2048 } else { 2049 } else {
2049 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x3000, 0x0); 2050 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x3000, 0x0);
2050 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1, 2051 snd_soc_update_bits(codec, RT5663_HP_CHARGE_PUMP_1,
2051 RT5668_OVCD_HP_MASK, RT5668_OVCD_HP_EN); 2052 RT5663_OVCD_HP_MASK, RT5663_OVCD_HP_EN);
2052 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, 0x0); 2053 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x0030, 0x0);
2053 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x000b, 2054 snd_soc_update_bits(codec, RT5663_DEPOP_1, 0x000b,
2054 0x000b); 2055 0x000b);
@@ -2062,7 +2063,7 @@ static int rt5663_hp_event(struct snd_soc_dapm_widget *w,
2062 return 0; 2063 return 0;
2063} 2064}
2064 2065
2065static int rt5668_bst2_power(struct snd_soc_dapm_widget *w, 2066static int rt5663_bst2_power(struct snd_soc_dapm_widget *w,
2066 struct snd_kcontrol *kcontrol, int event) 2067 struct snd_kcontrol *kcontrol, int event)
2067{ 2068{
2068 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm); 2069 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
@@ -2070,13 +2071,13 @@ static int rt5668_bst2_power(struct snd_soc_dapm_widget *w,
2070 switch (event) { 2071 switch (event) {
2071 case SND_SOC_DAPM_POST_PMU: 2072 case SND_SOC_DAPM_POST_PMU:
2072 snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, 2073 snd_soc_update_bits(codec, RT5663_PWR_ANLG_2,
2073 RT5668_PWR_BST2_MASK | RT5668_PWR_BST2_OP_MASK, 2074 RT5663_PWR_BST2_MASK | RT5663_PWR_BST2_OP_MASK,
2074 RT5668_PWR_BST2 | RT5668_PWR_BST2_OP); 2075 RT5663_PWR_BST2 | RT5663_PWR_BST2_OP);
2075 break; 2076 break;
2076 2077
2077 case SND_SOC_DAPM_PRE_PMD: 2078 case SND_SOC_DAPM_PRE_PMD:
2078 snd_soc_update_bits(codec, RT5663_PWR_ANLG_2, 2079 snd_soc_update_bits(codec, RT5663_PWR_ANLG_2,
2079 RT5668_PWR_BST2_MASK | RT5668_PWR_BST2_OP_MASK, 0); 2080 RT5663_PWR_BST2_MASK | RT5663_PWR_BST2_OP_MASK, 0);
2080 break; 2081 break;
2081 2082
2082 default: 2083 default:
@@ -2110,14 +2111,14 @@ static int rt5663_pre_div_power(struct snd_soc_dapm_widget *w,
2110} 2111}
2111 2112
2112static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = { 2113static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = {
2113 SND_SOC_DAPM_SUPPLY("PLL", RT5663_PWR_ANLG_3, RT5668_PWR_PLL_SHIFT, 0, 2114 SND_SOC_DAPM_SUPPLY("PLL", RT5663_PWR_ANLG_3, RT5663_PWR_PLL_SHIFT, 0,
2114 NULL, 0), 2115 NULL, 0),
2115 2116
2116 /* micbias */ 2117 /* micbias */
2117 SND_SOC_DAPM_MICBIAS("MICBIAS1", RT5663_PWR_ANLG_2, 2118 SND_SOC_DAPM_MICBIAS("MICBIAS1", RT5663_PWR_ANLG_2,
2118 RT5668_PWR_MB1_SHIFT, 0), 2119 RT5663_PWR_MB1_SHIFT, 0),
2119 SND_SOC_DAPM_MICBIAS("MICBIAS2", RT5663_PWR_ANLG_2, 2120 SND_SOC_DAPM_MICBIAS("MICBIAS2", RT5663_PWR_ANLG_2,
2120 RT5668_PWR_MB2_SHIFT, 0), 2121 RT5663_PWR_MB2_SHIFT, 0),
2121 2122
2122 /* Input Lines */ 2123 /* Input Lines */
2123 SND_SOC_DAPM_INPUT("IN1P"), 2124 SND_SOC_DAPM_INPUT("IN1P"),
@@ -2125,14 +2126,14 @@ static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = {
2125 2126
2126 /* REC Mixer Power */ 2127 /* REC Mixer Power */
2127 SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5663_PWR_ANLG_2, 2128 SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5663_PWR_ANLG_2,
2128 RT5668_PWR_RECMIX1_SHIFT, 0, NULL, 0), 2129 RT5663_PWR_RECMIX1_SHIFT, 0, NULL, 0),
2129 2130
2130 /* ADCs */ 2131 /* ADCs */
2131 SND_SOC_DAPM_ADC("ADC L", NULL, SND_SOC_NOPM, 0, 0), 2132 SND_SOC_DAPM_ADC("ADC L", NULL, SND_SOC_NOPM, 0, 0),
2132 SND_SOC_DAPM_SUPPLY("ADC L Power", RT5663_PWR_DIG_1, 2133 SND_SOC_DAPM_SUPPLY("ADC L Power", RT5663_PWR_DIG_1,
2133 RT5668_PWR_ADC_L1_SHIFT, 0, NULL, 0), 2134 RT5663_PWR_ADC_L1_SHIFT, 0, NULL, 0),
2134 SND_SOC_DAPM_SUPPLY("ADC Clock", RT5663_CHOP_ADC, 2135 SND_SOC_DAPM_SUPPLY("ADC Clock", RT5663_CHOP_ADC,
2135 RT5668_CKGEN_ADCC_SHIFT, 0, NULL, 0), 2136 RT5663_CKGEN_ADCC_SHIFT, 0, NULL, 0),
2136 2137
2137 /* ADC Mixer */ 2138 /* ADC Mixer */
2138 SND_SOC_DAPM_MIXER("STO1 ADC MIXL", SND_SOC_NOPM, 2139 SND_SOC_DAPM_MIXER("STO1 ADC MIXL", SND_SOC_NOPM,
@@ -2141,10 +2142,10 @@ static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = {
2141 2142
2142 /* ADC Filter Power */ 2143 /* ADC Filter Power */
2143 SND_SOC_DAPM_SUPPLY("STO1 ADC Filter", RT5663_PWR_DIG_2, 2144 SND_SOC_DAPM_SUPPLY("STO1 ADC Filter", RT5663_PWR_DIG_2,
2144 RT5668_PWR_ADC_S1F_SHIFT, 0, NULL, 0), 2145 RT5663_PWR_ADC_S1F_SHIFT, 0, NULL, 0),
2145 2146
2146 /* Digital Interface */ 2147 /* Digital Interface */
2147 SND_SOC_DAPM_SUPPLY("I2S", RT5663_PWR_DIG_1, RT5668_PWR_I2S1_SHIFT, 0, 2148 SND_SOC_DAPM_SUPPLY("I2S", RT5663_PWR_DIG_1, RT5663_PWR_I2S1_SHIFT, 0,
2148 NULL, 0), 2149 NULL, 0),
2149 SND_SOC_DAPM_PGA("IF DAC", SND_SOC_NOPM, 0, 0, NULL, 0), 2150 SND_SOC_DAPM_PGA("IF DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2150 SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0), 2151 SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
@@ -2166,7 +2167,7 @@ static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = {
2166 2167
2167 /* DAC Mixer */ 2168 /* DAC Mixer */
2168 SND_SOC_DAPM_SUPPLY("STO1 DAC Filter", RT5663_PWR_DIG_2, 2169 SND_SOC_DAPM_SUPPLY("STO1 DAC Filter", RT5663_PWR_DIG_2,
2169 RT5668_PWR_DAC_S1F_SHIFT, 0, NULL, 0), 2170 RT5663_PWR_DAC_S1F_SHIFT, 0, NULL, 0),
2170 SND_SOC_DAPM_MIXER("STO1 DAC MIXL", SND_SOC_NOPM, 0, 0, 2171 SND_SOC_DAPM_MIXER("STO1 DAC MIXL", SND_SOC_NOPM, 0, 0,
2171 rt5663_sto1_dac_l_mix, ARRAY_SIZE(rt5663_sto1_dac_l_mix)), 2172 rt5663_sto1_dac_l_mix, ARRAY_SIZE(rt5663_sto1_dac_l_mix)),
2172 SND_SOC_DAPM_MIXER("STO1 DAC MIXR", SND_SOC_NOPM, 0, 0, 2173 SND_SOC_DAPM_MIXER("STO1 DAC MIXR", SND_SOC_NOPM, 0, 0,
@@ -2174,9 +2175,9 @@ static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = {
2174 2175
2175 /* DACs */ 2176 /* DACs */
2176 SND_SOC_DAPM_SUPPLY("STO1 DAC L Power", RT5663_PWR_DIG_1, 2177 SND_SOC_DAPM_SUPPLY("STO1 DAC L Power", RT5663_PWR_DIG_1,
2177 RT5668_PWR_DAC_L1_SHIFT, 0, NULL, 0), 2178 RT5663_PWR_DAC_L1_SHIFT, 0, NULL, 0),
2178 SND_SOC_DAPM_SUPPLY("STO1 DAC R Power", RT5663_PWR_DIG_1, 2179 SND_SOC_DAPM_SUPPLY("STO1 DAC R Power", RT5663_PWR_DIG_1,
2179 RT5668_PWR_DAC_R1_SHIFT, 0, NULL, 0), 2180 RT5663_PWR_DAC_R1_SHIFT, 0, NULL, 0),
2180 SND_SOC_DAPM_DAC("DAC L", NULL, SND_SOC_NOPM, 0, 0), 2181 SND_SOC_DAPM_DAC("DAC L", NULL, SND_SOC_NOPM, 0, 0),
2181 SND_SOC_DAPM_DAC("DAC R", NULL, SND_SOC_NOPM, 0, 0), 2182 SND_SOC_DAPM_DAC("DAC R", NULL, SND_SOC_NOPM, 0, 0),
2182 2183
@@ -2189,21 +2190,21 @@ static const struct snd_soc_dapm_widget rt5663_dapm_widgets[] = {
2189 SND_SOC_DAPM_OUTPUT("HPOR"), 2190 SND_SOC_DAPM_OUTPUT("HPOR"),
2190}; 2191};
2191 2192
2192static const struct snd_soc_dapm_widget rt5668_specific_dapm_widgets[] = { 2193static const struct snd_soc_dapm_widget rt5663_v2_specific_dapm_widgets[] = {
2193 SND_SOC_DAPM_SUPPLY("LDO2", RT5663_PWR_ANLG_3, 2194 SND_SOC_DAPM_SUPPLY("LDO2", RT5663_PWR_ANLG_3,
2194 RT5668_PWR_LDO2_SHIFT, 0, NULL, 0), 2195 RT5663_PWR_LDO2_SHIFT, 0, NULL, 0),
2195 SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5668_PWR_VOL, 2196 SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5663_PWR_VOL,
2196 RT5668_PWR_MIC_DET_SHIFT, 0, NULL, 0), 2197 RT5663_V2_PWR_MIC_DET_SHIFT, 0, NULL, 0),
2197 SND_SOC_DAPM_SUPPLY("LDO DAC", RT5663_PWR_DIG_1, 2198 SND_SOC_DAPM_SUPPLY("LDO DAC", RT5663_PWR_DIG_1,
2198 RT5668_PWR_LDO_DACREF_SHIFT, 0, NULL, 0), 2199 RT5663_PWR_LDO_DACREF_SHIFT, 0, NULL, 0),
2199 2200
2200 /* ASRC */ 2201 /* ASRC */
2201 SND_SOC_DAPM_SUPPLY("I2S ASRC", RT5663_ASRC_1, 2202 SND_SOC_DAPM_SUPPLY("I2S ASRC", RT5663_ASRC_1,
2202 RT5668_I2S1_ASRC_SHIFT, 0, NULL, 0), 2203 RT5663_I2S1_ASRC_SHIFT, 0, NULL, 0),
2203 SND_SOC_DAPM_SUPPLY("DAC ASRC", RT5663_ASRC_1, 2204 SND_SOC_DAPM_SUPPLY("DAC ASRC", RT5663_ASRC_1,
2204 RT5668_DAC_STO1_ASRC_SHIFT, 0, NULL, 0), 2205 RT5663_DAC_STO1_ASRC_SHIFT, 0, NULL, 0),
2205 SND_SOC_DAPM_SUPPLY("ADC ASRC", RT5663_ASRC_1, 2206 SND_SOC_DAPM_SUPPLY("ADC ASRC", RT5663_ASRC_1,
2206 RT5668_ADC_STO1_ASRC_SHIFT, 0, NULL, 0), 2207 RT5663_ADC_STO1_ASRC_SHIFT, 0, NULL, 0),
2207 2208
2208 /* Input Lines */ 2209 /* Input Lines */
2209 SND_SOC_DAPM_INPUT("IN2P"), 2210 SND_SOC_DAPM_INPUT("IN2P"),
@@ -2212,51 +2213,51 @@ static const struct snd_soc_dapm_widget rt5668_specific_dapm_widgets[] = {
2212 /* Boost */ 2213 /* Boost */
2213 SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 0, 0, NULL, 0), 2214 SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM, 0, 0, NULL, 0),
2214 SND_SOC_DAPM_SUPPLY("CBJ Power", RT5663_PWR_ANLG_3, 2215 SND_SOC_DAPM_SUPPLY("CBJ Power", RT5663_PWR_ANLG_3,
2215 RT5668_PWR_CBJ_SHIFT, 0, NULL, 0), 2216 RT5663_PWR_CBJ_SHIFT, 0, NULL, 0),
2216 SND_SOC_DAPM_PGA("BST2", SND_SOC_NOPM, 0, 0, NULL, 0), 2217 SND_SOC_DAPM_PGA("BST2", SND_SOC_NOPM, 0, 0, NULL, 0),
2217 SND_SOC_DAPM_SUPPLY("BST2 Power", SND_SOC_NOPM, 0, 0, 2218 SND_SOC_DAPM_SUPPLY("BST2 Power", SND_SOC_NOPM, 0, 0,
2218 rt5668_bst2_power, SND_SOC_DAPM_PRE_PMD | 2219 rt5663_bst2_power, SND_SOC_DAPM_PRE_PMD |
2219 SND_SOC_DAPM_POST_PMU), 2220 SND_SOC_DAPM_POST_PMU),
2220 2221
2221 /* REC Mixer */ 2222 /* REC Mixer */
2222 SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5668_recmix1l, 2223 SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5663_recmix1l,
2223 ARRAY_SIZE(rt5668_recmix1l)), 2224 ARRAY_SIZE(rt5663_recmix1l)),
2224 SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5668_recmix1r, 2225 SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5663_recmix1r,
2225 ARRAY_SIZE(rt5668_recmix1r)), 2226 ARRAY_SIZE(rt5663_recmix1r)),
2226 SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5663_PWR_ANLG_2, 2227 SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5663_PWR_ANLG_2,
2227 RT5668_PWR_RECMIX2_SHIFT, 0, NULL, 0), 2228 RT5663_PWR_RECMIX2_SHIFT, 0, NULL, 0),
2228 2229
2229 /* ADC */ 2230 /* ADC */
2230 SND_SOC_DAPM_ADC("ADC R", NULL, SND_SOC_NOPM, 0, 0), 2231 SND_SOC_DAPM_ADC("ADC R", NULL, SND_SOC_NOPM, 0, 0),
2231 SND_SOC_DAPM_SUPPLY("ADC R Power", RT5663_PWR_DIG_1, 2232 SND_SOC_DAPM_SUPPLY("ADC R Power", RT5663_PWR_DIG_1,
2232 RT5668_PWR_ADC_R1_SHIFT, 0, NULL, 0), 2233 RT5663_PWR_ADC_R1_SHIFT, 0, NULL, 0),
2233 2234
2234 /* ADC Mux */ 2235 /* ADC Mux */
2235 SND_SOC_DAPM_PGA("STO1 ADC L1", RT5663_STO1_ADC_MIXER, 2236 SND_SOC_DAPM_PGA("STO1 ADC L1", RT5663_STO1_ADC_MIXER,
2236 RT5668_STO1_ADC_L1_SRC_SHIFT, 0, NULL, 0), 2237 RT5663_STO1_ADC_L1_SRC_SHIFT, 0, NULL, 0),
2237 SND_SOC_DAPM_PGA("STO1 ADC R1", RT5663_STO1_ADC_MIXER, 2238 SND_SOC_DAPM_PGA("STO1 ADC R1", RT5663_STO1_ADC_MIXER,
2238 RT5668_STO1_ADC_R1_SRC_SHIFT, 0, NULL, 0), 2239 RT5663_STO1_ADC_R1_SRC_SHIFT, 0, NULL, 0),
2239 SND_SOC_DAPM_PGA("STO1 ADC L2", RT5663_STO1_ADC_MIXER, 2240 SND_SOC_DAPM_PGA("STO1 ADC L2", RT5663_STO1_ADC_MIXER,
2240 RT5668_STO1_ADC_L2_SRC_SHIFT, 1, NULL, 0), 2241 RT5663_STO1_ADC_L2_SRC_SHIFT, 1, NULL, 0),
2241 SND_SOC_DAPM_PGA("STO1 ADC R2", RT5663_STO1_ADC_MIXER, 2242 SND_SOC_DAPM_PGA("STO1 ADC R2", RT5663_STO1_ADC_MIXER,
2242 RT5668_STO1_ADC_R2_SRC_SHIFT, 1, NULL, 0), 2243 RT5663_STO1_ADC_R2_SRC_SHIFT, 1, NULL, 0),
2243 2244
2244 SND_SOC_DAPM_MUX("STO1 ADC L Mux", SND_SOC_NOPM, 0, 0, 2245 SND_SOC_DAPM_MUX("STO1 ADC L Mux", SND_SOC_NOPM, 0, 0,
2245 &rt5668_sto1_adcl_mux), 2246 &rt5663_sto1_adcl_mux),
2246 SND_SOC_DAPM_MUX("STO1 ADC R Mux", SND_SOC_NOPM, 0, 0, 2247 SND_SOC_DAPM_MUX("STO1 ADC R Mux", SND_SOC_NOPM, 0, 0,
2247 &rt5668_sto1_adcr_mux), 2248 &rt5663_sto1_adcr_mux),
2248 2249
2249 /* ADC Mix */ 2250 /* ADC Mix */
2250 SND_SOC_DAPM_MIXER("STO1 ADC MIXR", SND_SOC_NOPM, 0, 0, 2251 SND_SOC_DAPM_MIXER("STO1 ADC MIXR", SND_SOC_NOPM, 0, 0,
2251 rt5668_sto1_adc_r_mix, ARRAY_SIZE(rt5668_sto1_adc_r_mix)), 2252 rt5663_sto1_adc_r_mix, ARRAY_SIZE(rt5663_sto1_adc_r_mix)),
2252 2253
2253 /* Analog DAC Clock */ 2254 /* Analog DAC Clock */
2254 SND_SOC_DAPM_SUPPLY("DAC Clock", RT5663_CHOP_DAC_L, 2255 SND_SOC_DAPM_SUPPLY("DAC Clock", RT5663_CHOP_DAC_L,
2255 RT5668_CKGEN_DAC1_SHIFT, 0, NULL, 0), 2256 RT5663_CKGEN_DAC1_SHIFT, 0, NULL, 0),
2256 2257
2257 /* Headphone out */ 2258 /* Headphone out */
2258 SND_SOC_DAPM_SWITCH("HPO Playback", SND_SOC_NOPM, 0, 0, 2259 SND_SOC_DAPM_SWITCH("HPO Playback", SND_SOC_NOPM, 0, 0,
2259 &rt5668_hpo_switch), 2260 &rt5663_hpo_switch),
2260}; 2261};
2261 2262
2262static const struct snd_soc_dapm_widget rt5663_specific_dapm_widgets[] = { 2263static const struct snd_soc_dapm_widget rt5663_specific_dapm_widgets[] = {
@@ -2267,7 +2268,7 @@ static const struct snd_soc_dapm_widget rt5663_specific_dapm_widgets[] = {
2267 2268
2268 /* LDO */ 2269 /* LDO */
2269 SND_SOC_DAPM_SUPPLY("LDO ADC", RT5663_PWR_DIG_1, 2270 SND_SOC_DAPM_SUPPLY("LDO ADC", RT5663_PWR_DIG_1,
2270 RT5668_PWR_LDO_DACREF_SHIFT, 0, NULL, 0), 2271 RT5663_PWR_LDO_DACREF_SHIFT, 0, NULL, 0),
2271 2272
2272 /* ASRC */ 2273 /* ASRC */
2273 SND_SOC_DAPM_SUPPLY("I2S ASRC", RT5663_ASRC_1, 2274 SND_SOC_DAPM_SUPPLY("I2S ASRC", RT5663_ASRC_1,
@@ -2341,7 +2342,7 @@ static const struct snd_soc_dapm_route rt5663_dapm_routes[] = {
2341 { "HP Amp", NULL, "DAC R" }, 2342 { "HP Amp", NULL, "DAC R" },
2342}; 2343};
2343 2344
2344static const struct snd_soc_dapm_route rt5668_specific_dapm_routes[] = { 2345static const struct snd_soc_dapm_route rt5663_v2_specific_dapm_routes[] = {
2345 { "MICBIAS1", NULL, "LDO2" }, 2346 { "MICBIAS1", NULL, "LDO2" },
2346 { "MICBIAS2", NULL, "LDO2" }, 2347 { "MICBIAS2", NULL, "LDO2" },
2347 2348
@@ -2440,26 +2441,26 @@ static int rt5663_hw_params(struct snd_pcm_substream *substream,
2440 2441
2441 switch (params_width(params)) { 2442 switch (params_width(params)) {
2442 case 8: 2443 case 8:
2443 val_len = RT5668_I2S_DL_8; 2444 val_len = RT5663_I2S_DL_8;
2444 break; 2445 break;
2445 case 16: 2446 case 16:
2446 val_len = RT5668_I2S_DL_16; 2447 val_len = RT5663_I2S_DL_16;
2447 break; 2448 break;
2448 case 20: 2449 case 20:
2449 val_len = RT5668_I2S_DL_20; 2450 val_len = RT5663_I2S_DL_20;
2450 break; 2451 break;
2451 case 24: 2452 case 24:
2452 val_len = RT5668_I2S_DL_24; 2453 val_len = RT5663_I2S_DL_24;
2453 break; 2454 break;
2454 default: 2455 default:
2455 return -EINVAL; 2456 return -EINVAL;
2456 } 2457 }
2457 2458
2458 snd_soc_update_bits(codec, RT5663_I2S1_SDP, 2459 snd_soc_update_bits(codec, RT5663_I2S1_SDP,
2459 RT5668_I2S_DL_MASK, val_len); 2460 RT5663_I2S_DL_MASK, val_len);
2460 2461
2461 snd_soc_update_bits(codec, RT5663_ADDA_CLK_1, 2462 snd_soc_update_bits(codec, RT5663_ADDA_CLK_1,
2462 RT5668_I2S_PD1_MASK, pre_div << RT5668_I2S_PD1_SHIFT); 2463 RT5663_I2S_PD1_MASK, pre_div << RT5663_I2S_PD1_SHIFT);
2463 2464
2464 return 0; 2465 return 0;
2465} 2466}
@@ -2473,7 +2474,7 @@ static int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2473 case SND_SOC_DAIFMT_CBM_CFM: 2474 case SND_SOC_DAIFMT_CBM_CFM:
2474 break; 2475 break;
2475 case SND_SOC_DAIFMT_CBS_CFS: 2476 case SND_SOC_DAIFMT_CBS_CFS:
2476 reg_val |= RT5668_I2S_MS_S; 2477 reg_val |= RT5663_I2S_MS_S;
2477 break; 2478 break;
2478 default: 2479 default:
2479 return -EINVAL; 2480 return -EINVAL;
@@ -2483,7 +2484,7 @@ static int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2483 case SND_SOC_DAIFMT_NB_NF: 2484 case SND_SOC_DAIFMT_NB_NF:
2484 break; 2485 break;
2485 case SND_SOC_DAIFMT_IB_NF: 2486 case SND_SOC_DAIFMT_IB_NF:
2486 reg_val |= RT5668_I2S_BP_INV; 2487 reg_val |= RT5663_I2S_BP_INV;
2487 break; 2488 break;
2488 default: 2489 default:
2489 return -EINVAL; 2490 return -EINVAL;
@@ -2493,20 +2494,20 @@ static int rt5663_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
2493 case SND_SOC_DAIFMT_I2S: 2494 case SND_SOC_DAIFMT_I2S:
2494 break; 2495 break;
2495 case SND_SOC_DAIFMT_LEFT_J: 2496 case SND_SOC_DAIFMT_LEFT_J:
2496 reg_val |= RT5668_I2S_DF_LEFT; 2497 reg_val |= RT5663_I2S_DF_LEFT;
2497 break; 2498 break;
2498 case SND_SOC_DAIFMT_DSP_A: 2499 case SND_SOC_DAIFMT_DSP_A:
2499 reg_val |= RT5668_I2S_DF_PCM_A; 2500 reg_val |= RT5663_I2S_DF_PCM_A;
2500 break; 2501 break;
2501 case SND_SOC_DAIFMT_DSP_B: 2502 case SND_SOC_DAIFMT_DSP_B:
2502 reg_val |= RT5668_I2S_DF_PCM_B; 2503 reg_val |= RT5663_I2S_DF_PCM_B;
2503 break; 2504 break;
2504 default: 2505 default:
2505 return -EINVAL; 2506 return -EINVAL;
2506 } 2507 }
2507 2508
2508 snd_soc_update_bits(codec, RT5663_I2S1_SDP, RT5668_I2S_MS_MASK | 2509 snd_soc_update_bits(codec, RT5663_I2S1_SDP, RT5663_I2S_MS_MASK |
2509 RT5668_I2S_BP_MASK | RT5668_I2S_DF_MASK, reg_val); 2510 RT5663_I2S_BP_MASK | RT5663_I2S_DF_MASK, reg_val);
2510 2511
2511 return 0; 2512 return 0;
2512} 2513}
@@ -2535,7 +2536,7 @@ static int rt5663_set_dai_sysclk(struct snd_soc_dai *dai, int clk_id,
2535 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id); 2536 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
2536 return -EINVAL; 2537 return -EINVAL;
2537 } 2538 }
2538 snd_soc_update_bits(codec, RT5663_GLB_CLK, RT5668_SCLK_SRC_MASK, 2539 snd_soc_update_bits(codec, RT5663_GLB_CLK, RT5663_SCLK_SRC_MASK,
2539 reg_val); 2540 reg_val);
2540 rt5663->sysclk = freq; 2541 rt5663->sysclk = freq;
2541 rt5663->sysclk_src = clk_id; 2542 rt5663->sysclk_src = clk_id;
@@ -2569,17 +2570,17 @@ static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
2569 return 0; 2570 return 0;
2570 } 2571 }
2571 2572
2572 switch (rt5663->codec_type) { 2573 switch (rt5663->codec_ver) {
2573 case CODEC_TYPE_RT5668: 2574 case CODEC_VER_1:
2574 mask = RT5668_PLL1_SRC_MASK; 2575 mask = RT5663_V2_PLL1_SRC_MASK;
2575 shift = RT5668_PLL1_SRC_SHIFT; 2576 shift = RT5663_V2_PLL1_SRC_SHIFT;
2576 break; 2577 break;
2577 case CODEC_TYPE_RT5663: 2578 case CODEC_VER_0:
2578 mask = RT5663_PLL1_SRC_MASK; 2579 mask = RT5663_PLL1_SRC_MASK;
2579 shift = RT5663_PLL1_SRC_SHIFT; 2580 shift = RT5663_PLL1_SRC_SHIFT;
2580 break; 2581 break;
2581 default: 2582 default:
2582 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 2583 dev_err(codec->dev, "Unknown CODEC Version\n");
2583 return -EINVAL; 2584 return -EINVAL;
2584 } 2585 }
2585 2586
@@ -2607,10 +2608,10 @@ static int rt5663_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int source,
2607 pll_code.k_code); 2608 pll_code.k_code);
2608 2609
2609 snd_soc_write(codec, RT5663_PLL_1, 2610 snd_soc_write(codec, RT5663_PLL_1,
2610 pll_code.n_code << RT5668_PLL_N_SHIFT | pll_code.k_code); 2611 pll_code.n_code << RT5663_PLL_N_SHIFT | pll_code.k_code);
2611 snd_soc_write(codec, RT5663_PLL_2, 2612 snd_soc_write(codec, RT5663_PLL_2,
2612 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5668_PLL_M_SHIFT | 2613 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5663_PLL_M_SHIFT |
2613 pll_code.m_bp << RT5668_PLL_M_BP_SHIFT); 2614 pll_code.m_bp << RT5663_PLL_M_BP_SHIFT);
2614 2615
2615 rt5663->pll_in = freq_in; 2616 rt5663->pll_in = freq_in;
2616 rt5663->pll_out = freq_out; 2617 rt5663->pll_out = freq_out;
@@ -2627,20 +2628,20 @@ static int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2627 unsigned int val = 0, reg; 2628 unsigned int val = 0, reg;
2628 2629
2629 if (rx_mask || tx_mask) 2630 if (rx_mask || tx_mask)
2630 val |= RT5668_TDM_MODE_TDM; 2631 val |= RT5663_TDM_MODE_TDM;
2631 2632
2632 switch (slots) { 2633 switch (slots) {
2633 case 4: 2634 case 4:
2634 val |= RT5668_TDM_IN_CH_4; 2635 val |= RT5663_TDM_IN_CH_4;
2635 val |= RT5668_TDM_OUT_CH_4; 2636 val |= RT5663_TDM_OUT_CH_4;
2636 break; 2637 break;
2637 case 6: 2638 case 6:
2638 val |= RT5668_TDM_IN_CH_6; 2639 val |= RT5663_TDM_IN_CH_6;
2639 val |= RT5668_TDM_OUT_CH_6; 2640 val |= RT5663_TDM_OUT_CH_6;
2640 break; 2641 break;
2641 case 8: 2642 case 8:
2642 val |= RT5668_TDM_IN_CH_8; 2643 val |= RT5663_TDM_IN_CH_8;
2643 val |= RT5668_TDM_OUT_CH_8; 2644 val |= RT5663_TDM_OUT_CH_8;
2644 break; 2645 break;
2645 case 2: 2646 case 2:
2646 break; 2647 break;
@@ -2650,16 +2651,16 @@ static int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2650 2651
2651 switch (slot_width) { 2652 switch (slot_width) {
2652 case 20: 2653 case 20:
2653 val |= RT5668_TDM_IN_LEN_20; 2654 val |= RT5663_TDM_IN_LEN_20;
2654 val |= RT5668_TDM_OUT_LEN_20; 2655 val |= RT5663_TDM_OUT_LEN_20;
2655 break; 2656 break;
2656 case 24: 2657 case 24:
2657 val |= RT5668_TDM_IN_LEN_24; 2658 val |= RT5663_TDM_IN_LEN_24;
2658 val |= RT5668_TDM_OUT_LEN_24; 2659 val |= RT5663_TDM_OUT_LEN_24;
2659 break; 2660 break;
2660 case 32: 2661 case 32:
2661 val |= RT5668_TDM_IN_LEN_32; 2662 val |= RT5663_TDM_IN_LEN_32;
2662 val |= RT5668_TDM_OUT_LEN_32; 2663 val |= RT5663_TDM_OUT_LEN_32;
2663 break; 2664 break;
2664 case 16: 2665 case 16:
2665 break; 2666 break;
@@ -2667,21 +2668,21 @@ static int rt5663_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
2667 return -EINVAL; 2668 return -EINVAL;
2668 } 2669 }
2669 2670
2670 switch (rt5663->codec_type) { 2671 switch (rt5663->codec_ver) {
2671 case CODEC_TYPE_RT5668: 2672 case CODEC_VER_1:
2672 reg = RT5663_TDM_2; 2673 reg = RT5663_TDM_2;
2673 break; 2674 break;
2674 case CODEC_TYPE_RT5663: 2675 case CODEC_VER_0:
2675 reg = RT5663_TDM_1; 2676 reg = RT5663_TDM_1;
2676 break; 2677 break;
2677 default: 2678 default:
2678 dev_err(codec->dev, "Unknown CODEC_TYPE\n"); 2679 dev_err(codec->dev, "Unknown CODEC Version\n");
2679 return -EINVAL; 2680 return -EINVAL;
2680 } 2681 }
2681 2682
2682 snd_soc_update_bits(codec, reg, RT5668_TDM_MODE_MASK | 2683 snd_soc_update_bits(codec, reg, RT5663_TDM_MODE_MASK |
2683 RT5668_TDM_IN_CH_MASK | RT5668_TDM_OUT_CH_MASK | 2684 RT5663_TDM_IN_CH_MASK | RT5663_TDM_OUT_CH_MASK |
2684 RT5668_TDM_IN_LEN_MASK | RT5668_TDM_OUT_LEN_MASK, val); 2685 RT5663_TDM_IN_LEN_MASK | RT5663_TDM_OUT_LEN_MASK, val);
2685 2686
2686 return 0; 2687 return 0;
2687} 2688}
@@ -2694,8 +2695,8 @@ static int rt5663_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
2694 2695
2695 dev_dbg(codec->dev, "%s ratio = %d\n", __func__, ratio); 2696 dev_dbg(codec->dev, "%s ratio = %d\n", __func__, ratio);
2696 2697
2697 if (rt5663->codec_type == CODEC_TYPE_RT5668) 2698 if (rt5663->codec_ver == CODEC_VER_1)
2698 reg = RT5668_TDM_8; 2699 reg = RT5663_TDM_9;
2699 else 2700 else
2700 reg = RT5663_TDM_5; 2701 reg = RT5663_TDM_5;
2701 2702
@@ -2736,47 +2737,47 @@ static int rt5663_set_bias_level(struct snd_soc_codec *codec,
2736 switch (level) { 2737 switch (level) {
2737 case SND_SOC_BIAS_ON: 2738 case SND_SOC_BIAS_ON:
2738 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, 2739 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1,
2739 RT5668_PWR_FV1_MASK | RT5668_PWR_FV2_MASK, 2740 RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK,
2740 RT5668_PWR_FV1 | RT5668_PWR_FV2); 2741 RT5663_PWR_FV1 | RT5663_PWR_FV2);
2741 break; 2742 break;
2742 2743
2743 case SND_SOC_BIAS_PREPARE: 2744 case SND_SOC_BIAS_PREPARE:
2744 if (rt5663->codec_type == CODEC_TYPE_RT5668) { 2745 if (rt5663->codec_ver == CODEC_VER_1) {
2745 snd_soc_update_bits(codec, RT5663_DIG_MISC, 2746 snd_soc_update_bits(codec, RT5663_DIG_MISC,
2746 RT5668_DIG_GATE_CTRL_MASK, 2747 RT5663_DIG_GATE_CTRL_MASK,
2747 RT5668_DIG_GATE_CTRL_EN); 2748 RT5663_DIG_GATE_CTRL_EN);
2748 snd_soc_update_bits(codec, RT5663_SIG_CLK_DET, 2749 snd_soc_update_bits(codec, RT5663_SIG_CLK_DET,
2749 RT5668_EN_ANA_CLK_DET_MASK | 2750 RT5663_EN_ANA_CLK_DET_MASK |
2750 RT5668_PWR_CLK_DET_MASK, 2751 RT5663_PWR_CLK_DET_MASK,
2751 RT5668_EN_ANA_CLK_DET_AUTO | 2752 RT5663_EN_ANA_CLK_DET_AUTO |
2752 RT5668_PWR_CLK_DET_EN); 2753 RT5663_PWR_CLK_DET_EN);
2753 } 2754 }
2754 break; 2755 break;
2755 2756
2756 case SND_SOC_BIAS_STANDBY: 2757 case SND_SOC_BIAS_STANDBY:
2757 if (rt5663->codec_type == CODEC_TYPE_RT5668) 2758 if (rt5663->codec_ver == CODEC_VER_1)
2758 snd_soc_update_bits(codec, RT5663_DIG_MISC, 2759 snd_soc_update_bits(codec, RT5663_DIG_MISC,
2759 RT5668_DIG_GATE_CTRL_MASK, 2760 RT5663_DIG_GATE_CTRL_MASK,
2760 RT5668_DIG_GATE_CTRL_DIS); 2761 RT5663_DIG_GATE_CTRL_DIS);
2761 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, 2762 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1,
2762 RT5668_PWR_VREF1_MASK | RT5668_PWR_VREF2_MASK | 2763 RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK |
2763 RT5668_PWR_FV1_MASK | RT5668_PWR_FV2_MASK | 2764 RT5663_PWR_FV1_MASK | RT5663_PWR_FV2_MASK |
2764 RT5668_PWR_MB_MASK, RT5668_PWR_VREF1 | 2765 RT5663_PWR_MB_MASK, RT5663_PWR_VREF1 |
2765 RT5668_PWR_VREF2 | RT5668_PWR_MB); 2766 RT5663_PWR_VREF2 | RT5663_PWR_MB);
2766 usleep_range(10000, 10005); 2767 usleep_range(10000, 10005);
2767 if (rt5663->codec_type == CODEC_TYPE_RT5668) { 2768 if (rt5663->codec_ver == CODEC_VER_1) {
2768 snd_soc_update_bits(codec, RT5663_SIG_CLK_DET, 2769 snd_soc_update_bits(codec, RT5663_SIG_CLK_DET,
2769 RT5668_EN_ANA_CLK_DET_MASK | 2770 RT5663_EN_ANA_CLK_DET_MASK |
2770 RT5668_PWR_CLK_DET_MASK, 2771 RT5663_PWR_CLK_DET_MASK,
2771 RT5668_EN_ANA_CLK_DET_DIS | 2772 RT5663_EN_ANA_CLK_DET_DIS |
2772 RT5668_PWR_CLK_DET_DIS); 2773 RT5663_PWR_CLK_DET_DIS);
2773 } 2774 }
2774 break; 2775 break;
2775 2776
2776 case SND_SOC_BIAS_OFF: 2777 case SND_SOC_BIAS_OFF:
2777 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1, 2778 snd_soc_update_bits(codec, RT5663_PWR_ANLG_1,
2778 RT5668_PWR_VREF1_MASK | RT5668_PWR_VREF2_MASK | 2779 RT5663_PWR_VREF1_MASK | RT5663_PWR_VREF2_MASK |
2779 RT5668_PWR_FV1 | RT5668_PWR_FV2, 0x0); 2780 RT5663_PWR_FV1 | RT5663_PWR_FV2, 0x0);
2780 break; 2781 break;
2781 2782
2782 default: 2783 default:
@@ -2793,18 +2794,18 @@ static int rt5663_probe(struct snd_soc_codec *codec)
2793 2794
2794 rt5663->codec = codec; 2795 rt5663->codec = codec;
2795 2796
2796 switch (rt5663->codec_type) { 2797 switch (rt5663->codec_ver) {
2797 case CODEC_TYPE_RT5668: 2798 case CODEC_VER_1:
2798 snd_soc_dapm_new_controls(dapm, 2799 snd_soc_dapm_new_controls(dapm,
2799 rt5668_specific_dapm_widgets, 2800 rt5663_v2_specific_dapm_widgets,
2800 ARRAY_SIZE(rt5668_specific_dapm_widgets)); 2801 ARRAY_SIZE(rt5663_v2_specific_dapm_widgets));
2801 snd_soc_dapm_add_routes(dapm, 2802 snd_soc_dapm_add_routes(dapm,
2802 rt5668_specific_dapm_routes, 2803 rt5663_v2_specific_dapm_routes,
2803 ARRAY_SIZE(rt5668_specific_dapm_routes)); 2804 ARRAY_SIZE(rt5663_v2_specific_dapm_routes));
2804 snd_soc_add_codec_controls(codec, rt5668_specific_controls, 2805 snd_soc_add_codec_controls(codec, rt5663_v2_specific_controls,
2805 ARRAY_SIZE(rt5668_specific_controls)); 2806 ARRAY_SIZE(rt5663_v2_specific_controls));
2806 break; 2807 break;
2807 case CODEC_TYPE_RT5663: 2808 case CODEC_VER_0:
2808 snd_soc_dapm_new_controls(dapm, 2809 snd_soc_dapm_new_controls(dapm,
2809 rt5663_specific_dapm_widgets, 2810 rt5663_specific_dapm_widgets,
2810 ARRAY_SIZE(rt5663_specific_dapm_widgets)); 2811 ARRAY_SIZE(rt5663_specific_dapm_widgets));
@@ -2905,16 +2906,16 @@ static struct snd_soc_codec_driver soc_codec_dev_rt5663 = {
2905 } 2906 }
2906}; 2907};
2907 2908
2908static const struct regmap_config rt5668_regmap = { 2909static const struct regmap_config rt5663_v2_regmap = {
2909 .reg_bits = 16, 2910 .reg_bits = 16,
2910 .val_bits = 16, 2911 .val_bits = 16,
2911 .use_single_rw = true, 2912 .use_single_rw = true,
2912 .max_register = 0x07fa, 2913 .max_register = 0x07fa,
2913 .volatile_reg = rt5668_volatile_register, 2914 .volatile_reg = rt5663_v2_volatile_register,
2914 .readable_reg = rt5668_readable_register, 2915 .readable_reg = rt5663_v2_readable_register,
2915 .cache_type = REGCACHE_RBTREE, 2916 .cache_type = REGCACHE_RBTREE,
2916 .reg_defaults = rt5668_reg, 2917 .reg_defaults = rt5663_v2_reg,
2917 .num_reg_defaults = ARRAY_SIZE(rt5668_reg), 2918 .num_reg_defaults = ARRAY_SIZE(rt5663_v2_reg),
2918}; 2919};
2919 2920
2920static const struct regmap_config rt5663_regmap = { 2921static const struct regmap_config rt5663_regmap = {
@@ -2939,7 +2940,6 @@ static const struct regmap_config temp_regmap = {
2939}; 2940};
2940 2941
2941static const struct i2c_device_id rt5663_i2c_id[] = { 2942static const struct i2c_device_id rt5663_i2c_id[] = {
2942 { "rt5668", 0 },
2943 { "rt5663", 0 }, 2943 { "rt5663", 0 },
2944 {} 2944 {}
2945}; 2945};
@@ -2947,7 +2947,6 @@ MODULE_DEVICE_TABLE(i2c, rt5663_i2c_id);
2947 2947
2948#if defined(CONFIG_OF) 2948#if defined(CONFIG_OF)
2949static const struct of_device_id rt5663_of_match[] = { 2949static const struct of_device_id rt5663_of_match[] = {
2950 { .compatible = "realtek,rt5668", },
2951 { .compatible = "realtek,rt5663", }, 2950 { .compatible = "realtek,rt5663", },
2952 {}, 2951 {},
2953}; 2952};
@@ -2956,80 +2955,79 @@ MODULE_DEVICE_TABLE(of, rt5663_of_match);
2956 2955
2957#ifdef CONFIG_ACPI 2956#ifdef CONFIG_ACPI
2958static struct acpi_device_id rt5663_acpi_match[] = { 2957static struct acpi_device_id rt5663_acpi_match[] = {
2959 { "10EC5668", 0},
2960 { "10EC5663", 0}, 2958 { "10EC5663", 0},
2961 {}, 2959 {},
2962}; 2960};
2963MODULE_DEVICE_TABLE(acpi, rt5663_acpi_match); 2961MODULE_DEVICE_TABLE(acpi, rt5663_acpi_match);
2964#endif 2962#endif
2965 2963
2966static void rt5668_calibrate(struct rt5663_priv *rt5668) 2964static void rt5663_v2_calibrate(struct rt5663_priv *rt5663)
2967{ 2965{
2968 regmap_write(rt5668->regmap, RT5663_BIAS_CUR_8, 0xa402); 2966 regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0xa402);
2969 regmap_write(rt5668->regmap, RT5663_PWR_DIG_1, 0x0100); 2967 regmap_write(rt5663->regmap, RT5663_PWR_DIG_1, 0x0100);
2970 regmap_write(rt5668->regmap, RT5663_RECMIX, 0x4040); 2968 regmap_write(rt5663->regmap, RT5663_RECMIX, 0x4040);
2971 regmap_write(rt5668->regmap, RT5663_DIG_MISC, 0x0001); 2969 regmap_write(rt5663->regmap, RT5663_DIG_MISC, 0x0001);
2972 regmap_write(rt5668->regmap, RT5663_RC_CLK, 0x0380); 2970 regmap_write(rt5663->regmap, RT5663_RC_CLK, 0x0380);
2973 regmap_write(rt5668->regmap, RT5663_GLB_CLK, 0x8000); 2971 regmap_write(rt5663->regmap, RT5663_GLB_CLK, 0x8000);
2974 regmap_write(rt5668->regmap, RT5663_ADDA_CLK_1, 0x1000); 2972 regmap_write(rt5663->regmap, RT5663_ADDA_CLK_1, 0x1000);
2975 regmap_write(rt5668->regmap, RT5663_CHOP_DAC_L, 0x3030); 2973 regmap_write(rt5663->regmap, RT5663_CHOP_DAC_L, 0x3030);
2976 regmap_write(rt5668->regmap, RT5663_CALIB_ADC, 0x3c05); 2974 regmap_write(rt5663->regmap, RT5663_CALIB_ADC, 0x3c05);
2977 regmap_write(rt5668->regmap, RT5663_PWR_ANLG_1, 0xa23e); 2975 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xa23e);
2978 msleep(40); 2976 msleep(40);
2979 regmap_write(rt5668->regmap, RT5663_PWR_ANLG_1, 0xf23e); 2977 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xf23e);
2980 regmap_write(rt5668->regmap, RT5663_HP_CALIB_2, 0x0321); 2978 regmap_write(rt5663->regmap, RT5663_HP_CALIB_2, 0x0321);
2981 regmap_write(rt5668->regmap, RT5663_HP_CALIB_1, 0xfc00); 2979 regmap_write(rt5663->regmap, RT5663_HP_CALIB_1, 0xfc00);
2982 msleep(500); 2980 msleep(500);
2983} 2981}
2984 2982
2985static void rt5663_calibrate(struct rt5663_priv *rt5668) 2983static void rt5663_calibrate(struct rt5663_priv *rt5663)
2986{ 2984{
2987 int value, count; 2985 int value, count;
2988 2986
2989 regmap_write(rt5668->regmap, RT5663_RC_CLK, 0x0280); 2987 regmap_write(rt5663->regmap, RT5663_RC_CLK, 0x0280);
2990 regmap_write(rt5668->regmap, RT5663_GLB_CLK, 0x8000); 2988 regmap_write(rt5663->regmap, RT5663_GLB_CLK, 0x8000);
2991 regmap_write(rt5668->regmap, RT5663_DIG_MISC, 0x8001); 2989 regmap_write(rt5663->regmap, RT5663_DIG_MISC, 0x8001);
2992 regmap_write(rt5668->regmap, RT5663_VREF_RECMIX, 0x0032); 2990 regmap_write(rt5663->regmap, RT5663_VREF_RECMIX, 0x0032);
2993 regmap_write(rt5668->regmap, RT5663_PWR_ANLG_1, 0xa2be); 2991 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xa2be);
2994 msleep(20); 2992 msleep(20);
2995 regmap_write(rt5668->regmap, RT5663_PWR_ANLG_1, 0xf2be); 2993 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xf2be);
2996 regmap_write(rt5668->regmap, RT5663_PWR_DIG_2, 0x8400); 2994 regmap_write(rt5663->regmap, RT5663_PWR_DIG_2, 0x8400);
2997 regmap_write(rt5668->regmap, RT5663_CHOP_ADC, 0x3000); 2995 regmap_write(rt5663->regmap, RT5663_CHOP_ADC, 0x3000);
2998 regmap_write(rt5668->regmap, RT5663_DEPOP_1, 0x003b); 2996 regmap_write(rt5663->regmap, RT5663_DEPOP_1, 0x003b);
2999 regmap_write(rt5668->regmap, RT5663_PWR_DIG_1, 0x8df8); 2997 regmap_write(rt5663->regmap, RT5663_PWR_DIG_1, 0x8df8);
3000 regmap_write(rt5668->regmap, RT5663_PWR_ANLG_2, 0x0003); 2998 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_2, 0x0003);
3001 regmap_write(rt5668->regmap, RT5663_PWR_ANLG_3, 0x018c); 2999 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_3, 0x018c);
3002 regmap_write(rt5668->regmap, RT5663_ADDA_CLK_1, 0x1111); 3000 regmap_write(rt5663->regmap, RT5663_ADDA_CLK_1, 0x1111);
3003 regmap_write(rt5668->regmap, RT5663_PRE_DIV_GATING_1, 0xffff); 3001 regmap_write(rt5663->regmap, RT5663_PRE_DIV_GATING_1, 0xffff);
3004 regmap_write(rt5668->regmap, RT5663_PRE_DIV_GATING_2, 0xffff); 3002 regmap_write(rt5663->regmap, RT5663_PRE_DIV_GATING_2, 0xffff);
3005 regmap_write(rt5668->regmap, RT5663_DEPOP_2, 0x3003); 3003 regmap_write(rt5663->regmap, RT5663_DEPOP_2, 0x3003);
3006 regmap_write(rt5668->regmap, RT5663_DEPOP_1, 0x003b); 3004 regmap_write(rt5663->regmap, RT5663_DEPOP_1, 0x003b);
3007 regmap_write(rt5668->regmap, RT5663_HP_CHARGE_PUMP_1, 0x1e32); 3005 regmap_write(rt5663->regmap, RT5663_HP_CHARGE_PUMP_1, 0x1e32);
3008 regmap_write(rt5668->regmap, RT5663_HP_CHARGE_PUMP_2, 0x1371); 3006 regmap_write(rt5663->regmap, RT5663_HP_CHARGE_PUMP_2, 0x1371);
3009 regmap_write(rt5668->regmap, RT5663_DACREF_LDO, 0x3b0b); 3007 regmap_write(rt5663->regmap, RT5663_DACREF_LDO, 0x3b0b);
3010 regmap_write(rt5668->regmap, RT5663_STO_DAC_MIXER, 0x2080); 3008 regmap_write(rt5663->regmap, RT5663_STO_DAC_MIXER, 0x2080);
3011 regmap_write(rt5668->regmap, RT5663_BYPASS_STO_DAC, 0x000c); 3009 regmap_write(rt5663->regmap, RT5663_BYPASS_STO_DAC, 0x000c);
3012 regmap_write(rt5668->regmap, RT5663_HP_BIAS, 0xabba); 3010 regmap_write(rt5663->regmap, RT5663_HP_BIAS, 0xabba);
3013 regmap_write(rt5668->regmap, RT5663_CHARGE_PUMP_1, 0x2224); 3011 regmap_write(rt5663->regmap, RT5663_CHARGE_PUMP_1, 0x2224);
3014 regmap_write(rt5668->regmap, RT5663_HP_OUT_EN, 0x8088); 3012 regmap_write(rt5663->regmap, RT5663_HP_OUT_EN, 0x8088);
3015 regmap_write(rt5668->regmap, RT5663_STO_DRE_9, 0x0017); 3013 regmap_write(rt5663->regmap, RT5663_STO_DRE_9, 0x0017);
3016 regmap_write(rt5668->regmap, RT5663_STO_DRE_10, 0x0017); 3014 regmap_write(rt5663->regmap, RT5663_STO_DRE_10, 0x0017);
3017 regmap_write(rt5668->regmap, RT5663_STO1_ADC_MIXER, 0x4040); 3015 regmap_write(rt5663->regmap, RT5663_STO1_ADC_MIXER, 0x4040);
3018 regmap_write(rt5668->regmap, RT5663_RECMIX, 0x0005); 3016 regmap_write(rt5663->regmap, RT5663_RECMIX, 0x0005);
3019 regmap_write(rt5668->regmap, RT5663_ADDA_RST, 0xc000); 3017 regmap_write(rt5663->regmap, RT5663_ADDA_RST, 0xc000);
3020 regmap_write(rt5668->regmap, RT5663_STO1_HPF_ADJ1, 0x3320); 3018 regmap_write(rt5663->regmap, RT5663_STO1_HPF_ADJ1, 0x3320);
3021 regmap_write(rt5668->regmap, RT5663_HP_CALIB_2, 0x00c9); 3019 regmap_write(rt5663->regmap, RT5663_HP_CALIB_2, 0x00c9);
3022 regmap_write(rt5668->regmap, RT5663_DUMMY_1, 0x004c); 3020 regmap_write(rt5663->regmap, RT5663_DUMMY_1, 0x004c);
3023 regmap_write(rt5668->regmap, RT5663_ANA_BIAS_CUR_1, 0x7766); 3021 regmap_write(rt5663->regmap, RT5663_ANA_BIAS_CUR_1, 0x7766);
3024 regmap_write(rt5668->regmap, RT5663_BIAS_CUR_8, 0x4702); 3022 regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0x4702);
3025 msleep(200); 3023 msleep(200);
3026 regmap_write(rt5668->regmap, RT5663_HP_CALIB_1, 0x0069); 3024 regmap_write(rt5663->regmap, RT5663_HP_CALIB_1, 0x0069);
3027 regmap_write(rt5668->regmap, RT5663_HP_CALIB_3, 0x06c2); 3025 regmap_write(rt5663->regmap, RT5663_HP_CALIB_3, 0x06c2);
3028 regmap_write(rt5668->regmap, RT5663_HP_CALIB_1_1, 0x7b00); 3026 regmap_write(rt5663->regmap, RT5663_HP_CALIB_1_1, 0x7b00);
3029 regmap_write(rt5668->regmap, RT5663_HP_CALIB_1_1, 0xfb00); 3027 regmap_write(rt5663->regmap, RT5663_HP_CALIB_1_1, 0xfb00);
3030 count = 0; 3028 count = 0;
3031 while (true) { 3029 while (true) {
3032 regmap_read(rt5668->regmap, RT5663_HP_CALIB_1_1, &value); 3030 regmap_read(rt5663->regmap, RT5663_HP_CALIB_1_1, &value);
3033 if (value & 0x8000) 3031 if (value & 0x8000)
3034 usleep_range(10000, 10005); 3032 usleep_range(10000, 10005);
3035 else 3033 else
@@ -3066,17 +3064,17 @@ static int rt5663_i2c_probe(struct i2c_client *i2c,
3066 } 3064 }
3067 regmap_read(regmap, RT5663_VENDOR_ID_2, &val); 3065 regmap_read(regmap, RT5663_VENDOR_ID_2, &val);
3068 switch (val) { 3066 switch (val) {
3069 case RT5668_DEVICE_ID: 3067 case RT5663_DEVICE_ID_2:
3070 rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5668_regmap); 3068 rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5663_v2_regmap);
3071 rt5663->codec_type = CODEC_TYPE_RT5668; 3069 rt5663->codec_ver = CODEC_VER_1;
3072 break; 3070 break;
3073 case RT5663_DEVICE_ID: 3071 case RT5663_DEVICE_ID_1:
3074 rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5663_regmap); 3072 rt5663->regmap = devm_regmap_init_i2c(i2c, &rt5663_regmap);
3075 rt5663->codec_type = CODEC_TYPE_RT5663; 3073 rt5663->codec_ver = CODEC_VER_0;
3076 break; 3074 break;
3077 default: 3075 default:
3078 dev_err(&i2c->dev, 3076 dev_err(&i2c->dev,
3079 "Device with ID register %#x is not rt5663 or rt5668\n", 3077 "Device with ID register %#x is not rt5663\n",
3080 val); 3078 val);
3081 return -ENODEV; 3079 return -ENODEV;
3082 } 3080 }
@@ -3091,11 +3089,11 @@ static int rt5663_i2c_probe(struct i2c_client *i2c,
3091 /* reset and calibrate */ 3089 /* reset and calibrate */
3092 regmap_write(rt5663->regmap, RT5663_RESET, 0); 3090 regmap_write(rt5663->regmap, RT5663_RESET, 0);
3093 regcache_cache_bypass(rt5663->regmap, true); 3091 regcache_cache_bypass(rt5663->regmap, true);
3094 switch (rt5663->codec_type) { 3092 switch (rt5663->codec_ver) {
3095 case CODEC_TYPE_RT5668: 3093 case CODEC_VER_1:
3096 rt5668_calibrate(rt5663); 3094 rt5663_v2_calibrate(rt5663);
3097 break; 3095 break;
3098 case CODEC_TYPE_RT5663: 3096 case CODEC_VER_0:
3099 rt5663_calibrate(rt5663); 3097 rt5663_calibrate(rt5663);
3100 break; 3098 break;
3101 default: 3099 default:
@@ -3106,46 +3104,55 @@ static int rt5663_i2c_probe(struct i2c_client *i2c,
3106 dev_dbg(&i2c->dev, "calibrate done\n"); 3104 dev_dbg(&i2c->dev, "calibrate done\n");
3107 3105
3108 /* GPIO1 as IRQ */ 3106 /* GPIO1 as IRQ */
3109 regmap_update_bits(rt5663->regmap, RT5663_GPIO_1, RT5668_GP1_PIN_MASK, 3107 regmap_update_bits(rt5663->regmap, RT5663_GPIO_1, RT5663_GP1_PIN_MASK,
3110 RT5668_GP1_PIN_IRQ); 3108 RT5663_GP1_PIN_IRQ);
3111 /* 4btn inline command debounce */ 3109 /* 4btn inline command debounce */
3112 regmap_update_bits(rt5663->regmap, RT5663_IL_CMD_5, 3110 regmap_update_bits(rt5663->regmap, RT5663_IL_CMD_5,
3113 RT5668_4BTN_CLK_DEB_MASK, RT5668_4BTN_CLK_DEB_65MS); 3111 RT5663_4BTN_CLK_DEB_MASK, RT5663_4BTN_CLK_DEB_65MS);
3114 3112
3115 switch (rt5663->codec_type) { 3113 switch (rt5663->codec_ver) {
3116 case CODEC_TYPE_RT5668: 3114 case CODEC_VER_1:
3117 regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0xa402); 3115 regmap_write(rt5663->regmap, RT5663_BIAS_CUR_8, 0xa402);
3118 /* JD1 */ 3116 /* JD1 */
3119 regmap_update_bits(rt5663->regmap, RT5663_AUTO_1MRC_CLK, 3117 regmap_update_bits(rt5663->regmap, RT5663_AUTO_1MRC_CLK,
3120 RT5668_IRQ_POW_SAV_MASK | RT5668_IRQ_POW_SAV_JD1_MASK, 3118 RT5663_IRQ_POW_SAV_MASK | RT5663_IRQ_POW_SAV_JD1_MASK,
3121 RT5668_IRQ_POW_SAV_EN | RT5668_IRQ_POW_SAV_JD1_EN); 3119 RT5663_IRQ_POW_SAV_EN | RT5663_IRQ_POW_SAV_JD1_EN);
3122 regmap_update_bits(rt5663->regmap, RT5663_PWR_ANLG_2, 3120 regmap_update_bits(rt5663->regmap, RT5663_PWR_ANLG_2,
3123 RT5668_PWR_JD1_MASK, RT5668_PWR_JD1); 3121 RT5663_PWR_JD1_MASK, RT5663_PWR_JD1);
3124 regmap_update_bits(rt5663->regmap, RT5663_IRQ_1, 3122 regmap_update_bits(rt5663->regmap, RT5663_IRQ_1,
3125 RT5668_EN_CB_JD_MASK, RT5668_EN_CB_JD_EN); 3123 RT5663_EN_CB_JD_MASK, RT5663_EN_CB_JD_EN);
3126 3124
3127 regmap_update_bits(rt5663->regmap, RT5663_HP_LOGIC_2, 3125 regmap_update_bits(rt5663->regmap, RT5663_HP_LOGIC_2,
3128 RT5668_HP_SIG_SRC1_MASK, RT5668_HP_SIG_SRC1_REG); 3126 RT5663_HP_SIG_SRC1_MASK, RT5663_HP_SIG_SRC1_REG);
3129 regmap_update_bits(rt5663->regmap, RT5663_RECMIX, 3127 regmap_update_bits(rt5663->regmap, RT5663_RECMIX,
3130 RT5668_VREF_BIAS_MASK | RT5668_CBJ_DET_MASK | 3128 RT5663_VREF_BIAS_MASK | RT5663_CBJ_DET_MASK |
3131 RT5668_DET_TYPE_MASK, RT5668_VREF_BIAS_REG | 3129 RT5663_DET_TYPE_MASK, RT5663_VREF_BIAS_REG |
3132 RT5668_CBJ_DET_EN | RT5668_DET_TYPE_QFN); 3130 RT5663_CBJ_DET_EN | RT5663_DET_TYPE_QFN);
3133 /* Set GPIO4 and GPIO8 as input for combo jack */ 3131 /* Set GPIO4 and GPIO8 as input for combo jack */
3134 regmap_update_bits(rt5663->regmap, RT5663_GPIO_2, 3132 regmap_update_bits(rt5663->regmap, RT5663_GPIO_2,
3135 RT5668_GP4_PIN_CONF_MASK, RT5668_GP4_PIN_CONF_INPUT); 3133 RT5663_GP4_PIN_CONF_MASK, RT5663_GP4_PIN_CONF_INPUT);
3136 regmap_update_bits(rt5663->regmap, RT5668_GPIO_3, 3134 regmap_update_bits(rt5663->regmap, RT5663_GPIO_3,
3137 RT5668_GP8_PIN_CONF_MASK, RT5668_GP8_PIN_CONF_INPUT); 3135 RT5663_GP8_PIN_CONF_MASK, RT5663_GP8_PIN_CONF_INPUT);
3138 regmap_update_bits(rt5663->regmap, RT5663_PWR_ANLG_1, 3136 regmap_update_bits(rt5663->regmap, RT5663_PWR_ANLG_1,
3139 RT5668_LDO1_DVO_MASK | RT5668_AMP_HP_MASK, 3137 RT5663_LDO1_DVO_MASK | RT5663_AMP_HP_MASK,
3140 RT5668_LDO1_DVO_0_9V | RT5668_AMP_HP_3X); 3138 RT5663_LDO1_DVO_0_9V | RT5663_AMP_HP_3X);
3141 break; 3139 break;
3142 case CODEC_TYPE_RT5663: 3140 case CODEC_VER_0:
3141 regmap_update_bits(rt5663->regmap, RT5663_DIG_MISC,
3142 RT5663_DIG_GATE_CTRL_MASK, RT5663_DIG_GATE_CTRL_EN);
3143 regmap_update_bits(rt5663->regmap, RT5663_AUTO_1MRC_CLK,
3144 RT5663_IRQ_POW_SAV_MASK, RT5663_IRQ_POW_SAV_EN);
3145 regmap_update_bits(rt5663->regmap, RT5663_IRQ_1,
3146 RT5663_EN_IRQ_JD1_MASK, RT5663_EN_IRQ_JD1_EN);
3147 regmap_update_bits(rt5663->regmap, RT5663_GPIO_1,
3148 RT5663_GPIO1_TYPE_MASK, RT5663_GPIO1_TYPE_EN);
3143 regmap_write(rt5663->regmap, RT5663_VREF_RECMIX, 0x0032); 3149 regmap_write(rt5663->regmap, RT5663_VREF_RECMIX, 0x0032);
3144 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xa2be); 3150 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xa2be);
3145 msleep(20); 3151 msleep(20);
3146 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xf2be); 3152 regmap_write(rt5663->regmap, RT5663_PWR_ANLG_1, 0xf2be);
3147 regmap_update_bits(rt5663->regmap, RT5663_GPIO_2, 3153 regmap_update_bits(rt5663->regmap, RT5663_GPIO_2,
3148 RT5663_GP1_PIN_CONF_MASK, RT5663_GP1_PIN_CONF_OUTPUT); 3154 RT5663_GP1_PIN_CONF_MASK | RT5663_SEL_GPIO1_MASK,
3155 RT5663_GP1_PIN_CONF_OUTPUT | RT5663_SEL_GPIO1_EN);
3149 /* DACREF LDO control */ 3156 /* DACREF LDO control */
3150 regmap_update_bits(rt5663->regmap, RT5663_DACREF_LDO, 0x3e0e, 3157 regmap_update_bits(rt5663->regmap, RT5663_DACREF_LDO, 0x3e0e,
3151 0x3a0a); 3158 0x3a0a);
diff --git a/sound/soc/codecs/rt5663.h b/sound/soc/codecs/rt5663.h
index 2cc8f28080f6..d77fae619f2f 100644
--- a/sound/soc/codecs/rt5663.h
+++ b/sound/soc/codecs/rt5663.h
@@ -18,655 +18,652 @@
18#define RT5663_VENDOR_ID_1 0x00fe 18#define RT5663_VENDOR_ID_1 0x00fe
19#define RT5663_VENDOR_ID_2 0x00ff 19#define RT5663_VENDOR_ID_2 0x00ff
20 20
21#define RT5668_LOUT_CTRL 0x0001 21#define RT5663_LOUT_CTRL 0x0001
22#define RT5668_HP_AMP_2 0x0003 22#define RT5663_HP_AMP_2 0x0003
23#define RT5668_MONO_OUT 0x0004 23#define RT5663_MONO_OUT 0x0004
24#define RT5668_MONO_GAIN 0x0007 24#define RT5663_MONO_GAIN 0x0007
25 25
26#define RT5668_AEC_BST 0x000b 26#define RT5663_AEC_BST 0x000b
27#define RT5668_IN1_IN2 0x000c 27#define RT5663_IN1_IN2 0x000c
28#define RT5668_IN3_IN4 0x000d 28#define RT5663_IN3_IN4 0x000d
29#define RT5668_INL1_INR1 0x000f 29#define RT5663_INL1_INR1 0x000f
30#define RT5668_CBJ_TYPE_2 0x0011 30#define RT5663_CBJ_TYPE_2 0x0011
31#define RT5668_CBJ_TYPE_3 0x0012 31#define RT5663_CBJ_TYPE_3 0x0012
32#define RT5668_CBJ_TYPE_4 0x0013 32#define RT5663_CBJ_TYPE_4 0x0013
33#define RT5668_CBJ_TYPE_5 0x0014 33#define RT5663_CBJ_TYPE_5 0x0014
34#define RT5668_CBJ_TYPE_8 0x0017 34#define RT5663_CBJ_TYPE_8 0x0017
35 35
36/* I/O - ADC/DAC/DMIC */ 36/* I/O - ADC/DAC/DMIC */
37#define RT5668_DAC3_DIG_VOL 0x001a 37#define RT5663_DAC3_DIG_VOL 0x001a
38#define RT5668_DAC3_CTRL 0x001b 38#define RT5663_DAC3_CTRL 0x001b
39#define RT5668_MONO_ADC_DIG_VOL 0x001d 39#define RT5663_MONO_ADC_DIG_VOL 0x001d
40#define RT5668_STO2_ADC_DIG_VOL 0x001e 40#define RT5663_STO2_ADC_DIG_VOL 0x001e
41#define RT5668_MONO_ADC_BST_GAIN 0x0020 41#define RT5663_MONO_ADC_BST_GAIN 0x0020
42#define RT5668_STO2_ADC_BST_GAIN 0x0021 42#define RT5663_STO2_ADC_BST_GAIN 0x0021
43#define RT5668_SIDETONE_CTRL 0x0024 43#define RT5663_SIDETONE_CTRL 0x0024
44/* Mixer - D-D */ 44/* Mixer - D-D */
45#define RT5668_MONO1_ADC_MIXER 0x0027 45#define RT5663_MONO1_ADC_MIXER 0x0027
46#define RT5668_STO2_ADC_MIXER 0x0028 46#define RT5663_STO2_ADC_MIXER 0x0028
47#define RT5668_MONO_DAC_MIXER 0x002b 47#define RT5663_MONO_DAC_MIXER 0x002b
48#define RT5668_DAC2_SRC_CTRL 0x002e 48#define RT5663_DAC2_SRC_CTRL 0x002e
49#define RT5668_IF_3_4_DATA_CTL 0x002f 49#define RT5663_IF_3_4_DATA_CTL 0x002f
50#define RT5668_IF_5_DATA_CTL 0x0030 50#define RT5663_IF_5_DATA_CTL 0x0030
51#define RT5668_PDM_OUT_CTL 0x0031 51#define RT5663_PDM_OUT_CTL 0x0031
52#define RT5668_PDM_I2C_DATA_CTL1 0x0032 52#define RT5663_PDM_I2C_DATA_CTL1 0x0032
53#define RT5668_PDM_I2C_DATA_CTL2 0x0033 53#define RT5663_PDM_I2C_DATA_CTL2 0x0033
54#define RT5668_PDM_I2C_DATA_CTL3 0x0034 54#define RT5663_PDM_I2C_DATA_CTL3 0x0034
55#define RT5668_PDM_I2C_DATA_CTL4 0x0035 55#define RT5663_PDM_I2C_DATA_CTL4 0x0035
56 56
57/*Mixer - Analog*/ 57/*Mixer - Analog*/
58#define RT5668_RECMIX1_NEW 0x003a 58#define RT5663_RECMIX1_NEW 0x003a
59#define RT5668_RECMIX1L_0 0x003b 59#define RT5663_RECMIX1L_0 0x003b
60#define RT5668_RECMIX1L 0x003c 60#define RT5663_RECMIX1L 0x003c
61#define RT5668_RECMIX1R_0 0x003d 61#define RT5663_RECMIX1R_0 0x003d
62#define RT5668_RECMIX1R 0x003e 62#define RT5663_RECMIX1R 0x003e
63#define RT5668_RECMIX2_NEW 0x003f 63#define RT5663_RECMIX2_NEW 0x003f
64#define RT5668_RECMIX2_L_2 0x0041 64#define RT5663_RECMIX2_L_2 0x0041
65#define RT5668_RECMIX2_R 0x0042 65#define RT5663_RECMIX2_R 0x0042
66#define RT5668_RECMIX2_R_2 0x0043 66#define RT5663_RECMIX2_R_2 0x0043
67#define RT5668_CALIB_REC_LR 0x0044 67#define RT5663_CALIB_REC_LR 0x0044
68#define RT5668_ALC_BK_GAIN 0x0049 68#define RT5663_ALC_BK_GAIN 0x0049
69#define RT5668_MONOMIX_GAIN 0x004a 69#define RT5663_MONOMIX_GAIN 0x004a
70#define RT5668_MONOMIX_IN_GAIN 0x004b 70#define RT5663_MONOMIX_IN_GAIN 0x004b
71#define RT5668_OUT_MIXL_GAIN 0x004d 71#define RT5663_OUT_MIXL_GAIN 0x004d
72#define RT5668_OUT_LMIX_IN_GAIN 0x004e 72#define RT5663_OUT_LMIX_IN_GAIN 0x004e
73#define RT5668_OUT_RMIX_IN_GAIN 0x004f 73#define RT5663_OUT_RMIX_IN_GAIN 0x004f
74#define RT5668_OUT_RMIX_IN_GAIN1 0x0050 74#define RT5663_OUT_RMIX_IN_GAIN1 0x0050
75#define RT5668_LOUT_MIXER_CTRL 0x0052 75#define RT5663_LOUT_MIXER_CTRL 0x0052
76/* Power */ 76/* Power */
77#define RT5668_PWR_VOL 0x0067 77#define RT5663_PWR_VOL 0x0067
78 78
79#define RT5668_ADCDAC_RST 0x006d 79#define RT5663_ADCDAC_RST 0x006d
80/* Format - ADC/DAC */ 80/* Format - ADC/DAC */
81#define RT5668_I2S34_SDP 0x0071 81#define RT5663_I2S34_SDP 0x0071
82#define RT5668_I2S5_SDP 0x0072 82#define RT5663_I2S5_SDP 0x0072
83/* Format - TDM Control */
84#define RT5668_TDM_5 0x007c
85#define RT5668_TDM_6 0x007d
86#define RT5668_TDM_7 0x007e
87#define RT5668_TDM_8 0x007f
88 83
89/* Function - Analog */ 84/* Function - Analog */
90#define RT5668_ASRC_3 0x0085 85#define RT5663_ASRC_3 0x0085
91#define RT5668_ASRC_6 0x0088 86#define RT5663_ASRC_6 0x0088
92#define RT5668_ASRC_7 0x0089 87#define RT5663_ASRC_7 0x0089
93#define RT5668_PLL_TRK_13 0x0099 88#define RT5663_PLL_TRK_13 0x0099
94#define RT5668_I2S_M_CLK_CTL 0x00a0 89#define RT5663_I2S_M_CLK_CTL 0x00a0
95#define RT5668_FDIV_I2S34_M_CLK 0x00a1 90#define RT5663_FDIV_I2S34_M_CLK 0x00a1
96#define RT5668_FDIV_I2S34_M_CLK2 0x00a2 91#define RT5663_FDIV_I2S34_M_CLK2 0x00a2
97#define RT5668_FDIV_I2S5_M_CLK 0x00a3 92#define RT5663_FDIV_I2S5_M_CLK 0x00a3
98#define RT5668_FDIV_I2S5_M_CLK2 0x00a4 93#define RT5663_FDIV_I2S5_M_CLK2 0x00a4
99 94
100/* Function - Digital */ 95/* Function - Digital */
101#define RT5668_IRQ_4 0x00b9 96#define RT5663_V2_IRQ_4 0x00b9
102#define RT5668_GPIO_3 0x00c2 97#define RT5663_GPIO_3 0x00c2
103#define RT5668_GPIO_4 0x00c3 98#define RT5663_GPIO_4 0x00c3
104#define RT5668_GPIO_STA 0x00c4 99#define RT5663_GPIO_STA2 0x00c4
105#define RT5668_HP_AMP_DET1 0x00d0 100#define RT5663_HP_AMP_DET1 0x00d0
106#define RT5668_HP_AMP_DET2 0x00d1 101#define RT5663_HP_AMP_DET2 0x00d1
107#define RT5668_HP_AMP_DET3 0x00d2 102#define RT5663_HP_AMP_DET3 0x00d2
108#define RT5668_MID_BD_HP_AMP 0x00d3 103#define RT5663_MID_BD_HP_AMP 0x00d3
109#define RT5668_LOW_BD_HP_AMP 0x00d4 104#define RT5663_LOW_BD_HP_AMP 0x00d4
110#define RT5668_SOF_VOL_ZC2 0x00da 105#define RT5663_SOF_VOL_ZC2 0x00da
111#define RT5668_ADC_STO2_ADJ1 0x00ee 106#define RT5663_ADC_STO2_ADJ1 0x00ee
112#define RT5668_ADC_STO2_ADJ2 0x00ef 107#define RT5663_ADC_STO2_ADJ2 0x00ef
113/* General Control */ 108/* General Control */
114#define RT5668_A_JD_CTRL 0x00f0 109#define RT5663_A_JD_CTRL 0x00f0
115#define RT5668_JD1_TRES_CTRL 0x00f1 110#define RT5663_JD1_TRES_CTRL 0x00f1
116#define RT5668_JD2_TRES_CTRL 0x00f2 111#define RT5663_JD2_TRES_CTRL 0x00f2
117#define RT5668_JD_CTRL2 0x00f7 112#define RT5663_V2_JD_CTRL2 0x00f7
118#define RT5668_DUM_REG_2 0x00fb 113#define RT5663_DUM_REG_2 0x00fb
119#define RT5668_DUM_REG_3 0x00fc 114#define RT5663_DUM_REG_3 0x00fc
120 115
121 116
122#define RT5668_DACADC_DIG_VOL2 0x0101 117#define RT5663_DACADC_DIG_VOL2 0x0101
123#define RT5668_DIG_IN_PIN2 0x0133 118#define RT5663_DIG_IN_PIN2 0x0133
124#define RT5668_PAD_DRV_CTL1 0x0136 119#define RT5663_PAD_DRV_CTL1 0x0136
125#define RT5668_SOF_RAM_DEPOP 0x0138 120#define RT5663_SOF_RAM_DEPOP 0x0138
126#define RT5668_VOL_TEST 0x013f 121#define RT5663_VOL_TEST 0x013f
127#define RT5668_TEST_MODE_3 0x0147 122#define RT5663_MONO_DYNA_1 0x0170
128#define RT5668_TEST_MODE_4 0x0148 123#define RT5663_MONO_DYNA_2 0x0171
129#define RT5668_MONO_DYNA_1 0x0170 124#define RT5663_MONO_DYNA_3 0x0172
130#define RT5668_MONO_DYNA_2 0x0171 125#define RT5663_MONO_DYNA_4 0x0173
131#define RT5668_MONO_DYNA_3 0x0172 126#define RT5663_MONO_DYNA_5 0x0174
132#define RT5668_MONO_DYNA_4 0x0173 127#define RT5663_MONO_DYNA_6 0x0175
133#define RT5668_MONO_DYNA_5 0x0174 128#define RT5663_STO1_SIL_DET 0x0190
134#define RT5668_MONO_DYNA_6 0x0175 129#define RT5663_MONOL_SIL_DET 0x0191
135#define RT5668_STO1_SIL_DET 0x0190 130#define RT5663_MONOR_SIL_DET 0x0192
136#define RT5668_MONOL_SIL_DET 0x0191 131#define RT5663_STO2_DAC_SIL 0x0193
137#define RT5668_MONOR_SIL_DET 0x0192 132#define RT5663_PWR_SAV_CTL1 0x0194
138#define RT5668_STO2_DAC_SIL 0x0193 133#define RT5663_PWR_SAV_CTL2 0x0195
139#define RT5668_PWR_SAV_CTL1 0x0194 134#define RT5663_PWR_SAV_CTL3 0x0196
140#define RT5668_PWR_SAV_CTL2 0x0195 135#define RT5663_PWR_SAV_CTL4 0x0197
141#define RT5668_PWR_SAV_CTL3 0x0196 136#define RT5663_PWR_SAV_CTL5 0x0198
142#define RT5668_PWR_SAV_CTL4 0x0197 137#define RT5663_PWR_SAV_CTL6 0x0199
143#define RT5668_PWR_SAV_CTL5 0x0198 138#define RT5663_MONO_AMP_CAL1 0x01a0
144#define RT5668_PWR_SAV_CTL6 0x0199 139#define RT5663_MONO_AMP_CAL2 0x01a1
145#define RT5668_MONO_AMP_CAL1 0x01a0 140#define RT5663_MONO_AMP_CAL3 0x01a2
146#define RT5668_MONO_AMP_CAL2 0x01a1 141#define RT5663_MONO_AMP_CAL4 0x01a3
147#define RT5668_MONO_AMP_CAL3 0x01a2 142#define RT5663_MONO_AMP_CAL5 0x01a4
148#define RT5668_MONO_AMP_CAL4 0x01a3 143#define RT5663_MONO_AMP_CAL6 0x01a5
149#define RT5668_MONO_AMP_CAL5 0x01a4 144#define RT5663_MONO_AMP_CAL7 0x01a6
150#define RT5668_MONO_AMP_CAL6 0x01a5 145#define RT5663_MONO_AMP_CAL_ST1 0x01a7
151#define RT5668_MONO_AMP_CAL7 0x01a6 146#define RT5663_MONO_AMP_CAL_ST2 0x01a8
152#define RT5668_MONO_AMP_CAL_ST1 0x01a7 147#define RT5663_MONO_AMP_CAL_ST3 0x01a9
153#define RT5668_MONO_AMP_CAL_ST2 0x01a8 148#define RT5663_MONO_AMP_CAL_ST4 0x01aa
154#define RT5668_MONO_AMP_CAL_ST3 0x01a9 149#define RT5663_MONO_AMP_CAL_ST5 0x01ab
155#define RT5668_MONO_AMP_CAL_ST4 0x01aa 150#define RT5663_V2_HP_IMP_SEN_13 0x01b9
156#define RT5668_MONO_AMP_CAL_ST5 0x01ab 151#define RT5663_V2_HP_IMP_SEN_14 0x01ba
157#define RT5668_HP_IMP_SEN_13 0x01b9 152#define RT5663_V2_HP_IMP_SEN_6 0x01bb
158#define RT5668_HP_IMP_SEN_14 0x01ba 153#define RT5663_V2_HP_IMP_SEN_7 0x01bc
159#define RT5668_HP_IMP_SEN_6 0x01bb 154#define RT5663_V2_HP_IMP_SEN_8 0x01bd
160#define RT5668_HP_IMP_SEN_7 0x01bc 155#define RT5663_V2_HP_IMP_SEN_9 0x01be
161#define RT5668_HP_IMP_SEN_8 0x01bd 156#define RT5663_V2_HP_IMP_SEN_10 0x01bf
162#define RT5668_HP_IMP_SEN_9 0x01be 157#define RT5663_HP_LOGIC_3 0x01dc
163#define RT5668_HP_IMP_SEN_10 0x01bf 158#define RT5663_HP_CALIB_ST10 0x01f3
164#define RT5668_HP_LOGIC_3 0x01dc 159#define RT5663_HP_CALIB_ST11 0x01f4
165#define RT5668_HP_CALIB_ST10 0x01f3 160#define RT5663_PRO_REG_TBL_4 0x0203
166#define RT5668_HP_CALIB_ST11 0x01f4 161#define RT5663_PRO_REG_TBL_5 0x0204
167#define RT5668_PRO_REG_TBL_4 0x0203 162#define RT5663_PRO_REG_TBL_6 0x0205
168#define RT5668_PRO_REG_TBL_5 0x0204 163#define RT5663_PRO_REG_TBL_7 0x0206
169#define RT5668_PRO_REG_TBL_6 0x0205 164#define RT5663_PRO_REG_TBL_8 0x0207
170#define RT5668_PRO_REG_TBL_7 0x0206 165#define RT5663_PRO_REG_TBL_9 0x0208
171#define RT5668_PRO_REG_TBL_8 0x0207 166#define RT5663_SAR_ADC_INL_1 0x0210
172#define RT5668_PRO_REG_TBL_9 0x0208 167#define RT5663_SAR_ADC_INL_2 0x0211
173#define RT5668_SAR_ADC_INL_1 0x0210 168#define RT5663_SAR_ADC_INL_3 0x0212
174#define RT5668_SAR_ADC_INL_2 0x0211 169#define RT5663_SAR_ADC_INL_4 0x0213
175#define RT5668_SAR_ADC_INL_3 0x0212 170#define RT5663_SAR_ADC_INL_5 0x0214
176#define RT5668_SAR_ADC_INL_4 0x0213 171#define RT5663_SAR_ADC_INL_6 0x0215
177#define RT5668_SAR_ADC_INL_5 0x0214 172#define RT5663_SAR_ADC_INL_7 0x0216
178#define RT5668_SAR_ADC_INL_6 0x0215 173#define RT5663_SAR_ADC_INL_8 0x0217
179#define RT5668_SAR_ADC_INL_7 0x0216 174#define RT5663_SAR_ADC_INL_9 0x0218
180#define RT5668_SAR_ADC_INL_8 0x0217 175#define RT5663_SAR_ADC_INL_10 0x0219
181#define RT5668_SAR_ADC_INL_9 0x0218 176#define RT5663_SAR_ADC_INL_11 0x021a
182#define RT5668_SAR_ADC_INL_10 0x0219 177#define RT5663_SAR_ADC_INL_12 0x021b
183#define RT5668_SAR_ADC_INL_11 0x021a 178#define RT5663_DRC_CTRL_1 0x02ff
184#define RT5668_SAR_ADC_INL_12 0x021b 179#define RT5663_DRC1_CTRL_2 0x0301
185#define RT5668_DRC_CTRL_1 0x02ff 180#define RT5663_DRC1_CTRL_3 0x0302
186#define RT5668_DRC1_CTRL_2 0x0301 181#define RT5663_DRC1_CTRL_4 0x0303
187#define RT5668_DRC1_CTRL_3 0x0302 182#define RT5663_DRC1_CTRL_5 0x0304
188#define RT5668_DRC1_CTRL_4 0x0303 183#define RT5663_DRC1_CTRL_6 0x0305
189#define RT5668_DRC1_CTRL_5 0x0304 184#define RT5663_DRC1_HD_CTRL_1 0x0306
190#define RT5668_DRC1_CTRL_6 0x0305 185#define RT5663_DRC1_HD_CTRL_2 0x0307
191#define RT5668_DRC1_HD_CTRL_1 0x0306 186#define RT5663_DRC1_PRI_REG_1 0x0310
192#define RT5668_DRC1_HD_CTRL_2 0x0307 187#define RT5663_DRC1_PRI_REG_2 0x0311
193#define RT5668_DRC1_PRI_REG_1 0x0310 188#define RT5663_DRC1_PRI_REG_3 0x0312
194#define RT5668_DRC1_PRI_REG_2 0x0311 189#define RT5663_DRC1_PRI_REG_4 0x0313
195#define RT5668_DRC1_PRI_REG_3 0x0312 190#define RT5663_DRC1_PRI_REG_5 0x0314
196#define RT5668_DRC1_PRI_REG_4 0x0313 191#define RT5663_DRC1_PRI_REG_6 0x0315
197#define RT5668_DRC1_PRI_REG_5 0x0314 192#define RT5663_DRC1_PRI_REG_7 0x0316
198#define RT5668_DRC1_PRI_REG_6 0x0315 193#define RT5663_DRC1_PRI_REG_8 0x0317
199#define RT5668_DRC1_PRI_REG_7 0x0316 194#define RT5663_ALC_PGA_CTL_1 0x0330
200#define RT5668_DRC1_PRI_REG_8 0x0317 195#define RT5663_ALC_PGA_CTL_2 0x0331
201#define RT5668_ALC_PGA_CTL_1 0x0330 196#define RT5663_ALC_PGA_CTL_3 0x0332
202#define RT5668_ALC_PGA_CTL_2 0x0331 197#define RT5663_ALC_PGA_CTL_4 0x0333
203#define RT5668_ALC_PGA_CTL_3 0x0332 198#define RT5663_ALC_PGA_CTL_5 0x0334
204#define RT5668_ALC_PGA_CTL_4 0x0333 199#define RT5663_ALC_PGA_CTL_6 0x0335
205#define RT5668_ALC_PGA_CTL_5 0x0334 200#define RT5663_ALC_PGA_CTL_7 0x0336
206#define RT5668_ALC_PGA_CTL_6 0x0335 201#define RT5663_ALC_PGA_CTL_8 0x0337
207#define RT5668_ALC_PGA_CTL_7 0x0336 202#define RT5663_ALC_PGA_REG_1 0x0338
208#define RT5668_ALC_PGA_CTL_8 0x0337 203#define RT5663_ALC_PGA_REG_2 0x0339
209#define RT5668_ALC_PGA_REG_1 0x0338 204#define RT5663_ALC_PGA_REG_3 0x033a
210#define RT5668_ALC_PGA_REG_2 0x0339 205#define RT5663_ADC_EQ_RECOV_1 0x03c0
211#define RT5668_ALC_PGA_REG_3 0x033a 206#define RT5663_ADC_EQ_RECOV_2 0x03c1
212#define RT5668_ADC_EQ_RECOV_1 0x03c0 207#define RT5663_ADC_EQ_RECOV_3 0x03c2
213#define RT5668_ADC_EQ_RECOV_2 0x03c1 208#define RT5663_ADC_EQ_RECOV_4 0x03c3
214#define RT5668_ADC_EQ_RECOV_3 0x03c2 209#define RT5663_ADC_EQ_RECOV_5 0x03c4
215#define RT5668_ADC_EQ_RECOV_4 0x03c3 210#define RT5663_ADC_EQ_RECOV_6 0x03c5
216#define RT5668_ADC_EQ_RECOV_5 0x03c4 211#define RT5663_ADC_EQ_RECOV_7 0x03c6
217#define RT5668_ADC_EQ_RECOV_6 0x03c5 212#define RT5663_ADC_EQ_RECOV_8 0x03c7
218#define RT5668_ADC_EQ_RECOV_7 0x03c6 213#define RT5663_ADC_EQ_RECOV_9 0x03c8
219#define RT5668_ADC_EQ_RECOV_8 0x03c7 214#define RT5663_ADC_EQ_RECOV_10 0x03c9
220#define RT5668_ADC_EQ_RECOV_9 0x03c8 215#define RT5663_ADC_EQ_RECOV_11 0x03ca
221#define RT5668_ADC_EQ_RECOV_10 0x03c9 216#define RT5663_ADC_EQ_RECOV_12 0x03cb
222#define RT5668_ADC_EQ_RECOV_11 0x03ca 217#define RT5663_ADC_EQ_RECOV_13 0x03cc
223#define RT5668_ADC_EQ_RECOV_12 0x03cb 218#define RT5663_VID_HIDDEN 0x03fe
224#define RT5668_ADC_EQ_RECOV_13 0x03cc 219#define RT5663_VID_CUSTOMER 0x03ff
225#define RT5668_VID_HIDDEN 0x03fe 220#define RT5663_SCAN_MODE 0x07f0
226#define RT5668_VID_CUSTOMER 0x03ff 221#define RT5663_I2C_BYPA 0x07fa
227#define RT5668_SCAN_MODE 0x07f0
228#define RT5668_I2C_BYPA 0x07fa
229 222
230/* Headphone Amp Control 2 (0x0003) */ 223/* Headphone Amp Control 2 (0x0003) */
231#define RT5668_EN_DAC_HPO_MASK (0x1 << 14) 224#define RT5663_EN_DAC_HPO_MASK (0x1 << 14)
232#define RT5668_EN_DAC_HPO_SHIFT 14 225#define RT5663_EN_DAC_HPO_SHIFT 14
233#define RT5668_EN_DAC_HPO_DIS (0x0 << 14) 226#define RT5663_EN_DAC_HPO_DIS (0x0 << 14)
234#define RT5668_EN_DAC_HPO_EN (0x1 << 14) 227#define RT5663_EN_DAC_HPO_EN (0x1 << 14)
235 228
236/*Headphone Amp L/R Analog Gain and Digital NG2 Gain Control (0x0005 0x0006)*/ 229/*Headphone Amp L/R Analog Gain and Digital NG2 Gain Control (0x0005 0x0006)*/
237#define RT5668_GAIN_HP (0x1f << 8) 230#define RT5663_GAIN_HP (0x1f << 8)
238#define RT5668_GAIN_HP_SHIFT 8 231#define RT5663_GAIN_HP_SHIFT 8
239 232
240/* AEC BST Control (0x000b) */ 233/* AEC BST Control (0x000b) */
241#define RT5668_GAIN_CBJ_MASK (0xf << 8) 234#define RT5663_GAIN_CBJ_MASK (0xf << 8)
242#define RT5668_GAIN_CBJ_SHIFT 8 235#define RT5663_GAIN_CBJ_SHIFT 8
243 236
244/* IN1 Control / MIC GND REF (0x000c) */ 237/* IN1 Control / MIC GND REF (0x000c) */
245#define RT5668_IN1_DF_MASK (0x1 << 15) 238#define RT5663_IN1_DF_MASK (0x1 << 15)
246#define RT5668_IN1_DF_SHIFT 15 239#define RT5663_IN1_DF_SHIFT 15
247 240
248/* Combo Jack and Type Detection Control 1 (0x0010) */ 241/* Combo Jack and Type Detection Control 1 (0x0010) */
249#define RT5668_CBJ_DET_MASK (0x1 << 15) 242#define RT5663_CBJ_DET_MASK (0x1 << 15)
250#define RT5668_CBJ_DET_SHIFT 15 243#define RT5663_CBJ_DET_SHIFT 15
251#define RT5668_CBJ_DET_DIS (0x0 << 15) 244#define RT5663_CBJ_DET_DIS (0x0 << 15)
252#define RT5668_CBJ_DET_EN (0x1 << 15) 245#define RT5663_CBJ_DET_EN (0x1 << 15)
253#define RT5668_DET_TYPE_MASK (0x1 << 12) 246#define RT5663_DET_TYPE_MASK (0x1 << 12)
254#define RT5668_DET_TYPE_SHIFT 12 247#define RT5663_DET_TYPE_SHIFT 12
255#define RT5668_DET_TYPE_WLCSP (0x0 << 12) 248#define RT5663_DET_TYPE_WLCSP (0x0 << 12)
256#define RT5668_DET_TYPE_QFN (0x1 << 12) 249#define RT5663_DET_TYPE_QFN (0x1 << 12)
257#define RT5668_VREF_BIAS_MASK (0x1 << 6) 250#define RT5663_VREF_BIAS_MASK (0x1 << 6)
258#define RT5668_VREF_BIAS_SHIFT 6 251#define RT5663_VREF_BIAS_SHIFT 6
259#define RT5668_VREF_BIAS_FSM (0x0 << 6) 252#define RT5663_VREF_BIAS_FSM (0x0 << 6)
260#define RT5668_VREF_BIAS_REG (0x1 << 6) 253#define RT5663_VREF_BIAS_REG (0x1 << 6)
261 254
262/* REC Left Mixer Control 2 (0x003c) */ 255/* REC Left Mixer Control 2 (0x003c) */
263#define RT5668_RECMIX1L_BST1_CBJ (0x1 << 7) 256#define RT5663_RECMIX1L_BST1_CBJ (0x1 << 7)
264#define RT5668_RECMIX1L_BST1_CBJ_SHIFT 7 257#define RT5663_RECMIX1L_BST1_CBJ_SHIFT 7
265#define RT5668_RECMIX1L_BST2 (0x1 << 4) 258#define RT5663_RECMIX1L_BST2 (0x1 << 4)
266#define RT5668_RECMIX1L_BST2_SHIFT 4 259#define RT5663_RECMIX1L_BST2_SHIFT 4
267 260
268/* REC Right Mixer Control 2 (0x003e) */ 261/* REC Right Mixer Control 2 (0x003e) */
269#define RT5668_RECMIX1R_BST2 (0x1 << 4) 262#define RT5663_RECMIX1R_BST2 (0x1 << 4)
270#define RT5668_RECMIX1R_BST2_SHIFT 4 263#define RT5663_RECMIX1R_BST2_SHIFT 4
271 264
272/* DAC1 Digital Volume (0x0019) */ 265/* DAC1 Digital Volume (0x0019) */
273#define RT5668_DAC_L1_VOL_MASK (0xff << 8) 266#define RT5663_DAC_L1_VOL_MASK (0xff << 8)
274#define RT5668_DAC_L1_VOL_SHIFT 8 267#define RT5663_DAC_L1_VOL_SHIFT 8
275#define RT5668_DAC_R1_VOL_MASK (0xff) 268#define RT5663_DAC_R1_VOL_MASK (0xff)
276#define RT5668_DAC_R1_VOL_SHIFT 0 269#define RT5663_DAC_R1_VOL_SHIFT 0
277 270
278/* ADC Digital Volume Control (0x001c) */ 271/* ADC Digital Volume Control (0x001c) */
279#define RT5668_ADC_L_MUTE_MASK (0x1 << 15) 272#define RT5663_ADC_L_MUTE_MASK (0x1 << 15)
280#define RT5668_ADC_L_MUTE_SHIFT 15 273#define RT5663_ADC_L_MUTE_SHIFT 15
281#define RT5668_ADC_L_VOL_MASK (0x7f << 8) 274#define RT5663_ADC_L_VOL_MASK (0x7f << 8)
282#define RT5668_ADC_L_VOL_SHIFT 8 275#define RT5663_ADC_L_VOL_SHIFT 8
283#define RT5668_ADC_R_MUTE_MASK (0x1 << 7) 276#define RT5663_ADC_R_MUTE_MASK (0x1 << 7)
284#define RT5668_ADC_R_MUTE_SHIFT 7 277#define RT5663_ADC_R_MUTE_SHIFT 7
285#define RT5668_ADC_R_VOL_MASK (0x7f) 278#define RT5663_ADC_R_VOL_MASK (0x7f)
286#define RT5668_ADC_R_VOL_SHIFT 0 279#define RT5663_ADC_R_VOL_SHIFT 0
287 280
288/* Stereo ADC Mixer Control (0x0026) */ 281/* Stereo ADC Mixer Control (0x0026) */
289#define RT5668_M_STO1_ADC_L1 (0x1 << 15) 282#define RT5663_M_STO1_ADC_L1 (0x1 << 15)
290#define RT5668_M_STO1_ADC_L1_SHIFT 15 283#define RT5663_M_STO1_ADC_L1_SHIFT 15
291#define RT5668_M_STO1_ADC_L2 (0x1 << 14) 284#define RT5663_M_STO1_ADC_L2 (0x1 << 14)
292#define RT5668_M_STO1_ADC_L2_SHIFT 14 285#define RT5663_M_STO1_ADC_L2_SHIFT 14
293#define RT5668_STO1_ADC_L1_SRC (0x1 << 13) 286#define RT5663_STO1_ADC_L1_SRC (0x1 << 13)
294#define RT5668_STO1_ADC_L1_SRC_SHIFT 13 287#define RT5663_STO1_ADC_L1_SRC_SHIFT 13
295#define RT5668_STO1_ADC_L2_SRC (0x1 << 12) 288#define RT5663_STO1_ADC_L2_SRC (0x1 << 12)
296#define RT5668_STO1_ADC_L2_SRC_SHIFT 12 289#define RT5663_STO1_ADC_L2_SRC_SHIFT 12
297#define RT5668_STO1_ADC_L_SRC (0x3 << 10) 290#define RT5663_STO1_ADC_L_SRC (0x3 << 10)
298#define RT5668_STO1_ADC_L_SRC_SHIFT 10 291#define RT5663_STO1_ADC_L_SRC_SHIFT 10
299#define RT5668_M_STO1_ADC_R1 (0x1 << 7) 292#define RT5663_M_STO1_ADC_R1 (0x1 << 7)
300#define RT5668_M_STO1_ADC_R1_SHIFT 7 293#define RT5663_M_STO1_ADC_R1_SHIFT 7
301#define RT5668_M_STO1_ADC_R2 (0x1 << 6) 294#define RT5663_M_STO1_ADC_R2 (0x1 << 6)
302#define RT5668_M_STO1_ADC_R2_SHIFT 6 295#define RT5663_M_STO1_ADC_R2_SHIFT 6
303#define RT5668_STO1_ADC_R1_SRC (0x1 << 5) 296#define RT5663_STO1_ADC_R1_SRC (0x1 << 5)
304#define RT5668_STO1_ADC_R1_SRC_SHIFT 5 297#define RT5663_STO1_ADC_R1_SRC_SHIFT 5
305#define RT5668_STO1_ADC_R2_SRC (0x1 << 4) 298#define RT5663_STO1_ADC_R2_SRC (0x1 << 4)
306#define RT5668_STO1_ADC_R2_SRC_SHIFT 4 299#define RT5663_STO1_ADC_R2_SRC_SHIFT 4
307#define RT5668_STO1_ADC_R_SRC (0x3 << 2) 300#define RT5663_STO1_ADC_R_SRC (0x3 << 2)
308#define RT5668_STO1_ADC_R_SRC_SHIFT 2 301#define RT5663_STO1_ADC_R_SRC_SHIFT 2
309 302
310/* ADC Mixer to DAC Mixer Control (0x0029) */ 303/* ADC Mixer to DAC Mixer Control (0x0029) */
311#define RT5668_M_ADCMIX_L (0x1 << 15) 304#define RT5663_M_ADCMIX_L (0x1 << 15)
312#define RT5668_M_ADCMIX_L_SHIFT 15 305#define RT5663_M_ADCMIX_L_SHIFT 15
313#define RT5668_M_DAC1_L (0x1 << 14) 306#define RT5663_M_DAC1_L (0x1 << 14)
314#define RT5668_M_DAC1_L_SHIFT 14 307#define RT5663_M_DAC1_L_SHIFT 14
315#define RT5668_M_ADCMIX_R (0x1 << 7) 308#define RT5663_M_ADCMIX_R (0x1 << 7)
316#define RT5668_M_ADCMIX_R_SHIFT 7 309#define RT5663_M_ADCMIX_R_SHIFT 7
317#define RT5668_M_DAC1_R (0x1 << 6) 310#define RT5663_M_DAC1_R (0x1 << 6)
318#define RT5668_M_DAC1_R_SHIFT 6 311#define RT5663_M_DAC1_R_SHIFT 6
319 312
320/* Stereo DAC Mixer Control (0x002a) */ 313/* Stereo DAC Mixer Control (0x002a) */
321#define RT5668_M_DAC_L1_STO_L (0x1 << 15) 314#define RT5663_M_DAC_L1_STO_L (0x1 << 15)
322#define RT5668_M_DAC_L1_STO_L_SHIFT 15 315#define RT5663_M_DAC_L1_STO_L_SHIFT 15
323#define RT5668_M_DAC_R1_STO_L (0x1 << 13) 316#define RT5663_M_DAC_R1_STO_L (0x1 << 13)
324#define RT5668_M_DAC_R1_STO_L_SHIFT 13 317#define RT5663_M_DAC_R1_STO_L_SHIFT 13
325#define RT5668_M_DAC_L1_STO_R (0x1 << 7) 318#define RT5663_M_DAC_L1_STO_R (0x1 << 7)
326#define RT5668_M_DAC_L1_STO_R_SHIFT 7 319#define RT5663_M_DAC_L1_STO_R_SHIFT 7
327#define RT5668_M_DAC_R1_STO_R (0x1 << 5) 320#define RT5663_M_DAC_R1_STO_R (0x1 << 5)
328#define RT5668_M_DAC_R1_STO_R_SHIFT 5 321#define RT5663_M_DAC_R1_STO_R_SHIFT 5
329 322
330/* Power Management for Digital 1 (0x0061) */ 323/* Power Management for Digital 1 (0x0061) */
331#define RT5668_PWR_I2S1 (0x1 << 15) 324#define RT5663_PWR_I2S1 (0x1 << 15)
332#define RT5668_PWR_I2S1_SHIFT 15 325#define RT5663_PWR_I2S1_SHIFT 15
333#define RT5668_PWR_DAC_L1 (0x1 << 11) 326#define RT5663_PWR_DAC_L1 (0x1 << 11)
334#define RT5668_PWR_DAC_L1_SHIFT 11 327#define RT5663_PWR_DAC_L1_SHIFT 11
335#define RT5668_PWR_DAC_R1 (0x1 << 10) 328#define RT5663_PWR_DAC_R1 (0x1 << 10)
336#define RT5668_PWR_DAC_R1_SHIFT 10 329#define RT5663_PWR_DAC_R1_SHIFT 10
337#define RT5668_PWR_LDO_DACREF_MASK (0x1 << 8) 330#define RT5663_PWR_LDO_DACREF_MASK (0x1 << 8)
338#define RT5668_PWR_LDO_DACREF_SHIFT 8 331#define RT5663_PWR_LDO_DACREF_SHIFT 8
339#define RT5668_PWR_LDO_DACREF_ON (0x1 << 8) 332#define RT5663_PWR_LDO_DACREF_ON (0x1 << 8)
340#define RT5668_PWR_LDO_DACREF_DOWN (0x0 << 8) 333#define RT5663_PWR_LDO_DACREF_DOWN (0x0 << 8)
341#define RT5668_PWR_LDO_SHIFT 8 334#define RT5663_PWR_LDO_SHIFT 8
342#define RT5668_PWR_ADC_L1 (0x1 << 4) 335#define RT5663_PWR_ADC_L1 (0x1 << 4)
343#define RT5668_PWR_ADC_L1_SHIFT 4 336#define RT5663_PWR_ADC_L1_SHIFT 4
344#define RT5668_PWR_ADC_R1 (0x1 << 3) 337#define RT5663_PWR_ADC_R1 (0x1 << 3)
345#define RT5668_PWR_ADC_R1_SHIFT 3 338#define RT5663_PWR_ADC_R1_SHIFT 3
346 339
347/* Power Management for Digital 2 (0x0062) */ 340/* Power Management for Digital 2 (0x0062) */
348#define RT5668_PWR_ADC_S1F (0x1 << 15) 341#define RT5663_PWR_ADC_S1F (0x1 << 15)
349#define RT5668_PWR_ADC_S1F_SHIFT 15 342#define RT5663_PWR_ADC_S1F_SHIFT 15
350#define RT5668_PWR_DAC_S1F (0x1 << 10) 343#define RT5663_PWR_DAC_S1F (0x1 << 10)
351#define RT5668_PWR_DAC_S1F_SHIFT 10 344#define RT5663_PWR_DAC_S1F_SHIFT 10
352 345
353/* Power Management for Analog 1 (0x0063) */ 346/* Power Management for Analog 1 (0x0063) */
354#define RT5668_PWR_VREF1 (0x1 << 15) 347#define RT5663_PWR_VREF1 (0x1 << 15)
355#define RT5668_PWR_VREF1_MASK (0x1 << 15) 348#define RT5663_PWR_VREF1_MASK (0x1 << 15)
356#define RT5668_PWR_VREF1_SHIFT 15 349#define RT5663_PWR_VREF1_SHIFT 15
357#define RT5668_PWR_FV1 (0x1 << 14) 350#define RT5663_PWR_FV1 (0x1 << 14)
358#define RT5668_PWR_FV1_MASK (0x1 << 14) 351#define RT5663_PWR_FV1_MASK (0x1 << 14)
359#define RT5668_PWR_FV1_SHIFT 14 352#define RT5663_PWR_FV1_SHIFT 14
360#define RT5668_PWR_VREF2 (0x1 << 13) 353#define RT5663_PWR_VREF2 (0x1 << 13)
361#define RT5668_PWR_VREF2_MASK (0x1 << 13) 354#define RT5663_PWR_VREF2_MASK (0x1 << 13)
362#define RT5668_PWR_VREF2_SHIFT 13 355#define RT5663_PWR_VREF2_SHIFT 13
363#define RT5668_PWR_FV2 (0x1 << 12) 356#define RT5663_PWR_FV2 (0x1 << 12)
364#define RT5668_PWR_FV2_MASK (0x1 << 12) 357#define RT5663_PWR_FV2_MASK (0x1 << 12)
365#define RT5668_PWR_FV2_SHIFT 12 358#define RT5663_PWR_FV2_SHIFT 12
366#define RT5668_PWR_MB (0x1 << 9) 359#define RT5663_PWR_MB (0x1 << 9)
367#define RT5668_PWR_MB_MASK (0x1 << 9) 360#define RT5663_PWR_MB_MASK (0x1 << 9)
368#define RT5668_PWR_MB_SHIFT 9 361#define RT5663_PWR_MB_SHIFT 9
369#define RT5668_AMP_HP_MASK (0x3 << 2) 362#define RT5663_AMP_HP_MASK (0x3 << 2)
370#define RT5668_AMP_HP_SHIFT 2 363#define RT5663_AMP_HP_SHIFT 2
371#define RT5668_AMP_HP_1X (0x0 << 2) 364#define RT5663_AMP_HP_1X (0x0 << 2)
372#define RT5668_AMP_HP_3X (0x1 << 2) 365#define RT5663_AMP_HP_3X (0x1 << 2)
373#define RT5668_AMP_HP_5X (0x3 << 2) 366#define RT5663_AMP_HP_5X (0x3 << 2)
374#define RT5668_LDO1_DVO_MASK (0x3) 367#define RT5663_LDO1_DVO_MASK (0x3)
375#define RT5668_LDO1_DVO_SHIFT 0 368#define RT5663_LDO1_DVO_SHIFT 0
376#define RT5668_LDO1_DVO_0_9V (0x0) 369#define RT5663_LDO1_DVO_0_9V (0x0)
377#define RT5668_LDO1_DVO_1_0V (0x1) 370#define RT5663_LDO1_DVO_1_0V (0x1)
378#define RT5668_LDO1_DVO_1_2V (0x2) 371#define RT5663_LDO1_DVO_1_2V (0x2)
379#define RT5668_LDO1_DVO_1_4V (0x3) 372#define RT5663_LDO1_DVO_1_4V (0x3)
380 373
381/* Power Management for Analog 2 (0x0064) */ 374/* Power Management for Analog 2 (0x0064) */
382#define RT5668_PWR_BST1 (0x1 << 15) 375#define RT5663_PWR_BST1 (0x1 << 15)
383#define RT5668_PWR_BST1_MASK (0x1 << 15) 376#define RT5663_PWR_BST1_MASK (0x1 << 15)
384#define RT5668_PWR_BST1_SHIFT 15 377#define RT5663_PWR_BST1_SHIFT 15
385#define RT5668_PWR_BST1_OFF (0x0 << 15) 378#define RT5663_PWR_BST1_OFF (0x0 << 15)
386#define RT5668_PWR_BST1_ON (0x1 << 15) 379#define RT5663_PWR_BST1_ON (0x1 << 15)
387#define RT5668_PWR_BST2 (0x1 << 14) 380#define RT5663_PWR_BST2 (0x1 << 14)
388#define RT5668_PWR_BST2_MASK (0x1 << 14) 381#define RT5663_PWR_BST2_MASK (0x1 << 14)
389#define RT5668_PWR_BST2_SHIFT 14 382#define RT5663_PWR_BST2_SHIFT 14
390#define RT5668_PWR_MB1 (0x1 << 11) 383#define RT5663_PWR_MB1 (0x1 << 11)
391#define RT5668_PWR_MB1_SHIFT 11 384#define RT5663_PWR_MB1_SHIFT 11
392#define RT5668_PWR_MB2 (0x1 << 10) 385#define RT5663_PWR_MB2 (0x1 << 10)
393#define RT5668_PWR_MB2_SHIFT 10 386#define RT5663_PWR_MB2_SHIFT 10
394#define RT5668_PWR_BST2_OP (0x1 << 6) 387#define RT5663_PWR_BST2_OP (0x1 << 6)
395#define RT5668_PWR_BST2_OP_MASK (0x1 << 6) 388#define RT5663_PWR_BST2_OP_MASK (0x1 << 6)
396#define RT5668_PWR_BST2_OP_SHIFT 6 389#define RT5663_PWR_BST2_OP_SHIFT 6
397#define RT5668_PWR_JD1 (0x1 << 3) 390#define RT5663_PWR_JD1 (0x1 << 3)
398#define RT5668_PWR_JD1_MASK (0x1 << 3) 391#define RT5663_PWR_JD1_MASK (0x1 << 3)
399#define RT5668_PWR_JD1_SHIFT 3 392#define RT5663_PWR_JD1_SHIFT 3
400#define RT5668_PWR_JD2 (0x1 << 2) 393#define RT5663_PWR_JD2 (0x1 << 2)
401#define RT5668_PWR_JD2_MASK (0x1 << 2) 394#define RT5663_PWR_JD2_MASK (0x1 << 2)
402#define RT5668_PWR_JD2_SHIFT 2 395#define RT5663_PWR_JD2_SHIFT 2
403#define RT5668_PWR_RECMIX1 (0x1 << 1) 396#define RT5663_PWR_RECMIX1 (0x1 << 1)
404#define RT5668_PWR_RECMIX1_SHIFT 1 397#define RT5663_PWR_RECMIX1_SHIFT 1
405#define RT5668_PWR_RECMIX2 (0x1) 398#define RT5663_PWR_RECMIX2 (0x1)
406#define RT5668_PWR_RECMIX2_SHIFT 0 399#define RT5663_PWR_RECMIX2_SHIFT 0
407 400
408/* Power Management for Analog 3 (0x0065) */ 401/* Power Management for Analog 3 (0x0065) */
409#define RT5668_PWR_CBJ_MASK (0x1 << 9) 402#define RT5663_PWR_CBJ_MASK (0x1 << 9)
410#define RT5668_PWR_CBJ_SHIFT 9 403#define RT5663_PWR_CBJ_SHIFT 9
411#define RT5668_PWR_CBJ_OFF (0x0 << 9) 404#define RT5663_PWR_CBJ_OFF (0x0 << 9)
412#define RT5668_PWR_CBJ_ON (0x1 << 9) 405#define RT5663_PWR_CBJ_ON (0x1 << 9)
413#define RT5668_PWR_PLL (0x1 << 6) 406#define RT5663_PWR_PLL (0x1 << 6)
414#define RT5668_PWR_PLL_SHIFT 6 407#define RT5663_PWR_PLL_SHIFT 6
415#define RT5668_PWR_LDO2 (0x1 << 2) 408#define RT5663_PWR_LDO2 (0x1 << 2)
416#define RT5668_PWR_LDO2_SHIFT 2 409#define RT5663_PWR_LDO2_SHIFT 2
417 410
418/* Power Management for Volume (0x0067) */ 411/* Power Management for Volume (0x0067) */
419#define RT5668_PWR_MIC_DET (0x1 << 5) 412#define RT5663_V2_PWR_MIC_DET (0x1 << 5)
420#define RT5668_PWR_MIC_DET_SHIFT 5 413#define RT5663_V2_PWR_MIC_DET_SHIFT 5
421 414
422/* MCLK and System Clock Detection Control (0x006b) */ 415/* MCLK and System Clock Detection Control (0x006b) */
423#define RT5668_EN_ANA_CLK_DET_MASK (0x1 << 15) 416#define RT5663_EN_ANA_CLK_DET_MASK (0x1 << 15)
424#define RT5668_EN_ANA_CLK_DET_SHIFT 15 417#define RT5663_EN_ANA_CLK_DET_SHIFT 15
425#define RT5668_EN_ANA_CLK_DET_DIS (0x0 << 15) 418#define RT5663_EN_ANA_CLK_DET_DIS (0x0 << 15)
426#define RT5668_EN_ANA_CLK_DET_AUTO (0x1 << 15) 419#define RT5663_EN_ANA_CLK_DET_AUTO (0x1 << 15)
427#define RT5668_PWR_CLK_DET_MASK (0x1) 420#define RT5663_PWR_CLK_DET_MASK (0x1)
428#define RT5668_PWR_CLK_DET_SHIFT 0 421#define RT5663_PWR_CLK_DET_SHIFT 0
429#define RT5668_PWR_CLK_DET_DIS (0x0) 422#define RT5663_PWR_CLK_DET_DIS (0x0)
430#define RT5668_PWR_CLK_DET_EN (0x1) 423#define RT5663_PWR_CLK_DET_EN (0x1)
431 424
432/* I2S1 Audio Serial Data Port Control (0x0070) */ 425/* I2S1 Audio Serial Data Port Control (0x0070) */
433#define RT5668_I2S_MS_MASK (0x1 << 15) 426#define RT5663_I2S_MS_MASK (0x1 << 15)
434#define RT5668_I2S_MS_SHIFT 15 427#define RT5663_I2S_MS_SHIFT 15
435#define RT5668_I2S_MS_M (0x0 << 15) 428#define RT5663_I2S_MS_M (0x0 << 15)
436#define RT5668_I2S_MS_S (0x1 << 15) 429#define RT5663_I2S_MS_S (0x1 << 15)
437#define RT5668_I2S_BP_MASK (0x1 << 8) 430#define RT5663_I2S_BP_MASK (0x1 << 8)
438#define RT5668_I2S_BP_SHIFT 8 431#define RT5663_I2S_BP_SHIFT 8
439#define RT5668_I2S_BP_NOR (0x0 << 8) 432#define RT5663_I2S_BP_NOR (0x0 << 8)
440#define RT5668_I2S_BP_INV (0x1 << 8) 433#define RT5663_I2S_BP_INV (0x1 << 8)
441#define RT5668_I2S_DL_MASK (0x3 << 4) 434#define RT5663_I2S_DL_MASK (0x3 << 4)
442#define RT5668_I2S_DL_SHIFT 4 435#define RT5663_I2S_DL_SHIFT 4
443#define RT5668_I2S_DL_16 (0x0 << 4) 436#define RT5663_I2S_DL_16 (0x0 << 4)
444#define RT5668_I2S_DL_20 (0x1 << 4) 437#define RT5663_I2S_DL_20 (0x1 << 4)
445#define RT5668_I2S_DL_24 (0x2 << 4) 438#define RT5663_I2S_DL_24 (0x2 << 4)
446#define RT5668_I2S_DL_8 (0x3 << 4) 439#define RT5663_I2S_DL_8 (0x3 << 4)
447#define RT5668_I2S_DF_MASK (0x7) 440#define RT5663_I2S_DF_MASK (0x7)
448#define RT5668_I2S_DF_SHIFT 0 441#define RT5663_I2S_DF_SHIFT 0
449#define RT5668_I2S_DF_I2S (0x0) 442#define RT5663_I2S_DF_I2S (0x0)
450#define RT5668_I2S_DF_LEFT (0x1) 443#define RT5663_I2S_DF_LEFT (0x1)
451#define RT5668_I2S_DF_PCM_A (0x2) 444#define RT5663_I2S_DF_PCM_A (0x2)
452#define RT5668_I2S_DF_PCM_B (0x3) 445#define RT5663_I2S_DF_PCM_B (0x3)
453#define RT5668_I2S_DF_PCM_A_N (0x6) 446#define RT5663_I2S_DF_PCM_A_N (0x6)
454#define RT5668_I2S_DF_PCM_B_N (0x7) 447#define RT5663_I2S_DF_PCM_B_N (0x7)
455 448
456/* ADC/DAC Clock Control 1 (0x0073) */ 449/* ADC/DAC Clock Control 1 (0x0073) */
457#define RT5668_I2S_PD1_MASK (0x7 << 12) 450#define RT5663_I2S_PD1_MASK (0x7 << 12)
458#define RT5668_I2S_PD1_SHIFT 12 451#define RT5663_I2S_PD1_SHIFT 12
459#define RT5668_M_I2S_DIV_MASK (0x7 << 8) 452#define RT5663_M_I2S_DIV_MASK (0x7 << 8)
460#define RT5668_M_I2S_DIV_SHIFT 8 453#define RT5663_M_I2S_DIV_SHIFT 8
461#define RT5668_CLK_SRC_MASK (0x3 << 4) 454#define RT5663_CLK_SRC_MASK (0x3 << 4)
462#define RT5668_CLK_SRC_MCLK (0x0 << 4) 455#define RT5663_CLK_SRC_MCLK (0x0 << 4)
463#define RT5668_CLK_SRC_PLL_OUT (0x1 << 4) 456#define RT5663_CLK_SRC_PLL_OUT (0x1 << 4)
464#define RT5668_CLK_SRC_DIV (0x2 << 4) 457#define RT5663_CLK_SRC_DIV (0x2 << 4)
465#define RT5668_CLK_SRC_RC (0x3 << 4) 458#define RT5663_CLK_SRC_RC (0x3 << 4)
466#define RT5668_DAC_OSR_MASK (0x3 << 2) 459#define RT5663_DAC_OSR_MASK (0x3 << 2)
467#define RT5668_DAC_OSR_SHIFT 2 460#define RT5663_DAC_OSR_SHIFT 2
468#define RT5668_DAC_OSR_128 (0x0 << 2) 461#define RT5663_DAC_OSR_128 (0x0 << 2)
469#define RT5668_DAC_OSR_64 (0x1 << 2) 462#define RT5663_DAC_OSR_64 (0x1 << 2)
470#define RT5668_DAC_OSR_32 (0x2 << 2) 463#define RT5663_DAC_OSR_32 (0x2 << 2)
471#define RT5668_ADC_OSR_MASK (0x3) 464#define RT5663_ADC_OSR_MASK (0x3)
472#define RT5668_ADC_OSR_SHIFT 0 465#define RT5663_ADC_OSR_SHIFT 0
473#define RT5668_ADC_OSR_128 (0x0) 466#define RT5663_ADC_OSR_128 (0x0)
474#define RT5668_ADC_OSR_64 (0x1) 467#define RT5663_ADC_OSR_64 (0x1)
475#define RT5668_ADC_OSR_32 (0x2) 468#define RT5663_ADC_OSR_32 (0x2)
476 469
477/* TDM1 control 1 (0x0078) */ 470/* TDM1 control 1 (0x0078) */
478#define RT5668_TDM_MODE_MASK (0x1 << 15) 471#define RT5663_TDM_MODE_MASK (0x1 << 15)
479#define RT5668_TDM_MODE_SHIFT 15 472#define RT5663_TDM_MODE_SHIFT 15
480#define RT5668_TDM_MODE_I2S (0x0 << 15) 473#define RT5663_TDM_MODE_I2S (0x0 << 15)
481#define RT5668_TDM_MODE_TDM (0x1 << 15) 474#define RT5663_TDM_MODE_TDM (0x1 << 15)
482#define RT5668_TDM_IN_CH_MASK (0x3 << 10) 475#define RT5663_TDM_IN_CH_MASK (0x3 << 10)
483#define RT5668_TDM_IN_CH_SHIFT 10 476#define RT5663_TDM_IN_CH_SHIFT 10
484#define RT5668_TDM_IN_CH_2 (0x0 << 10) 477#define RT5663_TDM_IN_CH_2 (0x0 << 10)
485#define RT5668_TDM_IN_CH_4 (0x1 << 10) 478#define RT5663_TDM_IN_CH_4 (0x1 << 10)
486#define RT5668_TDM_IN_CH_6 (0x2 << 10) 479#define RT5663_TDM_IN_CH_6 (0x2 << 10)
487#define RT5668_TDM_IN_CH_8 (0x3 << 10) 480#define RT5663_TDM_IN_CH_8 (0x3 << 10)
488#define RT5668_TDM_OUT_CH_MASK (0x3 << 8) 481#define RT5663_TDM_OUT_CH_MASK (0x3 << 8)
489#define RT5668_TDM_OUT_CH_SHIFT 8 482#define RT5663_TDM_OUT_CH_SHIFT 8
490#define RT5668_TDM_OUT_CH_2 (0x0 << 8) 483#define RT5663_TDM_OUT_CH_2 (0x0 << 8)
491#define RT5668_TDM_OUT_CH_4 (0x1 << 8) 484#define RT5663_TDM_OUT_CH_4 (0x1 << 8)
492#define RT5668_TDM_OUT_CH_6 (0x2 << 8) 485#define RT5663_TDM_OUT_CH_6 (0x2 << 8)
493#define RT5668_TDM_OUT_CH_8 (0x3 << 8) 486#define RT5663_TDM_OUT_CH_8 (0x3 << 8)
494#define RT5668_TDM_IN_LEN_MASK (0x3 << 6) 487#define RT5663_TDM_IN_LEN_MASK (0x3 << 6)
495#define RT5668_TDM_IN_LEN_SHIFT 6 488#define RT5663_TDM_IN_LEN_SHIFT 6
496#define RT5668_TDM_IN_LEN_16 (0x0 << 6) 489#define RT5663_TDM_IN_LEN_16 (0x0 << 6)
497#define RT5668_TDM_IN_LEN_20 (0x1 << 6) 490#define RT5663_TDM_IN_LEN_20 (0x1 << 6)
498#define RT5668_TDM_IN_LEN_24 (0x2 << 6) 491#define RT5663_TDM_IN_LEN_24 (0x2 << 6)
499#define RT5668_TDM_IN_LEN_32 (0x3 << 6) 492#define RT5663_TDM_IN_LEN_32 (0x3 << 6)
500#define RT5668_TDM_OUT_LEN_MASK (0x3 << 4) 493#define RT5663_TDM_OUT_LEN_MASK (0x3 << 4)
501#define RT5668_TDM_OUT_LEN_SHIFT 4 494#define RT5663_TDM_OUT_LEN_SHIFT 4
502#define RT5668_TDM_OUT_LEN_16 (0x0 << 4) 495#define RT5663_TDM_OUT_LEN_16 (0x0 << 4)
503#define RT5668_TDM_OUT_LEN_20 (0x1 << 4) 496#define RT5663_TDM_OUT_LEN_20 (0x1 << 4)
504#define RT5668_TDM_OUT_LEN_24 (0x2 << 4) 497#define RT5663_TDM_OUT_LEN_24 (0x2 << 4)
505#define RT5668_TDM_OUT_LEN_32 (0x3 << 4) 498#define RT5663_TDM_OUT_LEN_32 (0x3 << 4)
506 499
507/* Global Clock Control (0x0080) */ 500/* Global Clock Control (0x0080) */
508#define RT5668_SCLK_SRC_MASK (0x3 << 14) 501#define RT5663_SCLK_SRC_MASK (0x3 << 14)
509#define RT5668_SCLK_SRC_SHIFT 14 502#define RT5663_SCLK_SRC_SHIFT 14
510#define RT5668_SCLK_SRC_MCLK (0x0 << 14) 503#define RT5663_SCLK_SRC_MCLK (0x0 << 14)
511#define RT5668_SCLK_SRC_PLL1 (0x1 << 14) 504#define RT5663_SCLK_SRC_PLL1 (0x1 << 14)
512#define RT5668_SCLK_SRC_RCCLK (0x2 << 14) 505#define RT5663_SCLK_SRC_RCCLK (0x2 << 14)
513#define RT5668_PLL1_SRC_MASK (0x7 << 8) 506#define RT5663_PLL1_SRC_MASK (0x7 << 11)
514#define RT5668_PLL1_SRC_SHIFT 8 507#define RT5663_PLL1_SRC_SHIFT 11
515#define RT5668_PLL1_SRC_MCLK (0x0 << 8) 508#define RT5663_PLL1_SRC_MCLK (0x0 << 11)
516#define RT5668_PLL1_SRC_BCLK1 (0x1 << 8) 509#define RT5663_PLL1_SRC_BCLK1 (0x1 << 11)
517#define RT5668_PLL1_PD_MASK (0x1 << 4) 510#define RT5663_V2_PLL1_SRC_MASK (0x7 << 8)
518#define RT5668_PLL1_PD_SHIFT 4 511#define RT5663_V2_PLL1_SRC_SHIFT 8
519 512#define RT5663_V2_PLL1_SRC_MCLK (0x0 << 8)
520#define RT5668_PLL_INP_MAX 40000000 513#define RT5663_V2_PLL1_SRC_BCLK1 (0x1 << 8)
521#define RT5668_PLL_INP_MIN 256000 514#define RT5663_PLL1_PD_MASK (0x1 << 4)
515#define RT5663_PLL1_PD_SHIFT 4
516
517#define RT5663_PLL_INP_MAX 40000000
518#define RT5663_PLL_INP_MIN 256000
522/* PLL M/N/K Code Control 1 (0x0081) */ 519/* PLL M/N/K Code Control 1 (0x0081) */
523#define RT5668_PLL_N_MAX 0x001ff 520#define RT5663_PLL_N_MAX 0x001ff
524#define RT5668_PLL_N_MASK (RT5668_PLL_N_MAX << 7) 521#define RT5663_PLL_N_MASK (RT5663_PLL_N_MAX << 7)
525#define RT5668_PLL_N_SHIFT 7 522#define RT5663_PLL_N_SHIFT 7
526#define RT5668_PLL_K_MAX 0x001f 523#define RT5663_PLL_K_MAX 0x001f
527#define RT5668_PLL_K_MASK (RT5668_PLL_K_MAX) 524#define RT5663_PLL_K_MASK (RT5663_PLL_K_MAX)
528#define RT5668_PLL_K_SHIFT 0 525#define RT5663_PLL_K_SHIFT 0
529 526
530/* PLL M/N/K Code Control 2 (0x0082) */ 527/* PLL M/N/K Code Control 2 (0x0082) */
531#define RT5668_PLL_M_MAX 0x00f 528#define RT5663_PLL_M_MAX 0x00f
532#define RT5668_PLL_M_MASK (RT5668_PLL_M_MAX << 12) 529#define RT5663_PLL_M_MASK (RT5663_PLL_M_MAX << 12)
533#define RT5668_PLL_M_SHIFT 12 530#define RT5663_PLL_M_SHIFT 12
534#define RT5668_PLL_M_BP (0x1 << 11) 531#define RT5663_PLL_M_BP (0x1 << 11)
535#define RT5668_PLL_M_BP_SHIFT 11 532#define RT5663_PLL_M_BP_SHIFT 11
536 533
537/* PLL tracking mode 1 (0x0083) */ 534/* PLL tracking mode 1 (0x0083) */
538#define RT5668_I2S1_ASRC_MASK (0x1 << 13) 535#define RT5663_V2_I2S1_ASRC_MASK (0x1 << 13)
539#define RT5668_I2S1_ASRC_SHIFT 13 536#define RT5663_V2_I2S1_ASRC_SHIFT 13
540#define RT5668_DAC_STO1_ASRC_MASK (0x1 << 12) 537#define RT5663_V2_DAC_STO1_ASRC_MASK (0x1 << 12)
541#define RT5668_DAC_STO1_ASRC_SHIFT 12 538#define RT5663_V2_DAC_STO1_ASRC_SHIFT 12
542#define RT5668_ADC_STO1_ASRC_MASK (0x1 << 4) 539#define RT5663_V2_ADC_STO1_ASRC_MASK (0x1 << 4)
543#define RT5668_ADC_STO1_ASRC_SHIFT 4 540#define RT5663_V2_ADC_STO1_ASRC_SHIFT 4
544 541
545/* PLL tracking mode 2 (0x0084)*/ 542/* PLL tracking mode 2 (0x0084)*/
546#define RT5668_DA_STO1_TRACK_MASK (0x7 << 12) 543#define RT5663_DA_STO1_TRACK_MASK (0x7 << 12)
547#define RT5668_DA_STO1_TRACK_SHIFT 12 544#define RT5663_DA_STO1_TRACK_SHIFT 12
548#define RT5668_DA_STO1_TRACK_SYSCLK (0x0 << 12) 545#define RT5663_DA_STO1_TRACK_SYSCLK (0x0 << 12)
549#define RT5668_DA_STO1_TRACK_I2S1 (0x1 << 12) 546#define RT5663_DA_STO1_TRACK_I2S1 (0x1 << 12)
550 547
551/* PLL tracking mode 3 (0x0085)*/ 548/* PLL tracking mode 3 (0x0085)*/
552#define RT5668_AD_STO1_TRACK_MASK (0x7 << 12) 549#define RT5663_V2_AD_STO1_TRACK_MASK (0x7 << 12)
553#define RT5668_AD_STO1_TRACK_SHIFT 12 550#define RT5663_V2_AD_STO1_TRACK_SHIFT 12
554#define RT5668_AD_STO1_TRACK_SYSCLK (0x0 << 12) 551#define RT5663_V2_AD_STO1_TRACK_SYSCLK (0x0 << 12)
555#define RT5668_AD_STO1_TRACK_I2S1 (0x1 << 12) 552#define RT5663_V2_AD_STO1_TRACK_I2S1 (0x1 << 12)
556 553
557/* HPOUT Charge pump control 1 (0x0091) */ 554/* HPOUT Charge pump control 1 (0x0091) */
558#define RT5668_OSW_HP_L_MASK (0x1 << 11) 555#define RT5663_OSW_HP_L_MASK (0x1 << 11)
559#define RT5668_OSW_HP_L_SHIFT 11 556#define RT5663_OSW_HP_L_SHIFT 11
560#define RT5668_OSW_HP_L_EN (0x1 << 11) 557#define RT5663_OSW_HP_L_EN (0x1 << 11)
561#define RT5668_OSW_HP_L_DIS (0x0 << 11) 558#define RT5663_OSW_HP_L_DIS (0x0 << 11)
562#define RT5668_OSW_HP_R_MASK (0x1 << 10) 559#define RT5663_OSW_HP_R_MASK (0x1 << 10)
563#define RT5668_OSW_HP_R_SHIFT 10 560#define RT5663_OSW_HP_R_SHIFT 10
564#define RT5668_OSW_HP_R_EN (0x1 << 10) 561#define RT5663_OSW_HP_R_EN (0x1 << 10)
565#define RT5668_OSW_HP_R_DIS (0x0 << 10) 562#define RT5663_OSW_HP_R_DIS (0x0 << 10)
566#define RT5668_SEL_PM_HP_MASK (0x3 << 8) 563#define RT5663_SEL_PM_HP_MASK (0x3 << 8)
567#define RT5668_SEL_PM_HP_SHIFT 8 564#define RT5663_SEL_PM_HP_SHIFT 8
568#define RT5668_SEL_PM_HP_0_6 (0x0 << 8) 565#define RT5663_SEL_PM_HP_0_6 (0x0 << 8)
569#define RT5668_SEL_PM_HP_0_9 (0x1 << 8) 566#define RT5663_SEL_PM_HP_0_9 (0x1 << 8)
570#define RT5668_SEL_PM_HP_1_8 (0x2 << 8) 567#define RT5663_SEL_PM_HP_1_8 (0x2 << 8)
571#define RT5668_SEL_PM_HP_HIGH (0x3 << 8) 568#define RT5663_SEL_PM_HP_HIGH (0x3 << 8)
572#define RT5668_OVCD_HP_MASK (0x1 << 2) 569#define RT5663_OVCD_HP_MASK (0x1 << 2)
573#define RT5668_OVCD_HP_SHIFT 2 570#define RT5663_OVCD_HP_SHIFT 2
574#define RT5668_OVCD_HP_EN (0x1 << 2) 571#define RT5663_OVCD_HP_EN (0x1 << 2)
575#define RT5668_OVCD_HP_DIS (0x0 << 2) 572#define RT5663_OVCD_HP_DIS (0x0 << 2)
576 573
577/* RC Clock Control (0x0094) */ 574/* RC Clock Control (0x0094) */
578#define RT5668_DIG_25M_CLK_MASK (0x1 << 9) 575#define RT5663_DIG_25M_CLK_MASK (0x1 << 9)
579#define RT5668_DIG_25M_CLK_SHIFT 9 576#define RT5663_DIG_25M_CLK_SHIFT 9
580#define RT5668_DIG_25M_CLK_DIS (0x0 << 9) 577#define RT5663_DIG_25M_CLK_DIS (0x0 << 9)
581#define RT5668_DIG_25M_CLK_EN (0x1 << 9) 578#define RT5663_DIG_25M_CLK_EN (0x1 << 9)
582#define RT5668_DIG_1M_CLK_MASK (0x1 << 8) 579#define RT5663_DIG_1M_CLK_MASK (0x1 << 8)
583#define RT5668_DIG_1M_CLK_SHIFT 8 580#define RT5663_DIG_1M_CLK_SHIFT 8
584#define RT5668_DIG_1M_CLK_DIS (0x0 << 8) 581#define RT5663_DIG_1M_CLK_DIS (0x0 << 8)
585#define RT5668_DIG_1M_CLK_EN (0x1 << 8) 582#define RT5663_DIG_1M_CLK_EN (0x1 << 8)
586 583
587/* Auto Turn On 1M RC CLK (0x009f) */ 584/* Auto Turn On 1M RC CLK (0x009f) */
588#define RT5668_IRQ_POW_SAV_MASK (0x1 << 15) 585#define RT5663_IRQ_POW_SAV_MASK (0x1 << 15)
589#define RT5668_IRQ_POW_SAV_SHIFT 15 586#define RT5663_IRQ_POW_SAV_SHIFT 15
590#define RT5668_IRQ_POW_SAV_DIS (0x0 << 15) 587#define RT5663_IRQ_POW_SAV_DIS (0x0 << 15)
591#define RT5668_IRQ_POW_SAV_EN (0x1 << 15) 588#define RT5663_IRQ_POW_SAV_EN (0x1 << 15)
592#define RT5668_IRQ_POW_SAV_JD1_MASK (0x1 << 14) 589#define RT5663_IRQ_POW_SAV_JD1_MASK (0x1 << 14)
593#define RT5668_IRQ_POW_SAV_JD1_SHIFT 14 590#define RT5663_IRQ_POW_SAV_JD1_SHIFT 14
594#define RT5668_IRQ_POW_SAV_JD1_DIS (0x0 << 14) 591#define RT5663_IRQ_POW_SAV_JD1_DIS (0x0 << 14)
595#define RT5668_IRQ_POW_SAV_JD1_EN (0x1 << 14) 592#define RT5663_IRQ_POW_SAV_JD1_EN (0x1 << 14)
596 593
597/* IRQ Control 1 (0x00b6) */ 594/* IRQ Control 1 (0x00b6) */
598#define RT5668_EN_CB_JD_MASK (0x1 << 3) 595#define RT5663_EN_CB_JD_MASK (0x1 << 3)
599#define RT5668_EN_CB_JD_SHIFT 3 596#define RT5663_EN_CB_JD_SHIFT 3
600#define RT5668_EN_CB_JD_EN (0x1 << 3) 597#define RT5663_EN_CB_JD_EN (0x1 << 3)
601#define RT5668_EN_CB_JD_DIS (0x0 << 3) 598#define RT5663_EN_CB_JD_DIS (0x0 << 3)
602 599
603/* IRQ Control 3 (0x00b8) */ 600/* IRQ Control 3 (0x00b8) */
604#define RT5668_EN_IRQ_INLINE_MASK (0x1 << 6) 601#define RT5663_V2_EN_IRQ_INLINE_MASK (0x1 << 6)
605#define RT5668_EN_IRQ_INLINE_SHIFT 6 602#define RT5663_V2_EN_IRQ_INLINE_SHIFT 6
606#define RT5668_EN_IRQ_INLINE_BYP (0x0 << 6) 603#define RT5663_V2_EN_IRQ_INLINE_BYP (0x0 << 6)
607#define RT5668_EN_IRQ_INLINE_NOR (0x1 << 6) 604#define RT5663_V2_EN_IRQ_INLINE_NOR (0x1 << 6)
608 605
609/* GPIO Control 1 (0x00c0) */ 606/* GPIO Control 1 (0x00c0) */
610#define RT5668_GP1_PIN_MASK (0x1 << 15) 607#define RT5663_GP1_PIN_MASK (0x1 << 15)
611#define RT5668_GP1_PIN_SHIFT 15 608#define RT5663_GP1_PIN_SHIFT 15
612#define RT5668_GP1_PIN_GPIO1 (0x0 << 15) 609#define RT5663_GP1_PIN_GPIO1 (0x0 << 15)
613#define RT5668_GP1_PIN_IRQ (0x1 << 15) 610#define RT5663_GP1_PIN_IRQ (0x1 << 15)
614 611
615/* GPIO Control 2 (0x00c1) */ 612/* GPIO Control 2 (0x00c1) */
616#define RT5668_GP4_PIN_CONF_MASK (0x1 << 5) 613#define RT5663_GP4_PIN_CONF_MASK (0x1 << 5)
617#define RT5668_GP4_PIN_CONF_SHIFT 5 614#define RT5663_GP4_PIN_CONF_SHIFT 5
618#define RT5668_GP4_PIN_CONF_INPUT (0x0 << 5) 615#define RT5663_GP4_PIN_CONF_INPUT (0x0 << 5)
619#define RT5668_GP4_PIN_CONF_OUTPUT (0x1 << 5) 616#define RT5663_GP4_PIN_CONF_OUTPUT (0x1 << 5)
620 617
621/* GPIO Control 2 (0x00c2) */ 618/* GPIO Control 2 (0x00c2) */
622#define RT5668_GP8_PIN_CONF_MASK (0x1 << 13) 619#define RT5663_GP8_PIN_CONF_MASK (0x1 << 13)
623#define RT5668_GP8_PIN_CONF_SHIFT 13 620#define RT5663_GP8_PIN_CONF_SHIFT 13
624#define RT5668_GP8_PIN_CONF_INPUT (0x0 << 13) 621#define RT5663_GP8_PIN_CONF_INPUT (0x0 << 13)
625#define RT5668_GP8_PIN_CONF_OUTPUT (0x1 << 13) 622#define RT5663_GP8_PIN_CONF_OUTPUT (0x1 << 13)
626 623
627/* 4 Buttons Inline Command Function 1 (0x00df) */ 624/* 4 Buttons Inline Command Function 1 (0x00df) */
628#define RT5668_4BTN_CLK_DEB_MASK (0x3 << 2) 625#define RT5663_4BTN_CLK_DEB_MASK (0x3 << 2)
629#define RT5668_4BTN_CLK_DEB_SHIFT 2 626#define RT5663_4BTN_CLK_DEB_SHIFT 2
630#define RT5668_4BTN_CLK_DEB_8MS (0x0 << 2) 627#define RT5663_4BTN_CLK_DEB_8MS (0x0 << 2)
631#define RT5668_4BTN_CLK_DEB_16MS (0x1 << 2) 628#define RT5663_4BTN_CLK_DEB_16MS (0x1 << 2)
632#define RT5668_4BTN_CLK_DEB_32MS (0x2 << 2) 629#define RT5663_4BTN_CLK_DEB_32MS (0x2 << 2)
633#define RT5668_4BTN_CLK_DEB_65MS (0x3 << 2) 630#define RT5663_4BTN_CLK_DEB_65MS (0x3 << 2)
634 631
635/* Inline Command Function 6 (0x00e0) */ 632/* Inline Command Function 6 (0x00e0) */
636#define RT5668_EN_4BTN_INL_MASK (0x1 << 15) 633#define RT5663_EN_4BTN_INL_MASK (0x1 << 15)
637#define RT5668_EN_4BTN_INL_SHIFT 15 634#define RT5663_EN_4BTN_INL_SHIFT 15
638#define RT5668_EN_4BTN_INL_DIS (0x0 << 15) 635#define RT5663_EN_4BTN_INL_DIS (0x0 << 15)
639#define RT5668_EN_4BTN_INL_EN (0x1 << 15) 636#define RT5663_EN_4BTN_INL_EN (0x1 << 15)
640#define RT5668_RESET_4BTN_INL_MASK (0x1 << 14) 637#define RT5663_RESET_4BTN_INL_MASK (0x1 << 14)
641#define RT5668_RESET_4BTN_INL_SHIFT 14 638#define RT5663_RESET_4BTN_INL_SHIFT 14
642#define RT5668_RESET_4BTN_INL_RESET (0x0 << 14) 639#define RT5663_RESET_4BTN_INL_RESET (0x0 << 14)
643#define RT5668_RESET_4BTN_INL_NOR (0x1 << 14) 640#define RT5663_RESET_4BTN_INL_NOR (0x1 << 14)
644 641
645/* Digital Misc Control (0x00fa) */ 642/* Digital Misc Control (0x00fa) */
646#define RT5668_DIG_GATE_CTRL_MASK 0x1 643#define RT5663_DIG_GATE_CTRL_MASK 0x1
647#define RT5668_DIG_GATE_CTRL_SHIFT (0) 644#define RT5663_DIG_GATE_CTRL_SHIFT (0)
648#define RT5668_DIG_GATE_CTRL_DIS 0x0 645#define RT5663_DIG_GATE_CTRL_DIS 0x0
649#define RT5668_DIG_GATE_CTRL_EN 0x1 646#define RT5663_DIG_GATE_CTRL_EN 0x1
650 647
651/* Chopper and Clock control for DAC L (0x013a)*/ 648/* Chopper and Clock control for DAC L (0x013a)*/
652#define RT5668_CKXEN_DAC1_MASK (0x1 << 13) 649#define RT5663_CKXEN_DAC1_MASK (0x1 << 13)
653#define RT5668_CKXEN_DAC1_SHIFT 13 650#define RT5663_CKXEN_DAC1_SHIFT 13
654#define RT5668_CKGEN_DAC1_MASK (0x1 << 12) 651#define RT5663_CKGEN_DAC1_MASK (0x1 << 12)
655#define RT5668_CKGEN_DAC1_SHIFT 12 652#define RT5663_CKGEN_DAC1_SHIFT 12
656 653
657/* Chopper and Clock control for ADC (0x013b)*/ 654/* Chopper and Clock control for ADC (0x013b)*/
658#define RT5668_CKXEN_ADCC_MASK (0x1 << 13) 655#define RT5663_CKXEN_ADCC_MASK (0x1 << 13)
659#define RT5668_CKXEN_ADCC_SHIFT 13 656#define RT5663_CKXEN_ADCC_SHIFT 13
660#define RT5668_CKGEN_ADCC_MASK (0x1 << 12) 657#define RT5663_CKGEN_ADCC_MASK (0x1 << 12)
661#define RT5668_CKGEN_ADCC_SHIFT 12 658#define RT5663_CKGEN_ADCC_SHIFT 12
662 659
663/* HP Behavior Logic Control 2 (0x01db) */ 660/* HP Behavior Logic Control 2 (0x01db) */
664#define RT5668_HP_SIG_SRC1_MASK (0x3) 661#define RT5663_HP_SIG_SRC1_MASK (0x3)
665#define RT5668_HP_SIG_SRC1_SHIFT 0 662#define RT5663_HP_SIG_SRC1_SHIFT 0
666#define RT5668_HP_SIG_SRC1_HP_DC (0x0) 663#define RT5663_HP_SIG_SRC1_HP_DC (0x0)
667#define RT5668_HP_SIG_SRC1_HP_CALIB (0x1) 664#define RT5663_HP_SIG_SRC1_HP_CALIB (0x1)
668#define RT5668_HP_SIG_SRC1_REG (0x2) 665#define RT5663_HP_SIG_SRC1_REG (0x2)
669#define RT5668_HP_SIG_SRC1_SILENCE (0x3) 666#define RT5663_HP_SIG_SRC1_SILENCE (0x3)
670 667
671/* RT5663 specific register */ 668/* RT5663 specific register */
672#define RT5663_HP_OUT_EN 0x0002 669#define RT5663_HP_OUT_EN 0x0002
@@ -707,6 +704,10 @@
707#define RT5663_TDM_3 0x0079 704#define RT5663_TDM_3 0x0079
708#define RT5663_TDM_4 0x007a 705#define RT5663_TDM_4 0x007a
709#define RT5663_TDM_5 0x007b 706#define RT5663_TDM_5 0x007b
707#define RT5663_TDM_6 0x007c
708#define RT5663_TDM_7 0x007d
709#define RT5663_TDM_8 0x007e
710#define RT5663_TDM_9 0x007f
710#define RT5663_GLB_CLK 0x0080 711#define RT5663_GLB_CLK 0x0080
711#define RT5663_PLL_1 0x0081 712#define RT5663_PLL_1 0x0081
712#define RT5663_PLL_2 0x0082 713#define RT5663_PLL_2 0x0082
@@ -739,7 +740,7 @@
739#define RT5663_INT_ST_2 0x00bf 740#define RT5663_INT_ST_2 0x00bf
740#define RT5663_GPIO_1 0x00c0 741#define RT5663_GPIO_1 0x00c0
741#define RT5663_GPIO_2 0x00c1 742#define RT5663_GPIO_2 0x00c1
742#define RT5663_GPIO_STA 0x00c5 743#define RT5663_GPIO_STA1 0x00c5
743#define RT5663_SIN_GEN_1 0x00cb 744#define RT5663_SIN_GEN_1 0x00cb
744#define RT5663_SIN_GEN_2 0x00cc 745#define RT5663_SIN_GEN_2 0x00cc
745#define RT5663_SIN_GEN_3 0x00cd 746#define RT5663_SIN_GEN_3 0x00cd
@@ -800,6 +801,8 @@
800#define RT5663_TEST_MODE_1 0x0144 801#define RT5663_TEST_MODE_1 0x0144
801#define RT5663_TEST_MODE_2 0x0145 802#define RT5663_TEST_MODE_2 0x0145
802#define RT5663_TEST_MODE_3 0x0146 803#define RT5663_TEST_MODE_3 0x0146
804#define RT5663_TEST_MODE_4 0x0147
805#define RT5663_TEST_MODE_5 0x0148
803#define RT5663_STO_DRE_1 0x0160 806#define RT5663_STO_DRE_1 0x0160
804#define RT5663_STO_DRE_2 0x0161 807#define RT5663_STO_DRE_2 0x0161
805#define RT5663_STO_DRE_3 0x0162 808#define RT5663_STO_DRE_3 0x0162
@@ -921,19 +924,19 @@
921#define RT5663_ADC_EQ_POST_VOL_L 0x03f2 924#define RT5663_ADC_EQ_POST_VOL_L 0x03f2
922#define RT5663_ADC_EQ_POST_VOL_R 0x03f3 925#define RT5663_ADC_EQ_POST_VOL_R 0x03f3
923 926
924/* RT5663: RECMIX Control (0x0010) */ 927/* RECMIX Control (0x0010) */
925#define RT5663_RECMIX1_BST1_MASK (0x1) 928#define RT5663_RECMIX1_BST1_MASK (0x1)
926#define RT5663_RECMIX1_BST1_SHIFT 0 929#define RT5663_RECMIX1_BST1_SHIFT 0
927#define RT5663_RECMIX1_BST1_ON (0x0) 930#define RT5663_RECMIX1_BST1_ON (0x0)
928#define RT5663_RECMIX1_BST1_OFF (0x1) 931#define RT5663_RECMIX1_BST1_OFF (0x1)
929 932
930/* RT5663: Bypass Stereo1 DAC Mixer Control (0x002d) */ 933/* Bypass Stereo1 DAC Mixer Control (0x002d) */
931#define RT5663_DACL1_SRC_MASK (0x1 << 3) 934#define RT5663_DACL1_SRC_MASK (0x1 << 3)
932#define RT5663_DACL1_SRC_SHIFT 3 935#define RT5663_DACL1_SRC_SHIFT 3
933#define RT5663_DACR1_SRC_MASK (0x1 << 2) 936#define RT5663_DACR1_SRC_MASK (0x1 << 2)
934#define RT5663_DACR1_SRC_SHIFT 2 937#define RT5663_DACR1_SRC_SHIFT 2
935 938
936/* RT5663: TDM control 2 (0x0078) */ 939/* TDM control 2 (0x0078) */
937#define RT5663_DATA_SWAP_ADCDAT1_MASK (0x3 << 14) 940#define RT5663_DATA_SWAP_ADCDAT1_MASK (0x3 << 14)
938#define RT5663_DATA_SWAP_ADCDAT1_SHIFT 14 941#define RT5663_DATA_SWAP_ADCDAT1_SHIFT 14
939#define RT5663_DATA_SWAP_ADCDAT1_LR (0x0 << 14) 942#define RT5663_DATA_SWAP_ADCDAT1_LR (0x0 << 14)
@@ -941,7 +944,7 @@
941#define RT5663_DATA_SWAP_ADCDAT1_LL (0x2 << 14) 944#define RT5663_DATA_SWAP_ADCDAT1_LL (0x2 << 14)
942#define RT5663_DATA_SWAP_ADCDAT1_RR (0x3 << 14) 945#define RT5663_DATA_SWAP_ADCDAT1_RR (0x3 << 14)
943 946
944/* RT5663: TDM control 5 (0x007b) */ 947/* TDM control 5 (0x007b) */
945#define RT5663_TDM_LENGTN_MASK (0x3) 948#define RT5663_TDM_LENGTN_MASK (0x3)
946#define RT5663_TDM_LENGTN_SHIFT 0 949#define RT5663_TDM_LENGTN_SHIFT 0
947#define RT5663_TDM_LENGTN_16 (0x0) 950#define RT5663_TDM_LENGTN_16 (0x0)
@@ -949,17 +952,6 @@
949#define RT5663_TDM_LENGTN_24 (0x2) 952#define RT5663_TDM_LENGTN_24 (0x2)
950#define RT5663_TDM_LENGTN_32 (0x3) 953#define RT5663_TDM_LENGTN_32 (0x3)
951 954
952/* RT5663: Global Clock Control (0x0080) */
953#define RT5663_SCLK_SRC_MASK (0x3 << 14)
954#define RT5663_SCLK_SRC_SHIFT 14
955#define RT5663_SCLK_SRC_MCLK (0x0 << 14)
956#define RT5663_SCLK_SRC_PLL1 (0x1 << 14)
957#define RT5663_SCLK_SRC_RCCLK (0x2 << 14)
958#define RT5663_PLL1_SRC_MASK (0x7 << 11)
959#define RT5663_PLL1_SRC_SHIFT 11
960#define RT5663_PLL1_SRC_MCLK (0x0 << 11)
961#define RT5663_PLL1_SRC_BCLK1 (0x1 << 11)
962
963/* PLL tracking mode 1 (0x0083) */ 955/* PLL tracking mode 1 (0x0083) */
964#define RT5663_I2S1_ASRC_MASK (0x1 << 11) 956#define RT5663_I2S1_ASRC_MASK (0x1 << 11)
965#define RT5663_I2S1_ASRC_SHIFT 11 957#define RT5663_I2S1_ASRC_SHIFT 11
@@ -978,37 +970,47 @@
978#define RT5663_AD_STO1_TRACK_SYSCLK (0x0) 970#define RT5663_AD_STO1_TRACK_SYSCLK (0x0)
979#define RT5663_AD_STO1_TRACK_I2S1 (0x1) 971#define RT5663_AD_STO1_TRACK_I2S1 (0x1)
980 972
981/* RT5663: HPOUT Charge pump control 1 (0x0091) */ 973/* HPOUT Charge pump control 1 (0x0091) */
982#define RT5663_SI_HP_MASK (0x1 << 12) 974#define RT5663_SI_HP_MASK (0x1 << 12)
983#define RT5663_SI_HP_SHIFT 12 975#define RT5663_SI_HP_SHIFT 12
984#define RT5663_SI_HP_EN (0x1 << 12) 976#define RT5663_SI_HP_EN (0x1 << 12)
985#define RT5663_SI_HP_DIS (0x0 << 12) 977#define RT5663_SI_HP_DIS (0x0 << 12)
986 978
987/* RT5663: GPIO Control 2 (0x00b6) */ 979/* GPIO Control 2 (0x00b6) */
988#define RT5663_GP1_PIN_CONF_MASK (0x1 << 2) 980#define RT5663_GP1_PIN_CONF_MASK (0x1 << 2)
989#define RT5663_GP1_PIN_CONF_SHIFT 2 981#define RT5663_GP1_PIN_CONF_SHIFT 2
990#define RT5663_GP1_PIN_CONF_OUTPUT (0x1 << 2) 982#define RT5663_GP1_PIN_CONF_OUTPUT (0x1 << 2)
991#define RT5663_GP1_PIN_CONF_INPUT (0x0 << 2) 983#define RT5663_GP1_PIN_CONF_INPUT (0x0 << 2)
992 984
993/* RT5663: GPIO Control 2 (0x00b7) */ 985/* GPIO Control 2 (0x00b7) */
994#define RT5663_EN_IRQ_INLINE_MASK (0x1 << 3) 986#define RT5663_EN_IRQ_INLINE_MASK (0x1 << 3)
995#define RT5663_EN_IRQ_INLINE_SHIFT 3 987#define RT5663_EN_IRQ_INLINE_SHIFT 3
996#define RT5663_EN_IRQ_INLINE_NOR (0x1 << 3) 988#define RT5663_EN_IRQ_INLINE_NOR (0x1 << 3)
997#define RT5663_EN_IRQ_INLINE_BYP (0x0 << 3) 989#define RT5663_EN_IRQ_INLINE_BYP (0x0 << 3)
998 990
999/* RT5663: IRQ Control 1 (0x00c1) */ 991/* GPIO Control 1 (0x00c0) */
992#define RT5663_GPIO1_TYPE_MASK (0x1 << 15)
993#define RT5663_GPIO1_TYPE_SHIFT 15
994#define RT5663_GPIO1_TYPE_EN (0x1 << 15)
995#define RT5663_GPIO1_TYPE_DIS (0x0 << 15)
996
997/* IRQ Control 1 (0x00c1) */
1000#define RT5663_EN_IRQ_JD1_MASK (0x1 << 6) 998#define RT5663_EN_IRQ_JD1_MASK (0x1 << 6)
1001#define RT5663_EN_IRQ_JD1_SHIFT 6 999#define RT5663_EN_IRQ_JD1_SHIFT 6
1002#define RT5663_EN_IRQ_JD1_EN (0x1 << 6) 1000#define RT5663_EN_IRQ_JD1_EN (0x1 << 6)
1003#define RT5663_EN_IRQ_JD1_DIS (0x0 << 6) 1001#define RT5663_EN_IRQ_JD1_DIS (0x0 << 6)
1002#define RT5663_SEL_GPIO1_MASK (0x1 << 2)
1003#define RT5663_SEL_GPIO1_SHIFT 6
1004#define RT5663_SEL_GPIO1_EN (0x1 << 2)
1005#define RT5663_SEL_GPIO1_DIS (0x0 << 2)
1004 1006
1005/* RT5663: Inline Command Function 2 (0x00dc) */ 1007/* Inline Command Function 2 (0x00dc) */
1006#define RT5663_PWR_MIC_DET_MASK (0x1) 1008#define RT5663_PWR_MIC_DET_MASK (0x1)
1007#define RT5663_PWR_MIC_DET_SHIFT 0 1009#define RT5663_PWR_MIC_DET_SHIFT 0
1008#define RT5663_PWR_MIC_DET_ON (0x1) 1010#define RT5663_PWR_MIC_DET_ON (0x1)
1009#define RT5663_PWR_MIC_DET_OFF (0x0) 1011#define RT5663_PWR_MIC_DET_OFF (0x0)
1010 1012
1011/* RT5663: Embeeded Jack and Type Detection Control 1 (0x00e6)*/ 1013/* Embeeded Jack and Type Detection Control 1 (0x00e6)*/
1012#define RT5663_CBJ_DET_MASK (0x1 << 15) 1014#define RT5663_CBJ_DET_MASK (0x1 << 15)
1013#define RT5663_CBJ_DET_SHIFT 15 1015#define RT5663_CBJ_DET_SHIFT 15
1014#define RT5663_CBJ_DET_DIS (0x0 << 15) 1016#define RT5663_CBJ_DET_DIS (0x0 << 15)
@@ -1022,17 +1024,17 @@
1022#define RT5663_POL_EXT_JD_EN (0x1 << 10) 1024#define RT5663_POL_EXT_JD_EN (0x1 << 10)
1023#define RT5663_POL_EXT_JD_DIS (0x0 << 10) 1025#define RT5663_POL_EXT_JD_DIS (0x0 << 10)
1024 1026
1025/* RT5663: DACREF LDO Control (0x0112)*/ 1027/* DACREF LDO Control (0x0112)*/
1026#define RT5663_PWR_LDO_DACREFL_MASK (0x1 << 9) 1028#define RT5663_PWR_LDO_DACREFL_MASK (0x1 << 9)
1027#define RT5663_PWR_LDO_DACREFL_SHIFT 9 1029#define RT5663_PWR_LDO_DACREFL_SHIFT 9
1028#define RT5663_PWR_LDO_DACREFR_MASK (0x1 << 1) 1030#define RT5663_PWR_LDO_DACREFR_MASK (0x1 << 1)
1029#define RT5663_PWR_LDO_DACREFR_SHIFT 1 1031#define RT5663_PWR_LDO_DACREFR_SHIFT 1
1030 1032
1031/* RT5663: Stereo Dynamic Range Enhancement Control 9 (0x0168, 0x0169)*/ 1033/* Stereo Dynamic Range Enhancement Control 9 (0x0168, 0x0169)*/
1032#define RT5663_DRE_GAIN_HP_MASK (0x1f) 1034#define RT5663_DRE_GAIN_HP_MASK (0x1f)
1033#define RT5663_DRE_GAIN_HP_SHIFT 0 1035#define RT5663_DRE_GAIN_HP_SHIFT 0
1034 1036
1035/* RT5663: Combo Jack Control (0x0250) */ 1037/* Combo Jack Control (0x0250) */
1036#define RT5663_INBUF_CBJ_BST1_MASK (0x1 << 11) 1038#define RT5663_INBUF_CBJ_BST1_MASK (0x1 << 11)
1037#define RT5663_INBUF_CBJ_BST1_SHIFT 11 1039#define RT5663_INBUF_CBJ_BST1_SHIFT 11
1038#define RT5663_INBUF_CBJ_BST1_ON (0x1 << 11) 1040#define RT5663_INBUF_CBJ_BST1_ON (0x1 << 11)
@@ -1042,11 +1044,11 @@
1042#define RT5663_CBJ_SENSE_BST1_L (0x1 << 10) 1044#define RT5663_CBJ_SENSE_BST1_L (0x1 << 10)
1043#define RT5663_CBJ_SENSE_BST1_R (0x0 << 10) 1045#define RT5663_CBJ_SENSE_BST1_R (0x0 << 10)
1044 1046
1045/* RT5663: Combo Jack Control (0x0251) */ 1047/* Combo Jack Control (0x0251) */
1046#define RT5663_GAIN_BST1_MASK (0xf) 1048#define RT5663_GAIN_BST1_MASK (0xf)
1047#define RT5663_GAIN_BST1_SHIFT 0 1049#define RT5663_GAIN_BST1_SHIFT 0
1048 1050
1049/* RT5663: Dummy register 1 (0x02fa) */ 1051/* Dummy register 1 (0x02fa) */
1050#define RT5663_EMB_CLK_MASK (0x1 << 9) 1052#define RT5663_EMB_CLK_MASK (0x1 << 9)
1051#define RT5663_EMB_CLK_SHIFT 9 1053#define RT5663_EMB_CLK_SHIFT 9
1052#define RT5663_EMB_CLK_EN (0x1 << 9) 1054#define RT5663_EMB_CLK_EN (0x1 << 9)
diff --git a/sound/soc/codecs/rt5665.c b/sound/soc/codecs/rt5665.c
new file mode 100644
index 000000000000..324461e985b3
--- /dev/null
+++ b/sound/soc/codecs/rt5665.c
@@ -0,0 +1,4874 @@
1/*
2 * rt5665.c -- RT5665/RT5658 ALSA SoC audio codec driver
3 *
4 * Copyright 2016 Realtek Semiconductor Corp.
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#include <linux/module.h>
13#include <linux/moduleparam.h>
14#include <linux/init.h>
15#include <linux/delay.h>
16#include <linux/pm.h>
17#include <linux/i2c.h>
18#include <linux/platform_device.h>
19#include <linux/spi/spi.h>
20#include <linux/acpi.h>
21#include <linux/gpio.h>
22#include <linux/of_gpio.h>
23#include <linux/regulator/consumer.h>
24#include <linux/mutex.h>
25#include <sound/core.h>
26#include <sound/pcm.h>
27#include <sound/pcm_params.h>
28#include <sound/jack.h>
29#include <sound/soc.h>
30#include <sound/soc-dapm.h>
31#include <sound/initval.h>
32#include <sound/tlv.h>
33#include <sound/rt5665.h>
34
35#include "rl6231.h"
36#include "rt5665.h"
37
38#define RT5665_NUM_SUPPLIES 3
39
40static const char *rt5665_supply_names[RT5665_NUM_SUPPLIES] = {
41 "AVDD",
42 "MICVDD",
43 "VBAT",
44};
45
46struct rt5665_priv {
47 struct snd_soc_codec *codec;
48 struct rt5665_platform_data pdata;
49 struct regmap *regmap;
50 struct gpio_desc *gpiod_ldo1_en;
51 struct gpio_desc *gpiod_reset;
52 struct snd_soc_jack *hs_jack;
53 struct regulator_bulk_data supplies[RT5665_NUM_SUPPLIES];
54 struct delayed_work jack_detect_work;
55 struct delayed_work calibrate_work;
56 struct delayed_work jd_check_work;
57 struct mutex calibrate_mutex;
58
59 int sysclk;
60 int sysclk_src;
61 int lrck[RT5665_AIFS];
62 int bclk[RT5665_AIFS];
63 int master[RT5665_AIFS];
64 int id;
65
66 int pll_src;
67 int pll_in;
68 int pll_out;
69
70 int jack_type;
71 int irq_work_delay_time;
72 unsigned int sar_adc_value;
73};
74
75static const struct reg_default rt5665_reg[] = {
76 {0x0000, 0x0000},
77 {0x0001, 0xc8c8},
78 {0x0002, 0x8080},
79 {0x0003, 0x8000},
80 {0x0004, 0xc80a},
81 {0x0005, 0x0000},
82 {0x0006, 0x0000},
83 {0x0007, 0x0000},
84 {0x000a, 0x0000},
85 {0x000b, 0x0000},
86 {0x000c, 0x0000},
87 {0x000d, 0x0000},
88 {0x000f, 0x0808},
89 {0x0010, 0x4040},
90 {0x0011, 0x0000},
91 {0x0012, 0x1404},
92 {0x0013, 0x1000},
93 {0x0014, 0xa00a},
94 {0x0015, 0x0404},
95 {0x0016, 0x0404},
96 {0x0017, 0x0011},
97 {0x0018, 0xafaf},
98 {0x0019, 0xafaf},
99 {0x001a, 0xafaf},
100 {0x001b, 0x0011},
101 {0x001c, 0x2f2f},
102 {0x001d, 0x2f2f},
103 {0x001e, 0x2f2f},
104 {0x001f, 0x0000},
105 {0x0020, 0x0000},
106 {0x0021, 0x0000},
107 {0x0022, 0x5757},
108 {0x0023, 0x0039},
109 {0x0026, 0xc0c0},
110 {0x0027, 0xc0c0},
111 {0x0028, 0xc0c0},
112 {0x0029, 0x8080},
113 {0x002a, 0xaaaa},
114 {0x002b, 0xaaaa},
115 {0x002c, 0xaba8},
116 {0x002d, 0x0000},
117 {0x002e, 0x0000},
118 {0x002f, 0x0000},
119 {0x0030, 0x0000},
120 {0x0031, 0x5000},
121 {0x0032, 0x0000},
122 {0x0033, 0x0000},
123 {0x0034, 0x0000},
124 {0x0035, 0x0000},
125 {0x003a, 0x0000},
126 {0x003b, 0x0000},
127 {0x003c, 0x00ff},
128 {0x003d, 0x0000},
129 {0x003e, 0x00ff},
130 {0x003f, 0x0000},
131 {0x0040, 0x0000},
132 {0x0041, 0x00ff},
133 {0x0042, 0x0000},
134 {0x0043, 0x00ff},
135 {0x0044, 0x0c0c},
136 {0x0049, 0xc00b},
137 {0x004a, 0x0000},
138 {0x004b, 0x031f},
139 {0x004d, 0x0000},
140 {0x004e, 0x001f},
141 {0x004f, 0x0000},
142 {0x0050, 0x001f},
143 {0x0052, 0xf000},
144 {0x0061, 0x0000},
145 {0x0062, 0x0000},
146 {0x0063, 0x003e},
147 {0x0064, 0x0000},
148 {0x0065, 0x0000},
149 {0x0066, 0x003f},
150 {0x0067, 0x0000},
151 {0x006b, 0x0000},
152 {0x006d, 0xff00},
153 {0x006e, 0x2808},
154 {0x006f, 0x000a},
155 {0x0070, 0x8000},
156 {0x0071, 0x8000},
157 {0x0072, 0x8000},
158 {0x0073, 0x7000},
159 {0x0074, 0x7770},
160 {0x0075, 0x0002},
161 {0x0076, 0x0001},
162 {0x0078, 0x00f0},
163 {0x0079, 0x0000},
164 {0x007a, 0x0000},
165 {0x007b, 0x0000},
166 {0x007c, 0x0000},
167 {0x007d, 0x0123},
168 {0x007e, 0x4500},
169 {0x007f, 0x8003},
170 {0x0080, 0x0000},
171 {0x0081, 0x0000},
172 {0x0082, 0x0000},
173 {0x0083, 0x0000},
174 {0x0084, 0x0000},
175 {0x0085, 0x0000},
176 {0x0086, 0x0008},
177 {0x0087, 0x0000},
178 {0x0088, 0x0000},
179 {0x0089, 0x0000},
180 {0x008a, 0x0000},
181 {0x008b, 0x0000},
182 {0x008c, 0x0003},
183 {0x008e, 0x0060},
184 {0x008f, 0x1000},
185 {0x0091, 0x0c26},
186 {0x0092, 0x0073},
187 {0x0093, 0x0000},
188 {0x0094, 0x0080},
189 {0x0098, 0x0000},
190 {0x0099, 0x0000},
191 {0x009a, 0x0007},
192 {0x009f, 0x0000},
193 {0x00a0, 0x0000},
194 {0x00a1, 0x0002},
195 {0x00a2, 0x0001},
196 {0x00a3, 0x0002},
197 {0x00a4, 0x0001},
198 {0x00ae, 0x2040},
199 {0x00af, 0x0000},
200 {0x00b6, 0x0000},
201 {0x00b7, 0x0000},
202 {0x00b8, 0x0000},
203 {0x00b9, 0x0000},
204 {0x00ba, 0x0002},
205 {0x00bb, 0x0000},
206 {0x00be, 0x0000},
207 {0x00c0, 0x0000},
208 {0x00c1, 0x0aaa},
209 {0x00c2, 0xaa80},
210 {0x00c3, 0x0003},
211 {0x00c4, 0x0000},
212 {0x00d0, 0x0000},
213 {0x00d1, 0x2244},
214 {0x00d3, 0x3300},
215 {0x00d4, 0x2200},
216 {0x00d9, 0x0809},
217 {0x00da, 0x0000},
218 {0x00db, 0x0008},
219 {0x00dc, 0x00c0},
220 {0x00dd, 0x6724},
221 {0x00de, 0x3131},
222 {0x00df, 0x0008},
223 {0x00e0, 0x4000},
224 {0x00e1, 0x3131},
225 {0x00e2, 0x600c},
226 {0x00ea, 0xb320},
227 {0x00eb, 0x0000},
228 {0x00ec, 0xb300},
229 {0x00ed, 0x0000},
230 {0x00ee, 0xb320},
231 {0x00ef, 0x0000},
232 {0x00f0, 0x0201},
233 {0x00f1, 0x0ddd},
234 {0x00f2, 0x0ddd},
235 {0x00f6, 0x0000},
236 {0x00f7, 0x0000},
237 {0x00f8, 0x0000},
238 {0x00fa, 0x0000},
239 {0x00fb, 0x0000},
240 {0x00fc, 0x0000},
241 {0x00fd, 0x0000},
242 {0x00fe, 0x10ec},
243 {0x00ff, 0x6451},
244 {0x0100, 0xaaaa},
245 {0x0101, 0x000a},
246 {0x010a, 0xaaaa},
247 {0x010b, 0xa0a0},
248 {0x010c, 0xaeae},
249 {0x010d, 0xaaaa},
250 {0x010e, 0xaaaa},
251 {0x010f, 0xaaaa},
252 {0x0110, 0xe002},
253 {0x0111, 0xa402},
254 {0x0112, 0xaaaa},
255 {0x0113, 0x2000},
256 {0x0117, 0x0f00},
257 {0x0125, 0x0410},
258 {0x0132, 0x0000},
259 {0x0133, 0x0000},
260 {0x0137, 0x5540},
261 {0x0138, 0x3700},
262 {0x0139, 0x79a1},
263 {0x013a, 0x2020},
264 {0x013b, 0x2020},
265 {0x013c, 0x2005},
266 {0x013f, 0x0000},
267 {0x0145, 0x0002},
268 {0x0146, 0x0000},
269 {0x0147, 0x0000},
270 {0x0148, 0x0000},
271 {0x0150, 0x0000},
272 {0x0160, 0x4eff},
273 {0x0161, 0x0080},
274 {0x0162, 0x0200},
275 {0x0163, 0x0800},
276 {0x0164, 0x0000},
277 {0x0165, 0x0000},
278 {0x0166, 0x0000},
279 {0x0167, 0x000f},
280 {0x0170, 0x4e87},
281 {0x0171, 0x0080},
282 {0x0172, 0x0200},
283 {0x0173, 0x0800},
284 {0x0174, 0x00ff},
285 {0x0175, 0x0000},
286 {0x0190, 0x413d},
287 {0x0191, 0x4139},
288 {0x0192, 0x4135},
289 {0x0193, 0x413d},
290 {0x0194, 0x0000},
291 {0x0195, 0x0000},
292 {0x0196, 0x0000},
293 {0x0197, 0x0000},
294 {0x0198, 0x0000},
295 {0x0199, 0x0000},
296 {0x01a0, 0x1e64},
297 {0x01a1, 0x06a3},
298 {0x01a2, 0x0000},
299 {0x01a3, 0x0000},
300 {0x01a4, 0x0000},
301 {0x01a5, 0x0000},
302 {0x01a6, 0x0000},
303 {0x01a7, 0x8000},
304 {0x01a8, 0x0000},
305 {0x01a9, 0x0000},
306 {0x01aa, 0x0000},
307 {0x01ab, 0x0000},
308 {0x01b5, 0x0000},
309 {0x01b6, 0x01c3},
310 {0x01b7, 0x02a0},
311 {0x01b8, 0x03e9},
312 {0x01b9, 0x1389},
313 {0x01ba, 0xc351},
314 {0x01bb, 0x0009},
315 {0x01bc, 0x0018},
316 {0x01bd, 0x002a},
317 {0x01be, 0x004c},
318 {0x01bf, 0x0097},
319 {0x01c0, 0x433d},
320 {0x01c1, 0x0000},
321 {0x01c2, 0x0000},
322 {0x01c3, 0x0000},
323 {0x01c4, 0x0000},
324 {0x01c5, 0x0000},
325 {0x01c6, 0x0000},
326 {0x01c7, 0x0000},
327 {0x01c8, 0x40af},
328 {0x01c9, 0x0702},
329 {0x01ca, 0x0000},
330 {0x01cb, 0x0000},
331 {0x01cc, 0x5757},
332 {0x01cd, 0x5757},
333 {0x01ce, 0x5757},
334 {0x01cf, 0x5757},
335 {0x01d0, 0x5757},
336 {0x01d1, 0x5757},
337 {0x01d2, 0x5757},
338 {0x01d3, 0x5757},
339 {0x01d4, 0x5757},
340 {0x01d5, 0x5757},
341 {0x01d6, 0x003c},
342 {0x01da, 0x0000},
343 {0x01db, 0x0000},
344 {0x01dc, 0x0000},
345 {0x01de, 0x7c00},
346 {0x01df, 0x0320},
347 {0x01e0, 0x06a1},
348 {0x01e1, 0x0000},
349 {0x01e2, 0x0000},
350 {0x01e3, 0x0000},
351 {0x01e4, 0x0000},
352 {0x01e6, 0x0001},
353 {0x01e7, 0x0000},
354 {0x01e8, 0x0000},
355 {0x01ea, 0xbf3f},
356 {0x01eb, 0x0000},
357 {0x01ec, 0x0000},
358 {0x01ed, 0x0000},
359 {0x01ee, 0x0000},
360 {0x01ef, 0x0000},
361 {0x01f0, 0x0000},
362 {0x01f1, 0x0000},
363 {0x01f2, 0x0000},
364 {0x01f3, 0x0000},
365 {0x01f4, 0x0000},
366 {0x0200, 0x0000},
367 {0x0201, 0x0000},
368 {0x0202, 0x0000},
369 {0x0203, 0x0000},
370 {0x0204, 0x0000},
371 {0x0205, 0x0000},
372 {0x0206, 0x0000},
373 {0x0207, 0x0000},
374 {0x0208, 0x0000},
375 {0x0210, 0x60b1},
376 {0x0211, 0xa005},
377 {0x0212, 0x024c},
378 {0x0213, 0xf7ff},
379 {0x0214, 0x024c},
380 {0x0215, 0x0102},
381 {0x0216, 0x00a3},
382 {0x0217, 0x0048},
383 {0x0218, 0xa2c0},
384 {0x0219, 0x0400},
385 {0x021a, 0x00c8},
386 {0x021b, 0x00c0},
387 {0x02ff, 0x0110},
388 {0x0300, 0x001f},
389 {0x0301, 0x032c},
390 {0x0302, 0x5f21},
391 {0x0303, 0x4000},
392 {0x0304, 0x4000},
393 {0x0305, 0x06d5},
394 {0x0306, 0x8000},
395 {0x0307, 0x0700},
396 {0x0310, 0x4560},
397 {0x0311, 0xa4a8},
398 {0x0312, 0x7418},
399 {0x0313, 0x0000},
400 {0x0314, 0x0006},
401 {0x0315, 0xffff},
402 {0x0316, 0xc400},
403 {0x0317, 0x0000},
404 {0x0330, 0x00a6},
405 {0x0331, 0x04c3},
406 {0x0332, 0x27c8},
407 {0x0333, 0xbf50},
408 {0x0334, 0x0045},
409 {0x0335, 0x0007},
410 {0x0336, 0x7418},
411 {0x0337, 0x0501},
412 {0x0338, 0x0000},
413 {0x0339, 0x0010},
414 {0x033a, 0x1010},
415 {0x03c0, 0x7e00},
416 {0x03c1, 0x8000},
417 {0x03c2, 0x8000},
418 {0x03c3, 0x8000},
419 {0x03c4, 0x8000},
420 {0x03c5, 0x8000},
421 {0x03c6, 0x8000},
422 {0x03c7, 0x8000},
423 {0x03c8, 0x8000},
424 {0x03c9, 0x8000},
425 {0x03ca, 0x8000},
426 {0x03cb, 0x8000},
427 {0x03cc, 0x8000},
428 {0x03d0, 0x0000},
429 {0x03d1, 0x0000},
430 {0x03d2, 0x0000},
431 {0x03d3, 0x0000},
432 {0x03d4, 0x2000},
433 {0x03d5, 0x2000},
434 {0x03d6, 0x0000},
435 {0x03d7, 0x0000},
436 {0x03d8, 0x2000},
437 {0x03d9, 0x2000},
438 {0x03da, 0x2000},
439 {0x03db, 0x2000},
440 {0x03dc, 0x0000},
441 {0x03dd, 0x0000},
442 {0x03de, 0x0000},
443 {0x03df, 0x2000},
444 {0x03e0, 0x0000},
445 {0x03e1, 0x0000},
446 {0x03e2, 0x0000},
447 {0x03e3, 0x0000},
448 {0x03e4, 0x0000},
449 {0x03e5, 0x0000},
450 {0x03e6, 0x0000},
451 {0x03e7, 0x0000},
452 {0x03e8, 0x0000},
453 {0x03e9, 0x0000},
454 {0x03ea, 0x0000},
455 {0x03eb, 0x0000},
456 {0x03ec, 0x0000},
457 {0x03ed, 0x0000},
458 {0x03ee, 0x0000},
459 {0x03ef, 0x0000},
460 {0x03f0, 0x0800},
461 {0x03f1, 0x0800},
462 {0x03f2, 0x0800},
463 {0x03f3, 0x0800},
464};
465
466static bool rt5665_volatile_register(struct device *dev, unsigned int reg)
467{
468 switch (reg) {
469 case RT5665_RESET:
470 case RT5665_EJD_CTRL_2:
471 case RT5665_GPIO_STA:
472 case RT5665_INT_ST_1:
473 case RT5665_IL_CMD_1:
474 case RT5665_4BTN_IL_CMD_1:
475 case RT5665_PSV_IL_CMD_1:
476 case RT5665_AJD1_CTRL:
477 case RT5665_JD_CTRL_3:
478 case RT5665_STO_NG2_CTRL_1:
479 case RT5665_SAR_IL_CMD_4:
480 case RT5665_DEVICE_ID:
481 case RT5665_STO1_DAC_SIL_DET ... RT5665_STO2_DAC_SIL_DET:
482 case RT5665_MONO_AMP_CALIB_STA1 ... RT5665_MONO_AMP_CALIB_STA6:
483 case RT5665_HP_IMP_SENS_CTRL_12 ... RT5665_HP_IMP_SENS_CTRL_15:
484 case RT5665_HP_CALIB_STA_1 ... RT5665_HP_CALIB_STA_11:
485 return true;
486 default:
487 return false;
488 }
489}
490
491static bool rt5665_readable_register(struct device *dev, unsigned int reg)
492{
493 switch (reg) {
494 case RT5665_RESET:
495 case RT5665_VENDOR_ID:
496 case RT5665_VENDOR_ID_1:
497 case RT5665_DEVICE_ID:
498 case RT5665_LOUT:
499 case RT5665_HP_CTRL_1:
500 case RT5665_HP_CTRL_2:
501 case RT5665_MONO_OUT:
502 case RT5665_HPL_GAIN:
503 case RT5665_HPR_GAIN:
504 case RT5665_MONO_GAIN:
505 case RT5665_CAL_BST_CTRL:
506 case RT5665_CBJ_BST_CTRL:
507 case RT5665_IN1_IN2:
508 case RT5665_IN3_IN4:
509 case RT5665_INL1_INR1_VOL:
510 case RT5665_EJD_CTRL_1:
511 case RT5665_EJD_CTRL_2:
512 case RT5665_EJD_CTRL_3:
513 case RT5665_EJD_CTRL_4:
514 case RT5665_EJD_CTRL_5:
515 case RT5665_EJD_CTRL_6:
516 case RT5665_EJD_CTRL_7:
517 case RT5665_DAC2_CTRL:
518 case RT5665_DAC2_DIG_VOL:
519 case RT5665_DAC1_DIG_VOL:
520 case RT5665_DAC3_DIG_VOL:
521 case RT5665_DAC3_CTRL:
522 case RT5665_STO1_ADC_DIG_VOL:
523 case RT5665_MONO_ADC_DIG_VOL:
524 case RT5665_STO2_ADC_DIG_VOL:
525 case RT5665_STO1_ADC_BOOST:
526 case RT5665_MONO_ADC_BOOST:
527 case RT5665_STO2_ADC_BOOST:
528 case RT5665_HP_IMP_GAIN_1:
529 case RT5665_HP_IMP_GAIN_2:
530 case RT5665_STO1_ADC_MIXER:
531 case RT5665_MONO_ADC_MIXER:
532 case RT5665_STO2_ADC_MIXER:
533 case RT5665_AD_DA_MIXER:
534 case RT5665_STO1_DAC_MIXER:
535 case RT5665_MONO_DAC_MIXER:
536 case RT5665_STO2_DAC_MIXER:
537 case RT5665_A_DAC1_MUX:
538 case RT5665_A_DAC2_MUX:
539 case RT5665_DIG_INF2_DATA:
540 case RT5665_DIG_INF3_DATA:
541 case RT5665_PDM_OUT_CTRL:
542 case RT5665_PDM_DATA_CTRL_1:
543 case RT5665_PDM_DATA_CTRL_2:
544 case RT5665_PDM_DATA_CTRL_3:
545 case RT5665_PDM_DATA_CTRL_4:
546 case RT5665_REC1_GAIN:
547 case RT5665_REC1_L1_MIXER:
548 case RT5665_REC1_L2_MIXER:
549 case RT5665_REC1_R1_MIXER:
550 case RT5665_REC1_R2_MIXER:
551 case RT5665_REC2_GAIN:
552 case RT5665_REC2_L1_MIXER:
553 case RT5665_REC2_L2_MIXER:
554 case RT5665_REC2_R1_MIXER:
555 case RT5665_REC2_R2_MIXER:
556 case RT5665_CAL_REC:
557 case RT5665_ALC_BACK_GAIN:
558 case RT5665_MONOMIX_GAIN:
559 case RT5665_MONOMIX_IN_GAIN:
560 case RT5665_OUT_L_GAIN:
561 case RT5665_OUT_L_MIXER:
562 case RT5665_OUT_R_GAIN:
563 case RT5665_OUT_R_MIXER:
564 case RT5665_LOUT_MIXER:
565 case RT5665_PWR_DIG_1:
566 case RT5665_PWR_DIG_2:
567 case RT5665_PWR_ANLG_1:
568 case RT5665_PWR_ANLG_2:
569 case RT5665_PWR_ANLG_3:
570 case RT5665_PWR_MIXER:
571 case RT5665_PWR_VOL:
572 case RT5665_CLK_DET:
573 case RT5665_HPF_CTRL1:
574 case RT5665_DMIC_CTRL_1:
575 case RT5665_DMIC_CTRL_2:
576 case RT5665_I2S1_SDP:
577 case RT5665_I2S2_SDP:
578 case RT5665_I2S3_SDP:
579 case RT5665_ADDA_CLK_1:
580 case RT5665_ADDA_CLK_2:
581 case RT5665_I2S1_F_DIV_CTRL_1:
582 case RT5665_I2S1_F_DIV_CTRL_2:
583 case RT5665_TDM_CTRL_1:
584 case RT5665_TDM_CTRL_2:
585 case RT5665_TDM_CTRL_3:
586 case RT5665_TDM_CTRL_4:
587 case RT5665_TDM_CTRL_5:
588 case RT5665_TDM_CTRL_6:
589 case RT5665_TDM_CTRL_7:
590 case RT5665_TDM_CTRL_8:
591 case RT5665_GLB_CLK:
592 case RT5665_PLL_CTRL_1:
593 case RT5665_PLL_CTRL_2:
594 case RT5665_ASRC_1:
595 case RT5665_ASRC_2:
596 case RT5665_ASRC_3:
597 case RT5665_ASRC_4:
598 case RT5665_ASRC_5:
599 case RT5665_ASRC_6:
600 case RT5665_ASRC_7:
601 case RT5665_ASRC_8:
602 case RT5665_ASRC_9:
603 case RT5665_ASRC_10:
604 case RT5665_DEPOP_1:
605 case RT5665_DEPOP_2:
606 case RT5665_HP_CHARGE_PUMP_1:
607 case RT5665_HP_CHARGE_PUMP_2:
608 case RT5665_MICBIAS_1:
609 case RT5665_MICBIAS_2:
610 case RT5665_ASRC_12:
611 case RT5665_ASRC_13:
612 case RT5665_ASRC_14:
613 case RT5665_RC_CLK_CTRL:
614 case RT5665_I2S_M_CLK_CTRL_1:
615 case RT5665_I2S2_F_DIV_CTRL_1:
616 case RT5665_I2S2_F_DIV_CTRL_2:
617 case RT5665_I2S3_F_DIV_CTRL_1:
618 case RT5665_I2S3_F_DIV_CTRL_2:
619 case RT5665_EQ_CTRL_1:
620 case RT5665_EQ_CTRL_2:
621 case RT5665_IRQ_CTRL_1:
622 case RT5665_IRQ_CTRL_2:
623 case RT5665_IRQ_CTRL_3:
624 case RT5665_IRQ_CTRL_4:
625 case RT5665_IRQ_CTRL_5:
626 case RT5665_IRQ_CTRL_6:
627 case RT5665_INT_ST_1:
628 case RT5665_GPIO_CTRL_1:
629 case RT5665_GPIO_CTRL_2:
630 case RT5665_GPIO_CTRL_3:
631 case RT5665_GPIO_CTRL_4:
632 case RT5665_GPIO_STA:
633 case RT5665_HP_AMP_DET_CTRL_1:
634 case RT5665_HP_AMP_DET_CTRL_2:
635 case RT5665_MID_HP_AMP_DET:
636 case RT5665_LOW_HP_AMP_DET:
637 case RT5665_SV_ZCD_1:
638 case RT5665_SV_ZCD_2:
639 case RT5665_IL_CMD_1:
640 case RT5665_IL_CMD_2:
641 case RT5665_IL_CMD_3:
642 case RT5665_IL_CMD_4:
643 case RT5665_4BTN_IL_CMD_1:
644 case RT5665_4BTN_IL_CMD_2:
645 case RT5665_4BTN_IL_CMD_3:
646 case RT5665_PSV_IL_CMD_1:
647 case RT5665_ADC_STO1_HP_CTRL_1:
648 case RT5665_ADC_STO1_HP_CTRL_2:
649 case RT5665_ADC_MONO_HP_CTRL_1:
650 case RT5665_ADC_MONO_HP_CTRL_2:
651 case RT5665_ADC_STO2_HP_CTRL_1:
652 case RT5665_ADC_STO2_HP_CTRL_2:
653 case RT5665_AJD1_CTRL:
654 case RT5665_JD1_THD:
655 case RT5665_JD2_THD:
656 case RT5665_JD_CTRL_1:
657 case RT5665_JD_CTRL_2:
658 case RT5665_JD_CTRL_3:
659 case RT5665_DIG_MISC:
660 case RT5665_DUMMY_2:
661 case RT5665_DUMMY_3:
662 case RT5665_DAC_ADC_DIG_VOL1:
663 case RT5665_DAC_ADC_DIG_VOL2:
664 case RT5665_BIAS_CUR_CTRL_1:
665 case RT5665_BIAS_CUR_CTRL_2:
666 case RT5665_BIAS_CUR_CTRL_3:
667 case RT5665_BIAS_CUR_CTRL_4:
668 case RT5665_BIAS_CUR_CTRL_5:
669 case RT5665_BIAS_CUR_CTRL_6:
670 case RT5665_BIAS_CUR_CTRL_7:
671 case RT5665_BIAS_CUR_CTRL_8:
672 case RT5665_BIAS_CUR_CTRL_9:
673 case RT5665_BIAS_CUR_CTRL_10:
674 case RT5665_VREF_REC_OP_FB_CAP_CTRL:
675 case RT5665_CHARGE_PUMP_1:
676 case RT5665_DIG_IN_CTRL_1:
677 case RT5665_DIG_IN_CTRL_2:
678 case RT5665_PAD_DRIVING_CTRL:
679 case RT5665_SOFT_RAMP_DEPOP:
680 case RT5665_PLL:
681 case RT5665_CHOP_DAC:
682 case RT5665_CHOP_ADC:
683 case RT5665_CALIB_ADC_CTRL:
684 case RT5665_VOL_TEST:
685 case RT5665_TEST_MODE_CTRL_1:
686 case RT5665_TEST_MODE_CTRL_2:
687 case RT5665_TEST_MODE_CTRL_3:
688 case RT5665_TEST_MODE_CTRL_4:
689 case RT5665_BASSBACK_CTRL:
690 case RT5665_STO_NG2_CTRL_1:
691 case RT5665_STO_NG2_CTRL_2:
692 case RT5665_STO_NG2_CTRL_3:
693 case RT5665_STO_NG2_CTRL_4:
694 case RT5665_STO_NG2_CTRL_5:
695 case RT5665_STO_NG2_CTRL_6:
696 case RT5665_STO_NG2_CTRL_7:
697 case RT5665_STO_NG2_CTRL_8:
698 case RT5665_MONO_NG2_CTRL_1:
699 case RT5665_MONO_NG2_CTRL_2:
700 case RT5665_MONO_NG2_CTRL_3:
701 case RT5665_MONO_NG2_CTRL_4:
702 case RT5665_MONO_NG2_CTRL_5:
703 case RT5665_MONO_NG2_CTRL_6:
704 case RT5665_STO1_DAC_SIL_DET:
705 case RT5665_MONOL_DAC_SIL_DET:
706 case RT5665_MONOR_DAC_SIL_DET:
707 case RT5665_STO2_DAC_SIL_DET:
708 case RT5665_SIL_PSV_CTRL1:
709 case RT5665_SIL_PSV_CTRL2:
710 case RT5665_SIL_PSV_CTRL3:
711 case RT5665_SIL_PSV_CTRL4:
712 case RT5665_SIL_PSV_CTRL5:
713 case RT5665_SIL_PSV_CTRL6:
714 case RT5665_MONO_AMP_CALIB_CTRL_1:
715 case RT5665_MONO_AMP_CALIB_CTRL_2:
716 case RT5665_MONO_AMP_CALIB_CTRL_3:
717 case RT5665_MONO_AMP_CALIB_CTRL_4:
718 case RT5665_MONO_AMP_CALIB_CTRL_5:
719 case RT5665_MONO_AMP_CALIB_CTRL_6:
720 case RT5665_MONO_AMP_CALIB_CTRL_7:
721 case RT5665_MONO_AMP_CALIB_STA1:
722 case RT5665_MONO_AMP_CALIB_STA2:
723 case RT5665_MONO_AMP_CALIB_STA3:
724 case RT5665_MONO_AMP_CALIB_STA4:
725 case RT5665_MONO_AMP_CALIB_STA6:
726 case RT5665_HP_IMP_SENS_CTRL_01:
727 case RT5665_HP_IMP_SENS_CTRL_02:
728 case RT5665_HP_IMP_SENS_CTRL_03:
729 case RT5665_HP_IMP_SENS_CTRL_04:
730 case RT5665_HP_IMP_SENS_CTRL_05:
731 case RT5665_HP_IMP_SENS_CTRL_06:
732 case RT5665_HP_IMP_SENS_CTRL_07:
733 case RT5665_HP_IMP_SENS_CTRL_08:
734 case RT5665_HP_IMP_SENS_CTRL_09:
735 case RT5665_HP_IMP_SENS_CTRL_10:
736 case RT5665_HP_IMP_SENS_CTRL_11:
737 case RT5665_HP_IMP_SENS_CTRL_12:
738 case RT5665_HP_IMP_SENS_CTRL_13:
739 case RT5665_HP_IMP_SENS_CTRL_14:
740 case RT5665_HP_IMP_SENS_CTRL_15:
741 case RT5665_HP_IMP_SENS_CTRL_16:
742 case RT5665_HP_IMP_SENS_CTRL_17:
743 case RT5665_HP_IMP_SENS_CTRL_18:
744 case RT5665_HP_IMP_SENS_CTRL_19:
745 case RT5665_HP_IMP_SENS_CTRL_20:
746 case RT5665_HP_IMP_SENS_CTRL_21:
747 case RT5665_HP_IMP_SENS_CTRL_22:
748 case RT5665_HP_IMP_SENS_CTRL_23:
749 case RT5665_HP_IMP_SENS_CTRL_24:
750 case RT5665_HP_IMP_SENS_CTRL_25:
751 case RT5665_HP_IMP_SENS_CTRL_26:
752 case RT5665_HP_IMP_SENS_CTRL_27:
753 case RT5665_HP_IMP_SENS_CTRL_28:
754 case RT5665_HP_IMP_SENS_CTRL_29:
755 case RT5665_HP_IMP_SENS_CTRL_30:
756 case RT5665_HP_IMP_SENS_CTRL_31:
757 case RT5665_HP_IMP_SENS_CTRL_32:
758 case RT5665_HP_IMP_SENS_CTRL_33:
759 case RT5665_HP_IMP_SENS_CTRL_34:
760 case RT5665_HP_LOGIC_CTRL_1:
761 case RT5665_HP_LOGIC_CTRL_2:
762 case RT5665_HP_LOGIC_CTRL_3:
763 case RT5665_HP_CALIB_CTRL_1:
764 case RT5665_HP_CALIB_CTRL_2:
765 case RT5665_HP_CALIB_CTRL_3:
766 case RT5665_HP_CALIB_CTRL_4:
767 case RT5665_HP_CALIB_CTRL_5:
768 case RT5665_HP_CALIB_CTRL_6:
769 case RT5665_HP_CALIB_CTRL_7:
770 case RT5665_HP_CALIB_CTRL_9:
771 case RT5665_HP_CALIB_CTRL_10:
772 case RT5665_HP_CALIB_CTRL_11:
773 case RT5665_HP_CALIB_STA_1:
774 case RT5665_HP_CALIB_STA_2:
775 case RT5665_HP_CALIB_STA_3:
776 case RT5665_HP_CALIB_STA_4:
777 case RT5665_HP_CALIB_STA_5:
778 case RT5665_HP_CALIB_STA_6:
779 case RT5665_HP_CALIB_STA_7:
780 case RT5665_HP_CALIB_STA_8:
781 case RT5665_HP_CALIB_STA_9:
782 case RT5665_HP_CALIB_STA_10:
783 case RT5665_HP_CALIB_STA_11:
784 case RT5665_PGM_TAB_CTRL1:
785 case RT5665_PGM_TAB_CTRL2:
786 case RT5665_PGM_TAB_CTRL3:
787 case RT5665_PGM_TAB_CTRL4:
788 case RT5665_PGM_TAB_CTRL5:
789 case RT5665_PGM_TAB_CTRL6:
790 case RT5665_PGM_TAB_CTRL7:
791 case RT5665_PGM_TAB_CTRL8:
792 case RT5665_PGM_TAB_CTRL9:
793 case RT5665_SAR_IL_CMD_1:
794 case RT5665_SAR_IL_CMD_2:
795 case RT5665_SAR_IL_CMD_3:
796 case RT5665_SAR_IL_CMD_4:
797 case RT5665_SAR_IL_CMD_5:
798 case RT5665_SAR_IL_CMD_6:
799 case RT5665_SAR_IL_CMD_7:
800 case RT5665_SAR_IL_CMD_8:
801 case RT5665_SAR_IL_CMD_9:
802 case RT5665_SAR_IL_CMD_10:
803 case RT5665_SAR_IL_CMD_11:
804 case RT5665_SAR_IL_CMD_12:
805 case RT5665_DRC1_CTRL_0:
806 case RT5665_DRC1_CTRL_1:
807 case RT5665_DRC1_CTRL_2:
808 case RT5665_DRC1_CTRL_3:
809 case RT5665_DRC1_CTRL_4:
810 case RT5665_DRC1_CTRL_5:
811 case RT5665_DRC1_CTRL_6:
812 case RT5665_DRC1_HARD_LMT_CTRL_1:
813 case RT5665_DRC1_HARD_LMT_CTRL_2:
814 case RT5665_DRC1_PRIV_1:
815 case RT5665_DRC1_PRIV_2:
816 case RT5665_DRC1_PRIV_3:
817 case RT5665_DRC1_PRIV_4:
818 case RT5665_DRC1_PRIV_5:
819 case RT5665_DRC1_PRIV_6:
820 case RT5665_DRC1_PRIV_7:
821 case RT5665_DRC1_PRIV_8:
822 case RT5665_ALC_PGA_CTRL_1:
823 case RT5665_ALC_PGA_CTRL_2:
824 case RT5665_ALC_PGA_CTRL_3:
825 case RT5665_ALC_PGA_CTRL_4:
826 case RT5665_ALC_PGA_CTRL_5:
827 case RT5665_ALC_PGA_CTRL_6:
828 case RT5665_ALC_PGA_CTRL_7:
829 case RT5665_ALC_PGA_CTRL_8:
830 case RT5665_ALC_PGA_STA_1:
831 case RT5665_ALC_PGA_STA_2:
832 case RT5665_ALC_PGA_STA_3:
833 case RT5665_EQ_AUTO_RCV_CTRL1:
834 case RT5665_EQ_AUTO_RCV_CTRL2:
835 case RT5665_EQ_AUTO_RCV_CTRL3:
836 case RT5665_EQ_AUTO_RCV_CTRL4:
837 case RT5665_EQ_AUTO_RCV_CTRL5:
838 case RT5665_EQ_AUTO_RCV_CTRL6:
839 case RT5665_EQ_AUTO_RCV_CTRL7:
840 case RT5665_EQ_AUTO_RCV_CTRL8:
841 case RT5665_EQ_AUTO_RCV_CTRL9:
842 case RT5665_EQ_AUTO_RCV_CTRL10:
843 case RT5665_EQ_AUTO_RCV_CTRL11:
844 case RT5665_EQ_AUTO_RCV_CTRL12:
845 case RT5665_EQ_AUTO_RCV_CTRL13:
846 case RT5665_ADC_L_EQ_LPF1_A1:
847 case RT5665_R_EQ_LPF1_A1:
848 case RT5665_L_EQ_LPF1_H0:
849 case RT5665_R_EQ_LPF1_H0:
850 case RT5665_L_EQ_BPF1_A1:
851 case RT5665_R_EQ_BPF1_A1:
852 case RT5665_L_EQ_BPF1_A2:
853 case RT5665_R_EQ_BPF1_A2:
854 case RT5665_L_EQ_BPF1_H0:
855 case RT5665_R_EQ_BPF1_H0:
856 case RT5665_L_EQ_BPF2_A1:
857 case RT5665_R_EQ_BPF2_A1:
858 case RT5665_L_EQ_BPF2_A2:
859 case RT5665_R_EQ_BPF2_A2:
860 case RT5665_L_EQ_BPF2_H0:
861 case RT5665_R_EQ_BPF2_H0:
862 case RT5665_L_EQ_BPF3_A1:
863 case RT5665_R_EQ_BPF3_A1:
864 case RT5665_L_EQ_BPF3_A2:
865 case RT5665_R_EQ_BPF3_A2:
866 case RT5665_L_EQ_BPF3_H0:
867 case RT5665_R_EQ_BPF3_H0:
868 case RT5665_L_EQ_BPF4_A1:
869 case RT5665_R_EQ_BPF4_A1:
870 case RT5665_L_EQ_BPF4_A2:
871 case RT5665_R_EQ_BPF4_A2:
872 case RT5665_L_EQ_BPF4_H0:
873 case RT5665_R_EQ_BPF4_H0:
874 case RT5665_L_EQ_HPF1_A1:
875 case RT5665_R_EQ_HPF1_A1:
876 case RT5665_L_EQ_HPF1_H0:
877 case RT5665_R_EQ_HPF1_H0:
878 case RT5665_L_EQ_PRE_VOL:
879 case RT5665_R_EQ_PRE_VOL:
880 case RT5665_L_EQ_POST_VOL:
881 case RT5665_R_EQ_POST_VOL:
882 case RT5665_SCAN_MODE_CTRL:
883 case RT5665_I2C_MODE:
884 return true;
885 default:
886 return false;
887 }
888}
889
890static const DECLARE_TLV_DB_SCALE(hp_vol_tlv, -2250, 150, 0);
891static const DECLARE_TLV_DB_SCALE(mono_vol_tlv, -1400, 150, 0);
892static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0);
893static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
894static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0);
895static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0);
896static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0);
897static const DECLARE_TLV_DB_SCALE(in_bst_tlv, -1200, 75, 0);
898
899/* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */
900static const DECLARE_TLV_DB_RANGE(bst_tlv,
901 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
902 1, 1, TLV_DB_SCALE_ITEM(2000, 0, 0),
903 2, 2, TLV_DB_SCALE_ITEM(2400, 0, 0),
904 3, 5, TLV_DB_SCALE_ITEM(3000, 500, 0),
905 6, 6, TLV_DB_SCALE_ITEM(4400, 0, 0),
906 7, 7, TLV_DB_SCALE_ITEM(5000, 0, 0),
907 8, 8, TLV_DB_SCALE_ITEM(5200, 0, 0)
908);
909
910/* Interface data select */
911static const char * const rt5665_data_select[] = {
912 "L/R", "R/L", "L/L", "R/R"
913};
914
915static const SOC_ENUM_SINGLE_DECL(rt5665_if1_1_01_adc_enum,
916 RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT01_SFT, rt5665_data_select);
917
918static const SOC_ENUM_SINGLE_DECL(rt5665_if1_1_23_adc_enum,
919 RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT23_SFT, rt5665_data_select);
920
921static const SOC_ENUM_SINGLE_DECL(rt5665_if1_1_45_adc_enum,
922 RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT45_SFT, rt5665_data_select);
923
924static const SOC_ENUM_SINGLE_DECL(rt5665_if1_1_67_adc_enum,
925 RT5665_TDM_CTRL_2, RT5665_I2S1_1_DS_ADC_SLOT67_SFT, rt5665_data_select);
926
927static const SOC_ENUM_SINGLE_DECL(rt5665_if1_2_01_adc_enum,
928 RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT01_SFT, rt5665_data_select);
929
930static const SOC_ENUM_SINGLE_DECL(rt5665_if1_2_23_adc_enum,
931 RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT23_SFT, rt5665_data_select);
932
933static const SOC_ENUM_SINGLE_DECL(rt5665_if1_2_45_adc_enum,
934 RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT45_SFT, rt5665_data_select);
935
936static const SOC_ENUM_SINGLE_DECL(rt5665_if1_2_67_adc_enum,
937 RT5665_TDM_CTRL_2, RT5665_I2S1_2_DS_ADC_SLOT67_SFT, rt5665_data_select);
938
939static const SOC_ENUM_SINGLE_DECL(rt5665_if2_1_dac_enum,
940 RT5665_DIG_INF2_DATA, RT5665_IF2_1_DAC_SEL_SFT, rt5665_data_select);
941
942static const SOC_ENUM_SINGLE_DECL(rt5665_if2_1_adc_enum,
943 RT5665_DIG_INF2_DATA, RT5665_IF2_1_ADC_SEL_SFT, rt5665_data_select);
944
945static const SOC_ENUM_SINGLE_DECL(rt5665_if2_2_dac_enum,
946 RT5665_DIG_INF2_DATA, RT5665_IF2_2_DAC_SEL_SFT, rt5665_data_select);
947
948static const SOC_ENUM_SINGLE_DECL(rt5665_if2_2_adc_enum,
949 RT5665_DIG_INF2_DATA, RT5665_IF2_2_ADC_SEL_SFT, rt5665_data_select);
950
951static const SOC_ENUM_SINGLE_DECL(rt5665_if3_dac_enum,
952 RT5665_DIG_INF3_DATA, RT5665_IF3_DAC_SEL_SFT, rt5665_data_select);
953
954static const SOC_ENUM_SINGLE_DECL(rt5665_if3_adc_enum,
955 RT5665_DIG_INF3_DATA, RT5665_IF3_ADC_SEL_SFT, rt5665_data_select);
956
957static const struct snd_kcontrol_new rt5665_if1_1_01_adc_swap_mux =
958 SOC_DAPM_ENUM("IF1_1 01 ADC Swap Mux", rt5665_if1_1_01_adc_enum);
959
960static const struct snd_kcontrol_new rt5665_if1_1_23_adc_swap_mux =
961 SOC_DAPM_ENUM("IF1_1 23 ADC Swap Mux", rt5665_if1_1_23_adc_enum);
962
963static const struct snd_kcontrol_new rt5665_if1_1_45_adc_swap_mux =
964 SOC_DAPM_ENUM("IF1_1 45 ADC Swap Mux", rt5665_if1_1_45_adc_enum);
965
966static const struct snd_kcontrol_new rt5665_if1_1_67_adc_swap_mux =
967 SOC_DAPM_ENUM("IF1_1 67 ADC Swap Mux", rt5665_if1_1_67_adc_enum);
968
969static const struct snd_kcontrol_new rt5665_if1_2_01_adc_swap_mux =
970 SOC_DAPM_ENUM("IF1_2 01 ADC Swap Mux", rt5665_if1_2_01_adc_enum);
971
972static const struct snd_kcontrol_new rt5665_if1_2_23_adc_swap_mux =
973 SOC_DAPM_ENUM("IF1_2 23 ADC1 Swap Mux", rt5665_if1_2_23_adc_enum);
974
975static const struct snd_kcontrol_new rt5665_if1_2_45_adc_swap_mux =
976 SOC_DAPM_ENUM("IF1_2 45 ADC1 Swap Mux", rt5665_if1_2_45_adc_enum);
977
978static const struct snd_kcontrol_new rt5665_if1_2_67_adc_swap_mux =
979 SOC_DAPM_ENUM("IF1_2 67 ADC1 Swap Mux", rt5665_if1_2_67_adc_enum);
980
981static const struct snd_kcontrol_new rt5665_if2_1_dac_swap_mux =
982 SOC_DAPM_ENUM("IF2_1 DAC Swap Source", rt5665_if2_1_dac_enum);
983
984static const struct snd_kcontrol_new rt5665_if2_1_adc_swap_mux =
985 SOC_DAPM_ENUM("IF2_1 ADC Swap Source", rt5665_if2_1_adc_enum);
986
987static const struct snd_kcontrol_new rt5665_if2_2_dac_swap_mux =
988 SOC_DAPM_ENUM("IF2_2 DAC Swap Source", rt5665_if2_2_dac_enum);
989
990static const struct snd_kcontrol_new rt5665_if2_2_adc_swap_mux =
991 SOC_DAPM_ENUM("IF2_2 ADC Swap Source", rt5665_if2_2_adc_enum);
992
993static const struct snd_kcontrol_new rt5665_if3_dac_swap_mux =
994 SOC_DAPM_ENUM("IF3 DAC Swap Source", rt5665_if3_dac_enum);
995
996static const struct snd_kcontrol_new rt5665_if3_adc_swap_mux =
997 SOC_DAPM_ENUM("IF3 ADC Swap Source", rt5665_if3_adc_enum);
998
999static int rt5665_hp_vol_put(struct snd_kcontrol *kcontrol,
1000 struct snd_ctl_elem_value *ucontrol)
1001{
1002 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1003 int ret = snd_soc_put_volsw(kcontrol, ucontrol);
1004
1005 if (snd_soc_read(codec, RT5665_STO_NG2_CTRL_1) & RT5665_NG2_EN) {
1006 snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1,
1007 RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
1008 snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1,
1009 RT5665_NG2_EN_MASK, RT5665_NG2_EN);
1010 }
1011
1012 return ret;
1013}
1014
1015static int rt5665_mono_vol_put(struct snd_kcontrol *kcontrol,
1016 struct snd_ctl_elem_value *ucontrol)
1017{
1018 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1019 int ret = snd_soc_put_volsw(kcontrol, ucontrol);
1020
1021 if (snd_soc_read(codec, RT5665_MONO_NG2_CTRL_1) & RT5665_NG2_EN) {
1022 snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1,
1023 RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
1024 snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1,
1025 RT5665_NG2_EN_MASK, RT5665_NG2_EN);
1026 }
1027
1028 return ret;
1029}
1030
1031/**
1032 * rt5665_sel_asrc_clk_src - select ASRC clock source for a set of filters
1033 * @codec: SoC audio codec device.
1034 * @filter_mask: mask of filters.
1035 * @clk_src: clock source
1036 *
1037 * The ASRC function is for asynchronous MCLK and LRCK. Also, since RT5665 can
1038 * only support standard 32fs or 64fs i2s format, ASRC should be enabled to
1039 * support special i2s clock format such as Intel's 100fs(100 * sampling rate).
1040 * ASRC function will track i2s clock and generate a corresponding system clock
1041 * for codec. This function provides an API to select the clock source for a
1042 * set of filters specified by the mask. And the codec driver will turn on ASRC
1043 * for these filters if ASRC is selected as their clock source.
1044 */
1045int rt5665_sel_asrc_clk_src(struct snd_soc_codec *codec,
1046 unsigned int filter_mask, unsigned int clk_src)
1047{
1048 unsigned int asrc2_mask = 0;
1049 unsigned int asrc2_value = 0;
1050 unsigned int asrc3_mask = 0;
1051 unsigned int asrc3_value = 0;
1052
1053 switch (clk_src) {
1054 case RT5665_CLK_SEL_SYS:
1055 case RT5665_CLK_SEL_I2S1_ASRC:
1056 case RT5665_CLK_SEL_I2S2_ASRC:
1057 case RT5665_CLK_SEL_I2S3_ASRC:
1058 case RT5665_CLK_SEL_SYS2:
1059 case RT5665_CLK_SEL_SYS3:
1060 case RT5665_CLK_SEL_SYS4:
1061 break;
1062
1063 default:
1064 return -EINVAL;
1065 }
1066
1067 if (filter_mask & RT5665_DA_STEREO1_FILTER) {
1068 asrc2_mask |= RT5665_DA_STO1_CLK_SEL_MASK;
1069 asrc2_value = (asrc2_value & ~RT5665_DA_STO1_CLK_SEL_MASK)
1070 | (clk_src << RT5665_DA_STO1_CLK_SEL_SFT);
1071 }
1072
1073 if (filter_mask & RT5665_DA_STEREO2_FILTER) {
1074 asrc2_mask |= RT5665_DA_STO2_CLK_SEL_MASK;
1075 asrc2_value = (asrc2_value & ~RT5665_DA_STO2_CLK_SEL_MASK)
1076 | (clk_src << RT5665_DA_STO2_CLK_SEL_SFT);
1077 }
1078
1079 if (filter_mask & RT5665_DA_MONO_L_FILTER) {
1080 asrc2_mask |= RT5665_DA_MONOL_CLK_SEL_MASK;
1081 asrc2_value = (asrc2_value & ~RT5665_DA_MONOL_CLK_SEL_MASK)
1082 | (clk_src << RT5665_DA_MONOL_CLK_SEL_SFT);
1083 }
1084
1085 if (filter_mask & RT5665_DA_MONO_R_FILTER) {
1086 asrc2_mask |= RT5665_DA_MONOR_CLK_SEL_MASK;
1087 asrc2_value = (asrc2_value & ~RT5665_DA_MONOR_CLK_SEL_MASK)
1088 | (clk_src << RT5665_DA_MONOR_CLK_SEL_SFT);
1089 }
1090
1091 if (filter_mask & RT5665_AD_STEREO1_FILTER) {
1092 asrc3_mask |= RT5665_AD_STO1_CLK_SEL_MASK;
1093 asrc3_value = (asrc2_value & ~RT5665_AD_STO1_CLK_SEL_MASK)
1094 | (clk_src << RT5665_AD_STO1_CLK_SEL_SFT);
1095 }
1096
1097 if (filter_mask & RT5665_AD_STEREO2_FILTER) {
1098 asrc3_mask |= RT5665_AD_STO2_CLK_SEL_MASK;
1099 asrc3_value = (asrc2_value & ~RT5665_AD_STO2_CLK_SEL_MASK)
1100 | (clk_src << RT5665_AD_STO2_CLK_SEL_SFT);
1101 }
1102
1103 if (filter_mask & RT5665_AD_MONO_L_FILTER) {
1104 asrc3_mask |= RT5665_AD_MONOL_CLK_SEL_MASK;
1105 asrc3_value = (asrc3_value & ~RT5665_AD_MONOL_CLK_SEL_MASK)
1106 | (clk_src << RT5665_AD_MONOL_CLK_SEL_SFT);
1107 }
1108
1109 if (filter_mask & RT5665_AD_MONO_R_FILTER) {
1110 asrc3_mask |= RT5665_AD_MONOR_CLK_SEL_MASK;
1111 asrc3_value = (asrc3_value & ~RT5665_AD_MONOR_CLK_SEL_MASK)
1112 | (clk_src << RT5665_AD_MONOR_CLK_SEL_SFT);
1113 }
1114
1115 if (asrc2_mask)
1116 snd_soc_update_bits(codec, RT5665_ASRC_2,
1117 asrc2_mask, asrc2_value);
1118
1119 if (asrc3_mask)
1120 snd_soc_update_bits(codec, RT5665_ASRC_3,
1121 asrc3_mask, asrc3_value);
1122
1123 return 0;
1124}
1125EXPORT_SYMBOL_GPL(rt5665_sel_asrc_clk_src);
1126
1127static int rt5665_button_detect(struct snd_soc_codec *codec)
1128{
1129 int btn_type, val;
1130
1131 val = snd_soc_read(codec, RT5665_4BTN_IL_CMD_1);
1132 btn_type = val & 0xfff0;
1133 snd_soc_write(codec, RT5665_4BTN_IL_CMD_1, val);
1134
1135 return btn_type;
1136}
1137
1138static void rt5665_enable_push_button_irq(struct snd_soc_codec *codec,
1139 bool enable)
1140{
1141 if (enable) {
1142 snd_soc_write(codec, RT5665_4BTN_IL_CMD_1, 0x000b);
1143 snd_soc_write(codec, RT5665_IL_CMD_1, 0x0048);
1144 snd_soc_update_bits(codec, RT5665_4BTN_IL_CMD_2,
1145 RT5665_4BTN_IL_MASK | RT5665_4BTN_IL_RST_MASK,
1146 RT5665_4BTN_IL_EN | RT5665_4BTN_IL_NOR);
1147 snd_soc_update_bits(codec, RT5665_IRQ_CTRL_3,
1148 RT5665_IL_IRQ_MASK, RT5665_IL_IRQ_EN);
1149 } else {
1150 snd_soc_update_bits(codec, RT5665_IRQ_CTRL_3,
1151 RT5665_IL_IRQ_MASK, RT5665_IL_IRQ_DIS);
1152 snd_soc_update_bits(codec, RT5665_4BTN_IL_CMD_2,
1153 RT5665_4BTN_IL_MASK, RT5665_4BTN_IL_DIS);
1154 snd_soc_update_bits(codec, RT5665_4BTN_IL_CMD_2,
1155 RT5665_4BTN_IL_RST_MASK, RT5665_4BTN_IL_RST);
1156 }
1157}
1158
1159/**
1160 * rt5665_headset_detect - Detect headset.
1161 * @codec: SoC audio codec device.
1162 * @jack_insert: Jack insert or not.
1163 *
1164 * Detect whether is headset or not when jack inserted.
1165 *
1166 * Returns detect status.
1167 */
1168static int rt5665_headset_detect(struct snd_soc_codec *codec, int jack_insert)
1169{
1170 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
1171 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1172 unsigned int sar_hs_type, val;
1173
1174 if (jack_insert) {
1175 snd_soc_dapm_force_enable_pin(dapm, "MICBIAS1");
1176 snd_soc_dapm_sync(dapm);
1177
1178 regmap_update_bits(rt5665->regmap, RT5665_MICBIAS_2, 0x100,
1179 0x100);
1180
1181 regmap_read(rt5665->regmap, RT5665_GPIO_STA, &val);
1182 if (val & 0x4) {
1183 regmap_update_bits(rt5665->regmap, RT5665_EJD_CTRL_1,
1184 0x100, 0);
1185
1186 regmap_read(rt5665->regmap, RT5665_GPIO_STA, &val);
1187 while (val & 0x4) {
1188 usleep_range(10000, 15000);
1189 regmap_read(rt5665->regmap, RT5665_GPIO_STA,
1190 &val);
1191 }
1192 }
1193
1194 regmap_update_bits(rt5665->regmap, RT5665_EJD_CTRL_1,
1195 0x180, 0x180);
1196 regmap_write(rt5665->regmap, RT5665_EJD_CTRL_3, 0x3424);
1197 regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1, 0xa291);
1198
1199 rt5665->sar_adc_value = snd_soc_read(rt5665->codec,
1200 RT5665_SAR_IL_CMD_4) & 0x7ff;
1201
1202 sar_hs_type = rt5665->pdata.sar_hs_type ?
1203 rt5665->pdata.sar_hs_type : 729;
1204
1205 if (rt5665->sar_adc_value > sar_hs_type) {
1206 rt5665->jack_type = SND_JACK_HEADSET;
1207 rt5665_enable_push_button_irq(codec, true);
1208 } else {
1209 rt5665->jack_type = SND_JACK_HEADPHONE;
1210 regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1,
1211 0x2291);
1212 regmap_update_bits(rt5665->regmap, RT5665_MICBIAS_2,
1213 0x100, 0);
1214 snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
1215 snd_soc_dapm_sync(dapm);
1216 }
1217 } else {
1218 regmap_write(rt5665->regmap, RT5665_SAR_IL_CMD_1, 0x2291);
1219 regmap_update_bits(rt5665->regmap, RT5665_MICBIAS_2, 0x100, 0);
1220 snd_soc_dapm_disable_pin(dapm, "MICBIAS1");
1221 snd_soc_dapm_sync(dapm);
1222 if (rt5665->jack_type == SND_JACK_HEADSET)
1223 rt5665_enable_push_button_irq(codec, false);
1224 rt5665->jack_type = 0;
1225 }
1226
1227 dev_dbg(codec->dev, "jack_type = %d\n", rt5665->jack_type);
1228 return rt5665->jack_type;
1229}
1230
1231static irqreturn_t rt5665_irq(int irq, void *data)
1232{
1233 struct rt5665_priv *rt5665 = data;
1234
1235 mod_delayed_work(system_power_efficient_wq,
1236 &rt5665->jack_detect_work, msecs_to_jiffies(250));
1237
1238 return IRQ_HANDLED;
1239}
1240
1241static void rt5665_jd_check_handler(struct work_struct *work)
1242{
1243 struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv,
1244 calibrate_work.work);
1245
1246 if (snd_soc_read(rt5665->codec, RT5665_AJD1_CTRL) & 0x0010) {
1247 /* jack out */
1248 rt5665->jack_type = rt5665_headset_detect(rt5665->codec, 0);
1249
1250 snd_soc_jack_report(rt5665->hs_jack, rt5665->jack_type,
1251 SND_JACK_HEADSET |
1252 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1253 SND_JACK_BTN_2 | SND_JACK_BTN_3);
1254 } else {
1255 schedule_delayed_work(&rt5665->jd_check_work, 500);
1256 }
1257}
1258
1259int rt5665_set_jack_detect(struct snd_soc_codec *codec,
1260 struct snd_soc_jack *hs_jack)
1261{
1262 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
1263
1264 switch (rt5665->pdata.jd_src) {
1265 case RT5665_JD1:
1266 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
1267 RT5665_GP1_PIN_MASK, RT5665_GP1_PIN_IRQ);
1268 regmap_update_bits(rt5665->regmap, RT5665_RC_CLK_CTRL,
1269 0xc000, 0xc000);
1270 regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_2,
1271 RT5665_PWR_JD1, RT5665_PWR_JD1);
1272 regmap_update_bits(rt5665->regmap, RT5665_IRQ_CTRL_1, 0x8, 0x8);
1273 break;
1274
1275 case RT5665_JD_NULL:
1276 break;
1277
1278 default:
1279 dev_warn(codec->dev, "Wrong JD source\n");
1280 break;
1281 }
1282
1283 rt5665->hs_jack = hs_jack;
1284
1285 return 0;
1286}
1287EXPORT_SYMBOL_GPL(rt5665_set_jack_detect);
1288
1289static void rt5665_jack_detect_handler(struct work_struct *work)
1290{
1291 struct rt5665_priv *rt5665 =
1292 container_of(work, struct rt5665_priv, jack_detect_work.work);
1293 int val, btn_type;
1294
1295 while (!rt5665->codec) {
1296 pr_debug("%s codec = null\n", __func__);
1297 usleep_range(10000, 15000);
1298 }
1299
1300 while (!rt5665->codec->component.card->instantiated) {
1301 pr_debug("%s\n", __func__);
1302 usleep_range(10000, 15000);
1303 }
1304
1305 mutex_lock(&rt5665->calibrate_mutex);
1306
1307 val = snd_soc_read(rt5665->codec, RT5665_AJD1_CTRL) & 0x0010;
1308 if (!val) {
1309 /* jack in */
1310 if (rt5665->jack_type == 0) {
1311 /* jack was out, report jack type */
1312 rt5665->jack_type =
1313 rt5665_headset_detect(rt5665->codec, 1);
1314 } else {
1315 /* jack is already in, report button event */
1316 rt5665->jack_type = SND_JACK_HEADSET;
1317 btn_type = rt5665_button_detect(rt5665->codec);
1318 /**
1319 * rt5665 can report three kinds of button behavior,
1320 * one click, double click and hold. However,
1321 * currently we will report button pressed/released
1322 * event. So all the three button behaviors are
1323 * treated as button pressed.
1324 */
1325 switch (btn_type) {
1326 case 0x8000:
1327 case 0x4000:
1328 case 0x2000:
1329 rt5665->jack_type |= SND_JACK_BTN_0;
1330 break;
1331 case 0x1000:
1332 case 0x0800:
1333 case 0x0400:
1334 rt5665->jack_type |= SND_JACK_BTN_1;
1335 break;
1336 case 0x0200:
1337 case 0x0100:
1338 case 0x0080:
1339 rt5665->jack_type |= SND_JACK_BTN_2;
1340 break;
1341 case 0x0040:
1342 case 0x0020:
1343 case 0x0010:
1344 rt5665->jack_type |= SND_JACK_BTN_3;
1345 break;
1346 case 0x0000: /* unpressed */
1347 break;
1348 default:
1349 btn_type = 0;
1350 dev_err(rt5665->codec->dev,
1351 "Unexpected button code 0x%04x\n",
1352 btn_type);
1353 break;
1354 }
1355 }
1356 } else {
1357 /* jack out */
1358 rt5665->jack_type = rt5665_headset_detect(rt5665->codec, 0);
1359 }
1360
1361 snd_soc_jack_report(rt5665->hs_jack, rt5665->jack_type,
1362 SND_JACK_HEADSET |
1363 SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1364 SND_JACK_BTN_2 | SND_JACK_BTN_3);
1365
1366 if (rt5665->jack_type & (SND_JACK_BTN_0 | SND_JACK_BTN_1 |
1367 SND_JACK_BTN_2 | SND_JACK_BTN_3))
1368 schedule_delayed_work(&rt5665->jd_check_work, 0);
1369 else
1370 cancel_delayed_work_sync(&rt5665->jd_check_work);
1371
1372 mutex_unlock(&rt5665->calibrate_mutex);
1373}
1374
1375static const struct snd_kcontrol_new rt5665_snd_controls[] = {
1376 /* Headphone Output Volume */
1377 SOC_DOUBLE_R_EXT_TLV("Headphone Playback Volume", RT5665_HPL_GAIN,
1378 RT5665_HPR_GAIN, RT5665_G_HP_SFT, 15, 1, snd_soc_get_volsw,
1379 rt5665_hp_vol_put, hp_vol_tlv),
1380
1381 /* Mono Output Volume */
1382 SOC_SINGLE_EXT_TLV("Mono Playback Volume", RT5665_MONO_GAIN,
1383 RT5665_L_VOL_SFT, 15, 1, snd_soc_get_volsw,
1384 rt5665_mono_vol_put, mono_vol_tlv),
1385
1386 /* Output Volume */
1387 SOC_DOUBLE_TLV("OUT Playback Volume", RT5665_LOUT, RT5665_L_VOL_SFT,
1388 RT5665_R_VOL_SFT, 39, 1, out_vol_tlv),
1389
1390 /* DAC Digital Volume */
1391 SOC_DOUBLE_TLV("DAC1 Playback Volume", RT5665_DAC1_DIG_VOL,
1392 RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 175, 0, dac_vol_tlv),
1393 SOC_DOUBLE_TLV("DAC2 Playback Volume", RT5665_DAC2_DIG_VOL,
1394 RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 175, 0, dac_vol_tlv),
1395 SOC_DOUBLE("DAC2 Playback Switch", RT5665_DAC2_CTRL,
1396 RT5665_M_DAC2_L_VOL_SFT, RT5665_M_DAC2_R_VOL_SFT, 1, 1),
1397
1398 /* IN1/IN2/IN3/IN4 Volume */
1399 SOC_SINGLE_TLV("IN1 Boost Volume", RT5665_IN1_IN2,
1400 RT5665_BST1_SFT, 69, 0, in_bst_tlv),
1401 SOC_SINGLE_TLV("IN2 Boost Volume", RT5665_IN1_IN2,
1402 RT5665_BST2_SFT, 69, 0, in_bst_tlv),
1403 SOC_SINGLE_TLV("IN3 Boost Volume", RT5665_IN3_IN4,
1404 RT5665_BST3_SFT, 69, 0, in_bst_tlv),
1405 SOC_SINGLE_TLV("IN4 Boost Volume", RT5665_IN3_IN4,
1406 RT5665_BST4_SFT, 69, 0, in_bst_tlv),
1407 SOC_SINGLE_TLV("CBJ Boost Volume", RT5665_CBJ_BST_CTRL,
1408 RT5665_BST_CBJ_SFT, 8, 0, bst_tlv),
1409
1410 /* INL/INR Volume Control */
1411 SOC_DOUBLE_TLV("IN Capture Volume", RT5665_INL1_INR1_VOL,
1412 RT5665_INL_VOL_SFT, RT5665_INR_VOL_SFT, 31, 1, in_vol_tlv),
1413
1414 /* ADC Digital Volume Control */
1415 SOC_DOUBLE("STO1 ADC Capture Switch", RT5665_STO1_ADC_DIG_VOL,
1416 RT5665_L_MUTE_SFT, RT5665_R_MUTE_SFT, 1, 1),
1417 SOC_DOUBLE_TLV("STO1 ADC Capture Volume", RT5665_STO1_ADC_DIG_VOL,
1418 RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 127, 0, adc_vol_tlv),
1419 SOC_DOUBLE("Mono ADC Capture Switch", RT5665_MONO_ADC_DIG_VOL,
1420 RT5665_L_MUTE_SFT, RT5665_R_MUTE_SFT, 1, 1),
1421 SOC_DOUBLE_TLV("Mono ADC Capture Volume", RT5665_MONO_ADC_DIG_VOL,
1422 RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 127, 0, adc_vol_tlv),
1423 SOC_DOUBLE("STO2 ADC Capture Switch", RT5665_STO2_ADC_DIG_VOL,
1424 RT5665_L_MUTE_SFT, RT5665_R_MUTE_SFT, 1, 1),
1425 SOC_DOUBLE_TLV("STO2 ADC Capture Volume", RT5665_STO2_ADC_DIG_VOL,
1426 RT5665_L_VOL_SFT, RT5665_R_VOL_SFT, 127, 0, adc_vol_tlv),
1427
1428 /* ADC Boost Volume Control */
1429 SOC_DOUBLE_TLV("STO1 ADC Boost Gain Volume", RT5665_STO1_ADC_BOOST,
1430 RT5665_STO1_ADC_L_BST_SFT, RT5665_STO1_ADC_R_BST_SFT,
1431 3, 0, adc_bst_tlv),
1432
1433 SOC_DOUBLE_TLV("Mono ADC Boost Gain Volume", RT5665_MONO_ADC_BOOST,
1434 RT5665_MONO_ADC_L_BST_SFT, RT5665_MONO_ADC_R_BST_SFT,
1435 3, 0, adc_bst_tlv),
1436
1437 SOC_DOUBLE_TLV("STO2 ADC Boost Gain Volume", RT5665_STO2_ADC_BOOST,
1438 RT5665_STO2_ADC_L_BST_SFT, RT5665_STO2_ADC_R_BST_SFT,
1439 3, 0, adc_bst_tlv),
1440};
1441
1442/**
1443 * set_dmic_clk - Set parameter of dmic.
1444 *
1445 * @w: DAPM widget.
1446 * @kcontrol: The kcontrol of this widget.
1447 * @event: Event id.
1448 *
1449 * Choose dmic clock between 1MHz and 3MHz.
1450 * It is better for clock to approximate 3MHz.
1451 */
1452static int set_dmic_clk(struct snd_soc_dapm_widget *w,
1453 struct snd_kcontrol *kcontrol, int event)
1454{
1455 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1456 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
1457 int pd, idx = -EINVAL;
1458
1459 pd = rl6231_get_pre_div(rt5665->regmap,
1460 RT5665_ADDA_CLK_1, RT5665_I2S_PD1_SFT);
1461 idx = rl6231_calc_dmic_clk(rt5665->sysclk / pd);
1462
1463 if (idx < 0)
1464 dev_err(codec->dev, "Failed to set DMIC clock\n");
1465 else {
1466 snd_soc_update_bits(codec, RT5665_DMIC_CTRL_1,
1467 RT5665_DMIC_CLK_MASK, idx << RT5665_DMIC_CLK_SFT);
1468 }
1469 return idx;
1470}
1471
1472static int rt5665_charge_pump_event(struct snd_soc_dapm_widget *w,
1473 struct snd_kcontrol *kcontrol, int event)
1474{
1475 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1476
1477 switch (event) {
1478 case SND_SOC_DAPM_PRE_PMU:
1479 snd_soc_update_bits(codec, RT5665_HP_CHARGE_PUMP_1,
1480 RT5665_PM_HP_MASK | RT5665_OSW_L_MASK,
1481 RT5665_PM_HP_HV | RT5665_OSW_L_EN);
1482 break;
1483 case SND_SOC_DAPM_POST_PMD:
1484 snd_soc_update_bits(codec, RT5665_HP_CHARGE_PUMP_1,
1485 RT5665_PM_HP_MASK | RT5665_OSW_L_MASK,
1486 RT5665_PM_HP_LV | RT5665_OSW_L_DIS);
1487 break;
1488 default:
1489 return 0;
1490 }
1491
1492 return 0;
1493}
1494
1495static int is_sys_clk_from_pll(struct snd_soc_dapm_widget *w,
1496 struct snd_soc_dapm_widget *sink)
1497{
1498 unsigned int val;
1499 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1500
1501 val = snd_soc_read(codec, RT5665_GLB_CLK);
1502 val &= RT5665_SCLK_SRC_MASK;
1503 if (val == RT5665_SCLK_SRC_PLL1)
1504 return 1;
1505 else
1506 return 0;
1507}
1508
1509static int is_using_asrc(struct snd_soc_dapm_widget *w,
1510 struct snd_soc_dapm_widget *sink)
1511{
1512 unsigned int reg, shift, val;
1513 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1514
1515 switch (w->shift) {
1516 case RT5665_ADC_MONO_R_ASRC_SFT:
1517 reg = RT5665_ASRC_3;
1518 shift = RT5665_AD_MONOR_CLK_SEL_SFT;
1519 break;
1520 case RT5665_ADC_MONO_L_ASRC_SFT:
1521 reg = RT5665_ASRC_3;
1522 shift = RT5665_AD_MONOL_CLK_SEL_SFT;
1523 break;
1524 case RT5665_ADC_STO1_ASRC_SFT:
1525 reg = RT5665_ASRC_3;
1526 shift = RT5665_AD_STO1_CLK_SEL_SFT;
1527 break;
1528 case RT5665_ADC_STO2_ASRC_SFT:
1529 reg = RT5665_ASRC_3;
1530 shift = RT5665_AD_STO2_CLK_SEL_SFT;
1531 break;
1532 case RT5665_DAC_MONO_R_ASRC_SFT:
1533 reg = RT5665_ASRC_2;
1534 shift = RT5665_DA_MONOR_CLK_SEL_SFT;
1535 break;
1536 case RT5665_DAC_MONO_L_ASRC_SFT:
1537 reg = RT5665_ASRC_2;
1538 shift = RT5665_DA_MONOL_CLK_SEL_SFT;
1539 break;
1540 case RT5665_DAC_STO1_ASRC_SFT:
1541 reg = RT5665_ASRC_2;
1542 shift = RT5665_DA_STO1_CLK_SEL_SFT;
1543 break;
1544 case RT5665_DAC_STO2_ASRC_SFT:
1545 reg = RT5665_ASRC_2;
1546 shift = RT5665_DA_STO2_CLK_SEL_SFT;
1547 break;
1548 default:
1549 return 0;
1550 }
1551
1552 val = (snd_soc_read(codec, reg) >> shift) & 0xf;
1553 switch (val) {
1554 case RT5665_CLK_SEL_I2S1_ASRC:
1555 case RT5665_CLK_SEL_I2S2_ASRC:
1556 case RT5665_CLK_SEL_I2S3_ASRC:
1557 /* I2S_Pre_Div1 should be 1 in asrc mode */
1558 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
1559 RT5665_I2S_PD1_MASK, RT5665_I2S_PD1_2);
1560 return 1;
1561 default:
1562 return 0;
1563 }
1564
1565}
1566
1567/* Digital Mixer */
1568static const struct snd_kcontrol_new rt5665_sto1_adc_l_mix[] = {
1569 SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO1_ADC_MIXER,
1570 RT5665_M_STO1_ADC_L1_SFT, 1, 1),
1571 SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO1_ADC_MIXER,
1572 RT5665_M_STO1_ADC_L2_SFT, 1, 1),
1573};
1574
1575static const struct snd_kcontrol_new rt5665_sto1_adc_r_mix[] = {
1576 SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO1_ADC_MIXER,
1577 RT5665_M_STO1_ADC_R1_SFT, 1, 1),
1578 SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO1_ADC_MIXER,
1579 RT5665_M_STO1_ADC_R2_SFT, 1, 1),
1580};
1581
1582static const struct snd_kcontrol_new rt5665_sto2_adc_l_mix[] = {
1583 SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO2_ADC_MIXER,
1584 RT5665_M_STO2_ADC_L1_SFT, 1, 1),
1585 SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO2_ADC_MIXER,
1586 RT5665_M_STO2_ADC_L2_SFT, 1, 1),
1587};
1588
1589static const struct snd_kcontrol_new rt5665_sto2_adc_r_mix[] = {
1590 SOC_DAPM_SINGLE("ADC1 Switch", RT5665_STO2_ADC_MIXER,
1591 RT5665_M_STO2_ADC_R1_SFT, 1, 1),
1592 SOC_DAPM_SINGLE("ADC2 Switch", RT5665_STO2_ADC_MIXER,
1593 RT5665_M_STO2_ADC_R2_SFT, 1, 1),
1594};
1595
1596static const struct snd_kcontrol_new rt5665_mono_adc_l_mix[] = {
1597 SOC_DAPM_SINGLE("ADC1 Switch", RT5665_MONO_ADC_MIXER,
1598 RT5665_M_MONO_ADC_L1_SFT, 1, 1),
1599 SOC_DAPM_SINGLE("ADC2 Switch", RT5665_MONO_ADC_MIXER,
1600 RT5665_M_MONO_ADC_L2_SFT, 1, 1),
1601};
1602
1603static const struct snd_kcontrol_new rt5665_mono_adc_r_mix[] = {
1604 SOC_DAPM_SINGLE("ADC1 Switch", RT5665_MONO_ADC_MIXER,
1605 RT5665_M_MONO_ADC_R1_SFT, 1, 1),
1606 SOC_DAPM_SINGLE("ADC2 Switch", RT5665_MONO_ADC_MIXER,
1607 RT5665_M_MONO_ADC_R2_SFT, 1, 1),
1608};
1609
1610static const struct snd_kcontrol_new rt5665_dac_l_mix[] = {
1611 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5665_AD_DA_MIXER,
1612 RT5665_M_ADCMIX_L_SFT, 1, 1),
1613 SOC_DAPM_SINGLE("DAC1 Switch", RT5665_AD_DA_MIXER,
1614 RT5665_M_DAC1_L_SFT, 1, 1),
1615};
1616
1617static const struct snd_kcontrol_new rt5665_dac_r_mix[] = {
1618 SOC_DAPM_SINGLE("Stereo ADC Switch", RT5665_AD_DA_MIXER,
1619 RT5665_M_ADCMIX_R_SFT, 1, 1),
1620 SOC_DAPM_SINGLE("DAC1 Switch", RT5665_AD_DA_MIXER,
1621 RT5665_M_DAC1_R_SFT, 1, 1),
1622};
1623
1624static const struct snd_kcontrol_new rt5665_sto1_dac_l_mix[] = {
1625 SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_STO1_DAC_MIXER,
1626 RT5665_M_DAC_L1_STO_L_SFT, 1, 1),
1627 SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_STO1_DAC_MIXER,
1628 RT5665_M_DAC_R1_STO_L_SFT, 1, 1),
1629 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_STO1_DAC_MIXER,
1630 RT5665_M_DAC_L2_STO_L_SFT, 1, 1),
1631 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_STO1_DAC_MIXER,
1632 RT5665_M_DAC_R2_STO_L_SFT, 1, 1),
1633};
1634
1635static const struct snd_kcontrol_new rt5665_sto1_dac_r_mix[] = {
1636 SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_STO1_DAC_MIXER,
1637 RT5665_M_DAC_L1_STO_R_SFT, 1, 1),
1638 SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_STO1_DAC_MIXER,
1639 RT5665_M_DAC_R1_STO_R_SFT, 1, 1),
1640 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_STO1_DAC_MIXER,
1641 RT5665_M_DAC_L2_STO_R_SFT, 1, 1),
1642 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_STO1_DAC_MIXER,
1643 RT5665_M_DAC_R2_STO_R_SFT, 1, 1),
1644};
1645
1646static const struct snd_kcontrol_new rt5665_sto2_dac_l_mix[] = {
1647 SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_STO2_DAC_MIXER,
1648 RT5665_M_DAC_L1_STO2_L_SFT, 1, 1),
1649 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_STO2_DAC_MIXER,
1650 RT5665_M_DAC_L2_STO2_L_SFT, 1, 1),
1651 SOC_DAPM_SINGLE("DAC L3 Switch", RT5665_STO2_DAC_MIXER,
1652 RT5665_M_DAC_L3_STO2_L_SFT, 1, 1),
1653};
1654
1655static const struct snd_kcontrol_new rt5665_sto2_dac_r_mix[] = {
1656 SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_STO2_DAC_MIXER,
1657 RT5665_M_DAC_R1_STO2_R_SFT, 1, 1),
1658 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_STO2_DAC_MIXER,
1659 RT5665_M_DAC_R2_STO2_R_SFT, 1, 1),
1660 SOC_DAPM_SINGLE("DAC R3 Switch", RT5665_STO2_DAC_MIXER,
1661 RT5665_M_DAC_R3_STO2_R_SFT, 1, 1),
1662};
1663
1664static const struct snd_kcontrol_new rt5665_mono_dac_l_mix[] = {
1665 SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_MONO_DAC_MIXER,
1666 RT5665_M_DAC_L1_MONO_L_SFT, 1, 1),
1667 SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_MONO_DAC_MIXER,
1668 RT5665_M_DAC_R1_MONO_L_SFT, 1, 1),
1669 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONO_DAC_MIXER,
1670 RT5665_M_DAC_L2_MONO_L_SFT, 1, 1),
1671 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_MONO_DAC_MIXER,
1672 RT5665_M_DAC_R2_MONO_L_SFT, 1, 1),
1673};
1674
1675static const struct snd_kcontrol_new rt5665_mono_dac_r_mix[] = {
1676 SOC_DAPM_SINGLE("DAC L1 Switch", RT5665_MONO_DAC_MIXER,
1677 RT5665_M_DAC_L1_MONO_R_SFT, 1, 1),
1678 SOC_DAPM_SINGLE("DAC R1 Switch", RT5665_MONO_DAC_MIXER,
1679 RT5665_M_DAC_R1_MONO_R_SFT, 1, 1),
1680 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONO_DAC_MIXER,
1681 RT5665_M_DAC_L2_MONO_R_SFT, 1, 1),
1682 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_MONO_DAC_MIXER,
1683 RT5665_M_DAC_R2_MONO_R_SFT, 1, 1),
1684};
1685
1686/* Analog Input Mixer */
1687static const struct snd_kcontrol_new rt5665_rec1_l_mix[] = {
1688 SOC_DAPM_SINGLE("CBJ Switch", RT5665_REC1_L2_MIXER,
1689 RT5665_M_CBJ_RM1_L_SFT, 1, 1),
1690 SOC_DAPM_SINGLE("INL Switch", RT5665_REC1_L2_MIXER,
1691 RT5665_M_INL_RM1_L_SFT, 1, 1),
1692 SOC_DAPM_SINGLE("INR Switch", RT5665_REC1_L2_MIXER,
1693 RT5665_M_INR_RM1_L_SFT, 1, 1),
1694 SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC1_L2_MIXER,
1695 RT5665_M_BST4_RM1_L_SFT, 1, 1),
1696 SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC1_L2_MIXER,
1697 RT5665_M_BST3_RM1_L_SFT, 1, 1),
1698 SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC1_L2_MIXER,
1699 RT5665_M_BST2_RM1_L_SFT, 1, 1),
1700 SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC1_L2_MIXER,
1701 RT5665_M_BST1_RM1_L_SFT, 1, 1),
1702};
1703
1704static const struct snd_kcontrol_new rt5665_rec1_r_mix[] = {
1705 SOC_DAPM_SINGLE("MONOVOL Switch", RT5665_REC1_R2_MIXER,
1706 RT5665_M_AEC_REF_RM1_R_SFT, 1, 1),
1707 SOC_DAPM_SINGLE("INR Switch", RT5665_REC1_R2_MIXER,
1708 RT5665_M_INR_RM1_R_SFT, 1, 1),
1709 SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC1_R2_MIXER,
1710 RT5665_M_BST4_RM1_R_SFT, 1, 1),
1711 SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC1_R2_MIXER,
1712 RT5665_M_BST3_RM1_R_SFT, 1, 1),
1713 SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC1_R2_MIXER,
1714 RT5665_M_BST2_RM1_R_SFT, 1, 1),
1715 SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC1_R2_MIXER,
1716 RT5665_M_BST1_RM1_R_SFT, 1, 1),
1717};
1718
1719static const struct snd_kcontrol_new rt5665_rec2_l_mix[] = {
1720 SOC_DAPM_SINGLE("INL Switch", RT5665_REC2_L2_MIXER,
1721 RT5665_M_INL_RM2_L_SFT, 1, 1),
1722 SOC_DAPM_SINGLE("INR Switch", RT5665_REC2_L2_MIXER,
1723 RT5665_M_INR_RM2_L_SFT, 1, 1),
1724 SOC_DAPM_SINGLE("CBJ Switch", RT5665_REC2_L2_MIXER,
1725 RT5665_M_CBJ_RM2_L_SFT, 1, 1),
1726 SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC2_L2_MIXER,
1727 RT5665_M_BST4_RM2_L_SFT, 1, 1),
1728 SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC2_L2_MIXER,
1729 RT5665_M_BST3_RM2_L_SFT, 1, 1),
1730 SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC2_L2_MIXER,
1731 RT5665_M_BST2_RM2_L_SFT, 1, 1),
1732 SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC2_L2_MIXER,
1733 RT5665_M_BST1_RM2_L_SFT, 1, 1),
1734};
1735
1736static const struct snd_kcontrol_new rt5665_rec2_r_mix[] = {
1737 SOC_DAPM_SINGLE("MONOVOL Switch", RT5665_REC2_R2_MIXER,
1738 RT5665_M_MONOVOL_RM2_R_SFT, 1, 1),
1739 SOC_DAPM_SINGLE("INL Switch", RT5665_REC2_R2_MIXER,
1740 RT5665_M_INL_RM2_R_SFT, 1, 1),
1741 SOC_DAPM_SINGLE("INR Switch", RT5665_REC2_R2_MIXER,
1742 RT5665_M_INR_RM2_R_SFT, 1, 1),
1743 SOC_DAPM_SINGLE("BST4 Switch", RT5665_REC2_R2_MIXER,
1744 RT5665_M_BST4_RM2_R_SFT, 1, 1),
1745 SOC_DAPM_SINGLE("BST3 Switch", RT5665_REC2_R2_MIXER,
1746 RT5665_M_BST3_RM2_R_SFT, 1, 1),
1747 SOC_DAPM_SINGLE("BST2 Switch", RT5665_REC2_R2_MIXER,
1748 RT5665_M_BST2_RM2_R_SFT, 1, 1),
1749 SOC_DAPM_SINGLE("BST1 Switch", RT5665_REC2_R2_MIXER,
1750 RT5665_M_BST1_RM2_R_SFT, 1, 1),
1751};
1752
1753static const struct snd_kcontrol_new rt5665_monovol_mix[] = {
1754 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONOMIX_IN_GAIN,
1755 RT5665_M_DAC_L2_MM_SFT, 1, 1),
1756 SOC_DAPM_SINGLE("RECMIX2L Switch", RT5665_MONOMIX_IN_GAIN,
1757 RT5665_M_RECMIC2L_MM_SFT, 1, 1),
1758 SOC_DAPM_SINGLE("BST1 Switch", RT5665_MONOMIX_IN_GAIN,
1759 RT5665_M_BST1_MM_SFT, 1, 1),
1760 SOC_DAPM_SINGLE("BST2 Switch", RT5665_MONOMIX_IN_GAIN,
1761 RT5665_M_BST2_MM_SFT, 1, 1),
1762 SOC_DAPM_SINGLE("BST3 Switch", RT5665_MONOMIX_IN_GAIN,
1763 RT5665_M_BST3_MM_SFT, 1, 1),
1764};
1765
1766static const struct snd_kcontrol_new rt5665_out_l_mix[] = {
1767 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_OUT_L_MIXER,
1768 RT5665_M_DAC_L2_OM_L_SFT, 1, 1),
1769 SOC_DAPM_SINGLE("INL Switch", RT5665_OUT_L_MIXER,
1770 RT5665_M_IN_L_OM_L_SFT, 1, 1),
1771 SOC_DAPM_SINGLE("BST1 Switch", RT5665_OUT_L_MIXER,
1772 RT5665_M_BST1_OM_L_SFT, 1, 1),
1773 SOC_DAPM_SINGLE("BST2 Switch", RT5665_OUT_L_MIXER,
1774 RT5665_M_BST2_OM_L_SFT, 1, 1),
1775 SOC_DAPM_SINGLE("BST3 Switch", RT5665_OUT_L_MIXER,
1776 RT5665_M_BST3_OM_L_SFT, 1, 1),
1777};
1778
1779static const struct snd_kcontrol_new rt5665_out_r_mix[] = {
1780 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_OUT_R_MIXER,
1781 RT5665_M_DAC_R2_OM_R_SFT, 1, 1),
1782 SOC_DAPM_SINGLE("INR Switch", RT5665_OUT_R_MIXER,
1783 RT5665_M_IN_R_OM_R_SFT, 1, 1),
1784 SOC_DAPM_SINGLE("BST2 Switch", RT5665_OUT_R_MIXER,
1785 RT5665_M_BST2_OM_R_SFT, 1, 1),
1786 SOC_DAPM_SINGLE("BST3 Switch", RT5665_OUT_R_MIXER,
1787 RT5665_M_BST3_OM_R_SFT, 1, 1),
1788 SOC_DAPM_SINGLE("BST4 Switch", RT5665_OUT_R_MIXER,
1789 RT5665_M_BST4_OM_R_SFT, 1, 1),
1790};
1791
1792static const struct snd_kcontrol_new rt5665_mono_mix[] = {
1793 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_MONOMIX_IN_GAIN,
1794 RT5665_M_DAC_L2_MA_SFT, 1, 1),
1795 SOC_DAPM_SINGLE("MONOVOL Switch", RT5665_MONOMIX_IN_GAIN,
1796 RT5665_M_MONOVOL_MA_SFT, 1, 1),
1797};
1798
1799static const struct snd_kcontrol_new rt5665_lout_l_mix[] = {
1800 SOC_DAPM_SINGLE("DAC L2 Switch", RT5665_LOUT_MIXER,
1801 RT5665_M_DAC_L2_LM_SFT, 1, 1),
1802 SOC_DAPM_SINGLE("OUTVOL L Switch", RT5665_LOUT_MIXER,
1803 RT5665_M_OV_L_LM_SFT, 1, 1),
1804};
1805
1806static const struct snd_kcontrol_new rt5665_lout_r_mix[] = {
1807 SOC_DAPM_SINGLE("DAC R2 Switch", RT5665_LOUT_MIXER,
1808 RT5665_M_DAC_R2_LM_SFT, 1, 1),
1809 SOC_DAPM_SINGLE("OUTVOL R Switch", RT5665_LOUT_MIXER,
1810 RT5665_M_OV_R_LM_SFT, 1, 1),
1811};
1812
1813/*DAC L2, DAC R2*/
1814/*MX-17 [6:4], MX-17 [2:0]*/
1815static const char * const rt5665_dac2_src[] = {
1816 "IF1 DAC2", "IF2_1 DAC", "IF2_2 DAC", "IF3 DAC", "Mono ADC MIX"
1817};
1818
1819static const SOC_ENUM_SINGLE_DECL(
1820 rt5665_dac_l2_enum, RT5665_DAC2_CTRL,
1821 RT5665_DAC_L2_SEL_SFT, rt5665_dac2_src);
1822
1823static const struct snd_kcontrol_new rt5665_dac_l2_mux =
1824 SOC_DAPM_ENUM("Digital DAC L2 Source", rt5665_dac_l2_enum);
1825
1826static const SOC_ENUM_SINGLE_DECL(
1827 rt5665_dac_r2_enum, RT5665_DAC2_CTRL,
1828 RT5665_DAC_R2_SEL_SFT, rt5665_dac2_src);
1829
1830static const struct snd_kcontrol_new rt5665_dac_r2_mux =
1831 SOC_DAPM_ENUM("Digital DAC R2 Source", rt5665_dac_r2_enum);
1832
1833/*DAC L3, DAC R3*/
1834/*MX-1B [6:4], MX-1B [2:0]*/
1835static const char * const rt5665_dac3_src[] = {
1836 "IF1 DAC2", "IF2_1 DAC", "IF2_2 DAC", "IF3 DAC", "STO2 ADC MIX"
1837};
1838
1839static const SOC_ENUM_SINGLE_DECL(
1840 rt5665_dac_l3_enum, RT5665_DAC3_CTRL,
1841 RT5665_DAC_L3_SEL_SFT, rt5665_dac3_src);
1842
1843static const struct snd_kcontrol_new rt5665_dac_l3_mux =
1844 SOC_DAPM_ENUM("Digital DAC L3 Source", rt5665_dac_l3_enum);
1845
1846static const SOC_ENUM_SINGLE_DECL(
1847 rt5665_dac_r3_enum, RT5665_DAC3_CTRL,
1848 RT5665_DAC_R3_SEL_SFT, rt5665_dac3_src);
1849
1850static const struct snd_kcontrol_new rt5665_dac_r3_mux =
1851 SOC_DAPM_ENUM("Digital DAC R3 Source", rt5665_dac_r3_enum);
1852
1853/* STO1 ADC1 Source */
1854/* MX-26 [13] [5] */
1855static const char * const rt5665_sto1_adc1_src[] = {
1856 "DD Mux", "ADC"
1857};
1858
1859static const SOC_ENUM_SINGLE_DECL(
1860 rt5665_sto1_adc1l_enum, RT5665_STO1_ADC_MIXER,
1861 RT5665_STO1_ADC1L_SRC_SFT, rt5665_sto1_adc1_src);
1862
1863static const struct snd_kcontrol_new rt5665_sto1_adc1l_mux =
1864 SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5665_sto1_adc1l_enum);
1865
1866static const SOC_ENUM_SINGLE_DECL(
1867 rt5665_sto1_adc1r_enum, RT5665_STO1_ADC_MIXER,
1868 RT5665_STO1_ADC1R_SRC_SFT, rt5665_sto1_adc1_src);
1869
1870static const struct snd_kcontrol_new rt5665_sto1_adc1r_mux =
1871 SOC_DAPM_ENUM("Stereo1 ADC1L Source", rt5665_sto1_adc1r_enum);
1872
1873/* STO1 ADC Source */
1874/* MX-26 [11:10] [3:2] */
1875static const char * const rt5665_sto1_adc_src[] = {
1876 "ADC1 L", "ADC1 R", "ADC2 L", "ADC2 R"
1877};
1878
1879static const SOC_ENUM_SINGLE_DECL(
1880 rt5665_sto1_adcl_enum, RT5665_STO1_ADC_MIXER,
1881 RT5665_STO1_ADCL_SRC_SFT, rt5665_sto1_adc_src);
1882
1883static const struct snd_kcontrol_new rt5665_sto1_adcl_mux =
1884 SOC_DAPM_ENUM("Stereo1 ADCL Source", rt5665_sto1_adcl_enum);
1885
1886static const SOC_ENUM_SINGLE_DECL(
1887 rt5665_sto1_adcr_enum, RT5665_STO1_ADC_MIXER,
1888 RT5665_STO1_ADCR_SRC_SFT, rt5665_sto1_adc_src);
1889
1890static const struct snd_kcontrol_new rt5665_sto1_adcr_mux =
1891 SOC_DAPM_ENUM("Stereo1 ADCR Source", rt5665_sto1_adcr_enum);
1892
1893/* STO1 ADC2 Source */
1894/* MX-26 [12] [4] */
1895static const char * const rt5665_sto1_adc2_src[] = {
1896 "DAC MIX", "DMIC"
1897};
1898
1899static const SOC_ENUM_SINGLE_DECL(
1900 rt5665_sto1_adc2l_enum, RT5665_STO1_ADC_MIXER,
1901 RT5665_STO1_ADC2L_SRC_SFT, rt5665_sto1_adc2_src);
1902
1903static const struct snd_kcontrol_new rt5665_sto1_adc2l_mux =
1904 SOC_DAPM_ENUM("Stereo1 ADC2L Source", rt5665_sto1_adc2l_enum);
1905
1906static const SOC_ENUM_SINGLE_DECL(
1907 rt5665_sto1_adc2r_enum, RT5665_STO1_ADC_MIXER,
1908 RT5665_STO1_ADC2R_SRC_SFT, rt5665_sto1_adc2_src);
1909
1910static const struct snd_kcontrol_new rt5665_sto1_adc2r_mux =
1911 SOC_DAPM_ENUM("Stereo1 ADC2R Source", rt5665_sto1_adc2r_enum);
1912
1913/* STO1 DMIC Source */
1914/* MX-26 [8] */
1915static const char * const rt5665_sto1_dmic_src[] = {
1916 "DMIC1", "DMIC2"
1917};
1918
1919static const SOC_ENUM_SINGLE_DECL(
1920 rt5665_sto1_dmic_enum, RT5665_STO1_ADC_MIXER,
1921 RT5665_STO1_DMIC_SRC_SFT, rt5665_sto1_dmic_src);
1922
1923static const struct snd_kcontrol_new rt5665_sto1_dmic_mux =
1924 SOC_DAPM_ENUM("Stereo1 DMIC Mux", rt5665_sto1_dmic_enum);
1925
1926/* MX-26 [9] */
1927static const char * const rt5665_sto1_dd_l_src[] = {
1928 "STO2 DAC", "MONO DAC"
1929};
1930
1931static const SOC_ENUM_SINGLE_DECL(
1932 rt5665_sto1_dd_l_enum, RT5665_STO1_ADC_MIXER,
1933 RT5665_STO1_DD_L_SRC_SFT, rt5665_sto1_dd_l_src);
1934
1935static const struct snd_kcontrol_new rt5665_sto1_dd_l_mux =
1936 SOC_DAPM_ENUM("Stereo1 DD L Source", rt5665_sto1_dd_l_enum);
1937
1938/* MX-26 [1:0] */
1939static const char * const rt5665_sto1_dd_r_src[] = {
1940 "STO2 DAC", "MONO DAC", "AEC REF"
1941};
1942
1943static const SOC_ENUM_SINGLE_DECL(
1944 rt5665_sto1_dd_r_enum, RT5665_STO1_ADC_MIXER,
1945 RT5665_STO1_DD_R_SRC_SFT, rt5665_sto1_dd_r_src);
1946
1947static const struct snd_kcontrol_new rt5665_sto1_dd_r_mux =
1948 SOC_DAPM_ENUM("Stereo1 DD R Source", rt5665_sto1_dd_r_enum);
1949
1950/* MONO ADC L2 Source */
1951/* MX-27 [12] */
1952static const char * const rt5665_mono_adc_l2_src[] = {
1953 "DAC MIXL", "DMIC"
1954};
1955
1956static const SOC_ENUM_SINGLE_DECL(
1957 rt5665_mono_adc_l2_enum, RT5665_MONO_ADC_MIXER,
1958 RT5665_MONO_ADC_L2_SRC_SFT, rt5665_mono_adc_l2_src);
1959
1960static const struct snd_kcontrol_new rt5665_mono_adc_l2_mux =
1961 SOC_DAPM_ENUM("Mono ADC L2 Source", rt5665_mono_adc_l2_enum);
1962
1963
1964/* MONO ADC L1 Source */
1965/* MX-27 [13] */
1966static const char * const rt5665_mono_adc_l1_src[] = {
1967 "DD Mux", "ADC"
1968};
1969
1970static const SOC_ENUM_SINGLE_DECL(
1971 rt5665_mono_adc_l1_enum, RT5665_MONO_ADC_MIXER,
1972 RT5665_MONO_ADC_L1_SRC_SFT, rt5665_mono_adc_l1_src);
1973
1974static const struct snd_kcontrol_new rt5665_mono_adc_l1_mux =
1975 SOC_DAPM_ENUM("Mono ADC L1 Source", rt5665_mono_adc_l1_enum);
1976
1977/* MX-27 [9][1]*/
1978static const char * const rt5665_mono_dd_src[] = {
1979 "STO2 DAC", "MONO DAC"
1980};
1981
1982static const SOC_ENUM_SINGLE_DECL(
1983 rt5665_mono_dd_l_enum, RT5665_MONO_ADC_MIXER,
1984 RT5665_MONO_DD_L_SRC_SFT, rt5665_mono_dd_src);
1985
1986static const struct snd_kcontrol_new rt5665_mono_dd_l_mux =
1987 SOC_DAPM_ENUM("Mono DD L Source", rt5665_mono_dd_l_enum);
1988
1989static const SOC_ENUM_SINGLE_DECL(
1990 rt5665_mono_dd_r_enum, RT5665_MONO_ADC_MIXER,
1991 RT5665_MONO_DD_R_SRC_SFT, rt5665_mono_dd_src);
1992
1993static const struct snd_kcontrol_new rt5665_mono_dd_r_mux =
1994 SOC_DAPM_ENUM("Mono DD R Source", rt5665_mono_dd_r_enum);
1995
1996/* MONO ADC L Source, MONO ADC R Source*/
1997/* MX-27 [11:10], MX-27 [3:2] */
1998static const char * const rt5665_mono_adc_src[] = {
1999 "ADC1 L", "ADC1 R", "ADC2 L", "ADC2 R"
2000};
2001
2002static const SOC_ENUM_SINGLE_DECL(
2003 rt5665_mono_adc_l_enum, RT5665_MONO_ADC_MIXER,
2004 RT5665_MONO_ADC_L_SRC_SFT, rt5665_mono_adc_src);
2005
2006static const struct snd_kcontrol_new rt5665_mono_adc_l_mux =
2007 SOC_DAPM_ENUM("Mono ADC L Source", rt5665_mono_adc_l_enum);
2008
2009static const SOC_ENUM_SINGLE_DECL(
2010 rt5665_mono_adcr_enum, RT5665_MONO_ADC_MIXER,
2011 RT5665_MONO_ADC_R_SRC_SFT, rt5665_mono_adc_src);
2012
2013static const struct snd_kcontrol_new rt5665_mono_adc_r_mux =
2014 SOC_DAPM_ENUM("Mono ADC R Source", rt5665_mono_adcr_enum);
2015
2016/* MONO DMIC L Source */
2017/* MX-27 [8] */
2018static const char * const rt5665_mono_dmic_l_src[] = {
2019 "DMIC1 L", "DMIC2 L"
2020};
2021
2022static const SOC_ENUM_SINGLE_DECL(
2023 rt5665_mono_dmic_l_enum, RT5665_MONO_ADC_MIXER,
2024 RT5665_MONO_DMIC_L_SRC_SFT, rt5665_mono_dmic_l_src);
2025
2026static const struct snd_kcontrol_new rt5665_mono_dmic_l_mux =
2027 SOC_DAPM_ENUM("Mono DMIC L Source", rt5665_mono_dmic_l_enum);
2028
2029/* MONO ADC R2 Source */
2030/* MX-27 [4] */
2031static const char * const rt5665_mono_adc_r2_src[] = {
2032 "DAC MIXR", "DMIC"
2033};
2034
2035static const SOC_ENUM_SINGLE_DECL(
2036 rt5665_mono_adc_r2_enum, RT5665_MONO_ADC_MIXER,
2037 RT5665_MONO_ADC_R2_SRC_SFT, rt5665_mono_adc_r2_src);
2038
2039static const struct snd_kcontrol_new rt5665_mono_adc_r2_mux =
2040 SOC_DAPM_ENUM("Mono ADC R2 Source", rt5665_mono_adc_r2_enum);
2041
2042/* MONO ADC R1 Source */
2043/* MX-27 [5] */
2044static const char * const rt5665_mono_adc_r1_src[] = {
2045 "DD Mux", "ADC"
2046};
2047
2048static const SOC_ENUM_SINGLE_DECL(
2049 rt5665_mono_adc_r1_enum, RT5665_MONO_ADC_MIXER,
2050 RT5665_MONO_ADC_R1_SRC_SFT, rt5665_mono_adc_r1_src);
2051
2052static const struct snd_kcontrol_new rt5665_mono_adc_r1_mux =
2053 SOC_DAPM_ENUM("Mono ADC R1 Source", rt5665_mono_adc_r1_enum);
2054
2055/* MONO DMIC R Source */
2056/* MX-27 [0] */
2057static const char * const rt5665_mono_dmic_r_src[] = {
2058 "DMIC1 R", "DMIC2 R"
2059};
2060
2061static const SOC_ENUM_SINGLE_DECL(
2062 rt5665_mono_dmic_r_enum, RT5665_MONO_ADC_MIXER,
2063 RT5665_MONO_DMIC_R_SRC_SFT, rt5665_mono_dmic_r_src);
2064
2065static const struct snd_kcontrol_new rt5665_mono_dmic_r_mux =
2066 SOC_DAPM_ENUM("Mono DMIC R Source", rt5665_mono_dmic_r_enum);
2067
2068
2069/* STO2 ADC1 Source */
2070/* MX-28 [13] [5] */
2071static const char * const rt5665_sto2_adc1_src[] = {
2072 "DD Mux", "ADC"
2073};
2074
2075static const SOC_ENUM_SINGLE_DECL(
2076 rt5665_sto2_adc1l_enum, RT5665_STO2_ADC_MIXER,
2077 RT5665_STO2_ADC1L_SRC_SFT, rt5665_sto2_adc1_src);
2078
2079static const struct snd_kcontrol_new rt5665_sto2_adc1l_mux =
2080 SOC_DAPM_ENUM("Stereo2 ADC1L Source", rt5665_sto2_adc1l_enum);
2081
2082static const SOC_ENUM_SINGLE_DECL(
2083 rt5665_sto2_adc1r_enum, RT5665_STO2_ADC_MIXER,
2084 RT5665_STO2_ADC1R_SRC_SFT, rt5665_sto2_adc1_src);
2085
2086static const struct snd_kcontrol_new rt5665_sto2_adc1r_mux =
2087 SOC_DAPM_ENUM("Stereo2 ADC1L Source", rt5665_sto2_adc1r_enum);
2088
2089/* STO2 ADC Source */
2090/* MX-28 [11:10] [3:2] */
2091static const char * const rt5665_sto2_adc_src[] = {
2092 "ADC1 L", "ADC1 R", "ADC2 L"
2093};
2094
2095static const SOC_ENUM_SINGLE_DECL(
2096 rt5665_sto2_adcl_enum, RT5665_STO2_ADC_MIXER,
2097 RT5665_STO2_ADCL_SRC_SFT, rt5665_sto2_adc_src);
2098
2099static const struct snd_kcontrol_new rt5665_sto2_adcl_mux =
2100 SOC_DAPM_ENUM("Stereo2 ADCL Source", rt5665_sto2_adcl_enum);
2101
2102static const SOC_ENUM_SINGLE_DECL(
2103 rt5665_sto2_adcr_enum, RT5665_STO2_ADC_MIXER,
2104 RT5665_STO2_ADCR_SRC_SFT, rt5665_sto2_adc_src);
2105
2106static const struct snd_kcontrol_new rt5665_sto2_adcr_mux =
2107 SOC_DAPM_ENUM("Stereo2 ADCR Source", rt5665_sto2_adcr_enum);
2108
2109/* STO2 ADC2 Source */
2110/* MX-28 [12] [4] */
2111static const char * const rt5665_sto2_adc2_src[] = {
2112 "DAC MIX", "DMIC"
2113};
2114
2115static const SOC_ENUM_SINGLE_DECL(
2116 rt5665_sto2_adc2l_enum, RT5665_STO2_ADC_MIXER,
2117 RT5665_STO2_ADC2L_SRC_SFT, rt5665_sto2_adc2_src);
2118
2119static const struct snd_kcontrol_new rt5665_sto2_adc2l_mux =
2120 SOC_DAPM_ENUM("Stereo2 ADC2L Source", rt5665_sto2_adc2l_enum);
2121
2122static const SOC_ENUM_SINGLE_DECL(
2123 rt5665_sto2_adc2r_enum, RT5665_STO2_ADC_MIXER,
2124 RT5665_STO2_ADC2R_SRC_SFT, rt5665_sto2_adc2_src);
2125
2126static const struct snd_kcontrol_new rt5665_sto2_adc2r_mux =
2127 SOC_DAPM_ENUM("Stereo2 ADC2R Source", rt5665_sto2_adc2r_enum);
2128
2129/* STO2 DMIC Source */
2130/* MX-28 [8] */
2131static const char * const rt5665_sto2_dmic_src[] = {
2132 "DMIC1", "DMIC2"
2133};
2134
2135static const SOC_ENUM_SINGLE_DECL(
2136 rt5665_sto2_dmic_enum, RT5665_STO2_ADC_MIXER,
2137 RT5665_STO2_DMIC_SRC_SFT, rt5665_sto2_dmic_src);
2138
2139static const struct snd_kcontrol_new rt5665_sto2_dmic_mux =
2140 SOC_DAPM_ENUM("Stereo2 DMIC Source", rt5665_sto2_dmic_enum);
2141
2142/* MX-28 [9] */
2143static const char * const rt5665_sto2_dd_l_src[] = {
2144 "STO2 DAC", "MONO DAC"
2145};
2146
2147static const SOC_ENUM_SINGLE_DECL(
2148 rt5665_sto2_dd_l_enum, RT5665_STO2_ADC_MIXER,
2149 RT5665_STO2_DD_L_SRC_SFT, rt5665_sto2_dd_l_src);
2150
2151static const struct snd_kcontrol_new rt5665_sto2_dd_l_mux =
2152 SOC_DAPM_ENUM("Stereo2 DD L Source", rt5665_sto2_dd_l_enum);
2153
2154/* MX-28 [1] */
2155static const char * const rt5665_sto2_dd_r_src[] = {
2156 "STO2 DAC", "MONO DAC"
2157};
2158
2159static const SOC_ENUM_SINGLE_DECL(
2160 rt5665_sto2_dd_r_enum, RT5665_STO2_ADC_MIXER,
2161 RT5665_STO2_DD_R_SRC_SFT, rt5665_sto2_dd_r_src);
2162
2163static const struct snd_kcontrol_new rt5665_sto2_dd_r_mux =
2164 SOC_DAPM_ENUM("Stereo2 DD R Source", rt5665_sto2_dd_r_enum);
2165
2166/* DAC R1 Source, DAC L1 Source*/
2167/* MX-29 [11:10], MX-29 [9:8]*/
2168static const char * const rt5665_dac1_src[] = {
2169 "IF1 DAC1", "IF2_1 DAC", "IF2_2 DAC", "IF3 DAC"
2170};
2171
2172static const SOC_ENUM_SINGLE_DECL(
2173 rt5665_dac_r1_enum, RT5665_AD_DA_MIXER,
2174 RT5665_DAC1_R_SEL_SFT, rt5665_dac1_src);
2175
2176static const struct snd_kcontrol_new rt5665_dac_r1_mux =
2177 SOC_DAPM_ENUM("DAC R1 Source", rt5665_dac_r1_enum);
2178
2179static const SOC_ENUM_SINGLE_DECL(
2180 rt5665_dac_l1_enum, RT5665_AD_DA_MIXER,
2181 RT5665_DAC1_L_SEL_SFT, rt5665_dac1_src);
2182
2183static const struct snd_kcontrol_new rt5665_dac_l1_mux =
2184 SOC_DAPM_ENUM("DAC L1 Source", rt5665_dac_l1_enum);
2185
2186/* DAC Digital Mixer L Source, DAC Digital Mixer R Source*/
2187/* MX-2D [13:12], MX-2D [9:8]*/
2188static const char * const rt5665_dig_dac_mix_src[] = {
2189 "Stereo1 DAC Mixer", "Stereo2 DAC Mixer", "Mono DAC Mixer"
2190};
2191
2192static const SOC_ENUM_SINGLE_DECL(
2193 rt5665_dig_dac_mixl_enum, RT5665_A_DAC1_MUX,
2194 RT5665_DAC_MIX_L_SFT, rt5665_dig_dac_mix_src);
2195
2196static const struct snd_kcontrol_new rt5665_dig_dac_mixl_mux =
2197 SOC_DAPM_ENUM("DAC Digital Mixer L Source", rt5665_dig_dac_mixl_enum);
2198
2199static const SOC_ENUM_SINGLE_DECL(
2200 rt5665_dig_dac_mixr_enum, RT5665_A_DAC1_MUX,
2201 RT5665_DAC_MIX_R_SFT, rt5665_dig_dac_mix_src);
2202
2203static const struct snd_kcontrol_new rt5665_dig_dac_mixr_mux =
2204 SOC_DAPM_ENUM("DAC Digital Mixer R Source", rt5665_dig_dac_mixr_enum);
2205
2206/* Analog DAC L1 Source, Analog DAC R1 Source*/
2207/* MX-2D [5:4], MX-2D [1:0]*/
2208static const char * const rt5665_alg_dac1_src[] = {
2209 "Stereo1 DAC Mixer", "DAC1", "DMIC1"
2210};
2211
2212static const SOC_ENUM_SINGLE_DECL(
2213 rt5665_alg_dac_l1_enum, RT5665_A_DAC1_MUX,
2214 RT5665_A_DACL1_SFT, rt5665_alg_dac1_src);
2215
2216static const struct snd_kcontrol_new rt5665_alg_dac_l1_mux =
2217 SOC_DAPM_ENUM("Analog DAC L1 Source", rt5665_alg_dac_l1_enum);
2218
2219static const SOC_ENUM_SINGLE_DECL(
2220 rt5665_alg_dac_r1_enum, RT5665_A_DAC1_MUX,
2221 RT5665_A_DACR1_SFT, rt5665_alg_dac1_src);
2222
2223static const struct snd_kcontrol_new rt5665_alg_dac_r1_mux =
2224 SOC_DAPM_ENUM("Analog DAC R1 Source", rt5665_alg_dac_r1_enum);
2225
2226/* Analog DAC LR Source, Analog DAC R2 Source*/
2227/* MX-2E [5:4], MX-2E [0]*/
2228static const char * const rt5665_alg_dac2_src[] = {
2229 "Mono DAC Mixer", "DAC2"
2230};
2231
2232static const SOC_ENUM_SINGLE_DECL(
2233 rt5665_alg_dac_l2_enum, RT5665_A_DAC2_MUX,
2234 RT5665_A_DACL2_SFT, rt5665_alg_dac2_src);
2235
2236static const struct snd_kcontrol_new rt5665_alg_dac_l2_mux =
2237 SOC_DAPM_ENUM("Analog DAC L2 Source", rt5665_alg_dac_l2_enum);
2238
2239static const SOC_ENUM_SINGLE_DECL(
2240 rt5665_alg_dac_r2_enum, RT5665_A_DAC2_MUX,
2241 RT5665_A_DACR2_SFT, rt5665_alg_dac2_src);
2242
2243static const struct snd_kcontrol_new rt5665_alg_dac_r2_mux =
2244 SOC_DAPM_ENUM("Analog DAC R2 Source", rt5665_alg_dac_r2_enum);
2245
2246/* Interface2 ADC Data Input*/
2247/* MX-2F [14:12] */
2248static const char * const rt5665_if2_1_adc_in_src[] = {
2249 "STO1 ADC", "STO2 ADC", "MONO ADC", "IF1 DAC1",
2250 "IF1 DAC2", "IF2_2 DAC", "IF3 DAC", "DAC1 MIX"
2251};
2252
2253static const SOC_ENUM_SINGLE_DECL(
2254 rt5665_if2_1_adc_in_enum, RT5665_DIG_INF2_DATA,
2255 RT5665_IF3_ADC_IN_SFT, rt5665_if2_1_adc_in_src);
2256
2257static const struct snd_kcontrol_new rt5665_if2_1_adc_in_mux =
2258 SOC_DAPM_ENUM("IF2_1 ADC IN Source", rt5665_if2_1_adc_in_enum);
2259
2260/* MX-2F [6:4] */
2261static const char * const rt5665_if2_2_adc_in_src[] = {
2262 "STO1 ADC", "STO2 ADC", "MONO ADC", "IF1 DAC1",
2263 "IF1 DAC2", "IF2_1 DAC", "IF3 DAC", "DAC1 MIX"
2264};
2265
2266static const SOC_ENUM_SINGLE_DECL(
2267 rt5665_if2_2_adc_in_enum, RT5665_DIG_INF2_DATA,
2268 RT5665_IF2_2_ADC_IN_SFT, rt5665_if2_2_adc_in_src);
2269
2270static const struct snd_kcontrol_new rt5665_if2_2_adc_in_mux =
2271 SOC_DAPM_ENUM("IF2_1 ADC IN Source", rt5665_if2_2_adc_in_enum);
2272
2273/* Interface3 ADC Data Input*/
2274/* MX-30 [6:4] */
2275static const char * const rt5665_if3_adc_in_src[] = {
2276 "STO1 ADC", "STO2 ADC", "MONO ADC", "IF1 DAC1",
2277 "IF1 DAC2", "IF2_1 DAC", "IF2_2 DAC", "DAC1 MIX"
2278};
2279
2280static const SOC_ENUM_SINGLE_DECL(
2281 rt5665_if3_adc_in_enum, RT5665_DIG_INF3_DATA,
2282 RT5665_IF3_ADC_IN_SFT, rt5665_if3_adc_in_src);
2283
2284static const struct snd_kcontrol_new rt5665_if3_adc_in_mux =
2285 SOC_DAPM_ENUM("IF3 ADC IN Source", rt5665_if3_adc_in_enum);
2286
2287/* PDM 1 L/R*/
2288/* MX-31 [11:10] [9:8] */
2289static const char * const rt5665_pdm_src[] = {
2290 "Stereo1 DAC", "Stereo2 DAC", "Mono DAC"
2291};
2292
2293static const SOC_ENUM_SINGLE_DECL(
2294 rt5665_pdm_l_enum, RT5665_PDM_OUT_CTRL,
2295 RT5665_PDM1_L_SFT, rt5665_pdm_src);
2296
2297static const struct snd_kcontrol_new rt5665_pdm_l_mux =
2298 SOC_DAPM_ENUM("PDM L Source", rt5665_pdm_l_enum);
2299
2300static const SOC_ENUM_SINGLE_DECL(
2301 rt5665_pdm_r_enum, RT5665_PDM_OUT_CTRL,
2302 RT5665_PDM1_R_SFT, rt5665_pdm_src);
2303
2304static const struct snd_kcontrol_new rt5665_pdm_r_mux =
2305 SOC_DAPM_ENUM("PDM R Source", rt5665_pdm_r_enum);
2306
2307
2308/* I2S1 TDM ADCDAT Source */
2309/* MX-7a[10] */
2310static const char * const rt5665_if1_1_adc1_data_src[] = {
2311 "STO1 ADC", "IF2_1 DAC",
2312};
2313
2314static const SOC_ENUM_SINGLE_DECL(
2315 rt5665_if1_1_adc1_data_enum, RT5665_TDM_CTRL_3,
2316 RT5665_IF1_ADC1_SEL_SFT, rt5665_if1_1_adc1_data_src);
2317
2318static const struct snd_kcontrol_new rt5665_if1_1_adc1_mux =
2319 SOC_DAPM_ENUM("IF1_1 ADC1 Source", rt5665_if1_1_adc1_data_enum);
2320
2321/* MX-7a[9] */
2322static const char * const rt5665_if1_1_adc2_data_src[] = {
2323 "STO2 ADC", "IF2_2 DAC",
2324};
2325
2326static const SOC_ENUM_SINGLE_DECL(
2327 rt5665_if1_1_adc2_data_enum, RT5665_TDM_CTRL_3,
2328 RT5665_IF1_ADC2_SEL_SFT, rt5665_if1_1_adc2_data_src);
2329
2330static const struct snd_kcontrol_new rt5665_if1_1_adc2_mux =
2331 SOC_DAPM_ENUM("IF1_1 ADC2 Source", rt5665_if1_1_adc2_data_enum);
2332
2333/* MX-7a[8] */
2334static const char * const rt5665_if1_1_adc3_data_src[] = {
2335 "MONO ADC", "IF3 DAC",
2336};
2337
2338static const SOC_ENUM_SINGLE_DECL(
2339 rt5665_if1_1_adc3_data_enum, RT5665_TDM_CTRL_3,
2340 RT5665_IF1_ADC3_SEL_SFT, rt5665_if1_1_adc3_data_src);
2341
2342static const struct snd_kcontrol_new rt5665_if1_1_adc3_mux =
2343 SOC_DAPM_ENUM("IF1_1 ADC3 Source", rt5665_if1_1_adc3_data_enum);
2344
2345/* MX-7b[10] */
2346static const char * const rt5665_if1_2_adc1_data_src[] = {
2347 "STO1 ADC", "IF1 DAC",
2348};
2349
2350static const SOC_ENUM_SINGLE_DECL(
2351 rt5665_if1_2_adc1_data_enum, RT5665_TDM_CTRL_4,
2352 RT5665_IF1_ADC1_SEL_SFT, rt5665_if1_2_adc1_data_src);
2353
2354static const struct snd_kcontrol_new rt5665_if1_2_adc1_mux =
2355 SOC_DAPM_ENUM("IF1_2 ADC1 Source", rt5665_if1_2_adc1_data_enum);
2356
2357/* MX-7b[9] */
2358static const char * const rt5665_if1_2_adc2_data_src[] = {
2359 "STO2 ADC", "IF2_1 DAC",
2360};
2361
2362static const SOC_ENUM_SINGLE_DECL(
2363 rt5665_if1_2_adc2_data_enum, RT5665_TDM_CTRL_4,
2364 RT5665_IF1_ADC2_SEL_SFT, rt5665_if1_2_adc2_data_src);
2365
2366static const struct snd_kcontrol_new rt5665_if1_2_adc2_mux =
2367 SOC_DAPM_ENUM("IF1_2 ADC2 Source", rt5665_if1_2_adc2_data_enum);
2368
2369/* MX-7b[8] */
2370static const char * const rt5665_if1_2_adc3_data_src[] = {
2371 "MONO ADC", "IF2_2 DAC",
2372};
2373
2374static const SOC_ENUM_SINGLE_DECL(
2375 rt5665_if1_2_adc3_data_enum, RT5665_TDM_CTRL_4,
2376 RT5665_IF1_ADC3_SEL_SFT, rt5665_if1_2_adc3_data_src);
2377
2378static const struct snd_kcontrol_new rt5665_if1_2_adc3_mux =
2379 SOC_DAPM_ENUM("IF1_2 ADC3 Source", rt5665_if1_2_adc3_data_enum);
2380
2381/* MX-7b[7] */
2382static const char * const rt5665_if1_2_adc4_data_src[] = {
2383 "DAC1", "IF3 DAC",
2384};
2385
2386static const SOC_ENUM_SINGLE_DECL(
2387 rt5665_if1_2_adc4_data_enum, RT5665_TDM_CTRL_4,
2388 RT5665_IF1_ADC4_SEL_SFT, rt5665_if1_2_adc4_data_src);
2389
2390static const struct snd_kcontrol_new rt5665_if1_2_adc4_mux =
2391 SOC_DAPM_ENUM("IF1_2 ADC4 Source", rt5665_if1_2_adc4_data_enum);
2392
2393/* MX-7a[4:0] MX-7b[4:0] */
2394static const char * const rt5665_tdm_adc_data_src[] = {
2395 "1234", "1243", "1324", "1342", "1432", "1423",
2396 "2134", "2143", "2314", "2341", "2431", "2413",
2397 "3124", "3142", "3214", "3241", "3412", "3421",
2398 "4123", "4132", "4213", "4231", "4312", "4321"
2399};
2400
2401static const SOC_ENUM_SINGLE_DECL(
2402 rt5665_tdm1_adc_data_enum, RT5665_TDM_CTRL_3,
2403 RT5665_TDM_ADC_SEL_SFT, rt5665_tdm_adc_data_src);
2404
2405static const struct snd_kcontrol_new rt5665_tdm1_adc_mux =
2406 SOC_DAPM_ENUM("TDM1 ADC Mux", rt5665_tdm1_adc_data_enum);
2407
2408static const SOC_ENUM_SINGLE_DECL(
2409 rt5665_tdm2_adc_data_enum, RT5665_TDM_CTRL_4,
2410 RT5665_TDM_ADC_SEL_SFT, rt5665_tdm_adc_data_src);
2411
2412static const struct snd_kcontrol_new rt5665_tdm2_adc_mux =
2413 SOC_DAPM_ENUM("TDM2 ADCDAT Source", rt5665_tdm2_adc_data_enum);
2414
2415/* Out Volume Switch */
2416static const struct snd_kcontrol_new monovol_switch =
2417 SOC_DAPM_SINGLE("Switch", RT5665_MONO_OUT, RT5665_VOL_L_SFT, 1, 1);
2418
2419static const struct snd_kcontrol_new outvol_l_switch =
2420 SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_VOL_L_SFT, 1, 1);
2421
2422static const struct snd_kcontrol_new outvol_r_switch =
2423 SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_VOL_R_SFT, 1, 1);
2424
2425/* Out Switch */
2426static const struct snd_kcontrol_new mono_switch =
2427 SOC_DAPM_SINGLE("Switch", RT5665_MONO_OUT, RT5665_L_MUTE_SFT, 1, 1);
2428
2429static const struct snd_kcontrol_new hpo_switch =
2430 SOC_DAPM_SINGLE_AUTODISABLE("Switch", RT5665_HP_CTRL_2,
2431 RT5665_VOL_L_SFT, 1, 0);
2432
2433static const struct snd_kcontrol_new lout_l_switch =
2434 SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_L_MUTE_SFT, 1, 1);
2435
2436static const struct snd_kcontrol_new lout_r_switch =
2437 SOC_DAPM_SINGLE("Switch", RT5665_LOUT, RT5665_R_MUTE_SFT, 1, 1);
2438
2439static const struct snd_kcontrol_new pdm_l_switch =
2440 SOC_DAPM_SINGLE("Switch", RT5665_PDM_OUT_CTRL,
2441 RT5665_M_PDM1_L_SFT, 1, 1);
2442
2443static const struct snd_kcontrol_new pdm_r_switch =
2444 SOC_DAPM_SINGLE("Switch", RT5665_PDM_OUT_CTRL,
2445 RT5665_M_PDM1_R_SFT, 1, 1);
2446
2447static int rt5665_mono_event(struct snd_soc_dapm_widget *w,
2448 struct snd_kcontrol *kcontrol, int event)
2449{
2450 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2451
2452 switch (event) {
2453 case SND_SOC_DAPM_PRE_PMU:
2454 snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1,
2455 RT5665_NG2_EN_MASK, RT5665_NG2_EN);
2456 snd_soc_update_bits(codec, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40,
2457 0x0);
2458 snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x10, 0x10);
2459 snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x20, 0x20);
2460 break;
2461
2462 case SND_SOC_DAPM_POST_PMD:
2463 snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x20, 0);
2464 snd_soc_update_bits(codec, RT5665_MONO_OUT, 0x10, 0);
2465 snd_soc_update_bits(codec, RT5665_MONO_AMP_CALIB_CTRL_1, 0x40,
2466 0x40);
2467 snd_soc_update_bits(codec, RT5665_MONO_NG2_CTRL_1,
2468 RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
2469 break;
2470
2471 default:
2472 return 0;
2473 }
2474
2475 return 0;
2476
2477}
2478
2479static int rt5665_hp_event(struct snd_soc_dapm_widget *w,
2480 struct snd_kcontrol *kcontrol, int event)
2481{
2482 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2483
2484 switch (event) {
2485 case SND_SOC_DAPM_PRE_PMU:
2486 snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1,
2487 RT5665_NG2_EN_MASK, RT5665_NG2_EN);
2488 snd_soc_write(codec, RT5665_HP_LOGIC_CTRL_2, 0x0003);
2489 break;
2490
2491 case SND_SOC_DAPM_POST_PMD:
2492 snd_soc_write(codec, RT5665_HP_LOGIC_CTRL_2, 0x0002);
2493 snd_soc_update_bits(codec, RT5665_STO_NG2_CTRL_1,
2494 RT5665_NG2_EN_MASK, RT5665_NG2_DIS);
2495 break;
2496
2497 default:
2498 return 0;
2499 }
2500
2501 return 0;
2502
2503}
2504
2505static int rt5665_lout_event(struct snd_soc_dapm_widget *w,
2506 struct snd_kcontrol *kcontrol, int event)
2507{
2508 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2509
2510 switch (event) {
2511 case SND_SOC_DAPM_POST_PMU:
2512 snd_soc_update_bits(codec, RT5665_DEPOP_1,
2513 RT5665_PUMP_EN, RT5665_PUMP_EN);
2514 break;
2515
2516 case SND_SOC_DAPM_PRE_PMD:
2517 snd_soc_update_bits(codec, RT5665_DEPOP_1,
2518 RT5665_PUMP_EN, 0);
2519 break;
2520
2521 default:
2522 return 0;
2523 }
2524
2525 return 0;
2526
2527}
2528
2529static int set_dmic_power(struct snd_soc_dapm_widget *w,
2530 struct snd_kcontrol *kcontrol, int event)
2531{
2532 switch (event) {
2533 case SND_SOC_DAPM_POST_PMU:
2534 /*Add delay to avoid pop noise*/
2535 msleep(150);
2536 break;
2537
2538 default:
2539 return 0;
2540 }
2541
2542 return 0;
2543}
2544
2545static int rt5655_set_verf(struct snd_soc_dapm_widget *w,
2546 struct snd_kcontrol *kcontrol, int event)
2547{
2548 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2549
2550 switch (event) {
2551 case SND_SOC_DAPM_PRE_PMU:
2552 switch (w->shift) {
2553 case RT5665_PWR_VREF1_BIT:
2554 snd_soc_update_bits(codec, RT5665_PWR_ANLG_1,
2555 RT5665_PWR_FV1, 0);
2556 break;
2557
2558 case RT5665_PWR_VREF2_BIT:
2559 snd_soc_update_bits(codec, RT5665_PWR_ANLG_1,
2560 RT5665_PWR_FV2, 0);
2561 break;
2562
2563 case RT5665_PWR_VREF3_BIT:
2564 snd_soc_update_bits(codec, RT5665_PWR_ANLG_1,
2565 RT5665_PWR_FV3, 0);
2566 break;
2567
2568 default:
2569 break;
2570 }
2571 break;
2572
2573 case SND_SOC_DAPM_POST_PMU:
2574 usleep_range(15000, 20000);
2575 switch (w->shift) {
2576 case RT5665_PWR_VREF1_BIT:
2577 snd_soc_update_bits(codec, RT5665_PWR_ANLG_1,
2578 RT5665_PWR_FV1, RT5665_PWR_FV1);
2579 break;
2580
2581 case RT5665_PWR_VREF2_BIT:
2582 snd_soc_update_bits(codec, RT5665_PWR_ANLG_1,
2583 RT5665_PWR_FV2, RT5665_PWR_FV2);
2584 break;
2585
2586 case RT5665_PWR_VREF3_BIT:
2587 snd_soc_update_bits(codec, RT5665_PWR_ANLG_1,
2588 RT5665_PWR_FV3, RT5665_PWR_FV3);
2589 break;
2590
2591 default:
2592 break;
2593 }
2594 break;
2595
2596 default:
2597 return 0;
2598 }
2599
2600 return 0;
2601}
2602
2603
2604static const struct snd_soc_dapm_widget rt5665_dapm_widgets[] = {
2605 SND_SOC_DAPM_SUPPLY("LDO2", RT5665_PWR_ANLG_3, RT5665_PWR_LDO2_BIT, 0,
2606 NULL, 0),
2607 SND_SOC_DAPM_SUPPLY("PLL", RT5665_PWR_ANLG_3, RT5665_PWR_PLL_BIT, 0,
2608 NULL, 0),
2609 SND_SOC_DAPM_SUPPLY("Mic Det Power", RT5665_PWR_VOL,
2610 RT5665_PWR_MIC_DET_BIT, 0, NULL, 0),
2611 SND_SOC_DAPM_SUPPLY("Vref1", RT5665_PWR_ANLG_1, RT5665_PWR_VREF1_BIT, 0,
2612 rt5655_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
2613 SND_SOC_DAPM_SUPPLY("Vref2", RT5665_PWR_ANLG_1, RT5665_PWR_VREF2_BIT, 0,
2614 rt5655_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
2615 SND_SOC_DAPM_SUPPLY("Vref3", RT5665_PWR_ANLG_1, RT5665_PWR_VREF3_BIT, 0,
2616 rt5655_set_verf, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU),
2617
2618 /* ASRC */
2619 SND_SOC_DAPM_SUPPLY_S("I2S1 ASRC", 1, RT5665_ASRC_1,
2620 RT5665_I2S1_ASRC_SFT, 0, NULL, 0),
2621 SND_SOC_DAPM_SUPPLY_S("I2S2 ASRC", 1, RT5665_ASRC_1,
2622 RT5665_I2S2_ASRC_SFT, 0, NULL, 0),
2623 SND_SOC_DAPM_SUPPLY_S("I2S3 ASRC", 1, RT5665_ASRC_1,
2624 RT5665_I2S3_ASRC_SFT, 0, NULL, 0),
2625 SND_SOC_DAPM_SUPPLY_S("DAC STO1 ASRC", 1, RT5665_ASRC_1,
2626 RT5665_DAC_STO1_ASRC_SFT, 0, NULL, 0),
2627 SND_SOC_DAPM_SUPPLY_S("DAC STO2 ASRC", 1, RT5665_ASRC_1,
2628 RT5665_DAC_STO2_ASRC_SFT, 0, NULL, 0),
2629 SND_SOC_DAPM_SUPPLY_S("DAC Mono L ASRC", 1, RT5665_ASRC_1,
2630 RT5665_DAC_MONO_L_ASRC_SFT, 0, NULL, 0),
2631 SND_SOC_DAPM_SUPPLY_S("DAC Mono R ASRC", 1, RT5665_ASRC_1,
2632 RT5665_DAC_MONO_R_ASRC_SFT, 0, NULL, 0),
2633 SND_SOC_DAPM_SUPPLY_S("ADC STO1 ASRC", 1, RT5665_ASRC_1,
2634 RT5665_ADC_STO1_ASRC_SFT, 0, NULL, 0),
2635 SND_SOC_DAPM_SUPPLY_S("ADC Mono L ASRC", 1, RT5665_ASRC_1,
2636 RT5665_ADC_MONO_L_ASRC_SFT, 0, NULL, 0),
2637 SND_SOC_DAPM_SUPPLY_S("ADC Mono R ASRC", 1, RT5665_ASRC_1,
2638 RT5665_ADC_MONO_R_ASRC_SFT, 0, NULL, 0),
2639 SND_SOC_DAPM_SUPPLY_S("DMIC STO1 ASRC", 1, RT5665_ASRC_1,
2640 RT5665_DMIC_STO1_ASRC_SFT, 0, NULL, 0),
2641 SND_SOC_DAPM_SUPPLY_S("DMIC STO2 ASRC", 1, RT5665_ASRC_1,
2642 RT5665_DMIC_STO2_ASRC_SFT, 0, NULL, 0),
2643 SND_SOC_DAPM_SUPPLY_S("DMIC MONO L ASRC", 1, RT5665_ASRC_1,
2644 RT5665_DMIC_MONO_L_ASRC_SFT, 0, NULL, 0),
2645 SND_SOC_DAPM_SUPPLY_S("DMIC MONO R ASRC", 1, RT5665_ASRC_1,
2646 RT5665_DMIC_MONO_R_ASRC_SFT, 0, NULL, 0),
2647
2648 /* Input Side */
2649 SND_SOC_DAPM_SUPPLY("MICBIAS1", RT5665_PWR_ANLG_2, RT5665_PWR_MB1_BIT,
2650 0, NULL, 0),
2651 SND_SOC_DAPM_SUPPLY("MICBIAS2", RT5665_PWR_ANLG_2, RT5665_PWR_MB2_BIT,
2652 0, NULL, 0),
2653 SND_SOC_DAPM_SUPPLY("MICBIAS3", RT5665_PWR_ANLG_2, RT5665_PWR_MB3_BIT,
2654 0, NULL, 0),
2655
2656 /* Input Lines */
2657 SND_SOC_DAPM_INPUT("DMIC L1"),
2658 SND_SOC_DAPM_INPUT("DMIC R1"),
2659 SND_SOC_DAPM_INPUT("DMIC L2"),
2660 SND_SOC_DAPM_INPUT("DMIC R2"),
2661
2662 SND_SOC_DAPM_INPUT("IN1P"),
2663 SND_SOC_DAPM_INPUT("IN1N"),
2664 SND_SOC_DAPM_INPUT("IN2P"),
2665 SND_SOC_DAPM_INPUT("IN2N"),
2666 SND_SOC_DAPM_INPUT("IN3P"),
2667 SND_SOC_DAPM_INPUT("IN3N"),
2668 SND_SOC_DAPM_INPUT("IN4P"),
2669 SND_SOC_DAPM_INPUT("IN4N"),
2670
2671 SND_SOC_DAPM_PGA("DMIC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2672 SND_SOC_DAPM_PGA("DMIC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2673
2674 SND_SOC_DAPM_SUPPLY("DMIC CLK", SND_SOC_NOPM, 0, 0,
2675 set_dmic_clk, SND_SOC_DAPM_PRE_PMU),
2676 SND_SOC_DAPM_SUPPLY("DMIC1 Power", RT5665_DMIC_CTRL_1,
2677 RT5665_DMIC_1_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
2678 SND_SOC_DAPM_SUPPLY("DMIC2 Power", RT5665_DMIC_CTRL_1,
2679 RT5665_DMIC_2_EN_SFT, 0, set_dmic_power, SND_SOC_DAPM_POST_PMU),
2680
2681 /* Boost */
2682 SND_SOC_DAPM_PGA("BST1", SND_SOC_NOPM,
2683 0, 0, NULL, 0),
2684 SND_SOC_DAPM_PGA("BST2", SND_SOC_NOPM,
2685 0, 0, NULL, 0),
2686 SND_SOC_DAPM_PGA("BST3", SND_SOC_NOPM,
2687 0, 0, NULL, 0),
2688 SND_SOC_DAPM_PGA("BST4", SND_SOC_NOPM,
2689 0, 0, NULL, 0),
2690 SND_SOC_DAPM_PGA("BST1 CBJ", SND_SOC_NOPM,
2691 0, 0, NULL, 0),
2692 SND_SOC_DAPM_SUPPLY("BST1 Power", RT5665_PWR_ANLG_2,
2693 RT5665_PWR_BST1_BIT, 0, NULL, 0),
2694 SND_SOC_DAPM_SUPPLY("BST2 Power", RT5665_PWR_ANLG_2,
2695 RT5665_PWR_BST2_BIT, 0, NULL, 0),
2696 SND_SOC_DAPM_SUPPLY("BST3 Power", RT5665_PWR_ANLG_2,
2697 RT5665_PWR_BST3_BIT, 0, NULL, 0),
2698 SND_SOC_DAPM_SUPPLY("BST4 Power", RT5665_PWR_ANLG_2,
2699 RT5665_PWR_BST4_BIT, 0, NULL, 0),
2700 SND_SOC_DAPM_SUPPLY("BST1P Power", RT5665_PWR_ANLG_2,
2701 RT5665_PWR_BST1_P_BIT, 0, NULL, 0),
2702 SND_SOC_DAPM_SUPPLY("BST2P Power", RT5665_PWR_ANLG_2,
2703 RT5665_PWR_BST2_P_BIT, 0, NULL, 0),
2704 SND_SOC_DAPM_SUPPLY("BST3P Power", RT5665_PWR_ANLG_2,
2705 RT5665_PWR_BST3_P_BIT, 0, NULL, 0),
2706 SND_SOC_DAPM_SUPPLY("BST4P Power", RT5665_PWR_ANLG_2,
2707 RT5665_PWR_BST4_P_BIT, 0, NULL, 0),
2708 SND_SOC_DAPM_SUPPLY("CBJ Power", RT5665_PWR_ANLG_3,
2709 RT5665_PWR_CBJ_BIT, 0, NULL, 0),
2710
2711
2712 /* Input Volume */
2713 SND_SOC_DAPM_PGA("INL VOL", RT5665_PWR_VOL, RT5665_PWR_IN_L_BIT,
2714 0, NULL, 0),
2715 SND_SOC_DAPM_PGA("INR VOL", RT5665_PWR_VOL, RT5665_PWR_IN_R_BIT,
2716 0, NULL, 0),
2717
2718 /* REC Mixer */
2719 SND_SOC_DAPM_MIXER("RECMIX1L", SND_SOC_NOPM, 0, 0, rt5665_rec1_l_mix,
2720 ARRAY_SIZE(rt5665_rec1_l_mix)),
2721 SND_SOC_DAPM_MIXER("RECMIX1R", SND_SOC_NOPM, 0, 0, rt5665_rec1_r_mix,
2722 ARRAY_SIZE(rt5665_rec1_r_mix)),
2723 SND_SOC_DAPM_MIXER("RECMIX2L", SND_SOC_NOPM, 0, 0, rt5665_rec2_l_mix,
2724 ARRAY_SIZE(rt5665_rec2_l_mix)),
2725 SND_SOC_DAPM_MIXER("RECMIX2R", SND_SOC_NOPM, 0, 0, rt5665_rec2_r_mix,
2726 ARRAY_SIZE(rt5665_rec2_r_mix)),
2727 SND_SOC_DAPM_SUPPLY("RECMIX1L Power", RT5665_PWR_ANLG_2,
2728 RT5665_PWR_RM1_L_BIT, 0, NULL, 0),
2729 SND_SOC_DAPM_SUPPLY("RECMIX1R Power", RT5665_PWR_ANLG_2,
2730 RT5665_PWR_RM1_R_BIT, 0, NULL, 0),
2731 SND_SOC_DAPM_SUPPLY("RECMIX2L Power", RT5665_PWR_MIXER,
2732 RT5665_PWR_RM2_L_BIT, 0, NULL, 0),
2733 SND_SOC_DAPM_SUPPLY("RECMIX2R Power", RT5665_PWR_MIXER,
2734 RT5665_PWR_RM2_R_BIT, 0, NULL, 0),
2735
2736 /* ADCs */
2737 SND_SOC_DAPM_ADC("ADC1 L", NULL, SND_SOC_NOPM, 0, 0),
2738 SND_SOC_DAPM_ADC("ADC1 R", NULL, SND_SOC_NOPM, 0, 0),
2739 SND_SOC_DAPM_ADC("ADC2 L", NULL, SND_SOC_NOPM, 0, 0),
2740 SND_SOC_DAPM_ADC("ADC2 R", NULL, SND_SOC_NOPM, 0, 0),
2741
2742 SND_SOC_DAPM_SUPPLY("ADC1 L Power", RT5665_PWR_DIG_1,
2743 RT5665_PWR_ADC_L1_BIT, 0, NULL, 0),
2744 SND_SOC_DAPM_SUPPLY("ADC1 R Power", RT5665_PWR_DIG_1,
2745 RT5665_PWR_ADC_R1_BIT, 0, NULL, 0),
2746 SND_SOC_DAPM_SUPPLY("ADC2 L Power", RT5665_PWR_DIG_1,
2747 RT5665_PWR_ADC_L2_BIT, 0, NULL, 0),
2748 SND_SOC_DAPM_SUPPLY("ADC2 R Power", RT5665_PWR_DIG_1,
2749 RT5665_PWR_ADC_R2_BIT, 0, NULL, 0),
2750 SND_SOC_DAPM_SUPPLY("ADC1 clock", RT5665_CHOP_ADC,
2751 RT5665_CKGEN_ADC1_SFT, 0, NULL, 0),
2752 SND_SOC_DAPM_SUPPLY("ADC2 clock", RT5665_CHOP_ADC,
2753 RT5665_CKGEN_ADC2_SFT, 0, NULL, 0),
2754
2755 /* ADC Mux */
2756 SND_SOC_DAPM_MUX("Stereo1 DMIC L Mux", SND_SOC_NOPM, 0, 0,
2757 &rt5665_sto1_dmic_mux),
2758 SND_SOC_DAPM_MUX("Stereo1 DMIC R Mux", SND_SOC_NOPM, 0, 0,
2759 &rt5665_sto1_dmic_mux),
2760 SND_SOC_DAPM_MUX("Stereo1 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2761 &rt5665_sto1_adc1l_mux),
2762 SND_SOC_DAPM_MUX("Stereo1 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2763 &rt5665_sto1_adc1r_mux),
2764 SND_SOC_DAPM_MUX("Stereo1 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2765 &rt5665_sto1_adc2l_mux),
2766 SND_SOC_DAPM_MUX("Stereo1 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2767 &rt5665_sto1_adc2r_mux),
2768 SND_SOC_DAPM_MUX("Stereo1 ADC L Mux", SND_SOC_NOPM, 0, 0,
2769 &rt5665_sto1_adcl_mux),
2770 SND_SOC_DAPM_MUX("Stereo1 ADC R Mux", SND_SOC_NOPM, 0, 0,
2771 &rt5665_sto1_adcr_mux),
2772 SND_SOC_DAPM_MUX("Stereo1 DD L Mux", SND_SOC_NOPM, 0, 0,
2773 &rt5665_sto1_dd_l_mux),
2774 SND_SOC_DAPM_MUX("Stereo1 DD R Mux", SND_SOC_NOPM, 0, 0,
2775 &rt5665_sto1_dd_r_mux),
2776 SND_SOC_DAPM_MUX("Mono ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2777 &rt5665_mono_adc_l2_mux),
2778 SND_SOC_DAPM_MUX("Mono ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2779 &rt5665_mono_adc_r2_mux),
2780 SND_SOC_DAPM_MUX("Mono ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2781 &rt5665_mono_adc_l1_mux),
2782 SND_SOC_DAPM_MUX("Mono ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2783 &rt5665_mono_adc_r1_mux),
2784 SND_SOC_DAPM_MUX("Mono DMIC L Mux", SND_SOC_NOPM, 0, 0,
2785 &rt5665_mono_dmic_l_mux),
2786 SND_SOC_DAPM_MUX("Mono DMIC R Mux", SND_SOC_NOPM, 0, 0,
2787 &rt5665_mono_dmic_r_mux),
2788 SND_SOC_DAPM_MUX("Mono ADC L Mux", SND_SOC_NOPM, 0, 0,
2789 &rt5665_mono_adc_l_mux),
2790 SND_SOC_DAPM_MUX("Mono ADC R Mux", SND_SOC_NOPM, 0, 0,
2791 &rt5665_mono_adc_r_mux),
2792 SND_SOC_DAPM_MUX("Mono DD L Mux", SND_SOC_NOPM, 0, 0,
2793 &rt5665_mono_dd_l_mux),
2794 SND_SOC_DAPM_MUX("Mono DD R Mux", SND_SOC_NOPM, 0, 0,
2795 &rt5665_mono_dd_r_mux),
2796 SND_SOC_DAPM_MUX("Stereo2 DMIC L Mux", SND_SOC_NOPM, 0, 0,
2797 &rt5665_sto2_dmic_mux),
2798 SND_SOC_DAPM_MUX("Stereo2 DMIC R Mux", SND_SOC_NOPM, 0, 0,
2799 &rt5665_sto2_dmic_mux),
2800 SND_SOC_DAPM_MUX("Stereo2 ADC L1 Mux", SND_SOC_NOPM, 0, 0,
2801 &rt5665_sto2_adc1l_mux),
2802 SND_SOC_DAPM_MUX("Stereo2 ADC R1 Mux", SND_SOC_NOPM, 0, 0,
2803 &rt5665_sto2_adc1r_mux),
2804 SND_SOC_DAPM_MUX("Stereo2 ADC L2 Mux", SND_SOC_NOPM, 0, 0,
2805 &rt5665_sto2_adc2l_mux),
2806 SND_SOC_DAPM_MUX("Stereo2 ADC R2 Mux", SND_SOC_NOPM, 0, 0,
2807 &rt5665_sto2_adc2r_mux),
2808 SND_SOC_DAPM_MUX("Stereo2 ADC L Mux", SND_SOC_NOPM, 0, 0,
2809 &rt5665_sto2_adcl_mux),
2810 SND_SOC_DAPM_MUX("Stereo2 ADC R Mux", SND_SOC_NOPM, 0, 0,
2811 &rt5665_sto2_adcr_mux),
2812 SND_SOC_DAPM_MUX("Stereo2 DD L Mux", SND_SOC_NOPM, 0, 0,
2813 &rt5665_sto2_dd_l_mux),
2814 SND_SOC_DAPM_MUX("Stereo2 DD R Mux", SND_SOC_NOPM, 0, 0,
2815 &rt5665_sto2_dd_r_mux),
2816 /* ADC Mixer */
2817 SND_SOC_DAPM_SUPPLY("ADC Stereo1 Filter", RT5665_PWR_DIG_2,
2818 RT5665_PWR_ADC_S1F_BIT, 0, NULL, 0),
2819 SND_SOC_DAPM_SUPPLY("ADC Stereo2 Filter", RT5665_PWR_DIG_2,
2820 RT5665_PWR_ADC_S2F_BIT, 0, NULL, 0),
2821 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXL", RT5665_STO1_ADC_DIG_VOL,
2822 RT5665_L_MUTE_SFT, 1, rt5665_sto1_adc_l_mix,
2823 ARRAY_SIZE(rt5665_sto1_adc_l_mix)),
2824 SND_SOC_DAPM_MIXER("Stereo1 ADC MIXR", RT5665_STO1_ADC_DIG_VOL,
2825 RT5665_R_MUTE_SFT, 1, rt5665_sto1_adc_r_mix,
2826 ARRAY_SIZE(rt5665_sto1_adc_r_mix)),
2827 SND_SOC_DAPM_MIXER("Stereo2 ADC MIXL", RT5665_STO2_ADC_DIG_VOL,
2828 RT5665_L_MUTE_SFT, 1, rt5665_sto2_adc_l_mix,
2829 ARRAY_SIZE(rt5665_sto2_adc_l_mix)),
2830 SND_SOC_DAPM_MIXER("Stereo2 ADC MIXR", RT5665_STO2_ADC_DIG_VOL,
2831 RT5665_R_MUTE_SFT, 1, rt5665_sto2_adc_r_mix,
2832 ARRAY_SIZE(rt5665_sto2_adc_r_mix)),
2833 SND_SOC_DAPM_SUPPLY("ADC Mono Left Filter", RT5665_PWR_DIG_2,
2834 RT5665_PWR_ADC_MF_L_BIT, 0, NULL, 0),
2835 SND_SOC_DAPM_MIXER("Mono ADC MIXL", RT5665_MONO_ADC_DIG_VOL,
2836 RT5665_L_MUTE_SFT, 1, rt5665_mono_adc_l_mix,
2837 ARRAY_SIZE(rt5665_mono_adc_l_mix)),
2838 SND_SOC_DAPM_SUPPLY("ADC Mono Right Filter", RT5665_PWR_DIG_2,
2839 RT5665_PWR_ADC_MF_R_BIT, 0, NULL, 0),
2840 SND_SOC_DAPM_MIXER("Mono ADC MIXR", RT5665_MONO_ADC_DIG_VOL,
2841 RT5665_R_MUTE_SFT, 1, rt5665_mono_adc_r_mix,
2842 ARRAY_SIZE(rt5665_mono_adc_r_mix)),
2843
2844 /* ADC PGA */
2845 SND_SOC_DAPM_PGA("Stereo1 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2846 SND_SOC_DAPM_PGA("Stereo2 ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2847 SND_SOC_DAPM_PGA("Mono ADC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2848
2849 /* Digital Interface */
2850 SND_SOC_DAPM_SUPPLY("I2S1_1", RT5665_PWR_DIG_1, RT5665_PWR_I2S1_1_BIT,
2851 0, NULL, 0),
2852 SND_SOC_DAPM_SUPPLY("I2S1_2", RT5665_PWR_DIG_1, RT5665_PWR_I2S1_2_BIT,
2853 0, NULL, 0),
2854 SND_SOC_DAPM_SUPPLY("I2S2_1", RT5665_PWR_DIG_1, RT5665_PWR_I2S2_1_BIT,
2855 0, NULL, 0),
2856 SND_SOC_DAPM_SUPPLY("I2S2_2", RT5665_PWR_DIG_1, RT5665_PWR_I2S2_2_BIT,
2857 0, NULL, 0),
2858 SND_SOC_DAPM_SUPPLY("I2S3", RT5665_PWR_DIG_1, RT5665_PWR_I2S3_BIT,
2859 0, NULL, 0),
2860 SND_SOC_DAPM_PGA("IF1 DAC1", SND_SOC_NOPM, 0, 0, NULL, 0),
2861 SND_SOC_DAPM_PGA("IF1 DAC2", SND_SOC_NOPM, 0, 0, NULL, 0),
2862 SND_SOC_DAPM_PGA("IF1 DAC3", SND_SOC_NOPM, 0, 0, NULL, 0),
2863 SND_SOC_DAPM_PGA("IF1 DAC1 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2864 SND_SOC_DAPM_PGA("IF1 DAC1 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2865 SND_SOC_DAPM_PGA("IF1 DAC2 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2866 SND_SOC_DAPM_PGA("IF1 DAC2 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2867 SND_SOC_DAPM_PGA("IF1 DAC3 L", SND_SOC_NOPM, 0, 0, NULL, 0),
2868 SND_SOC_DAPM_PGA("IF1 DAC3 R", SND_SOC_NOPM, 0, 0, NULL, 0),
2869
2870 SND_SOC_DAPM_PGA("IF2_1 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2871 SND_SOC_DAPM_PGA("IF2_2 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2872 SND_SOC_DAPM_PGA("IF2_1 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2873 SND_SOC_DAPM_PGA("IF2_1 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2874 SND_SOC_DAPM_PGA("IF2_2 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2875 SND_SOC_DAPM_PGA("IF2_2 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2876 SND_SOC_DAPM_PGA("IF2_1 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2877 SND_SOC_DAPM_PGA("IF2_2 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2878
2879 SND_SOC_DAPM_PGA("IF3 DAC", SND_SOC_NOPM, 0, 0, NULL, 0),
2880 SND_SOC_DAPM_PGA("IF3 DAC L", SND_SOC_NOPM, 0, 0, NULL, 0),
2881 SND_SOC_DAPM_PGA("IF3 DAC R", SND_SOC_NOPM, 0, 0, NULL, 0),
2882 SND_SOC_DAPM_PGA("IF3 ADC", SND_SOC_NOPM, 0, 0, NULL, 0),
2883
2884 /* Digital Interface Select */
2885 SND_SOC_DAPM_MUX("IF1_1_ADC1 Mux", SND_SOC_NOPM, 0, 0,
2886 &rt5665_if1_1_adc1_mux),
2887 SND_SOC_DAPM_MUX("IF1_1_ADC2 Mux", SND_SOC_NOPM, 0, 0,
2888 &rt5665_if1_1_adc2_mux),
2889 SND_SOC_DAPM_MUX("IF1_1_ADC3 Mux", SND_SOC_NOPM, 0, 0,
2890 &rt5665_if1_1_adc3_mux),
2891 SND_SOC_DAPM_PGA("IF1_1_ADC4", SND_SOC_NOPM, 0, 0, NULL, 0),
2892 SND_SOC_DAPM_MUX("IF1_2_ADC1 Mux", SND_SOC_NOPM, 0, 0,
2893 &rt5665_if1_2_adc1_mux),
2894 SND_SOC_DAPM_MUX("IF1_2_ADC2 Mux", SND_SOC_NOPM, 0, 0,
2895 &rt5665_if1_2_adc2_mux),
2896 SND_SOC_DAPM_MUX("IF1_2_ADC3 Mux", SND_SOC_NOPM, 0, 0,
2897 &rt5665_if1_2_adc3_mux),
2898 SND_SOC_DAPM_MUX("IF1_2_ADC4 Mux", SND_SOC_NOPM, 0, 0,
2899 &rt5665_if1_2_adc4_mux),
2900 SND_SOC_DAPM_MUX("TDM1 slot 01 Data Mux", SND_SOC_NOPM, 0, 0,
2901 &rt5665_tdm1_adc_mux),
2902 SND_SOC_DAPM_MUX("TDM1 slot 23 Data Mux", SND_SOC_NOPM, 0, 0,
2903 &rt5665_tdm1_adc_mux),
2904 SND_SOC_DAPM_MUX("TDM1 slot 45 Data Mux", SND_SOC_NOPM, 0, 0,
2905 &rt5665_tdm1_adc_mux),
2906 SND_SOC_DAPM_MUX("TDM1 slot 67 Data Mux", SND_SOC_NOPM, 0, 0,
2907 &rt5665_tdm1_adc_mux),
2908 SND_SOC_DAPM_MUX("TDM2 slot 01 Data Mux", SND_SOC_NOPM, 0, 0,
2909 &rt5665_tdm2_adc_mux),
2910 SND_SOC_DAPM_MUX("TDM2 slot 23 Data Mux", SND_SOC_NOPM, 0, 0,
2911 &rt5665_tdm2_adc_mux),
2912 SND_SOC_DAPM_MUX("TDM2 slot 45 Data Mux", SND_SOC_NOPM, 0, 0,
2913 &rt5665_tdm2_adc_mux),
2914 SND_SOC_DAPM_MUX("TDM2 slot 67 Data Mux", SND_SOC_NOPM, 0, 0,
2915 &rt5665_tdm2_adc_mux),
2916 SND_SOC_DAPM_MUX("IF2_1 ADC Mux", SND_SOC_NOPM, 0, 0,
2917 &rt5665_if2_1_adc_in_mux),
2918 SND_SOC_DAPM_MUX("IF2_2 ADC Mux", SND_SOC_NOPM, 0, 0,
2919 &rt5665_if2_2_adc_in_mux),
2920 SND_SOC_DAPM_MUX("IF3 ADC Mux", SND_SOC_NOPM, 0, 0,
2921 &rt5665_if3_adc_in_mux),
2922 SND_SOC_DAPM_MUX("IF1_1 0 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2923 &rt5665_if1_1_01_adc_swap_mux),
2924 SND_SOC_DAPM_MUX("IF1_1 1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2925 &rt5665_if1_1_01_adc_swap_mux),
2926 SND_SOC_DAPM_MUX("IF1_1 2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2927 &rt5665_if1_1_23_adc_swap_mux),
2928 SND_SOC_DAPM_MUX("IF1_1 3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2929 &rt5665_if1_1_23_adc_swap_mux),
2930 SND_SOC_DAPM_MUX("IF1_1 4 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2931 &rt5665_if1_1_45_adc_swap_mux),
2932 SND_SOC_DAPM_MUX("IF1_1 5 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2933 &rt5665_if1_1_45_adc_swap_mux),
2934 SND_SOC_DAPM_MUX("IF1_1 6 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2935 &rt5665_if1_1_67_adc_swap_mux),
2936 SND_SOC_DAPM_MUX("IF1_1 7 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2937 &rt5665_if1_1_67_adc_swap_mux),
2938 SND_SOC_DAPM_MUX("IF1_2 0 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2939 &rt5665_if1_2_01_adc_swap_mux),
2940 SND_SOC_DAPM_MUX("IF1_2 1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2941 &rt5665_if1_2_01_adc_swap_mux),
2942 SND_SOC_DAPM_MUX("IF1_2 2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2943 &rt5665_if1_2_23_adc_swap_mux),
2944 SND_SOC_DAPM_MUX("IF1_2 3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2945 &rt5665_if1_2_23_adc_swap_mux),
2946 SND_SOC_DAPM_MUX("IF1_2 4 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2947 &rt5665_if1_2_45_adc_swap_mux),
2948 SND_SOC_DAPM_MUX("IF1_2 5 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2949 &rt5665_if1_2_45_adc_swap_mux),
2950 SND_SOC_DAPM_MUX("IF1_2 6 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2951 &rt5665_if1_2_67_adc_swap_mux),
2952 SND_SOC_DAPM_MUX("IF1_2 7 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2953 &rt5665_if1_2_67_adc_swap_mux),
2954 SND_SOC_DAPM_MUX("IF2_1 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2955 &rt5665_if2_1_dac_swap_mux),
2956 SND_SOC_DAPM_MUX("IF2_1 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2957 &rt5665_if2_1_adc_swap_mux),
2958 SND_SOC_DAPM_MUX("IF2_2 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2959 &rt5665_if2_2_dac_swap_mux),
2960 SND_SOC_DAPM_MUX("IF2_2 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2961 &rt5665_if2_2_adc_swap_mux),
2962 SND_SOC_DAPM_MUX("IF3 DAC Swap Mux", SND_SOC_NOPM, 0, 0,
2963 &rt5665_if3_dac_swap_mux),
2964 SND_SOC_DAPM_MUX("IF3 ADC Swap Mux", SND_SOC_NOPM, 0, 0,
2965 &rt5665_if3_adc_swap_mux),
2966
2967 /* Audio Interface */
2968 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 0", "AIF1_1 Capture",
2969 0, SND_SOC_NOPM, 0, 0),
2970 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 1", "AIF1_1 Capture",
2971 1, SND_SOC_NOPM, 0, 0),
2972 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 2", "AIF1_1 Capture",
2973 2, SND_SOC_NOPM, 0, 0),
2974 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 3", "AIF1_1 Capture",
2975 3, SND_SOC_NOPM, 0, 0),
2976 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 4", "AIF1_1 Capture",
2977 4, SND_SOC_NOPM, 0, 0),
2978 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 5", "AIF1_1 Capture",
2979 5, SND_SOC_NOPM, 0, 0),
2980 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 6", "AIF1_1 Capture",
2981 6, SND_SOC_NOPM, 0, 0),
2982 SND_SOC_DAPM_AIF_OUT("AIF1_1TX slot 7", "AIF1_1 Capture",
2983 7, SND_SOC_NOPM, 0, 0),
2984 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 0", "AIF1_2 Capture",
2985 0, SND_SOC_NOPM, 0, 0),
2986 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 1", "AIF1_2 Capture",
2987 1, SND_SOC_NOPM, 0, 0),
2988 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 2", "AIF1_2 Capture",
2989 2, SND_SOC_NOPM, 0, 0),
2990 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 3", "AIF1_2 Capture",
2991 3, SND_SOC_NOPM, 0, 0),
2992 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 4", "AIF1_2 Capture",
2993 4, SND_SOC_NOPM, 0, 0),
2994 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 5", "AIF1_2 Capture",
2995 5, SND_SOC_NOPM, 0, 0),
2996 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 6", "AIF1_2 Capture",
2997 6, SND_SOC_NOPM, 0, 0),
2998 SND_SOC_DAPM_AIF_OUT("AIF1_2TX slot 7", "AIF1_2 Capture",
2999 7, SND_SOC_NOPM, 0, 0),
3000 SND_SOC_DAPM_AIF_OUT("AIF2_1TX", "AIF2_1 Capture",
3001 0, SND_SOC_NOPM, 0, 0),
3002 SND_SOC_DAPM_AIF_OUT("AIF2_2TX", "AIF2_2 Capture",
3003 0, SND_SOC_NOPM, 0, 0),
3004 SND_SOC_DAPM_AIF_OUT("AIF3TX", "AIF3 Capture",
3005 0, SND_SOC_NOPM, 0, 0),
3006 SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback",
3007 0, SND_SOC_NOPM, 0, 0),
3008 SND_SOC_DAPM_AIF_IN("AIF2_1RX", "AIF2_1 Playback",
3009 0, SND_SOC_NOPM, 0, 0),
3010 SND_SOC_DAPM_AIF_IN("AIF2_2RX", "AIF2_2 Playback",
3011 0, SND_SOC_NOPM, 0, 0),
3012 SND_SOC_DAPM_AIF_IN("AIF3RX", "AIF3 Playback",
3013 0, SND_SOC_NOPM, 0, 0),
3014
3015 /* Output Side */
3016 /* DAC mixer before sound effect */
3017 SND_SOC_DAPM_MIXER("DAC1 MIXL", SND_SOC_NOPM, 0, 0,
3018 rt5665_dac_l_mix, ARRAY_SIZE(rt5665_dac_l_mix)),
3019 SND_SOC_DAPM_MIXER("DAC1 MIXR", SND_SOC_NOPM, 0, 0,
3020 rt5665_dac_r_mix, ARRAY_SIZE(rt5665_dac_r_mix)),
3021
3022 /* DAC channel Mux */
3023 SND_SOC_DAPM_MUX("DAC L1 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_l1_mux),
3024 SND_SOC_DAPM_MUX("DAC R1 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_r1_mux),
3025 SND_SOC_DAPM_MUX("DAC L2 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_l2_mux),
3026 SND_SOC_DAPM_MUX("DAC R2 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_r2_mux),
3027 SND_SOC_DAPM_MUX("DAC L3 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_l3_mux),
3028 SND_SOC_DAPM_MUX("DAC R3 Mux", SND_SOC_NOPM, 0, 0, &rt5665_dac_r3_mux),
3029
3030 SND_SOC_DAPM_MUX("DAC L1 Source", SND_SOC_NOPM, 0, 0,
3031 &rt5665_alg_dac_l1_mux),
3032 SND_SOC_DAPM_MUX("DAC R1 Source", SND_SOC_NOPM, 0, 0,
3033 &rt5665_alg_dac_r1_mux),
3034 SND_SOC_DAPM_MUX("DAC L2 Source", SND_SOC_NOPM, 0, 0,
3035 &rt5665_alg_dac_l2_mux),
3036 SND_SOC_DAPM_MUX("DAC R2 Source", SND_SOC_NOPM, 0, 0,
3037 &rt5665_alg_dac_r2_mux),
3038
3039 /* DAC Mixer */
3040 SND_SOC_DAPM_SUPPLY("DAC Stereo1 Filter", RT5665_PWR_DIG_2,
3041 RT5665_PWR_DAC_S1F_BIT, 0, NULL, 0),
3042 SND_SOC_DAPM_SUPPLY("DAC Stereo2 Filter", RT5665_PWR_DIG_2,
3043 RT5665_PWR_DAC_S2F_BIT, 0, NULL, 0),
3044 SND_SOC_DAPM_SUPPLY("DAC Mono Left Filter", RT5665_PWR_DIG_2,
3045 RT5665_PWR_DAC_MF_L_BIT, 0, NULL, 0),
3046 SND_SOC_DAPM_SUPPLY("DAC Mono Right Filter", RT5665_PWR_DIG_2,
3047 RT5665_PWR_DAC_MF_R_BIT, 0, NULL, 0),
3048 SND_SOC_DAPM_MIXER("Stereo1 DAC MIXL", SND_SOC_NOPM, 0, 0,
3049 rt5665_sto1_dac_l_mix, ARRAY_SIZE(rt5665_sto1_dac_l_mix)),
3050 SND_SOC_DAPM_MIXER("Stereo1 DAC MIXR", SND_SOC_NOPM, 0, 0,
3051 rt5665_sto1_dac_r_mix, ARRAY_SIZE(rt5665_sto1_dac_r_mix)),
3052 SND_SOC_DAPM_MIXER("Stereo2 DAC MIXL", SND_SOC_NOPM, 0, 0,
3053 rt5665_sto2_dac_l_mix, ARRAY_SIZE(rt5665_sto2_dac_l_mix)),
3054 SND_SOC_DAPM_MIXER("Stereo2 DAC MIXR", SND_SOC_NOPM, 0, 0,
3055 rt5665_sto2_dac_r_mix, ARRAY_SIZE(rt5665_sto2_dac_r_mix)),
3056 SND_SOC_DAPM_MIXER("Mono DAC MIXL", SND_SOC_NOPM, 0, 0,
3057 rt5665_mono_dac_l_mix, ARRAY_SIZE(rt5665_mono_dac_l_mix)),
3058 SND_SOC_DAPM_MIXER("Mono DAC MIXR", SND_SOC_NOPM, 0, 0,
3059 rt5665_mono_dac_r_mix, ARRAY_SIZE(rt5665_mono_dac_r_mix)),
3060 SND_SOC_DAPM_MUX("DAC MIXL", SND_SOC_NOPM, 0, 0,
3061 &rt5665_dig_dac_mixl_mux),
3062 SND_SOC_DAPM_MUX("DAC MIXR", SND_SOC_NOPM, 0, 0,
3063 &rt5665_dig_dac_mixr_mux),
3064
3065 /* DACs */
3066 SND_SOC_DAPM_DAC("DAC L1", NULL, SND_SOC_NOPM, 0, 0),
3067 SND_SOC_DAPM_DAC("DAC R1", NULL, SND_SOC_NOPM, 0, 0),
3068
3069 SND_SOC_DAPM_SUPPLY("DAC L2 Power", RT5665_PWR_DIG_1,
3070 RT5665_PWR_DAC_L2_BIT, 0, NULL, 0),
3071 SND_SOC_DAPM_SUPPLY("DAC R2 Power", RT5665_PWR_DIG_1,
3072 RT5665_PWR_DAC_R2_BIT, 0, NULL, 0),
3073 SND_SOC_DAPM_DAC("DAC L2", NULL, SND_SOC_NOPM, 0, 0),
3074 SND_SOC_DAPM_DAC("DAC R2", NULL, SND_SOC_NOPM, 0, 0),
3075 SND_SOC_DAPM_PGA("DAC1 MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
3076
3077 SND_SOC_DAPM_SUPPLY_S("DAC 1 Clock", 1, RT5665_CHOP_DAC,
3078 RT5665_CKGEN_DAC1_SFT, 0, NULL, 0),
3079 SND_SOC_DAPM_SUPPLY_S("DAC 2 Clock", 1, RT5665_CHOP_DAC,
3080 RT5665_CKGEN_DAC2_SFT, 0, NULL, 0),
3081
3082 /* OUT Mixer */
3083 SND_SOC_DAPM_MIXER("MONOVOL MIX", RT5665_PWR_MIXER, RT5665_PWR_MM_BIT,
3084 0, rt5665_monovol_mix, ARRAY_SIZE(rt5665_monovol_mix)),
3085 SND_SOC_DAPM_MIXER("OUT MIXL", RT5665_PWR_MIXER, RT5665_PWR_OM_L_BIT,
3086 0, rt5665_out_l_mix, ARRAY_SIZE(rt5665_out_l_mix)),
3087 SND_SOC_DAPM_MIXER("OUT MIXR", RT5665_PWR_MIXER, RT5665_PWR_OM_R_BIT,
3088 0, rt5665_out_r_mix, ARRAY_SIZE(rt5665_out_r_mix)),
3089
3090 /* Output Volume */
3091 SND_SOC_DAPM_SWITCH("MONOVOL", RT5665_PWR_VOL, RT5665_PWR_MV_BIT, 0,
3092 &monovol_switch),
3093 SND_SOC_DAPM_SWITCH("OUTVOL L", RT5665_PWR_VOL, RT5665_PWR_OV_L_BIT, 0,
3094 &outvol_l_switch),
3095 SND_SOC_DAPM_SWITCH("OUTVOL R", RT5665_PWR_VOL, RT5665_PWR_OV_R_BIT, 0,
3096 &outvol_r_switch),
3097
3098 /* MONO/HPO/LOUT */
3099 SND_SOC_DAPM_MIXER("Mono MIX", SND_SOC_NOPM, 0, 0, rt5665_mono_mix,
3100 ARRAY_SIZE(rt5665_mono_mix)),
3101 SND_SOC_DAPM_MIXER("LOUT L MIX", SND_SOC_NOPM, 0, 0, rt5665_lout_l_mix,
3102 ARRAY_SIZE(rt5665_lout_l_mix)),
3103 SND_SOC_DAPM_MIXER("LOUT R MIX", SND_SOC_NOPM, 0, 0, rt5665_lout_r_mix,
3104 ARRAY_SIZE(rt5665_lout_r_mix)),
3105 SND_SOC_DAPM_PGA_S("Mono Amp", 1, RT5665_PWR_ANLG_1, RT5665_PWR_MA_BIT,
3106 0, rt5665_mono_event, SND_SOC_DAPM_POST_PMD |
3107 SND_SOC_DAPM_PRE_PMU),
3108 SND_SOC_DAPM_PGA_S("HP Amp", 1, SND_SOC_NOPM, 0, 0, rt5665_hp_event,
3109 SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
3110 SND_SOC_DAPM_PGA_S("LOUT Amp", 1, RT5665_PWR_ANLG_1,
3111 RT5665_PWR_LM_BIT, 0, rt5665_lout_event,
3112 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
3113 SND_SOC_DAPM_POST_PMD | SND_SOC_DAPM_PRE_PMU),
3114
3115 SND_SOC_DAPM_SUPPLY("Charge Pump", SND_SOC_NOPM, 0, 0,
3116 rt5665_charge_pump_event, SND_SOC_DAPM_PRE_PMU |
3117 SND_SOC_DAPM_POST_PMD),
3118
3119 SND_SOC_DAPM_SWITCH("Mono Playback", SND_SOC_NOPM, 0, 0,
3120 &mono_switch),
3121 SND_SOC_DAPM_SWITCH("HPO Playback", SND_SOC_NOPM, 0, 0,
3122 &hpo_switch),
3123 SND_SOC_DAPM_SWITCH("LOUT L Playback", SND_SOC_NOPM, 0, 0,
3124 &lout_l_switch),
3125 SND_SOC_DAPM_SWITCH("LOUT R Playback", SND_SOC_NOPM, 0, 0,
3126 &lout_r_switch),
3127 SND_SOC_DAPM_SWITCH("PDM L Playback", SND_SOC_NOPM, 0, 0,
3128 &pdm_l_switch),
3129 SND_SOC_DAPM_SWITCH("PDM R Playback", SND_SOC_NOPM, 0, 0,
3130 &pdm_r_switch),
3131
3132 /* PDM */
3133 SND_SOC_DAPM_SUPPLY("PDM Power", RT5665_PWR_DIG_2,
3134 RT5665_PWR_PDM1_BIT, 0, NULL, 0),
3135 SND_SOC_DAPM_MUX("PDM L Mux", SND_SOC_NOPM,
3136 0, 1, &rt5665_pdm_l_mux),
3137 SND_SOC_DAPM_MUX("PDM R Mux", SND_SOC_NOPM,
3138 0, 1, &rt5665_pdm_r_mux),
3139
3140 /* CLK DET */
3141 SND_SOC_DAPM_SUPPLY("CLKDET SYS", RT5665_CLK_DET, RT5665_SYS_CLK_DET,
3142 0, NULL, 0),
3143 SND_SOC_DAPM_SUPPLY("CLKDET HP", RT5665_CLK_DET, RT5665_HP_CLK_DET,
3144 0, NULL, 0),
3145 SND_SOC_DAPM_SUPPLY("CLKDET MONO", RT5665_CLK_DET, RT5665_MONO_CLK_DET,
3146 0, NULL, 0),
3147 SND_SOC_DAPM_SUPPLY("CLKDET LOUT", RT5665_CLK_DET, RT5665_LOUT_CLK_DET,
3148 0, NULL, 0),
3149 SND_SOC_DAPM_SUPPLY("CLKDET", RT5665_CLK_DET, RT5665_POW_CLK_DET,
3150 0, NULL, 0),
3151
3152 /* Output Lines */
3153 SND_SOC_DAPM_OUTPUT("HPOL"),
3154 SND_SOC_DAPM_OUTPUT("HPOR"),
3155 SND_SOC_DAPM_OUTPUT("LOUTL"),
3156 SND_SOC_DAPM_OUTPUT("LOUTR"),
3157 SND_SOC_DAPM_OUTPUT("MONOOUT"),
3158 SND_SOC_DAPM_OUTPUT("PDML"),
3159 SND_SOC_DAPM_OUTPUT("PDMR"),
3160};
3161
3162static const struct snd_soc_dapm_route rt5665_dapm_routes[] = {
3163 /*PLL*/
3164 {"ADC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll},
3165 {"ADC Stereo2 Filter", NULL, "PLL", is_sys_clk_from_pll},
3166 {"ADC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll},
3167 {"ADC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll},
3168 {"DAC Stereo1 Filter", NULL, "PLL", is_sys_clk_from_pll},
3169 {"DAC Stereo2 Filter", NULL, "PLL", is_sys_clk_from_pll},
3170 {"DAC Mono Left Filter", NULL, "PLL", is_sys_clk_from_pll},
3171 {"DAC Mono Right Filter", NULL, "PLL", is_sys_clk_from_pll},
3172
3173 /*ASRC*/
3174 {"ADC Stereo1 Filter", NULL, "ADC STO1 ASRC", is_using_asrc},
3175 {"ADC Mono Left Filter", NULL, "ADC Mono L ASRC", is_using_asrc},
3176 {"ADC Mono Right Filter", NULL, "ADC Mono R ASRC", is_using_asrc},
3177 {"DAC Mono Left Filter", NULL, "DAC Mono L ASRC", is_using_asrc},
3178 {"DAC Mono Right Filter", NULL, "DAC Mono R ASRC", is_using_asrc},
3179 {"DAC Stereo1 Filter", NULL, "DAC STO1 ASRC", is_using_asrc},
3180 {"DAC Stereo2 Filter", NULL, "DAC STO2 ASRC", is_using_asrc},
3181
3182 /*Vref*/
3183 {"Mic Det Power", NULL, "Vref2"},
3184 {"MICBIAS1", NULL, "Vref1"},
3185 {"MICBIAS1", NULL, "Vref2"},
3186 {"MICBIAS2", NULL, "Vref1"},
3187 {"MICBIAS2", NULL, "Vref2"},
3188 {"MICBIAS3", NULL, "Vref1"},
3189 {"MICBIAS3", NULL, "Vref2"},
3190
3191 {"Stereo1 DMIC L Mux", NULL, "DMIC STO1 ASRC"},
3192 {"Stereo1 DMIC R Mux", NULL, "DMIC STO1 ASRC"},
3193 {"Stereo2 DMIC L Mux", NULL, "DMIC STO2 ASRC"},
3194 {"Stereo2 DMIC R Mux", NULL, "DMIC STO2 ASRC"},
3195 {"Mono DMIC L Mux", NULL, "DMIC MONO L ASRC"},
3196 {"Mono DMIC R Mux", NULL, "DMIC MONO R ASRC"},
3197
3198 {"I2S1_1", NULL, "I2S1 ASRC"},
3199 {"I2S1_2", NULL, "I2S1 ASRC"},
3200 {"I2S2_1", NULL, "I2S2 ASRC"},
3201 {"I2S2_2", NULL, "I2S2 ASRC"},
3202 {"I2S3", NULL, "I2S3 ASRC"},
3203
3204 {"CLKDET SYS", NULL, "CLKDET"},
3205 {"CLKDET HP", NULL, "CLKDET"},
3206 {"CLKDET MONO", NULL, "CLKDET"},
3207 {"CLKDET LOUT", NULL, "CLKDET"},
3208
3209 {"IN1P", NULL, "LDO2"},
3210 {"IN2P", NULL, "LDO2"},
3211 {"IN3P", NULL, "LDO2"},
3212 {"IN4P", NULL, "LDO2"},
3213
3214 {"DMIC1", NULL, "DMIC L1"},
3215 {"DMIC1", NULL, "DMIC R1"},
3216 {"DMIC2", NULL, "DMIC L2"},
3217 {"DMIC2", NULL, "DMIC R2"},
3218
3219 {"BST1", NULL, "IN1P"},
3220 {"BST1", NULL, "IN1N"},
3221 {"BST1", NULL, "BST1 Power"},
3222 {"BST1", NULL, "BST1P Power"},
3223 {"BST2", NULL, "IN2P"},
3224 {"BST2", NULL, "IN2N"},
3225 {"BST2", NULL, "BST2 Power"},
3226 {"BST2", NULL, "BST2P Power"},
3227 {"BST3", NULL, "IN3P"},
3228 {"BST3", NULL, "IN3N"},
3229 {"BST3", NULL, "BST3 Power"},
3230 {"BST3", NULL, "BST3P Power"},
3231 {"BST4", NULL, "IN4P"},
3232 {"BST4", NULL, "IN4N"},
3233 {"BST4", NULL, "BST4 Power"},
3234 {"BST4", NULL, "BST4P Power"},
3235 {"BST1 CBJ", NULL, "IN1P"},
3236 {"BST1 CBJ", NULL, "IN1N"},
3237 {"BST1 CBJ", NULL, "CBJ Power"},
3238 {"CBJ Power", NULL, "Vref2"},
3239
3240 {"INL VOL", NULL, "IN3P"},
3241 {"INR VOL", NULL, "IN3N"},
3242
3243 {"RECMIX1L", "CBJ Switch", "BST1 CBJ"},
3244 {"RECMIX1L", "INL Switch", "INL VOL"},
3245 {"RECMIX1L", "INR Switch", "INR VOL"},
3246 {"RECMIX1L", "BST4 Switch", "BST4"},
3247 {"RECMIX1L", "BST3 Switch", "BST3"},
3248 {"RECMIX1L", "BST2 Switch", "BST2"},
3249 {"RECMIX1L", "BST1 Switch", "BST1"},
3250 {"RECMIX1L", NULL, "RECMIX1L Power"},
3251
3252 {"RECMIX1R", "MONOVOL Switch", "MONOVOL"},
3253 {"RECMIX1R", "INR Switch", "INR VOL"},
3254 {"RECMIX1R", "BST4 Switch", "BST4"},
3255 {"RECMIX1R", "BST3 Switch", "BST3"},
3256 {"RECMIX1R", "BST2 Switch", "BST2"},
3257 {"RECMIX1R", "BST1 Switch", "BST1"},
3258 {"RECMIX1R", NULL, "RECMIX1R Power"},
3259
3260 {"RECMIX2L", "CBJ Switch", "BST1 CBJ"},
3261 {"RECMIX2L", "INL Switch", "INL VOL"},
3262 {"RECMIX2L", "INR Switch", "INR VOL"},
3263 {"RECMIX2L", "BST4 Switch", "BST4"},
3264 {"RECMIX2L", "BST3 Switch", "BST3"},
3265 {"RECMIX2L", "BST2 Switch", "BST2"},
3266 {"RECMIX2L", "BST1 Switch", "BST1"},
3267 {"RECMIX2L", NULL, "RECMIX2L Power"},
3268
3269 {"RECMIX2R", "MONOVOL Switch", "MONOVOL"},
3270 {"RECMIX2R", "INL Switch", "INL VOL"},
3271 {"RECMIX2R", "INR Switch", "INR VOL"},
3272 {"RECMIX2R", "BST4 Switch", "BST4"},
3273 {"RECMIX2R", "BST3 Switch", "BST3"},
3274 {"RECMIX2R", "BST2 Switch", "BST2"},
3275 {"RECMIX2R", "BST1 Switch", "BST1"},
3276 {"RECMIX2R", NULL, "RECMIX2R Power"},
3277
3278 {"ADC1 L", NULL, "RECMIX1L"},
3279 {"ADC1 L", NULL, "ADC1 L Power"},
3280 {"ADC1 L", NULL, "ADC1 clock"},
3281 {"ADC1 R", NULL, "RECMIX1R"},
3282 {"ADC1 R", NULL, "ADC1 R Power"},
3283 {"ADC1 R", NULL, "ADC1 clock"},
3284
3285 {"ADC2 L", NULL, "RECMIX2L"},
3286 {"ADC2 L", NULL, "ADC2 L Power"},
3287 {"ADC2 L", NULL, "ADC2 clock"},
3288 {"ADC2 R", NULL, "RECMIX2R"},
3289 {"ADC2 R", NULL, "ADC2 R Power"},
3290 {"ADC2 R", NULL, "ADC2 clock"},
3291
3292 {"DMIC L1", NULL, "DMIC CLK"},
3293 {"DMIC L1", NULL, "DMIC1 Power"},
3294 {"DMIC R1", NULL, "DMIC CLK"},
3295 {"DMIC R1", NULL, "DMIC1 Power"},
3296 {"DMIC L2", NULL, "DMIC CLK"},
3297 {"DMIC L2", NULL, "DMIC2 Power"},
3298 {"DMIC R2", NULL, "DMIC CLK"},
3299 {"DMIC R2", NULL, "DMIC2 Power"},
3300
3301 {"Stereo1 DMIC L Mux", "DMIC1", "DMIC L1"},
3302 {"Stereo1 DMIC L Mux", "DMIC2", "DMIC L2"},
3303
3304 {"Stereo1 DMIC R Mux", "DMIC1", "DMIC R1"},
3305 {"Stereo1 DMIC R Mux", "DMIC2", "DMIC R2"},
3306
3307 {"Mono DMIC L Mux", "DMIC1 L", "DMIC L1"},
3308 {"Mono DMIC L Mux", "DMIC2 L", "DMIC L2"},
3309
3310 {"Mono DMIC R Mux", "DMIC1 R", "DMIC R1"},
3311 {"Mono DMIC R Mux", "DMIC2 R", "DMIC R2"},
3312
3313 {"Stereo2 DMIC L Mux", "DMIC1", "DMIC L1"},
3314 {"Stereo2 DMIC L Mux", "DMIC2", "DMIC L2"},
3315
3316 {"Stereo2 DMIC R Mux", "DMIC1", "DMIC R1"},
3317 {"Stereo2 DMIC R Mux", "DMIC2", "DMIC R2"},
3318
3319 {"Stereo1 ADC L Mux", "ADC1 L", "ADC1 L"},
3320 {"Stereo1 ADC L Mux", "ADC1 R", "ADC1 R"},
3321 {"Stereo1 ADC L Mux", "ADC2 L", "ADC2 L"},
3322 {"Stereo1 ADC L Mux", "ADC2 R", "ADC2 R"},
3323 {"Stereo1 ADC R Mux", "ADC1 L", "ADC1 L"},
3324 {"Stereo1 ADC R Mux", "ADC1 R", "ADC1 R"},
3325 {"Stereo1 ADC R Mux", "ADC2 L", "ADC2 L"},
3326 {"Stereo1 ADC R Mux", "ADC2 R", "ADC2 R"},
3327
3328 {"Stereo1 DD L Mux", "STO2 DAC", "Stereo2 DAC MIXL"},
3329 {"Stereo1 DD L Mux", "MONO DAC", "Mono DAC MIXL"},
3330
3331 {"Stereo1 DD R Mux", "STO2 DAC", "Stereo2 DAC MIXR"},
3332 {"Stereo1 DD R Mux", "MONO DAC", "Mono DAC MIXR"},
3333
3334 {"Stereo1 ADC L1 Mux", "ADC", "Stereo1 ADC L Mux"},
3335 {"Stereo1 ADC L1 Mux", "DD Mux", "Stereo1 DD L Mux"},
3336 {"Stereo1 ADC L2 Mux", "DMIC", "Stereo1 DMIC L Mux"},
3337 {"Stereo1 ADC L2 Mux", "DAC MIX", "DAC MIXL"},
3338
3339 {"Stereo1 ADC R1 Mux", "ADC", "Stereo1 ADC R Mux"},
3340 {"Stereo1 ADC R1 Mux", "DD Mux", "Stereo1 DD R Mux"},
3341 {"Stereo1 ADC R2 Mux", "DMIC", "Stereo1 DMIC R Mux"},
3342 {"Stereo1 ADC R2 Mux", "DAC MIX", "DAC MIXR"},
3343
3344 {"Mono ADC L Mux", "ADC1 L", "ADC1 L"},
3345 {"Mono ADC L Mux", "ADC1 R", "ADC1 R"},
3346 {"Mono ADC L Mux", "ADC2 L", "ADC2 L"},
3347 {"Mono ADC L Mux", "ADC2 R", "ADC2 R"},
3348
3349 {"Mono ADC R Mux", "ADC1 L", "ADC1 L"},
3350 {"Mono ADC R Mux", "ADC1 R", "ADC1 R"},
3351 {"Mono ADC R Mux", "ADC2 L", "ADC2 L"},
3352 {"Mono ADC R Mux", "ADC2 R", "ADC2 R"},
3353
3354 {"Mono DD L Mux", "STO2 DAC", "Stereo2 DAC MIXL"},
3355 {"Mono DD L Mux", "MONO DAC", "Mono DAC MIXL"},
3356
3357 {"Mono DD R Mux", "STO2 DAC", "Stereo2 DAC MIXR"},
3358 {"Mono DD R Mux", "MONO DAC", "Mono DAC MIXR"},
3359
3360 {"Mono ADC L2 Mux", "DMIC", "Mono DMIC L Mux"},
3361 {"Mono ADC L2 Mux", "DAC MIXL", "DAC MIXL"},
3362 {"Mono ADC L1 Mux", "DD Mux", "Mono DD L Mux"},
3363 {"Mono ADC L1 Mux", "ADC", "Mono ADC L Mux"},
3364
3365 {"Mono ADC R1 Mux", "DD Mux", "Mono DD R Mux"},
3366 {"Mono ADC R1 Mux", "ADC", "Mono ADC R Mux"},
3367 {"Mono ADC R2 Mux", "DMIC", "Mono DMIC R Mux"},
3368 {"Mono ADC R2 Mux", "DAC MIXR", "DAC MIXR"},
3369
3370 {"Stereo2 ADC L Mux", "ADC1 L", "ADC1 L"},
3371 {"Stereo2 ADC L Mux", "ADC2 L", "ADC2 L"},
3372 {"Stereo2 ADC L Mux", "ADC1 R", "ADC1 R"},
3373 {"Stereo2 ADC R Mux", "ADC1 L", "ADC1 L"},
3374 {"Stereo2 ADC R Mux", "ADC2 L", "ADC2 L"},
3375 {"Stereo2 ADC R Mux", "ADC1 R", "ADC1 R"},
3376
3377 {"Stereo2 DD L Mux", "STO2 DAC", "Stereo2 DAC MIXL"},
3378 {"Stereo2 DD L Mux", "MONO DAC", "Mono DAC MIXL"},
3379
3380 {"Stereo2 DD R Mux", "STO2 DAC", "Stereo2 DAC MIXR"},
3381 {"Stereo2 DD R Mux", "MONO DAC", "Mono DAC MIXR"},
3382
3383 {"Stereo2 ADC L1 Mux", "ADC", "Stereo2 ADC L Mux"},
3384 {"Stereo2 ADC L1 Mux", "DD Mux", "Stereo2 DD L Mux"},
3385 {"Stereo2 ADC L2 Mux", "DMIC", "Stereo2 DMIC L Mux"},
3386 {"Stereo2 ADC L2 Mux", "DAC MIX", "DAC MIXL"},
3387
3388 {"Stereo2 ADC R1 Mux", "ADC", "Stereo2 ADC R Mux"},
3389 {"Stereo2 ADC R1 Mux", "DD Mux", "Stereo2 DD R Mux"},
3390 {"Stereo2 ADC R2 Mux", "DMIC", "Stereo2 DMIC R Mux"},
3391 {"Stereo2 ADC R2 Mux", "DAC MIX", "DAC MIXR"},
3392
3393 {"Stereo1 ADC MIXL", "ADC1 Switch", "Stereo1 ADC L1 Mux"},
3394 {"Stereo1 ADC MIXL", "ADC2 Switch", "Stereo1 ADC L2 Mux"},
3395 {"Stereo1 ADC MIXL", NULL, "ADC Stereo1 Filter"},
3396
3397 {"Stereo1 ADC MIXR", "ADC1 Switch", "Stereo1 ADC R1 Mux"},
3398 {"Stereo1 ADC MIXR", "ADC2 Switch", "Stereo1 ADC R2 Mux"},
3399 {"Stereo1 ADC MIXR", NULL, "ADC Stereo1 Filter"},
3400
3401 {"Mono ADC MIXL", "ADC1 Switch", "Mono ADC L1 Mux"},
3402 {"Mono ADC MIXL", "ADC2 Switch", "Mono ADC L2 Mux"},
3403 {"Mono ADC MIXL", NULL, "ADC Mono Left Filter"},
3404
3405 {"Mono ADC MIXR", "ADC1 Switch", "Mono ADC R1 Mux"},
3406 {"Mono ADC MIXR", "ADC2 Switch", "Mono ADC R2 Mux"},
3407 {"Mono ADC MIXR", NULL, "ADC Mono Right Filter"},
3408
3409 {"Stereo2 ADC MIXL", "ADC1 Switch", "Stereo2 ADC L1 Mux"},
3410 {"Stereo2 ADC MIXL", "ADC2 Switch", "Stereo2 ADC L2 Mux"},
3411 {"Stereo2 ADC MIXL", NULL, "ADC Stereo2 Filter"},
3412
3413 {"Stereo2 ADC MIXR", "ADC1 Switch", "Stereo2 ADC R1 Mux"},
3414 {"Stereo2 ADC MIXR", "ADC2 Switch", "Stereo2 ADC R2 Mux"},
3415 {"Stereo2 ADC MIXR", NULL, "ADC Stereo2 Filter"},
3416
3417 {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXL"},
3418 {"Stereo1 ADC MIX", NULL, "Stereo1 ADC MIXR"},
3419 {"Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXL"},
3420 {"Stereo2 ADC MIX", NULL, "Stereo2 ADC MIXR"},
3421 {"Mono ADC MIX", NULL, "Mono ADC MIXL"},
3422 {"Mono ADC MIX", NULL, "Mono ADC MIXR"},
3423
3424 {"IF1_1_ADC1 Mux", "STO1 ADC", "Stereo1 ADC MIX"},
3425 {"IF1_1_ADC1 Mux", "IF2_1 DAC", "IF2_1 DAC"},
3426 {"IF1_1_ADC2 Mux", "STO2 ADC", "Stereo2 ADC MIX"},
3427 {"IF1_1_ADC2 Mux", "IF2_2 DAC", "IF2_2 DAC"},
3428 {"IF1_1_ADC3 Mux", "MONO ADC", "Mono ADC MIX"},
3429 {"IF1_1_ADC3 Mux", "IF3 DAC", "IF3 DAC"},
3430 {"IF1_1_ADC4", NULL, "DAC1 MIX"},
3431
3432 {"IF1_2_ADC1 Mux", "STO1 ADC", "Stereo1 ADC MIX"},
3433 {"IF1_2_ADC1 Mux", "IF1 DAC", "IF1 DAC1"},
3434 {"IF1_2_ADC2 Mux", "STO2 ADC", "Stereo2 ADC MIX"},
3435 {"IF1_2_ADC2 Mux", "IF2_1 DAC", "IF2_1 DAC"},
3436 {"IF1_2_ADC3 Mux", "MONO ADC", "Mono ADC MIX"},
3437 {"IF1_2_ADC3 Mux", "IF2_2 DAC", "IF2_2 DAC"},
3438 {"IF1_2_ADC4 Mux", "DAC1", "DAC1 MIX"},
3439 {"IF1_2_ADC4 Mux", "IF3 DAC", "IF3 DAC"},
3440
3441 {"TDM1 slot 01 Data Mux", "1234", "IF1_1_ADC1 Mux"},
3442 {"TDM1 slot 01 Data Mux", "1243", "IF1_1_ADC1 Mux"},
3443 {"TDM1 slot 01 Data Mux", "1324", "IF1_1_ADC1 Mux"},
3444 {"TDM1 slot 01 Data Mux", "1342", "IF1_1_ADC1 Mux"},
3445 {"TDM1 slot 01 Data Mux", "1432", "IF1_1_ADC1 Mux"},
3446 {"TDM1 slot 01 Data Mux", "1423", "IF1_1_ADC1 Mux"},
3447 {"TDM1 slot 01 Data Mux", "2134", "IF1_1_ADC2 Mux"},
3448 {"TDM1 slot 01 Data Mux", "2143", "IF1_1_ADC2 Mux"},
3449 {"TDM1 slot 01 Data Mux", "2314", "IF1_1_ADC2 Mux"},
3450 {"TDM1 slot 01 Data Mux", "2341", "IF1_1_ADC2 Mux"},
3451 {"TDM1 slot 01 Data Mux", "2431", "IF1_1_ADC2 Mux"},
3452 {"TDM1 slot 01 Data Mux", "2413", "IF1_1_ADC2 Mux"},
3453 {"TDM1 slot 01 Data Mux", "3124", "IF1_1_ADC3 Mux"},
3454 {"TDM1 slot 01 Data Mux", "3142", "IF1_1_ADC3 Mux"},
3455 {"TDM1 slot 01 Data Mux", "3214", "IF1_1_ADC3 Mux"},
3456 {"TDM1 slot 01 Data Mux", "3241", "IF1_1_ADC3 Mux"},
3457 {"TDM1 slot 01 Data Mux", "3412", "IF1_1_ADC3 Mux"},
3458 {"TDM1 slot 01 Data Mux", "3421", "IF1_1_ADC3 Mux"},
3459 {"TDM1 slot 01 Data Mux", "4123", "IF1_1_ADC4"},
3460 {"TDM1 slot 01 Data Mux", "4132", "IF1_1_ADC4"},
3461 {"TDM1 slot 01 Data Mux", "4213", "IF1_1_ADC4"},
3462 {"TDM1 slot 01 Data Mux", "4231", "IF1_1_ADC4"},
3463 {"TDM1 slot 01 Data Mux", "4312", "IF1_1_ADC4"},
3464 {"TDM1 slot 01 Data Mux", "4321", "IF1_1_ADC4"},
3465 {"TDM1 slot 01 Data Mux", NULL, "I2S1_1"},
3466
3467 {"TDM1 slot 23 Data Mux", "1234", "IF1_1_ADC2 Mux"},
3468 {"TDM1 slot 23 Data Mux", "1243", "IF1_1_ADC2 Mux"},
3469 {"TDM1 slot 23 Data Mux", "1324", "IF1_1_ADC3 Mux"},
3470 {"TDM1 slot 23 Data Mux", "1342", "IF1_1_ADC3 Mux"},
3471 {"TDM1 slot 23 Data Mux", "1432", "IF1_1_ADC4"},
3472 {"TDM1 slot 23 Data Mux", "1423", "IF1_1_ADC4"},
3473 {"TDM1 slot 23 Data Mux", "2134", "IF1_1_ADC1 Mux"},
3474 {"TDM1 slot 23 Data Mux", "2143", "IF1_1_ADC1 Mux"},
3475 {"TDM1 slot 23 Data Mux", "2314", "IF1_1_ADC3 Mux"},
3476 {"TDM1 slot 23 Data Mux", "2341", "IF1_1_ADC3 Mux"},
3477 {"TDM1 slot 23 Data Mux", "2431", "IF1_1_ADC4"},
3478 {"TDM1 slot 23 Data Mux", "2413", "IF1_1_ADC4"},
3479 {"TDM1 slot 23 Data Mux", "3124", "IF1_1_ADC1 Mux"},
3480 {"TDM1 slot 23 Data Mux", "3142", "IF1_1_ADC1 Mux"},
3481 {"TDM1 slot 23 Data Mux", "3214", "IF1_1_ADC2 Mux"},
3482 {"TDM1 slot 23 Data Mux", "3241", "IF1_1_ADC2 Mux"},
3483 {"TDM1 slot 23 Data Mux", "3412", "IF1_1_ADC4"},
3484 {"TDM1 slot 23 Data Mux", "3421", "IF1_1_ADC4"},
3485 {"TDM1 slot 23 Data Mux", "4123", "IF1_1_ADC1 Mux"},
3486 {"TDM1 slot 23 Data Mux", "4132", "IF1_1_ADC1 Mux"},
3487 {"TDM1 slot 23 Data Mux", "4213", "IF1_1_ADC2 Mux"},
3488 {"TDM1 slot 23 Data Mux", "4231", "IF1_1_ADC2 Mux"},
3489 {"TDM1 slot 23 Data Mux", "4312", "IF1_1_ADC3 Mux"},
3490 {"TDM1 slot 23 Data Mux", "4321", "IF1_1_ADC3 Mux"},
3491 {"TDM1 slot 23 Data Mux", NULL, "I2S1_1"},
3492
3493 {"TDM1 slot 45 Data Mux", "1234", "IF1_1_ADC3 Mux"},
3494 {"TDM1 slot 45 Data Mux", "1243", "IF1_1_ADC4"},
3495 {"TDM1 slot 45 Data Mux", "1324", "IF1_1_ADC2 Mux"},
3496 {"TDM1 slot 45 Data Mux", "1342", "IF1_1_ADC4"},
3497 {"TDM1 slot 45 Data Mux", "1432", "IF1_1_ADC3 Mux"},
3498 {"TDM1 slot 45 Data Mux", "1423", "IF1_1_ADC2 Mux"},
3499 {"TDM1 slot 45 Data Mux", "2134", "IF1_1_ADC3 Mux"},
3500 {"TDM1 slot 45 Data Mux", "2143", "IF1_1_ADC4"},
3501 {"TDM1 slot 45 Data Mux", "2314", "IF1_1_ADC1 Mux"},
3502 {"TDM1 slot 45 Data Mux", "2341", "IF1_1_ADC4"},
3503 {"TDM1 slot 45 Data Mux", "2431", "IF1_1_ADC3 Mux"},
3504 {"TDM1 slot 45 Data Mux", "2413", "IF1_1_ADC1 Mux"},
3505 {"TDM1 slot 45 Data Mux", "3124", "IF1_1_ADC2 Mux"},
3506 {"TDM1 slot 45 Data Mux", "3142", "IF1_1_ADC4"},
3507 {"TDM1 slot 45 Data Mux", "3214", "IF1_1_ADC1 Mux"},
3508 {"TDM1 slot 45 Data Mux", "3241", "IF1_1_ADC4"},
3509 {"TDM1 slot 45 Data Mux", "3412", "IF1_1_ADC1 Mux"},
3510 {"TDM1 slot 45 Data Mux", "3421", "IF1_1_ADC2 Mux"},
3511 {"TDM1 slot 45 Data Mux", "4123", "IF1_1_ADC2 Mux"},
3512 {"TDM1 slot 45 Data Mux", "4132", "IF1_1_ADC3 Mux"},
3513 {"TDM1 slot 45 Data Mux", "4213", "IF1_1_ADC1 Mux"},
3514 {"TDM1 slot 45 Data Mux", "4231", "IF1_1_ADC3 Mux"},
3515 {"TDM1 slot 45 Data Mux", "4312", "IF1_1_ADC1 Mux"},
3516 {"TDM1 slot 45 Data Mux", "4321", "IF1_1_ADC2 Mux"},
3517 {"TDM1 slot 45 Data Mux", NULL, "I2S1_1"},
3518
3519 {"TDM1 slot 67 Data Mux", "1234", "IF1_1_ADC4"},
3520 {"TDM1 slot 67 Data Mux", "1243", "IF1_1_ADC3 Mux"},
3521 {"TDM1 slot 67 Data Mux", "1324", "IF1_1_ADC4"},
3522 {"TDM1 slot 67 Data Mux", "1342", "IF1_1_ADC2 Mux"},
3523 {"TDM1 slot 67 Data Mux", "1432", "IF1_1_ADC2 Mux"},
3524 {"TDM1 slot 67 Data Mux", "1423", "IF1_1_ADC3 Mux"},
3525 {"TDM1 slot 67 Data Mux", "2134", "IF1_1_ADC4"},
3526 {"TDM1 slot 67 Data Mux", "2143", "IF1_1_ADC3 Mux"},
3527 {"TDM1 slot 67 Data Mux", "2314", "IF1_1_ADC4"},
3528 {"TDM1 slot 67 Data Mux", "2341", "IF1_1_ADC1 Mux"},
3529 {"TDM1 slot 67 Data Mux", "2431", "IF1_1_ADC1 Mux"},
3530 {"TDM1 slot 67 Data Mux", "2413", "IF1_1_ADC3 Mux"},
3531 {"TDM1 slot 67 Data Mux", "3124", "IF1_1_ADC4"},
3532 {"TDM1 slot 67 Data Mux", "3142", "IF1_1_ADC2 Mux"},
3533 {"TDM1 slot 67 Data Mux", "3214", "IF1_1_ADC4"},
3534 {"TDM1 slot 67 Data Mux", "3241", "IF1_1_ADC1 Mux"},
3535 {"TDM1 slot 67 Data Mux", "3412", "IF1_1_ADC2 Mux"},
3536 {"TDM1 slot 67 Data Mux", "3421", "IF1_1_ADC1 Mux"},
3537 {"TDM1 slot 67 Data Mux", "4123", "IF1_1_ADC3 Mux"},
3538 {"TDM1 slot 67 Data Mux", "4132", "IF1_1_ADC2 Mux"},
3539 {"TDM1 slot 67 Data Mux", "4213", "IF1_1_ADC3 Mux"},
3540 {"TDM1 slot 67 Data Mux", "4231", "IF1_1_ADC1 Mux"},
3541 {"TDM1 slot 67 Data Mux", "4312", "IF1_1_ADC2 Mux"},
3542 {"TDM1 slot 67 Data Mux", "4321", "IF1_1_ADC1 Mux"},
3543 {"TDM1 slot 67 Data Mux", NULL, "I2S1_1"},
3544
3545
3546 {"TDM2 slot 01 Data Mux", "1234", "IF1_2_ADC1 Mux"},
3547 {"TDM2 slot 01 Data Mux", "1243", "IF1_2_ADC1 Mux"},
3548 {"TDM2 slot 01 Data Mux", "1324", "IF1_2_ADC1 Mux"},
3549 {"TDM2 slot 01 Data Mux", "1342", "IF1_2_ADC1 Mux"},
3550 {"TDM2 slot 01 Data Mux", "1432", "IF1_2_ADC1 Mux"},
3551 {"TDM2 slot 01 Data Mux", "1423", "IF1_2_ADC1 Mux"},
3552 {"TDM2 slot 01 Data Mux", "2134", "IF1_2_ADC2 Mux"},
3553 {"TDM2 slot 01 Data Mux", "2143", "IF1_2_ADC2 Mux"},
3554 {"TDM2 slot 01 Data Mux", "2314", "IF1_2_ADC2 Mux"},
3555 {"TDM2 slot 01 Data Mux", "2341", "IF1_2_ADC2 Mux"},
3556 {"TDM2 slot 01 Data Mux", "2431", "IF1_2_ADC2 Mux"},
3557 {"TDM2 slot 01 Data Mux", "2413", "IF1_2_ADC2 Mux"},
3558 {"TDM2 slot 01 Data Mux", "3124", "IF1_2_ADC3 Mux"},
3559 {"TDM2 slot 01 Data Mux", "3142", "IF1_2_ADC3 Mux"},
3560 {"TDM2 slot 01 Data Mux", "3214", "IF1_2_ADC3 Mux"},
3561 {"TDM2 slot 01 Data Mux", "3241", "IF1_2_ADC3 Mux"},
3562 {"TDM2 slot 01 Data Mux", "3412", "IF1_2_ADC3 Mux"},
3563 {"TDM2 slot 01 Data Mux", "3421", "IF1_2_ADC3 Mux"},
3564 {"TDM2 slot 01 Data Mux", "4123", "IF1_2_ADC4 Mux"},
3565 {"TDM2 slot 01 Data Mux", "4132", "IF1_2_ADC4 Mux"},
3566 {"TDM2 slot 01 Data Mux", "4213", "IF1_2_ADC4 Mux"},
3567 {"TDM2 slot 01 Data Mux", "4231", "IF1_2_ADC4 Mux"},
3568 {"TDM2 slot 01 Data Mux", "4312", "IF1_2_ADC4 Mux"},
3569 {"TDM2 slot 01 Data Mux", "4321", "IF1_2_ADC4 Mux"},
3570 {"TDM2 slot 01 Data Mux", NULL, "I2S1_2"},
3571
3572 {"TDM2 slot 23 Data Mux", "1234", "IF1_2_ADC2 Mux"},
3573 {"TDM2 slot 23 Data Mux", "1243", "IF1_2_ADC2 Mux"},
3574 {"TDM2 slot 23 Data Mux", "1324", "IF1_2_ADC3 Mux"},
3575 {"TDM2 slot 23 Data Mux", "1342", "IF1_2_ADC3 Mux"},
3576 {"TDM2 slot 23 Data Mux", "1432", "IF1_2_ADC4 Mux"},
3577 {"TDM2 slot 23 Data Mux", "1423", "IF1_2_ADC4 Mux"},
3578 {"TDM2 slot 23 Data Mux", "2134", "IF1_2_ADC1 Mux"},
3579 {"TDM2 slot 23 Data Mux", "2143", "IF1_2_ADC1 Mux"},
3580 {"TDM2 slot 23 Data Mux", "2314", "IF1_2_ADC3 Mux"},
3581 {"TDM2 slot 23 Data Mux", "2341", "IF1_2_ADC3 Mux"},
3582 {"TDM2 slot 23 Data Mux", "2431", "IF1_2_ADC4 Mux"},
3583 {"TDM2 slot 23 Data Mux", "2413", "IF1_2_ADC4 Mux"},
3584 {"TDM2 slot 23 Data Mux", "3124", "IF1_2_ADC1 Mux"},
3585 {"TDM2 slot 23 Data Mux", "3142", "IF1_2_ADC1 Mux"},
3586 {"TDM2 slot 23 Data Mux", "3214", "IF1_2_ADC2 Mux"},
3587 {"TDM2 slot 23 Data Mux", "3241", "IF1_2_ADC2 Mux"},
3588 {"TDM2 slot 23 Data Mux", "3412", "IF1_2_ADC4 Mux"},
3589 {"TDM2 slot 23 Data Mux", "3421", "IF1_2_ADC4 Mux"},
3590 {"TDM2 slot 23 Data Mux", "4123", "IF1_2_ADC1 Mux"},
3591 {"TDM2 slot 23 Data Mux", "4132", "IF1_2_ADC1 Mux"},
3592 {"TDM2 slot 23 Data Mux", "4213", "IF1_2_ADC2 Mux"},
3593 {"TDM2 slot 23 Data Mux", "4231", "IF1_2_ADC2 Mux"},
3594 {"TDM2 slot 23 Data Mux", "4312", "IF1_2_ADC3 Mux"},
3595 {"TDM2 slot 23 Data Mux", "4321", "IF1_2_ADC3 Mux"},
3596 {"TDM2 slot 23 Data Mux", NULL, "I2S1_2"},
3597
3598 {"TDM2 slot 45 Data Mux", "1234", "IF1_2_ADC3 Mux"},
3599 {"TDM2 slot 45 Data Mux", "1243", "IF1_2_ADC4 Mux"},
3600 {"TDM2 slot 45 Data Mux", "1324", "IF1_2_ADC2 Mux"},
3601 {"TDM2 slot 45 Data Mux", "1342", "IF1_2_ADC4 Mux"},
3602 {"TDM2 slot 45 Data Mux", "1432", "IF1_2_ADC3 Mux"},
3603 {"TDM2 slot 45 Data Mux", "1423", "IF1_2_ADC2 Mux"},
3604 {"TDM2 slot 45 Data Mux", "2134", "IF1_2_ADC3 Mux"},
3605 {"TDM2 slot 45 Data Mux", "2143", "IF1_2_ADC4 Mux"},
3606 {"TDM2 slot 45 Data Mux", "2314", "IF1_2_ADC1 Mux"},
3607 {"TDM2 slot 45 Data Mux", "2341", "IF1_2_ADC4 Mux"},
3608 {"TDM2 slot 45 Data Mux", "2431", "IF1_2_ADC3 Mux"},
3609 {"TDM2 slot 45 Data Mux", "2413", "IF1_2_ADC1 Mux"},
3610 {"TDM2 slot 45 Data Mux", "3124", "IF1_2_ADC2 Mux"},
3611 {"TDM2 slot 45 Data Mux", "3142", "IF1_2_ADC4 Mux"},
3612 {"TDM2 slot 45 Data Mux", "3214", "IF1_2_ADC1 Mux"},
3613 {"TDM2 slot 45 Data Mux", "3241", "IF1_2_ADC4 Mux"},
3614 {"TDM2 slot 45 Data Mux", "3412", "IF1_2_ADC1 Mux"},
3615 {"TDM2 slot 45 Data Mux", "3421", "IF1_2_ADC2 Mux"},
3616 {"TDM2 slot 45 Data Mux", "4123", "IF1_2_ADC2 Mux"},
3617 {"TDM2 slot 45 Data Mux", "4132", "IF1_2_ADC3 Mux"},
3618 {"TDM2 slot 45 Data Mux", "4213", "IF1_2_ADC1 Mux"},
3619 {"TDM2 slot 45 Data Mux", "4231", "IF1_2_ADC3 Mux"},
3620 {"TDM2 slot 45 Data Mux", "4312", "IF1_2_ADC1 Mux"},
3621 {"TDM2 slot 45 Data Mux", "4321", "IF1_2_ADC2 Mux"},
3622 {"TDM2 slot 45 Data Mux", NULL, "I2S1_2"},
3623
3624 {"TDM2 slot 67 Data Mux", "1234", "IF1_2_ADC4 Mux"},
3625 {"TDM2 slot 67 Data Mux", "1243", "IF1_2_ADC3 Mux"},
3626 {"TDM2 slot 67 Data Mux", "1324", "IF1_2_ADC4 Mux"},
3627 {"TDM2 slot 67 Data Mux", "1342", "IF1_2_ADC2 Mux"},
3628 {"TDM2 slot 67 Data Mux", "1432", "IF1_2_ADC2 Mux"},
3629 {"TDM2 slot 67 Data Mux", "1423", "IF1_2_ADC3 Mux"},
3630 {"TDM2 slot 67 Data Mux", "2134", "IF1_2_ADC4 Mux"},
3631 {"TDM2 slot 67 Data Mux", "2143", "IF1_2_ADC3 Mux"},
3632 {"TDM2 slot 67 Data Mux", "2314", "IF1_2_ADC4 Mux"},
3633 {"TDM2 slot 67 Data Mux", "2341", "IF1_2_ADC1 Mux"},
3634 {"TDM2 slot 67 Data Mux", "2431", "IF1_2_ADC1 Mux"},
3635 {"TDM2 slot 67 Data Mux", "2413", "IF1_2_ADC3 Mux"},
3636 {"TDM2 slot 67 Data Mux", "3124", "IF1_2_ADC4 Mux"},
3637 {"TDM2 slot 67 Data Mux", "3142", "IF1_2_ADC2 Mux"},
3638 {"TDM2 slot 67 Data Mux", "3214", "IF1_2_ADC4 Mux"},
3639 {"TDM2 slot 67 Data Mux", "3241", "IF1_2_ADC1 Mux"},
3640 {"TDM2 slot 67 Data Mux", "3412", "IF1_2_ADC2 Mux"},
3641 {"TDM2 slot 67 Data Mux", "3421", "IF1_2_ADC1 Mux"},
3642 {"TDM2 slot 67 Data Mux", "4123", "IF1_2_ADC3 Mux"},
3643 {"TDM2 slot 67 Data Mux", "4132", "IF1_2_ADC2 Mux"},
3644 {"TDM2 slot 67 Data Mux", "4213", "IF1_2_ADC3 Mux"},
3645 {"TDM2 slot 67 Data Mux", "4231", "IF1_2_ADC1 Mux"},
3646 {"TDM2 slot 67 Data Mux", "4312", "IF1_2_ADC2 Mux"},
3647 {"TDM2 slot 67 Data Mux", "4321", "IF1_2_ADC1 Mux"},
3648 {"TDM2 slot 67 Data Mux", NULL, "I2S1_2"},
3649
3650 {"IF1_1 0 ADC Swap Mux", "L/R", "TDM1 slot 01 Data Mux"},
3651 {"IF1_1 0 ADC Swap Mux", "L/L", "TDM1 slot 01 Data Mux"},
3652 {"IF1_1 1 ADC Swap Mux", "R/L", "TDM1 slot 01 Data Mux"},
3653 {"IF1_1 1 ADC Swap Mux", "R/R", "TDM1 slot 01 Data Mux"},
3654 {"IF1_1 2 ADC Swap Mux", "L/R", "TDM1 slot 23 Data Mux"},
3655 {"IF1_1 2 ADC Swap Mux", "R/L", "TDM1 slot 23 Data Mux"},
3656 {"IF1_1 3 ADC Swap Mux", "L/L", "TDM1 slot 23 Data Mux"},
3657 {"IF1_1 3 ADC Swap Mux", "R/R", "TDM1 slot 23 Data Mux"},
3658 {"IF1_1 4 ADC Swap Mux", "L/R", "TDM1 slot 45 Data Mux"},
3659 {"IF1_1 4 ADC Swap Mux", "R/L", "TDM1 slot 45 Data Mux"},
3660 {"IF1_1 5 ADC Swap Mux", "L/L", "TDM1 slot 45 Data Mux"},
3661 {"IF1_1 5 ADC Swap Mux", "R/R", "TDM1 slot 45 Data Mux"},
3662 {"IF1_1 6 ADC Swap Mux", "L/R", "TDM1 slot 67 Data Mux"},
3663 {"IF1_1 6 ADC Swap Mux", "R/L", "TDM1 slot 67 Data Mux"},
3664 {"IF1_1 7 ADC Swap Mux", "L/L", "TDM1 slot 67 Data Mux"},
3665 {"IF1_1 7 ADC Swap Mux", "R/R", "TDM1 slot 67 Data Mux"},
3666 {"IF1_2 0 ADC Swap Mux", "L/R", "TDM2 slot 01 Data Mux"},
3667 {"IF1_2 0 ADC Swap Mux", "R/L", "TDM2 slot 01 Data Mux"},
3668 {"IF1_2 1 ADC Swap Mux", "L/L", "TDM2 slot 01 Data Mux"},
3669 {"IF1_2 1 ADC Swap Mux", "R/R", "TDM2 slot 01 Data Mux"},
3670 {"IF1_2 2 ADC Swap Mux", "L/R", "TDM2 slot 23 Data Mux"},
3671 {"IF1_2 2 ADC Swap Mux", "R/L", "TDM2 slot 23 Data Mux"},
3672 {"IF1_2 3 ADC Swap Mux", "L/L", "TDM2 slot 23 Data Mux"},
3673 {"IF1_2 3 ADC Swap Mux", "R/R", "TDM2 slot 23 Data Mux"},
3674 {"IF1_2 4 ADC Swap Mux", "L/R", "TDM2 slot 45 Data Mux"},
3675 {"IF1_2 4 ADC Swap Mux", "R/L", "TDM2 slot 45 Data Mux"},
3676 {"IF1_2 5 ADC Swap Mux", "L/L", "TDM2 slot 45 Data Mux"},
3677 {"IF1_2 5 ADC Swap Mux", "R/R", "TDM2 slot 45 Data Mux"},
3678 {"IF1_2 6 ADC Swap Mux", "L/R", "TDM2 slot 67 Data Mux"},
3679 {"IF1_2 6 ADC Swap Mux", "R/L", "TDM2 slot 67 Data Mux"},
3680 {"IF1_2 7 ADC Swap Mux", "L/L", "TDM2 slot 67 Data Mux"},
3681 {"IF1_2 7 ADC Swap Mux", "R/R", "TDM2 slot 67 Data Mux"},
3682
3683 {"IF2_1 ADC Mux", "STO1 ADC", "Stereo1 ADC MIX"},
3684 {"IF2_1 ADC Mux", "STO2 ADC", "Stereo2 ADC MIX"},
3685 {"IF2_1 ADC Mux", "MONO ADC", "Mono ADC MIX"},
3686 {"IF2_1 ADC Mux", "IF1 DAC1", "IF1 DAC1"},
3687 {"IF2_1 ADC Mux", "IF1 DAC2", "IF1 DAC2"},
3688 {"IF2_1 ADC Mux", "IF2_2 DAC", "IF2_2 DAC"},
3689 {"IF2_1 ADC Mux", "IF3 DAC", "IF3 DAC"},
3690 {"IF2_1 ADC Mux", "DAC1 MIX", "DAC1 MIX"},
3691 {"IF2_1 ADC", NULL, "IF2_1 ADC Mux"},
3692 {"IF2_1 ADC", NULL, "I2S2_1"},
3693
3694 {"IF2_2 ADC Mux", "STO1 ADC", "Stereo1 ADC MIX"},
3695 {"IF2_2 ADC Mux", "STO2 ADC", "Stereo2 ADC MIX"},
3696 {"IF2_2 ADC Mux", "MONO ADC", "Mono ADC MIX"},
3697 {"IF2_2 ADC Mux", "IF1 DAC1", "IF1 DAC1"},
3698 {"IF2_2 ADC Mux", "IF1 DAC2", "IF1 DAC2"},
3699 {"IF2_2 ADC Mux", "IF2_1 DAC", "IF2_1 DAC"},
3700 {"IF2_2 ADC Mux", "IF3 DAC", "IF3 DAC"},
3701 {"IF2_2 ADC Mux", "DAC1 MIX", "DAC1 MIX"},
3702 {"IF2_2 ADC", NULL, "IF2_2 ADC Mux"},
3703 {"IF2_2 ADC", NULL, "I2S2_2"},
3704
3705 {"IF3 ADC Mux", "STO1 ADC", "Stereo1 ADC MIX"},
3706 {"IF3 ADC Mux", "STO2 ADC", "Stereo2 ADC MIX"},
3707 {"IF3 ADC Mux", "MONO ADC", "Mono ADC MIX"},
3708 {"IF3 ADC Mux", "IF1 DAC1", "IF1 DAC1"},
3709 {"IF3 ADC Mux", "IF1 DAC2", "IF1 DAC2"},
3710 {"IF3 ADC Mux", "IF2_1 DAC", "IF2_1 DAC"},
3711 {"IF3 ADC Mux", "IF2_2 DAC", "IF2_2 DAC"},
3712 {"IF3 ADC Mux", "DAC1 MIX", "DAC1 MIX"},
3713 {"IF3 ADC", NULL, "IF3 ADC Mux"},
3714 {"IF3 ADC", NULL, "I2S3"},
3715
3716 {"AIF1_1TX slot 0", NULL, "IF1_1 0 ADC Swap Mux"},
3717 {"AIF1_1TX slot 1", NULL, "IF1_1 1 ADC Swap Mux"},
3718 {"AIF1_1TX slot 2", NULL, "IF1_1 2 ADC Swap Mux"},
3719 {"AIF1_1TX slot 3", NULL, "IF1_1 3 ADC Swap Mux"},
3720 {"AIF1_1TX slot 4", NULL, "IF1_1 4 ADC Swap Mux"},
3721 {"AIF1_1TX slot 5", NULL, "IF1_1 5 ADC Swap Mux"},
3722 {"AIF1_1TX slot 6", NULL, "IF1_1 6 ADC Swap Mux"},
3723 {"AIF1_1TX slot 7", NULL, "IF1_1 7 ADC Swap Mux"},
3724 {"AIF1_2TX slot 0", NULL, "IF1_2 0 ADC Swap Mux"},
3725 {"AIF1_2TX slot 1", NULL, "IF1_2 1 ADC Swap Mux"},
3726 {"AIF1_2TX slot 2", NULL, "IF1_2 2 ADC Swap Mux"},
3727 {"AIF1_2TX slot 3", NULL, "IF1_2 3 ADC Swap Mux"},
3728 {"AIF1_2TX slot 4", NULL, "IF1_2 4 ADC Swap Mux"},
3729 {"AIF1_2TX slot 5", NULL, "IF1_2 5 ADC Swap Mux"},
3730 {"AIF1_2TX slot 6", NULL, "IF1_2 6 ADC Swap Mux"},
3731 {"AIF1_2TX slot 7", NULL, "IF1_2 7 ADC Swap Mux"},
3732 {"IF2_1 ADC Swap Mux", "L/R", "IF2_1 ADC"},
3733 {"IF2_1 ADC Swap Mux", "R/L", "IF2_1 ADC"},
3734 {"IF2_1 ADC Swap Mux", "L/L", "IF2_1 ADC"},
3735 {"IF2_1 ADC Swap Mux", "R/R", "IF2_1 ADC"},
3736 {"AIF2_1TX", NULL, "IF2_1 ADC Swap Mux"},
3737 {"IF2_2 ADC Swap Mux", "L/R", "IF2_2 ADC"},
3738 {"IF2_2 ADC Swap Mux", "R/L", "IF2_2 ADC"},
3739 {"IF2_2 ADC Swap Mux", "L/L", "IF2_2 ADC"},
3740 {"IF2_2 ADC Swap Mux", "R/R", "IF2_2 ADC"},
3741 {"AIF2_2TX", NULL, "IF2_2 ADC Swap Mux"},
3742 {"IF3 ADC Swap Mux", "L/R", "IF3 ADC"},
3743 {"IF3 ADC Swap Mux", "R/L", "IF3 ADC"},
3744 {"IF3 ADC Swap Mux", "L/L", "IF3 ADC"},
3745 {"IF3 ADC Swap Mux", "R/R", "IF3 ADC"},
3746 {"AIF3TX", NULL, "IF3 ADC Swap Mux"},
3747
3748 {"IF1 DAC1", NULL, "AIF1RX"},
3749 {"IF1 DAC2", NULL, "AIF1RX"},
3750 {"IF1 DAC3", NULL, "AIF1RX"},
3751 {"IF2_1 DAC Swap Mux", "L/R", "AIF2_1RX"},
3752 {"IF2_1 DAC Swap Mux", "R/L", "AIF2_1RX"},
3753 {"IF2_1 DAC Swap Mux", "L/L", "AIF2_1RX"},
3754 {"IF2_1 DAC Swap Mux", "R/R", "AIF2_1RX"},
3755 {"IF2_2 DAC Swap Mux", "L/R", "AIF2_2RX"},
3756 {"IF2_2 DAC Swap Mux", "R/L", "AIF2_2RX"},
3757 {"IF2_2 DAC Swap Mux", "L/L", "AIF2_2RX"},
3758 {"IF2_2 DAC Swap Mux", "R/R", "AIF2_2RX"},
3759 {"IF2_1 DAC", NULL, "IF2_1 DAC Swap Mux"},
3760 {"IF2_2 DAC", NULL, "IF2_2 DAC Swap Mux"},
3761 {"IF3 DAC Swap Mux", "L/R", "AIF3RX"},
3762 {"IF3 DAC Swap Mux", "R/L", "AIF3RX"},
3763 {"IF3 DAC Swap Mux", "L/L", "AIF3RX"},
3764 {"IF3 DAC Swap Mux", "R/R", "AIF3RX"},
3765 {"IF3 DAC", NULL, "IF3 DAC Swap Mux"},
3766
3767 {"IF1 DAC1", NULL, "I2S1_1"},
3768 {"IF1 DAC2", NULL, "I2S1_1"},
3769 {"IF1 DAC3", NULL, "I2S1_1"},
3770 {"IF2_1 DAC", NULL, "I2S2_1"},
3771 {"IF2_2 DAC", NULL, "I2S2_2"},
3772 {"IF3 DAC", NULL, "I2S3"},
3773
3774 {"IF1 DAC1 L", NULL, "IF1 DAC1"},
3775 {"IF1 DAC1 R", NULL, "IF1 DAC1"},
3776 {"IF1 DAC2 L", NULL, "IF1 DAC2"},
3777 {"IF1 DAC2 R", NULL, "IF1 DAC2"},
3778 {"IF1 DAC3 L", NULL, "IF1 DAC3"},
3779 {"IF1 DAC3 R", NULL, "IF1 DAC3"},
3780 {"IF2_1 DAC L", NULL, "IF2_1 DAC"},
3781 {"IF2_1 DAC R", NULL, "IF2_1 DAC"},
3782 {"IF2_2 DAC L", NULL, "IF2_2 DAC"},
3783 {"IF2_2 DAC R", NULL, "IF2_2 DAC"},
3784 {"IF3 DAC L", NULL, "IF3 DAC"},
3785 {"IF3 DAC R", NULL, "IF3 DAC"},
3786
3787 {"DAC L1 Mux", "IF1 DAC1", "IF1 DAC1 L"},
3788 {"DAC L1 Mux", "IF2_1 DAC", "IF2_1 DAC L"},
3789 {"DAC L1 Mux", "IF2_2 DAC", "IF2_2 DAC L"},
3790 {"DAC L1 Mux", "IF3 DAC", "IF3 DAC L"},
3791 {"DAC L1 Mux", NULL, "DAC Stereo1 Filter"},
3792
3793 {"DAC R1 Mux", "IF1 DAC1", "IF1 DAC1 R"},
3794 {"DAC R1 Mux", "IF2_1 DAC", "IF2_1 DAC R"},
3795 {"DAC R1 Mux", "IF2_2 DAC", "IF2_2 DAC R"},
3796 {"DAC R1 Mux", "IF3 DAC", "IF3 DAC R"},
3797 {"DAC R1 Mux", NULL, "DAC Stereo1 Filter"},
3798
3799 {"DAC1 MIXL", "Stereo ADC Switch", "Stereo1 ADC MIXL"},
3800 {"DAC1 MIXL", "DAC1 Switch", "DAC L1 Mux"},
3801 {"DAC1 MIXR", "Stereo ADC Switch", "Stereo1 ADC MIXR"},
3802 {"DAC1 MIXR", "DAC1 Switch", "DAC R1 Mux"},
3803
3804 {"DAC1 MIX", NULL, "DAC1 MIXL"},
3805 {"DAC1 MIX", NULL, "DAC1 MIXR"},
3806
3807 {"DAC L2 Mux", "IF1 DAC2", "IF1 DAC2 L"},
3808 {"DAC L2 Mux", "IF2_1 DAC", "IF2_1 DAC L"},
3809 {"DAC L2 Mux", "IF2_2 DAC", "IF2_2 DAC L"},
3810 {"DAC L2 Mux", "IF3 DAC", "IF3 DAC L"},
3811 {"DAC L2 Mux", "Mono ADC MIX", "Mono ADC MIXL"},
3812 {"DAC L2 Mux", NULL, "DAC Mono Left Filter"},
3813
3814 {"DAC R2 Mux", "IF1 DAC2", "IF1 DAC2 R"},
3815 {"DAC R2 Mux", "IF2_1 DAC", "IF2_1 DAC R"},
3816 {"DAC R2 Mux", "IF2_2 DAC", "IF2_2 DAC R"},
3817 {"DAC R2 Mux", "IF3 DAC", "IF3 DAC R"},
3818 {"DAC R2 Mux", "Mono ADC MIX", "Mono ADC MIXR"},
3819 {"DAC R2 Mux", NULL, "DAC Mono Right Filter"},
3820
3821 {"DAC L3 Mux", "IF1 DAC2", "IF1 DAC2 L"},
3822 {"DAC L3 Mux", "IF2_1 DAC", "IF2_1 DAC L"},
3823 {"DAC L3 Mux", "IF2_2 DAC", "IF2_2 DAC L"},
3824 {"DAC L3 Mux", "IF3 DAC", "IF3 DAC L"},
3825 {"DAC L3 Mux", "STO2 ADC MIX", "Stereo2 ADC MIXL"},
3826 {"DAC L3 Mux", NULL, "DAC Stereo2 Filter"},
3827
3828 {"DAC R3 Mux", "IF1 DAC2", "IF1 DAC2 R"},
3829 {"DAC R3 Mux", "IF2_1 DAC", "IF2_1 DAC R"},
3830 {"DAC R3 Mux", "IF2_2 DAC", "IF2_2 DAC R"},
3831 {"DAC R3 Mux", "IF3 DAC", "IF3 DAC R"},
3832 {"DAC R3 Mux", "STO2 ADC MIX", "Stereo2 ADC MIXR"},
3833 {"DAC R3 Mux", NULL, "DAC Stereo2 Filter"},
3834
3835 {"Stereo1 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
3836 {"Stereo1 DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
3837 {"Stereo1 DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
3838 {"Stereo1 DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
3839
3840 {"Stereo1 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
3841 {"Stereo1 DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
3842 {"Stereo1 DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
3843 {"Stereo1 DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
3844
3845 {"Stereo2 DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
3846 {"Stereo2 DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
3847 {"Stereo2 DAC MIXL", "DAC L3 Switch", "DAC L3 Mux"},
3848
3849 {"Stereo2 DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
3850 {"Stereo2 DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
3851 {"Stereo2 DAC MIXR", "DAC R3 Switch", "DAC R3 Mux"},
3852
3853 {"Mono DAC MIXL", "DAC L1 Switch", "DAC1 MIXL"},
3854 {"Mono DAC MIXL", "DAC R1 Switch", "DAC1 MIXR"},
3855 {"Mono DAC MIXL", "DAC L2 Switch", "DAC L2 Mux"},
3856 {"Mono DAC MIXL", "DAC R2 Switch", "DAC R2 Mux"},
3857 {"Mono DAC MIXR", "DAC L1 Switch", "DAC1 MIXL"},
3858 {"Mono DAC MIXR", "DAC R1 Switch", "DAC1 MIXR"},
3859 {"Mono DAC MIXR", "DAC L2 Switch", "DAC L2 Mux"},
3860 {"Mono DAC MIXR", "DAC R2 Switch", "DAC R2 Mux"},
3861
3862 {"DAC MIXL", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
3863 {"DAC MIXL", "Stereo2 DAC Mixer", "Stereo2 DAC MIXL"},
3864 {"DAC MIXL", "Mono DAC Mixer", "Mono DAC MIXL"},
3865 {"DAC MIXR", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
3866 {"DAC MIXR", "Stereo2 DAC Mixer", "Stereo2 DAC MIXR"},
3867 {"DAC MIXR", "Mono DAC Mixer", "Mono DAC MIXR"},
3868
3869 {"DAC L1 Source", "DAC1", "DAC1 MIXL"},
3870 {"DAC L1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXL"},
3871 {"DAC L1 Source", "DMIC1", "DMIC L1"},
3872 {"DAC R1 Source", "DAC1", "DAC1 MIXR"},
3873 {"DAC R1 Source", "Stereo1 DAC Mixer", "Stereo1 DAC MIXR"},
3874 {"DAC R1 Source", "DMIC1", "DMIC R1"},
3875
3876 {"DAC L2 Source", "DAC2", "DAC L2 Mux"},
3877 {"DAC L2 Source", "Mono DAC Mixer", "Mono DAC MIXL"},
3878 {"DAC L2 Source", NULL, "DAC L2 Power"},
3879 {"DAC R2 Source", "DAC2", "DAC R2 Mux"},
3880 {"DAC R2 Source", "Mono DAC Mixer", "Mono DAC MIXR"},
3881 {"DAC R2 Source", NULL, "DAC R2 Power"},
3882
3883 {"DAC L1", NULL, "DAC L1 Source"},
3884 {"DAC R1", NULL, "DAC R1 Source"},
3885 {"DAC L2", NULL, "DAC L2 Source"},
3886 {"DAC R2", NULL, "DAC R2 Source"},
3887
3888 {"DAC L1", NULL, "DAC 1 Clock"},
3889 {"DAC R1", NULL, "DAC 1 Clock"},
3890 {"DAC L2", NULL, "DAC 2 Clock"},
3891 {"DAC R2", NULL, "DAC 2 Clock"},
3892
3893 {"MONOVOL MIX", "DAC L2 Switch", "DAC L2"},
3894 {"MONOVOL MIX", "RECMIX2L Switch", "RECMIX2L"},
3895 {"MONOVOL MIX", "BST1 Switch", "BST1"},
3896 {"MONOVOL MIX", "BST2 Switch", "BST2"},
3897 {"MONOVOL MIX", "BST3 Switch", "BST3"},
3898
3899 {"OUT MIXL", "DAC L2 Switch", "DAC L2"},
3900 {"OUT MIXL", "INL Switch", "INL VOL"},
3901 {"OUT MIXL", "BST1 Switch", "BST1"},
3902 {"OUT MIXL", "BST2 Switch", "BST2"},
3903 {"OUT MIXL", "BST3 Switch", "BST3"},
3904 {"OUT MIXR", "DAC R2 Switch", "DAC R2"},
3905 {"OUT MIXR", "INR Switch", "INR VOL"},
3906 {"OUT MIXR", "BST2 Switch", "BST2"},
3907 {"OUT MIXR", "BST3 Switch", "BST3"},
3908 {"OUT MIXR", "BST4 Switch", "BST4"},
3909
3910 {"MONOVOL", "Switch", "MONOVOL MIX"},
3911 {"Mono MIX", "DAC L2 Switch", "DAC L2"},
3912 {"Mono MIX", "MONOVOL Switch", "MONOVOL"},
3913 {"Mono Amp", NULL, "Mono MIX"},
3914 {"Mono Amp", NULL, "Vref2"},
3915 {"Mono Amp", NULL, "CLKDET SYS"},
3916 {"Mono Amp", NULL, "CLKDET MONO"},
3917 {"Mono Playback", "Switch", "Mono Amp"},
3918 {"MONOOUT", NULL, "Mono Playback"},
3919
3920 {"HP Amp", NULL, "DAC L1"},
3921 {"HP Amp", NULL, "DAC R1"},
3922 {"HP Amp", NULL, "Charge Pump"},
3923 {"HP Amp", NULL, "CLKDET SYS"},
3924 {"HP Amp", NULL, "CLKDET HP"},
3925 {"HP Amp", NULL, "CBJ Power"},
3926 {"HP Amp", NULL, "Vref2"},
3927 {"HPO Playback", "Switch", "HP Amp"},
3928 {"HPOL", NULL, "HPO Playback"},
3929 {"HPOR", NULL, "HPO Playback"},
3930
3931 {"OUTVOL L", "Switch", "OUT MIXL"},
3932 {"OUTVOL R", "Switch", "OUT MIXR"},
3933 {"LOUT L MIX", "DAC L2 Switch", "DAC L2"},
3934 {"LOUT L MIX", "OUTVOL L Switch", "OUTVOL L"},
3935 {"LOUT R MIX", "DAC R2 Switch", "DAC R2"},
3936 {"LOUT R MIX", "OUTVOL R Switch", "OUTVOL R"},
3937 {"LOUT Amp", NULL, "LOUT L MIX"},
3938 {"LOUT Amp", NULL, "LOUT R MIX"},
3939 {"LOUT Amp", NULL, "Vref1"},
3940 {"LOUT Amp", NULL, "Vref2"},
3941 {"LOUT Amp", NULL, "CLKDET SYS"},
3942 {"LOUT Amp", NULL, "CLKDET LOUT"},
3943 {"LOUT L Playback", "Switch", "LOUT Amp"},
3944 {"LOUT R Playback", "Switch", "LOUT Amp"},
3945 {"LOUTL", NULL, "LOUT L Playback"},
3946 {"LOUTR", NULL, "LOUT R Playback"},
3947
3948 {"PDM L Mux", "Mono DAC", "Mono DAC MIXL"},
3949 {"PDM L Mux", "Stereo1 DAC", "Stereo1 DAC MIXL"},
3950 {"PDM L Mux", "Stereo2 DAC", "Stereo2 DAC MIXL"},
3951 {"PDM L Mux", NULL, "PDM Power"},
3952 {"PDM R Mux", "Mono DAC", "Mono DAC MIXR"},
3953 {"PDM R Mux", "Stereo1 DAC", "Stereo1 DAC MIXR"},
3954 {"PDM R Mux", "Stereo2 DAC", "Stereo2 DAC MIXR"},
3955 {"PDM R Mux", NULL, "PDM Power"},
3956 {"PDM L Playback", "Switch", "PDM L Mux"},
3957 {"PDM R Playback", "Switch", "PDM R Mux"},
3958 {"PDML", NULL, "PDM L Playback"},
3959 {"PDMR", NULL, "PDM R Playback"},
3960};
3961
3962static int rt5665_hw_params(struct snd_pcm_substream *substream,
3963 struct snd_pcm_hw_params *params, struct snd_soc_dai *dai)
3964{
3965 struct snd_soc_codec *codec = dai->codec;
3966 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
3967 unsigned int val_len = 0, val_clk, mask_clk, val_bits = 0x0100;
3968 int pre_div, frame_size;
3969
3970 rt5665->lrck[dai->id] = params_rate(params);
3971 pre_div = rl6231_get_clk_info(rt5665->sysclk, rt5665->lrck[dai->id]);
3972 if (pre_div < 0) {
3973 dev_err(codec->dev, "Unsupported clock setting %d for DAI %d\n",
3974 rt5665->lrck[dai->id], dai->id);
3975 return -EINVAL;
3976 }
3977 frame_size = snd_soc_params_to_frame_size(params);
3978 if (frame_size < 0) {
3979 dev_err(codec->dev, "Unsupported frame size: %d\n", frame_size);
3980 return -EINVAL;
3981 }
3982
3983 dev_dbg(dai->dev, "lrck is %dHz and pre_div is %d for iis %d\n",
3984 rt5665->lrck[dai->id], pre_div, dai->id);
3985
3986 switch (params_width(params)) {
3987 case 16:
3988 val_bits = 0x0100;
3989 break;
3990 case 20:
3991 val_len |= RT5665_I2S_DL_20;
3992 val_bits = 0x1300;
3993 break;
3994 case 24:
3995 val_len |= RT5665_I2S_DL_24;
3996 val_bits = 0x2500;
3997 break;
3998 case 8:
3999 val_len |= RT5665_I2S_DL_8;
4000 break;
4001 default:
4002 return -EINVAL;
4003 }
4004
4005 switch (dai->id) {
4006 case RT5665_AIF1_1:
4007 case RT5665_AIF1_2:
4008 mask_clk = RT5665_I2S_PD1_MASK;
4009 val_clk = pre_div << RT5665_I2S_PD1_SFT;
4010 snd_soc_update_bits(codec, RT5665_I2S1_SDP,
4011 RT5665_I2S_DL_MASK, val_len);
4012 break;
4013 case RT5665_AIF2_1:
4014 case RT5665_AIF2_2:
4015 mask_clk = RT5665_I2S_PD2_MASK;
4016 val_clk = pre_div << RT5665_I2S_PD2_SFT;
4017 snd_soc_update_bits(codec, RT5665_I2S2_SDP,
4018 RT5665_I2S_DL_MASK, val_len);
4019 break;
4020 case RT5665_AIF3:
4021 mask_clk = RT5665_I2S_PD3_MASK;
4022 val_clk = pre_div << RT5665_I2S_PD3_SFT;
4023 snd_soc_update_bits(codec, RT5665_I2S3_SDP,
4024 RT5665_I2S_DL_MASK, val_len);
4025 break;
4026 default:
4027 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
4028 return -EINVAL;
4029 }
4030
4031 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1, mask_clk, val_clk);
4032 snd_soc_update_bits(codec, RT5665_STO1_DAC_SIL_DET, 0x3700, val_bits);
4033
4034 switch (rt5665->lrck[dai->id]) {
4035 case 192000:
4036 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
4037 RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK,
4038 RT5665_DAC_OSR_32 | RT5665_ADC_OSR_32);
4039 break;
4040 case 96000:
4041 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
4042 RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK,
4043 RT5665_DAC_OSR_64 | RT5665_ADC_OSR_64);
4044 break;
4045 default:
4046 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
4047 RT5665_DAC_OSR_MASK | RT5665_ADC_OSR_MASK,
4048 RT5665_DAC_OSR_128 | RT5665_ADC_OSR_128);
4049 break;
4050 }
4051
4052 return 0;
4053}
4054
4055static int rt5665_set_dai_fmt(struct snd_soc_dai *dai, unsigned int fmt)
4056{
4057 struct snd_soc_codec *codec = dai->codec;
4058 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4059 unsigned int reg_val = 0;
4060
4061 switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
4062 case SND_SOC_DAIFMT_CBM_CFM:
4063 rt5665->master[dai->id] = 1;
4064 break;
4065 case SND_SOC_DAIFMT_CBS_CFS:
4066 reg_val |= RT5665_I2S_MS_S;
4067 rt5665->master[dai->id] = 0;
4068 break;
4069 default:
4070 return -EINVAL;
4071 }
4072
4073 switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
4074 case SND_SOC_DAIFMT_NB_NF:
4075 break;
4076 case SND_SOC_DAIFMT_IB_NF:
4077 reg_val |= RT5665_I2S_BP_INV;
4078 break;
4079 default:
4080 return -EINVAL;
4081 }
4082
4083 switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
4084 case SND_SOC_DAIFMT_I2S:
4085 break;
4086 case SND_SOC_DAIFMT_LEFT_J:
4087 reg_val |= RT5665_I2S_DF_LEFT;
4088 break;
4089 case SND_SOC_DAIFMT_DSP_A:
4090 reg_val |= RT5665_I2S_DF_PCM_A;
4091 break;
4092 case SND_SOC_DAIFMT_DSP_B:
4093 reg_val |= RT5665_I2S_DF_PCM_B;
4094 break;
4095 default:
4096 return -EINVAL;
4097 }
4098
4099 switch (dai->id) {
4100 case RT5665_AIF1_1:
4101 case RT5665_AIF1_2:
4102 snd_soc_update_bits(codec, RT5665_I2S1_SDP,
4103 RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK |
4104 RT5665_I2S_DF_MASK, reg_val);
4105 break;
4106 case RT5665_AIF2_1:
4107 case RT5665_AIF2_2:
4108 snd_soc_update_bits(codec, RT5665_I2S2_SDP,
4109 RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK |
4110 RT5665_I2S_DF_MASK, reg_val);
4111 break;
4112 case RT5665_AIF3:
4113 snd_soc_update_bits(codec, RT5665_I2S3_SDP,
4114 RT5665_I2S_MS_MASK | RT5665_I2S_BP_MASK |
4115 RT5665_I2S_DF_MASK, reg_val);
4116 break;
4117 default:
4118 dev_err(codec->dev, "Invalid dai->id: %d\n", dai->id);
4119 return -EINVAL;
4120 }
4121 return 0;
4122}
4123
4124static int rt5665_set_dai_sysclk(struct snd_soc_dai *dai,
4125 int clk_id, unsigned int freq, int dir)
4126{
4127 struct snd_soc_codec *codec = dai->codec;
4128 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4129 unsigned int reg_val = 0;
4130
4131 if (freq == rt5665->sysclk && clk_id == rt5665->sysclk_src)
4132 return 0;
4133
4134 switch (clk_id) {
4135 case RT5665_SCLK_S_MCLK:
4136 reg_val |= RT5665_SCLK_SRC_MCLK;
4137 break;
4138 case RT5665_SCLK_S_PLL1:
4139 reg_val |= RT5665_SCLK_SRC_PLL1;
4140 break;
4141 case RT5665_SCLK_S_RCCLK:
4142 reg_val |= RT5665_SCLK_SRC_RCCLK;
4143 break;
4144 default:
4145 dev_err(codec->dev, "Invalid clock id (%d)\n", clk_id);
4146 return -EINVAL;
4147 }
4148 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4149 RT5665_SCLK_SRC_MASK, reg_val);
4150 rt5665->sysclk = freq;
4151 rt5665->sysclk_src = clk_id;
4152
4153 dev_dbg(dai->dev, "Sysclk is %dHz and clock id is %d\n", freq, clk_id);
4154
4155 return 0;
4156}
4157
4158static int rt5665_set_dai_pll(struct snd_soc_dai *dai, int pll_id, int Source,
4159 unsigned int freq_in, unsigned int freq_out)
4160{
4161 struct snd_soc_codec *codec = dai->codec;
4162 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4163 struct rl6231_pll_code pll_code;
4164 int ret;
4165
4166 if (Source == rt5665->pll_src && freq_in == rt5665->pll_in &&
4167 freq_out == rt5665->pll_out)
4168 return 0;
4169
4170 if (!freq_in || !freq_out) {
4171 dev_dbg(codec->dev, "PLL disabled\n");
4172
4173 rt5665->pll_in = 0;
4174 rt5665->pll_out = 0;
4175 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4176 RT5665_SCLK_SRC_MASK, RT5665_SCLK_SRC_MCLK);
4177 return 0;
4178 }
4179
4180 switch (Source) {
4181 case RT5665_PLL1_S_MCLK:
4182 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4183 RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_MCLK);
4184 break;
4185 case RT5665_PLL1_S_BCLK1:
4186 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4187 RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK1);
4188 break;
4189 case RT5665_PLL1_S_BCLK2:
4190 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4191 RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK2);
4192 break;
4193 case RT5665_PLL1_S_BCLK3:
4194 snd_soc_update_bits(codec, RT5665_GLB_CLK,
4195 RT5665_PLL1_SRC_MASK, RT5665_PLL1_SRC_BCLK3);
4196 break;
4197 default:
4198 dev_err(codec->dev, "Unknown PLL Source %d\n", Source);
4199 return -EINVAL;
4200 }
4201
4202 ret = rl6231_pll_calc(freq_in, freq_out, &pll_code);
4203 if (ret < 0) {
4204 dev_err(codec->dev, "Unsupport input clock %d\n", freq_in);
4205 return ret;
4206 }
4207
4208 dev_dbg(codec->dev, "bypass=%d m=%d n=%d k=%d\n",
4209 pll_code.m_bp, (pll_code.m_bp ? 0 : pll_code.m_code),
4210 pll_code.n_code, pll_code.k_code);
4211
4212 snd_soc_write(codec, RT5665_PLL_CTRL_1,
4213 pll_code.n_code << RT5665_PLL_N_SFT | pll_code.k_code);
4214 snd_soc_write(codec, RT5665_PLL_CTRL_2,
4215 (pll_code.m_bp ? 0 : pll_code.m_code) << RT5665_PLL_M_SFT |
4216 pll_code.m_bp << RT5665_PLL_M_BP_SFT);
4217
4218 rt5665->pll_in = freq_in;
4219 rt5665->pll_out = freq_out;
4220 rt5665->pll_src = Source;
4221
4222 return 0;
4223}
4224
4225static int rt5665_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
4226 unsigned int rx_mask, int slots, int slot_width)
4227{
4228 struct snd_soc_codec *codec = dai->codec;
4229 unsigned int val = 0;
4230
4231 if (rx_mask || tx_mask)
4232 val |= RT5665_I2S1_MODE_TDM;
4233
4234 switch (slots) {
4235 case 4:
4236 val |= RT5665_TDM_IN_CH_4;
4237 val |= RT5665_TDM_OUT_CH_4;
4238 break;
4239 case 6:
4240 val |= RT5665_TDM_IN_CH_6;
4241 val |= RT5665_TDM_OUT_CH_6;
4242 break;
4243 case 8:
4244 val |= RT5665_TDM_IN_CH_8;
4245 val |= RT5665_TDM_OUT_CH_8;
4246 break;
4247 case 2:
4248 break;
4249 default:
4250 return -EINVAL;
4251 }
4252
4253 switch (slot_width) {
4254 case 20:
4255 val |= RT5665_TDM_IN_LEN_20;
4256 val |= RT5665_TDM_OUT_LEN_20;
4257 break;
4258 case 24:
4259 val |= RT5665_TDM_IN_LEN_24;
4260 val |= RT5665_TDM_OUT_LEN_24;
4261 break;
4262 case 32:
4263 val |= RT5665_TDM_IN_LEN_32;
4264 val |= RT5665_TDM_OUT_LEN_32;
4265 break;
4266 case 16:
4267 break;
4268 default:
4269 return -EINVAL;
4270 }
4271
4272 snd_soc_update_bits(codec, RT5665_TDM_CTRL_1,
4273 RT5665_I2S1_MODE_MASK | RT5665_TDM_IN_CH_MASK |
4274 RT5665_TDM_OUT_CH_MASK | RT5665_TDM_IN_LEN_MASK |
4275 RT5665_TDM_OUT_LEN_MASK, val);
4276
4277 return 0;
4278}
4279
4280static int rt5665_set_bclk_ratio(struct snd_soc_dai *dai, unsigned int ratio)
4281{
4282 struct snd_soc_codec *codec = dai->codec;
4283 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4284
4285 dev_dbg(codec->dev, "%s ratio=%d\n", __func__, ratio);
4286
4287 rt5665->bclk[dai->id] = ratio;
4288
4289 if (ratio == 64) {
4290 switch (dai->id) {
4291 case RT5665_AIF2_1:
4292 case RT5665_AIF2_2:
4293 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
4294 RT5665_I2S_BCLK_MS2_MASK,
4295 RT5665_I2S_BCLK_MS2_64);
4296 break;
4297 case RT5665_AIF3:
4298 snd_soc_update_bits(codec, RT5665_ADDA_CLK_1,
4299 RT5665_I2S_BCLK_MS3_MASK,
4300 RT5665_I2S_BCLK_MS3_64);
4301 break;
4302 }
4303 }
4304
4305 return 0;
4306}
4307
4308static int rt5665_set_bias_level(struct snd_soc_codec *codec,
4309 enum snd_soc_bias_level level)
4310{
4311 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4312
4313 switch (level) {
4314 case SND_SOC_BIAS_PREPARE:
4315 regmap_update_bits(rt5665->regmap, RT5665_DIG_MISC,
4316 RT5665_DIG_GATE_CTRL, RT5665_DIG_GATE_CTRL);
4317 break;
4318
4319 case SND_SOC_BIAS_STANDBY:
4320 regmap_update_bits(rt5665->regmap, RT5665_PWR_DIG_1,
4321 RT5665_PWR_LDO, RT5665_PWR_LDO);
4322 regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
4323 RT5665_PWR_MB, RT5665_PWR_MB);
4324 regmap_update_bits(rt5665->regmap, RT5665_DIG_MISC,
4325 RT5665_DIG_GATE_CTRL, 0);
4326 break;
4327 case SND_SOC_BIAS_OFF:
4328 regmap_update_bits(rt5665->regmap, RT5665_PWR_DIG_1,
4329 RT5665_PWR_LDO, 0);
4330 regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
4331 RT5665_PWR_MB, 0);
4332 break;
4333
4334 default:
4335 break;
4336 }
4337
4338 return 0;
4339}
4340
4341static int rt5665_probe(struct snd_soc_codec *codec)
4342{
4343 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4344
4345 rt5665->codec = codec;
4346
4347 schedule_delayed_work(&rt5665->calibrate_work, msecs_to_jiffies(100));
4348
4349 return 0;
4350}
4351
4352static int rt5665_remove(struct snd_soc_codec *codec)
4353{
4354 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4355
4356 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4357
4358 return 0;
4359}
4360
4361#ifdef CONFIG_PM
4362static int rt5665_suspend(struct snd_soc_codec *codec)
4363{
4364 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4365
4366 regcache_cache_only(rt5665->regmap, true);
4367 regcache_mark_dirty(rt5665->regmap);
4368 return 0;
4369}
4370
4371static int rt5665_resume(struct snd_soc_codec *codec)
4372{
4373 struct rt5665_priv *rt5665 = snd_soc_codec_get_drvdata(codec);
4374
4375 regcache_cache_only(rt5665->regmap, false);
4376 regcache_sync(rt5665->regmap);
4377
4378 return 0;
4379}
4380#else
4381#define rt5665_suspend NULL
4382#define rt5665_resume NULL
4383#endif
4384
4385#define RT5665_STEREO_RATES SNDRV_PCM_RATE_8000_192000
4386#define RT5665_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE | \
4387 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S8)
4388
4389static const struct snd_soc_dai_ops rt5665_aif_dai_ops = {
4390 .hw_params = rt5665_hw_params,
4391 .set_fmt = rt5665_set_dai_fmt,
4392 .set_sysclk = rt5665_set_dai_sysclk,
4393 .set_tdm_slot = rt5665_set_tdm_slot,
4394 .set_pll = rt5665_set_dai_pll,
4395 .set_bclk_ratio = rt5665_set_bclk_ratio,
4396};
4397
4398static struct snd_soc_dai_driver rt5665_dai[] = {
4399 {
4400 .name = "rt5665-aif1_1",
4401 .id = RT5665_AIF1_1,
4402 .playback = {
4403 .stream_name = "AIF1 Playback",
4404 .channels_min = 1,
4405 .channels_max = 8,
4406 .rates = RT5665_STEREO_RATES,
4407 .formats = RT5665_FORMATS,
4408 },
4409 .capture = {
4410 .stream_name = "AIF1_1 Capture",
4411 .channels_min = 1,
4412 .channels_max = 8,
4413 .rates = RT5665_STEREO_RATES,
4414 .formats = RT5665_FORMATS,
4415 },
4416 .ops = &rt5665_aif_dai_ops,
4417 },
4418 {
4419 .name = "rt5665-aif1_2",
4420 .id = RT5665_AIF1_2,
4421 .capture = {
4422 .stream_name = "AIF1_2 Capture",
4423 .channels_min = 1,
4424 .channels_max = 8,
4425 .rates = RT5665_STEREO_RATES,
4426 .formats = RT5665_FORMATS,
4427 },
4428 .ops = &rt5665_aif_dai_ops,
4429 },
4430 {
4431 .name = "rt5665-aif2_1",
4432 .id = RT5665_AIF2_1,
4433 .playback = {
4434 .stream_name = "AIF2_1 Playback",
4435 .channels_min = 1,
4436 .channels_max = 2,
4437 .rates = RT5665_STEREO_RATES,
4438 .formats = RT5665_FORMATS,
4439 },
4440 .capture = {
4441 .stream_name = "AIF2_1 Capture",
4442 .channels_min = 1,
4443 .channels_max = 2,
4444 .rates = RT5665_STEREO_RATES,
4445 .formats = RT5665_FORMATS,
4446 },
4447 .ops = &rt5665_aif_dai_ops,
4448 },
4449 {
4450 .name = "rt5665-aif2_2",
4451 .id = RT5665_AIF2_2,
4452 .playback = {
4453 .stream_name = "AIF2_2 Playback",
4454 .channels_min = 1,
4455 .channels_max = 2,
4456 .rates = RT5665_STEREO_RATES,
4457 .formats = RT5665_FORMATS,
4458 },
4459 .capture = {
4460 .stream_name = "AIF2_2 Capture",
4461 .channels_min = 1,
4462 .channels_max = 2,
4463 .rates = RT5665_STEREO_RATES,
4464 .formats = RT5665_FORMATS,
4465 },
4466 .ops = &rt5665_aif_dai_ops,
4467 },
4468 {
4469 .name = "rt5665-aif3",
4470 .id = RT5665_AIF3,
4471 .playback = {
4472 .stream_name = "AIF3 Playback",
4473 .channels_min = 1,
4474 .channels_max = 2,
4475 .rates = RT5665_STEREO_RATES,
4476 .formats = RT5665_FORMATS,
4477 },
4478 .capture = {
4479 .stream_name = "AIF3 Capture",
4480 .channels_min = 1,
4481 .channels_max = 2,
4482 .rates = RT5665_STEREO_RATES,
4483 .formats = RT5665_FORMATS,
4484 },
4485 .ops = &rt5665_aif_dai_ops,
4486 },
4487};
4488
4489static struct snd_soc_codec_driver soc_codec_dev_rt5665 = {
4490 .probe = rt5665_probe,
4491 .remove = rt5665_remove,
4492 .suspend = rt5665_suspend,
4493 .resume = rt5665_resume,
4494 .set_bias_level = rt5665_set_bias_level,
4495 .idle_bias_off = true,
4496 .component_driver = {
4497 .controls = rt5665_snd_controls,
4498 .num_controls = ARRAY_SIZE(rt5665_snd_controls),
4499 .dapm_widgets = rt5665_dapm_widgets,
4500 .num_dapm_widgets = ARRAY_SIZE(rt5665_dapm_widgets),
4501 .dapm_routes = rt5665_dapm_routes,
4502 .num_dapm_routes = ARRAY_SIZE(rt5665_dapm_routes),
4503 }
4504};
4505
4506
4507static const struct regmap_config rt5665_regmap = {
4508 .reg_bits = 16,
4509 .val_bits = 16,
4510 .max_register = 0x0400,
4511 .volatile_reg = rt5665_volatile_register,
4512 .readable_reg = rt5665_readable_register,
4513 .cache_type = REGCACHE_RBTREE,
4514 .reg_defaults = rt5665_reg,
4515 .num_reg_defaults = ARRAY_SIZE(rt5665_reg),
4516 .use_single_rw = true,
4517};
4518
4519static const struct i2c_device_id rt5665_i2c_id[] = {
4520 {"rt5665", 0},
4521 {}
4522};
4523MODULE_DEVICE_TABLE(i2c, rt5665_i2c_id);
4524
4525static int rt5665_parse_dt(struct rt5665_priv *rt5665, struct device *dev)
4526{
4527 rt5665->pdata.in1_diff = of_property_read_bool(dev->of_node,
4528 "realtek,in1-differential");
4529 rt5665->pdata.in2_diff = of_property_read_bool(dev->of_node,
4530 "realtek,in2-differential");
4531 rt5665->pdata.in3_diff = of_property_read_bool(dev->of_node,
4532 "realtek,in3-differential");
4533 rt5665->pdata.in4_diff = of_property_read_bool(dev->of_node,
4534 "realtek,in4-differential");
4535
4536 of_property_read_u32(dev->of_node, "realtek,dmic1-data-pin",
4537 &rt5665->pdata.dmic1_data_pin);
4538 of_property_read_u32(dev->of_node, "realtek,dmic2-data-pin",
4539 &rt5665->pdata.dmic2_data_pin);
4540 of_property_read_u32(dev->of_node, "realtek,jd-src",
4541 &rt5665->pdata.jd_src);
4542
4543 rt5665->pdata.ldo1_en = of_get_named_gpio(dev->of_node,
4544 "realtek,ldo1-en-gpios", 0);
4545
4546 return 0;
4547}
4548
4549static void rt5665_calibrate(struct rt5665_priv *rt5665)
4550{
4551 int value, count;
4552
4553 mutex_lock(&rt5665->calibrate_mutex);
4554
4555 regcache_cache_bypass(rt5665->regmap, true);
4556
4557 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4558 regmap_write(rt5665->regmap, RT5665_BIAS_CUR_CTRL_8, 0xa602);
4559 regmap_write(rt5665->regmap, RT5665_HP_CHARGE_PUMP_1, 0x0c26);
4560 regmap_write(rt5665->regmap, RT5665_MONOMIX_IN_GAIN, 0x021f);
4561 regmap_write(rt5665->regmap, RT5665_MONO_OUT, 0x480a);
4562 regmap_write(rt5665->regmap, RT5665_PWR_MIXER, 0x083f);
4563 regmap_write(rt5665->regmap, RT5665_PWR_DIG_1, 0x0180);
4564 regmap_write(rt5665->regmap, RT5665_EJD_CTRL_1, 0x4040);
4565 regmap_write(rt5665->regmap, RT5665_HP_LOGIC_CTRL_2, 0x0000);
4566 regmap_write(rt5665->regmap, RT5665_DIG_MISC, 0x0001);
4567 regmap_write(rt5665->regmap, RT5665_MICBIAS_2, 0x0380);
4568 regmap_write(rt5665->regmap, RT5665_GLB_CLK, 0x8000);
4569 regmap_write(rt5665->regmap, RT5665_ADDA_CLK_1, 0x1000);
4570 regmap_write(rt5665->regmap, RT5665_CHOP_DAC, 0x3030);
4571 regmap_write(rt5665->regmap, RT5665_CALIB_ADC_CTRL, 0x3c05);
4572 regmap_write(rt5665->regmap, RT5665_PWR_ANLG_1, 0xaa3e);
4573 usleep_range(15000, 20000);
4574 regmap_write(rt5665->regmap, RT5665_PWR_ANLG_1, 0xfe7e);
4575 regmap_write(rt5665->regmap, RT5665_HP_CALIB_CTRL_2, 0x0321);
4576
4577 regmap_write(rt5665->regmap, RT5665_HP_CALIB_CTRL_1, 0xfc00);
4578 count = 0;
4579 while (true) {
4580 regmap_read(rt5665->regmap, RT5665_HP_CALIB_STA_1, &value);
4581 if (value & 0x8000)
4582 usleep_range(10000, 10005);
4583 else
4584 break;
4585
4586 if (count > 60) {
4587 pr_err("HP Calibration Failure\n");
4588 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4589 regcache_cache_bypass(rt5665->regmap, false);
4590 goto out_unlock;
4591 }
4592
4593 count++;
4594 }
4595
4596 regmap_write(rt5665->regmap, RT5665_MONO_AMP_CALIB_CTRL_1, 0x9e24);
4597 count = 0;
4598 while (true) {
4599 regmap_read(rt5665->regmap, RT5665_MONO_AMP_CALIB_STA1, &value);
4600 if (value & 0x8000)
4601 usleep_range(10000, 10005);
4602 else
4603 break;
4604
4605 if (count > 60) {
4606 pr_err("MONO Calibration Failure\n");
4607 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4608 regcache_cache_bypass(rt5665->regmap, false);
4609 goto out_unlock;
4610 }
4611
4612 count++;
4613 }
4614
4615 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4616 regcache_cache_bypass(rt5665->regmap, false);
4617
4618 regcache_mark_dirty(rt5665->regmap);
4619 regcache_sync(rt5665->regmap);
4620
4621 regmap_write(rt5665->regmap, RT5665_BIAS_CUR_CTRL_8, 0xa602);
4622 regmap_write(rt5665->regmap, RT5665_ASRC_8, 0x0120);
4623
4624out_unlock:
4625 mutex_unlock(&rt5665->calibrate_mutex);
4626}
4627
4628static void rt5665_calibrate_handler(struct work_struct *work)
4629{
4630 struct rt5665_priv *rt5665 = container_of(work, struct rt5665_priv,
4631 calibrate_work.work);
4632
4633 while (!rt5665->codec->component.card->instantiated) {
4634 pr_debug("%s\n", __func__);
4635 usleep_range(10000, 15000);
4636 }
4637
4638 rt5665_calibrate(rt5665);
4639}
4640
4641static int rt5665_i2c_probe(struct i2c_client *i2c,
4642 const struct i2c_device_id *id)
4643{
4644 struct rt5665_platform_data *pdata = dev_get_platdata(&i2c->dev);
4645 struct rt5665_priv *rt5665;
4646 int i, ret;
4647 unsigned int val;
4648
4649 rt5665 = devm_kzalloc(&i2c->dev, sizeof(struct rt5665_priv),
4650 GFP_KERNEL);
4651
4652 if (rt5665 == NULL)
4653 return -ENOMEM;
4654
4655 i2c_set_clientdata(i2c, rt5665);
4656
4657 if (pdata)
4658 rt5665->pdata = *pdata;
4659 else
4660 rt5665_parse_dt(rt5665, &i2c->dev);
4661
4662 for (i = 0; i < ARRAY_SIZE(rt5665->supplies); i++)
4663 rt5665->supplies[i].supply = rt5665_supply_names[i];
4664
4665 ret = devm_regulator_bulk_get(&i2c->dev, ARRAY_SIZE(rt5665->supplies),
4666 rt5665->supplies);
4667 if (ret != 0) {
4668 dev_err(&i2c->dev, "Failed to request supplies: %d\n", ret);
4669 return ret;
4670 }
4671
4672 ret = regulator_bulk_enable(ARRAY_SIZE(rt5665->supplies),
4673 rt5665->supplies);
4674 if (ret != 0) {
4675 dev_err(&i2c->dev, "Failed to enable supplies: %d\n", ret);
4676 return ret;
4677 }
4678
4679 if (gpio_is_valid(rt5665->pdata.ldo1_en)) {
4680 if (devm_gpio_request_one(&i2c->dev, rt5665->pdata.ldo1_en,
4681 GPIOF_OUT_INIT_HIGH, "rt5665"))
4682 dev_err(&i2c->dev, "Fail gpio_request gpio_ldo\n");
4683 }
4684
4685 /* Sleep for 300 ms miniumum */
4686 usleep_range(300000, 350000);
4687
4688 rt5665->regmap = devm_regmap_init_i2c(i2c, &rt5665_regmap);
4689 if (IS_ERR(rt5665->regmap)) {
4690 ret = PTR_ERR(rt5665->regmap);
4691 dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
4692 ret);
4693 return ret;
4694 }
4695
4696 regmap_read(rt5665->regmap, RT5665_DEVICE_ID, &val);
4697 if (val != DEVICE_ID) {
4698 dev_err(&i2c->dev,
4699 "Device with ID register %x is not rt5665\n", val);
4700 return -ENODEV;
4701 }
4702
4703 regmap_read(rt5665->regmap, RT5665_RESET, &val);
4704 switch (val) {
4705 case 0x0:
4706 rt5665->id = CODEC_5666;
4707 break;
4708 case 0x6:
4709 rt5665->id = CODEC_5668;
4710 break;
4711 case 0x3:
4712 default:
4713 rt5665->id = CODEC_5665;
4714 break;
4715 }
4716
4717 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4718
4719 /* line in diff mode*/
4720 if (rt5665->pdata.in1_diff)
4721 regmap_update_bits(rt5665->regmap, RT5665_IN1_IN2,
4722 RT5665_IN1_DF_MASK, RT5665_IN1_DF_MASK);
4723 if (rt5665->pdata.in2_diff)
4724 regmap_update_bits(rt5665->regmap, RT5665_IN1_IN2,
4725 RT5665_IN2_DF_MASK, RT5665_IN2_DF_MASK);
4726 if (rt5665->pdata.in3_diff)
4727 regmap_update_bits(rt5665->regmap, RT5665_IN3_IN4,
4728 RT5665_IN3_DF_MASK, RT5665_IN3_DF_MASK);
4729 if (rt5665->pdata.in4_diff)
4730 regmap_update_bits(rt5665->regmap, RT5665_IN3_IN4,
4731 RT5665_IN4_DF_MASK, RT5665_IN4_DF_MASK);
4732
4733 /* DMIC pin*/
4734 if (rt5665->pdata.dmic1_data_pin != RT5665_DMIC1_NULL ||
4735 rt5665->pdata.dmic2_data_pin != RT5665_DMIC2_NULL) {
4736 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_2,
4737 RT5665_GP9_PIN_MASK, RT5665_GP9_PIN_DMIC1_SCL);
4738 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
4739 RT5665_GP8_PIN_MASK, RT5665_GP8_PIN_DMIC2_SCL);
4740 switch (rt5665->pdata.dmic1_data_pin) {
4741 case RT5665_DMIC1_DATA_IN2N:
4742 regmap_update_bits(rt5665->regmap, RT5665_DMIC_CTRL_1,
4743 RT5665_DMIC_1_DP_MASK, RT5665_DMIC_1_DP_IN2N);
4744 break;
4745
4746 case RT5665_DMIC1_DATA_GPIO4:
4747 regmap_update_bits(rt5665->regmap, RT5665_DMIC_CTRL_1,
4748 RT5665_DMIC_1_DP_MASK, RT5665_DMIC_1_DP_GPIO4);
4749 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
4750 RT5665_GP4_PIN_MASK, RT5665_GP4_PIN_DMIC1_SDA);
4751 break;
4752
4753 default:
4754 dev_dbg(&i2c->dev, "no DMIC1\n");
4755 break;
4756 }
4757
4758 switch (rt5665->pdata.dmic2_data_pin) {
4759 case RT5665_DMIC2_DATA_IN2P:
4760 regmap_update_bits(rt5665->regmap, RT5665_DMIC_CTRL_1,
4761 RT5665_DMIC_2_DP_MASK, RT5665_DMIC_2_DP_IN2P);
4762 break;
4763
4764 case RT5665_DMIC2_DATA_GPIO5:
4765 regmap_update_bits(rt5665->regmap,
4766 RT5665_DMIC_CTRL_1,
4767 RT5665_DMIC_2_DP_MASK,
4768 RT5665_DMIC_2_DP_GPIO5);
4769 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_1,
4770 RT5665_GP5_PIN_MASK, RT5665_GP5_PIN_DMIC2_SDA);
4771 break;
4772
4773 default:
4774 dev_dbg(&i2c->dev, "no DMIC2\n");
4775 break;
4776
4777 }
4778 }
4779
4780 regmap_write(rt5665->regmap, RT5665_HP_LOGIC_CTRL_2, 0x0002);
4781 regmap_update_bits(rt5665->regmap, RT5665_EJD_CTRL_1,
4782 0xf000 | RT5665_VREF_POW_MASK, 0xd000 | RT5665_VREF_POW_REG);
4783 /* Work around for pow_pump */
4784 regmap_update_bits(rt5665->regmap, RT5665_STO1_DAC_SIL_DET,
4785 RT5665_DEB_STO_DAC_MASK, RT5665_DEB_80_MS);
4786
4787 regmap_update_bits(rt5665->regmap, RT5665_HP_CHARGE_PUMP_1,
4788 RT5665_PM_HP_MASK, RT5665_PM_HP_HV);
4789
4790 /* Set GPIO4,8 as input for combo jack */
4791 if (rt5665->id == CODEC_5666) {
4792 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_2,
4793 RT5665_GP4_PF_MASK, RT5665_GP4_PF_IN);
4794 regmap_update_bits(rt5665->regmap, RT5665_GPIO_CTRL_3,
4795 RT5665_GP8_PF_MASK, RT5665_GP8_PF_IN);
4796 }
4797
4798 /* Enhance performance*/
4799 regmap_update_bits(rt5665->regmap, RT5665_PWR_ANLG_1,
4800 RT5665_HP_DRIVER_MASK | RT5665_LDO1_DVO_MASK,
4801 RT5665_HP_DRIVER_5X | RT5665_LDO1_DVO_09);
4802
4803 INIT_DELAYED_WORK(&rt5665->jack_detect_work,
4804 rt5665_jack_detect_handler);
4805 INIT_DELAYED_WORK(&rt5665->calibrate_work,
4806 rt5665_calibrate_handler);
4807 INIT_DELAYED_WORK(&rt5665->jd_check_work,
4808 rt5665_jd_check_handler);
4809
4810 mutex_init(&rt5665->calibrate_mutex);
4811
4812 if (i2c->irq) {
4813 ret = devm_request_threaded_irq(&i2c->dev, i2c->irq, NULL,
4814 rt5665_irq, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING
4815 | IRQF_ONESHOT, "rt5665", rt5665);
4816 if (ret)
4817 dev_err(&i2c->dev, "Failed to reguest IRQ: %d\n", ret);
4818
4819 }
4820
4821 return snd_soc_register_codec(&i2c->dev, &soc_codec_dev_rt5665,
4822 rt5665_dai, ARRAY_SIZE(rt5665_dai));
4823}
4824
4825static int rt5665_i2c_remove(struct i2c_client *i2c)
4826{
4827 snd_soc_unregister_codec(&i2c->dev);
4828
4829 return 0;
4830}
4831
4832static void rt5665_i2c_shutdown(struct i2c_client *client)
4833{
4834 struct rt5665_priv *rt5665 = i2c_get_clientdata(client);
4835
4836 regmap_write(rt5665->regmap, RT5665_RESET, 0);
4837}
4838
4839#ifdef CONFIG_OF
4840static const struct of_device_id rt5665_of_match[] = {
4841 {.compatible = "realtek,rt5665"},
4842 {.compatible = "realtek,rt5666"},
4843 {.compatible = "realtek,rt5668"},
4844 {},
4845};
4846MODULE_DEVICE_TABLE(of, rt5665_of_match);
4847#endif
4848
4849#ifdef CONFIG_ACPI
4850static struct acpi_device_id rt5665_acpi_match[] = {
4851 {"10EC5665", 0,},
4852 {"10EC5666", 0,},
4853 {"10EC5668", 0,},
4854 {},
4855};
4856MODULE_DEVICE_TABLE(acpi, rt5665_acpi_match);
4857#endif
4858
4859struct i2c_driver rt5665_i2c_driver = {
4860 .driver = {
4861 .name = "rt5665",
4862 .of_match_table = of_match_ptr(rt5665_of_match),
4863 .acpi_match_table = ACPI_PTR(rt5665_acpi_match),
4864 },
4865 .probe = rt5665_i2c_probe,
4866 .remove = rt5665_i2c_remove,
4867 .shutdown = rt5665_i2c_shutdown,
4868 .id_table = rt5665_i2c_id,
4869};
4870module_i2c_driver(rt5665_i2c_driver);
4871
4872MODULE_DESCRIPTION("ASoC RT5665 driver");
4873MODULE_AUTHOR("Bard Liao <bardliao@realtek.com>");
4874MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/codecs/rt5665.h b/sound/soc/codecs/rt5665.h
new file mode 100644
index 000000000000..12f7080a0d3c
--- /dev/null
+++ b/sound/soc/codecs/rt5665.h
@@ -0,0 +1,1990 @@
1/*
2 * rt5665.h -- RT5665/RT5658 ALSA SoC audio driver
3 *
4 * Copyright 2016 Realtek Microelectronics
5 * Author: Bard Liao <bardliao@realtek.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 */
11
12#ifndef __RT5665_H__
13#define __RT5665_H__
14
15#include <sound/rt5665.h>
16
17#define DEVICE_ID 0x6451
18
19/* Info */
20#define RT5665_RESET 0x0000
21#define RT5665_VENDOR_ID 0x00fd
22#define RT5665_VENDOR_ID_1 0x00fe
23#define RT5665_DEVICE_ID 0x00ff
24/* I/O - Output */
25#define RT5665_LOUT 0x0001
26#define RT5665_HP_CTRL_1 0x0002
27#define RT5665_HP_CTRL_2 0x0003
28#define RT5665_MONO_OUT 0x0004
29#define RT5665_HPL_GAIN 0x0005
30#define RT5665_HPR_GAIN 0x0006
31#define RT5665_MONO_GAIN 0x0007
32
33/* I/O - Input */
34#define RT5665_CAL_BST_CTRL 0x000a
35#define RT5665_CBJ_BST_CTRL 0x000b
36#define RT5665_IN1_IN2 0x000c
37#define RT5665_IN3_IN4 0x000d
38#define RT5665_INL1_INR1_VOL 0x000f
39/* I/O - Speaker */
40#define RT5665_EJD_CTRL_1 0x0010
41#define RT5665_EJD_CTRL_2 0x0011
42#define RT5665_EJD_CTRL_3 0x0012
43#define RT5665_EJD_CTRL_4 0x0013
44#define RT5665_EJD_CTRL_5 0x0014
45#define RT5665_EJD_CTRL_6 0x0015
46#define RT5665_EJD_CTRL_7 0x0016
47/* I/O - ADC/DAC/DMIC */
48#define RT5665_DAC2_CTRL 0x0017
49#define RT5665_DAC2_DIG_VOL 0x0018
50#define RT5665_DAC1_DIG_VOL 0x0019
51#define RT5665_DAC3_DIG_VOL 0x001a
52#define RT5665_DAC3_CTRL 0x001b
53#define RT5665_STO1_ADC_DIG_VOL 0x001c
54#define RT5665_MONO_ADC_DIG_VOL 0x001d
55#define RT5665_STO2_ADC_DIG_VOL 0x001e
56#define RT5665_STO1_ADC_BOOST 0x001f
57#define RT5665_MONO_ADC_BOOST 0x0020
58#define RT5665_STO2_ADC_BOOST 0x0021
59#define RT5665_HP_IMP_GAIN_1 0x0022
60#define RT5665_HP_IMP_GAIN_2 0x0023
61/* Mixer - D-D */
62#define RT5665_STO1_ADC_MIXER 0x0026
63#define RT5665_MONO_ADC_MIXER 0x0027
64#define RT5665_STO2_ADC_MIXER 0x0028
65#define RT5665_AD_DA_MIXER 0x0029
66#define RT5665_STO1_DAC_MIXER 0x002a
67#define RT5665_MONO_DAC_MIXER 0x002b
68#define RT5665_STO2_DAC_MIXER 0x002c
69#define RT5665_A_DAC1_MUX 0x002d
70#define RT5665_A_DAC2_MUX 0x002e
71#define RT5665_DIG_INF2_DATA 0x002f
72#define RT5665_DIG_INF3_DATA 0x0030
73/* Mixer - PDM */
74#define RT5665_PDM_OUT_CTRL 0x0031
75#define RT5665_PDM_DATA_CTRL_1 0x0032
76#define RT5665_PDM_DATA_CTRL_2 0x0033
77#define RT5665_PDM_DATA_CTRL_3 0x0034
78#define RT5665_PDM_DATA_CTRL_4 0x0035
79/* Mixer - ADC */
80#define RT5665_REC1_GAIN 0x003a
81#define RT5665_REC1_L1_MIXER 0x003b
82#define RT5665_REC1_L2_MIXER 0x003c
83#define RT5665_REC1_R1_MIXER 0x003d
84#define RT5665_REC1_R2_MIXER 0x003e
85#define RT5665_REC2_GAIN 0x003f
86#define RT5665_REC2_L1_MIXER 0x0040
87#define RT5665_REC2_L2_MIXER 0x0041
88#define RT5665_REC2_R1_MIXER 0x0042
89#define RT5665_REC2_R2_MIXER 0x0043
90#define RT5665_CAL_REC 0x0044
91/* Mixer - DAC */
92#define RT5665_ALC_BACK_GAIN 0x0049
93#define RT5665_MONOMIX_GAIN 0x004a
94#define RT5665_MONOMIX_IN_GAIN 0x004b
95#define RT5665_OUT_L_GAIN 0x004d
96#define RT5665_OUT_L_MIXER 0x004e
97#define RT5665_OUT_R_GAIN 0x004f
98#define RT5665_OUT_R_MIXER 0x0050
99#define RT5665_LOUT_MIXER 0x0052
100/* Power */
101#define RT5665_PWR_DIG_1 0x0061
102#define RT5665_PWR_DIG_2 0x0062
103#define RT5665_PWR_ANLG_1 0x0063
104#define RT5665_PWR_ANLG_2 0x0064
105#define RT5665_PWR_ANLG_3 0x0065
106#define RT5665_PWR_MIXER 0x0066
107#define RT5665_PWR_VOL 0x0067
108/* Clock Detect */
109#define RT5665_CLK_DET 0x006b
110/* Filter */
111#define RT5665_HPF_CTRL1 0x006d
112/* DMIC */
113#define RT5665_DMIC_CTRL_1 0x006e
114#define RT5665_DMIC_CTRL_2 0x006f
115/* Format - ADC/DAC */
116#define RT5665_I2S1_SDP 0x0070
117#define RT5665_I2S2_SDP 0x0071
118#define RT5665_I2S3_SDP 0x0072
119#define RT5665_ADDA_CLK_1 0x0073
120#define RT5665_ADDA_CLK_2 0x0074
121#define RT5665_I2S1_F_DIV_CTRL_1 0x0075
122#define RT5665_I2S1_F_DIV_CTRL_2 0x0076
123/* Format - TDM Control */
124#define RT5665_TDM_CTRL_1 0x0078
125#define RT5665_TDM_CTRL_2 0x0079
126#define RT5665_TDM_CTRL_3 0x007a
127#define RT5665_TDM_CTRL_4 0x007b
128#define RT5665_TDM_CTRL_5 0x007c
129#define RT5665_TDM_CTRL_6 0x007d
130#define RT5665_TDM_CTRL_7 0x007e
131#define RT5665_TDM_CTRL_8 0x007f
132/* Function - Analog */
133#define RT5665_GLB_CLK 0x0080
134#define RT5665_PLL_CTRL_1 0x0081
135#define RT5665_PLL_CTRL_2 0x0082
136#define RT5665_ASRC_1 0x0083
137#define RT5665_ASRC_2 0x0084
138#define RT5665_ASRC_3 0x0085
139#define RT5665_ASRC_4 0x0086
140#define RT5665_ASRC_5 0x0087
141#define RT5665_ASRC_6 0x0088
142#define RT5665_ASRC_7 0x0089
143#define RT5665_ASRC_8 0x008a
144#define RT5665_ASRC_9 0x008b
145#define RT5665_ASRC_10 0x008c
146#define RT5665_DEPOP_1 0x008e
147#define RT5665_DEPOP_2 0x008f
148#define RT5665_HP_CHARGE_PUMP_1 0x0091
149#define RT5665_HP_CHARGE_PUMP_2 0x0092
150#define RT5665_MICBIAS_1 0x0093
151#define RT5665_MICBIAS_2 0x0094
152#define RT5665_ASRC_12 0x0098
153#define RT5665_ASRC_13 0x0099
154#define RT5665_ASRC_14 0x009a
155#define RT5665_RC_CLK_CTRL 0x009f
156#define RT5665_I2S_M_CLK_CTRL_1 0x00a0
157#define RT5665_I2S2_F_DIV_CTRL_1 0x00a1
158#define RT5665_I2S2_F_DIV_CTRL_2 0x00a2
159#define RT5665_I2S3_F_DIV_CTRL_1 0x00a3
160#define RT5665_I2S3_F_DIV_CTRL_2 0x00a4
161/* Function - Digital */
162#define RT5665_EQ_CTRL_1 0x00ae
163#define RT5665_EQ_CTRL_2 0x00af
164#define RT5665_IRQ_CTRL_1 0x00b6
165#define RT5665_IRQ_CTRL_2 0x00b7
166#define RT5665_IRQ_CTRL_3 0x00b8
167#define RT5665_IRQ_CTRL_4 0x00b9
168#define RT5665_IRQ_CTRL_5 0x00ba
169#define RT5665_IRQ_CTRL_6 0x00bb
170#define RT5665_INT_ST_1 0x00be
171#define RT5665_GPIO_CTRL_1 0x00c0
172#define RT5665_GPIO_CTRL_2 0x00c1
173#define RT5665_GPIO_CTRL_3 0x00c2
174#define RT5665_GPIO_CTRL_4 0x00c3
175#define RT5665_GPIO_STA 0x00c4
176#define RT5665_HP_AMP_DET_CTRL_1 0x00d0
177#define RT5665_HP_AMP_DET_CTRL_2 0x00d1
178#define RT5665_MID_HP_AMP_DET 0x00d3
179#define RT5665_LOW_HP_AMP_DET 0x00d4
180#define RT5665_SV_ZCD_1 0x00d9
181#define RT5665_SV_ZCD_2 0x00da
182#define RT5665_IL_CMD_1 0x00db
183#define RT5665_IL_CMD_2 0x00dc
184#define RT5665_IL_CMD_3 0x00dd
185#define RT5665_IL_CMD_4 0x00de
186#define RT5665_4BTN_IL_CMD_1 0x00df
187#define RT5665_4BTN_IL_CMD_2 0x00e0
188#define RT5665_4BTN_IL_CMD_3 0x00e1
189#define RT5665_PSV_IL_CMD_1 0x00e2
190
191#define RT5665_ADC_STO1_HP_CTRL_1 0x00ea
192#define RT5665_ADC_STO1_HP_CTRL_2 0x00eb
193#define RT5665_ADC_MONO_HP_CTRL_1 0x00ec
194#define RT5665_ADC_MONO_HP_CTRL_2 0x00ed
195#define RT5665_ADC_STO2_HP_CTRL_1 0x00ee
196#define RT5665_ADC_STO2_HP_CTRL_2 0x00ef
197#define RT5665_AJD1_CTRL 0x00f0
198#define RT5665_JD1_THD 0x00f1
199#define RT5665_JD2_THD 0x00f2
200#define RT5665_JD_CTRL_1 0x00f6
201#define RT5665_JD_CTRL_2 0x00f7
202#define RT5665_JD_CTRL_3 0x00f8
203/* General Control */
204#define RT5665_DIG_MISC 0x00fa
205#define RT5665_DUMMY_2 0x00fb
206#define RT5665_DUMMY_3 0x00fc
207
208#define RT5665_DAC_ADC_DIG_VOL1 0x0100
209#define RT5665_DAC_ADC_DIG_VOL2 0x0101
210#define RT5665_BIAS_CUR_CTRL_1 0x010a
211#define RT5665_BIAS_CUR_CTRL_2 0x010b
212#define RT5665_BIAS_CUR_CTRL_3 0x010c
213#define RT5665_BIAS_CUR_CTRL_4 0x010d
214#define RT5665_BIAS_CUR_CTRL_5 0x010e
215#define RT5665_BIAS_CUR_CTRL_6 0x010f
216#define RT5665_BIAS_CUR_CTRL_7 0x0110
217#define RT5665_BIAS_CUR_CTRL_8 0x0111
218#define RT5665_BIAS_CUR_CTRL_9 0x0112
219#define RT5665_BIAS_CUR_CTRL_10 0x0113
220#define RT5665_VREF_REC_OP_FB_CAP_CTRL 0x0117
221#define RT5665_CHARGE_PUMP_1 0x0125
222#define RT5665_DIG_IN_CTRL_1 0x0132
223#define RT5665_DIG_IN_CTRL_2 0x0133
224#define RT5665_PAD_DRIVING_CTRL 0x0137
225#define RT5665_SOFT_RAMP_DEPOP 0x0138
226#define RT5665_PLL 0x0139
227#define RT5665_CHOP_DAC 0x013a
228#define RT5665_CHOP_ADC 0x013b
229#define RT5665_CALIB_ADC_CTRL 0x013c
230#define RT5665_VOL_TEST 0x013f
231#define RT5665_TEST_MODE_CTRL_1 0x0145
232#define RT5665_TEST_MODE_CTRL_2 0x0146
233#define RT5665_TEST_MODE_CTRL_3 0x0147
234#define RT5665_TEST_MODE_CTRL_4 0x0148
235#define RT5665_BASSBACK_CTRL 0x0150
236#define RT5665_STO_NG2_CTRL_1 0x0160
237#define RT5665_STO_NG2_CTRL_2 0x0161
238#define RT5665_STO_NG2_CTRL_3 0x0162
239#define RT5665_STO_NG2_CTRL_4 0x0163
240#define RT5665_STO_NG2_CTRL_5 0x0164
241#define RT5665_STO_NG2_CTRL_6 0x0165
242#define RT5665_STO_NG2_CTRL_7 0x0166
243#define RT5665_STO_NG2_CTRL_8 0x0167
244#define RT5665_MONO_NG2_CTRL_1 0x0170
245#define RT5665_MONO_NG2_CTRL_2 0x0171
246#define RT5665_MONO_NG2_CTRL_3 0x0172
247#define RT5665_MONO_NG2_CTRL_4 0x0173
248#define RT5665_MONO_NG2_CTRL_5 0x0174
249#define RT5665_MONO_NG2_CTRL_6 0x0175
250#define RT5665_STO1_DAC_SIL_DET 0x0190
251#define RT5665_MONOL_DAC_SIL_DET 0x0191
252#define RT5665_MONOR_DAC_SIL_DET 0x0192
253#define RT5665_STO2_DAC_SIL_DET 0x0193
254#define RT5665_SIL_PSV_CTRL1 0x0194
255#define RT5665_SIL_PSV_CTRL2 0x0195
256#define RT5665_SIL_PSV_CTRL3 0x0196
257#define RT5665_SIL_PSV_CTRL4 0x0197
258#define RT5665_SIL_PSV_CTRL5 0x0198
259#define RT5665_SIL_PSV_CTRL6 0x0199
260#define RT5665_MONO_AMP_CALIB_CTRL_1 0x01a0
261#define RT5665_MONO_AMP_CALIB_CTRL_2 0x01a1
262#define RT5665_MONO_AMP_CALIB_CTRL_3 0x01a2
263#define RT5665_MONO_AMP_CALIB_CTRL_4 0x01a3
264#define RT5665_MONO_AMP_CALIB_CTRL_5 0x01a4
265#define RT5665_MONO_AMP_CALIB_CTRL_6 0x01a5
266#define RT5665_MONO_AMP_CALIB_CTRL_7 0x01a6
267#define RT5665_MONO_AMP_CALIB_STA1 0x01a7
268#define RT5665_MONO_AMP_CALIB_STA2 0x01a8
269#define RT5665_MONO_AMP_CALIB_STA3 0x01a9
270#define RT5665_MONO_AMP_CALIB_STA4 0x01aa
271#define RT5665_MONO_AMP_CALIB_STA6 0x01ab
272#define RT5665_HP_IMP_SENS_CTRL_01 0x01b5
273#define RT5665_HP_IMP_SENS_CTRL_02 0x01b6
274#define RT5665_HP_IMP_SENS_CTRL_03 0x01b7
275#define RT5665_HP_IMP_SENS_CTRL_04 0x01b8
276#define RT5665_HP_IMP_SENS_CTRL_05 0x01b9
277#define RT5665_HP_IMP_SENS_CTRL_06 0x01ba
278#define RT5665_HP_IMP_SENS_CTRL_07 0x01bb
279#define RT5665_HP_IMP_SENS_CTRL_08 0x01bc
280#define RT5665_HP_IMP_SENS_CTRL_09 0x01bd
281#define RT5665_HP_IMP_SENS_CTRL_10 0x01be
282#define RT5665_HP_IMP_SENS_CTRL_11 0x01bf
283#define RT5665_HP_IMP_SENS_CTRL_12 0x01c0
284#define RT5665_HP_IMP_SENS_CTRL_13 0x01c1
285#define RT5665_HP_IMP_SENS_CTRL_14 0x01c2
286#define RT5665_HP_IMP_SENS_CTRL_15 0x01c3
287#define RT5665_HP_IMP_SENS_CTRL_16 0x01c4
288#define RT5665_HP_IMP_SENS_CTRL_17 0x01c5
289#define RT5665_HP_IMP_SENS_CTRL_18 0x01c6
290#define RT5665_HP_IMP_SENS_CTRL_19 0x01c7
291#define RT5665_HP_IMP_SENS_CTRL_20 0x01c8
292#define RT5665_HP_IMP_SENS_CTRL_21 0x01c9
293#define RT5665_HP_IMP_SENS_CTRL_22 0x01ca
294#define RT5665_HP_IMP_SENS_CTRL_23 0x01cb
295#define RT5665_HP_IMP_SENS_CTRL_24 0x01cc
296#define RT5665_HP_IMP_SENS_CTRL_25 0x01cd
297#define RT5665_HP_IMP_SENS_CTRL_26 0x01ce
298#define RT5665_HP_IMP_SENS_CTRL_27 0x01cf
299#define RT5665_HP_IMP_SENS_CTRL_28 0x01d0
300#define RT5665_HP_IMP_SENS_CTRL_29 0x01d1
301#define RT5665_HP_IMP_SENS_CTRL_30 0x01d2
302#define RT5665_HP_IMP_SENS_CTRL_31 0x01d3
303#define RT5665_HP_IMP_SENS_CTRL_32 0x01d4
304#define RT5665_HP_IMP_SENS_CTRL_33 0x01d5
305#define RT5665_HP_IMP_SENS_CTRL_34 0x01d6
306#define RT5665_HP_LOGIC_CTRL_1 0x01da
307#define RT5665_HP_LOGIC_CTRL_2 0x01db
308#define RT5665_HP_LOGIC_CTRL_3 0x01dc
309#define RT5665_HP_CALIB_CTRL_1 0x01de
310#define RT5665_HP_CALIB_CTRL_2 0x01df
311#define RT5665_HP_CALIB_CTRL_3 0x01e0
312#define RT5665_HP_CALIB_CTRL_4 0x01e1
313#define RT5665_HP_CALIB_CTRL_5 0x01e2
314#define RT5665_HP_CALIB_CTRL_6 0x01e3
315#define RT5665_HP_CALIB_CTRL_7 0x01e4
316#define RT5665_HP_CALIB_CTRL_9 0x01e6
317#define RT5665_HP_CALIB_CTRL_10 0x01e7
318#define RT5665_HP_CALIB_CTRL_11 0x01e8
319#define RT5665_HP_CALIB_STA_1 0x01ea
320#define RT5665_HP_CALIB_STA_2 0x01eb
321#define RT5665_HP_CALIB_STA_3 0x01ec
322#define RT5665_HP_CALIB_STA_4 0x01ed
323#define RT5665_HP_CALIB_STA_5 0x01ee
324#define RT5665_HP_CALIB_STA_6 0x01ef
325#define RT5665_HP_CALIB_STA_7 0x01f0
326#define RT5665_HP_CALIB_STA_8 0x01f1
327#define RT5665_HP_CALIB_STA_9 0x01f2
328#define RT5665_HP_CALIB_STA_10 0x01f3
329#define RT5665_HP_CALIB_STA_11 0x01f4
330#define RT5665_PGM_TAB_CTRL1 0x0200
331#define RT5665_PGM_TAB_CTRL2 0x0201
332#define RT5665_PGM_TAB_CTRL3 0x0202
333#define RT5665_PGM_TAB_CTRL4 0x0203
334#define RT5665_PGM_TAB_CTRL5 0x0204
335#define RT5665_PGM_TAB_CTRL6 0x0205
336#define RT5665_PGM_TAB_CTRL7 0x0206
337#define RT5665_PGM_TAB_CTRL8 0x0207
338#define RT5665_PGM_TAB_CTRL9 0x0208
339#define RT5665_SAR_IL_CMD_1 0x0210
340#define RT5665_SAR_IL_CMD_2 0x0211
341#define RT5665_SAR_IL_CMD_3 0x0212
342#define RT5665_SAR_IL_CMD_4 0x0213
343#define RT5665_SAR_IL_CMD_5 0x0214
344#define RT5665_SAR_IL_CMD_6 0x0215
345#define RT5665_SAR_IL_CMD_7 0x0216
346#define RT5665_SAR_IL_CMD_8 0x0217
347#define RT5665_SAR_IL_CMD_9 0x0218
348#define RT5665_SAR_IL_CMD_10 0x0219
349#define RT5665_SAR_IL_CMD_11 0x021a
350#define RT5665_SAR_IL_CMD_12 0x021b
351#define RT5665_DRC1_CTRL_0 0x02ff
352#define RT5665_DRC1_CTRL_1 0x0300
353#define RT5665_DRC1_CTRL_2 0x0301
354#define RT5665_DRC1_CTRL_3 0x0302
355#define RT5665_DRC1_CTRL_4 0x0303
356#define RT5665_DRC1_CTRL_5 0x0304
357#define RT5665_DRC1_CTRL_6 0x0305
358#define RT5665_DRC1_HARD_LMT_CTRL_1 0x0306
359#define RT5665_DRC1_HARD_LMT_CTRL_2 0x0307
360#define RT5665_DRC1_PRIV_1 0x0310
361#define RT5665_DRC1_PRIV_2 0x0311
362#define RT5665_DRC1_PRIV_3 0x0312
363#define RT5665_DRC1_PRIV_4 0x0313
364#define RT5665_DRC1_PRIV_5 0x0314
365#define RT5665_DRC1_PRIV_6 0x0315
366#define RT5665_DRC1_PRIV_7 0x0316
367#define RT5665_DRC1_PRIV_8 0x0317
368#define RT5665_ALC_PGA_CTRL_1 0x0330
369#define RT5665_ALC_PGA_CTRL_2 0x0331
370#define RT5665_ALC_PGA_CTRL_3 0x0332
371#define RT5665_ALC_PGA_CTRL_4 0x0333
372#define RT5665_ALC_PGA_CTRL_5 0x0334
373#define RT5665_ALC_PGA_CTRL_6 0x0335
374#define RT5665_ALC_PGA_CTRL_7 0x0336
375#define RT5665_ALC_PGA_CTRL_8 0x0337
376#define RT5665_ALC_PGA_STA_1 0x0338
377#define RT5665_ALC_PGA_STA_2 0x0339
378#define RT5665_ALC_PGA_STA_3 0x033a
379#define RT5665_EQ_AUTO_RCV_CTRL1 0x03c0
380#define RT5665_EQ_AUTO_RCV_CTRL2 0x03c1
381#define RT5665_EQ_AUTO_RCV_CTRL3 0x03c2
382#define RT5665_EQ_AUTO_RCV_CTRL4 0x03c3
383#define RT5665_EQ_AUTO_RCV_CTRL5 0x03c4
384#define RT5665_EQ_AUTO_RCV_CTRL6 0x03c5
385#define RT5665_EQ_AUTO_RCV_CTRL7 0x03c6
386#define RT5665_EQ_AUTO_RCV_CTRL8 0x03c7
387#define RT5665_EQ_AUTO_RCV_CTRL9 0x03c8
388#define RT5665_EQ_AUTO_RCV_CTRL10 0x03c9
389#define RT5665_EQ_AUTO_RCV_CTRL11 0x03ca
390#define RT5665_EQ_AUTO_RCV_CTRL12 0x03cb
391#define RT5665_EQ_AUTO_RCV_CTRL13 0x03cc
392#define RT5665_ADC_L_EQ_LPF1_A1 0x03d0
393#define RT5665_R_EQ_LPF1_A1 0x03d1
394#define RT5665_L_EQ_LPF1_H0 0x03d2
395#define RT5665_R_EQ_LPF1_H0 0x03d3
396#define RT5665_L_EQ_BPF1_A1 0x03d4
397#define RT5665_R_EQ_BPF1_A1 0x03d5
398#define RT5665_L_EQ_BPF1_A2 0x03d6
399#define RT5665_R_EQ_BPF1_A2 0x03d7
400#define RT5665_L_EQ_BPF1_H0 0x03d8
401#define RT5665_R_EQ_BPF1_H0 0x03d9
402#define RT5665_L_EQ_BPF2_A1 0x03da
403#define RT5665_R_EQ_BPF2_A1 0x03db
404#define RT5665_L_EQ_BPF2_A2 0x03dc
405#define RT5665_R_EQ_BPF2_A2 0x03dd
406#define RT5665_L_EQ_BPF2_H0 0x03de
407#define RT5665_R_EQ_BPF2_H0 0x03df
408#define RT5665_L_EQ_BPF3_A1 0x03e0
409#define RT5665_R_EQ_BPF3_A1 0x03e1
410#define RT5665_L_EQ_BPF3_A2 0x03e2
411#define RT5665_R_EQ_BPF3_A2 0x03e3
412#define RT5665_L_EQ_BPF3_H0 0x03e4
413#define RT5665_R_EQ_BPF3_H0 0x03e5
414#define RT5665_L_EQ_BPF4_A1 0x03e6
415#define RT5665_R_EQ_BPF4_A1 0x03e7
416#define RT5665_L_EQ_BPF4_A2 0x03e8
417#define RT5665_R_EQ_BPF4_A2 0x03e9
418#define RT5665_L_EQ_BPF4_H0 0x03ea
419#define RT5665_R_EQ_BPF4_H0 0x03eb
420#define RT5665_L_EQ_HPF1_A1 0x03ec
421#define RT5665_R_EQ_HPF1_A1 0x03ed
422#define RT5665_L_EQ_HPF1_H0 0x03ee
423#define RT5665_R_EQ_HPF1_H0 0x03ef
424#define RT5665_L_EQ_PRE_VOL 0x03f0
425#define RT5665_R_EQ_PRE_VOL 0x03f1
426#define RT5665_L_EQ_POST_VOL 0x03f2
427#define RT5665_R_EQ_POST_VOL 0x03f3
428#define RT5665_SCAN_MODE_CTRL 0x07f0
429#define RT5665_I2C_MODE 0x07fa
430
431
432
433/* global definition */
434#define RT5665_L_MUTE (0x1 << 15)
435#define RT5665_L_MUTE_SFT 15
436#define RT5665_VOL_L_MUTE (0x1 << 14)
437#define RT5665_VOL_L_SFT 14
438#define RT5665_R_MUTE (0x1 << 7)
439#define RT5665_R_MUTE_SFT 7
440#define RT5665_VOL_R_MUTE (0x1 << 6)
441#define RT5665_VOL_R_SFT 6
442#define RT5665_L_VOL_MASK (0x3f << 8)
443#define RT5665_L_VOL_SFT 8
444#define RT5665_R_VOL_MASK (0x3f)
445#define RT5665_R_VOL_SFT 0
446
447/*Headphone Amp L/R Analog Gain and Digital NG2 Gain Control (0x0005 0x0006)*/
448#define RT5665_G_HP (0xf << 8)
449#define RT5665_G_HP_SFT 8
450#define RT5665_G_STO_DA_DMIX (0xf)
451#define RT5665_G_STO_DA_SFT 0
452
453/* CBJ Control (0x000b) */
454#define RT5665_BST_CBJ_MASK (0xf << 8)
455#define RT5665_BST_CBJ_SFT 8
456
457/* IN1/IN2 Control (0x000c) */
458#define RT5665_IN1_DF_MASK (0x1 << 15)
459#define RT5665_IN1_DF 15
460#define RT5665_BST1_MASK (0x7f << 8)
461#define RT5665_BST1_SFT 8
462#define RT5665_IN2_DF_MASK (0x1 << 7)
463#define RT5665_IN2_DF 7
464#define RT5665_BST2_MASK (0x7f)
465#define RT5665_BST2_SFT 0
466
467/* IN3/IN4 Control (0x000d) */
468#define RT5665_IN3_DF_MASK (0x1 << 15)
469#define RT5665_IN3_DF 15
470#define RT5665_BST3_MASK (0x7f << 8)
471#define RT5665_BST3_SFT 8
472#define RT5665_IN4_DF_MASK (0x1 << 7)
473#define RT5665_IN4_DF 7
474#define RT5665_BST4_MASK (0x7f)
475#define RT5665_BST4_SFT 0
476
477/* INL and INR Volume Control (0x000f) */
478#define RT5665_INL_VOL_MASK (0x1f << 8)
479#define RT5665_INL_VOL_SFT 8
480#define RT5665_INR_VOL_MASK (0x1f)
481#define RT5665_INR_VOL_SFT 0
482
483/* Embeeded Jack and Type Detection Control 1 (0x0010) */
484#define RT5665_EMB_JD_EN (0x1 << 15)
485#define RT5665_EMB_JD_EN_SFT 15
486#define RT5665_JD_MODE (0x1 << 13)
487#define RT5665_JD_MODE_SFT 13
488#define RT5665_POLA_EXT_JD_MASK (0x1 << 11)
489#define RT5665_POLA_EXT_JD_LOW (0x1 << 11)
490#define RT5665_POLA_EXT_JD_HIGH (0x0 << 11)
491#define RT5665_EXT_JD_DIG (0x1 << 9)
492#define RT5665_POL_FAST_OFF_MASK (0x1 << 8)
493#define RT5665_POL_FAST_OFF_HIGH (0x1 << 8)
494#define RT5665_POL_FAST_OFF_LOW (0x0 << 8)
495#define RT5665_VREF_POW_MASK (0x1 << 6)
496#define RT5665_VREF_POW_FSM (0x0 << 6)
497#define RT5665_VREF_POW_REG (0x1 << 6)
498#define RT5665_MB1_PATH_MASK (0x1 << 5)
499#define RT5665_CTRL_MB1_REG (0x1 << 5)
500#define RT5665_CTRL_MB1_FSM (0x0 << 5)
501#define RT5665_MB2_PATH_MASK (0x1 << 4)
502#define RT5665_CTRL_MB2_REG (0x1 << 4)
503#define RT5665_CTRL_MB2_FSM (0x0 << 4)
504#define RT5665_TRIG_JD_MASK (0x1 << 3)
505#define RT5665_TRIG_JD_HIGH (0x1 << 3)
506#define RT5665_TRIG_JD_LOW (0x0 << 3)
507
508/* Embeeded Jack and Type Detection Control 2 (0x0011) */
509#define RT5665_EXT_JD_SRC (0x7 << 4)
510#define RT5665_EXT_JD_SRC_SFT 4
511#define RT5665_EXT_JD_SRC_GPIO_JD1 (0x0 << 4)
512#define RT5665_EXT_JD_SRC_GPIO_JD2 (0x1 << 4)
513#define RT5665_EXT_JD_SRC_JD1_1 (0x2 << 4)
514#define RT5665_EXT_JD_SRC_JD1_2 (0x3 << 4)
515#define RT5665_EXT_JD_SRC_JD2 (0x4 << 4)
516#define RT5665_EXT_JD_SRC_JD3 (0x5 << 4)
517#define RT5665_EXT_JD_SRC_MANUAL (0x6 << 4)
518
519/* Combo Jack and Type Detection Control 4 (0x0013) */
520#define RT5665_SEL_SHT_MID_TON_MASK (0x3 << 12)
521#define RT5665_SEL_SHT_MID_TON_2 (0x0 << 12)
522#define RT5665_SEL_SHT_MID_TON_3 (0x1 << 12)
523#define RT5665_CBJ_JD_TEST_MASK (0x1 << 6)
524#define RT5665_CBJ_JD_TEST_NORM (0x0 << 6)
525#define RT5665_CBJ_JD_TEST_MODE (0x1 << 6)
526
527/* Slience Detection Control (0x0015) */
528#define RT5665_SIL_DET_MASK (0x1 << 15)
529#define RT5665_SIL_DET_DIS (0x0 << 15)
530#define RT5665_SIL_DET_EN (0x1 << 15)
531
532/* DAC2 Control (0x0017) */
533#define RT5665_M_DAC2_L_VOL (0x1 << 13)
534#define RT5665_M_DAC2_L_VOL_SFT 13
535#define RT5665_M_DAC2_R_VOL (0x1 << 12)
536#define RT5665_M_DAC2_R_VOL_SFT 12
537#define RT5665_DAC_L2_SEL_MASK (0x7 << 4)
538#define RT5665_DAC_L2_SEL_SFT 4
539#define RT5665_DAC_R2_SEL_MASK (0x7 << 0)
540#define RT5665_DAC_R2_SEL_SFT 0
541
542/* Sidetone Control (0x0018) */
543#define RT5665_ST_SEL_MASK (0x7 << 9)
544#define RT5665_ST_SEL_SFT 9
545#define RT5665_ST_EN (0x1 << 6)
546#define RT5665_ST_EN_SFT 6
547
548/* DAC1 Digital Volume (0x0019) */
549#define RT5665_DAC_L1_VOL_MASK (0xff << 8)
550#define RT5665_DAC_L1_VOL_SFT 8
551#define RT5665_DAC_R1_VOL_MASK (0xff)
552#define RT5665_DAC_R1_VOL_SFT 0
553
554/* DAC2 Digital Volume (0x001a) */
555#define RT5665_DAC_L2_VOL_MASK (0xff << 8)
556#define RT5665_DAC_L2_VOL_SFT 8
557#define RT5665_DAC_R2_VOL_MASK (0xff)
558#define RT5665_DAC_R2_VOL_SFT 0
559
560/* DAC3 Control (0x001b) */
561#define RT5665_M_DAC3_L_VOL (0x1 << 13)
562#define RT5665_M_DAC3_L_VOL_SFT 13
563#define RT5665_M_DAC3_R_VOL (0x1 << 12)
564#define RT5665_M_DAC3_R_VOL_SFT 12
565#define RT5665_DAC_L3_SEL_MASK (0x7 << 4)
566#define RT5665_DAC_L3_SEL_SFT 4
567#define RT5665_DAC_R3_SEL_MASK (0x7 << 0)
568#define RT5665_DAC_R3_SEL_SFT 0
569
570/* ADC Digital Volume Control (0x001c) */
571#define RT5665_ADC_L_VOL_MASK (0x7f << 8)
572#define RT5665_ADC_L_VOL_SFT 8
573#define RT5665_ADC_R_VOL_MASK (0x7f)
574#define RT5665_ADC_R_VOL_SFT 0
575
576/* Mono ADC Digital Volume Control (0x001d) */
577#define RT5665_MONO_ADC_L_VOL_MASK (0x7f << 8)
578#define RT5665_MONO_ADC_L_VOL_SFT 8
579#define RT5665_MONO_ADC_R_VOL_MASK (0x7f)
580#define RT5665_MONO_ADC_R_VOL_SFT 0
581
582/* Stereo1 ADC Boost Gain Control (0x001f) */
583#define RT5665_STO1_ADC_L_BST_MASK (0x3 << 14)
584#define RT5665_STO1_ADC_L_BST_SFT 14
585#define RT5665_STO1_ADC_R_BST_MASK (0x3 << 12)
586#define RT5665_STO1_ADC_R_BST_SFT 12
587
588/* Mono ADC Boost Gain Control (0x0020) */
589#define RT5665_MONO_ADC_L_BST_MASK (0x3 << 14)
590#define RT5665_MONO_ADC_L_BST_SFT 14
591#define RT5665_MONO_ADC_R_BST_MASK (0x3 << 12)
592#define RT5665_MONO_ADC_R_BST_SFT 12
593
594/* Stereo1 ADC Boost Gain Control (0x001f) */
595#define RT5665_STO2_ADC_L_BST_MASK (0x3 << 14)
596#define RT5665_STO2_ADC_L_BST_SFT 14
597#define RT5665_STO2_ADC_R_BST_MASK (0x3 << 12)
598#define RT5665_STO2_ADC_R_BST_SFT 12
599
600/* Stereo1 ADC Mixer Control (0x0026) */
601#define RT5665_M_STO1_ADC_L1 (0x1 << 15)
602#define RT5665_M_STO1_ADC_L1_SFT 15
603#define RT5665_M_STO1_ADC_L2 (0x1 << 14)
604#define RT5665_M_STO1_ADC_L2_SFT 14
605#define RT5665_STO1_ADC1L_SRC_MASK (0x1 << 13)
606#define RT5665_STO1_ADC1L_SRC_SFT 13
607#define RT5665_STO1_ADC1_SRC_ADC (0x1 << 13)
608#define RT5665_STO1_ADC1_SRC_DACMIX (0x0 << 13)
609#define RT5665_STO1_ADC2L_SRC_MASK (0x1 << 12)
610#define RT5665_STO1_ADC2L_SRC_SFT 12
611#define RT5665_STO1_ADCL_SRC_MASK (0x3 << 10)
612#define RT5665_STO1_ADCL_SRC_SFT 10
613#define RT5665_STO1_DD_L_SRC_MASK (0x1 << 9)
614#define RT5665_STO1_DD_L_SRC_SFT 9
615#define RT5665_STO1_DMIC_SRC_MASK (0x1 << 8)
616#define RT5665_STO1_DMIC_SRC_SFT 8
617#define RT5665_STO1_DMIC_SRC_DMIC2 (0x1 << 8)
618#define RT5665_STO1_DMIC_SRC_DMIC1 (0x0 << 8)
619#define RT5665_M_STO1_ADC_R1 (0x1 << 7)
620#define RT5665_M_STO1_ADC_R1_SFT 7
621#define RT5665_M_STO1_ADC_R2 (0x1 << 6)
622#define RT5665_M_STO1_ADC_R2_SFT 6
623#define RT5665_STO1_ADC1R_SRC_MASK (0x1 << 5)
624#define RT5665_STO1_ADC1R_SRC_SFT 5
625#define RT5665_STO1_ADC2R_SRC_MASK (0x1 << 4)
626#define RT5665_STO1_ADC2R_SRC_SFT 4
627#define RT5665_STO1_ADCR_SRC_MASK (0x3 << 2)
628#define RT5665_STO1_ADCR_SRC_SFT 2
629#define RT5665_STO1_DD_R_SRC_MASK (0x3)
630#define RT5665_STO1_DD_R_SRC_SFT 0
631
632
633/* Mono1 ADC Mixer control (0x0027) */
634#define RT5665_M_MONO_ADC_L1 (0x1 << 15)
635#define RT5665_M_MONO_ADC_L1_SFT 15
636#define RT5665_M_MONO_ADC_L2 (0x1 << 14)
637#define RT5665_M_MONO_ADC_L2_SFT 14
638#define RT5665_MONO_ADC_L1_SRC_MASK (0x1 << 13)
639#define RT5665_MONO_ADC_L1_SRC_SFT 13
640#define RT5665_MONO_ADC_L2_SRC_MASK (0x1 << 12)
641#define RT5665_MONO_ADC_L2_SRC_SFT 12
642#define RT5665_MONO_ADC_L_SRC_MASK (0x3 << 10)
643#define RT5665_MONO_ADC_L_SRC_SFT 10
644#define RT5665_MONO_DD_L_SRC_MASK (0x1 << 9)
645#define RT5665_MONO_DD_L_SRC_SFT 9
646#define RT5665_MONO_DMIC_L_SRC_MASK (0x1 << 8)
647#define RT5665_MONO_DMIC_L_SRC_SFT 8
648#define RT5665_M_MONO_ADC_R1 (0x1 << 7)
649#define RT5665_M_MONO_ADC_R1_SFT 7
650#define RT5665_M_MONO_ADC_R2 (0x1 << 6)
651#define RT5665_M_MONO_ADC_R2_SFT 6
652#define RT5665_MONO_ADC_R1_SRC_MASK (0x1 << 5)
653#define RT5665_MONO_ADC_R1_SRC_SFT 5
654#define RT5665_MONO_ADC_R2_SRC_MASK (0x1 << 4)
655#define RT5665_MONO_ADC_R2_SRC_SFT 4
656#define RT5665_MONO_ADC_R_SRC_MASK (0x3 << 2)
657#define RT5665_MONO_ADC_R_SRC_SFT 2
658#define RT5665_MONO_DD_R_SRC_MASK (0x1 << 1)
659#define RT5665_MONO_DD_R_SRC_SFT 1
660#define RT5665_MONO_DMIC_R_SRC_MASK 0x1
661#define RT5665_MONO_DMIC_R_SRC_SFT 0
662
663/* Stereo2 ADC Mixer Control (0x0028) */
664#define RT5665_M_STO2_ADC_L1 (0x1 << 15)
665#define RT5665_M_STO2_ADC_L1_UN (0x0 << 15)
666#define RT5665_M_STO2_ADC_L1_SFT 15
667#define RT5665_M_STO2_ADC_L2 (0x1 << 14)
668#define RT5665_M_STO2_ADC_L2_SFT 14
669#define RT5665_STO2_ADC1L_SRC_MASK (0x1 << 13)
670#define RT5665_STO2_ADC1L_SRC_SFT 13
671#define RT5665_STO2_ADC1_SRC_ADC (0x1 << 13)
672#define RT5665_STO2_ADC1_SRC_DACMIX (0x0 << 13)
673#define RT5665_STO2_ADC2L_SRC_MASK (0x1 << 12)
674#define RT5665_STO2_ADC2L_SRC_SFT 12
675#define RT5665_STO2_ADCL_SRC_MASK (0x3 << 10)
676#define RT5665_STO2_ADCL_SRC_SFT 10
677#define RT5665_STO2_DD_L_SRC_MASK (0x1 << 9)
678#define RT5665_STO2_DD_L_SRC_SFT 9
679#define RT5665_STO2_DMIC_SRC_MASK (0x1 << 8)
680#define RT5665_STO2_DMIC_SRC_SFT 8
681#define RT5665_STO2_DMIC_SRC_DMIC2 (0x1 << 8)
682#define RT5665_STO2_DMIC_SRC_DMIC1 (0x0 << 8)
683#define RT5665_M_STO2_ADC_R1 (0x1 << 7)
684#define RT5665_M_STO2_ADC_R1_UN (0x0 << 7)
685#define RT5665_M_STO2_ADC_R1_SFT 7
686#define RT5665_M_STO2_ADC_R2 (0x1 << 6)
687#define RT5665_M_STO2_ADC_R2_SFT 6
688#define RT5665_STO2_ADC1R_SRC_MASK (0x1 << 5)
689#define RT5665_STO2_ADC1R_SRC_SFT 5
690#define RT5665_STO2_ADC2R_SRC_MASK (0x1 << 4)
691#define RT5665_STO2_ADC2R_SRC_SFT 4
692#define RT5665_STO2_ADCR_SRC_MASK (0x3 << 2)
693#define RT5665_STO2_ADCR_SRC_SFT 2
694#define RT5665_STO2_DD_R_SRC_MASK (0x1 << 1)
695#define RT5665_STO2_DD_R_SRC_SFT 1
696
697/* ADC Mixer to DAC Mixer Control (0x0029) */
698#define RT5665_M_ADCMIX_L (0x1 << 15)
699#define RT5665_M_ADCMIX_L_SFT 15
700#define RT5665_M_DAC1_L (0x1 << 14)
701#define RT5665_M_DAC1_L_SFT 14
702#define RT5665_DAC1_R_SEL_MASK (0x3 << 10)
703#define RT5665_DAC1_R_SEL_SFT 10
704#define RT5665_DAC1_L_SEL_MASK (0x3 << 8)
705#define RT5665_DAC1_L_SEL_SFT 8
706#define RT5665_M_ADCMIX_R (0x1 << 7)
707#define RT5665_M_ADCMIX_R_SFT 7
708#define RT5665_M_DAC1_R (0x1 << 6)
709#define RT5665_M_DAC1_R_SFT 6
710
711/* Stereo1 DAC Mixer Control (0x002a) */
712#define RT5665_M_DAC_L1_STO_L (0x1 << 15)
713#define RT5665_M_DAC_L1_STO_L_SFT 15
714#define RT5665_G_DAC_L1_STO_L_MASK (0x1 << 14)
715#define RT5665_G_DAC_L1_STO_L_SFT 14
716#define RT5665_M_DAC_R1_STO_L (0x1 << 13)
717#define RT5665_M_DAC_R1_STO_L_SFT 13
718#define RT5665_G_DAC_R1_STO_L_MASK (0x1 << 12)
719#define RT5665_G_DAC_R1_STO_L_SFT 12
720#define RT5665_M_DAC_L2_STO_L (0x1 << 11)
721#define RT5665_M_DAC_L2_STO_L_SFT 11
722#define RT5665_G_DAC_L2_STO_L_MASK (0x1 << 10)
723#define RT5665_G_DAC_L2_STO_L_SFT 10
724#define RT5665_M_DAC_R2_STO_L (0x1 << 9)
725#define RT5665_M_DAC_R2_STO_L_SFT 9
726#define RT5665_G_DAC_R2_STO_L_MASK (0x1 << 8)
727#define RT5665_G_DAC_R2_STO_L_SFT 8
728#define RT5665_M_DAC_L1_STO_R (0x1 << 7)
729#define RT5665_M_DAC_L1_STO_R_SFT 7
730#define RT5665_G_DAC_L1_STO_R_MASK (0x1 << 6)
731#define RT5665_G_DAC_L1_STO_R_SFT 6
732#define RT5665_M_DAC_R1_STO_R (0x1 << 5)
733#define RT5665_M_DAC_R1_STO_R_SFT 5
734#define RT5665_G_DAC_R1_STO_R_MASK (0x1 << 4)
735#define RT5665_G_DAC_R1_STO_R_SFT 4
736#define RT5665_M_DAC_L2_STO_R (0x1 << 3)
737#define RT5665_M_DAC_L2_STO_R_SFT 3
738#define RT5665_G_DAC_L2_STO_R_MASK (0x1 << 2)
739#define RT5665_G_DAC_L2_STO_R_SFT 2
740#define RT5665_M_DAC_R2_STO_R (0x1 << 1)
741#define RT5665_M_DAC_R2_STO_R_SFT 1
742#define RT5665_G_DAC_R2_STO_R_MASK (0x1)
743#define RT5665_G_DAC_R2_STO_R_SFT 0
744
745/* Mono DAC Mixer Control (0x002b) */
746#define RT5665_M_DAC_L1_MONO_L (0x1 << 15)
747#define RT5665_M_DAC_L1_MONO_L_SFT 15
748#define RT5665_G_DAC_L1_MONO_L_MASK (0x1 << 14)
749#define RT5665_G_DAC_L1_MONO_L_SFT 14
750#define RT5665_M_DAC_R1_MONO_L (0x1 << 13)
751#define RT5665_M_DAC_R1_MONO_L_SFT 13
752#define RT5665_G_DAC_R1_MONO_L_MASK (0x1 << 12)
753#define RT5665_G_DAC_R1_MONO_L_SFT 12
754#define RT5665_M_DAC_L2_MONO_L (0x1 << 11)
755#define RT5665_M_DAC_L2_MONO_L_SFT 11
756#define RT5665_G_DAC_L2_MONO_L_MASK (0x1 << 10)
757#define RT5665_G_DAC_L2_MONO_L_SFT 10
758#define RT5665_M_DAC_R2_MONO_L (0x1 << 9)
759#define RT5665_M_DAC_R2_MONO_L_SFT 9
760#define RT5665_G_DAC_R2_MONO_L_MASK (0x1 << 8)
761#define RT5665_G_DAC_R2_MONO_L_SFT 8
762#define RT5665_M_DAC_L1_MONO_R (0x1 << 7)
763#define RT5665_M_DAC_L1_MONO_R_SFT 7
764#define RT5665_G_DAC_L1_MONO_R_MASK (0x1 << 6)
765#define RT5665_G_DAC_L1_MONO_R_SFT 6
766#define RT5665_M_DAC_R1_MONO_R (0x1 << 5)
767#define RT5665_M_DAC_R1_MONO_R_SFT 5
768#define RT5665_G_DAC_R1_MONO_R_MASK (0x1 << 4)
769#define RT5665_G_DAC_R1_MONO_R_SFT 4
770#define RT5665_M_DAC_L2_MONO_R (0x1 << 3)
771#define RT5665_M_DAC_L2_MONO_R_SFT 3
772#define RT5665_G_DAC_L2_MONO_R_MASK (0x1 << 2)
773#define RT5665_G_DAC_L2_MONO_R_SFT 2
774#define RT5665_M_DAC_R2_MONO_R (0x1 << 1)
775#define RT5665_M_DAC_R2_MONO_R_SFT 1
776#define RT5665_G_DAC_R2_MONO_R_MASK (0x1)
777#define RT5665_G_DAC_R2_MONO_R_SFT 0
778
779/* Stereo2 DAC Mixer Control (0x002c) */
780#define RT5665_M_DAC_L1_STO2_L (0x1 << 15)
781#define RT5665_M_DAC_L1_STO2_L_SFT 15
782#define RT5665_G_DAC_L1_STO2_L_MASK (0x1 << 14)
783#define RT5665_G_DAC_L1_STO2_L_SFT 14
784#define RT5665_M_DAC_L2_STO2_L (0x1 << 13)
785#define RT5665_M_DAC_L2_STO2_L_SFT 13
786#define RT5665_G_DAC_L2_STO2_L_MASK (0x1 << 12)
787#define RT5665_G_DAC_L2_STO2_L_SFT 12
788#define RT5665_M_DAC_L3_STO2_L (0x1 << 11)
789#define RT5665_M_DAC_L3_STO2_L_SFT 11
790#define RT5665_G_DAC_L3_STO2_L_MASK (0x1 << 10)
791#define RT5665_G_DAC_L3_STO2_L_SFT 10
792#define RT5665_M_ST_DAC_L1 (0x1 << 9)
793#define RT5665_M_ST_DAC_L1_SFT 9
794#define RT5665_M_ST_DAC_R1 (0x1 << 8)
795#define RT5665_M_ST_DAC_R1_SFT 8
796#define RT5665_M_DAC_R1_STO2_R (0x1 << 7)
797#define RT5665_M_DAC_R1_STO2_R_SFT 7
798#define RT5665_G_DAC_R1_STO2_R_MASK (0x1 << 6)
799#define RT5665_G_DAC_R1_STO2_R_SFT 6
800#define RT5665_M_DAC_R2_STO2_R (0x1 << 5)
801#define RT5665_M_DAC_R2_STO2_R_SFT 5
802#define RT5665_G_DAC_R2_STO2_R_MASK (0x1 << 4)
803#define RT5665_G_DAC_R2_STO2_R_SFT 4
804#define RT5665_M_DAC_R3_STO2_R (0x1 << 3)
805#define RT5665_M_DAC_R3_STO2_R_SFT 3
806#define RT5665_G_DAC_R3_STO2_R_MASK (0x1 << 2)
807#define RT5665_G_DAC_R3_STO2_R_SFT 2
808
809/* Analog DAC1 Input Source Control (0x002d) */
810#define RT5665_DAC_MIX_L_MASK (0x3 << 12)
811#define RT5665_DAC_MIX_L_SFT 12
812#define RT5665_DAC_MIX_R_MASK (0x3 << 8)
813#define RT5665_DAC_MIX_R_SFT 8
814#define RT5665_DAC_L1_SRC_MASK (0x3 << 4)
815#define RT5665_A_DACL1_SFT 4
816#define RT5665_DAC_R1_SRC_MASK (0x3)
817#define RT5665_A_DACR1_SFT 0
818
819/* Analog DAC Input Source Control (0x002e) */
820#define RT5665_A_DACL2_SEL (0x1 << 4)
821#define RT5665_A_DACL2_SFT 4
822#define RT5665_A_DACR2_SEL (0x1 << 0)
823#define RT5665_A_DACR2_SFT 0
824
825/* Digital Interface Data Control (0x002f) */
826#define RT5665_IF2_1_ADC_IN_MASK (0x7 << 12)
827#define RT5665_IF2_1_ADC_IN_SFT 12
828#define RT5665_IF2_1_DAC_SEL_MASK (0x3 << 10)
829#define RT5665_IF2_1_DAC_SEL_SFT 10
830#define RT5665_IF2_1_ADC_SEL_MASK (0x3 << 8)
831#define RT5665_IF2_1_ADC_SEL_SFT 8
832#define RT5665_IF2_2_ADC_IN_MASK (0x7 << 4)
833#define RT5665_IF2_2_ADC_IN_SFT 4
834#define RT5665_IF2_2_DAC_SEL_MASK (0x3 << 2)
835#define RT5665_IF2_2_DAC_SEL_SFT 2
836#define RT5665_IF2_2_ADC_SEL_MASK (0x3 << 0)
837#define RT5665_IF2_2_ADC_SEL_SFT 0
838
839/* Digital Interface Data Control (0x0030) */
840#define RT5665_IF3_ADC_IN_MASK (0x7 << 4)
841#define RT5665_IF3_ADC_IN_SFT 4
842#define RT5665_IF3_DAC_SEL_MASK (0x3 << 2)
843#define RT5665_IF3_DAC_SEL_SFT 2
844#define RT5665_IF3_ADC_SEL_MASK (0x3 << 0)
845#define RT5665_IF3_ADC_SEL_SFT 0
846
847/* PDM Output Control (0x0031) */
848#define RT5665_M_PDM1_L (0x1 << 14)
849#define RT5665_M_PDM1_L_SFT 14
850#define RT5665_M_PDM1_R (0x1 << 12)
851#define RT5665_M_PDM1_R_SFT 12
852#define RT5665_PDM1_L_MASK (0x3 << 10)
853#define RT5665_PDM1_L_SFT 10
854#define RT5665_PDM1_R_MASK (0x3 << 8)
855#define RT5665_PDM1_R_SFT 8
856#define RT5665_PDM1_BUSY (0x1 << 6)
857#define RT5665_PDM_PATTERN (0x1 << 5)
858#define RT5665_PDM_GAIN (0x1 << 4)
859#define RT5665_LRCK_PDM_PI2C (0x1 << 3)
860#define RT5665_PDM_DIV_MASK (0x3)
861
862/*S/PDIF Output Control (0x0036) */
863#define RT5665_SPDIF_SEL_MASK (0x3 << 0)
864#define RT5665_SPDIF_SEL_SFT 0
865
866/* REC Left Mixer Control 2 (0x003c) */
867#define RT5665_M_CBJ_RM1_L (0x1 << 7)
868#define RT5665_M_CBJ_RM1_L_SFT 7
869#define RT5665_M_BST1_RM1_L (0x1 << 5)
870#define RT5665_M_BST1_RM1_L_SFT 5
871#define RT5665_M_BST2_RM1_L (0x1 << 4)
872#define RT5665_M_BST2_RM1_L_SFT 4
873#define RT5665_M_BST3_RM1_L (0x1 << 3)
874#define RT5665_M_BST3_RM1_L_SFT 3
875#define RT5665_M_BST4_RM1_L (0x1 << 2)
876#define RT5665_M_BST4_RM1_L_SFT 2
877#define RT5665_M_INL_RM1_L (0x1 << 1)
878#define RT5665_M_INL_RM1_L_SFT 1
879#define RT5665_M_INR_RM1_L (0x1)
880#define RT5665_M_INR_RM1_L_SFT 0
881
882/* REC Right Mixer Control 2 (0x003e) */
883#define RT5665_M_AEC_REF_RM1_R (0x1 << 7)
884#define RT5665_M_AEC_REF_RM1_R_SFT 7
885#define RT5665_M_BST1_RM1_R (0x1 << 5)
886#define RT5665_M_BST1_RM1_R_SFT 5
887#define RT5665_M_BST2_RM1_R (0x1 << 4)
888#define RT5665_M_BST2_RM1_R_SFT 4
889#define RT5665_M_BST3_RM1_R (0x1 << 3)
890#define RT5665_M_BST3_RM1_R_SFT 3
891#define RT5665_M_BST4_RM1_R (0x1 << 2)
892#define RT5665_M_BST4_RM1_R_SFT 2
893#define RT5665_M_INR_RM1_R (0x1 << 1)
894#define RT5665_M_INR_RM1_R_SFT 1
895#define RT5665_M_MONOVOL_RM1_R (0x1)
896#define RT5665_M_MONOVOL_RM1_R_SFT 0
897
898/* REC Mixer 2 Left Control 2 (0x0041) */
899#define RT5665_M_CBJ_RM2_L (0x1 << 7)
900#define RT5665_M_CBJ_RM2_L_SFT 7
901#define RT5665_M_BST1_RM2_L (0x1 << 5)
902#define RT5665_M_BST1_RM2_L_SFT 5
903#define RT5665_M_BST2_RM2_L (0x1 << 4)
904#define RT5665_M_BST2_RM2_L_SFT 4
905#define RT5665_M_BST3_RM2_L (0x1 << 3)
906#define RT5665_M_BST3_RM2_L_SFT 3
907#define RT5665_M_BST4_RM2_L (0x1 << 2)
908#define RT5665_M_BST4_RM2_L_SFT 2
909#define RT5665_M_INL_RM2_L (0x1 << 1)
910#define RT5665_M_INL_RM2_L_SFT 1
911#define RT5665_M_INR_RM2_L (0x1)
912#define RT5665_M_INR_RM2_L_SFT 0
913
914/* REC Mixer 2 Right Control 2 (0x0043) */
915#define RT5665_M_MONOVOL_RM2_R (0x1 << 7)
916#define RT5665_M_MONOVOL_RM2_R_SFT 7
917#define RT5665_M_BST1_RM2_R (0x1 << 5)
918#define RT5665_M_BST1_RM2_R_SFT 5
919#define RT5665_M_BST2_RM2_R (0x1 << 4)
920#define RT5665_M_BST2_RM2_R_SFT 4
921#define RT5665_M_BST3_RM2_R (0x1 << 3)
922#define RT5665_M_BST3_RM2_R_SFT 3
923#define RT5665_M_BST4_RM2_R (0x1 << 2)
924#define RT5665_M_BST4_RM2_R_SFT 2
925#define RT5665_M_INL_RM2_R (0x1 << 1)
926#define RT5665_M_INL_RM2_R_SFT 1
927#define RT5665_M_INR_RM2_R (0x1)
928#define RT5665_M_INR_RM2_R_SFT 0
929
930/* SPK Left Mixer Control (0x0046) */
931#define RT5665_M_BST3_SM_L (0x1 << 4)
932#define RT5665_M_BST3_SM_L_SFT 4
933#define RT5665_M_IN_R_SM_L (0x1 << 3)
934#define RT5665_M_IN_R_SM_L_SFT 3
935#define RT5665_M_IN_L_SM_L (0x1 << 2)
936#define RT5665_M_IN_L_SM_L_SFT 2
937#define RT5665_M_BST1_SM_L (0x1 << 1)
938#define RT5665_M_BST1_SM_L_SFT 1
939#define RT5665_M_DAC_L2_SM_L (0x1)
940#define RT5665_M_DAC_L2_SM_L_SFT 0
941
942/* SPK Right Mixer Control (0x0047) */
943#define RT5665_M_BST3_SM_R (0x1 << 4)
944#define RT5665_M_BST3_SM_R_SFT 4
945#define RT5665_M_IN_R_SM_R (0x1 << 3)
946#define RT5665_M_IN_R_SM_R_SFT 3
947#define RT5665_M_IN_L_SM_R (0x1 << 2)
948#define RT5665_M_IN_L_SM_R_SFT 2
949#define RT5665_M_BST4_SM_R (0x1 << 1)
950#define RT5665_M_BST4_SM_R_SFT 1
951#define RT5665_M_DAC_R2_SM_R (0x1)
952#define RT5665_M_DAC_R2_SM_R_SFT 0
953
954/* SPO Amp Input and Gain Control (0x0048) */
955#define RT5665_M_DAC_L2_SPKOMIX (0x1 << 13)
956#define RT5665_M_DAC_L2_SPKOMIX_SFT 13
957#define RT5665_M_SPKVOLL_SPKOMIX (0x1 << 12)
958#define RT5665_M_SPKVOLL_SPKOMIX_SFT 12
959#define RT5665_M_DAC_R2_SPKOMIX (0x1 << 9)
960#define RT5665_M_DAC_R2_SPKOMIX_SFT 9
961#define RT5665_M_SPKVOLR_SPKOMIX (0x1 << 8)
962#define RT5665_M_SPKVOLR_SPKOMIX_SFT 8
963
964/* MONOMIX Input and Gain Control (0x004b) */
965#define RT5665_G_MONOVOL_MA (0x1 << 10)
966#define RT5665_G_MONOVOL_MA_SFT 10
967#define RT5665_M_MONOVOL_MA (0x1 << 9)
968#define RT5665_M_MONOVOL_MA_SFT 9
969#define RT5665_M_DAC_L2_MA (0x1 << 8)
970#define RT5665_M_DAC_L2_MA_SFT 8
971#define RT5665_M_BST3_MM (0x1 << 4)
972#define RT5665_M_BST3_MM_SFT 4
973#define RT5665_M_BST2_MM (0x1 << 3)
974#define RT5665_M_BST2_MM_SFT 3
975#define RT5665_M_BST1_MM (0x1 << 2)
976#define RT5665_M_BST1_MM_SFT 2
977#define RT5665_M_RECMIC2L_MM (0x1 << 1)
978#define RT5665_M_RECMIC2L_MM_SFT 1
979#define RT5665_M_DAC_L2_MM (0x1)
980#define RT5665_M_DAC_L2_MM_SFT 0
981
982/* Output Left Mixer Control 1 (0x004d) */
983#define RT5665_G_BST3_OM_L_MASK (0x7 << 12)
984#define RT5665_G_BST3_OM_L_SFT 12
985#define RT5665_G_BST2_OM_L_MASK (0x7 << 9)
986#define RT5665_G_BST2_OM_L_SFT 9
987#define RT5665_G_BST1_OM_L_MASK (0x7 << 6)
988#define RT5665_G_BST1_OM_L_SFT 6
989#define RT5665_G_IN_L_OM_L_MASK (0x7 << 3)
990#define RT5665_G_IN_L_OM_L_SFT 3
991#define RT5665_G_DAC_L2_OM_L_MASK (0x7 << 0)
992#define RT5665_G_DAC_L2_OM_L_SFT 0
993
994/* Output Left Mixer Input Control (0x004e) */
995#define RT5665_M_BST3_OM_L (0x1 << 4)
996#define RT5665_M_BST3_OM_L_SFT 4
997#define RT5665_M_BST2_OM_L (0x1 << 3)
998#define RT5665_M_BST2_OM_L_SFT 3
999#define RT5665_M_BST1_OM_L (0x1 << 2)
1000#define RT5665_M_BST1_OM_L_SFT 2
1001#define RT5665_M_IN_L_OM_L (0x1 << 1)
1002#define RT5665_M_IN_L_OM_L_SFT 1
1003#define RT5665_M_DAC_L2_OM_L (0x1)
1004#define RT5665_M_DAC_L2_OM_L_SFT 0
1005
1006/* Output Right Mixer Input Control (0x0050) */
1007#define RT5665_M_BST4_OM_R (0x1 << 4)
1008#define RT5665_M_BST4_OM_R_SFT 4
1009#define RT5665_M_BST3_OM_R (0x1 << 3)
1010#define RT5665_M_BST3_OM_R_SFT 3
1011#define RT5665_M_BST2_OM_R (0x1 << 2)
1012#define RT5665_M_BST2_OM_R_SFT 2
1013#define RT5665_M_IN_R_OM_R (0x1 << 1)
1014#define RT5665_M_IN_R_OM_R_SFT 1
1015#define RT5665_M_DAC_R2_OM_R (0x1)
1016#define RT5665_M_DAC_R2_OM_R_SFT 0
1017
1018/* LOUT Mixer Control (0x0052) */
1019#define RT5665_M_DAC_L2_LM (0x1 << 15)
1020#define RT5665_M_DAC_L2_LM_SFT 15
1021#define RT5665_M_DAC_R2_LM (0x1 << 14)
1022#define RT5665_M_DAC_R2_LM_SFT 14
1023#define RT5665_M_OV_L_LM (0x1 << 13)
1024#define RT5665_M_OV_L_LM_SFT 13
1025#define RT5665_M_OV_R_LM (0x1 << 12)
1026#define RT5665_M_OV_R_LM_SFT 12
1027#define RT5665_LOUT_BST_SFT 11
1028#define RT5665_LOUT_DF (0x1 << 11)
1029#define RT5665_LOUT_DF_SFT 11
1030
1031/* Power Management for Digital 1 (0x0061) */
1032#define RT5665_PWR_I2S1_1 (0x1 << 15)
1033#define RT5665_PWR_I2S1_1_BIT 15
1034#define RT5665_PWR_I2S1_2 (0x1 << 14)
1035#define RT5665_PWR_I2S1_2_BIT 14
1036#define RT5665_PWR_I2S2_1 (0x1 << 13)
1037#define RT5665_PWR_I2S2_1_BIT 13
1038#define RT5665_PWR_I2S2_2 (0x1 << 12)
1039#define RT5665_PWR_I2S2_2_BIT 12
1040#define RT5665_PWR_DAC_L1 (0x1 << 11)
1041#define RT5665_PWR_DAC_L1_BIT 11
1042#define RT5665_PWR_DAC_R1 (0x1 << 10)
1043#define RT5665_PWR_DAC_R1_BIT 10
1044#define RT5665_PWR_I2S3 (0x1 << 9)
1045#define RT5665_PWR_I2S3_BIT 9
1046#define RT5665_PWR_LDO (0x1 << 8)
1047#define RT5665_PWR_LDO_BIT 8
1048#define RT5665_PWR_DAC_L2 (0x1 << 7)
1049#define RT5665_PWR_DAC_L2_BIT 7
1050#define RT5665_PWR_DAC_R2 (0x1 << 6)
1051#define RT5665_PWR_DAC_R2_BIT 6
1052#define RT5665_PWR_ADC_L1 (0x1 << 4)
1053#define RT5665_PWR_ADC_L1_BIT 4
1054#define RT5665_PWR_ADC_R1 (0x1 << 3)
1055#define RT5665_PWR_ADC_R1_BIT 3
1056#define RT5665_PWR_ADC_L2 (0x1 << 2)
1057#define RT5665_PWR_ADC_L2_BIT 2
1058#define RT5665_PWR_ADC_R2 (0x1 << 1)
1059#define RT5665_PWR_ADC_R2_BIT 1
1060
1061/* Power Management for Digital 2 (0x0062) */
1062#define RT5665_PWR_ADC_S1F (0x1 << 15)
1063#define RT5665_PWR_ADC_S1F_BIT 15
1064#define RT5665_PWR_ADC_S2F (0x1 << 14)
1065#define RT5665_PWR_ADC_S2F_BIT 14
1066#define RT5665_PWR_ADC_MF_L (0x1 << 13)
1067#define RT5665_PWR_ADC_MF_L_BIT 13
1068#define RT5665_PWR_ADC_MF_R (0x1 << 12)
1069#define RT5665_PWR_ADC_MF_R_BIT 12
1070#define RT5665_PWR_DAC_S2F (0x1 << 11)
1071#define RT5665_PWR_DAC_S2F_BIT 11
1072#define RT5665_PWR_DAC_S1F (0x1 << 10)
1073#define RT5665_PWR_DAC_S1F_BIT 10
1074#define RT5665_PWR_DAC_MF_L (0x1 << 9)
1075#define RT5665_PWR_DAC_MF_L_BIT 9
1076#define RT5665_PWR_DAC_MF_R (0x1 << 8)
1077#define RT5665_PWR_DAC_MF_R_BIT 8
1078#define RT5665_PWR_PDM1 (0x1 << 7)
1079#define RT5665_PWR_PDM1_BIT 7
1080
1081/* Power Management for Analog 1 (0x0063) */
1082#define RT5665_PWR_VREF1 (0x1 << 15)
1083#define RT5665_PWR_VREF1_BIT 15
1084#define RT5665_PWR_FV1 (0x1 << 14)
1085#define RT5665_PWR_FV1_BIT 14
1086#define RT5665_PWR_VREF2 (0x1 << 13)
1087#define RT5665_PWR_VREF2_BIT 13
1088#define RT5665_PWR_FV2 (0x1 << 12)
1089#define RT5665_PWR_FV2_BIT 12
1090#define RT5665_PWR_VREF3 (0x1 << 11)
1091#define RT5665_PWR_VREF3_BIT 11
1092#define RT5665_PWR_FV3 (0x1 << 10)
1093#define RT5665_PWR_FV3_BIT 10
1094#define RT5665_PWR_MB (0x1 << 9)
1095#define RT5665_PWR_MB_BIT 9
1096#define RT5665_PWR_LM (0x1 << 8)
1097#define RT5665_PWR_LM_BIT 8
1098#define RT5665_PWR_BG (0x1 << 7)
1099#define RT5665_PWR_BG_BIT 7
1100#define RT5665_PWR_MA (0x1 << 6)
1101#define RT5665_PWR_MA_BIT 6
1102#define RT5665_PWR_HA_L (0x1 << 5)
1103#define RT5665_PWR_HA_L_BIT 5
1104#define RT5665_PWR_HA_R (0x1 << 4)
1105#define RT5665_PWR_HA_R_BIT 4
1106#define RT5665_HP_DRIVER_MASK (0x3 << 2)
1107#define RT5665_HP_DRIVER_1X (0x0 << 2)
1108#define RT5665_HP_DRIVER_3X (0x1 << 2)
1109#define RT5665_HP_DRIVER_5X (0x2 << 2)
1110#define RT5665_LDO1_DVO_MASK (0x3)
1111#define RT5665_LDO1_DVO_09 (0x0)
1112#define RT5665_LDO1_DVO_10 (0x1)
1113#define RT5665_LDO1_DVO_12 (0x2)
1114#define RT5665_LDO1_DVO_14 (0x3)
1115
1116/* Power Management for Analog 2 (0x0064) */
1117#define RT5665_PWR_BST1 (0x1 << 15)
1118#define RT5665_PWR_BST1_BIT 15
1119#define RT5665_PWR_BST2 (0x1 << 14)
1120#define RT5665_PWR_BST2_BIT 14
1121#define RT5665_PWR_BST3 (0x1 << 13)
1122#define RT5665_PWR_BST3_BIT 13
1123#define RT5665_PWR_BST4 (0x1 << 12)
1124#define RT5665_PWR_BST4_BIT 12
1125#define RT5665_PWR_MB1 (0x1 << 11)
1126#define RT5665_PWR_MB1_PWR_DOWN (0x0 << 11)
1127#define RT5665_PWR_MB1_BIT 11
1128#define RT5665_PWR_MB2 (0x1 << 10)
1129#define RT5665_PWR_MB2_PWR_DOWN (0x0 << 10)
1130#define RT5665_PWR_MB2_BIT 10
1131#define RT5665_PWR_MB3 (0x1 << 9)
1132#define RT5665_PWR_MB3_BIT 9
1133#define RT5665_PWR_BST1_P (0x1 << 7)
1134#define RT5665_PWR_BST1_P_BIT 7
1135#define RT5665_PWR_BST2_P (0x1 << 6)
1136#define RT5665_PWR_BST2_P_BIT 6
1137#define RT5665_PWR_BST3_P (0x1 << 5)
1138#define RT5665_PWR_BST3_P_BIT 5
1139#define RT5665_PWR_BST4_P (0x1 << 4)
1140#define RT5665_PWR_BST4_P_BIT 4
1141#define RT5665_PWR_JD1 (0x1 << 3)
1142#define RT5665_PWR_JD1_BIT 3
1143#define RT5665_PWR_JD2 (0x1 << 2)
1144#define RT5665_PWR_JD2_BIT 2
1145#define RT5665_PWR_RM1_L (0x1 << 1)
1146#define RT5665_PWR_RM1_L_BIT 1
1147#define RT5665_PWR_RM1_R (0x1)
1148#define RT5665_PWR_RM1_R_BIT 0
1149
1150/* Power Management for Analog 3 (0x0065) */
1151#define RT5665_PWR_CBJ (0x1 << 9)
1152#define RT5665_PWR_CBJ_BIT 9
1153#define RT5665_PWR_BST_L (0x1 << 8)
1154#define RT5665_PWR_BST_L_BIT 8
1155#define RT5665_PWR_BST_R (0x1 << 7)
1156#define RT5665_PWR_BST_R_BIT 7
1157#define RT5665_PWR_PLL (0x1 << 6)
1158#define RT5665_PWR_PLL_BIT 6
1159#define RT5665_PWR_LDO2 (0x1 << 2)
1160#define RT5665_PWR_LDO2_BIT 2
1161#define RT5665_PWR_SVD (0x1 << 1)
1162#define RT5665_PWR_SVD_BIT 1
1163
1164/* Power Management for Mixer (0x0066) */
1165#define RT5665_PWR_RM2_L (0x1 << 15)
1166#define RT5665_PWR_RM2_L_BIT 15
1167#define RT5665_PWR_RM2_R (0x1 << 14)
1168#define RT5665_PWR_RM2_R_BIT 14
1169#define RT5665_PWR_OM_L (0x1 << 13)
1170#define RT5665_PWR_OM_L_BIT 13
1171#define RT5665_PWR_OM_R (0x1 << 12)
1172#define RT5665_PWR_OM_R_BIT 12
1173#define RT5665_PWR_MM (0x1 << 11)
1174#define RT5665_PWR_MM_BIT 11
1175#define RT5665_PWR_AEC_REF (0x1 << 6)
1176#define RT5665_PWR_AEC_REF_BIT 6
1177#define RT5665_PWR_STO1_DAC_L (0x1 << 5)
1178#define RT5665_PWR_STO1_DAC_L_BIT 5
1179#define RT5665_PWR_STO1_DAC_R (0x1 << 4)
1180#define RT5665_PWR_STO1_DAC_R_BIT 4
1181#define RT5665_PWR_MONO_DAC_L (0x1 << 3)
1182#define RT5665_PWR_MONO_DAC_L_BIT 3
1183#define RT5665_PWR_MONO_DAC_R (0x1 << 2)
1184#define RT5665_PWR_MONO_DAC_R_BIT 2
1185#define RT5665_PWR_STO2_DAC_L (0x1 << 1)
1186#define RT5665_PWR_STO2_DAC_L_BIT 1
1187#define RT5665_PWR_STO2_DAC_R (0x1)
1188#define RT5665_PWR_STO2_DAC_R_BIT 0
1189
1190/* Power Management for Volume (0x0067) */
1191#define RT5665_PWR_OV_L (0x1 << 13)
1192#define RT5665_PWR_OV_L_BIT 13
1193#define RT5665_PWR_OV_R (0x1 << 12)
1194#define RT5665_PWR_OV_R_BIT 12
1195#define RT5665_PWR_IN_L (0x1 << 9)
1196#define RT5665_PWR_IN_L_BIT 9
1197#define RT5665_PWR_IN_R (0x1 << 8)
1198#define RT5665_PWR_IN_R_BIT 8
1199#define RT5665_PWR_MV (0x1 << 7)
1200#define RT5665_PWR_MV_BIT 7
1201#define RT5665_PWR_MIC_DET (0x1 << 5)
1202#define RT5665_PWR_MIC_DET_BIT 5
1203
1204/* (0x006b) */
1205#define RT5665_SYS_CLK_DET 15
1206#define RT5665_HP_CLK_DET 14
1207#define RT5665_MONO_CLK_DET 13
1208#define RT5665_LOUT_CLK_DET 12
1209#define RT5665_POW_CLK_DET 0
1210
1211/* Digital Microphone Control 1 (0x006e) */
1212#define RT5665_DMIC_1_EN_MASK (0x1 << 15)
1213#define RT5665_DMIC_1_EN_SFT 15
1214#define RT5665_DMIC_1_DIS (0x0 << 15)
1215#define RT5665_DMIC_1_EN (0x1 << 15)
1216#define RT5665_DMIC_2_EN_MASK (0x1 << 14)
1217#define RT5665_DMIC_2_EN_SFT 14
1218#define RT5665_DMIC_2_DIS (0x0 << 14)
1219#define RT5665_DMIC_2_EN (0x1 << 14)
1220#define RT5665_DMIC_2_DP_MASK (0x1 << 9)
1221#define RT5665_DMIC_2_DP_SFT 9
1222#define RT5665_DMIC_2_DP_GPIO5 (0x0 << 9)
1223#define RT5665_DMIC_2_DP_IN2P (0x1 << 9)
1224#define RT5665_DMIC_CLK_MASK (0x7 << 5)
1225#define RT5665_DMIC_CLK_SFT 5
1226#define RT5665_DMIC_1_DP_MASK (0x1 << 1)
1227#define RT5665_DMIC_1_DP_SFT 1
1228#define RT5665_DMIC_1_DP_GPIO4 (0x0 << 1)
1229#define RT5665_DMIC_1_DP_IN2N (0x1 << 1)
1230
1231
1232/* Digital Microphone Control 1 (0x006f) */
1233#define RT5665_DMIC_2L_LH_MASK (0x1 << 3)
1234#define RT5665_DMIC_2L_LH_SFT 3
1235#define RT5665_DMIC_2L_LH_RISING (0x0 << 3)
1236#define RT5665_DMIC_2L_LH_FALLING (0x1 << 3)
1237#define RT5665_DMIC_2R_LH_MASK (0x1 << 2)
1238#define RT5665_DMIC_2R_LH_SFT 2
1239#define RT5665_DMIC_2R_LH_RISING (0x0 << 2)
1240#define RT5665_DMIC_2R_LH_FALLING (0x1 << 2)
1241#define RT5665_DMIC_1L_LH_MASK (0x1 << 1)
1242#define RT5665_DMIC_1L_LH_SFT 1
1243#define RT5665_DMIC_1L_LH_RISING (0x0 << 1)
1244#define RT5665_DMIC_1L_LH_FALLING (0x1 << 1)
1245#define RT5665_DMIC_1R_LH_MASK (0x1 << 0)
1246#define RT5665_DMIC_1R_LH_SFT 0
1247#define RT5665_DMIC_1R_LH_RISING (0x0)
1248#define RT5665_DMIC_1R_LH_FALLING (0x1)
1249
1250/* I2S1/2/3 Audio Serial Data Port Control (0x0070 0x0071 0x0072) */
1251#define RT5665_I2S_MS_MASK (0x1 << 15)
1252#define RT5665_I2S_MS_SFT 15
1253#define RT5665_I2S_MS_M (0x0 << 15)
1254#define RT5665_I2S_MS_S (0x1 << 15)
1255#define RT5665_I2S_PIN_CFG_MASK (0x1 << 14)
1256#define RT5665_I2S_PIN_CFG_SFT 14
1257#define RT5665_I2S_CLK_SEL_MASK (0x1 << 11)
1258#define RT5665_I2S_CLK_SEL_SFT 11
1259#define RT5665_I2S_BP_MASK (0x1 << 8)
1260#define RT5665_I2S_BP_SFT 8
1261#define RT5665_I2S_BP_NOR (0x0 << 8)
1262#define RT5665_I2S_BP_INV (0x1 << 8)
1263#define RT5665_I2S_DL_MASK (0x3 << 4)
1264#define RT5665_I2S_DL_SFT 4
1265#define RT5665_I2S_DL_16 (0x0 << 4)
1266#define RT5665_I2S_DL_20 (0x1 << 4)
1267#define RT5665_I2S_DL_24 (0x2 << 4)
1268#define RT5665_I2S_DL_8 (0x3 << 4)
1269#define RT5665_I2S_DF_MASK (0x7)
1270#define RT5665_I2S_DF_SFT 0
1271#define RT5665_I2S_DF_I2S (0x0)
1272#define RT5665_I2S_DF_LEFT (0x1)
1273#define RT5665_I2S_DF_PCM_A (0x2)
1274#define RT5665_I2S_DF_PCM_B (0x3)
1275#define RT5665_I2S_DF_PCM_A_N (0x6)
1276#define RT5665_I2S_DF_PCM_B_N (0x7)
1277
1278/* ADC/DAC Clock Control 1 (0x0073) */
1279#define RT5665_I2S_PD1_MASK (0x7 << 12)
1280#define RT5665_I2S_PD1_SFT 12
1281#define RT5665_I2S_PD1_1 (0x0 << 12)
1282#define RT5665_I2S_PD1_2 (0x1 << 12)
1283#define RT5665_I2S_PD1_3 (0x2 << 12)
1284#define RT5665_I2S_PD1_4 (0x3 << 12)
1285#define RT5665_I2S_PD1_6 (0x4 << 12)
1286#define RT5665_I2S_PD1_8 (0x5 << 12)
1287#define RT5665_I2S_PD1_12 (0x6 << 12)
1288#define RT5665_I2S_PD1_16 (0x7 << 12)
1289#define RT5665_I2S_M_PD2_MASK (0x7 << 8)
1290#define RT5665_I2S_M_PD2_SFT 8
1291#define RT5665_I2S_M_PD2_1 (0x0 << 8)
1292#define RT5665_I2S_M_PD2_2 (0x1 << 8)
1293#define RT5665_I2S_M_PD2_3 (0x2 << 8)
1294#define RT5665_I2S_M_PD2_4 (0x3 << 8)
1295#define RT5665_I2S_M_PD2_6 (0x4 << 8)
1296#define RT5665_I2S_M_PD2_8 (0x5 << 8)
1297#define RT5665_I2S_M_PD2_12 (0x6 << 8)
1298#define RT5665_I2S_M_PD2_16 (0x7 << 8)
1299#define RT5665_I2S_CLK_SRC_MASK (0x3 << 4)
1300#define RT5665_I2S_CLK_SRC_SFT 4
1301#define RT5665_I2S_CLK_SRC_MCLK (0x0 << 4)
1302#define RT5665_I2S_CLK_SRC_PLL1 (0x1 << 4)
1303#define RT5665_I2S_CLK_SRC_RCCLK (0x2 << 4)
1304#define RT5665_DAC_OSR_MASK (0x3 << 2)
1305#define RT5665_DAC_OSR_SFT 2
1306#define RT5665_DAC_OSR_128 (0x0 << 2)
1307#define RT5665_DAC_OSR_64 (0x1 << 2)
1308#define RT5665_DAC_OSR_32 (0x2 << 2)
1309#define RT5665_ADC_OSR_MASK (0x3)
1310#define RT5665_ADC_OSR_SFT 0
1311#define RT5665_ADC_OSR_128 (0x0)
1312#define RT5665_ADC_OSR_64 (0x1)
1313#define RT5665_ADC_OSR_32 (0x2)
1314
1315/* ADC/DAC Clock Control 2 (0x0074) */
1316#define RT5665_I2S_BCLK_MS2_MASK (0x1 << 15)
1317#define RT5665_I2S_BCLK_MS2_SFT 15
1318#define RT5665_I2S_BCLK_MS2_32 (0x0 << 15)
1319#define RT5665_I2S_BCLK_MS2_64 (0x1 << 15)
1320#define RT5665_I2S_PD2_MASK (0x7 << 12)
1321#define RT5665_I2S_PD2_SFT 12
1322#define RT5665_I2S_PD2_1 (0x0 << 12)
1323#define RT5665_I2S_PD2_2 (0x1 << 12)
1324#define RT5665_I2S_PD2_3 (0x2 << 12)
1325#define RT5665_I2S_PD2_4 (0x3 << 12)
1326#define RT5665_I2S_PD2_6 (0x4 << 12)
1327#define RT5665_I2S_PD2_8 (0x5 << 12)
1328#define RT5665_I2S_PD2_12 (0x6 << 12)
1329#define RT5665_I2S_PD2_16 (0x7 << 12)
1330#define RT5665_I2S_BCLK_MS3_MASK (0x1 << 11)
1331#define RT5665_I2S_BCLK_MS3_SFT 11
1332#define RT5665_I2S_BCLK_MS3_32 (0x0 << 11)
1333#define RT5665_I2S_BCLK_MS3_64 (0x1 << 11)
1334#define RT5665_I2S_PD3_MASK (0x7 << 8)
1335#define RT5665_I2S_PD3_SFT 8
1336#define RT5665_I2S_PD3_1 (0x0 << 8)
1337#define RT5665_I2S_PD3_2 (0x1 << 8)
1338#define RT5665_I2S_PD3_3 (0x2 << 8)
1339#define RT5665_I2S_PD3_4 (0x3 << 8)
1340#define RT5665_I2S_PD3_6 (0x4 << 8)
1341#define RT5665_I2S_PD3_8 (0x5 << 8)
1342#define RT5665_I2S_PD3_12 (0x6 << 8)
1343#define RT5665_I2S_PD3_16 (0x7 << 8)
1344#define RT5665_I2S_PD4_MASK (0x7 << 4)
1345#define RT5665_I2S_PD4_SFT 4
1346#define RT5665_I2S_PD4_1 (0x0 << 4)
1347#define RT5665_I2S_PD4_2 (0x1 << 4)
1348#define RT5665_I2S_PD4_3 (0x2 << 4)
1349#define RT5665_I2S_PD4_4 (0x3 << 4)
1350#define RT5665_I2S_PD4_6 (0x4 << 4)
1351#define RT5665_I2S_PD4_8 (0x5 << 4)
1352#define RT5665_I2S_PD4_12 (0x6 << 4)
1353#define RT5665_I2S_PD4_16 (0x7 << 4)
1354
1355/* TDM control 1 (0x0078) */
1356#define RT5665_I2S1_MODE_MASK (0x1 << 15)
1357#define RT5665_I2S1_MODE_I2S (0x0 << 15)
1358#define RT5665_I2S1_MODE_TDM (0x1 << 15)
1359#define RT5665_TDM_IN_CH_MASK (0x3 << 10)
1360#define RT5665_TDM_IN_CH_2 (0x0 << 10)
1361#define RT5665_TDM_IN_CH_4 (0x1 << 10)
1362#define RT5665_TDM_IN_CH_6 (0x2 << 10)
1363#define RT5665_TDM_IN_CH_8 (0x3 << 10)
1364#define RT5665_TDM_OUT_CH_MASK (0x3 << 8)
1365#define RT5665_TDM_OUT_CH_2 (0x0 << 8)
1366#define RT5665_TDM_OUT_CH_4 (0x1 << 8)
1367#define RT5665_TDM_OUT_CH_6 (0x2 << 8)
1368#define RT5665_TDM_OUT_CH_8 (0x3 << 8)
1369#define RT5665_TDM_IN_LEN_MASK (0x3 << 6)
1370#define RT5665_TDM_IN_LEN_16 (0x0 << 6)
1371#define RT5665_TDM_IN_LEN_20 (0x1 << 6)
1372#define RT5665_TDM_IN_LEN_24 (0x2 << 6)
1373#define RT5665_TDM_IN_LEN_32 (0x3 << 6)
1374#define RT5665_TDM_OUT_LEN_MASK (0x3 << 4)
1375#define RT5665_TDM_OUT_LEN_16 (0x0 << 4)
1376#define RT5665_TDM_OUT_LEN_20 (0x1 << 4)
1377#define RT5665_TDM_OUT_LEN_24 (0x2 << 4)
1378#define RT5665_TDM_OUT_LEN_32 (0x3 << 4)
1379
1380
1381/* TDM control 2 (0x0079) */
1382#define RT5665_I2S1_1_DS_ADC_SLOT01_SFT 14
1383#define RT5665_I2S1_1_DS_ADC_SLOT23_SFT 12
1384#define RT5665_I2S1_1_DS_ADC_SLOT45_SFT 10
1385#define RT5665_I2S1_1_DS_ADC_SLOT67_SFT 8
1386#define RT5665_I2S1_2_DS_ADC_SLOT01_SFT 6
1387#define RT5665_I2S1_2_DS_ADC_SLOT23_SFT 4
1388#define RT5665_I2S1_2_DS_ADC_SLOT45_SFT 2
1389#define RT5665_I2S1_2_DS_ADC_SLOT67_SFT 0
1390
1391/* TDM control 3/4 (0x007a) (0x007b) */
1392#define RT5665_IF1_ADC1_SEL_SFT 10
1393#define RT5665_IF1_ADC2_SEL_SFT 9
1394#define RT5665_IF1_ADC3_SEL_SFT 8
1395#define RT5665_IF1_ADC4_SEL_SFT 7
1396#define RT5665_TDM_ADC_SEL_SFT 0
1397#define RT5665_TDM_ADC_CTRL_MASK (0x1f << 0)
1398#define RT5665_TDM_ADC_DATA_06 (0x6 << 0)
1399
1400/* Global Clock Control (0x0080) */
1401#define RT5665_SCLK_SRC_MASK (0x3 << 14)
1402#define RT5665_SCLK_SRC_SFT 14
1403#define RT5665_SCLK_SRC_MCLK (0x0 << 14)
1404#define RT5665_SCLK_SRC_PLL1 (0x1 << 14)
1405#define RT5665_SCLK_SRC_RCCLK (0x2 << 14)
1406#define RT5665_PLL1_SRC_MASK (0x7 << 8)
1407#define RT5665_PLL1_SRC_SFT 8
1408#define RT5665_PLL1_SRC_MCLK (0x0 << 8)
1409#define RT5665_PLL1_SRC_BCLK1 (0x1 << 8)
1410#define RT5665_PLL1_SRC_BCLK2 (0x2 << 8)
1411#define RT5665_PLL1_SRC_BCLK3 (0x3 << 8)
1412#define RT5665_PLL1_PD_MASK (0x7 << 4)
1413#define RT5665_PLL1_PD_SFT 4
1414
1415
1416#define RT5665_PLL_INP_MAX 40000000
1417#define RT5665_PLL_INP_MIN 256000
1418/* PLL M/N/K Code Control 1 (0x0081) */
1419#define RT5665_PLL_N_MAX 0x001ff
1420#define RT5665_PLL_N_MASK (RT5665_PLL_N_MAX << 7)
1421#define RT5665_PLL_N_SFT 7
1422#define RT5665_PLL_K_MAX 0x001f
1423#define RT5665_PLL_K_MASK (RT5665_PLL_K_MAX)
1424#define RT5665_PLL_K_SFT 0
1425
1426/* PLL M/N/K Code Control 2 (0x0082) */
1427#define RT5665_PLL_M_MAX 0x00f
1428#define RT5665_PLL_M_MASK (RT5665_PLL_M_MAX << 12)
1429#define RT5665_PLL_M_SFT 12
1430#define RT5665_PLL_M_BP (0x1 << 11)
1431#define RT5665_PLL_M_BP_SFT 11
1432#define RT5665_PLL_K_BP (0x1 << 10)
1433#define RT5665_PLL_K_BP_SFT 10
1434
1435/* PLL tracking mode 1 (0x0083) */
1436#define RT5665_I2S3_ASRC_MASK (0x1 << 15)
1437#define RT5665_I2S3_ASRC_SFT 15
1438#define RT5665_I2S2_ASRC_MASK (0x1 << 14)
1439#define RT5665_I2S2_ASRC_SFT 14
1440#define RT5665_I2S1_ASRC_MASK (0x1 << 13)
1441#define RT5665_I2S1_ASRC_SFT 13
1442#define RT5665_DAC_STO1_ASRC_MASK (0x1 << 12)
1443#define RT5665_DAC_STO1_ASRC_SFT 12
1444#define RT5665_DAC_STO2_ASRC_MASK (0x1 << 11)
1445#define RT5665_DAC_STO2_ASRC_SFT 11
1446#define RT5665_DAC_MONO_L_ASRC_MASK (0x1 << 10)
1447#define RT5665_DAC_MONO_L_ASRC_SFT 10
1448#define RT5665_DAC_MONO_R_ASRC_MASK (0x1 << 9)
1449#define RT5665_DAC_MONO_R_ASRC_SFT 9
1450#define RT5665_DMIC_STO1_ASRC_MASK (0x1 << 8)
1451#define RT5665_DMIC_STO1_ASRC_SFT 8
1452#define RT5665_DMIC_STO2_ASRC_MASK (0x1 << 7)
1453#define RT5665_DMIC_STO2_ASRC_SFT 7
1454#define RT5665_DMIC_MONO_L_ASRC_MASK (0x1 << 6)
1455#define RT5665_DMIC_MONO_L_ASRC_SFT 6
1456#define RT5665_DMIC_MONO_R_ASRC_MASK (0x1 << 5)
1457#define RT5665_DMIC_MONO_R_ASRC_SFT 5
1458#define RT5665_ADC_STO1_ASRC_MASK (0x1 << 4)
1459#define RT5665_ADC_STO1_ASRC_SFT 4
1460#define RT5665_ADC_STO2_ASRC_MASK (0x1 << 3)
1461#define RT5665_ADC_STO2_ASRC_SFT 3
1462#define RT5665_ADC_MONO_L_ASRC_MASK (0x1 << 2)
1463#define RT5665_ADC_MONO_L_ASRC_SFT 2
1464#define RT5665_ADC_MONO_R_ASRC_MASK (0x1 << 1)
1465#define RT5665_ADC_MONO_R_ASRC_SFT 1
1466
1467/* PLL tracking mode 2 (0x0084)*/
1468#define RT5665_DA_STO1_CLK_SEL_MASK (0x7 << 12)
1469#define RT5665_DA_STO1_CLK_SEL_SFT 12
1470#define RT5665_DA_STO2_CLK_SEL_MASK (0x7 << 8)
1471#define RT5665_DA_STO2_CLK_SEL_SFT 8
1472#define RT5665_DA_MONOL_CLK_SEL_MASK (0x7 << 4)
1473#define RT5665_DA_MONOL_CLK_SEL_SFT 4
1474#define RT5665_DA_MONOR_CLK_SEL_MASK (0x7)
1475#define RT5665_DA_MONOR_CLK_SEL_SFT 0
1476
1477/* PLL tracking mode 3 (0x0085)*/
1478#define RT5665_AD_STO1_CLK_SEL_MASK (0x7 << 12)
1479#define RT5665_AD_STO1_CLK_SEL_SFT 12
1480#define RT5665_AD_STO2_CLK_SEL_MASK (0x7 << 8)
1481#define RT5665_AD_STO2_CLK_SEL_SFT 8
1482#define RT5665_AD_MONOL_CLK_SEL_MASK (0x7 << 4)
1483#define RT5665_AD_MONOL_CLK_SEL_SFT 4
1484#define RT5665_AD_MONOR_CLK_SEL_MASK (0x7)
1485#define RT5665_AD_MONOR_CLK_SEL_SFT 0
1486
1487/* ASRC Control 4 (0x0086) */
1488#define RT5665_I2S1_RATE_MASK (0xf << 12)
1489#define RT5665_I2S1_RATE_SFT 12
1490#define RT5665_I2S2_RATE_MASK (0xf << 8)
1491#define RT5665_I2S2_RATE_SFT 8
1492#define RT5665_I2S3_RATE_MASK (0xf << 4)
1493#define RT5665_I2S3_RATE_SFT 4
1494
1495/* Depop Mode Control 1 (0x008e) */
1496#define RT5665_PUMP_EN (0x1 << 3)
1497
1498/* Depop Mode Control 2 (0x8f) */
1499#define RT5665_DEPOP_MASK (0x1 << 13)
1500#define RT5665_DEPOP_SFT 13
1501#define RT5665_DEPOP_AUTO (0x0 << 13)
1502#define RT5665_DEPOP_MAN (0x1 << 13)
1503#define RT5665_RAMP_MASK (0x1 << 12)
1504#define RT5665_RAMP_SFT 12
1505#define RT5665_RAMP_DIS (0x0 << 12)
1506#define RT5665_RAMP_EN (0x1 << 12)
1507#define RT5665_BPS_MASK (0x1 << 11)
1508#define RT5665_BPS_SFT 11
1509#define RT5665_BPS_DIS (0x0 << 11)
1510#define RT5665_BPS_EN (0x1 << 11)
1511#define RT5665_FAST_UPDN_MASK (0x1 << 10)
1512#define RT5665_FAST_UPDN_SFT 10
1513#define RT5665_FAST_UPDN_DIS (0x0 << 10)
1514#define RT5665_FAST_UPDN_EN (0x1 << 10)
1515#define RT5665_MRES_MASK (0x3 << 8)
1516#define RT5665_MRES_SFT 8
1517#define RT5665_MRES_15MO (0x0 << 8)
1518#define RT5665_MRES_25MO (0x1 << 8)
1519#define RT5665_MRES_35MO (0x2 << 8)
1520#define RT5665_MRES_45MO (0x3 << 8)
1521#define RT5665_VLO_MASK (0x1 << 7)
1522#define RT5665_VLO_SFT 7
1523#define RT5665_VLO_3V (0x0 << 7)
1524#define RT5665_VLO_32V (0x1 << 7)
1525#define RT5665_DIG_DP_MASK (0x1 << 6)
1526#define RT5665_DIG_DP_SFT 6
1527#define RT5665_DIG_DP_DIS (0x0 << 6)
1528#define RT5665_DIG_DP_EN (0x1 << 6)
1529#define RT5665_DP_TH_MASK (0x3 << 4)
1530#define RT5665_DP_TH_SFT 4
1531
1532/* Depop Mode Control 3 (0x90) */
1533#define RT5665_CP_SYS_MASK (0x7 << 12)
1534#define RT5665_CP_SYS_SFT 12
1535#define RT5665_CP_FQ1_MASK (0x7 << 8)
1536#define RT5665_CP_FQ1_SFT 8
1537#define RT5665_CP_FQ2_MASK (0x7 << 4)
1538#define RT5665_CP_FQ2_SFT 4
1539#define RT5665_CP_FQ3_MASK (0x7)
1540#define RT5665_CP_FQ3_SFT 0
1541#define RT5665_CP_FQ_1_5_KHZ 0
1542#define RT5665_CP_FQ_3_KHZ 1
1543#define RT5665_CP_FQ_6_KHZ 2
1544#define RT5665_CP_FQ_12_KHZ 3
1545#define RT5665_CP_FQ_24_KHZ 4
1546#define RT5665_CP_FQ_48_KHZ 5
1547#define RT5665_CP_FQ_96_KHZ 6
1548#define RT5665_CP_FQ_192_KHZ 7
1549
1550/* HPOUT charge pump 1 (0x0091) */
1551#define RT5665_OSW_L_MASK (0x1 << 11)
1552#define RT5665_OSW_L_SFT 11
1553#define RT5665_OSW_L_DIS (0x0 << 11)
1554#define RT5665_OSW_L_EN (0x1 << 11)
1555#define RT5665_OSW_R_MASK (0x1 << 10)
1556#define RT5665_OSW_R_SFT 10
1557#define RT5665_OSW_R_DIS (0x0 << 10)
1558#define RT5665_OSW_R_EN (0x1 << 10)
1559#define RT5665_PM_HP_MASK (0x3 << 8)
1560#define RT5665_PM_HP_SFT 8
1561#define RT5665_PM_HP_LV (0x0 << 8)
1562#define RT5665_PM_HP_MV (0x1 << 8)
1563#define RT5665_PM_HP_HV (0x2 << 8)
1564#define RT5665_IB_HP_MASK (0x3 << 6)
1565#define RT5665_IB_HP_SFT 6
1566#define RT5665_IB_HP_125IL (0x0 << 6)
1567#define RT5665_IB_HP_25IL (0x1 << 6)
1568#define RT5665_IB_HP_5IL (0x2 << 6)
1569#define RT5665_IB_HP_1IL (0x3 << 6)
1570
1571/* PV detection and SPK gain control (0x92) */
1572#define RT5665_PVDD_DET_MASK (0x1 << 15)
1573#define RT5665_PVDD_DET_SFT 15
1574#define RT5665_PVDD_DET_DIS (0x0 << 15)
1575#define RT5665_PVDD_DET_EN (0x1 << 15)
1576#define RT5665_SPK_AG_MASK (0x1 << 14)
1577#define RT5665_SPK_AG_SFT 14
1578#define RT5665_SPK_AG_DIS (0x0 << 14)
1579#define RT5665_SPK_AG_EN (0x1 << 14)
1580
1581/* Micbias Control1 (0x93) */
1582#define RT5665_MIC1_BS_MASK (0x1 << 15)
1583#define RT5665_MIC1_BS_SFT 15
1584#define RT5665_MIC1_BS_9AV (0x0 << 15)
1585#define RT5665_MIC1_BS_75AV (0x1 << 15)
1586#define RT5665_MIC2_BS_MASK (0x1 << 14)
1587#define RT5665_MIC2_BS_SFT 14
1588#define RT5665_MIC2_BS_9AV (0x0 << 14)
1589#define RT5665_MIC2_BS_75AV (0x1 << 14)
1590#define RT5665_MIC1_CLK_MASK (0x1 << 13)
1591#define RT5665_MIC1_CLK_SFT 13
1592#define RT5665_MIC1_CLK_DIS (0x0 << 13)
1593#define RT5665_MIC1_CLK_EN (0x1 << 13)
1594#define RT5665_MIC2_CLK_MASK (0x1 << 12)
1595#define RT5665_MIC2_CLK_SFT 12
1596#define RT5665_MIC2_CLK_DIS (0x0 << 12)
1597#define RT5665_MIC2_CLK_EN (0x1 << 12)
1598#define RT5665_MIC1_OVCD_MASK (0x1 << 11)
1599#define RT5665_MIC1_OVCD_SFT 11
1600#define RT5665_MIC1_OVCD_DIS (0x0 << 11)
1601#define RT5665_MIC1_OVCD_EN (0x1 << 11)
1602#define RT5665_MIC1_OVTH_MASK (0x3 << 9)
1603#define RT5665_MIC1_OVTH_SFT 9
1604#define RT5665_MIC1_OVTH_600UA (0x0 << 9)
1605#define RT5665_MIC1_OVTH_1500UA (0x1 << 9)
1606#define RT5665_MIC1_OVTH_2000UA (0x2 << 9)
1607#define RT5665_MIC2_OVCD_MASK (0x1 << 8)
1608#define RT5665_MIC2_OVCD_SFT 8
1609#define RT5665_MIC2_OVCD_DIS (0x0 << 8)
1610#define RT5665_MIC2_OVCD_EN (0x1 << 8)
1611#define RT5665_MIC2_OVTH_MASK (0x3 << 6)
1612#define RT5665_MIC2_OVTH_SFT 6
1613#define RT5665_MIC2_OVTH_600UA (0x0 << 6)
1614#define RT5665_MIC2_OVTH_1500UA (0x1 << 6)
1615#define RT5665_MIC2_OVTH_2000UA (0x2 << 6)
1616#define RT5665_PWR_MB_MASK (0x1 << 5)
1617#define RT5665_PWR_MB_SFT 5
1618#define RT5665_PWR_MB_PD (0x0 << 5)
1619#define RT5665_PWR_MB_PU (0x1 << 5)
1620
1621/* Micbias Control2 (0x94) */
1622#define RT5665_PWR_CLK25M_MASK (0x1 << 9)
1623#define RT5665_PWR_CLK25M_SFT 9
1624#define RT5665_PWR_CLK25M_PD (0x0 << 9)
1625#define RT5665_PWR_CLK25M_PU (0x1 << 9)
1626#define RT5665_PWR_CLK1M_MASK (0x1 << 8)
1627#define RT5665_PWR_CLK1M_SFT 8
1628#define RT5665_PWR_CLK1M_PD (0x0 << 8)
1629#define RT5665_PWR_CLK1M_PU (0x1 << 8)
1630
1631
1632/* EQ Control 1 (0x00b0) */
1633#define RT5665_EQ_SRC_DAC (0x0 << 15)
1634#define RT5665_EQ_SRC_ADC (0x1 << 15)
1635#define RT5665_EQ_UPD (0x1 << 14)
1636#define RT5665_EQ_UPD_BIT 14
1637#define RT5665_EQ_CD_MASK (0x1 << 13)
1638#define RT5665_EQ_CD_SFT 13
1639#define RT5665_EQ_CD_DIS (0x0 << 13)
1640#define RT5665_EQ_CD_EN (0x1 << 13)
1641#define RT5665_EQ_DITH_MASK (0x3 << 8)
1642#define RT5665_EQ_DITH_SFT 8
1643#define RT5665_EQ_DITH_NOR (0x0 << 8)
1644#define RT5665_EQ_DITH_LSB (0x1 << 8)
1645#define RT5665_EQ_DITH_LSB_1 (0x2 << 8)
1646#define RT5665_EQ_DITH_LSB_2 (0x3 << 8)
1647
1648/* IRQ Control 1 (0x00b7) */
1649#define RT5665_JD1_1_EN_MASK (0x1 << 15)
1650#define RT5665_JD1_1_EN_SFT 15
1651#define RT5665_JD1_1_DIS (0x0 << 15)
1652#define RT5665_JD1_1_EN (0x1 << 15)
1653#define RT5665_JD1_2_EN_MASK (0x1 << 12)
1654#define RT5665_JD1_2_EN_SFT 12
1655#define RT5665_JD1_2_DIS (0x0 << 12)
1656#define RT5665_JD1_2_EN (0x1 << 12)
1657
1658/* IRQ Control 2 (0x00b8) */
1659#define RT5665_IL_IRQ_MASK (0x1 << 6)
1660#define RT5665_IL_IRQ_DIS (0x0 << 6)
1661#define RT5665_IL_IRQ_EN (0x1 << 6)
1662
1663/* IRQ Control 5 (0x00ba) */
1664#define RT5665_IRQ_JD_EN (0x1 << 3)
1665#define RT5665_IRQ_JD_EN_SFT 3
1666
1667/* GPIO Control 1 (0x00c0) */
1668#define RT5665_GP1_PIN_MASK (0x1 << 15)
1669#define RT5665_GP1_PIN_SFT 15
1670#define RT5665_GP1_PIN_GPIO1 (0x0 << 15)
1671#define RT5665_GP1_PIN_IRQ (0x1 << 15)
1672#define RT5665_GP2_PIN_MASK (0x3 << 13)
1673#define RT5665_GP2_PIN_SFT 13
1674#define RT5665_GP2_PIN_GPIO2 (0x0 << 13)
1675#define RT5665_GP2_PIN_BCLK2 (0x1 << 13)
1676#define RT5665_GP2_PIN_PDM_SCL (0x2 << 13)
1677#define RT5665_GP3_PIN_MASK (0x3 << 11)
1678#define RT5665_GP3_PIN_SFT 11
1679#define RT5665_GP3_PIN_GPIO3 (0x0 << 11)
1680#define RT5665_GP3_PIN_LRCK2 (0x1 << 11)
1681#define RT5665_GP3_PIN_PDM_SDA (0x2 << 11)
1682#define RT5665_GP4_PIN_MASK (0x3 << 9)
1683#define RT5665_GP4_PIN_SFT 9
1684#define RT5665_GP4_PIN_GPIO4 (0x0 << 9)
1685#define RT5665_GP4_PIN_DACDAT2_1 (0x1 << 9)
1686#define RT5665_GP4_PIN_DMIC1_SDA (0x2 << 9)
1687#define RT5665_GP5_PIN_MASK (0x3 << 7)
1688#define RT5665_GP5_PIN_SFT 7
1689#define RT5665_GP5_PIN_GPIO5 (0x0 << 7)
1690#define RT5665_GP5_PIN_ADCDAT2_1 (0x1 << 7)
1691#define RT5665_GP5_PIN_DMIC2_SDA (0x2 << 7)
1692#define RT5665_GP6_PIN_MASK (0x3 << 5)
1693#define RT5665_GP6_PIN_SFT 5
1694#define RT5665_GP6_PIN_GPIO6 (0x0 << 5)
1695#define RT5665_GP6_PIN_BCLK3 (0x0 << 5)
1696#define RT5665_GP6_PIN_PDM_SCL (0x1 << 5)
1697#define RT5665_GP7_PIN_MASK (0x3 << 3)
1698#define RT5665_GP7_PIN_SFT 3
1699#define RT5665_GP7_PIN_GPIO7 (0x0 << 3)
1700#define RT5665_GP7_PIN_LRCK3 (0x1 << 3)
1701#define RT5665_GP7_PIN_PDM_SDA (0x2 << 3)
1702#define RT5665_GP8_PIN_MASK (0x3 << 1)
1703#define RT5665_GP8_PIN_SFT 1
1704#define RT5665_GP8_PIN_GPIO8 (0x0 << 1)
1705#define RT5665_GP8_PIN_DACDAT3 (0x1 << 1)
1706#define RT5665_GP8_PIN_DMIC2_SCL (0x2 << 1)
1707#define RT5665_GP8_PIN_DACDAT2_2 (0x3 << 1)
1708
1709
1710/* GPIO Control 2 (0x00c1)*/
1711#define RT5665_GP9_PIN_MASK (0x3 << 14)
1712#define RT5665_GP9_PIN_SFT 14
1713#define RT5665_GP9_PIN_GPIO9 (0x0 << 14)
1714#define RT5665_GP9_PIN_ADCDAT3 (0x1 << 14)
1715#define RT5665_GP9_PIN_DMIC1_SCL (0x2 << 14)
1716#define RT5665_GP9_PIN_ADCDAT2_2 (0x3 << 14)
1717#define RT5665_GP10_PIN_MASK (0x3 << 12)
1718#define RT5665_GP10_PIN_SFT 12
1719#define RT5665_GP10_PIN_GPIO10 (0x0 << 12)
1720#define RT5665_GP10_PIN_ADCDAT1_2 (0x1 << 12)
1721#define RT5665_GP10_PIN_LPD (0x2 << 12)
1722#define RT5665_GP1_PF_MASK (0x1 << 11)
1723#define RT5665_GP1_PF_IN (0x0 << 11)
1724#define RT5665_GP1_PF_OUT (0x1 << 11)
1725#define RT5665_GP1_OUT_MASK (0x1 << 10)
1726#define RT5665_GP1_OUT_H (0x0 << 10)
1727#define RT5665_GP1_OUT_L (0x1 << 10)
1728#define RT5665_GP2_PF_MASK (0x1 << 9)
1729#define RT5665_GP2_PF_IN (0x0 << 9)
1730#define RT5665_GP2_PF_OUT (0x1 << 9)
1731#define RT5665_GP2_OUT_MASK (0x1 << 8)
1732#define RT5665_GP2_OUT_H (0x0 << 8)
1733#define RT5665_GP2_OUT_L (0x1 << 8)
1734#define RT5665_GP3_PF_MASK (0x1 << 7)
1735#define RT5665_GP3_PF_IN (0x0 << 7)
1736#define RT5665_GP3_PF_OUT (0x1 << 7)
1737#define RT5665_GP3_OUT_MASK (0x1 << 6)
1738#define RT5665_GP3_OUT_H (0x0 << 6)
1739#define RT5665_GP3_OUT_L (0x1 << 6)
1740#define RT5665_GP4_PF_MASK (0x1 << 5)
1741#define RT5665_GP4_PF_IN (0x0 << 5)
1742#define RT5665_GP4_PF_OUT (0x1 << 5)
1743#define RT5665_GP4_OUT_MASK (0x1 << 4)
1744#define RT5665_GP4_OUT_H (0x0 << 4)
1745#define RT5665_GP4_OUT_L (0x1 << 4)
1746#define RT5665_GP5_PF_MASK (0x1 << 3)
1747#define RT5665_GP5_PF_IN (0x0 << 3)
1748#define RT5665_GP5_PF_OUT (0x1 << 3)
1749#define RT5665_GP5_OUT_MASK (0x1 << 2)
1750#define RT5665_GP5_OUT_H (0x0 << 2)
1751#define RT5665_GP5_OUT_L (0x1 << 2)
1752#define RT5665_GP6_PF_MASK (0x1 << 1)
1753#define RT5665_GP6_PF_IN (0x0 << 1)
1754#define RT5665_GP6_PF_OUT (0x1 << 1)
1755#define RT5665_GP6_OUT_MASK (0x1)
1756#define RT5665_GP6_OUT_H (0x0)
1757#define RT5665_GP6_OUT_L (0x1)
1758
1759
1760/* GPIO Control 3 (0x00c2) */
1761#define RT5665_GP7_PF_MASK (0x1 << 15)
1762#define RT5665_GP7_PF_IN (0x0 << 15)
1763#define RT5665_GP7_PF_OUT (0x1 << 15)
1764#define RT5665_GP7_OUT_MASK (0x1 << 14)
1765#define RT5665_GP7_OUT_H (0x0 << 14)
1766#define RT5665_GP7_OUT_L (0x1 << 14)
1767#define RT5665_GP8_PF_MASK (0x1 << 13)
1768#define RT5665_GP8_PF_IN (0x0 << 13)
1769#define RT5665_GP8_PF_OUT (0x1 << 13)
1770#define RT5665_GP8_OUT_MASK (0x1 << 12)
1771#define RT5665_GP8_OUT_H (0x0 << 12)
1772#define RT5665_GP8_OUT_L (0x1 << 12)
1773#define RT5665_GP9_PF_MASK (0x1 << 11)
1774#define RT5665_GP9_PF_IN (0x0 << 11)
1775#define RT5665_GP9_PF_OUT (0x1 << 11)
1776#define RT5665_GP9_OUT_MASK (0x1 << 10)
1777#define RT5665_GP9_OUT_H (0x0 << 10)
1778#define RT5665_GP9_OUT_L (0x1 << 10)
1779#define RT5665_GP10_PF_MASK (0x1 << 9)
1780#define RT5665_GP10_PF_IN (0x0 << 9)
1781#define RT5665_GP10_PF_OUT (0x1 << 9)
1782#define RT5665_GP10_OUT_MASK (0x1 << 8)
1783#define RT5665_GP10_OUT_H (0x0 << 8)
1784#define RT5665_GP10_OUT_L (0x1 << 8)
1785#define RT5665_GP11_PF_MASK (0x1 << 7)
1786#define RT5665_GP11_PF_IN (0x0 << 7)
1787#define RT5665_GP11_PF_OUT (0x1 << 7)
1788#define RT5665_GP11_OUT_MASK (0x1 << 6)
1789#define RT5665_GP11_OUT_H (0x0 << 6)
1790#define RT5665_GP11_OUT_L (0x1 << 6)
1791
1792/* Soft volume and zero cross control 1 (0x00d9) */
1793#define RT5665_SV_MASK (0x1 << 15)
1794#define RT5665_SV_SFT 15
1795#define RT5665_SV_DIS (0x0 << 15)
1796#define RT5665_SV_EN (0x1 << 15)
1797#define RT5665_OUT_SV_MASK (0x1 << 13)
1798#define RT5665_OUT_SV_SFT 13
1799#define RT5665_OUT_SV_DIS (0x0 << 13)
1800#define RT5665_OUT_SV_EN (0x1 << 13)
1801#define RT5665_HP_SV_MASK (0x1 << 12)
1802#define RT5665_HP_SV_SFT 12
1803#define RT5665_HP_SV_DIS (0x0 << 12)
1804#define RT5665_HP_SV_EN (0x1 << 12)
1805#define RT5665_ZCD_DIG_MASK (0x1 << 11)
1806#define RT5665_ZCD_DIG_SFT 11
1807#define RT5665_ZCD_DIG_DIS (0x0 << 11)
1808#define RT5665_ZCD_DIG_EN (0x1 << 11)
1809#define RT5665_ZCD_MASK (0x1 << 10)
1810#define RT5665_ZCD_SFT 10
1811#define RT5665_ZCD_PD (0x0 << 10)
1812#define RT5665_ZCD_PU (0x1 << 10)
1813#define RT5665_SV_DLY_MASK (0xf)
1814#define RT5665_SV_DLY_SFT 0
1815
1816/* Soft volume and zero cross control 2 (0x00da) */
1817#define RT5665_ZCD_HP_MASK (0x1 << 15)
1818#define RT5665_ZCD_HP_SFT 15
1819#define RT5665_ZCD_HP_DIS (0x0 << 15)
1820#define RT5665_ZCD_HP_EN (0x1 << 15)
1821
1822/* 4 Button Inline Command Control 2 (0x00e0) */
1823#define RT5665_4BTN_IL_MASK (0x1 << 15)
1824#define RT5665_4BTN_IL_EN (0x1 << 15)
1825#define RT5665_4BTN_IL_DIS (0x0 << 15)
1826#define RT5665_4BTN_IL_RST_MASK (0x1 << 14)
1827#define RT5665_4BTN_IL_NOR (0x1 << 14)
1828#define RT5665_4BTN_IL_RST (0x0 << 14)
1829
1830/* Analog JD Control 1 (0x00f0) */
1831#define RT5665_JD1_MODE_MASK (0x3 << 0)
1832#define RT5665_JD1_MODE_0 (0x0 << 0)
1833#define RT5665_JD1_MODE_1 (0x1 << 0)
1834#define RT5665_JD1_MODE_2 (0x2 << 0)
1835
1836/* Jack Detect Control 3 (0x00f8) */
1837#define RT5665_JD_TRI_HPO_SEL_MASK (0x7)
1838#define RT5665_JD_TRI_HPO_SEL_SFT (0)
1839#define RT5665_JD_HPO_GPIO_JD1 (0x0)
1840#define RT5665_JD_HPO_JD1_1 (0x1)
1841#define RT5665_JD_HPO_JD1_2 (0x2)
1842#define RT5665_JD_HPO_JD2 (0x3)
1843#define RT5665_JD_HPO_GPIO_JD2 (0x4)
1844#define RT5665_JD_HPO_JD3 (0x5)
1845#define RT5665_JD_HPO_JD_D (0x6)
1846
1847/* Digital Misc Control (0x00fa) */
1848#define RT5665_AM_MASK (0x1 << 7)
1849#define RT5665_AM_EN (0x1 << 7)
1850#define RT5665_AM_DIS (0x1 << 7)
1851#define RT5665_DIG_GATE_CTRL 0x1
1852#define RT5665_DIG_GATE_CTRL_SFT (0)
1853
1854/* Chopper and Clock control for ADC (0x011c)*/
1855#define RT5665_M_RF_DIG_MASK (0x1 << 12)
1856#define RT5665_M_RF_DIG_SFT 12
1857#define RT5665_M_RI_DIG (0x1 << 11)
1858
1859/* Chopper and Clock control for DAC (0x013a)*/
1860#define RT5665_CKXEN_DAC1_MASK (0x1 << 13)
1861#define RT5665_CKXEN_DAC1_SFT 13
1862#define RT5665_CKGEN_DAC1_MASK (0x1 << 12)
1863#define RT5665_CKGEN_DAC1_SFT 12
1864#define RT5665_CKXEN_DAC2_MASK (0x1 << 5)
1865#define RT5665_CKXEN_DAC2_SFT 5
1866#define RT5665_CKGEN_DAC2_MASK (0x1 << 4)
1867#define RT5665_CKGEN_DAC2_SFT 4
1868
1869/* Chopper and Clock control for ADC (0x013b)*/
1870#define RT5665_CKXEN_ADC1_MASK (0x1 << 13)
1871#define RT5665_CKXEN_ADC1_SFT 13
1872#define RT5665_CKGEN_ADC1_MASK (0x1 << 12)
1873#define RT5665_CKGEN_ADC1_SFT 12
1874#define RT5665_CKXEN_ADC2_MASK (0x1 << 5)
1875#define RT5665_CKXEN_ADC2_SFT 5
1876#define RT5665_CKGEN_ADC2_MASK (0x1 << 4)
1877#define RT5665_CKGEN_ADC2_SFT 4
1878
1879/* Volume test (0x013f)*/
1880#define RT5665_SEL_CLK_VOL_MASK (0x1 << 15)
1881#define RT5665_SEL_CLK_VOL_EN (0x1 << 15)
1882#define RT5665_SEL_CLK_VOL_DIS (0x0 << 15)
1883
1884/* Test Mode Control 1 (0x0145) */
1885#define RT5665_AD2DA_LB_MASK (0x1 << 9)
1886#define RT5665_AD2DA_LB_SFT 9
1887
1888/* Stereo Noise Gate Control 1 (0x0160) */
1889#define RT5665_NG2_EN_MASK (0x1 << 15)
1890#define RT5665_NG2_EN (0x1 << 15)
1891#define RT5665_NG2_DIS (0x0 << 15)
1892
1893/* Stereo1 DAC Silence Detection Control (0x0190) */
1894#define RT5665_DEB_STO_DAC_MASK (0x7 << 4)
1895#define RT5665_DEB_80_MS (0x0 << 4)
1896
1897/* SAR ADC Inline Command Control 1 (0x0210) */
1898#define RT5665_SAR_BUTT_DET_MASK (0x1 << 15)
1899#define RT5665_SAR_BUTT_DET_EN (0x1 << 15)
1900#define RT5665_SAR_BUTT_DET_DIS (0x0 << 15)
1901#define RT5665_SAR_BUTDET_MODE_MASK (0x1 << 14)
1902#define RT5665_SAR_BUTDET_POW_SAV (0x1 << 14)
1903#define RT5665_SAR_BUTDET_POW_NORM (0x0 << 14)
1904#define RT5665_SAR_BUTDET_RST_MASK (0x1 << 13)
1905#define RT5665_SAR_BUTDET_RST_NORMAL (0x1 << 13)
1906#define RT5665_SAR_BUTDET_RST (0x0 << 13)
1907#define RT5665_SAR_POW_MASK (0x1 << 12)
1908#define RT5665_SAR_POW_EN (0x1 << 12)
1909#define RT5665_SAR_POW_DIS (0x0 << 12)
1910#define RT5665_SAR_RST_MASK (0x1 << 11)
1911#define RT5665_SAR_RST_NORMAL (0x1 << 11)
1912#define RT5665_SAR_RST (0x0 << 11)
1913#define RT5665_SAR_BYPASS_MASK (0x1 << 10)
1914#define RT5665_SAR_BYPASS_EN (0x1 << 10)
1915#define RT5665_SAR_BYPASS_DIS (0x0 << 10)
1916#define RT5665_SAR_SEL_MB1_MASK (0x1 << 9)
1917#define RT5665_SAR_SEL_MB1_SEL (0x1 << 9)
1918#define RT5665_SAR_SEL_MB1_NOSEL (0x0 << 9)
1919#define RT5665_SAR_SEL_MB2_MASK (0x1 << 8)
1920#define RT5665_SAR_SEL_MB2_SEL (0x1 << 8)
1921#define RT5665_SAR_SEL_MB2_NOSEL (0x0 << 8)
1922#define RT5665_SAR_SEL_MODE_MASK (0x1 << 7)
1923#define RT5665_SAR_SEL_MODE_CMP (0x1 << 7)
1924#define RT5665_SAR_SEL_MODE_ADC (0x0 << 7)
1925#define RT5665_SAR_SEL_MB1_MB2_MASK (0x1 << 5)
1926#define RT5665_SAR_SEL_MB1_MB2_AUTO (0x1 << 5)
1927#define RT5665_SAR_SEL_MB1_MB2_MANU (0x0 << 5)
1928#define RT5665_SAR_SEL_SIGNAL_MASK (0x1 << 4)
1929#define RT5665_SAR_SEL_SIGNAL_AUTO (0x1 << 4)
1930#define RT5665_SAR_SEL_SIGNAL_MANU (0x0 << 4)
1931
1932/* System Clock Source */
1933enum {
1934 RT5665_SCLK_S_MCLK,
1935 RT5665_SCLK_S_PLL1,
1936 RT5665_SCLK_S_RCCLK,
1937};
1938
1939/* PLL1 Source */
1940enum {
1941 RT5665_PLL1_S_MCLK,
1942 RT5665_PLL1_S_BCLK1,
1943 RT5665_PLL1_S_BCLK2,
1944 RT5665_PLL1_S_BCLK3,
1945 RT5665_PLL1_S_BCLK4,
1946};
1947
1948enum {
1949 RT5665_AIF1_1,
1950 RT5665_AIF1_2,
1951 RT5665_AIF2_1,
1952 RT5665_AIF2_2,
1953 RT5665_AIF3,
1954 RT5665_AIFS
1955};
1956
1957enum {
1958 CODEC_5665,
1959 CODEC_5666,
1960 CODEC_5668,
1961};
1962
1963/* filter mask */
1964enum {
1965 RT5665_DA_STEREO1_FILTER = 0x1,
1966 RT5665_DA_STEREO2_FILTER = (0x1 << 1),
1967 RT5665_DA_MONO_L_FILTER = (0x1 << 2),
1968 RT5665_DA_MONO_R_FILTER = (0x1 << 3),
1969 RT5665_AD_STEREO1_FILTER = (0x1 << 4),
1970 RT5665_AD_STEREO2_FILTER = (0x1 << 5),
1971 RT5665_AD_MONO_L_FILTER = (0x1 << 6),
1972 RT5665_AD_MONO_R_FILTER = (0x1 << 7),
1973};
1974
1975enum {
1976 RT5665_CLK_SEL_SYS,
1977 RT5665_CLK_SEL_I2S1_ASRC,
1978 RT5665_CLK_SEL_I2S2_ASRC,
1979 RT5665_CLK_SEL_I2S3_ASRC,
1980 RT5665_CLK_SEL_SYS2,
1981 RT5665_CLK_SEL_SYS3,
1982 RT5665_CLK_SEL_SYS4,
1983};
1984
1985int rt5665_sel_asrc_clk_src(struct snd_soc_codec *codec,
1986 unsigned int filter_mask, unsigned int clk_src);
1987int rt5665_set_jack_detect(struct snd_soc_codec *codec,
1988 struct snd_soc_jack *hs_jack);
1989
1990#endif /* __RT5665_H__ */
diff --git a/sound/soc/codecs/rt5670.c b/sound/soc/codecs/rt5670.c
index 49caf1393aeb..97bafac3bc15 100644
--- a/sound/soc/codecs/rt5670.c
+++ b/sound/soc/codecs/rt5670.c
@@ -2618,7 +2618,7 @@ static int rt5670_set_bias_level(struct snd_soc_codec *codec,
2618 RT5670_OSW_L_DIS | RT5670_OSW_R_DIS); 2618 RT5670_OSW_L_DIS | RT5670_OSW_R_DIS);
2619 snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x1); 2619 snd_soc_update_bits(codec, RT5670_DIG_MISC, 0x1, 0x1);
2620 snd_soc_update_bits(codec, RT5670_PWR_ANLG1, 2620 snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2621 RT5670_LDO_SEL_MASK, 0x3); 2621 RT5670_LDO_SEL_MASK, 0x5);
2622 } 2622 }
2623 break; 2623 break;
2624 case SND_SOC_BIAS_STANDBY: 2624 case SND_SOC_BIAS_STANDBY:
@@ -2626,7 +2626,7 @@ static int rt5670_set_bias_level(struct snd_soc_codec *codec,
2626 RT5670_PWR_VREF1 | RT5670_PWR_VREF2 | 2626 RT5670_PWR_VREF1 | RT5670_PWR_VREF2 |
2627 RT5670_PWR_FV1 | RT5670_PWR_FV2, 0); 2627 RT5670_PWR_FV1 | RT5670_PWR_FV2, 0);
2628 snd_soc_update_bits(codec, RT5670_PWR_ANLG1, 2628 snd_soc_update_bits(codec, RT5670_PWR_ANLG1,
2629 RT5670_LDO_SEL_MASK, 0x1); 2629 RT5670_LDO_SEL_MASK, 0x3);
2630 break; 2630 break;
2631 case SND_SOC_BIAS_OFF: 2631 case SND_SOC_BIAS_OFF:
2632 if (rt5670->pdata.jd_mode) 2632 if (rt5670->pdata.jd_mode)
@@ -2813,6 +2813,7 @@ MODULE_DEVICE_TABLE(i2c, rt5670_i2c_id);
2813#ifdef CONFIG_ACPI 2813#ifdef CONFIG_ACPI
2814static const struct acpi_device_id rt5670_acpi_match[] = { 2814static const struct acpi_device_id rt5670_acpi_match[] = {
2815 { "10EC5670", 0}, 2815 { "10EC5670", 0},
2816 { "10EC5672", 0},
2816 { }, 2817 { },
2817}; 2818};
2818MODULE_DEVICE_TABLE(acpi, rt5670_acpi_match); 2819MODULE_DEVICE_TABLE(acpi, rt5670_acpi_match);
@@ -2826,6 +2827,13 @@ static const struct dmi_system_id dmi_platform_intel_braswell[] = {
2826 DMI_MATCH(DMI_BOARD_NAME, "Braswell CRB"), 2827 DMI_MATCH(DMI_BOARD_NAME, "Braswell CRB"),
2827 }, 2828 },
2828 }, 2829 },
2830 {
2831 .ident = "Dell Wyse 3040",
2832 .matches = {
2833 DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
2834 DMI_MATCH(DMI_PRODUCT_NAME, "Wyse 3040"),
2835 },
2836 },
2829 {} 2837 {}
2830}; 2838};
2831 2839
@@ -2889,6 +2897,9 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
2889 if (ret != 0) 2897 if (ret != 0)
2890 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret); 2898 dev_warn(&i2c->dev, "Failed to apply regmap patch: %d\n", ret);
2891 2899
2900 regmap_update_bits(rt5670->regmap, RT5670_DIG_MISC,
2901 RT5670_MCLK_DET, RT5670_MCLK_DET);
2902
2892 if (rt5670->pdata.in2_diff) 2903 if (rt5670->pdata.in2_diff)
2893 regmap_update_bits(rt5670->regmap, RT5670_IN2, 2904 regmap_update_bits(rt5670->regmap, RT5670_IN2,
2894 RT5670_IN_DF2, RT5670_IN_DF2); 2905 RT5670_IN_DF2, RT5670_IN_DF2);
@@ -2903,7 +2914,6 @@ static int rt5670_i2c_probe(struct i2c_client *i2c,
2903 RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ); 2914 RT5670_GP1_PIN_MASK, RT5670_GP1_PIN_IRQ);
2904 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2, 2915 regmap_update_bits(rt5670->regmap, RT5670_GPIO_CTRL2,
2905 RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT); 2916 RT5670_GP1_PF_MASK, RT5670_GP1_PF_OUT);
2906 regmap_update_bits(rt5670->regmap, RT5670_DIG_MISC, 0x8, 0x8);
2907 } 2917 }
2908 2918
2909 if (rt5670->pdata.jd_mode) { 2919 if (rt5670->pdata.jd_mode) {
diff --git a/sound/soc/codecs/rt5670.h b/sound/soc/codecs/rt5670.h
index 3f1b0f1df809..5ba485cae4e6 100644
--- a/sound/soc/codecs/rt5670.h
+++ b/sound/soc/codecs/rt5670.h
@@ -1914,6 +1914,7 @@ enum {
1914#define RT5670_IF1_ADC1_IN2_SFT 11 1914#define RT5670_IF1_ADC1_IN2_SFT 11
1915#define RT5670_IF1_ADC2_IN1_SEL (0x1 << 10) 1915#define RT5670_IF1_ADC2_IN1_SEL (0x1 << 10)
1916#define RT5670_IF1_ADC2_IN1_SFT 10 1916#define RT5670_IF1_ADC2_IN1_SFT 10
1917#define RT5670_MCLK_DET (0x1 << 3)
1917 1918
1918/* General Control2 (0xfb) */ 1919/* General Control2 (0xfb) */
1919#define RT5670_RXDC_SRC_MASK (0x1 << 7) 1920#define RT5670_RXDC_SRC_MASK (0x1 << 7)
diff --git a/sound/soc/codecs/rt5677-spi.c b/sound/soc/codecs/rt5677-spi.c
index 91879ea95415..ebd0f7c5ad3b 100644
--- a/sound/soc/codecs/rt5677-spi.c
+++ b/sound/soc/codecs/rt5677-spi.c
@@ -20,7 +20,6 @@
20#include <linux/slab.h> 20#include <linux/slab.h>
21#include <linux/gpio.h> 21#include <linux/gpio.h>
22#include <linux/sched.h> 22#include <linux/sched.h>
23#include <linux/kthread.h>
24#include <linux/uaccess.h> 23#include <linux/uaccess.h>
25#include <linux/miscdevice.h> 24#include <linux/miscdevice.h>
26#include <linux/regulator/consumer.h> 25#include <linux/regulator/consumer.h>
diff --git a/sound/soc/codecs/stac9766.c b/sound/soc/codecs/stac9766.c
index 27f30d352867..9de7fe8af255 100644
--- a/sound/soc/codecs/stac9766.c
+++ b/sound/soc/codecs/stac9766.c
@@ -18,6 +18,7 @@
18#include <linux/slab.h> 18#include <linux/slab.h>
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/device.h> 20#include <linux/device.h>
21#include <linux/regmap.h>
21#include <sound/core.h> 22#include <sound/core.h>
22#include <sound/pcm.h> 23#include <sound/pcm.h>
23#include <sound/ac97_codec.h> 24#include <sound/ac97_codec.h>
@@ -26,31 +27,56 @@
26#include <sound/soc.h> 27#include <sound/soc.h>
27#include <sound/tlv.h> 28#include <sound/tlv.h>
28 29
29#include "stac9766.h"
30
31#define STAC9766_VENDOR_ID 0x83847666 30#define STAC9766_VENDOR_ID 0x83847666
32#define STAC9766_VENDOR_ID_MASK 0xffffffff 31#define STAC9766_VENDOR_ID_MASK 0xffffffff
33 32
34/* 33#define AC97_STAC_DA_CONTROL 0x6A
35 * STAC9766 register cache 34#define AC97_STAC_ANALOG_SPECIAL 0x6E
36 */ 35#define AC97_STAC_STEREO_MIC 0x78
37static const u16 stac9766_reg[] = { 36
38 0x6A90, 0x8000, 0x8000, 0x8000, /* 6 */ 37static const struct reg_default stac9766_reg_defaults[] = {
39 0x0000, 0x0000, 0x8008, 0x8008, /* e */ 38 { 0x02, 0x8000 },
40 0x8808, 0x8808, 0x8808, 0x8808, /* 16 */ 39 { 0x04, 0x8000 },
41 0x8808, 0x0000, 0x8000, 0x0000, /* 1e */ 40 { 0x06, 0x8000 },
42 0x0000, 0x0000, 0x0000, 0x000f, /* 26 */ 41 { 0x0a, 0x0000 },
43 0x0a05, 0x0400, 0xbb80, 0x0000, /* 2e */ 42 { 0x0c, 0x8008 },
44 0x0000, 0xbb80, 0x0000, 0x0000, /* 36 */ 43 { 0x0e, 0x8008 },
45 0x0000, 0x2000, 0x0000, 0x0100, /* 3e */ 44 { 0x10, 0x8808 },
46 0x0000, 0x0000, 0x0080, 0x0000, /* 46 */ 45 { 0x12, 0x8808 },
47 0x0000, 0x0000, 0x0003, 0xffff, /* 4e */ 46 { 0x14, 0x8808 },
48 0x0000, 0x0000, 0x0000, 0x0000, /* 56 */ 47 { 0x16, 0x8808 },
49 0x4000, 0x0000, 0x0000, 0x0000, /* 5e */ 48 { 0x18, 0x8808 },
50 0x1201, 0xFFFF, 0xFFFF, 0x0000, /* 66 */ 49 { 0x1a, 0x0000 },
51 0x0000, 0x0000, 0x0000, 0x0000, /* 6e */ 50 { 0x1c, 0x8000 },
52 0x0000, 0x0000, 0x0000, 0x0006, /* 76 */ 51 { 0x20, 0x0000 },
53 0x0000, 0x0000, 0x0000, 0x0000, /* 7e */ 52 { 0x22, 0x0000 },
53 { 0x28, 0x0a05 },
54 { 0x2c, 0xbb80 },
55 { 0x32, 0xbb80 },
56 { 0x3a, 0x2000 },
57 { 0x3e, 0x0100 },
58 { 0x4c, 0x0300 },
59 { 0x4e, 0xffff },
60 { 0x50, 0x0000 },
61 { 0x52, 0x0000 },
62 { 0x54, 0x0000 },
63 { 0x6a, 0x0000 },
64 { 0x6e, 0x1000 },
65 { 0x72, 0x0000 },
66 { 0x78, 0x0000 },
67};
68
69static const struct regmap_config stac9766_regmap_config = {
70 .reg_bits = 16,
71 .reg_stride = 2,
72 .val_bits = 16,
73 .max_register = 0x78,
74 .cache_type = REGCACHE_RBTREE,
75
76 .volatile_reg = regmap_ac97_default_volatile,
77
78 .reg_defaults = stac9766_reg_defaults,
79 .num_reg_defaults = ARRAY_SIZE(stac9766_reg_defaults),
54}; 80};
55 81
56static const char *stac9766_record_mux[] = {"Mic", "CD", "Video", "AUX", 82static const char *stac9766_record_mux[] = {"Mic", "CD", "Video", "AUX",
@@ -139,71 +165,22 @@ static const struct snd_kcontrol_new stac9766_snd_ac97_controls[] = {
139 SOC_ENUM("Pop Bypass Mux", stac9766_popbypass_enum), 165 SOC_ENUM("Pop Bypass Mux", stac9766_popbypass_enum),
140}; 166};
141 167
142static int stac9766_ac97_write(struct snd_soc_codec *codec, unsigned int reg,
143 unsigned int val)
144{
145 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
146 u16 *cache = codec->reg_cache;
147
148 if (reg > AC97_STAC_PAGE0) {
149 stac9766_ac97_write(codec, AC97_INT_PAGING, 0);
150 soc_ac97_ops->write(ac97, reg, val);
151 stac9766_ac97_write(codec, AC97_INT_PAGING, 1);
152 return 0;
153 }
154 if (reg / 2 >= ARRAY_SIZE(stac9766_reg))
155 return -EIO;
156
157 soc_ac97_ops->write(ac97, reg, val);
158 cache[reg / 2] = val;
159 return 0;
160}
161
162static unsigned int stac9766_ac97_read(struct snd_soc_codec *codec,
163 unsigned int reg)
164{
165 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
166 u16 val = 0, *cache = codec->reg_cache;
167
168 if (reg > AC97_STAC_PAGE0) {
169 stac9766_ac97_write(codec, AC97_INT_PAGING, 0);
170 val = soc_ac97_ops->read(ac97, reg - AC97_STAC_PAGE0);
171 stac9766_ac97_write(codec, AC97_INT_PAGING, 1);
172 return val;
173 }
174 if (reg / 2 >= ARRAY_SIZE(stac9766_reg))
175 return -EIO;
176
177 if (reg == AC97_RESET || reg == AC97_GPIO_STATUS ||
178 reg == AC97_INT_PAGING || reg == AC97_VENDOR_ID1 ||
179 reg == AC97_VENDOR_ID2) {
180
181 val = soc_ac97_ops->read(ac97, reg);
182 return val;
183 }
184 return cache[reg / 2];
185}
186
187static int ac97_analog_prepare(struct snd_pcm_substream *substream, 168static int ac97_analog_prepare(struct snd_pcm_substream *substream,
188 struct snd_soc_dai *dai) 169 struct snd_soc_dai *dai)
189{ 170{
190 struct snd_soc_codec *codec = dai->codec; 171 struct snd_soc_codec *codec = dai->codec;
191 struct snd_pcm_runtime *runtime = substream->runtime; 172 struct snd_pcm_runtime *runtime = substream->runtime;
192 unsigned short reg, vra; 173 unsigned short reg;
193
194 vra = stac9766_ac97_read(codec, AC97_EXTENDED_STATUS);
195 174
196 vra |= 0x1; /* enable variable rate audio */ 175 /* enable variable rate audio, disable SPDIF output */
197 vra &= ~0x4; /* disable SPDIF output */ 176 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x5, 0x1);
198
199 stac9766_ac97_write(codec, AC97_EXTENDED_STATUS, vra);
200 177
201 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 178 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
202 reg = AC97_PCM_FRONT_DAC_RATE; 179 reg = AC97_PCM_FRONT_DAC_RATE;
203 else 180 else
204 reg = AC97_PCM_LR_ADC_RATE; 181 reg = AC97_PCM_LR_ADC_RATE;
205 182
206 return stac9766_ac97_write(codec, reg, runtime->rate); 183 return snd_soc_write(codec, reg, runtime->rate);
207} 184}
208 185
209static int ac97_digital_prepare(struct snd_pcm_substream *substream, 186static int ac97_digital_prepare(struct snd_pcm_substream *substream,
@@ -211,18 +188,16 @@ static int ac97_digital_prepare(struct snd_pcm_substream *substream,
211{ 188{
212 struct snd_soc_codec *codec = dai->codec; 189 struct snd_soc_codec *codec = dai->codec;
213 struct snd_pcm_runtime *runtime = substream->runtime; 190 struct snd_pcm_runtime *runtime = substream->runtime;
214 unsigned short reg, vra; 191 unsigned short reg;
215
216 stac9766_ac97_write(codec, AC97_SPDIF, 0x2002);
217 192
218 vra = stac9766_ac97_read(codec, AC97_EXTENDED_STATUS); 193 snd_soc_write(codec, AC97_SPDIF, 0x2002);
219 vra |= 0x5; /* Enable VRA and SPDIF out */
220 194
221 stac9766_ac97_write(codec, AC97_EXTENDED_STATUS, vra); 195 /* Enable VRA and SPDIF out */
196 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x5, 0x5);
222 197
223 reg = AC97_PCM_FRONT_DAC_RATE; 198 reg = AC97_PCM_FRONT_DAC_RATE;
224 199
225 return stac9766_ac97_write(codec, reg, runtime->rate); 200 return snd_soc_write(codec, reg, runtime->rate);
226} 201}
227 202
228static int stac9766_set_bias_level(struct snd_soc_codec *codec, 203static int stac9766_set_bias_level(struct snd_soc_codec *codec,
@@ -232,11 +207,11 @@ static int stac9766_set_bias_level(struct snd_soc_codec *codec,
232 case SND_SOC_BIAS_ON: /* full On */ 207 case SND_SOC_BIAS_ON: /* full On */
233 case SND_SOC_BIAS_PREPARE: /* partial On */ 208 case SND_SOC_BIAS_PREPARE: /* partial On */
234 case SND_SOC_BIAS_STANDBY: /* Off, with power */ 209 case SND_SOC_BIAS_STANDBY: /* Off, with power */
235 stac9766_ac97_write(codec, AC97_POWERDOWN, 0x0000); 210 snd_soc_write(codec, AC97_POWERDOWN, 0x0000);
236 break; 211 break;
237 case SND_SOC_BIAS_OFF: /* Off, without power */ 212 case SND_SOC_BIAS_OFF: /* Off, without power */
238 /* disable everything including AC link */ 213 /* disable everything including AC link */
239 stac9766_ac97_write(codec, AC97_POWERDOWN, 0xffff); 214 snd_soc_write(codec, AC97_POWERDOWN, 0xffff);
240 break; 215 break;
241 } 216 }
242 return 0; 217 return 0;
@@ -300,21 +275,34 @@ static struct snd_soc_dai_driver stac9766_dai[] = {
300static int stac9766_codec_probe(struct snd_soc_codec *codec) 275static int stac9766_codec_probe(struct snd_soc_codec *codec)
301{ 276{
302 struct snd_ac97 *ac97; 277 struct snd_ac97 *ac97;
278 struct regmap *regmap;
279 int ret;
303 280
304 ac97 = snd_soc_new_ac97_codec(codec, STAC9766_VENDOR_ID, 281 ac97 = snd_soc_new_ac97_codec(codec, STAC9766_VENDOR_ID,
305 STAC9766_VENDOR_ID_MASK); 282 STAC9766_VENDOR_ID_MASK);
306 if (IS_ERR(ac97)) 283 if (IS_ERR(ac97))
307 return PTR_ERR(ac97); 284 return PTR_ERR(ac97);
308 285
286 regmap = regmap_init_ac97(ac97, &stac9766_regmap_config);
287 if (IS_ERR(regmap)) {
288 ret = PTR_ERR(regmap);
289 goto err_free_ac97;
290 }
291
292 snd_soc_codec_init_regmap(codec, regmap);
309 snd_soc_codec_set_drvdata(codec, ac97); 293 snd_soc_codec_set_drvdata(codec, ac97);
310 294
311 return 0; 295 return 0;
296err_free_ac97:
297 snd_soc_free_ac97_codec(ac97);
298 return ret;
312} 299}
313 300
314static int stac9766_codec_remove(struct snd_soc_codec *codec) 301static int stac9766_codec_remove(struct snd_soc_codec *codec)
315{ 302{
316 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); 303 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
317 304
305 snd_soc_codec_exit_regmap(codec);
318 snd_soc_free_ac97_codec(ac97); 306 snd_soc_free_ac97_codec(ac97);
319 return 0; 307 return 0;
320} 308}
@@ -324,17 +312,11 @@ static struct snd_soc_codec_driver soc_codec_dev_stac9766 = {
324 .controls = stac9766_snd_ac97_controls, 312 .controls = stac9766_snd_ac97_controls,
325 .num_controls = ARRAY_SIZE(stac9766_snd_ac97_controls), 313 .num_controls = ARRAY_SIZE(stac9766_snd_ac97_controls),
326 }, 314 },
327 .write = stac9766_ac97_write,
328 .read = stac9766_ac97_read,
329 .set_bias_level = stac9766_set_bias_level, 315 .set_bias_level = stac9766_set_bias_level,
330 .suspend_bias_off = true, 316 .suspend_bias_off = true,
331 .probe = stac9766_codec_probe, 317 .probe = stac9766_codec_probe,
332 .remove = stac9766_codec_remove, 318 .remove = stac9766_codec_remove,
333 .resume = stac9766_codec_resume, 319 .resume = stac9766_codec_resume,
334 .reg_cache_size = ARRAY_SIZE(stac9766_reg),
335 .reg_word_size = sizeof(u16),
336 .reg_cache_step = 2,
337 .reg_cache_default = stac9766_reg,
338}; 320};
339 321
340static int stac9766_probe(struct platform_device *pdev) 322static int stac9766_probe(struct platform_device *pdev)
diff --git a/sound/soc/codecs/stac9766.h b/sound/soc/codecs/stac9766.h
deleted file mode 100644
index c726f907e2c0..000000000000
--- a/sound/soc/codecs/stac9766.h
+++ /dev/null
@@ -1,17 +0,0 @@
1/*
2 * stac9766.h -- STAC9766 Soc Audio driver
3 */
4
5#ifndef _STAC9766_H
6#define _STAC9766_H
7
8#define AC97_STAC_PAGE0 0x1000
9#define AC97_STAC_DA_CONTROL (AC97_STAC_PAGE0 | 0x6A)
10#define AC97_STAC_ANALOG_SPECIAL (AC97_STAC_PAGE0 | 0x6E)
11#define AC97_STAC_STEREO_MIC 0x78
12
13/* STAC9766 DAI ID's */
14#define STAC9766_DAI_AC97_ANALOG 0
15#define STAC9766_DAI_AC97_DIGITAL 1
16
17#endif
diff --git a/sound/soc/codecs/sti-sas.c b/sound/soc/codecs/sti-sas.c
index d6e00c77edcd..62c618765224 100644
--- a/sound/soc/codecs/sti-sas.c
+++ b/sound/soc/codecs/sti-sas.c
@@ -14,28 +14,8 @@
14#include <sound/soc.h> 14#include <sound/soc.h>
15#include <sound/soc-dapm.h> 15#include <sound/soc-dapm.h>
16 16
17/* chipID supported */
18#define CHIPID_STIH416 0
19#define CHIPID_STIH407 1
20
21/* DAC definitions */ 17/* DAC definitions */
22 18
23/* stih416 DAC registers */
24/* sysconf 2517: Audio-DAC-Control */
25#define STIH416_AUDIO_DAC_CTRL 0x00000814
26/* sysconf 2519: Audio-Gue-Control */
27#define STIH416_AUDIO_GLUE_CTRL 0x0000081C
28
29#define STIH416_DAC_NOT_STANDBY 0x3
30#define STIH416_DAC_SOFTMUTE 0x4
31#define STIH416_DAC_ANA_NOT_PWR 0x5
32#define STIH416_DAC_NOT_PNDBG 0x6
33
34#define STIH416_DAC_NOT_STANDBY_MASK BIT(STIH416_DAC_NOT_STANDBY)
35#define STIH416_DAC_SOFTMUTE_MASK BIT(STIH416_DAC_SOFTMUTE)
36#define STIH416_DAC_ANA_NOT_PWR_MASK BIT(STIH416_DAC_ANA_NOT_PWR)
37#define STIH416_DAC_NOT_PNDBG_MASK BIT(STIH416_DAC_NOT_PNDBG)
38
39/* stih407 DAC registers */ 19/* stih407 DAC registers */
40/* sysconf 5041: Audio-Gue-Control */ 20/* sysconf 5041: Audio-Gue-Control */
41#define STIH407_AUDIO_GLUE_CTRL 0x000000A4 21#define STIH407_AUDIO_GLUE_CTRL 0x000000A4
@@ -63,14 +43,9 @@ enum {
63 STI_SAS_DAI_ANALOG_OUT, 43 STI_SAS_DAI_ANALOG_OUT,
64}; 44};
65 45
66static const struct reg_default stih416_sas_reg_defaults[] = {
67 { STIH407_AUDIO_GLUE_CTRL, 0x00000040 },
68 { STIH407_AUDIO_DAC_CTRL, 0x000000000 },
69};
70
71static const struct reg_default stih407_sas_reg_defaults[] = { 46static const struct reg_default stih407_sas_reg_defaults[] = {
72 { STIH416_AUDIO_DAC_CTRL, 0x000000000 }, 47 { STIH407_AUDIO_DAC_CTRL, 0x000000000 },
73 { STIH416_AUDIO_GLUE_CTRL, 0x00000040 }, 48 { STIH407_AUDIO_GLUE_CTRL, 0x00000040 },
74}; 49};
75 50
76struct sti_dac_audio { 51struct sti_dac_audio {
@@ -89,7 +64,6 @@ struct sti_spdif_audio {
89 64
90/* device data structure */ 65/* device data structure */
91struct sti_sas_dev_data { 66struct sti_sas_dev_data {
92 const int chipid; /* IC version */
93 const struct regmap_config *regmap; 67 const struct regmap_config *regmap;
94 const struct snd_soc_dai_ops *dac_ops; /* DAC function callbacks */ 68 const struct snd_soc_dai_ops *dac_ops; /* DAC function callbacks */
95 const struct snd_soc_dapm_widget *dapm_widgets; /* dapms declaration */ 69 const struct snd_soc_dapm_widget *dapm_widgets; /* dapms declaration */
@@ -150,51 +124,27 @@ static int sti_sas_init_sas_registers(struct snd_soc_codec *codec,
150 ret = snd_soc_update_bits(codec, STIH407_AUDIO_GLUE_CTRL, 124 ret = snd_soc_update_bits(codec, STIH407_AUDIO_GLUE_CTRL,
151 SPDIF_BIPHASE_IDLE_MASK, 0); 125 SPDIF_BIPHASE_IDLE_MASK, 0);
152 if (ret < 0) { 126 if (ret < 0) {
153 dev_err(codec->dev, "Failed to update SPDIF registers"); 127 dev_err(codec->dev, "Failed to update SPDIF registers\n");
154 return ret; 128 return ret;
155 } 129 }
156 130
157 /* Init DAC configuration */ 131 /* Init DAC configuration */
158 switch (data->dev_data->chipid) { 132 /* init configuration */
159 case CHIPID_STIH407: 133 ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL,
160 /* init configuration */ 134 STIH407_DAC_STANDBY_MASK,
161 ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, 135 STIH407_DAC_STANDBY_MASK);
162 STIH407_DAC_STANDBY_MASK, 136
163 STIH407_DAC_STANDBY_MASK); 137 if (!ret)
164 138 ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL,
165 if (!ret) 139 STIH407_DAC_STANDBY_ANA_MASK,
166 ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, 140 STIH407_DAC_STANDBY_ANA_MASK);
167 STIH407_DAC_STANDBY_ANA_MASK, 141 if (!ret)
168 STIH407_DAC_STANDBY_ANA_MASK); 142 ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL,
169 if (!ret) 143 STIH407_DAC_SOFTMUTE_MASK,
170 ret = snd_soc_update_bits(codec, STIH407_AUDIO_DAC_CTRL, 144 STIH407_DAC_SOFTMUTE_MASK);
171 STIH407_DAC_SOFTMUTE_MASK,
172 STIH407_DAC_SOFTMUTE_MASK);
173 break;
174 case CHIPID_STIH416:
175 ret = snd_soc_update_bits(codec, STIH416_AUDIO_DAC_CTRL,
176 STIH416_DAC_NOT_STANDBY_MASK, 0);
177 if (!ret)
178 ret = snd_soc_update_bits(codec,
179 STIH416_AUDIO_DAC_CTRL,
180 STIH416_DAC_ANA_NOT_PWR, 0);
181 if (!ret)
182 ret = snd_soc_update_bits(codec,
183 STIH416_AUDIO_DAC_CTRL,
184 STIH416_DAC_NOT_PNDBG_MASK,
185 0);
186 if (!ret)
187 ret = snd_soc_update_bits(codec,
188 STIH416_AUDIO_DAC_CTRL,
189 STIH416_DAC_SOFTMUTE_MASK,
190 STIH416_DAC_SOFTMUTE_MASK);
191 break;
192 default:
193 return -EINVAL;
194 }
195 145
196 if (ret < 0) { 146 if (ret < 0) {
197 dev_err(codec->dev, "Failed to update DAC registers"); 147 dev_err(codec->dev, "Failed to update DAC registers\n");
198 return ret; 148 return ret;
199 } 149 }
200 150
@@ -217,37 +167,6 @@ static int sti_sas_dac_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
217 return 0; 167 return 0;
218} 168}
219 169
220static int stih416_dac_probe(struct snd_soc_dai *dai)
221{
222 struct snd_soc_codec *codec = dai->codec;
223 struct sti_sas_data *drvdata = dev_get_drvdata(codec->dev);
224 struct sti_dac_audio *dac = &drvdata->dac;
225
226 /* Get reset control */
227 dac->rst = devm_reset_control_get(codec->dev, "dac_rst");
228 if (IS_ERR(dac->rst)) {
229 dev_err(dai->codec->dev,
230 "%s: ERROR: DAC reset control not defined !\n",
231 __func__);
232 dac->rst = NULL;
233 return -EFAULT;
234 }
235 /* Put the DAC into reset */
236 reset_control_assert(dac->rst);
237
238 return 0;
239}
240
241static const struct snd_soc_dapm_widget stih416_sas_dapm_widgets[] = {
242 SND_SOC_DAPM_PGA("DAC bandgap", STIH416_AUDIO_DAC_CTRL,
243 STIH416_DAC_NOT_PNDBG_MASK, 0, NULL, 0),
244 SND_SOC_DAPM_OUT_DRV("DAC standby ana", STIH416_AUDIO_DAC_CTRL,
245 STIH416_DAC_ANA_NOT_PWR, 0, NULL, 0),
246 SND_SOC_DAPM_DAC("DAC standby", "dac_p", STIH416_AUDIO_DAC_CTRL,
247 STIH416_DAC_NOT_STANDBY, 0),
248 SND_SOC_DAPM_OUTPUT("DAC Output"),
249};
250
251static const struct snd_soc_dapm_widget stih407_sas_dapm_widgets[] = { 170static const struct snd_soc_dapm_widget stih407_sas_dapm_widgets[] = {
252 SND_SOC_DAPM_OUT_DRV("DAC standby ana", STIH407_AUDIO_DAC_CTRL, 171 SND_SOC_DAPM_OUT_DRV("DAC standby ana", STIH407_AUDIO_DAC_CTRL,
253 STIH407_DAC_STANDBY_ANA, 1, NULL, 0), 172 STIH407_DAC_STANDBY_ANA, 1, NULL, 0),
@@ -256,30 +175,11 @@ static const struct snd_soc_dapm_widget stih407_sas_dapm_widgets[] = {
256 SND_SOC_DAPM_OUTPUT("DAC Output"), 175 SND_SOC_DAPM_OUTPUT("DAC Output"),
257}; 176};
258 177
259static const struct snd_soc_dapm_route stih416_sas_route[] = {
260 {"DAC Output", NULL, "DAC bandgap"},
261 {"DAC Output", NULL, "DAC standby ana"},
262 {"DAC standby ana", NULL, "DAC standby"},
263};
264
265static const struct snd_soc_dapm_route stih407_sas_route[] = { 178static const struct snd_soc_dapm_route stih407_sas_route[] = {
266 {"DAC Output", NULL, "DAC standby ana"}, 179 {"DAC Output", NULL, "DAC standby ana"},
267 {"DAC standby ana", NULL, "DAC standby"}, 180 {"DAC standby ana", NULL, "DAC standby"},
268}; 181};
269 182
270static int stih416_sas_dac_mute(struct snd_soc_dai *dai, int mute, int stream)
271{
272 struct snd_soc_codec *codec = dai->codec;
273
274 if (mute) {
275 return snd_soc_update_bits(codec, STIH416_AUDIO_DAC_CTRL,
276 STIH416_DAC_SOFTMUTE_MASK,
277 STIH416_DAC_SOFTMUTE_MASK);
278 } else {
279 return snd_soc_update_bits(codec, STIH416_AUDIO_DAC_CTRL,
280 STIH416_DAC_SOFTMUTE_MASK, 0);
281 }
282}
283 183
284static int stih407_sas_dac_mute(struct snd_soc_dai *dai, int mute, int stream) 184static int stih407_sas_dac_mute(struct snd_soc_dai *dai, int mute, int stream)
285{ 185{
@@ -392,13 +292,13 @@ static int sti_sas_prepare(struct snd_pcm_substream *substream,
392 switch (dai->id) { 292 switch (dai->id) {
393 case STI_SAS_DAI_SPDIF_OUT: 293 case STI_SAS_DAI_SPDIF_OUT:
394 if ((drvdata->spdif.mclk / runtime->rate) != 128) { 294 if ((drvdata->spdif.mclk / runtime->rate) != 128) {
395 dev_err(codec->dev, "unexpected mclk-fs ratio"); 295 dev_err(codec->dev, "unexpected mclk-fs ratio\n");
396 return -EINVAL; 296 return -EINVAL;
397 } 297 }
398 break; 298 break;
399 case STI_SAS_DAI_ANALOG_OUT: 299 case STI_SAS_DAI_ANALOG_OUT:
400 if ((drvdata->dac.mclk / runtime->rate) != 256) { 300 if ((drvdata->dac.mclk / runtime->rate) != 256) {
401 dev_err(codec->dev, "unexpected mclk-fs ratio"); 301 dev_err(codec->dev, "unexpected mclk-fs ratio\n");
402 return -EINVAL; 302 return -EINVAL;
403 } 303 }
404 break; 304 break;
@@ -407,13 +307,6 @@ static int sti_sas_prepare(struct snd_pcm_substream *substream,
407 return 0; 307 return 0;
408} 308}
409 309
410static const struct snd_soc_dai_ops stih416_dac_ops = {
411 .set_fmt = sti_sas_dac_set_fmt,
412 .mute_stream = stih416_sas_dac_mute,
413 .prepare = sti_sas_prepare,
414 .set_sysclk = sti_sas_set_sysclk,
415};
416
417static const struct snd_soc_dai_ops stih407_dac_ops = { 310static const struct snd_soc_dai_ops stih407_dac_ops = {
418 .set_fmt = sti_sas_dac_set_fmt, 311 .set_fmt = sti_sas_dac_set_fmt,
419 .mute_stream = stih407_sas_dac_mute, 312 .mute_stream = stih407_sas_dac_mute,
@@ -434,31 +327,7 @@ static const struct regmap_config stih407_sas_regmap = {
434 .reg_write = sti_sas_write_reg, 327 .reg_write = sti_sas_write_reg,
435}; 328};
436 329
437static const struct regmap_config stih416_sas_regmap = {
438 .reg_bits = 32,
439 .val_bits = 32,
440
441 .max_register = STIH416_AUDIO_DAC_CTRL,
442 .reg_defaults = stih416_sas_reg_defaults,
443 .num_reg_defaults = ARRAY_SIZE(stih416_sas_reg_defaults),
444 .volatile_reg = sti_sas_volatile_register,
445 .cache_type = REGCACHE_RBTREE,
446 .reg_read = sti_sas_read_reg,
447 .reg_write = sti_sas_write_reg,
448};
449
450static const struct sti_sas_dev_data stih416_data = {
451 .chipid = CHIPID_STIH416,
452 .regmap = &stih416_sas_regmap,
453 .dac_ops = &stih416_dac_ops,
454 .dapm_widgets = stih416_sas_dapm_widgets,
455 .num_dapm_widgets = ARRAY_SIZE(stih416_sas_dapm_widgets),
456 .dapm_routes = stih416_sas_route,
457 .num_dapm_routes = ARRAY_SIZE(stih416_sas_route),
458};
459
460static const struct sti_sas_dev_data stih407_data = { 330static const struct sti_sas_dev_data stih407_data = {
461 .chipid = CHIPID_STIH407,
462 .regmap = &stih407_sas_regmap, 331 .regmap = &stih407_sas_regmap,
463 .dac_ops = &stih407_dac_ops, 332 .dac_ops = &stih407_dac_ops,
464 .dapm_widgets = stih407_sas_dapm_widgets, 333 .dapm_widgets = stih407_sas_dapm_widgets,
@@ -533,10 +402,6 @@ static struct snd_soc_codec_driver sti_sas_driver = {
533 402
534static const struct of_device_id sti_sas_dev_match[] = { 403static const struct of_device_id sti_sas_dev_match[] = {
535 { 404 {
536 .compatible = "st,stih416-sas-codec",
537 .data = &stih416_data,
538 },
539 {
540 .compatible = "st,stih407-sas-codec", 405 .compatible = "st,stih407-sas-codec",
541 .data = &stih407_data, 406 .data = &stih407_data,
542 }, 407 },
@@ -558,7 +423,7 @@ static int sti_sas_driver_probe(struct platform_device *pdev)
558 /* Populate data structure depending on compatibility */ 423 /* Populate data structure depending on compatibility */
559 of_id = of_match_node(sti_sas_dev_match, pnode); 424 of_id = of_match_node(sti_sas_dev_match, pnode);
560 if (!of_id->data) { 425 if (!of_id->data) {
561 dev_err(&pdev->dev, "data associated to device is missing"); 426 dev_err(&pdev->dev, "data associated to device is missing\n");
562 return -EINVAL; 427 return -EINVAL;
563 } 428 }
564 429
@@ -584,10 +449,6 @@ static int sti_sas_driver_probe(struct platform_device *pdev)
584 } 449 }
585 drvdata->spdif.regmap = drvdata->dac.regmap; 450 drvdata->spdif.regmap = drvdata->dac.regmap;
586 451
587 /* Set DAC dai probe */
588 if (drvdata->dev_data->chipid == CHIPID_STIH416)
589 sti_sas_dai[STI_SAS_DAI_ANALOG_OUT].probe = stih416_dac_probe;
590
591 sti_sas_dai[STI_SAS_DAI_ANALOG_OUT].ops = drvdata->dev_data->dac_ops; 452 sti_sas_dai[STI_SAS_DAI_ANALOG_OUT].ops = drvdata->dev_data->dac_ops;
592 453
593 /* Set dapms*/ 454 /* Set dapms*/
diff --git a/sound/soc/codecs/tlv320aic31xx.c b/sound/soc/codecs/tlv320aic31xx.c
index be1a64bfd320..f8a90ba8cd71 100644
--- a/sound/soc/codecs/tlv320aic31xx.c
+++ b/sound/soc/codecs/tlv320aic31xx.c
@@ -1253,6 +1253,8 @@ static const struct of_device_id tlv320aic31xx_of_match[] = {
1253 { .compatible = "ti,tlv320aic3110" }, 1253 { .compatible = "ti,tlv320aic3110" },
1254 { .compatible = "ti,tlv320aic3120" }, 1254 { .compatible = "ti,tlv320aic3120" },
1255 { .compatible = "ti,tlv320aic3111" }, 1255 { .compatible = "ti,tlv320aic3111" },
1256 { .compatible = "ti,tlv320dac3100" },
1257 { .compatible = "ti,tlv320dac3101" },
1256 {}, 1258 {},
1257}; 1259};
1258MODULE_DEVICE_TABLE(of, tlv320aic31xx_of_match); 1260MODULE_DEVICE_TABLE(of, tlv320aic31xx_of_match);
@@ -1379,6 +1381,7 @@ static const struct i2c_device_id aic31xx_i2c_id[] = {
1379 { "tlv320aic3120", AIC3120 }, 1381 { "tlv320aic3120", AIC3120 },
1380 { "tlv320aic3111", AIC3111 }, 1382 { "tlv320aic3111", AIC3111 },
1381 { "tlv320dac3100", DAC3100 }, 1383 { "tlv320dac3100", DAC3100 },
1384 { "tlv320dac3101", DAC3101 },
1382 { } 1385 { }
1383}; 1386};
1384MODULE_DEVICE_TABLE(i2c, aic31xx_i2c_id); 1387MODULE_DEVICE_TABLE(i2c, aic31xx_i2c_id);
diff --git a/sound/soc/codecs/tlv320aic31xx.h b/sound/soc/codecs/tlv320aic31xx.h
index 5acd5b69fb83..730fb2058869 100644
--- a/sound/soc/codecs/tlv320aic31xx.h
+++ b/sound/soc/codecs/tlv320aic31xx.h
@@ -32,6 +32,7 @@ enum aic31xx_type {
32 AIC3120 = AIC31XX_MINIDSP_BIT, 32 AIC3120 = AIC31XX_MINIDSP_BIT,
33 AIC3111 = (AIC31XX_STEREO_CLASS_D_BIT | AIC31XX_MINIDSP_BIT), 33 AIC3111 = (AIC31XX_STEREO_CLASS_D_BIT | AIC31XX_MINIDSP_BIT),
34 DAC3100 = DAC31XX_BIT, 34 DAC3100 = DAC31XX_BIT,
35 DAC3101 = DAC31XX_BIT | AIC31XX_STEREO_CLASS_D_BIT,
35}; 36};
36 37
37struct aic31xx_pdata { 38struct aic31xx_pdata {
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
index 5a8d96ec058c..8877b74b0510 100644
--- a/sound/soc/codecs/tlv320aic3x.c
+++ b/sound/soc/codecs/tlv320aic3x.c
@@ -157,7 +157,7 @@ static int snd_soc_dapm_put_volsw_aic3x(struct snd_kcontrol *kcontrol,
157 unsigned int mask = (1 << fls(max)) - 1; 157 unsigned int mask = (1 << fls(max)) - 1;
158 unsigned int invert = mc->invert; 158 unsigned int invert = mc->invert;
159 unsigned short val; 159 unsigned short val;
160 struct snd_soc_dapm_update update; 160 struct snd_soc_dapm_update update = { 0 };
161 int connect, change; 161 int connect, change;
162 162
163 val = (ucontrol->value.integer.value[0] & mask); 163 val = (ucontrol->value.integer.value[0] & mask);
diff --git a/sound/soc/codecs/uda1380.c b/sound/soc/codecs/uda1380.c
index 533e3bb444e4..2918fdb95e58 100644
--- a/sound/soc/codecs/uda1380.c
+++ b/sound/soc/codecs/uda1380.c
@@ -698,25 +698,10 @@ static int uda1380_probe(struct snd_soc_codec *codec)
698 codec->hw_write = (hw_write_t)i2c_master_send; 698 codec->hw_write = (hw_write_t)i2c_master_send;
699 codec->control_data = uda1380->control_data; 699 codec->control_data = uda1380->control_data;
700 700
701 if (!pdata) 701 if (!gpio_is_valid(pdata->gpio_power)) {
702 return -EINVAL;
703
704 if (gpio_is_valid(pdata->gpio_reset)) {
705 ret = gpio_request_one(pdata->gpio_reset, GPIOF_OUT_INIT_LOW,
706 "uda1380 reset");
707 if (ret)
708 goto err_out;
709 }
710
711 if (gpio_is_valid(pdata->gpio_power)) {
712 ret = gpio_request_one(pdata->gpio_power, GPIOF_OUT_INIT_LOW,
713 "uda1380 power");
714 if (ret)
715 goto err_free_gpio;
716 } else {
717 ret = uda1380_reset(codec); 702 ret = uda1380_reset(codec);
718 if (ret) 703 if (ret)
719 goto err_free_gpio; 704 return ret;
720 } 705 }
721 706
722 INIT_WORK(&uda1380->work, uda1380_flush_work); 707 INIT_WORK(&uda1380->work, uda1380_flush_work);
@@ -733,28 +718,10 @@ static int uda1380_probe(struct snd_soc_codec *codec)
733 } 718 }
734 719
735 return 0; 720 return 0;
736
737err_free_gpio:
738 if (gpio_is_valid(pdata->gpio_reset))
739 gpio_free(pdata->gpio_reset);
740err_out:
741 return ret;
742}
743
744/* power down chip */
745static int uda1380_remove(struct snd_soc_codec *codec)
746{
747 struct uda1380_platform_data *pdata =codec->dev->platform_data;
748
749 gpio_free(pdata->gpio_reset);
750 gpio_free(pdata->gpio_power);
751
752 return 0;
753} 721}
754 722
755static struct snd_soc_codec_driver soc_codec_dev_uda1380 = { 723static struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
756 .probe = uda1380_probe, 724 .probe = uda1380_probe,
757 .remove = uda1380_remove,
758 .read = uda1380_read_reg_cache, 725 .read = uda1380_read_reg_cache,
759 .write = uda1380_write, 726 .write = uda1380_write,
760 .set_bias_level = uda1380_set_bias_level, 727 .set_bias_level = uda1380_set_bias_level,
@@ -775,18 +742,35 @@ static struct snd_soc_codec_driver soc_codec_dev_uda1380 = {
775 }, 742 },
776}; 743};
777 744
778#if IS_ENABLED(CONFIG_I2C)
779static int uda1380_i2c_probe(struct i2c_client *i2c, 745static int uda1380_i2c_probe(struct i2c_client *i2c,
780 const struct i2c_device_id *id) 746 const struct i2c_device_id *id)
781{ 747{
748 struct uda1380_platform_data *pdata = i2c->dev.platform_data;
782 struct uda1380_priv *uda1380; 749 struct uda1380_priv *uda1380;
783 int ret; 750 int ret;
784 751
752 if (!pdata)
753 return -EINVAL;
754
785 uda1380 = devm_kzalloc(&i2c->dev, sizeof(struct uda1380_priv), 755 uda1380 = devm_kzalloc(&i2c->dev, sizeof(struct uda1380_priv),
786 GFP_KERNEL); 756 GFP_KERNEL);
787 if (uda1380 == NULL) 757 if (uda1380 == NULL)
788 return -ENOMEM; 758 return -ENOMEM;
789 759
760 if (gpio_is_valid(pdata->gpio_reset)) {
761 ret = devm_gpio_request_one(&i2c->dev, pdata->gpio_reset,
762 GPIOF_OUT_INIT_LOW, "uda1380 reset");
763 if (ret)
764 return ret;
765 }
766
767 if (gpio_is_valid(pdata->gpio_power)) {
768 ret = devm_gpio_request_one(&i2c->dev, pdata->gpio_power,
769 GPIOF_OUT_INIT_LOW, "uda1380 power");
770 if (ret)
771 return ret;
772 }
773
790 i2c_set_clientdata(i2c, uda1380); 774 i2c_set_clientdata(i2c, uda1380);
791 uda1380->control_data = i2c; 775 uda1380->control_data = i2c;
792 776
@@ -815,27 +799,8 @@ static struct i2c_driver uda1380_i2c_driver = {
815 .remove = uda1380_i2c_remove, 799 .remove = uda1380_i2c_remove,
816 .id_table = uda1380_i2c_id, 800 .id_table = uda1380_i2c_id,
817}; 801};
818#endif
819 802
820static int __init uda1380_modinit(void) 803module_i2c_driver(uda1380_i2c_driver);
821{
822 int ret = 0;
823#if IS_ENABLED(CONFIG_I2C)
824 ret = i2c_add_driver(&uda1380_i2c_driver);
825 if (ret != 0)
826 pr_err("Failed to register UDA1380 I2C driver: %d\n", ret);
827#endif
828 return ret;
829}
830module_init(uda1380_modinit);
831
832static void __exit uda1380_exit(void)
833{
834#if IS_ENABLED(CONFIG_I2C)
835 i2c_del_driver(&uda1380_i2c_driver);
836#endif
837}
838module_exit(uda1380_exit);
839 804
840MODULE_AUTHOR("Giorgio Padrin"); 805MODULE_AUTHOR("Giorgio Padrin");
841MODULE_DESCRIPTION("Audio support for codec Philips UDA1380"); 806MODULE_DESCRIPTION("Audio support for codec Philips UDA1380");
diff --git a/sound/soc/codecs/uda1380.h b/sound/soc/codecs/uda1380.h
index 942e3927c72b..69a326ac3c1a 100644
--- a/sound/soc/codecs/uda1380.h
+++ b/sound/soc/codecs/uda1380.h
@@ -72,8 +72,4 @@
72#define R22_SKIP_DCFIL 0x0002 72#define R22_SKIP_DCFIL 0x0002
73#define R23_AGC_EN 0x0001 73#define R23_AGC_EN 0x0001
74 74
75#define UDA1380_DAI_DUPLEX 0 /* playback and capture on single DAI */
76#define UDA1380_DAI_PLAYBACK 1 /* playback DAI */
77#define UDA1380_DAI_CAPTURE 2 /* capture DAI */
78
79#endif /* _UDA1380_H */ 75#endif /* _UDA1380_H */
diff --git a/sound/soc/codecs/wm2200.c b/sound/soc/codecs/wm2200.c
index 606bf88abfc4..d83dab57a1d1 100644
--- a/sound/soc/codecs/wm2200.c
+++ b/sound/soc/codecs/wm2200.c
@@ -999,7 +999,7 @@ static DECLARE_TLV_DB_SCALE(in_tlv, -6300, 100, 0);
999static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0); 999static DECLARE_TLV_DB_SCALE(digital_tlv, -6400, 50, 0);
1000static DECLARE_TLV_DB_SCALE(out_tlv, -6400, 100, 0); 1000static DECLARE_TLV_DB_SCALE(out_tlv, -6400, 100, 0);
1001 1001
1002static const char *wm2200_mixer_texts[] = { 1002static const char * const wm2200_mixer_texts[] = {
1003 "None", 1003 "None",
1004 "Tone Generator", 1004 "Tone Generator",
1005 "AEC Loopback", 1005 "AEC Loopback",
@@ -1033,7 +1033,7 @@ static const char *wm2200_mixer_texts[] = {
1033 "DSP2.6", 1033 "DSP2.6",
1034}; 1034};
1035 1035
1036static int wm2200_mixer_values[] = { 1036static unsigned int wm2200_mixer_values[] = {
1037 0x00, 1037 0x00,
1038 0x04, /* Tone */ 1038 0x04, /* Tone */
1039 0x08, /* AEC */ 1039 0x08, /* AEC */
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
index 93876c6d48ee..e7ab37d0dd32 100644
--- a/sound/soc/codecs/wm5102.c
+++ b/sound/soc/codecs/wm5102.c
@@ -607,6 +607,9 @@ static int wm5102_sysclk_ev(struct snd_soc_dapm_widget *w,
607 break; 607 break;
608 case SND_SOC_DAPM_PRE_PMD: 608 case SND_SOC_DAPM_PRE_PMD:
609 break; 609 break;
610 case SND_SOC_DAPM_PRE_PMU:
611 case SND_SOC_DAPM_POST_PMD:
612 return arizona_clk_ev(w, kcontrol, event);
610 default: 613 default:
611 return 0; 614 return 0;
612 } 615 }
@@ -1077,9 +1080,11 @@ static const struct snd_kcontrol_new wm5102_aec_loopback_mux =
1077static const struct snd_soc_dapm_widget wm5102_dapm_widgets[] = { 1080static const struct snd_soc_dapm_widget wm5102_dapm_widgets[] = {
1078SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, 1081SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
1079 0, wm5102_sysclk_ev, 1082 0, wm5102_sysclk_ev,
1080 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 1083 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
1084 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1081SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, 1085SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
1082 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), 1086 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
1087 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1083SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, 1088SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
1084 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0), 1089 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
1085SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK, 1090SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
@@ -1903,7 +1908,7 @@ static struct snd_soc_dai_driver wm5102_dai[] = {
1903static int wm5102_open(struct snd_compr_stream *stream) 1908static int wm5102_open(struct snd_compr_stream *stream)
1904{ 1909{
1905 struct snd_soc_pcm_runtime *rtd = stream->private_data; 1910 struct snd_soc_pcm_runtime *rtd = stream->private_data;
1906 struct wm5102_priv *priv = snd_soc_codec_get_drvdata(rtd->codec); 1911 struct wm5102_priv *priv = snd_soc_platform_get_drvdata(rtd->platform);
1907 1912
1908 return wm_adsp_compr_open(&priv->core.adsp[0], stream); 1913 return wm_adsp_compr_open(&priv->core.adsp[0], stream);
1909} 1914}
@@ -1926,18 +1931,10 @@ static irqreturn_t wm5102_adsp2_irq(int irq, void *data)
1926static int wm5102_codec_probe(struct snd_soc_codec *codec) 1931static int wm5102_codec_probe(struct snd_soc_codec *codec)
1927{ 1932{
1928 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 1933 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1934 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
1929 struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec); 1935 struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec);
1930 struct arizona *arizona = priv->core.arizona;
1931 int ret; 1936 int ret;
1932 1937
1933 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
1934 "ADSP2 Compressed IRQ", wm5102_adsp2_irq,
1935 priv);
1936 if (ret != 0) {
1937 dev_err(codec->dev, "Failed to request DSP IRQ: %d\n", ret);
1938 return ret;
1939 }
1940
1941 ret = wm_adsp2_codec_probe(&priv->core.adsp[0], codec); 1938 ret = wm_adsp2_codec_probe(&priv->core.adsp[0], codec);
1942 if (ret) 1939 if (ret)
1943 return ret; 1940 return ret;
@@ -1949,8 +1946,9 @@ static int wm5102_codec_probe(struct snd_soc_codec *codec)
1949 1946
1950 arizona_init_spk(codec); 1947 arizona_init_spk(codec);
1951 arizona_init_gpio(codec); 1948 arizona_init_gpio(codec);
1949 arizona_init_notifiers(codec);
1952 1950
1953 snd_soc_dapm_disable_pin(dapm, "HAPTICS"); 1951 snd_soc_component_disable_pin(component, "HAPTICS");
1954 1952
1955 priv->core.arizona->dapm = dapm; 1953 priv->core.arizona->dapm = dapm;
1956 1954
@@ -1965,16 +1963,11 @@ err_adsp2_codec_probe:
1965static int wm5102_codec_remove(struct snd_soc_codec *codec) 1963static int wm5102_codec_remove(struct snd_soc_codec *codec)
1966{ 1964{
1967 struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec); 1965 struct wm5102_priv *priv = snd_soc_codec_get_drvdata(codec);
1968 struct arizona *arizona = priv->core.arizona;
1969 1966
1970 wm_adsp2_codec_remove(&priv->core.adsp[0], codec); 1967 wm_adsp2_codec_remove(&priv->core.adsp[0], codec);
1971 1968
1972 priv->core.arizona->dapm = NULL; 1969 priv->core.arizona->dapm = NULL;
1973 1970
1974 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
1975
1976 arizona_free_spk(codec);
1977
1978 return 0; 1971 return 0;
1979} 1972}
1980 1973
@@ -2092,25 +2085,47 @@ static int wm5102_probe(struct platform_device *pdev)
2092 pm_runtime_enable(&pdev->dev); 2085 pm_runtime_enable(&pdev->dev);
2093 pm_runtime_idle(&pdev->dev); 2086 pm_runtime_idle(&pdev->dev);
2094 2087
2088 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
2089 "ADSP2 Compressed IRQ", wm5102_adsp2_irq,
2090 wm5102);
2091 if (ret != 0) {
2092 dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
2093 return ret;
2094 }
2095
2096 ret = arizona_init_spk_irqs(arizona);
2097 if (ret < 0)
2098 goto err_dsp_irq;
2099
2095 ret = snd_soc_register_platform(&pdev->dev, &wm5102_compr_platform); 2100 ret = snd_soc_register_platform(&pdev->dev, &wm5102_compr_platform);
2096 if (ret < 0) { 2101 if (ret < 0) {
2097 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); 2102 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
2098 return ret; 2103 goto err_spk_irqs;
2099 } 2104 }
2100 2105
2101 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5102, 2106 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5102,
2102 wm5102_dai, ARRAY_SIZE(wm5102_dai)); 2107 wm5102_dai, ARRAY_SIZE(wm5102_dai));
2103 if (ret < 0) { 2108 if (ret < 0) {
2104 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); 2109 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
2105 snd_soc_unregister_platform(&pdev->dev); 2110 goto err_platform;
2106 } 2111 }
2107 2112
2108 return ret; 2113 return ret;
2114
2115err_platform:
2116 snd_soc_unregister_platform(&pdev->dev);
2117err_spk_irqs:
2118 arizona_free_spk_irqs(arizona);
2119err_dsp_irq:
2120 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5102);
2121
2122 return ret;
2109} 2123}
2110 2124
2111static int wm5102_remove(struct platform_device *pdev) 2125static int wm5102_remove(struct platform_device *pdev)
2112{ 2126{
2113 struct wm5102_priv *wm5102 = platform_get_drvdata(pdev); 2127 struct wm5102_priv *wm5102 = platform_get_drvdata(pdev);
2128 struct arizona *arizona = wm5102->core.arizona;
2114 2129
2115 snd_soc_unregister_platform(&pdev->dev); 2130 snd_soc_unregister_platform(&pdev->dev);
2116 snd_soc_unregister_codec(&pdev->dev); 2131 snd_soc_unregister_codec(&pdev->dev);
@@ -2118,6 +2133,10 @@ static int wm5102_remove(struct platform_device *pdev)
2118 2133
2119 wm_adsp2_remove(&wm5102->core.adsp[0]); 2134 wm_adsp2_remove(&wm5102->core.adsp[0]);
2120 2135
2136 arizona_free_spk_irqs(arizona);
2137
2138 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5102);
2139
2121 return 0; 2140 return 0;
2122} 2141}
2123 2142
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index 06bae3b23fce..585fc706c1b0 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -183,7 +183,9 @@ static int wm5110_sysclk_ev(struct snd_soc_dapm_widget *w,
183 regmap_write_async(regmap, patch[i].reg, 183 regmap_write_async(regmap, patch[i].reg,
184 patch[i].def); 184 patch[i].def);
185 break; 185 break;
186 186 case SND_SOC_DAPM_PRE_PMU:
187 case SND_SOC_DAPM_POST_PMD:
188 return arizona_clk_ev(w, kcontrol, event);
187 default: 189 default:
188 break; 190 break;
189 } 191 }
@@ -1073,9 +1075,11 @@ static const struct snd_kcontrol_new wm5110_output_anc_src[] = {
1073 1075
1074static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = { 1076static const struct snd_soc_dapm_widget wm5110_dapm_widgets[] = {
1075SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, 1077SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
1076 0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU), 1078 0, wm5110_sysclk_ev, SND_SOC_DAPM_POST_PMU |
1079 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1077SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, 1080SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
1078 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), 1081 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
1082 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1079SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, 1083SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
1080 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0), 1084 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
1081SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK, 1085SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
@@ -2220,7 +2224,7 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
2220static int wm5110_open(struct snd_compr_stream *stream) 2224static int wm5110_open(struct snd_compr_stream *stream)
2221{ 2225{
2222 struct snd_soc_pcm_runtime *rtd = stream->private_data; 2226 struct snd_soc_pcm_runtime *rtd = stream->private_data;
2223 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(rtd->codec); 2227 struct wm5110_priv *priv = snd_soc_platform_get_drvdata(rtd->platform);
2224 struct arizona *arizona = priv->core.arizona; 2228 struct arizona *arizona = priv->core.arizona;
2225 int n_adsp; 2229 int n_adsp;
2226 2230
@@ -2269,8 +2273,8 @@ static irqreturn_t wm5110_adsp2_irq(int irq, void *data)
2269static int wm5110_codec_probe(struct snd_soc_codec *codec) 2273static int wm5110_codec_probe(struct snd_soc_codec *codec)
2270{ 2274{
2271 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 2275 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2276 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
2272 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec); 2277 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
2273 struct arizona *arizona = priv->core.arizona;
2274 int i, ret; 2278 int i, ret;
2275 2279
2276 priv->core.arizona->dapm = dapm; 2280 priv->core.arizona->dapm = dapm;
@@ -2280,14 +2284,6 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
2280 arizona_init_mono(codec); 2284 arizona_init_mono(codec);
2281 arizona_init_notifiers(codec); 2285 arizona_init_notifiers(codec);
2282 2286
2283 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
2284 "ADSP2 Compressed IRQ", wm5110_adsp2_irq,
2285 priv);
2286 if (ret != 0) {
2287 dev_err(codec->dev, "Failed to request DSP IRQ: %d\n", ret);
2288 return ret;
2289 }
2290
2291 for (i = 0; i < WM5110_NUM_ADSP; ++i) { 2287 for (i = 0; i < WM5110_NUM_ADSP; ++i) {
2292 ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec); 2288 ret = wm_adsp2_codec_probe(&priv->core.adsp[i], codec);
2293 if (ret) 2289 if (ret)
@@ -2300,7 +2296,7 @@ static int wm5110_codec_probe(struct snd_soc_codec *codec)
2300 if (ret) 2296 if (ret)
2301 goto err_adsp2_codec_probe; 2297 goto err_adsp2_codec_probe;
2302 2298
2303 snd_soc_dapm_disable_pin(dapm, "HAPTICS"); 2299 snd_soc_component_disable_pin(component, "HAPTICS");
2304 2300
2305 return 0; 2301 return 0;
2306 2302
@@ -2308,15 +2304,12 @@ err_adsp2_codec_probe:
2308 for (--i; i >= 0; --i) 2304 for (--i; i >= 0; --i)
2309 wm_adsp2_codec_remove(&priv->core.adsp[i], codec); 2305 wm_adsp2_codec_remove(&priv->core.adsp[i], codec);
2310 2306
2311 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
2312
2313 return ret; 2307 return ret;
2314} 2308}
2315 2309
2316static int wm5110_codec_remove(struct snd_soc_codec *codec) 2310static int wm5110_codec_remove(struct snd_soc_codec *codec)
2317{ 2311{
2318 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec); 2312 struct wm5110_priv *priv = snd_soc_codec_get_drvdata(codec);
2319 struct arizona *arizona = priv->core.arizona;
2320 int i; 2313 int i;
2321 2314
2322 for (i = 0; i < WM5110_NUM_ADSP; ++i) 2315 for (i = 0; i < WM5110_NUM_ADSP; ++i)
@@ -2324,10 +2317,6 @@ static int wm5110_codec_remove(struct snd_soc_codec *codec)
2324 2317
2325 priv->core.arizona->dapm = NULL; 2318 priv->core.arizona->dapm = NULL;
2326 2319
2327 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, priv);
2328
2329 arizona_free_spk(codec);
2330
2331 return 0; 2320 return 0;
2332} 2321}
2333 2322
@@ -2449,25 +2438,47 @@ static int wm5110_probe(struct platform_device *pdev)
2449 pm_runtime_enable(&pdev->dev); 2438 pm_runtime_enable(&pdev->dev);
2450 pm_runtime_idle(&pdev->dev); 2439 pm_runtime_idle(&pdev->dev);
2451 2440
2441 ret = arizona_request_irq(arizona, ARIZONA_IRQ_DSP_IRQ1,
2442 "ADSP2 Compressed IRQ", wm5110_adsp2_irq,
2443 wm5110);
2444 if (ret != 0) {
2445 dev_err(&pdev->dev, "Failed to request DSP IRQ: %d\n", ret);
2446 return ret;
2447 }
2448
2449 ret = arizona_init_spk_irqs(arizona);
2450 if (ret < 0)
2451 goto err_dsp_irq;
2452
2452 ret = snd_soc_register_platform(&pdev->dev, &wm5110_compr_platform); 2453 ret = snd_soc_register_platform(&pdev->dev, &wm5110_compr_platform);
2453 if (ret < 0) { 2454 if (ret < 0) {
2454 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret); 2455 dev_err(&pdev->dev, "Failed to register platform: %d\n", ret);
2455 return ret; 2456 goto err_spk_irqs;
2456 } 2457 }
2457 2458
2458 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110, 2459 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm5110,
2459 wm5110_dai, ARRAY_SIZE(wm5110_dai)); 2460 wm5110_dai, ARRAY_SIZE(wm5110_dai));
2460 if (ret < 0) { 2461 if (ret < 0) {
2461 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret); 2462 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
2462 snd_soc_unregister_platform(&pdev->dev); 2463 goto err_platform;
2463 } 2464 }
2464 2465
2465 return ret; 2466 return ret;
2467
2468err_platform:
2469 snd_soc_unregister_platform(&pdev->dev);
2470err_spk_irqs:
2471 arizona_free_spk_irqs(arizona);
2472err_dsp_irq:
2473 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5110);
2474
2475 return ret;
2466} 2476}
2467 2477
2468static int wm5110_remove(struct platform_device *pdev) 2478static int wm5110_remove(struct platform_device *pdev)
2469{ 2479{
2470 struct wm5110_priv *wm5110 = platform_get_drvdata(pdev); 2480 struct wm5110_priv *wm5110 = platform_get_drvdata(pdev);
2481 struct arizona *arizona = wm5110->core.arizona;
2471 int i; 2482 int i;
2472 2483
2473 snd_soc_unregister_platform(&pdev->dev); 2484 snd_soc_unregister_platform(&pdev->dev);
@@ -2477,6 +2488,10 @@ static int wm5110_remove(struct platform_device *pdev)
2477 for (i = 0; i < WM5110_NUM_ADSP; i++) 2488 for (i = 0; i < WM5110_NUM_ADSP; i++)
2478 wm_adsp2_remove(&wm5110->core.adsp[i]); 2489 wm_adsp2_remove(&wm5110->core.adsp[i]);
2479 2490
2491 arizona_free_spk_irqs(arizona);
2492
2493 arizona_free_irq(arizona, ARIZONA_IRQ_DSP_IRQ1, wm5110);
2494
2480 return 0; 2495 return 0;
2481} 2496}
2482 2497
diff --git a/sound/soc/codecs/wm8523.c b/sound/soc/codecs/wm8523.c
index deb2e075428e..6d0a2723bfde 100644
--- a/sound/soc/codecs/wm8523.c
+++ b/sound/soc/codecs/wm8523.c
@@ -446,7 +446,6 @@ static const struct regmap_config wm8523_regmap = {
446 .volatile_reg = wm8523_volatile_register, 446 .volatile_reg = wm8523_volatile_register,
447}; 447};
448 448
449#if IS_ENABLED(CONFIG_I2C)
450static int wm8523_i2c_probe(struct i2c_client *i2c, 449static int wm8523_i2c_probe(struct i2c_client *i2c,
451 const struct i2c_device_id *id) 450 const struct i2c_device_id *id)
452{ 451{
@@ -543,29 +542,8 @@ static struct i2c_driver wm8523_i2c_driver = {
543 .remove = wm8523_i2c_remove, 542 .remove = wm8523_i2c_remove,
544 .id_table = wm8523_i2c_id, 543 .id_table = wm8523_i2c_id,
545}; 544};
546#endif
547 545
548static int __init wm8523_modinit(void) 546module_i2c_driver(wm8523_i2c_driver);
549{
550 int ret;
551#if IS_ENABLED(CONFIG_I2C)
552 ret = i2c_add_driver(&wm8523_i2c_driver);
553 if (ret != 0) {
554 printk(KERN_ERR "Failed to register WM8523 I2C driver: %d\n",
555 ret);
556 }
557#endif
558 return 0;
559}
560module_init(wm8523_modinit);
561
562static void __exit wm8523_exit(void)
563{
564#if IS_ENABLED(CONFIG_I2C)
565 i2c_del_driver(&wm8523_i2c_driver);
566#endif
567}
568module_exit(wm8523_exit);
569 547
570MODULE_DESCRIPTION("ASoC WM8523 driver"); 548MODULE_DESCRIPTION("ASoC WM8523 driver");
571MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 549MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
diff --git a/sound/soc/codecs/wm8580.c b/sound/soc/codecs/wm8580.c
index faa7287a5253..910801dddd64 100644
--- a/sound/soc/codecs/wm8580.c
+++ b/sound/soc/codecs/wm8580.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * wm8580.c -- WM8580 ALSA Soc Audio driver 2 * wm8580.c -- WM8580 and WM8581 ALSA Soc Audio driver
3 * 3 *
4 * Copyright 2008-12 Wolfson Microelectronics PLC. 4 * Copyright 2008-12 Wolfson Microelectronics PLC.
5 * 5 *
@@ -12,6 +12,9 @@
12 * The WM8580 is a multichannel codec with S/PDIF support, featuring six 12 * The WM8580 is a multichannel codec with S/PDIF support, featuring six
13 * DAC channels and two ADC channels. 13 * DAC channels and two ADC channels.
14 * 14 *
15 * The WM8581 is a multichannel codec with S/PDIF support, featuring eight
16 * DAC channels and two ADC channels.
17 *
15 * Currently only the primary audio interface is supported - S/PDIF and 18 * Currently only the primary audio interface is supported - S/PDIF and
16 * the secondary audio interfaces are not. 19 * the secondary audio interfaces are not.
17 */ 20 */
@@ -65,6 +68,8 @@
65#define WM8580_DIGITAL_ATTENUATION_DACR2 0x17 68#define WM8580_DIGITAL_ATTENUATION_DACR2 0x17
66#define WM8580_DIGITAL_ATTENUATION_DACL3 0x18 69#define WM8580_DIGITAL_ATTENUATION_DACL3 0x18
67#define WM8580_DIGITAL_ATTENUATION_DACR3 0x19 70#define WM8580_DIGITAL_ATTENUATION_DACR3 0x19
71#define WM8581_DIGITAL_ATTENUATION_DACL4 0x1A
72#define WM8581_DIGITAL_ATTENUATION_DACR4 0x1B
68#define WM8580_MASTER_DIGITAL_ATTENUATION 0x1C 73#define WM8580_MASTER_DIGITAL_ATTENUATION 0x1C
69#define WM8580_ADC_CONTROL1 0x1D 74#define WM8580_ADC_CONTROL1 0x1D
70#define WM8580_SPDTXCHAN0 0x1E 75#define WM8580_SPDTXCHAN0 0x1E
@@ -236,12 +241,17 @@ static const char *wm8580_supply_names[WM8580_NUM_SUPPLIES] = {
236 "PVDD", 241 "PVDD",
237}; 242};
238 243
244struct wm8580_driver_data {
245 int num_dacs;
246};
247
239/* codec private data */ 248/* codec private data */
240struct wm8580_priv { 249struct wm8580_priv {
241 struct regmap *regmap; 250 struct regmap *regmap;
242 struct regulator_bulk_data supplies[WM8580_NUM_SUPPLIES]; 251 struct regulator_bulk_data supplies[WM8580_NUM_SUPPLIES];
243 struct pll_state a; 252 struct pll_state a;
244 struct pll_state b; 253 struct pll_state b;
254 const struct wm8580_driver_data *drvdata;
245 int sysclk[2]; 255 int sysclk[2];
246}; 256};
247 257
@@ -306,6 +316,19 @@ SOC_DOUBLE("Capture Switch", WM8580_ADC_CONTROL1, 0, 1, 1, 1),
306SOC_SINGLE("Capture High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0), 316SOC_SINGLE("Capture High-Pass Filter Switch", WM8580_ADC_CONTROL1, 4, 1, 0),
307}; 317};
308 318
319static const struct snd_kcontrol_new wm8581_snd_controls[] = {
320SOC_DOUBLE_R_EXT_TLV("DAC4 Playback Volume",
321 WM8581_DIGITAL_ATTENUATION_DACL4,
322 WM8581_DIGITAL_ATTENUATION_DACR4,
323 0, 0xff, 0, snd_soc_get_volsw, wm8580_out_vu, dac_tlv),
324
325SOC_SINGLE("DAC4 Deemphasis Switch", WM8580_DAC_CONTROL3, 3, 1, 0),
326
327SOC_DOUBLE("DAC4 Invert Switch", WM8580_DAC_CONTROL4, 8, 7, 1, 0),
328
329SOC_SINGLE("DAC4 Switch", WM8580_DAC_CONTROL5, 3, 1, 1),
330};
331
309static const struct snd_soc_dapm_widget wm8580_dapm_widgets[] = { 332static const struct snd_soc_dapm_widget wm8580_dapm_widgets[] = {
310SND_SOC_DAPM_DAC("DAC1", "Playback", WM8580_PWRDN1, 2, 1), 333SND_SOC_DAPM_DAC("DAC1", "Playback", WM8580_PWRDN1, 2, 1),
311SND_SOC_DAPM_DAC("DAC2", "Playback", WM8580_PWRDN1, 3, 1), 334SND_SOC_DAPM_DAC("DAC2", "Playback", WM8580_PWRDN1, 3, 1),
@@ -324,6 +347,13 @@ SND_SOC_DAPM_INPUT("AINL"),
324SND_SOC_DAPM_INPUT("AINR"), 347SND_SOC_DAPM_INPUT("AINR"),
325}; 348};
326 349
350static const struct snd_soc_dapm_widget wm8581_dapm_widgets[] = {
351SND_SOC_DAPM_DAC("DAC4", "Playback", WM8580_PWRDN1, 5, 1),
352
353SND_SOC_DAPM_OUTPUT("VOUT4L"),
354SND_SOC_DAPM_OUTPUT("VOUT4R"),
355};
356
327static const struct snd_soc_dapm_route wm8580_dapm_routes[] = { 357static const struct snd_soc_dapm_route wm8580_dapm_routes[] = {
328 { "VOUT1L", NULL, "DAC1" }, 358 { "VOUT1L", NULL, "DAC1" },
329 { "VOUT1R", NULL, "DAC1" }, 359 { "VOUT1R", NULL, "DAC1" },
@@ -338,6 +368,11 @@ static const struct snd_soc_dapm_route wm8580_dapm_routes[] = {
338 { "ADC", NULL, "AINR" }, 368 { "ADC", NULL, "AINR" },
339}; 369};
340 370
371static const struct snd_soc_dapm_route wm8581_dapm_routes[] = {
372 { "VOUT4L", NULL, "DAC4" },
373 { "VOUT4R", NULL, "DAC4" },
374};
375
341/* PLL divisors */ 376/* PLL divisors */
342struct _pll_div { 377struct _pll_div {
343 u32 prescale:1; 378 u32 prescale:1;
@@ -815,10 +850,21 @@ static int wm8580_set_bias_level(struct snd_soc_codec *codec,
815 return 0; 850 return 0;
816} 851}
817 852
853static int wm8580_playback_startup(struct snd_pcm_substream *substream,
854 struct snd_soc_dai *dai)
855{
856 struct snd_soc_codec *codec = dai->codec;
857 struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
858
859 return snd_pcm_hw_constraint_minmax(substream->runtime,
860 SNDRV_PCM_HW_PARAM_CHANNELS, 1, wm8580->drvdata->num_dacs * 2);
861}
862
818#define WM8580_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\ 863#define WM8580_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S20_3LE |\
819 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE) 864 SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
820 865
821static const struct snd_soc_dai_ops wm8580_dai_ops_playback = { 866static const struct snd_soc_dai_ops wm8580_dai_ops_playback = {
867 .startup = wm8580_playback_startup,
822 .set_sysclk = wm8580_set_sysclk, 868 .set_sysclk = wm8580_set_sysclk,
823 .hw_params = wm8580_paif_hw_params, 869 .hw_params = wm8580_paif_hw_params,
824 .set_fmt = wm8580_set_paif_dai_fmt, 870 .set_fmt = wm8580_set_paif_dai_fmt,
@@ -842,7 +888,6 @@ static struct snd_soc_dai_driver wm8580_dai[] = {
842 .playback = { 888 .playback = {
843 .stream_name = "Playback", 889 .stream_name = "Playback",
844 .channels_min = 1, 890 .channels_min = 1,
845 .channels_max = 6,
846 .rates = SNDRV_PCM_RATE_8000_192000, 891 .rates = SNDRV_PCM_RATE_8000_192000,
847 .formats = WM8580_FORMATS, 892 .formats = WM8580_FORMATS,
848 }, 893 },
@@ -865,8 +910,22 @@ static struct snd_soc_dai_driver wm8580_dai[] = {
865static int wm8580_probe(struct snd_soc_codec *codec) 910static int wm8580_probe(struct snd_soc_codec *codec)
866{ 911{
867 struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec); 912 struct wm8580_priv *wm8580 = snd_soc_codec_get_drvdata(codec);
913 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
868 int ret = 0; 914 int ret = 0;
869 915
916 switch (wm8580->drvdata->num_dacs) {
917 case 4:
918 snd_soc_add_codec_controls(codec, wm8581_snd_controls,
919 ARRAY_SIZE(wm8581_snd_controls));
920 snd_soc_dapm_new_controls(dapm, wm8581_dapm_widgets,
921 ARRAY_SIZE(wm8581_dapm_widgets));
922 snd_soc_dapm_add_routes(dapm, wm8581_dapm_routes,
923 ARRAY_SIZE(wm8581_dapm_routes));
924 break;
925 default:
926 break;
927 }
928
870 ret = regulator_bulk_enable(ARRAY_SIZE(wm8580->supplies), 929 ret = regulator_bulk_enable(ARRAY_SIZE(wm8580->supplies),
871 wm8580->supplies); 930 wm8580->supplies);
872 if (ret != 0) { 931 if (ret != 0) {
@@ -914,12 +973,6 @@ static const struct snd_soc_codec_driver soc_codec_dev_wm8580 = {
914 }, 973 },
915}; 974};
916 975
917static const struct of_device_id wm8580_of_match[] = {
918 { .compatible = "wlf,wm8580" },
919 { },
920};
921MODULE_DEVICE_TABLE(of, wm8580_of_match);
922
923static const struct regmap_config wm8580_regmap = { 976static const struct regmap_config wm8580_regmap = {
924 .reg_bits = 7, 977 .reg_bits = 7,
925 .val_bits = 9, 978 .val_bits = 9,
@@ -932,10 +985,25 @@ static const struct regmap_config wm8580_regmap = {
932 .volatile_reg = wm8580_volatile, 985 .volatile_reg = wm8580_volatile,
933}; 986};
934 987
935#if IS_ENABLED(CONFIG_I2C) 988static const struct wm8580_driver_data wm8580_data = {
989 .num_dacs = 3,
990};
991
992static const struct wm8580_driver_data wm8581_data = {
993 .num_dacs = 4,
994};
995
996static const struct of_device_id wm8580_of_match[] = {
997 { .compatible = "wlf,wm8580", .data = &wm8580_data },
998 { .compatible = "wlf,wm8581", .data = &wm8581_data },
999 { },
1000};
1001MODULE_DEVICE_TABLE(of, wm8580_of_match);
1002
936static int wm8580_i2c_probe(struct i2c_client *i2c, 1003static int wm8580_i2c_probe(struct i2c_client *i2c,
937 const struct i2c_device_id *id) 1004 const struct i2c_device_id *id)
938{ 1005{
1006 const struct of_device_id *of_id;
939 struct wm8580_priv *wm8580; 1007 struct wm8580_priv *wm8580;
940 int ret, i; 1008 int ret, i;
941 1009
@@ -960,6 +1028,15 @@ static int wm8580_i2c_probe(struct i2c_client *i2c,
960 1028
961 i2c_set_clientdata(i2c, wm8580); 1029 i2c_set_clientdata(i2c, wm8580);
962 1030
1031 of_id = of_match_device(wm8580_of_match, &i2c->dev);
1032 if (of_id)
1033 wm8580->drvdata = of_id->data;
1034
1035 if (!wm8580->drvdata) {
1036 dev_err(&i2c->dev, "failed to find driver data\n");
1037 return -EINVAL;
1038 }
1039
963 ret = snd_soc_register_codec(&i2c->dev, 1040 ret = snd_soc_register_codec(&i2c->dev,
964 &soc_codec_dev_wm8580, wm8580_dai, ARRAY_SIZE(wm8580_dai)); 1041 &soc_codec_dev_wm8580, wm8580_dai, ARRAY_SIZE(wm8580_dai));
965 1042
@@ -973,7 +1050,8 @@ static int wm8580_i2c_remove(struct i2c_client *client)
973} 1050}
974 1051
975static const struct i2c_device_id wm8580_i2c_id[] = { 1052static const struct i2c_device_id wm8580_i2c_id[] = {
976 { "wm8580", 0 }, 1053 { "wm8580", (kernel_ulong_t)&wm8580_data },
1054 { "wm8581", (kernel_ulong_t)&wm8581_data },
977 { } 1055 { }
978}; 1056};
979MODULE_DEVICE_TABLE(i2c, wm8580_i2c_id); 1057MODULE_DEVICE_TABLE(i2c, wm8580_i2c_id);
@@ -987,31 +1065,10 @@ static struct i2c_driver wm8580_i2c_driver = {
987 .remove = wm8580_i2c_remove, 1065 .remove = wm8580_i2c_remove,
988 .id_table = wm8580_i2c_id, 1066 .id_table = wm8580_i2c_id,
989}; 1067};
990#endif
991 1068
992static int __init wm8580_modinit(void) 1069module_i2c_driver(wm8580_i2c_driver);
993{
994 int ret = 0;
995
996#if IS_ENABLED(CONFIG_I2C)
997 ret = i2c_add_driver(&wm8580_i2c_driver);
998 if (ret != 0) {
999 pr_err("Failed to register WM8580 I2C driver: %d\n", ret);
1000 }
1001#endif
1002
1003 return ret;
1004}
1005module_init(wm8580_modinit);
1006
1007static void __exit wm8580_exit(void)
1008{
1009#if IS_ENABLED(CONFIG_I2C)
1010 i2c_del_driver(&wm8580_i2c_driver);
1011#endif
1012}
1013module_exit(wm8580_exit);
1014 1070
1015MODULE_DESCRIPTION("ASoC WM8580 driver"); 1071MODULE_DESCRIPTION("ASoC WM8580 driver");
1016MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>"); 1072MODULE_AUTHOR("Mark Brown <broonie@opensource.wolfsonmicro.com>");
1073MODULE_AUTHOR("Matt Flax <flatmax@flatmax.org>");
1017MODULE_LICENSE("GPL"); 1074MODULE_LICENSE("GPL");
diff --git a/sound/soc/codecs/wm8753.h b/sound/soc/codecs/wm8753.h
index 94edac144bcb..8b39e3677ac8 100644
--- a/sound/soc/codecs/wm8753.h
+++ b/sound/soc/codecs/wm8753.h
@@ -112,7 +112,4 @@
112#define WM8753_VXCLK_DIV_8 (3 << 6) 112#define WM8753_VXCLK_DIV_8 (3 << 6)
113#define WM8753_VXCLK_DIV_16 (4 << 6) 113#define WM8753_VXCLK_DIV_16 (4 << 6)
114 114
115#define WM8753_DAI_HIFI 0
116#define WM8753_DAI_VOICE 1
117
118#endif 115#endif
diff --git a/sound/soc/codecs/wm8978.h b/sound/soc/codecs/wm8978.h
index 6ae43495b7cf..0dcf6868dff6 100644
--- a/sound/soc/codecs/wm8978.h
+++ b/sound/soc/codecs/wm8978.h
@@ -78,8 +78,8 @@ enum wm8978_clk_id {
78}; 78};
79 79
80enum wm8978_sysclk_src { 80enum wm8978_sysclk_src {
81 WM8978_MCLK = 0,
81 WM8978_PLL, 82 WM8978_PLL,
82 WM8978_MCLK
83}; 83};
84 84
85#endif /* __WM8978_H__ */ 85#endif /* __WM8978_H__ */
diff --git a/sound/soc/codecs/wm8997.c b/sound/soc/codecs/wm8997.c
index 2f2821b3382f..ee0c8639c743 100644
--- a/sound/soc/codecs/wm8997.c
+++ b/sound/soc/codecs/wm8997.c
@@ -108,6 +108,9 @@ static int wm8997_sysclk_ev(struct snd_soc_dapm_widget *w,
108 break; 108 break;
109 case SND_SOC_DAPM_PRE_PMD: 109 case SND_SOC_DAPM_PRE_PMD:
110 break; 110 break;
111 case SND_SOC_DAPM_PRE_PMU:
112 case SND_SOC_DAPM_POST_PMD:
113 return arizona_clk_ev(w, kcontrol, event);
111 default: 114 default:
112 return 0; 115 return 0;
113 } 116 }
@@ -408,9 +411,11 @@ static const struct snd_kcontrol_new wm8997_aec_loopback_mux =
408static const struct snd_soc_dapm_widget wm8997_dapm_widgets[] = { 411static const struct snd_soc_dapm_widget wm8997_dapm_widgets[] = {
409SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT, 412SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, ARIZONA_SYSCLK_ENA_SHIFT,
410 0, wm8997_sysclk_ev, 413 0, wm8997_sysclk_ev,
411 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD), 414 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
415 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
412SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, 416SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
413 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), 417 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
418 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
414SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, 419SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
415 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0), 420 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
416SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK, 421SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
@@ -1055,11 +1060,13 @@ static struct snd_soc_dai_driver wm8997_dai[] = {
1055static int wm8997_codec_probe(struct snd_soc_codec *codec) 1060static int wm8997_codec_probe(struct snd_soc_codec *codec)
1056{ 1061{
1057 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 1062 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1063 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
1058 struct wm8997_priv *priv = snd_soc_codec_get_drvdata(codec); 1064 struct wm8997_priv *priv = snd_soc_codec_get_drvdata(codec);
1059 1065
1060 arizona_init_spk(codec); 1066 arizona_init_spk(codec);
1067 arizona_init_notifiers(codec);
1061 1068
1062 snd_soc_dapm_disable_pin(dapm, "HAPTICS"); 1069 snd_soc_component_disable_pin(component, "HAPTICS");
1063 1070
1064 priv->core.arizona->dapm = dapm; 1071 priv->core.arizona->dapm = dapm;
1065 1072
@@ -1072,8 +1079,6 @@ static int wm8997_codec_remove(struct snd_soc_codec *codec)
1072 1079
1073 priv->core.arizona->dapm = NULL; 1080 priv->core.arizona->dapm = NULL;
1074 1081
1075 arizona_free_spk(codec);
1076
1077 return 0; 1082 return 0;
1078} 1083}
1079 1084
@@ -1119,7 +1124,7 @@ static int wm8997_probe(struct platform_device *pdev)
1119{ 1124{
1120 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); 1125 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1121 struct wm8997_priv *wm8997; 1126 struct wm8997_priv *wm8997;
1122 int i; 1127 int i, ret;
1123 1128
1124 wm8997 = devm_kzalloc(&pdev->dev, sizeof(struct wm8997_priv), 1129 wm8997 = devm_kzalloc(&pdev->dev, sizeof(struct wm8997_priv),
1125 GFP_KERNEL); 1130 GFP_KERNEL);
@@ -1159,15 +1164,33 @@ static int wm8997_probe(struct platform_device *pdev)
1159 pm_runtime_enable(&pdev->dev); 1164 pm_runtime_enable(&pdev->dev);
1160 pm_runtime_idle(&pdev->dev); 1165 pm_runtime_idle(&pdev->dev);
1161 1166
1162 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8997, 1167 ret = arizona_init_spk_irqs(arizona);
1163 wm8997_dai, ARRAY_SIZE(wm8997_dai)); 1168 if (ret < 0)
1169 return ret;
1170
1171 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8997,
1172 wm8997_dai, ARRAY_SIZE(wm8997_dai));
1173 if (ret < 0) {
1174 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
1175 goto err_spk_irqs;
1176 }
1177
1178err_spk_irqs:
1179 arizona_free_spk_irqs(arizona);
1180
1181 return ret;
1164} 1182}
1165 1183
1166static int wm8997_remove(struct platform_device *pdev) 1184static int wm8997_remove(struct platform_device *pdev)
1167{ 1185{
1186 struct wm8997_priv *wm8997 = platform_get_drvdata(pdev);
1187 struct arizona *arizona = wm8997->core.arizona;
1188
1168 snd_soc_unregister_codec(&pdev->dev); 1189 snd_soc_unregister_codec(&pdev->dev);
1169 pm_runtime_disable(&pdev->dev); 1190 pm_runtime_disable(&pdev->dev);
1170 1191
1192 arizona_free_spk_irqs(arizona);
1193
1171 return 0; 1194 return 0;
1172} 1195}
1173 1196
diff --git a/sound/soc/codecs/wm8998.c b/sound/soc/codecs/wm8998.c
index bcc2e1060a6c..3694f5958d86 100644
--- a/sound/soc/codecs/wm8998.c
+++ b/sound/soc/codecs/wm8998.c
@@ -541,9 +541,11 @@ static const struct snd_kcontrol_new wm8998_aec_loopback_mux[] = {
541 541
542static const struct snd_soc_dapm_widget wm8998_dapm_widgets[] = { 542static const struct snd_soc_dapm_widget wm8998_dapm_widgets[] = {
543SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1, 543SND_SOC_DAPM_SUPPLY("SYSCLK", ARIZONA_SYSTEM_CLOCK_1,
544 ARIZONA_SYSCLK_ENA_SHIFT, 0, NULL, 0), 544 ARIZONA_SYSCLK_ENA_SHIFT, 0, arizona_clk_ev,
545 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
545SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1, 546SND_SOC_DAPM_SUPPLY("ASYNCCLK", ARIZONA_ASYNC_CLOCK_1,
546 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, NULL, 0), 547 ARIZONA_ASYNC_CLK_ENA_SHIFT, 0, arizona_clk_ev,
548 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
547SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK, 549SND_SOC_DAPM_SUPPLY("OPCLK", ARIZONA_OUTPUT_SYSTEM_CLOCK,
548 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0), 550 ARIZONA_OPCLK_ENA_SHIFT, 0, NULL, 0),
549SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK, 551SND_SOC_DAPM_SUPPLY("ASYNCOPCLK", ARIZONA_OUTPUT_ASYNC_CLOCK,
@@ -1318,13 +1320,15 @@ static int wm8998_codec_probe(struct snd_soc_codec *codec)
1318{ 1320{
1319 struct wm8998_priv *priv = snd_soc_codec_get_drvdata(codec); 1321 struct wm8998_priv *priv = snd_soc_codec_get_drvdata(codec);
1320 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 1322 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1323 struct snd_soc_component *component = snd_soc_dapm_to_component(dapm);
1321 1324
1322 priv->core.arizona->dapm = dapm; 1325 priv->core.arizona->dapm = dapm;
1323 1326
1324 arizona_init_spk(codec); 1327 arizona_init_spk(codec);
1325 arizona_init_gpio(codec); 1328 arizona_init_gpio(codec);
1329 arizona_init_notifiers(codec);
1326 1330
1327 snd_soc_dapm_disable_pin(dapm, "HAPTICS"); 1331 snd_soc_component_disable_pin(component, "HAPTICS");
1328 1332
1329 return 0; 1333 return 0;
1330} 1334}
@@ -1335,8 +1339,6 @@ static int wm8998_codec_remove(struct snd_soc_codec *codec)
1335 1339
1336 priv->core.arizona->dapm = NULL; 1340 priv->core.arizona->dapm = NULL;
1337 1341
1338 arizona_free_spk(codec);
1339
1340 return 0; 1342 return 0;
1341} 1343}
1342 1344
@@ -1385,7 +1387,7 @@ static int wm8998_probe(struct platform_device *pdev)
1385{ 1387{
1386 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent); 1388 struct arizona *arizona = dev_get_drvdata(pdev->dev.parent);
1387 struct wm8998_priv *wm8998; 1389 struct wm8998_priv *wm8998;
1388 int i; 1390 int i, ret;
1389 1391
1390 wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv), 1392 wm8998 = devm_kzalloc(&pdev->dev, sizeof(struct wm8998_priv),
1391 GFP_KERNEL); 1393 GFP_KERNEL);
@@ -1417,15 +1419,35 @@ static int wm8998_probe(struct platform_device *pdev)
1417 pm_runtime_enable(&pdev->dev); 1419 pm_runtime_enable(&pdev->dev);
1418 pm_runtime_idle(&pdev->dev); 1420 pm_runtime_idle(&pdev->dev);
1419 1421
1420 return snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8998, 1422 ret = arizona_init_spk_irqs(arizona);
1421 wm8998_dai, ARRAY_SIZE(wm8998_dai)); 1423 if (ret < 0)
1424 return ret;
1425
1426 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wm8998,
1427 wm8998_dai, ARRAY_SIZE(wm8998_dai));
1428 if (ret < 0) {
1429 dev_err(&pdev->dev, "Failed to register codec: %d\n", ret);
1430 goto err_spk_irqs;
1431 }
1432
1433 return ret;
1434
1435err_spk_irqs:
1436 arizona_free_spk_irqs(arizona);
1437
1438 return ret;
1422} 1439}
1423 1440
1424static int wm8998_remove(struct platform_device *pdev) 1441static int wm8998_remove(struct platform_device *pdev)
1425{ 1442{
1443 struct wm8998_priv *wm8998 = platform_get_drvdata(pdev);
1444 struct arizona *arizona = wm8998->core.arizona;
1445
1426 snd_soc_unregister_codec(&pdev->dev); 1446 snd_soc_unregister_codec(&pdev->dev);
1427 pm_runtime_disable(&pdev->dev); 1447 pm_runtime_disable(&pdev->dev);
1428 1448
1449 arizona_free_spk_irqs(arizona);
1450
1429 return 0; 1451 return 0;
1430} 1452}
1431 1453
diff --git a/sound/soc/codecs/wm9081.c b/sound/soc/codecs/wm9081.c
index 856867ec2813..6febef337dd2 100644
--- a/sound/soc/codecs/wm9081.c
+++ b/sound/soc/codecs/wm9081.c
@@ -1304,7 +1304,6 @@ static const struct regmap_config wm9081_regmap = {
1304 .cache_type = REGCACHE_RBTREE, 1304 .cache_type = REGCACHE_RBTREE,
1305}; 1305};
1306 1306
1307#if IS_ENABLED(CONFIG_I2C)
1308static int wm9081_i2c_probe(struct i2c_client *i2c, 1307static int wm9081_i2c_probe(struct i2c_client *i2c,
1309 const struct i2c_device_id *id) 1308 const struct i2c_device_id *id)
1310{ 1309{
@@ -1384,7 +1383,6 @@ static struct i2c_driver wm9081_i2c_driver = {
1384 .remove = wm9081_i2c_remove, 1383 .remove = wm9081_i2c_remove,
1385 .id_table = wm9081_i2c_id, 1384 .id_table = wm9081_i2c_id,
1386}; 1385};
1387#endif
1388 1386
1389module_i2c_driver(wm9081_i2c_driver); 1387module_i2c_driver(wm9081_i2c_driver);
1390 1388
diff --git a/sound/soc/codecs/wm9705.c b/sound/soc/codecs/wm9705.c
index dcdd055db57b..f6d5c0f2aea5 100644
--- a/sound/soc/codecs/wm9705.c
+++ b/sound/soc/codecs/wm9705.c
@@ -14,37 +14,58 @@
14#include <linux/module.h> 14#include <linux/module.h>
15#include <linux/kernel.h> 15#include <linux/kernel.h>
16#include <linux/device.h> 16#include <linux/device.h>
17#include <linux/regmap.h>
17#include <sound/core.h> 18#include <sound/core.h>
18#include <sound/pcm.h> 19#include <sound/pcm.h>
19#include <sound/ac97_codec.h> 20#include <sound/ac97_codec.h>
20#include <sound/initval.h> 21#include <sound/initval.h>
21#include <sound/soc.h> 22#include <sound/soc.h>
22 23
23#include "wm9705.h"
24
25#define WM9705_VENDOR_ID 0x574d4c05 24#define WM9705_VENDOR_ID 0x574d4c05
26#define WM9705_VENDOR_ID_MASK 0xffffffff 25#define WM9705_VENDOR_ID_MASK 0xffffffff
27 26
28/* 27static const struct reg_default wm9705_reg_defaults[] = {
29 * WM9705 register cache 28 { 0x02, 0x8000 },
30 */ 29 { 0x04, 0x8000 },
31static const u16 wm9705_reg[] = { 30 { 0x06, 0x8000 },
32 0x6150, 0x8000, 0x8000, 0x8000, /* 0x0 */ 31 { 0x0a, 0x8000 },
33 0x0000, 0x8000, 0x8008, 0x8008, /* 0x8 */ 32 { 0x0c, 0x8008 },
34 0x8808, 0x8808, 0x8808, 0x8808, /* 0x10 */ 33 { 0x0e, 0x8008 },
35 0x8808, 0x0000, 0x8000, 0x0000, /* 0x18 */ 34 { 0x10, 0x8808 },
36 0x0000, 0x0000, 0x0000, 0x000f, /* 0x20 */ 35 { 0x12, 0x8808 },
37 0x0605, 0x0000, 0xbb80, 0x0000, /* 0x28 */ 36 { 0x14, 0x8808 },
38 0x0000, 0xbb80, 0x0000, 0x0000, /* 0x30 */ 37 { 0x16, 0x8808 },
39 0x0000, 0x2000, 0x0000, 0x0000, /* 0x38 */ 38 { 0x18, 0x8808 },
40 0x0000, 0x0000, 0x0000, 0x0000, /* 0x40 */ 39 { 0x1a, 0x0000 },
41 0x0000, 0x0000, 0x0000, 0x0000, /* 0x48 */ 40 { 0x1c, 0x8000 },
42 0x0000, 0x0000, 0x0000, 0x0000, /* 0x50 */ 41 { 0x20, 0x0000 },
43 0x0000, 0x0000, 0x0000, 0x0000, /* 0x58 */ 42 { 0x22, 0x0000 },
44 0x0000, 0x0000, 0x0000, 0x0000, /* 0x60 */ 43 { 0x26, 0x000f },
45 0x0000, 0x0000, 0x0000, 0x0000, /* 0x68 */ 44 { 0x28, 0x0605 },
46 0x0000, 0x0808, 0x0000, 0x0006, /* 0x70 */ 45 { 0x2a, 0x0000 },
47 0x0000, 0x0000, 0x574d, 0x4c05, /* 0x78 */ 46 { 0x2c, 0xbb80 },
47 { 0x32, 0xbb80 },
48 { 0x34, 0x2000 },
49 { 0x5a, 0x0000 },
50 { 0x5c, 0x0000 },
51 { 0x72, 0x0808 },
52 { 0x74, 0x0000 },
53 { 0x76, 0x0006 },
54 { 0x78, 0x0000 },
55 { 0x7a, 0x0000 },
56};
57
58static const struct regmap_config wm9705_regmap_config = {
59 .reg_bits = 16,
60 .reg_stride = 2,
61 .val_bits = 16,
62 .max_register = 0x7e,
63 .cache_type = REGCACHE_RBTREE,
64
65 .volatile_reg = regmap_ac97_default_volatile,
66
67 .reg_defaults = wm9705_reg_defaults,
68 .num_reg_defaults = ARRAY_SIZE(wm9705_reg_defaults),
48}; 69};
49 70
50static const struct snd_kcontrol_new wm9705_snd_ac97_controls[] = { 71static const struct snd_kcontrol_new wm9705_snd_ac97_controls[] = {
@@ -203,57 +224,20 @@ static const struct snd_soc_dapm_route wm9705_audio_map[] = {
203 {"Right ADC", NULL, "ADC PGA"}, 224 {"Right ADC", NULL, "ADC PGA"},
204}; 225};
205 226
206/* We use a register cache to enhance read performance. */
207static unsigned int ac97_read(struct snd_soc_codec *codec, unsigned int reg)
208{
209 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
210 u16 *cache = codec->reg_cache;
211
212 switch (reg) {
213 case AC97_RESET:
214 case AC97_VENDOR_ID1:
215 case AC97_VENDOR_ID2:
216 return soc_ac97_ops->read(ac97, reg);
217 default:
218 reg = reg >> 1;
219
220 if (reg >= (ARRAY_SIZE(wm9705_reg)))
221 return -EIO;
222
223 return cache[reg];
224 }
225}
226
227static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
228 unsigned int val)
229{
230 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
231 u16 *cache = codec->reg_cache;
232
233 soc_ac97_ops->write(ac97, reg, val);
234 reg = reg >> 1;
235 if (reg < (ARRAY_SIZE(wm9705_reg)))
236 cache[reg] = val;
237
238 return 0;
239}
240
241static int ac97_prepare(struct snd_pcm_substream *substream, 227static int ac97_prepare(struct snd_pcm_substream *substream,
242 struct snd_soc_dai *dai) 228 struct snd_soc_dai *dai)
243{ 229{
244 struct snd_soc_codec *codec = dai->codec; 230 struct snd_soc_codec *codec = dai->codec;
245 int reg; 231 int reg;
246 u16 vra;
247 232
248 vra = ac97_read(codec, AC97_EXTENDED_STATUS); 233 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x1, 0x1);
249 ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
250 234
251 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 235 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
252 reg = AC97_PCM_FRONT_DAC_RATE; 236 reg = AC97_PCM_FRONT_DAC_RATE;
253 else 237 else
254 reg = AC97_PCM_LR_ADC_RATE; 238 reg = AC97_PCM_LR_ADC_RATE;
255 239
256 return ac97_write(codec, reg, substream->runtime->rate); 240 return snd_soc_write(codec, reg, substream->runtime->rate);
257} 241}
258 242
259#define WM9705_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \ 243#define WM9705_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | \
@@ -299,9 +283,9 @@ static struct snd_soc_dai_driver wm9705_dai[] = {
299#ifdef CONFIG_PM 283#ifdef CONFIG_PM
300static int wm9705_soc_suspend(struct snd_soc_codec *codec) 284static int wm9705_soc_suspend(struct snd_soc_codec *codec)
301{ 285{
302 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); 286 regcache_cache_bypass(codec->component.regmap, true);
303 287 snd_soc_write(codec, AC97_POWERDOWN, 0xffff);
304 soc_ac97_ops->write(ac97, AC97_POWERDOWN, 0xffff); 288 regcache_cache_bypass(codec->component.regmap, false);
305 289
306 return 0; 290 return 0;
307} 291}
@@ -309,17 +293,14 @@ static int wm9705_soc_suspend(struct snd_soc_codec *codec)
309static int wm9705_soc_resume(struct snd_soc_codec *codec) 293static int wm9705_soc_resume(struct snd_soc_codec *codec)
310{ 294{
311 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); 295 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
312 int i, ret; 296 int ret;
313 u16 *cache = codec->reg_cache;
314 297
315 ret = snd_ac97_reset(ac97, true, WM9705_VENDOR_ID, 298 ret = snd_ac97_reset(ac97, true, WM9705_VENDOR_ID,
316 WM9705_VENDOR_ID_MASK); 299 WM9705_VENDOR_ID_MASK);
317 if (ret < 0) 300 if (ret < 0)
318 return ret; 301 return ret;
319 302
320 for (i = 2; i < ARRAY_SIZE(wm9705_reg) << 1; i += 2) { 303 regcache_sync(codec->component.regmap);
321 soc_ac97_ops->write(ac97, i, cache[i>>1]);
322 }
323 304
324 return 0; 305 return 0;
325} 306}
@@ -331,6 +312,8 @@ static int wm9705_soc_resume(struct snd_soc_codec *codec)
331static int wm9705_soc_probe(struct snd_soc_codec *codec) 312static int wm9705_soc_probe(struct snd_soc_codec *codec)
332{ 313{
333 struct snd_ac97 *ac97; 314 struct snd_ac97 *ac97;
315 struct regmap *regmap;
316 int ret;
334 317
335 ac97 = snd_soc_new_ac97_codec(codec, WM9705_VENDOR_ID, 318 ac97 = snd_soc_new_ac97_codec(codec, WM9705_VENDOR_ID,
336 WM9705_VENDOR_ID_MASK); 319 WM9705_VENDOR_ID_MASK);
@@ -339,15 +322,26 @@ static int wm9705_soc_probe(struct snd_soc_codec *codec)
339 return PTR_ERR(ac97); 322 return PTR_ERR(ac97);
340 } 323 }
341 324
325 regmap = regmap_init_ac97(ac97, &wm9705_regmap_config);
326 if (IS_ERR(regmap)) {
327 ret = PTR_ERR(regmap);
328 goto err_free_ac97_codec;
329 }
330
342 snd_soc_codec_set_drvdata(codec, ac97); 331 snd_soc_codec_set_drvdata(codec, ac97);
332 snd_soc_codec_init_regmap(codec, regmap);
343 333
344 return 0; 334 return 0;
335err_free_ac97_codec:
336 snd_soc_free_ac97_codec(ac97);
337 return ret;
345} 338}
346 339
347static int wm9705_soc_remove(struct snd_soc_codec *codec) 340static int wm9705_soc_remove(struct snd_soc_codec *codec)
348{ 341{
349 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec); 342 struct snd_ac97 *ac97 = snd_soc_codec_get_drvdata(codec);
350 343
344 snd_soc_codec_exit_regmap(codec);
351 snd_soc_free_ac97_codec(ac97); 345 snd_soc_free_ac97_codec(ac97);
352 return 0; 346 return 0;
353} 347}
@@ -357,12 +351,6 @@ static const struct snd_soc_codec_driver soc_codec_dev_wm9705 = {
357 .remove = wm9705_soc_remove, 351 .remove = wm9705_soc_remove,
358 .suspend = wm9705_soc_suspend, 352 .suspend = wm9705_soc_suspend,
359 .resume = wm9705_soc_resume, 353 .resume = wm9705_soc_resume,
360 .read = ac97_read,
361 .write = ac97_write,
362 .reg_cache_size = ARRAY_SIZE(wm9705_reg),
363 .reg_word_size = sizeof(u16),
364 .reg_cache_step = 2,
365 .reg_cache_default = wm9705_reg,
366 354
367 .component_driver = { 355 .component_driver = {
368 .controls = wm9705_snd_ac97_controls, 356 .controls = wm9705_snd_ac97_controls,
diff --git a/sound/soc/codecs/wm9705.h b/sound/soc/codecs/wm9705.h
deleted file mode 100644
index 23ea9ce47359..000000000000
--- a/sound/soc/codecs/wm9705.h
+++ /dev/null
@@ -1,11 +0,0 @@
1/*
2 * wm9705.h -- WM9705 Soc Audio driver
3 */
4
5#ifndef _WM9705_H
6#define _WM9705_H
7
8#define WM9705_DAI_AC97_HIFI 0
9#define WM9705_DAI_AC97_AUX 1
10
11#endif
diff --git a/sound/soc/codecs/wm9712.c b/sound/soc/codecs/wm9712.c
index 557709eac698..1a3e1797994a 100644
--- a/sound/soc/codecs/wm9712.c
+++ b/sound/soc/codecs/wm9712.c
@@ -15,13 +15,13 @@
15#include <linux/module.h> 15#include <linux/module.h>
16#include <linux/kernel.h> 16#include <linux/kernel.h>
17#include <linux/device.h> 17#include <linux/device.h>
18#include <linux/regmap.h>
18#include <sound/core.h> 19#include <sound/core.h>
19#include <sound/pcm.h> 20#include <sound/pcm.h>
20#include <sound/ac97_codec.h> 21#include <sound/ac97_codec.h>
21#include <sound/initval.h> 22#include <sound/initval.h>
22#include <sound/soc.h> 23#include <sound/soc.h>
23#include <sound/tlv.h> 24#include <sound/tlv.h>
24#include "wm9712.h"
25 25
26#define WM9712_VENDOR_ID 0x574d4c12 26#define WM9712_VENDOR_ID 0x574d4c12
27#define WM9712_VENDOR_ID_MASK 0xffffffff 27#define WM9712_VENDOR_ID_MASK 0xffffffff
@@ -32,31 +32,66 @@ struct wm9712_priv {
32 struct mutex lock; 32 struct mutex lock;
33}; 33};
34 34
35static unsigned int ac97_read(struct snd_soc_codec *codec, 35static const struct reg_default wm9712_reg_defaults[] = {
36 unsigned int reg); 36 { 0x02, 0x8000 },
37static int ac97_write(struct snd_soc_codec *codec, 37 { 0x04, 0x8000 },
38 unsigned int reg, unsigned int val); 38 { 0x06, 0x8000 },
39 { 0x08, 0x0f0f },
40 { 0x0a, 0xaaa0 },
41 { 0x0c, 0xc008 },
42 { 0x0e, 0x6808 },
43 { 0x10, 0xe808 },
44 { 0x12, 0xaaa0 },
45 { 0x14, 0xad00 },
46 { 0x16, 0x8000 },
47 { 0x18, 0xe808 },
48 { 0x1a, 0x3000 },
49 { 0x1c, 0x8000 },
50 { 0x20, 0x0000 },
51 { 0x22, 0x0000 },
52 { 0x26, 0x000f },
53 { 0x28, 0x0605 },
54 { 0x2a, 0x0410 },
55 { 0x2c, 0xbb80 },
56 { 0x2e, 0xbb80 },
57 { 0x32, 0xbb80 },
58 { 0x34, 0x2000 },
59 { 0x4c, 0xf83e },
60 { 0x4e, 0xffff },
61 { 0x50, 0x0000 },
62 { 0x52, 0x0000 },
63 { 0x56, 0xf83e },
64 { 0x58, 0x0008 },
65 { 0x5c, 0x0000 },
66 { 0x60, 0xb032 },
67 { 0x62, 0x3e00 },
68 { 0x64, 0x0000 },
69 { 0x76, 0x0006 },
70 { 0x78, 0x0001 },
71 { 0x7a, 0x0000 },
72};
39 73
40/* 74static bool wm9712_volatile_reg(struct device *dev, unsigned int reg)
41 * WM9712 register cache 75{
42 */ 76 switch (reg) {
43static const u16 wm9712_reg[] = { 77 case AC97_REC_GAIN:
44 0x6174, 0x8000, 0x8000, 0x8000, /* 6 */ 78 return true;
45 0x0f0f, 0xaaa0, 0xc008, 0x6808, /* e */ 79 default:
46 0xe808, 0xaaa0, 0xad00, 0x8000, /* 16 */ 80 return regmap_ac97_default_volatile(dev, reg);
47 0xe808, 0x3000, 0x8000, 0x0000, /* 1e */ 81 }
48 0x0000, 0x0000, 0x0000, 0x000f, /* 26 */ 82}
49 0x0405, 0x0410, 0xbb80, 0xbb80, /* 2e */ 83
50 0x0000, 0xbb80, 0x0000, 0x0000, /* 36 */ 84static const struct regmap_config wm9712_regmap_config = {
51 0x0000, 0x2000, 0x0000, 0x0000, /* 3e */ 85 .reg_bits = 16,
52 0x0000, 0x0000, 0x0000, 0x0000, /* 46 */ 86 .reg_stride = 2,
53 0x0000, 0x0000, 0xf83e, 0xffff, /* 4e */ 87 .val_bits = 16,
54 0x0000, 0x0000, 0x0000, 0xf83e, /* 56 */ 88 .max_register = 0x7e,
55 0x0008, 0x0000, 0x0000, 0x0000, /* 5e */ 89 .cache_type = REGCACHE_RBTREE,
56 0xb032, 0x3e00, 0x0000, 0x0000, /* 66 */ 90
57 0x0000, 0x0000, 0x0000, 0x0000, /* 6e */ 91 .volatile_reg = wm9712_volatile_reg,
58 0x0000, 0x0000, 0x0000, 0x0006, /* 76 */ 92
59 0x0001, 0x0000, 0x574d, 0x4c12, /* 7e */ 93 .reg_defaults = wm9712_reg_defaults,
94 .num_reg_defaults = ARRAY_SIZE(wm9712_reg_defaults),
60}; 95};
61 96
62#define HPL_MIXER 0x0 97#define HPL_MIXER 0x0
@@ -187,7 +222,7 @@ static int wm9712_hp_mixer_put(struct snd_kcontrol *kcontrol,
187 struct soc_mixer_control *mc = 222 struct soc_mixer_control *mc =
188 (struct soc_mixer_control *)kcontrol->private_value; 223 (struct soc_mixer_control *)kcontrol->private_value;
189 unsigned int mixer, mask, shift, old; 224 unsigned int mixer, mask, shift, old;
190 struct snd_soc_dapm_update update; 225 struct snd_soc_dapm_update update = { 0 };
191 bool change; 226 bool change;
192 227
193 mixer = mc->shift >> 8; 228 mixer = mc->shift >> 8;
@@ -485,75 +520,36 @@ static const struct snd_soc_dapm_route wm9712_audio_map[] = {
485 {"ROUT2", NULL, "Speaker PGA"}, 520 {"ROUT2", NULL, "Speaker PGA"},
486}; 521};
487 522
488static unsigned int ac97_read(struct snd_soc_codec *codec,
489 unsigned int reg)
490{
491 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
492 u16 *cache = codec->reg_cache;
493
494 if (reg == AC97_RESET || reg == AC97_GPIO_STATUS ||
495 reg == AC97_VENDOR_ID1 || reg == AC97_VENDOR_ID2 ||
496 reg == AC97_REC_GAIN)
497 return soc_ac97_ops->read(wm9712->ac97, reg);
498 else {
499 reg = reg >> 1;
500
501 if (reg >= (ARRAY_SIZE(wm9712_reg)))
502 return -EIO;
503
504 return cache[reg];
505 }
506}
507
508static int ac97_write(struct snd_soc_codec *codec, unsigned int reg,
509 unsigned int val)
510{
511 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
512 u16 *cache = codec->reg_cache;
513
514 soc_ac97_ops->write(wm9712->ac97, reg, val);
515 reg = reg >> 1;
516 if (reg < (ARRAY_SIZE(wm9712_reg)))
517 cache[reg] = val;
518
519 return 0;
520}
521
522static int ac97_prepare(struct snd_pcm_substream *substream, 523static int ac97_prepare(struct snd_pcm_substream *substream,
523 struct snd_soc_dai *dai) 524 struct snd_soc_dai *dai)
524{ 525{
525 struct snd_soc_codec *codec = dai->codec; 526 struct snd_soc_codec *codec = dai->codec;
526 int reg; 527 int reg;
527 u16 vra;
528 struct snd_pcm_runtime *runtime = substream->runtime; 528 struct snd_pcm_runtime *runtime = substream->runtime;
529 529
530 vra = ac97_read(codec, AC97_EXTENDED_STATUS); 530 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x1, 0x1);
531 ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1);
532 531
533 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 532 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
534 reg = AC97_PCM_FRONT_DAC_RATE; 533 reg = AC97_PCM_FRONT_DAC_RATE;
535 else 534 else
536 reg = AC97_PCM_LR_ADC_RATE; 535 reg = AC97_PCM_LR_ADC_RATE;
537 536
538 return ac97_write(codec, reg, runtime->rate); 537 return snd_soc_write(codec, reg, runtime->rate);
539} 538}
540 539
541static int ac97_aux_prepare(struct snd_pcm_substream *substream, 540static int ac97_aux_prepare(struct snd_pcm_substream *substream,
542 struct snd_soc_dai *dai) 541 struct snd_soc_dai *dai)
543{ 542{
544 struct snd_soc_codec *codec = dai->codec; 543 struct snd_soc_codec *codec = dai->codec;
545 u16 vra, xsle;
546 struct snd_pcm_runtime *runtime = substream->runtime; 544 struct snd_pcm_runtime *runtime = substream->runtime;
547 545
548 vra = ac97_read(codec, AC97_EXTENDED_STATUS); 546 snd_soc_update_bits(codec, AC97_EXTENDED_STATUS, 0x1, 0x1);
549 ac97_write(codec, AC97_EXTENDED_STATUS, vra | 0x1); 547 snd_soc_update_bits(codec, AC97_PCI_SID, 0x8000, 0x8000);
550 xsle = ac97_read(codec, AC97_PCI_SID);
551 ac97_write(codec, AC97_PCI_SID, xsle | 0x8000);
552 548
553 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK) 549 if (substream->stream != SNDRV_PCM_STREAM_PLAYBACK)
554 return -ENODEV; 550 return -ENODEV;
555 551
556 return ac97_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate); 552 return snd_soc_write(codec, AC97_PCM_SURR_DAC_RATE, runtime->rate);
557} 553}
558 554
559#define WM9712_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\ 555#define WM9712_AC97_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 |\
@@ -605,12 +601,12 @@ static int wm9712_set_bias_level(struct snd_soc_codec *codec,
605 case SND_SOC_BIAS_PREPARE: 601 case SND_SOC_BIAS_PREPARE:
606 break; 602 break;
607 case SND_SOC_BIAS_STANDBY: 603 case SND_SOC_BIAS_STANDBY:
608 ac97_write(codec, AC97_POWERDOWN, 0x0000); 604 snd_soc_write(codec, AC97_POWERDOWN, 0x0000);
609 break; 605 break;
610 case SND_SOC_BIAS_OFF: 606 case SND_SOC_BIAS_OFF:
611 /* disable everything including AC link */ 607 /* disable everything including AC link */
612 ac97_write(codec, AC97_EXTENDED_MSTATUS, 0xffff); 608 snd_soc_write(codec, AC97_EXTENDED_MSTATUS, 0xffff);
613 ac97_write(codec, AC97_POWERDOWN, 0xffff); 609 snd_soc_write(codec, AC97_POWERDOWN, 0xffff);
614 break; 610 break;
615 } 611 }
616 return 0; 612 return 0;
@@ -619,8 +615,7 @@ static int wm9712_set_bias_level(struct snd_soc_codec *codec,
619static int wm9712_soc_resume(struct snd_soc_codec *codec) 615static int wm9712_soc_resume(struct snd_soc_codec *codec)
620{ 616{
621 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); 617 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
622 int i, ret; 618 int ret;
623 u16 *cache = codec->reg_cache;
624 619
625 ret = snd_ac97_reset(wm9712->ac97, true, WM9712_VENDOR_ID, 620 ret = snd_ac97_reset(wm9712->ac97, true, WM9712_VENDOR_ID,
626 WM9712_VENDOR_ID_MASK); 621 WM9712_VENDOR_ID_MASK);
@@ -629,15 +624,8 @@ static int wm9712_soc_resume(struct snd_soc_codec *codec)
629 624
630 snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY); 625 snd_soc_codec_force_bias_level(codec, SND_SOC_BIAS_STANDBY);
631 626
632 if (ret == 0) { 627 if (ret == 0)
633 /* Sync reg_cache with the hardware after cold reset */ 628 regcache_sync(codec->component.regmap);
634 for (i = 2; i < ARRAY_SIZE(wm9712_reg) << 1; i += 2) {
635 if (i == AC97_INT_PAGING || i == AC97_POWERDOWN ||
636 (i > 0x58 && i != 0x5c))
637 continue;
638 soc_ac97_ops->write(wm9712->ac97, i, cache[i>>1]);
639 }
640 }
641 629
642 return ret; 630 return ret;
643} 631}
@@ -645,6 +633,7 @@ static int wm9712_soc_resume(struct snd_soc_codec *codec)
645static int wm9712_soc_probe(struct snd_soc_codec *codec) 633static int wm9712_soc_probe(struct snd_soc_codec *codec)
646{ 634{
647 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); 635 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
636 struct regmap *regmap;
648 int ret; 637 int ret;
649 638
650 wm9712->ac97 = snd_soc_new_ac97_codec(codec, WM9712_VENDOR_ID, 639 wm9712->ac97 = snd_soc_new_ac97_codec(codec, WM9712_VENDOR_ID,
@@ -655,16 +644,28 @@ static int wm9712_soc_probe(struct snd_soc_codec *codec)
655 return ret; 644 return ret;
656 } 645 }
657 646
647 regmap = regmap_init_ac97(wm9712->ac97, &wm9712_regmap_config);
648 if (IS_ERR(regmap)) {
649 ret = PTR_ERR(regmap);
650 goto err_free_ac97_codec;
651 }
652
653 snd_soc_codec_init_regmap(codec, regmap);
654
658 /* set alc mux to none */ 655 /* set alc mux to none */
659 ac97_write(codec, AC97_VIDEO, ac97_read(codec, AC97_VIDEO) | 0x3000); 656 snd_soc_update_bits(codec, AC97_VIDEO, 0x3000, 0x3000);
660 657
661 return 0; 658 return 0;
659err_free_ac97_codec:
660 snd_soc_free_ac97_codec(wm9712->ac97);
661 return ret;
662} 662}
663 663
664static int wm9712_soc_remove(struct snd_soc_codec *codec) 664static int wm9712_soc_remove(struct snd_soc_codec *codec)
665{ 665{
666 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec); 666 struct wm9712_priv *wm9712 = snd_soc_codec_get_drvdata(codec);
667 667
668 snd_soc_codec_exit_regmap(codec);
668 snd_soc_free_ac97_codec(wm9712->ac97); 669 snd_soc_free_ac97_codec(wm9712->ac97);
669 return 0; 670 return 0;
670} 671}
@@ -673,14 +674,8 @@ static const struct snd_soc_codec_driver soc_codec_dev_wm9712 = {
673 .probe = wm9712_soc_probe, 674 .probe = wm9712_soc_probe,
674 .remove = wm9712_soc_remove, 675 .remove = wm9712_soc_remove,
675 .resume = wm9712_soc_resume, 676 .resume = wm9712_soc_resume,
676 .read = ac97_read,
677 .write = ac97_write,
678 .set_bias_level = wm9712_set_bias_level, 677 .set_bias_level = wm9712_set_bias_level,
679 .suspend_bias_off = true, 678 .suspend_bias_off = true,
680 .reg_cache_size = ARRAY_SIZE(wm9712_reg),
681 .reg_word_size = sizeof(u16),
682 .reg_cache_step = 2,
683 .reg_cache_default = wm9712_reg,
684 679
685 .component_driver = { 680 .component_driver = {
686 .controls = wm9712_snd_ac97_controls, 681 .controls = wm9712_snd_ac97_controls,
diff --git a/sound/soc/codecs/wm9712.h b/sound/soc/codecs/wm9712.h
deleted file mode 100644
index fb69c3aa4ed0..000000000000
--- a/sound/soc/codecs/wm9712.h
+++ /dev/null
@@ -1,11 +0,0 @@
1/*
2 * wm9712.h -- WM9712 Soc Audio driver
3 */
4
5#ifndef _WM9712_H
6#define _WM9712_H
7
8#define WM9712_DAI_AC97_HIFI 0
9#define WM9712_DAI_AC97_AUX 1
10
11#endif
diff --git a/sound/soc/codecs/wm9713.c b/sound/soc/codecs/wm9713.c
index e4301ddb1b84..7e4822185feb 100644
--- a/sound/soc/codecs/wm9713.c
+++ b/sound/soc/codecs/wm9713.c
@@ -231,7 +231,7 @@ static int wm9713_hp_mixer_put(struct snd_kcontrol *kcontrol,
231 struct soc_mixer_control *mc = 231 struct soc_mixer_control *mc =
232 (struct soc_mixer_control *)kcontrol->private_value; 232 (struct soc_mixer_control *)kcontrol->private_value;
233 unsigned int mixer, mask, shift, old; 233 unsigned int mixer, mask, shift, old;
234 struct snd_soc_dapm_update update; 234 struct snd_soc_dapm_update update = { 0 };
235 bool change; 235 bool change;
236 236
237 mixer = mc->shift >> 8; 237 mixer = mc->shift >> 8;
diff --git a/sound/soc/codecs/wm9713.h b/sound/soc/codecs/wm9713.h
index 53df11b1f727..7ecffc563016 100644
--- a/sound/soc/codecs/wm9713.h
+++ b/sound/soc/codecs/wm9713.h
@@ -41,8 +41,4 @@
41#define WM9713_PCMBCLK_DIV_8 (3 << 9) 41#define WM9713_PCMBCLK_DIV_8 (3 << 9)
42#define WM9713_PCMBCLK_DIV_16 (4 << 9) 42#define WM9713_PCMBCLK_DIV_16 (4 << 9)
43 43
44#define WM9713_DAI_AC97_HIFI 0
45#define WM9713_DAI_AC97_AUX 1
46#define WM9713_DAI_PCM_VOICE 2
47
48#endif 44#endif
diff --git a/sound/soc/codecs/wm_adsp.c b/sound/soc/codecs/wm_adsp.c
index b943dde8dbe5..593b7d1aed46 100644
--- a/sound/soc/codecs/wm_adsp.c
+++ b/sound/soc/codecs/wm_adsp.c
@@ -162,6 +162,16 @@
162 162
163#define ADSP_MAX_STD_CTRL_SIZE 512 163#define ADSP_MAX_STD_CTRL_SIZE 512
164 164
165#define WM_ADSP_ACKED_CTL_TIMEOUT_MS 100
166#define WM_ADSP_ACKED_CTL_N_QUICKPOLLS 10
167#define WM_ADSP_ACKED_CTL_MIN_VALUE 0
168#define WM_ADSP_ACKED_CTL_MAX_VALUE 0xFFFFFF
169
170/*
171 * Event control messages
172 */
173#define WM_ADSP_FW_EVENT_SHUTDOWN 0x000001
174
165struct wm_adsp_buf { 175struct wm_adsp_buf {
166 struct list_head list; 176 struct list_head list;
167 void *buf; 177 void *buf;
@@ -177,7 +187,7 @@ static struct wm_adsp_buf *wm_adsp_buf_alloc(const void *src, size_t len,
177 187
178 buf->buf = vmalloc(len); 188 buf->buf = vmalloc(len);
179 if (!buf->buf) { 189 if (!buf->buf) {
180 vfree(buf); 190 kfree(buf);
181 return NULL; 191 return NULL;
182 } 192 }
183 memcpy(buf->buf, src, len); 193 memcpy(buf->buf, src, len);
@@ -441,11 +451,29 @@ struct wm_coeff_ctl {
441 unsigned int offset; 451 unsigned int offset;
442 size_t len; 452 size_t len;
443 unsigned int set:1; 453 unsigned int set:1;
444 struct snd_kcontrol *kcontrol;
445 struct soc_bytes_ext bytes_ext; 454 struct soc_bytes_ext bytes_ext;
446 unsigned int flags; 455 unsigned int flags;
456 unsigned int type;
447}; 457};
448 458
459static const char *wm_adsp_mem_region_name(unsigned int type)
460{
461 switch (type) {
462 case WMFW_ADSP1_PM:
463 return "PM";
464 case WMFW_ADSP1_DM:
465 return "DM";
466 case WMFW_ADSP2_XM:
467 return "XM";
468 case WMFW_ADSP2_YM:
469 return "YM";
470 case WMFW_ADSP1_ZM:
471 return "ZM";
472 default:
473 return NULL;
474 }
475}
476
449#ifdef CONFIG_DEBUG_FS 477#ifdef CONFIG_DEBUG_FS
450static void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, const char *s) 478static void wm_adsp_debugfs_save_wmfwname(struct wm_adsp *dsp, const char *s)
451{ 479{
@@ -727,6 +755,24 @@ static inline struct wm_coeff_ctl *bytes_ext_to_ctl(struct soc_bytes_ext *ext)
727 return container_of(ext, struct wm_coeff_ctl, bytes_ext); 755 return container_of(ext, struct wm_coeff_ctl, bytes_ext);
728} 756}
729 757
758static int wm_coeff_base_reg(struct wm_coeff_ctl *ctl, unsigned int *reg)
759{
760 const struct wm_adsp_alg_region *alg_region = &ctl->alg_region;
761 struct wm_adsp *dsp = ctl->dsp;
762 const struct wm_adsp_region *mem;
763
764 mem = wm_adsp_find_region(dsp, alg_region->type);
765 if (!mem) {
766 adsp_err(dsp, "No base for region %x\n",
767 alg_region->type);
768 return -EINVAL;
769 }
770
771 *reg = wm_adsp_region_to_reg(mem, ctl->alg_region.base + ctl->offset);
772
773 return 0;
774}
775
730static int wm_coeff_info(struct snd_kcontrol *kctl, 776static int wm_coeff_info(struct snd_kcontrol *kctl,
731 struct snd_ctl_elem_info *uinfo) 777 struct snd_ctl_elem_info *uinfo)
732{ 778{
@@ -734,30 +780,94 @@ static int wm_coeff_info(struct snd_kcontrol *kctl,
734 (struct soc_bytes_ext *)kctl->private_value; 780 (struct soc_bytes_ext *)kctl->private_value;
735 struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext); 781 struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext);
736 782
737 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES; 783 switch (ctl->type) {
738 uinfo->count = ctl->len; 784 case WMFW_CTL_TYPE_ACKED:
785 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
786 uinfo->value.integer.min = WM_ADSP_ACKED_CTL_MIN_VALUE;
787 uinfo->value.integer.max = WM_ADSP_ACKED_CTL_MAX_VALUE;
788 uinfo->value.integer.step = 1;
789 uinfo->count = 1;
790 break;
791 default:
792 uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
793 uinfo->count = ctl->len;
794 break;
795 }
796
739 return 0; 797 return 0;
740} 798}
741 799
800static int wm_coeff_write_acked_control(struct wm_coeff_ctl *ctl,
801 unsigned int event_id)
802{
803 struct wm_adsp *dsp = ctl->dsp;
804 u32 val = cpu_to_be32(event_id);
805 unsigned int reg;
806 int i, ret;
807
808 ret = wm_coeff_base_reg(ctl, &reg);
809 if (ret)
810 return ret;
811
812 adsp_dbg(dsp, "Sending 0x%x to acked control alg 0x%x %s:0x%x\n",
813 event_id, ctl->alg_region.alg,
814 wm_adsp_mem_region_name(ctl->alg_region.type), ctl->offset);
815
816 ret = regmap_raw_write(dsp->regmap, reg, &val, sizeof(val));
817 if (ret) {
818 adsp_err(dsp, "Failed to write %x: %d\n", reg, ret);
819 return ret;
820 }
821
822 /*
823 * Poll for ack, we initially poll at ~1ms intervals for firmwares
824 * that respond quickly, then go to ~10ms polls. A firmware is unlikely
825 * to ack instantly so we do the first 1ms delay before reading the
826 * control to avoid a pointless bus transaction
827 */
828 for (i = 0; i < WM_ADSP_ACKED_CTL_TIMEOUT_MS;) {
829 switch (i) {
830 case 0 ... WM_ADSP_ACKED_CTL_N_QUICKPOLLS - 1:
831 usleep_range(1000, 2000);
832 i++;
833 break;
834 default:
835 usleep_range(10000, 20000);
836 i += 10;
837 break;
838 }
839
840 ret = regmap_raw_read(dsp->regmap, reg, &val, sizeof(val));
841 if (ret) {
842 adsp_err(dsp, "Failed to read %x: %d\n", reg, ret);
843 return ret;
844 }
845
846 if (val == 0) {
847 adsp_dbg(dsp, "Acked control ACKED at poll %u\n", i);
848 return 0;
849 }
850 }
851
852 adsp_warn(dsp, "Acked control @0x%x alg:0x%x %s:0x%x timed out\n",
853 reg, ctl->alg_region.alg,
854 wm_adsp_mem_region_name(ctl->alg_region.type),
855 ctl->offset);
856
857 return -ETIMEDOUT;
858}
859
742static int wm_coeff_write_control(struct wm_coeff_ctl *ctl, 860static int wm_coeff_write_control(struct wm_coeff_ctl *ctl,
743 const void *buf, size_t len) 861 const void *buf, size_t len)
744{ 862{
745 struct wm_adsp_alg_region *alg_region = &ctl->alg_region;
746 const struct wm_adsp_region *mem;
747 struct wm_adsp *dsp = ctl->dsp; 863 struct wm_adsp *dsp = ctl->dsp;
748 void *scratch; 864 void *scratch;
749 int ret; 865 int ret;
750 unsigned int reg; 866 unsigned int reg;
751 867
752 mem = wm_adsp_find_region(dsp, alg_region->type); 868 ret = wm_coeff_base_reg(ctl, &reg);
753 if (!mem) { 869 if (ret)
754 adsp_err(dsp, "No base for region %x\n", 870 return ret;
755 alg_region->type);
756 return -EINVAL;
757 }
758
759 reg = ctl->alg_region.base + ctl->offset;
760 reg = wm_adsp_region_to_reg(mem, reg);
761 871
762 scratch = kmemdup(buf, len, GFP_KERNEL | GFP_DMA); 872 scratch = kmemdup(buf, len, GFP_KERNEL | GFP_DMA);
763 if (!scratch) 873 if (!scratch)
@@ -823,25 +933,41 @@ static int wm_coeff_tlv_put(struct snd_kcontrol *kctl,
823 return ret; 933 return ret;
824} 934}
825 935
936static int wm_coeff_put_acked(struct snd_kcontrol *kctl,
937 struct snd_ctl_elem_value *ucontrol)
938{
939 struct soc_bytes_ext *bytes_ext =
940 (struct soc_bytes_ext *)kctl->private_value;
941 struct wm_coeff_ctl *ctl = bytes_ext_to_ctl(bytes_ext);
942 unsigned int val = ucontrol->value.integer.value[0];
943 int ret;
944
945 if (val == 0)
946 return 0; /* 0 means no event */
947
948 mutex_lock(&ctl->dsp->pwr_lock);
949
950 if (ctl->enabled)
951 ret = wm_coeff_write_acked_control(ctl, val);
952 else
953 ret = -EPERM;
954
955 mutex_unlock(&ctl->dsp->pwr_lock);
956
957 return ret;
958}
959
826static int wm_coeff_read_control(struct wm_coeff_ctl *ctl, 960static int wm_coeff_read_control(struct wm_coeff_ctl *ctl,
827 void *buf, size_t len) 961 void *buf, size_t len)
828{ 962{
829 struct wm_adsp_alg_region *alg_region = &ctl->alg_region;
830 const struct wm_adsp_region *mem;
831 struct wm_adsp *dsp = ctl->dsp; 963 struct wm_adsp *dsp = ctl->dsp;
832 void *scratch; 964 void *scratch;
833 int ret; 965 int ret;
834 unsigned int reg; 966 unsigned int reg;
835 967
836 mem = wm_adsp_find_region(dsp, alg_region->type); 968 ret = wm_coeff_base_reg(ctl, &reg);
837 if (!mem) { 969 if (ret)
838 adsp_err(dsp, "No base for region %x\n", 970 return ret;
839 alg_region->type);
840 return -EINVAL;
841 }
842
843 reg = ctl->alg_region.base + ctl->offset;
844 reg = wm_adsp_region_to_reg(mem, reg);
845 971
846 scratch = kmalloc(len, GFP_KERNEL | GFP_DMA); 972 scratch = kmalloc(len, GFP_KERNEL | GFP_DMA);
847 if (!scratch) 973 if (!scratch)
@@ -918,6 +1044,21 @@ static int wm_coeff_tlv_get(struct snd_kcontrol *kctl,
918 return ret; 1044 return ret;
919} 1045}
920 1046
1047static int wm_coeff_get_acked(struct snd_kcontrol *kcontrol,
1048 struct snd_ctl_elem_value *ucontrol)
1049{
1050 /*
1051 * Although it's not useful to read an acked control, we must satisfy
1052 * user-side assumptions that all controls are readable and that a
1053 * write of the same value should be filtered out (it's valid to send
1054 * the same event number again to the firmware). We therefore return 0,
1055 * meaning "no event" so valid event numbers will always be a change
1056 */
1057 ucontrol->value.integer.value[0] = 0;
1058
1059 return 0;
1060}
1061
921struct wmfw_ctl_work { 1062struct wmfw_ctl_work {
922 struct wm_adsp *dsp; 1063 struct wm_adsp *dsp;
923 struct wm_coeff_ctl *ctl; 1064 struct wm_coeff_ctl *ctl;
@@ -967,30 +1108,35 @@ static int wmfw_add_ctl(struct wm_adsp *dsp, struct wm_coeff_ctl *ctl)
967 kcontrol = kzalloc(sizeof(*kcontrol), GFP_KERNEL); 1108 kcontrol = kzalloc(sizeof(*kcontrol), GFP_KERNEL);
968 if (!kcontrol) 1109 if (!kcontrol)
969 return -ENOMEM; 1110 return -ENOMEM;
970 kcontrol->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
971 1111
972 kcontrol->name = ctl->name; 1112 kcontrol->name = ctl->name;
973 kcontrol->info = wm_coeff_info; 1113 kcontrol->info = wm_coeff_info;
974 kcontrol->get = wm_coeff_get;
975 kcontrol->put = wm_coeff_put;
976 kcontrol->iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1114 kcontrol->iface = SNDRV_CTL_ELEM_IFACE_MIXER;
977 kcontrol->tlv.c = snd_soc_bytes_tlv_callback; 1115 kcontrol->tlv.c = snd_soc_bytes_tlv_callback;
978 kcontrol->private_value = (unsigned long)&ctl->bytes_ext; 1116 kcontrol->private_value = (unsigned long)&ctl->bytes_ext;
1117 kcontrol->access = wmfw_convert_flags(ctl->flags, ctl->len);
979 1118
980 ctl->bytes_ext.max = ctl->len; 1119 switch (ctl->type) {
981 ctl->bytes_ext.get = wm_coeff_tlv_get; 1120 case WMFW_CTL_TYPE_ACKED:
982 ctl->bytes_ext.put = wm_coeff_tlv_put; 1121 kcontrol->get = wm_coeff_get_acked;
1122 kcontrol->put = wm_coeff_put_acked;
1123 break;
1124 default:
1125 kcontrol->get = wm_coeff_get;
1126 kcontrol->put = wm_coeff_put;
983 1127
984 kcontrol->access = wmfw_convert_flags(ctl->flags, ctl->len); 1128 ctl->bytes_ext.max = ctl->len;
1129 ctl->bytes_ext.get = wm_coeff_tlv_get;
1130 ctl->bytes_ext.put = wm_coeff_tlv_put;
1131 break;
1132 }
985 1133
986 ret = snd_soc_add_card_controls(dsp->card, kcontrol, 1); 1134 ret = snd_soc_add_codec_controls(dsp->codec, kcontrol, 1);
987 if (ret < 0) 1135 if (ret < 0)
988 goto err_kcontrol; 1136 goto err_kcontrol;
989 1137
990 kfree(kcontrol); 1138 kfree(kcontrol);
991 1139
992 ctl->kcontrol = snd_soc_card_get_kcontrol(dsp->card, ctl->name);
993
994 return 0; 1140 return 0;
995 1141
996err_kcontrol: 1142err_kcontrol:
@@ -1035,6 +1181,27 @@ static int wm_coeff_sync_controls(struct wm_adsp *dsp)
1035 return 0; 1181 return 0;
1036} 1182}
1037 1183
1184static void wm_adsp_signal_event_controls(struct wm_adsp *dsp,
1185 unsigned int event)
1186{
1187 struct wm_coeff_ctl *ctl;
1188 int ret;
1189
1190 list_for_each_entry(ctl, &dsp->ctl_list, list) {
1191 if (ctl->type != WMFW_CTL_TYPE_HOSTEVENT)
1192 continue;
1193
1194 if (!ctl->enabled)
1195 continue;
1196
1197 ret = wm_coeff_write_acked_control(ctl, event);
1198 if (ret)
1199 adsp_warn(dsp,
1200 "Failed to send 0x%x event to alg 0x%x (%d)\n",
1201 event, ctl->alg_region.alg, ret);
1202 }
1203}
1204
1038static void wm_adsp_ctl_work(struct work_struct *work) 1205static void wm_adsp_ctl_work(struct work_struct *work)
1039{ 1206{
1040 struct wmfw_ctl_work *ctl_work = container_of(work, 1207 struct wmfw_ctl_work *ctl_work = container_of(work,
@@ -1056,34 +1223,16 @@ static int wm_adsp_create_control(struct wm_adsp *dsp,
1056 const struct wm_adsp_alg_region *alg_region, 1223 const struct wm_adsp_alg_region *alg_region,
1057 unsigned int offset, unsigned int len, 1224 unsigned int offset, unsigned int len,
1058 const char *subname, unsigned int subname_len, 1225 const char *subname, unsigned int subname_len,
1059 unsigned int flags) 1226 unsigned int flags, unsigned int type)
1060{ 1227{
1061 struct wm_coeff_ctl *ctl; 1228 struct wm_coeff_ctl *ctl;
1062 struct wmfw_ctl_work *ctl_work; 1229 struct wmfw_ctl_work *ctl_work;
1063 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN]; 1230 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
1064 char *region_name; 1231 const char *region_name;
1065 int ret; 1232 int ret;
1066 1233
1067 if (flags & WMFW_CTL_FLAG_SYS) 1234 region_name = wm_adsp_mem_region_name(alg_region->type);
1068 return 0; 1235 if (!region_name) {
1069
1070 switch (alg_region->type) {
1071 case WMFW_ADSP1_PM:
1072 region_name = "PM";
1073 break;
1074 case WMFW_ADSP1_DM:
1075 region_name = "DM";
1076 break;
1077 case WMFW_ADSP2_XM:
1078 region_name = "XM";
1079 break;
1080 case WMFW_ADSP2_YM:
1081 region_name = "YM";
1082 break;
1083 case WMFW_ADSP1_ZM:
1084 region_name = "ZM";
1085 break;
1086 default:
1087 adsp_err(dsp, "Unknown region type: %d\n", alg_region->type); 1236 adsp_err(dsp, "Unknown region type: %d\n", alg_region->type);
1088 return -EINVAL; 1237 return -EINVAL;
1089 } 1238 }
@@ -1139,6 +1288,7 @@ static int wm_adsp_create_control(struct wm_adsp *dsp,
1139 ctl->dsp = dsp; 1288 ctl->dsp = dsp;
1140 1289
1141 ctl->flags = flags; 1290 ctl->flags = flags;
1291 ctl->type = type;
1142 ctl->offset = offset; 1292 ctl->offset = offset;
1143 ctl->len = len; 1293 ctl->len = len;
1144 ctl->cache = kzalloc(ctl->len, GFP_KERNEL); 1294 ctl->cache = kzalloc(ctl->len, GFP_KERNEL);
@@ -1149,6 +1299,9 @@ static int wm_adsp_create_control(struct wm_adsp *dsp,
1149 1299
1150 list_add(&ctl->list, &dsp->ctl_list); 1300 list_add(&ctl->list, &dsp->ctl_list);
1151 1301
1302 if (flags & WMFW_CTL_FLAG_SYS)
1303 return 0;
1304
1152 ctl_work = kzalloc(sizeof(*ctl_work), GFP_KERNEL); 1305 ctl_work = kzalloc(sizeof(*ctl_work), GFP_KERNEL);
1153 if (!ctl_work) { 1306 if (!ctl_work) {
1154 ret = -ENOMEM; 1307 ret = -ENOMEM;
@@ -1308,6 +1461,21 @@ static inline void wm_coeff_parse_coeff(struct wm_adsp *dsp, const u8 **data,
1308 adsp_dbg(dsp, "\tALSA control len: %#x\n", blk->len); 1461 adsp_dbg(dsp, "\tALSA control len: %#x\n", blk->len);
1309} 1462}
1310 1463
1464static int wm_adsp_check_coeff_flags(struct wm_adsp *dsp,
1465 const struct wm_coeff_parsed_coeff *coeff_blk,
1466 unsigned int f_required,
1467 unsigned int f_illegal)
1468{
1469 if ((coeff_blk->flags & f_illegal) ||
1470 ((coeff_blk->flags & f_required) != f_required)) {
1471 adsp_err(dsp, "Illegal flags 0x%x for control type 0x%x\n",
1472 coeff_blk->flags, coeff_blk->ctl_type);
1473 return -EINVAL;
1474 }
1475
1476 return 0;
1477}
1478
1311static int wm_adsp_parse_coeff(struct wm_adsp *dsp, 1479static int wm_adsp_parse_coeff(struct wm_adsp *dsp,
1312 const struct wmfw_region *region) 1480 const struct wmfw_region *region)
1313{ 1481{
@@ -1324,6 +1492,28 @@ static int wm_adsp_parse_coeff(struct wm_adsp *dsp,
1324 switch (coeff_blk.ctl_type) { 1492 switch (coeff_blk.ctl_type) {
1325 case SNDRV_CTL_ELEM_TYPE_BYTES: 1493 case SNDRV_CTL_ELEM_TYPE_BYTES:
1326 break; 1494 break;
1495 case WMFW_CTL_TYPE_ACKED:
1496 if (coeff_blk.flags & WMFW_CTL_FLAG_SYS)
1497 continue; /* ignore */
1498
1499 ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk,
1500 WMFW_CTL_FLAG_VOLATILE |
1501 WMFW_CTL_FLAG_WRITEABLE |
1502 WMFW_CTL_FLAG_READABLE,
1503 0);
1504 if (ret)
1505 return -EINVAL;
1506 break;
1507 case WMFW_CTL_TYPE_HOSTEVENT:
1508 ret = wm_adsp_check_coeff_flags(dsp, &coeff_blk,
1509 WMFW_CTL_FLAG_SYS |
1510 WMFW_CTL_FLAG_VOLATILE |
1511 WMFW_CTL_FLAG_WRITEABLE |
1512 WMFW_CTL_FLAG_READABLE,
1513 0);
1514 if (ret)
1515 return -EINVAL;
1516 break;
1327 default: 1517 default:
1328 adsp_err(dsp, "Unknown control type: %d\n", 1518 adsp_err(dsp, "Unknown control type: %d\n",
1329 coeff_blk.ctl_type); 1519 coeff_blk.ctl_type);
@@ -1338,7 +1528,8 @@ static int wm_adsp_parse_coeff(struct wm_adsp *dsp,
1338 coeff_blk.len, 1528 coeff_blk.len,
1339 coeff_blk.name, 1529 coeff_blk.name,
1340 coeff_blk.name_len, 1530 coeff_blk.name_len,
1341 coeff_blk.flags); 1531 coeff_blk.flags,
1532 coeff_blk.ctl_type);
1342 if (ret < 0) 1533 if (ret < 0)
1343 adsp_err(dsp, "Failed to create control: %.*s, %d\n", 1534 adsp_err(dsp, "Failed to create control: %.*s, %d\n",
1344 coeff_blk.name_len, coeff_blk.name, ret); 1535 coeff_blk.name_len, coeff_blk.name, ret);
@@ -1491,23 +1682,11 @@ static int wm_adsp_load(struct wm_adsp *dsp)
1491 reg = offset; 1682 reg = offset;
1492 break; 1683 break;
1493 case WMFW_ADSP1_PM: 1684 case WMFW_ADSP1_PM:
1494 region_name = "PM";
1495 reg = wm_adsp_region_to_reg(mem, offset);
1496 break;
1497 case WMFW_ADSP1_DM: 1685 case WMFW_ADSP1_DM:
1498 region_name = "DM";
1499 reg = wm_adsp_region_to_reg(mem, offset);
1500 break;
1501 case WMFW_ADSP2_XM: 1686 case WMFW_ADSP2_XM:
1502 region_name = "XM";
1503 reg = wm_adsp_region_to_reg(mem, offset);
1504 break;
1505 case WMFW_ADSP2_YM: 1687 case WMFW_ADSP2_YM:
1506 region_name = "YM";
1507 reg = wm_adsp_region_to_reg(mem, offset);
1508 break;
1509 case WMFW_ADSP1_ZM: 1688 case WMFW_ADSP1_ZM:
1510 region_name = "ZM"; 1689 region_name = wm_adsp_mem_region_name(type);
1511 reg = wm_adsp_region_to_reg(mem, offset); 1690 reg = wm_adsp_region_to_reg(mem, offset);
1512 break; 1691 break;
1513 default: 1692 default:
@@ -1750,7 +1929,8 @@ static int wm_adsp1_setup_algs(struct wm_adsp *dsp)
1750 len -= be32_to_cpu(adsp1_alg[i].dm); 1929 len -= be32_to_cpu(adsp1_alg[i].dm);
1751 len *= 4; 1930 len *= 4;
1752 wm_adsp_create_control(dsp, alg_region, 0, 1931 wm_adsp_create_control(dsp, alg_region, 0,
1753 len, NULL, 0, 0); 1932 len, NULL, 0, 0,
1933 SNDRV_CTL_ELEM_TYPE_BYTES);
1754 } else { 1934 } else {
1755 adsp_warn(dsp, "Missing length info for region DM with ID %x\n", 1935 adsp_warn(dsp, "Missing length info for region DM with ID %x\n",
1756 be32_to_cpu(adsp1_alg[i].alg.id)); 1936 be32_to_cpu(adsp1_alg[i].alg.id));
@@ -1770,7 +1950,8 @@ static int wm_adsp1_setup_algs(struct wm_adsp *dsp)
1770 len -= be32_to_cpu(adsp1_alg[i].zm); 1950 len -= be32_to_cpu(adsp1_alg[i].zm);
1771 len *= 4; 1951 len *= 4;
1772 wm_adsp_create_control(dsp, alg_region, 0, 1952 wm_adsp_create_control(dsp, alg_region, 0,
1773 len, NULL, 0, 0); 1953 len, NULL, 0, 0,
1954 SNDRV_CTL_ELEM_TYPE_BYTES);
1774 } else { 1955 } else {
1775 adsp_warn(dsp, "Missing length info for region ZM with ID %x\n", 1956 adsp_warn(dsp, "Missing length info for region ZM with ID %x\n",
1776 be32_to_cpu(adsp1_alg[i].alg.id)); 1957 be32_to_cpu(adsp1_alg[i].alg.id));
@@ -1861,7 +2042,8 @@ static int wm_adsp2_setup_algs(struct wm_adsp *dsp)
1861 len -= be32_to_cpu(adsp2_alg[i].xm); 2042 len -= be32_to_cpu(adsp2_alg[i].xm);
1862 len *= 4; 2043 len *= 4;
1863 wm_adsp_create_control(dsp, alg_region, 0, 2044 wm_adsp_create_control(dsp, alg_region, 0,
1864 len, NULL, 0, 0); 2045 len, NULL, 0, 0,
2046 SNDRV_CTL_ELEM_TYPE_BYTES);
1865 } else { 2047 } else {
1866 adsp_warn(dsp, "Missing length info for region XM with ID %x\n", 2048 adsp_warn(dsp, "Missing length info for region XM with ID %x\n",
1867 be32_to_cpu(adsp2_alg[i].alg.id)); 2049 be32_to_cpu(adsp2_alg[i].alg.id));
@@ -1881,7 +2063,8 @@ static int wm_adsp2_setup_algs(struct wm_adsp *dsp)
1881 len -= be32_to_cpu(adsp2_alg[i].ym); 2063 len -= be32_to_cpu(adsp2_alg[i].ym);
1882 len *= 4; 2064 len *= 4;
1883 wm_adsp_create_control(dsp, alg_region, 0, 2065 wm_adsp_create_control(dsp, alg_region, 0,
1884 len, NULL, 0, 0); 2066 len, NULL, 0, 0,
2067 SNDRV_CTL_ELEM_TYPE_BYTES);
1885 } else { 2068 } else {
1886 adsp_warn(dsp, "Missing length info for region YM with ID %x\n", 2069 adsp_warn(dsp, "Missing length info for region YM with ID %x\n",
1887 be32_to_cpu(adsp2_alg[i].alg.id)); 2070 be32_to_cpu(adsp2_alg[i].alg.id));
@@ -1901,7 +2084,8 @@ static int wm_adsp2_setup_algs(struct wm_adsp *dsp)
1901 len -= be32_to_cpu(adsp2_alg[i].zm); 2084 len -= be32_to_cpu(adsp2_alg[i].zm);
1902 len *= 4; 2085 len *= 4;
1903 wm_adsp_create_control(dsp, alg_region, 0, 2086 wm_adsp_create_control(dsp, alg_region, 0,
1904 len, NULL, 0, 0); 2087 len, NULL, 0, 0,
2088 SNDRV_CTL_ELEM_TYPE_BYTES);
1905 } else { 2089 } else {
1906 adsp_warn(dsp, "Missing length info for region ZM with ID %x\n", 2090 adsp_warn(dsp, "Missing length info for region ZM with ID %x\n",
1907 be32_to_cpu(adsp2_alg[i].alg.id)); 2091 be32_to_cpu(adsp2_alg[i].alg.id));
@@ -2114,7 +2298,7 @@ int wm_adsp1_event(struct snd_soc_dapm_widget *w,
2114 int ret; 2298 int ret;
2115 unsigned int val; 2299 unsigned int val;
2116 2300
2117 dsp->card = codec->component.card; 2301 dsp->codec = codec;
2118 2302
2119 mutex_lock(&dsp->pwr_lock); 2303 mutex_lock(&dsp->pwr_lock);
2120 2304
@@ -2325,8 +2509,6 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
2325 struct wm_adsp *dsp = &dsps[w->shift]; 2509 struct wm_adsp *dsp = &dsps[w->shift];
2326 struct wm_coeff_ctl *ctl; 2510 struct wm_coeff_ctl *ctl;
2327 2511
2328 dsp->card = codec->component.card;
2329
2330 switch (event) { 2512 switch (event) {
2331 case SND_SOC_DAPM_PRE_PMU: 2513 case SND_SOC_DAPM_PRE_PMU:
2332 wm_adsp2_set_dspclk(dsp, freq); 2514 wm_adsp2_set_dspclk(dsp, freq);
@@ -2393,14 +2575,22 @@ int wm_adsp2_event(struct snd_soc_dapm_widget *w,
2393 2575
2394 mutex_lock(&dsp->pwr_lock); 2576 mutex_lock(&dsp->pwr_lock);
2395 2577
2396 if (wm_adsp_fw[dsp->fw].num_caps != 0) 2578 if (wm_adsp_fw[dsp->fw].num_caps != 0) {
2397 ret = wm_adsp_buffer_init(dsp); 2579 ret = wm_adsp_buffer_init(dsp);
2580 if (ret < 0) {
2581 mutex_unlock(&dsp->pwr_lock);
2582 goto err;
2583 }
2584 }
2398 2585
2399 mutex_unlock(&dsp->pwr_lock); 2586 mutex_unlock(&dsp->pwr_lock);
2400 2587
2401 break; 2588 break;
2402 2589
2403 case SND_SOC_DAPM_PRE_PMD: 2590 case SND_SOC_DAPM_PRE_PMD:
2591 /* Tell the firmware to cleanup */
2592 wm_adsp_signal_event_controls(dsp, WM_ADSP_FW_EVENT_SHUTDOWN);
2593
2404 /* Log firmware state, it can be useful for analysis */ 2594 /* Log firmware state, it can be useful for analysis */
2405 wm_adsp2_show_fw_status(dsp); 2595 wm_adsp2_show_fw_status(dsp);
2406 2596
@@ -2441,6 +2631,8 @@ EXPORT_SYMBOL_GPL(wm_adsp2_event);
2441 2631
2442int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec) 2632int wm_adsp2_codec_probe(struct wm_adsp *dsp, struct snd_soc_codec *codec)
2443{ 2633{
2634 dsp->codec = codec;
2635
2444 wm_adsp2_init_debugfs(dsp, codec); 2636 wm_adsp2_init_debugfs(dsp, codec);
2445 2637
2446 return snd_soc_add_codec_controls(codec, 2638 return snd_soc_add_codec_controls(codec,
diff --git a/sound/soc/codecs/wm_adsp.h b/sound/soc/codecs/wm_adsp.h
index 362dd7ce60d8..411d062c13f2 100644
--- a/sound/soc/codecs/wm_adsp.h
+++ b/sound/soc/codecs/wm_adsp.h
@@ -44,7 +44,7 @@ struct wm_adsp {
44 int type; 44 int type;
45 struct device *dev; 45 struct device *dev;
46 struct regmap *regmap; 46 struct regmap *regmap;
47 struct snd_soc_card *card; 47 struct snd_soc_codec *codec;
48 48
49 int base; 49 int base;
50 int sysclk_reg; 50 int sysclk_reg;
@@ -110,18 +110,17 @@ int wm_adsp2_early_event(struct snd_soc_dapm_widget *w,
110int wm_adsp2_event(struct snd_soc_dapm_widget *w, 110int wm_adsp2_event(struct snd_soc_dapm_widget *w,
111 struct snd_kcontrol *kcontrol, int event); 111 struct snd_kcontrol *kcontrol, int event);
112 112
113extern int wm_adsp_compr_open(struct wm_adsp *dsp, 113int wm_adsp_compr_open(struct wm_adsp *dsp, struct snd_compr_stream *stream);
114 struct snd_compr_stream *stream); 114int wm_adsp_compr_free(struct snd_compr_stream *stream);
115extern int wm_adsp_compr_free(struct snd_compr_stream *stream); 115int wm_adsp_compr_set_params(struct snd_compr_stream *stream,
116extern int wm_adsp_compr_set_params(struct snd_compr_stream *stream, 116 struct snd_compr_params *params);
117 struct snd_compr_params *params); 117int wm_adsp_compr_get_caps(struct snd_compr_stream *stream,
118extern int wm_adsp_compr_get_caps(struct snd_compr_stream *stream, 118 struct snd_compr_caps *caps);
119 struct snd_compr_caps *caps); 119int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd);
120extern int wm_adsp_compr_trigger(struct snd_compr_stream *stream, int cmd); 120int wm_adsp_compr_handle_irq(struct wm_adsp *dsp);
121extern int wm_adsp_compr_handle_irq(struct wm_adsp *dsp); 121int wm_adsp_compr_pointer(struct snd_compr_stream *stream,
122extern int wm_adsp_compr_pointer(struct snd_compr_stream *stream, 122 struct snd_compr_tstamp *tstamp);
123 struct snd_compr_tstamp *tstamp); 123int wm_adsp_compr_copy(struct snd_compr_stream *stream,
124extern int wm_adsp_compr_copy(struct snd_compr_stream *stream, 124 char __user *buf, size_t count);
125 char __user *buf, size_t count);
126 125
127#endif 126#endif
diff --git a/sound/soc/codecs/wmfw.h b/sound/soc/codecs/wmfw.h
index 7613d60d62ea..ec78b9da020f 100644
--- a/sound/soc/codecs/wmfw.h
+++ b/sound/soc/codecs/wmfw.h
@@ -26,6 +26,10 @@
26#define WMFW_CTL_FLAG_WRITEABLE 0x0002 26#define WMFW_CTL_FLAG_WRITEABLE 0x0002
27#define WMFW_CTL_FLAG_READABLE 0x0001 27#define WMFW_CTL_FLAG_READABLE 0x0001
28 28
29/* Non-ALSA coefficient types start at 0x1000 */
30#define WMFW_CTL_TYPE_ACKED 0x1000 /* acked control */
31#define WMFW_CTL_TYPE_HOSTEVENT 0x1001 /* event control */
32
29struct wmfw_header { 33struct wmfw_header {
30 char magic[4]; 34 char magic[4];
31 __le32 len; 35 __le32 len;
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index 19bdcac71775..37f9b6201918 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -40,6 +40,7 @@ config SND_SOC_FSL_SPDIF
40 select REGMAP_MMIO 40 select REGMAP_MMIO
41 select SND_SOC_IMX_PCM_DMA if SND_IMX_SOC != n 41 select SND_SOC_IMX_PCM_DMA if SND_IMX_SOC != n
42 select SND_SOC_IMX_PCM_FIQ if SND_IMX_SOC != n && (MXC_TZIC || MXC_AVIC) 42 select SND_SOC_IMX_PCM_FIQ if SND_IMX_SOC != n && (MXC_TZIC || MXC_AVIC)
43 select BITREVERSE
43 help 44 help
44 Say Y if you want to add Sony/Philips Digital Interface (SPDIF) 45 Say Y if you want to add Sony/Philips Digital Interface (SPDIF)
45 support for the Freescale CPUs. 46 support for the Freescale CPUs.
diff --git a/sound/soc/fsl/efika-audio-fabric.c b/sound/soc/fsl/efika-audio-fabric.c
index b2acd3293ea8..f200d1cfc4bd 100644
--- a/sound/soc/fsl/efika-audio-fabric.c
+++ b/sound/soc/fsl/efika-audio-fabric.c
@@ -27,7 +27,6 @@
27 27
28#include "mpc5200_dma.h" 28#include "mpc5200_dma.h"
29#include "mpc5200_psc_ac97.h" 29#include "mpc5200_psc_ac97.h"
30#include "../codecs/stac9766.h"
31 30
32#define DRV_NAME "efika-audio-fabric" 31#define DRV_NAME "efika-audio-fabric"
33 32
diff --git a/sound/soc/fsl/fsl-asoc-card.c b/sound/soc/fsl/fsl-asoc-card.c
index dffd549a0e2a..9998aea23597 100644
--- a/sound/soc/fsl/fsl-asoc-card.c
+++ b/sound/soc/fsl/fsl-asoc-card.c
@@ -183,7 +183,7 @@ static int fsl_asoc_card_hw_params(struct snd_pcm_substream *substream,
183 return 0; 183 return 0;
184} 184}
185 185
186static struct snd_soc_ops fsl_asoc_card_ops = { 186static const struct snd_soc_ops fsl_asoc_card_ops = {
187 .hw_params = fsl_asoc_card_hw_params, 187 .hw_params = fsl_asoc_card_hw_params,
188}; 188};
189 189
diff --git a/sound/soc/fsl/imx-wm8962.c b/sound/soc/fsl/imx-wm8962.c
index 201a70d1027a..1b60958e2080 100644
--- a/sound/soc/fsl/imx-wm8962.c
+++ b/sound/soc/fsl/imx-wm8962.c
@@ -61,7 +61,7 @@ static int imx_hifi_hw_params(struct snd_pcm_substream *substream,
61 return 0; 61 return 0;
62} 62}
63 63
64static struct snd_soc_ops imx_hifi_ops = { 64static const struct snd_soc_ops imx_hifi_ops = {
65 .hw_params = imx_hifi_hw_params, 65 .hw_params = imx_hifi_hw_params,
66}; 66};
67 67
diff --git a/sound/soc/generic/simple-card-utils.c b/sound/soc/generic/simple-card-utils.c
index 1cb39309f5d5..cf026252cd4a 100644
--- a/sound/soc/generic/simple-card-utils.c
+++ b/sound/soc/generic/simple-card-utils.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * simple-card-core.c 2 * simple-card-utils.c
3 * 3 *
4 * Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> 4 * Copyright (c) 2016 Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
5 * 5 *
@@ -195,9 +195,6 @@ EXPORT_SYMBOL_GPL(asoc_simple_card_init_dai);
195 195
196int asoc_simple_card_canonicalize_dailink(struct snd_soc_dai_link *dai_link) 196int asoc_simple_card_canonicalize_dailink(struct snd_soc_dai_link *dai_link)
197{ 197{
198 if (!dai_link->cpu_dai_name || !dai_link->codec_dai_name)
199 return -EINVAL;
200
201 /* Assumes platform == cpu */ 198 /* Assumes platform == cpu */
202 if (!dai_link->platform_of_node) 199 if (!dai_link->platform_of_node)
203 dai_link->platform_of_node = dai_link->cpu_of_node; 200 dai_link->platform_of_node = dai_link->cpu_of_node;
diff --git a/sound/soc/generic/simple-card.c b/sound/soc/generic/simple-card.c
index f608f8d23f3d..a385ff6bfa4b 100644
--- a/sound/soc/generic/simple-card.c
+++ b/sound/soc/generic/simple-card.c
@@ -174,7 +174,7 @@ err:
174 return ret; 174 return ret;
175} 175}
176 176
177static struct snd_soc_ops asoc_simple_card_ops = { 177static const struct snd_soc_ops asoc_simple_card_ops = {
178 .startup = asoc_simple_card_startup, 178 .startup = asoc_simple_card_startup,
179 .shutdown = asoc_simple_card_shutdown, 179 .shutdown = asoc_simple_card_shutdown,
180 .hw_params = asoc_simple_card_hw_params, 180 .hw_params = asoc_simple_card_hw_params,
diff --git a/sound/soc/generic/simple-scu-card.c b/sound/soc/generic/simple-scu-card.c
index b9973a56bcb0..bb86ee042490 100644
--- a/sound/soc/generic/simple-scu-card.c
+++ b/sound/soc/generic/simple-scu-card.c
@@ -22,7 +22,7 @@
22#include <sound/soc-dai.h> 22#include <sound/soc-dai.h>
23#include <sound/simple_card_utils.h> 23#include <sound/simple_card_utils.h>
24 24
25struct asoc_simple_card_priv { 25struct simple_card_data {
26 struct snd_soc_card snd_card; 26 struct snd_soc_card snd_card;
27 struct snd_soc_codec_conf codec_conf; 27 struct snd_soc_codec_conf codec_conf;
28 struct asoc_simple_dai *dai_props; 28 struct asoc_simple_dai *dai_props;
@@ -42,7 +42,7 @@ struct asoc_simple_card_priv {
42static int asoc_simple_card_startup(struct snd_pcm_substream *substream) 42static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
43{ 43{
44 struct snd_soc_pcm_runtime *rtd = substream->private_data; 44 struct snd_soc_pcm_runtime *rtd = substream->private_data;
45 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card); 45 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
46 struct asoc_simple_dai *dai_props = 46 struct asoc_simple_dai *dai_props =
47 simple_priv_to_props(priv, rtd->num); 47 simple_priv_to_props(priv, rtd->num);
48 48
@@ -52,21 +52,21 @@ static int asoc_simple_card_startup(struct snd_pcm_substream *substream)
52static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream) 52static void asoc_simple_card_shutdown(struct snd_pcm_substream *substream)
53{ 53{
54 struct snd_soc_pcm_runtime *rtd = substream->private_data; 54 struct snd_soc_pcm_runtime *rtd = substream->private_data;
55 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card); 55 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
56 struct asoc_simple_dai *dai_props = 56 struct asoc_simple_dai *dai_props =
57 simple_priv_to_props(priv, rtd->num); 57 simple_priv_to_props(priv, rtd->num);
58 58
59 clk_disable_unprepare(dai_props->clk); 59 clk_disable_unprepare(dai_props->clk);
60} 60}
61 61
62static struct snd_soc_ops asoc_simple_card_ops = { 62static const struct snd_soc_ops asoc_simple_card_ops = {
63 .startup = asoc_simple_card_startup, 63 .startup = asoc_simple_card_startup,
64 .shutdown = asoc_simple_card_shutdown, 64 .shutdown = asoc_simple_card_shutdown,
65}; 65};
66 66
67static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd) 67static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
68{ 68{
69 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card); 69 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
70 struct snd_soc_dai *dai; 70 struct snd_soc_dai *dai;
71 struct snd_soc_dai_link *dai_link; 71 struct snd_soc_dai_link *dai_link;
72 struct asoc_simple_dai *dai_props; 72 struct asoc_simple_dai *dai_props;
@@ -84,7 +84,7 @@ static int asoc_simple_card_dai_init(struct snd_soc_pcm_runtime *rtd)
84static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd, 84static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
85 struct snd_pcm_hw_params *params) 85 struct snd_pcm_hw_params *params)
86{ 86{
87 struct asoc_simple_card_priv *priv = snd_soc_card_get_drvdata(rtd->card); 87 struct simple_card_data *priv = snd_soc_card_get_drvdata(rtd->card);
88 struct snd_interval *rate = hw_param_interval(params, 88 struct snd_interval *rate = hw_param_interval(params,
89 SNDRV_PCM_HW_PARAM_RATE); 89 SNDRV_PCM_HW_PARAM_RATE);
90 struct snd_interval *channels = hw_param_interval(params, 90 struct snd_interval *channels = hw_param_interval(params,
@@ -101,8 +101,8 @@ static int asoc_simple_card_be_hw_params_fixup(struct snd_soc_pcm_runtime *rtd,
101 return 0; 101 return 0;
102} 102}
103 103
104static int asoc_simple_card_parse_links(struct device_node *np, 104static int asoc_simple_card_dai_link_of(struct device_node *np,
105 struct asoc_simple_card_priv *priv, 105 struct simple_card_data *priv,
106 unsigned int daifmt, 106 unsigned int daifmt,
107 int idx, bool is_fe) 107 int idx, bool is_fe)
108{ 108{
@@ -195,22 +195,35 @@ static int asoc_simple_card_parse_links(struct device_node *np,
195 return 0; 195 return 0;
196} 196}
197 197
198static int asoc_simple_card_dai_link_of(struct device_node *node, 198static int asoc_simple_card_parse_of(struct device_node *node,
199 struct asoc_simple_card_priv *priv) 199 struct simple_card_data *priv)
200
200{ 201{
201 struct device *dev = simple_priv_to_dev(priv); 202 struct device *dev = simple_priv_to_dev(priv);
202 struct device_node *np; 203 struct device_node *np;
203 unsigned int daifmt = 0; 204 unsigned int daifmt = 0;
204 int ret, i;
205 bool is_fe; 205 bool is_fe;
206 int ret, i;
207
208 if (!node)
209 return -EINVAL;
210
211 ret = snd_soc_of_parse_audio_routing(&priv->snd_card, PREFIX "routing");
212 if (ret < 0)
213 return ret;
214
215 /* sampling rate convert */
216 of_property_read_u32(node, PREFIX "convert-rate", &priv->convert_rate);
217
218 /* channels transfer */
219 of_property_read_u32(node, PREFIX "convert-channels", &priv->convert_channels);
206 220
207 /* find 1st codec */ 221 /* find 1st codec */
208 np = of_get_child_by_name(node, PREFIX "codec"); 222 np = of_get_child_by_name(node, PREFIX "codec");
209 if (!np) 223 if (!np)
210 return -ENODEV; 224 return -ENODEV;
211 225
212 ret = asoc_simple_card_parse_daifmt(dev, node, np, 226 ret = asoc_simple_card_parse_daifmt(dev, node, np, PREFIX, &daifmt);
213 PREFIX, &daifmt);
214 if (ret < 0) 227 if (ret < 0)
215 return ret; 228 return ret;
216 229
@@ -220,58 +233,12 @@ static int asoc_simple_card_dai_link_of(struct device_node *node,
220 if (strcmp(np->name, PREFIX "cpu") == 0) 233 if (strcmp(np->name, PREFIX "cpu") == 0)
221 is_fe = true; 234 is_fe = true;
222 235
223 ret = asoc_simple_card_parse_links(np, priv, daifmt, i, is_fe); 236 ret = asoc_simple_card_dai_link_of(np, priv, daifmt, i, is_fe);
224 if (ret < 0) 237 if (ret < 0)
225 return ret; 238 return ret;
226 i++; 239 i++;
227 } 240 }
228 241
229 return 0;
230}
231
232static int asoc_simple_card_parse_of(struct device_node *node,
233 struct asoc_simple_card_priv *priv,
234 struct device *dev)
235{
236 struct asoc_simple_dai *props;
237 struct snd_soc_dai_link *links;
238 int ret;
239 int num;
240
241 if (!node)
242 return -EINVAL;
243
244 num = of_get_child_count(node);
245 props = devm_kzalloc(dev, sizeof(*props) * num, GFP_KERNEL);
246 links = devm_kzalloc(dev, sizeof(*links) * num, GFP_KERNEL);
247 if (!props || !links)
248 return -ENOMEM;
249
250 priv->dai_props = props;
251 priv->dai_link = links;
252
253 /* Init snd_soc_card */
254 priv->snd_card.owner = THIS_MODULE;
255 priv->snd_card.dev = dev;
256 priv->snd_card.dai_link = priv->dai_link;
257 priv->snd_card.num_links = num;
258 priv->snd_card.codec_conf = &priv->codec_conf;
259 priv->snd_card.num_configs = 1;
260
261 ret = snd_soc_of_parse_audio_routing(&priv->snd_card, PREFIX "routing");
262 if (ret < 0)
263 return ret;
264
265 /* sampling rate convert */
266 of_property_read_u32(node, PREFIX "convert-rate", &priv->convert_rate);
267
268 /* channels transfer */
269 of_property_read_u32(node, PREFIX "convert-channels", &priv->convert_channels);
270
271 ret = asoc_simple_card_dai_link_of(node, priv);
272 if (ret < 0)
273 return ret;
274
275 ret = asoc_simple_card_parse_card_name(&priv->snd_card, PREFIX); 242 ret = asoc_simple_card_parse_card_name(&priv->snd_card, PREFIX);
276 if (ret < 0) 243 if (ret < 0)
277 return ret; 244 return ret;
@@ -286,17 +253,37 @@ static int asoc_simple_card_parse_of(struct device_node *node,
286 253
287static int asoc_simple_card_probe(struct platform_device *pdev) 254static int asoc_simple_card_probe(struct platform_device *pdev)
288{ 255{
289 struct asoc_simple_card_priv *priv; 256 struct simple_card_data *priv;
290 struct device_node *np = pdev->dev.of_node; 257 struct snd_soc_dai_link *dai_link;
258 struct asoc_simple_dai *dai_props;
291 struct device *dev = &pdev->dev; 259 struct device *dev = &pdev->dev;
292 int ret; 260 struct device_node *np = pdev->dev.of_node;
261 int num, ret;
293 262
294 /* Allocate the private data */ 263 /* Allocate the private data */
295 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); 264 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
296 if (!priv) 265 if (!priv)
297 return -ENOMEM; 266 return -ENOMEM;
298 267
299 ret = asoc_simple_card_parse_of(np, priv, dev); 268 num = of_get_child_count(np);
269
270 dai_props = devm_kzalloc(dev, sizeof(*dai_props) * num, GFP_KERNEL);
271 dai_link = devm_kzalloc(dev, sizeof(*dai_link) * num, GFP_KERNEL);
272 if (!dai_props || !dai_link)
273 return -ENOMEM;
274
275 priv->dai_props = dai_props;
276 priv->dai_link = dai_link;
277
278 /* Init snd_soc_card */
279 priv->snd_card.owner = THIS_MODULE;
280 priv->snd_card.dev = dev;
281 priv->snd_card.dai_link = priv->dai_link;
282 priv->snd_card.num_links = num;
283 priv->snd_card.codec_conf = &priv->codec_conf;
284 priv->snd_card.num_configs = 1;
285
286 ret = asoc_simple_card_parse_of(np, priv);
300 if (ret < 0) { 287 if (ret < 0) {
301 if (ret != -EPROBE_DEFER) 288 if (ret != -EPROBE_DEFER)
302 dev_err(dev, "parse error %d\n", ret); 289 dev_err(dev, "parse error %d\n", ret);
diff --git a/sound/soc/intel/atom/sst-atom-controls.c b/sound/soc/intel/atom/sst-atom-controls.c
index 0838478c4c3f..c7b3cbf92faf 100644
--- a/sound/soc/intel/atom/sst-atom-controls.c
+++ b/sound/soc/intel/atom/sst-atom-controls.c
@@ -937,7 +937,7 @@ int send_ssp_cmd(struct snd_soc_dai *dai, const char *id, bool enable)
937 struct sst_data *drv = snd_soc_dai_get_drvdata(dai); 937 struct sst_data *drv = snd_soc_dai_get_drvdata(dai);
938 int ssp_id; 938 int ssp_id;
939 939
940 dev_info(dai->dev, "Enter: enable=%d port_name=%s\n", enable, id); 940 dev_dbg(dai->dev, "Enter: enable=%d port_name=%s\n", enable, id);
941 941
942 if (strcmp(id, "ssp0-port") == 0) 942 if (strcmp(id, "ssp0-port") == 0)
943 ssp_id = SSP_MODEM; 943 ssp_id = SSP_MODEM;
diff --git a/sound/soc/intel/atom/sst-mfld-platform-pcm.c b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
index 25c6d87c818e..f5a8050351b5 100644
--- a/sound/soc/intel/atom/sst-mfld-platform-pcm.c
+++ b/sound/soc/intel/atom/sst-mfld-platform-pcm.c
@@ -771,6 +771,9 @@ static int sst_soc_prepare(struct device *dev)
771 struct sst_data *drv = dev_get_drvdata(dev); 771 struct sst_data *drv = dev_get_drvdata(dev);
772 struct snd_soc_pcm_runtime *rtd; 772 struct snd_soc_pcm_runtime *rtd;
773 773
774 if (!drv->soc_card)
775 return 0;
776
774 /* suspend all pcms first */ 777 /* suspend all pcms first */
775 snd_soc_suspend(drv->soc_card->dev); 778 snd_soc_suspend(drv->soc_card->dev);
776 snd_soc_poweroff(drv->soc_card->dev); 779 snd_soc_poweroff(drv->soc_card->dev);
@@ -793,6 +796,9 @@ static void sst_soc_complete(struct device *dev)
793 struct sst_data *drv = dev_get_drvdata(dev); 796 struct sst_data *drv = dev_get_drvdata(dev);
794 struct snd_soc_pcm_runtime *rtd; 797 struct snd_soc_pcm_runtime *rtd;
795 798
799 if (!drv->soc_card)
800 return;
801
796 /* restart SSPs */ 802 /* restart SSPs */
797 list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) { 803 list_for_each_entry(rtd, &drv->soc_card->rtd_list, list) {
798 struct snd_soc_dai *dai = rtd->cpu_dai; 804 struct snd_soc_dai *dai = rtd->cpu_dai;
diff --git a/sound/soc/intel/atom/sst/sst.c b/sound/soc/intel/atom/sst/sst.c
index 9b6e27385dc9..f9ba71315e33 100644
--- a/sound/soc/intel/atom/sst/sst.c
+++ b/sound/soc/intel/atom/sst/sst.c
@@ -27,6 +27,7 @@
27#include <linux/pm_qos.h> 27#include <linux/pm_qos.h>
28#include <linux/async.h> 28#include <linux/async.h>
29#include <linux/acpi.h> 29#include <linux/acpi.h>
30#include <linux/sysfs.h>
30#include <sound/core.h> 31#include <sound/core.h>
31#include <sound/soc.h> 32#include <sound/soc.h>
32#include <asm/platform_sst_audio.h> 33#include <asm/platform_sst_audio.h>
@@ -242,6 +243,32 @@ int sst_alloc_drv_context(struct intel_sst_drv **ctx,
242} 243}
243EXPORT_SYMBOL_GPL(sst_alloc_drv_context); 244EXPORT_SYMBOL_GPL(sst_alloc_drv_context);
244 245
246static ssize_t firmware_version_show(struct device *dev,
247 struct device_attribute *attr, char *buf)
248{
249 struct intel_sst_drv *ctx = dev_get_drvdata(dev);
250
251 if (ctx->fw_version.type == 0 && ctx->fw_version.major == 0 &&
252 ctx->fw_version.minor == 0 && ctx->fw_version.build == 0)
253 return sprintf(buf, "FW not yet loaded\n");
254 else
255 return sprintf(buf, "v%02x.%02x.%02x.%02x\n",
256 ctx->fw_version.type, ctx->fw_version.major,
257 ctx->fw_version.minor, ctx->fw_version.build);
258
259}
260
261DEVICE_ATTR_RO(firmware_version);
262
263static const struct attribute *sst_fw_version_attrs[] = {
264 &dev_attr_firmware_version.attr,
265 NULL,
266};
267
268static const struct attribute_group sst_fw_version_attr_group = {
269 .attrs = (struct attribute **)sst_fw_version_attrs,
270};
271
245int sst_context_init(struct intel_sst_drv *ctx) 272int sst_context_init(struct intel_sst_drv *ctx)
246{ 273{
247 int ret = 0, i; 274 int ret = 0, i;
@@ -315,8 +342,19 @@ int sst_context_init(struct intel_sst_drv *ctx)
315 dev_err(ctx->dev, "Firmware download failed:%d\n", ret); 342 dev_err(ctx->dev, "Firmware download failed:%d\n", ret);
316 goto do_free_mem; 343 goto do_free_mem;
317 } 344 }
345
346 ret = sysfs_create_group(&ctx->dev->kobj,
347 &sst_fw_version_attr_group);
348 if (ret) {
349 dev_err(ctx->dev,
350 "Unable to create sysfs\n");
351 goto err_sysfs;
352 }
353
318 sst_register(ctx->dev); 354 sst_register(ctx->dev);
319 return 0; 355 return 0;
356err_sysfs:
357 sysfs_remove_group(&ctx->dev->kobj, &sst_fw_version_attr_group);
320 358
321do_free_mem: 359do_free_mem:
322 destroy_workqueue(ctx->post_msg_wq); 360 destroy_workqueue(ctx->post_msg_wq);
@@ -330,6 +368,7 @@ void sst_context_cleanup(struct intel_sst_drv *ctx)
330 pm_runtime_disable(ctx->dev); 368 pm_runtime_disable(ctx->dev);
331 sst_unregister(ctx->dev); 369 sst_unregister(ctx->dev);
332 sst_set_fw_state_locked(ctx, SST_SHUTDOWN); 370 sst_set_fw_state_locked(ctx, SST_SHUTDOWN);
371 sysfs_remove_group(&ctx->dev->kobj, &sst_fw_version_attr_group);
333 flush_scheduled_work(); 372 flush_scheduled_work();
334 destroy_workqueue(ctx->post_msg_wq); 373 destroy_workqueue(ctx->post_msg_wq);
335 pm_qos_remove_request(ctx->qos); 374 pm_qos_remove_request(ctx->qos);
diff --git a/sound/soc/intel/atom/sst/sst.h b/sound/soc/intel/atom/sst/sst.h
index 3f493862e98d..5c9a51cc77aa 100644
--- a/sound/soc/intel/atom/sst/sst.h
+++ b/sound/soc/intel/atom/sst/sst.h
@@ -436,6 +436,7 @@ struct intel_sst_drv {
436 */ 436 */
437 char firmware_name[FW_NAME_SIZE]; 437 char firmware_name[FW_NAME_SIZE];
438 438
439 struct snd_sst_fw_version fw_version;
439 struct sst_fw_save *fw_save; 440 struct sst_fw_save *fw_save;
440}; 441};
441 442
diff --git a/sound/soc/intel/atom/sst/sst_acpi.c b/sound/soc/intel/atom/sst/sst_acpi.c
index 0a88537ca58a..f4d92bbc5373 100644
--- a/sound/soc/intel/atom/sst/sst_acpi.c
+++ b/sound/soc/intel/atom/sst/sst_acpi.c
@@ -452,6 +452,8 @@ static struct sst_acpi_mach sst_acpi_bytcr[] = {
452static struct sst_acpi_mach sst_acpi_chv[] = { 452static struct sst_acpi_mach sst_acpi_chv[] = {
453 {"10EC5670", "cht-bsw-rt5672", "intel/fw_sst_22a8.bin", "cht-bsw", NULL, 453 {"10EC5670", "cht-bsw-rt5672", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
454 &chv_platform_data }, 454 &chv_platform_data },
455 {"10EC5672", "cht-bsw-rt5672", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
456 &chv_platform_data },
455 {"10EC5645", "cht-bsw-rt5645", "intel/fw_sst_22a8.bin", "cht-bsw", NULL, 457 {"10EC5645", "cht-bsw-rt5645", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
456 &chv_platform_data }, 458 &chv_platform_data },
457 {"10EC5650", "cht-bsw-rt5645", "intel/fw_sst_22a8.bin", "cht-bsw", NULL, 459 {"10EC5650", "cht-bsw-rt5645", "intel/fw_sst_22a8.bin", "cht-bsw", NULL,
diff --git a/sound/soc/intel/atom/sst/sst_ipc.c b/sound/soc/intel/atom/sst/sst_ipc.c
index bfc889950bb2..374bb61c596d 100644
--- a/sound/soc/intel/atom/sst/sst_ipc.c
+++ b/sound/soc/intel/atom/sst/sst_ipc.c
@@ -236,6 +236,17 @@ static void process_fw_init(struct intel_sst_drv *sst_drv_ctx,
236 retval = init->result; 236 retval = init->result;
237 goto ret; 237 goto ret;
238 } 238 }
239 dev_info(sst_drv_ctx->dev, "FW Version %02x.%02x.%02x.%02x\n",
240 init->fw_version.type, init->fw_version.major,
241 init->fw_version.minor, init->fw_version.build);
242 dev_dbg(sst_drv_ctx->dev, "Build date %s Time %s\n",
243 init->build_info.date, init->build_info.time);
244
245 /* Save FW version */
246 sst_drv_ctx->fw_version.type = init->fw_version.type;
247 sst_drv_ctx->fw_version.major = init->fw_version.major;
248 sst_drv_ctx->fw_version.minor = init->fw_version.minor;
249 sst_drv_ctx->fw_version.build = init->fw_version.build;
239 250
240ret: 251ret:
241 sst_wake_up_block(sst_drv_ctx, retval, FW_DWNL_ID, 0 , NULL, 0); 252 sst_wake_up_block(sst_drv_ctx, retval, FW_DWNL_ID, 0 , NULL, 0);
diff --git a/sound/soc/intel/atom/sst/sst_stream.c b/sound/soc/intel/atom/sst/sst_stream.c
index 4ccc80e5e8cc..51bdeeecb7c8 100644
--- a/sound/soc/intel/atom/sst/sst_stream.c
+++ b/sound/soc/intel/atom/sst/sst_stream.c
@@ -104,7 +104,7 @@ int sst_alloc_stream_mrfld(struct intel_sst_drv *sst_drv_ctx, void *params)
104 sst_init_stream(&sst_drv_ctx->streams[str_id], alloc_param.codec_type, 104 sst_init_stream(&sst_drv_ctx->streams[str_id], alloc_param.codec_type,
105 str_id, alloc_param.operation, 0); 105 str_id, alloc_param.operation, 0);
106 106
107 dev_info(sst_drv_ctx->dev, "Alloc for str %d pipe %#x\n", 107 dev_dbg(sst_drv_ctx->dev, "Alloc for str %d pipe %#x\n",
108 str_id, pipe_id); 108 str_id, pipe_id);
109 ret = sst_prepare_and_post_msg(sst_drv_ctx, task_id, IPC_CMD, 109 ret = sst_prepare_and_post_msg(sst_drv_ctx, task_id, IPC_CMD,
110 IPC_IA_ALLOC_STREAM_MRFLD, pipe_id, sizeof(alloc_param), 110 IPC_IA_ALLOC_STREAM_MRFLD, pipe_id, sizeof(alloc_param),
@@ -415,7 +415,7 @@ int sst_free_stream(struct intel_sst_drv *sst_drv_ctx, int str_id)
415 str_info->status = STREAM_UN_INIT; 415 str_info->status = STREAM_UN_INIT;
416 mutex_unlock(&str_info->lock); 416 mutex_unlock(&str_info->lock);
417 417
418 dev_info(sst_drv_ctx->dev, "Free for str %d pipe %#x\n", 418 dev_dbg(sst_drv_ctx->dev, "Free for str %d pipe %#x\n",
419 str_id, str_info->pipe_id); 419 str_id, str_info->pipe_id);
420 retval = sst_prepare_and_post_msg(sst_drv_ctx, str_info->task_id, IPC_CMD, 420 retval = sst_prepare_and_post_msg(sst_drv_ctx, str_info->task_id, IPC_CMD,
421 IPC_IA_FREE_STREAM_MRFLD, str_info->pipe_id, 0, 421 IPC_IA_FREE_STREAM_MRFLD, str_info->pipe_id, 0,
diff --git a/sound/soc/intel/baytrail/sst-baytrail-ipc.c b/sound/soc/intel/baytrail/sst-baytrail-ipc.c
index 7ab14ce65a73..260447da32b8 100644
--- a/sound/soc/intel/baytrail/sst-baytrail-ipc.c
+++ b/sound/soc/intel/baytrail/sst-baytrail-ipc.c
@@ -23,7 +23,6 @@
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/delay.h> 24#include <linux/delay.h>
25#include <linux/platform_device.h> 25#include <linux/platform_device.h>
26#include <linux/kthread.h>
27#include <linux/firmware.h> 26#include <linux/firmware.h>
28#include <linux/io.h> 27#include <linux/io.h>
29#include <asm/div64.h> 28#include <asm/div64.h>
@@ -338,7 +337,7 @@ static irqreturn_t sst_byt_irq_thread(int irq, void *context)
338 spin_unlock_irqrestore(&sst->spinlock, flags); 337 spin_unlock_irqrestore(&sst->spinlock, flags);
339 338
340 /* continue to send any remaining messages... */ 339 /* continue to send any remaining messages... */
341 kthread_queue_work(&ipc->kworker, &ipc->kwork); 340 schedule_work(&ipc->kwork);
342 341
343 return IRQ_HANDLED; 342 return IRQ_HANDLED;
344} 343}
diff --git a/sound/soc/intel/boards/bdw-rt5677.c b/sound/soc/intel/boards/bdw-rt5677.c
index 547e6705bf6d..53c6b4cbb1e1 100644
--- a/sound/soc/intel/boards/bdw-rt5677.c
+++ b/sound/soc/intel/boards/bdw-rt5677.c
@@ -156,7 +156,7 @@ static int bdw_rt5677_hw_params(struct snd_pcm_substream *substream,
156 return ret; 156 return ret;
157} 157}
158 158
159static struct snd_soc_ops bdw_rt5677_ops = { 159static const struct snd_soc_ops bdw_rt5677_ops = {
160 .hw_params = bdw_rt5677_hw_params, 160 .hw_params = bdw_rt5677_hw_params,
161}; 161};
162 162
diff --git a/sound/soc/intel/boards/broadwell.c b/sound/soc/intel/boards/broadwell.c
index 7486a0022fde..4d7e9decfa92 100644
--- a/sound/soc/intel/boards/broadwell.c
+++ b/sound/soc/intel/boards/broadwell.c
@@ -126,7 +126,7 @@ static int broadwell_rt286_hw_params(struct snd_pcm_substream *substream,
126 return ret; 126 return ret;
127} 127}
128 128
129static struct snd_soc_ops broadwell_rt286_ops = { 129static const struct snd_soc_ops broadwell_rt286_ops = {
130 .hw_params = broadwell_rt286_hw_params, 130 .hw_params = broadwell_rt286_hw_params,
131}; 131};
132 132
@@ -220,10 +220,12 @@ static struct snd_soc_dai_link broadwell_rt286_dais[] = {
220}; 220};
221 221
222static int broadwell_suspend(struct snd_soc_card *card){ 222static int broadwell_suspend(struct snd_soc_card *card){
223 struct snd_soc_codec *codec; 223 struct snd_soc_component *component;
224
225 list_for_each_entry(component, &card->component_dev_list, card_list) {
226 if (!strcmp(component->name, "i2c-INT343A:00")) {
227 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
224 228
225 list_for_each_entry(codec, &card->codec_dev_list, card_list) {
226 if (!strcmp(codec->component.name, "i2c-INT343A:00")) {
227 dev_dbg(codec->dev, "disabling jack detect before going to suspend.\n"); 229 dev_dbg(codec->dev, "disabling jack detect before going to suspend.\n");
228 rt286_mic_detect(codec, NULL); 230 rt286_mic_detect(codec, NULL);
229 break; 231 break;
@@ -233,10 +235,12 @@ static int broadwell_suspend(struct snd_soc_card *card){
233} 235}
234 236
235static int broadwell_resume(struct snd_soc_card *card){ 237static int broadwell_resume(struct snd_soc_card *card){
236 struct snd_soc_codec *codec; 238 struct snd_soc_component *component;
239
240 list_for_each_entry(component, &card->component_dev_list, card_list) {
241 if (!strcmp(component->name, "i2c-INT343A:00")) {
242 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
237 243
238 list_for_each_entry(codec, &card->codec_dev_list, card_list) {
239 if (!strcmp(codec->component.name, "i2c-INT343A:00")) {
240 dev_dbg(codec->dev, "enabling jack detect for resume.\n"); 244 dev_dbg(codec->dev, "enabling jack detect for resume.\n");
241 rt286_mic_detect(codec, &broadwell_headset); 245 rt286_mic_detect(codec, &broadwell_headset);
242 break; 246 break;
diff --git a/sound/soc/intel/boards/bxt_da7219_max98357a.c b/sound/soc/intel/boards/bxt_da7219_max98357a.c
index 865a21e557cc..1b4330cd2739 100644
--- a/sound/soc/intel/boards/bxt_da7219_max98357a.c
+++ b/sound/soc/intel/boards/bxt_da7219_max98357a.c
@@ -30,6 +30,7 @@
30#define BXT_DIALOG_CODEC_DAI "da7219-hifi" 30#define BXT_DIALOG_CODEC_DAI "da7219-hifi"
31#define BXT_MAXIM_CODEC_DAI "HiFi" 31#define BXT_MAXIM_CODEC_DAI "HiFi"
32#define DUAL_CHANNEL 2 32#define DUAL_CHANNEL 2
33#define QUAD_CHANNEL 4
33 34
34static struct snd_soc_jack broxton_headset; 35static struct snd_soc_jack broxton_headset;
35 36
@@ -182,6 +183,16 @@ static struct snd_pcm_hw_constraint_list constraints_channels = {
182 .mask = 0, 183 .mask = 0,
183}; 184};
184 185
186static unsigned int channels_quad[] = {
187 QUAD_CHANNEL,
188};
189
190static struct snd_pcm_hw_constraint_list constraints_channels_quad = {
191 .count = ARRAY_SIZE(channels_quad),
192 .list = channels_quad,
193 .mask = 0,
194};
195
185static int bxt_fe_startup(struct snd_pcm_substream *substream) 196static int bxt_fe_startup(struct snd_pcm_substream *substream)
186{ 197{
187 struct snd_pcm_runtime *runtime = substream->runtime; 198 struct snd_pcm_runtime *runtime = substream->runtime;
@@ -248,7 +259,7 @@ static int broxton_da7219_hw_free(struct snd_pcm_substream *substream)
248 return ret; 259 return ret;
249} 260}
250 261
251static struct snd_soc_ops broxton_da7219_ops = { 262static const struct snd_soc_ops broxton_da7219_ops = {
252 .hw_params = broxton_da7219_hw_params, 263 .hw_params = broxton_da7219_hw_params,
253 .hw_free = broxton_da7219_hw_free, 264 .hw_free = broxton_da7219_hw_free,
254}; 265};
@@ -258,7 +269,10 @@ static int broxton_dmic_fixup(struct snd_soc_pcm_runtime *rtd,
258{ 269{
259 struct snd_interval *channels = hw_param_interval(params, 270 struct snd_interval *channels = hw_param_interval(params,
260 SNDRV_PCM_HW_PARAM_CHANNELS); 271 SNDRV_PCM_HW_PARAM_CHANNELS);
261 channels->min = channels->max = DUAL_CHANNEL; 272 if (params_channels(params) == 2)
273 channels->min = channels->max = 2;
274 else
275 channels->min = channels->max = 4;
262 276
263 return 0; 277 return 0;
264} 278}
@@ -267,9 +281,9 @@ static int broxton_dmic_startup(struct snd_pcm_substream *substream)
267{ 281{
268 struct snd_pcm_runtime *runtime = substream->runtime; 282 struct snd_pcm_runtime *runtime = substream->runtime;
269 283
270 runtime->hw.channels_max = DUAL_CHANNEL; 284 runtime->hw.channels_min = runtime->hw.channels_max = QUAD_CHANNEL;
271 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS, 285 snd_pcm_hw_constraint_list(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
272 &constraints_channels); 286 &constraints_channels_quad);
273 287
274 return snd_pcm_hw_constraint_list(substream->runtime, 0, 288 return snd_pcm_hw_constraint_list(substream->runtime, 0,
275 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); 289 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
@@ -295,7 +309,7 @@ static int broxton_refcap_startup(struct snd_pcm_substream *substream)
295 &constraints_16000); 309 &constraints_16000);
296}; 310};
297 311
298static struct snd_soc_ops broxton_refcap_ops = { 312static const struct snd_soc_ops broxton_refcap_ops = {
299 .startup = broxton_refcap_startup, 313 .startup = broxton_refcap_startup,
300}; 314};
301 315
@@ -348,7 +362,7 @@ static struct snd_soc_dai_link broxton_dais[] = {
348 .dynamic = 1, 362 .dynamic = 1,
349 .ops = &broxton_refcap_ops, 363 .ops = &broxton_refcap_ops,
350 }, 364 },
351 [BXT_DPCM_AUDIO_DMIC_CP] 365 [BXT_DPCM_AUDIO_DMIC_CP] =
352 { 366 {
353 .name = "Bxt Audio DMIC cap", 367 .name = "Bxt Audio DMIC cap",
354 .stream_name = "dmiccap", 368 .stream_name = "dmiccap",
diff --git a/sound/soc/intel/boards/bxt_rt298.c b/sound/soc/intel/boards/bxt_rt298.c
index d610bdca1608..1309405b3808 100644
--- a/sound/soc/intel/boards/bxt_rt298.c
+++ b/sound/soc/intel/boards/bxt_rt298.c
@@ -181,7 +181,7 @@ static int broxton_rt298_hw_params(struct snd_pcm_substream *substream,
181 return ret; 181 return ret;
182} 182}
183 183
184static struct snd_soc_ops broxton_rt298_ops = { 184static const struct snd_soc_ops broxton_rt298_ops = {
185 .hw_params = broxton_rt298_hw_params, 185 .hw_params = broxton_rt298_hw_params,
186}; 186};
187 187
@@ -230,7 +230,7 @@ static int broxton_dmic_startup(struct snd_pcm_substream *substream)
230 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); 230 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
231} 231}
232 232
233static struct snd_soc_ops broxton_dmic_ops = { 233static const struct snd_soc_ops broxton_dmic_ops = {
234 .startup = broxton_dmic_startup, 234 .startup = broxton_dmic_startup,
235}; 235};
236 236
diff --git a/sound/soc/intel/boards/bytcr_rt5640.c b/sound/soc/intel/boards/bytcr_rt5640.c
index bff77a1f27fc..507a86a5eafe 100644
--- a/sound/soc/intel/boards/bytcr_rt5640.c
+++ b/sound/soc/intel/boards/bytcr_rt5640.c
@@ -57,9 +57,7 @@ struct byt_rt5640_private {
57 struct clk *mclk; 57 struct clk *mclk;
58}; 58};
59 59
60static unsigned long byt_rt5640_quirk = BYT_RT5640_DMIC1_MAP | 60static unsigned long byt_rt5640_quirk = BYT_RT5640_MCLK_EN;
61 BYT_RT5640_DMIC_EN |
62 BYT_RT5640_MCLK_EN;
63 61
64static void log_quirks(struct device *dev) 62static void log_quirks(struct device *dev)
65{ 63{
@@ -597,11 +595,11 @@ static int byt_rt5640_aif1_startup(struct snd_pcm_substream *substream)
597 SNDRV_PCM_HW_PARAM_RATE, 48000); 595 SNDRV_PCM_HW_PARAM_RATE, 48000);
598} 596}
599 597
600static struct snd_soc_ops byt_rt5640_aif1_ops = { 598static const struct snd_soc_ops byt_rt5640_aif1_ops = {
601 .startup = byt_rt5640_aif1_startup, 599 .startup = byt_rt5640_aif1_startup,
602}; 600};
603 601
604static struct snd_soc_ops byt_rt5640_be_ssp2_ops = { 602static const struct snd_soc_ops byt_rt5640_be_ssp2_ops = {
605 .hw_params = byt_rt5640_aif1_hw_params, 603 .hw_params = byt_rt5640_aif1_hw_params,
606}; 604};
607 605
@@ -689,6 +687,10 @@ static bool is_valleyview(void)
689 return true; 687 return true;
690} 688}
691 689
690struct acpi_chan_package { /* ACPICA seems to require 64 bit integers */
691 u64 aif_value; /* 1: AIF1, 2: AIF2 */
692 u64 mclock_value; /* usually 25MHz (0x17d7940), ignored */
693};
692 694
693static int snd_byt_rt5640_mc_probe(struct platform_device *pdev) 695static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
694{ 696{
@@ -698,6 +700,7 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
698 int i; 700 int i;
699 int dai_index; 701 int dai_index;
700 struct byt_rt5640_private *priv; 702 struct byt_rt5640_private *priv;
703 bool is_bytcr = false;
701 704
702 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC); 705 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_ATOMIC);
703 if (!priv) 706 if (!priv)
@@ -734,10 +737,61 @@ static int snd_byt_rt5640_mc_probe(struct platform_device *pdev)
734 struct sst_platform_info *p_info = mach->pdata; 737 struct sst_platform_info *p_info = mach->pdata;
735 const struct sst_res_info *res_info = p_info->res_info; 738 const struct sst_res_info *res_info = p_info->res_info;
736 739
737 /* TODO: use CHAN package info from BIOS to detect AIF1/AIF2 */ 740 if (res_info->acpi_ipc_irq_index == 0)
738 if (res_info->acpi_ipc_irq_index == 0) { 741 is_bytcr = true;
742 }
743
744 if (is_bytcr) {
745 /*
746 * Baytrail CR platforms may have CHAN package in BIOS, try
747 * to find relevant routing quirk based as done on Windows
748 * platforms. We have to read the information directly from the
749 * BIOS, at this stage the card is not created and the links
750 * with the codec driver/pdata are non-existent
751 */
752
753 struct acpi_chan_package chan_package;
754
755 /* format specified: 2 64-bit integers */
756 struct acpi_buffer format = {sizeof("NN"), "NN"};
757 struct acpi_buffer state = {0, NULL};
758 struct sst_acpi_package_context pkg_ctx;
759 bool pkg_found = false;
760
761 state.length = sizeof(chan_package);
762 state.pointer = &chan_package;
763
764 pkg_ctx.name = "CHAN";
765 pkg_ctx.length = 2;
766 pkg_ctx.format = &format;
767 pkg_ctx.state = &state;
768 pkg_ctx.data_valid = false;
769
770 pkg_found = sst_acpi_find_package_from_hid(mach->id, &pkg_ctx);
771 if (pkg_found) {
772 if (chan_package.aif_value == 1) {
773 dev_info(&pdev->dev, "BIOS Routing: AIF1 connected\n");
774 byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF1;
775 } else if (chan_package.aif_value == 2) {
776 dev_info(&pdev->dev, "BIOS Routing: AIF2 connected\n");
777 byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF2;
778 } else {
779 dev_info(&pdev->dev, "BIOS Routing isn't valid, ignored\n");
780 pkg_found = false;
781 }
782 }
783
784 if (!pkg_found) {
785 /* no BIOS indications, assume SSP0-AIF2 connection */
739 byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF2; 786 byt_rt5640_quirk |= BYT_RT5640_SSP0_AIF2;
740 } 787 }
788
789 /* change defaults for Baytrail-CR capture */
790 byt_rt5640_quirk |= BYT_RT5640_IN1_MAP;
791 byt_rt5640_quirk |= BYT_RT5640_DIFF_MIC;
792 } else {
793 byt_rt5640_quirk |= (BYT_RT5640_DMIC1_MAP |
794 BYT_RT5640_DMIC_EN);
741 } 795 }
742 796
743 /* check quirks before creating card */ 797 /* check quirks before creating card */
diff --git a/sound/soc/intel/boards/bytcr_rt5651.c b/sound/soc/intel/boards/bytcr_rt5651.c
index 35f591eab3c9..2d24dc04b597 100644
--- a/sound/soc/intel/boards/bytcr_rt5651.c
+++ b/sound/soc/intel/boards/bytcr_rt5651.c
@@ -219,11 +219,11 @@ static int byt_rt5651_aif1_startup(struct snd_pcm_substream *substream)
219 &constraints_48000); 219 &constraints_48000);
220} 220}
221 221
222static struct snd_soc_ops byt_rt5651_aif1_ops = { 222static const struct snd_soc_ops byt_rt5651_aif1_ops = {
223 .startup = byt_rt5651_aif1_startup, 223 .startup = byt_rt5651_aif1_startup,
224}; 224};
225 225
226static struct snd_soc_ops byt_rt5651_be_ssp2_ops = { 226static const struct snd_soc_ops byt_rt5651_be_ssp2_ops = {
227 .hw_params = byt_rt5651_aif1_hw_params, 227 .hw_params = byt_rt5651_aif1_hw_params,
228}; 228};
229 229
diff --git a/sound/soc/intel/boards/cht_bsw_max98090_ti.c b/sound/soc/intel/boards/cht_bsw_max98090_ti.c
index cdcced9f32b6..742bc0d4e681 100644
--- a/sound/soc/intel/boards/cht_bsw_max98090_ti.c
+++ b/sound/soc/intel/boards/cht_bsw_max98090_ti.c
@@ -204,11 +204,11 @@ static int cht_max98090_headset_init(struct snd_soc_component *component)
204 return ts3a227e_enable_jack_detect(component, &ctx->jack); 204 return ts3a227e_enable_jack_detect(component, &ctx->jack);
205} 205}
206 206
207static struct snd_soc_ops cht_aif1_ops = { 207static const struct snd_soc_ops cht_aif1_ops = {
208 .startup = cht_aif1_startup, 208 .startup = cht_aif1_startup,
209}; 209};
210 210
211static struct snd_soc_ops cht_be_ssp2_ops = { 211static const struct snd_soc_ops cht_be_ssp2_ops = {
212 .hw_params = cht_aif1_hw_params, 212 .hw_params = cht_aif1_hw_params,
213}; 213};
214 214
diff --git a/sound/soc/intel/boards/cht_bsw_rt5645.c b/sound/soc/intel/boards/cht_bsw_rt5645.c
index 56056ed7fcfd..f504a0e18f91 100644
--- a/sound/soc/intel/boards/cht_bsw_rt5645.c
+++ b/sound/soc/intel/boards/cht_bsw_rt5645.c
@@ -44,6 +44,7 @@ struct cht_acpi_card {
44struct cht_mc_private { 44struct cht_mc_private {
45 struct snd_soc_jack jack; 45 struct snd_soc_jack jack;
46 struct cht_acpi_card *acpi_card; 46 struct cht_acpi_card *acpi_card;
47 char codec_name[16];
47}; 48};
48 49
49static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card) 50static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
@@ -250,11 +251,11 @@ static int cht_aif1_startup(struct snd_pcm_substream *substream)
250 SNDRV_PCM_HW_PARAM_RATE, 48000); 251 SNDRV_PCM_HW_PARAM_RATE, 48000);
251} 252}
252 253
253static struct snd_soc_ops cht_aif1_ops = { 254static const struct snd_soc_ops cht_aif1_ops = {
254 .startup = cht_aif1_startup, 255 .startup = cht_aif1_startup,
255}; 256};
256 257
257static struct snd_soc_ops cht_be_ssp2_ops = { 258static const struct snd_soc_ops cht_be_ssp2_ops = {
258 .hw_params = cht_aif1_hw_params, 259 .hw_params = cht_aif1_hw_params,
259}; 260};
260 261
@@ -354,7 +355,6 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
354 int i; 355 int i;
355 struct cht_mc_private *drv; 356 struct cht_mc_private *drv;
356 struct snd_soc_card *card = snd_soc_cards[0].soc_card; 357 struct snd_soc_card *card = snd_soc_cards[0].soc_card;
357 char codec_name[16];
358 struct sst_acpi_mach *mach; 358 struct sst_acpi_mach *mach;
359 const char *i2c_name = NULL; 359 const char *i2c_name = NULL;
360 int dai_index = 0; 360 int dai_index = 0;
@@ -374,12 +374,12 @@ static int snd_cht_mc_probe(struct platform_device *pdev)
374 } 374 }
375 card->dev = &pdev->dev; 375 card->dev = &pdev->dev;
376 mach = card->dev->platform_data; 376 mach = card->dev->platform_data;
377 sprintf(codec_name, "i2c-%s:00", drv->acpi_card->codec_id); 377 sprintf(drv->codec_name, "i2c-%s:00", drv->acpi_card->codec_id);
378 378
379 /* set correct codec name */ 379 /* set correct codec name */
380 for (i = 0; i < ARRAY_SIZE(cht_dailink); i++) 380 for (i = 0; i < ARRAY_SIZE(cht_dailink); i++)
381 if (!strcmp(card->dai_link[i].codec_name, "i2c-10EC5645:00")) { 381 if (!strcmp(card->dai_link[i].codec_name, "i2c-10EC5645:00")) {
382 card->dai_link[i].codec_name = kstrdup(codec_name, GFP_KERNEL); 382 card->dai_link[i].codec_name = drv->codec_name;
383 dai_index = i; 383 dai_index = i;
384 } 384 }
385 385
diff --git a/sound/soc/intel/boards/cht_bsw_rt5672.c b/sound/soc/intel/boards/cht_bsw_rt5672.c
index df9d254baa18..e4d46d4360d7 100644
--- a/sound/soc/intel/boards/cht_bsw_rt5672.c
+++ b/sound/soc/intel/boards/cht_bsw_rt5672.c
@@ -25,12 +25,14 @@
25#include <sound/jack.h> 25#include <sound/jack.h>
26#include "../../codecs/rt5670.h" 26#include "../../codecs/rt5670.h"
27#include "../atom/sst-atom-controls.h" 27#include "../atom/sst-atom-controls.h"
28#include "../common/sst-acpi.h"
28 29
29/* The platform clock #3 outputs 19.2Mhz clock to codec as I2S MCLK */ 30/* The platform clock #3 outputs 19.2Mhz clock to codec as I2S MCLK */
30#define CHT_PLAT_CLK_3_HZ 19200000 31#define CHT_PLAT_CLK_3_HZ 19200000
31#define CHT_CODEC_DAI "rt5670-aif1" 32#define CHT_CODEC_DAI "rt5670-aif1"
32 33
33static struct snd_soc_jack cht_bsw_headset; 34static struct snd_soc_jack cht_bsw_headset;
35static char cht_bsw_codec_name[16];
34 36
35/* Headset jack detection DAPM pins */ 37/* Headset jack detection DAPM pins */
36static struct snd_soc_jack_pin cht_bsw_headset_pins[] = { 38static struct snd_soc_jack_pin cht_bsw_headset_pins[] = {
@@ -225,11 +227,11 @@ static int cht_aif1_startup(struct snd_pcm_substream *substream)
225 SNDRV_PCM_HW_PARAM_RATE, 48000); 227 SNDRV_PCM_HW_PARAM_RATE, 48000);
226} 228}
227 229
228static struct snd_soc_ops cht_aif1_ops = { 230static const struct snd_soc_ops cht_aif1_ops = {
229 .startup = cht_aif1_startup, 231 .startup = cht_aif1_startup,
230}; 232};
231 233
232static struct snd_soc_ops cht_be_ssp2_ops = { 234static const struct snd_soc_ops cht_be_ssp2_ops = {
233 .hw_params = cht_aif1_hw_params, 235 .hw_params = cht_aif1_hw_params,
234}; 236};
235 237
@@ -292,10 +294,12 @@ static struct snd_soc_dai_link cht_dailink[] = {
292 294
293static int cht_suspend_pre(struct snd_soc_card *card) 295static int cht_suspend_pre(struct snd_soc_card *card)
294{ 296{
295 struct snd_soc_codec *codec; 297 struct snd_soc_component *component;
298
299 list_for_each_entry(component, &card->component_dev_list, card_list) {
300 if (!strcmp(component->name, "i2c-10EC5670:00")) {
301 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
296 302
297 list_for_each_entry(codec, &card->codec_dev_list, card_list) {
298 if (!strcmp(codec->component.name, "i2c-10EC5670:00")) {
299 dev_dbg(codec->dev, "disabling jack detect before going to suspend.\n"); 303 dev_dbg(codec->dev, "disabling jack detect before going to suspend.\n");
300 rt5670_jack_suspend(codec); 304 rt5670_jack_suspend(codec);
301 break; 305 break;
@@ -306,10 +310,12 @@ static int cht_suspend_pre(struct snd_soc_card *card)
306 310
307static int cht_resume_post(struct snd_soc_card *card) 311static int cht_resume_post(struct snd_soc_card *card)
308{ 312{
309 struct snd_soc_codec *codec; 313 struct snd_soc_component *component;
314
315 list_for_each_entry(component, &card->component_dev_list, card_list) {
316 if (!strcmp(component->name, "i2c-10EC5670:00")) {
317 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
310 318
311 list_for_each_entry(codec, &card->codec_dev_list, card_list) {
312 if (!strcmp(codec->component.name, "i2c-10EC5670:00")) {
313 dev_dbg(codec->dev, "enabling jack detect for resume.\n"); 319 dev_dbg(codec->dev, "enabling jack detect for resume.\n");
314 rt5670_jack_resume(codec); 320 rt5670_jack_resume(codec);
315 break; 321 break;
@@ -335,9 +341,33 @@ static struct snd_soc_card snd_soc_card_cht = {
335 .resume_post = cht_resume_post, 341 .resume_post = cht_resume_post,
336}; 342};
337 343
344#define RT5672_I2C_DEFAULT "i2c-10EC5670:00"
345
338static int snd_cht_mc_probe(struct platform_device *pdev) 346static int snd_cht_mc_probe(struct platform_device *pdev)
339{ 347{
340 int ret_val = 0; 348 int ret_val = 0;
349 struct sst_acpi_mach *mach = pdev->dev.platform_data;
350 const char *i2c_name;
351 int i;
352
353 strcpy(cht_bsw_codec_name, RT5672_I2C_DEFAULT);
354
355 /* fixup codec name based on HID */
356 if (mach) {
357 i2c_name = sst_acpi_find_name_from_hid(mach->id);
358 if (i2c_name) {
359 snprintf(cht_bsw_codec_name, sizeof(cht_bsw_codec_name),
360 "i2c-%s", i2c_name);
361 for (i = 0; i < ARRAY_SIZE(cht_dailink); i++) {
362 if (!strcmp(cht_dailink[i].codec_name,
363 RT5672_I2C_DEFAULT)) {
364 cht_dailink[i].codec_name =
365 cht_bsw_codec_name;
366 break;
367 }
368 }
369 }
370 }
341 371
342 /* register the soc card */ 372 /* register the soc card */
343 snd_soc_card_cht.dev = &pdev->dev; 373 snd_soc_card_cht.dev = &pdev->dev;
diff --git a/sound/soc/intel/boards/haswell.c b/sound/soc/intel/boards/haswell.c
index 863f1d5e2a2c..5e1ea0371c90 100644
--- a/sound/soc/intel/boards/haswell.c
+++ b/sound/soc/intel/boards/haswell.c
@@ -81,7 +81,7 @@ static int haswell_rt5640_hw_params(struct snd_pcm_substream *substream,
81 return ret; 81 return ret;
82} 82}
83 83
84static struct snd_soc_ops haswell_rt5640_ops = { 84static const struct snd_soc_ops haswell_rt5640_ops = {
85 .hw_params = haswell_rt5640_hw_params, 85 .hw_params = haswell_rt5640_hw_params,
86}; 86};
87 87
diff --git a/sound/soc/intel/boards/mfld_machine.c b/sound/soc/intel/boards/mfld_machine.c
index 34f46c72a0e2..4e08885f37aa 100644
--- a/sound/soc/intel/boards/mfld_machine.c
+++ b/sound/soc/intel/boards/mfld_machine.c
@@ -81,9 +81,9 @@ static struct snd_soc_jack_zone mfld_zones[] = {
81}; 81};
82 82
83/* sound card controls */ 83/* sound card controls */
84static const char *headset_switch_text[] = {"Earpiece", "Headset"}; 84static const char * const headset_switch_text[] = {"Earpiece", "Headset"};
85 85
86static const char *lo_text[] = {"Vibra", "Headset", "IHF", "None"}; 86static const char * const lo_text[] = {"Vibra", "Headset", "IHF", "None"};
87 87
88static const struct soc_enum headset_enum = 88static const struct soc_enum headset_enum =
89 SOC_ENUM_SINGLE_EXT(2, headset_switch_text); 89 SOC_ENUM_SINGLE_EXT(2, headset_switch_text);
diff --git a/sound/soc/intel/boards/skl_nau88l25_max98357a.c b/sound/soc/intel/boards/skl_nau88l25_max98357a.c
index 25db5be7fdfa..fddd1cd12f13 100644
--- a/sound/soc/intel/boards/skl_nau88l25_max98357a.c
+++ b/sound/soc/intel/boards/skl_nau88l25_max98357a.c
@@ -332,7 +332,7 @@ static int skylake_nau8825_hw_params(struct snd_pcm_substream *substream,
332 return ret; 332 return ret;
333} 333}
334 334
335static struct snd_soc_ops skylake_nau8825_ops = { 335static const struct snd_soc_ops skylake_nau8825_ops = {
336 .hw_params = skylake_nau8825_hw_params, 336 .hw_params = skylake_nau8825_hw_params,
337}; 337};
338 338
@@ -382,7 +382,7 @@ static int skylake_dmic_startup(struct snd_pcm_substream *substream)
382 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); 382 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
383} 383}
384 384
385static struct snd_soc_ops skylake_dmic_ops = { 385static const struct snd_soc_ops skylake_dmic_ops = {
386 .startup = skylake_dmic_startup, 386 .startup = skylake_dmic_startup,
387}; 387};
388 388
@@ -416,7 +416,7 @@ static int skylake_refcap_startup(struct snd_pcm_substream *substream)
416 &constraints_16000); 416 &constraints_16000);
417} 417}
418 418
419static struct snd_soc_ops skylaye_refcap_ops = { 419static const struct snd_soc_ops skylaye_refcap_ops = {
420 .startup = skylake_refcap_startup, 420 .startup = skylake_refcap_startup,
421}; 421};
422 422
diff --git a/sound/soc/intel/boards/skl_nau88l25_ssm4567.c b/sound/soc/intel/boards/skl_nau88l25_ssm4567.c
index 69c5d5da4e86..8ab865ee0cad 100644
--- a/sound/soc/intel/boards/skl_nau88l25_ssm4567.c
+++ b/sound/soc/intel/boards/skl_nau88l25_ssm4567.c
@@ -394,7 +394,7 @@ static int skylake_nau8825_hw_params(struct snd_pcm_substream *substream,
394 return ret; 394 return ret;
395} 395}
396 396
397static struct snd_soc_ops skylake_nau8825_ops = { 397static const struct snd_soc_ops skylake_nau8825_ops = {
398 .hw_params = skylake_nau8825_hw_params, 398 .hw_params = skylake_nau8825_hw_params,
399}; 399};
400 400
@@ -430,7 +430,7 @@ static int skylake_dmic_startup(struct snd_pcm_substream *substream)
430 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); 430 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
431} 431}
432 432
433static struct snd_soc_ops skylake_dmic_ops = { 433static const struct snd_soc_ops skylake_dmic_ops = {
434 .startup = skylake_dmic_startup, 434 .startup = skylake_dmic_startup,
435}; 435};
436 436
@@ -464,7 +464,7 @@ static int skylake_refcap_startup(struct snd_pcm_substream *substream)
464 &constraints_16000); 464 &constraints_16000);
465} 465}
466 466
467static struct snd_soc_ops skylaye_refcap_ops = { 467static const struct snd_soc_ops skylaye_refcap_ops = {
468 .startup = skylake_refcap_startup, 468 .startup = skylake_refcap_startup,
469}; 469};
470 470
diff --git a/sound/soc/intel/boards/skl_rt286.c b/sound/soc/intel/boards/skl_rt286.c
index 88c61e8cb87f..dc5c3611a6ff 100644
--- a/sound/soc/intel/boards/skl_rt286.c
+++ b/sound/soc/intel/boards/skl_rt286.c
@@ -250,7 +250,7 @@ static int skylake_rt286_hw_params(struct snd_pcm_substream *substream,
250 return ret; 250 return ret;
251} 251}
252 252
253static struct snd_soc_ops skylake_rt286_ops = { 253static const struct snd_soc_ops skylake_rt286_ops = {
254 .hw_params = skylake_rt286_hw_params, 254 .hw_params = skylake_rt286_hw_params,
255}; 255};
256 256
@@ -289,7 +289,7 @@ static int skylake_dmic_startup(struct snd_pcm_substream *substream)
289 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); 289 SNDRV_PCM_HW_PARAM_RATE, &constraints_rates);
290} 290}
291 291
292static struct snd_soc_ops skylake_dmic_ops = { 292static const struct snd_soc_ops skylake_dmic_ops = {
293 .startup = skylake_dmic_startup, 293 .startup = skylake_dmic_startup,
294}; 294};
295 295
diff --git a/sound/soc/intel/common/sst-acpi.h b/sound/soc/intel/common/sst-acpi.h
index 012742299dd5..214e000667ae 100644
--- a/sound/soc/intel/common/sst-acpi.h
+++ b/sound/soc/intel/common/sst-acpi.h
@@ -15,14 +15,29 @@
15#include <linux/stddef.h> 15#include <linux/stddef.h>
16#include <linux/acpi.h> 16#include <linux/acpi.h>
17 17
18/* translation fron HID to I2C name, needed for DAI codec_name */ 18struct sst_acpi_package_context {
19 char *name; /* package name */
20 int length; /* number of elements */
21 struct acpi_buffer *format;
22 struct acpi_buffer *state;
23 bool data_valid;
24};
25
19#if IS_ENABLED(CONFIG_ACPI) 26#if IS_ENABLED(CONFIG_ACPI)
27/* translation fron HID to I2C name, needed for DAI codec_name */
20const char *sst_acpi_find_name_from_hid(const u8 hid[ACPI_ID_LEN]); 28const char *sst_acpi_find_name_from_hid(const u8 hid[ACPI_ID_LEN]);
29bool sst_acpi_find_package_from_hid(const u8 hid[ACPI_ID_LEN],
30 struct sst_acpi_package_context *ctx);
21#else 31#else
22static inline const char *sst_acpi_find_name_from_hid(const u8 hid[ACPI_ID_LEN]) 32static inline const char *sst_acpi_find_name_from_hid(const u8 hid[ACPI_ID_LEN])
23{ 33{
24 return NULL; 34 return NULL;
25} 35}
36static inline bool sst_acpi_find_package_from_hid(const u8 hid[ACPI_ID_LEN],
37 struct sst_acpi_package_context *ctx)
38{
39 return false;
40}
26#endif 41#endif
27 42
28/* acpi match */ 43/* acpi match */
diff --git a/sound/soc/intel/common/sst-ipc.c b/sound/soc/intel/common/sst-ipc.c
index 6c672ac79cce..62f3a8e0ec87 100644
--- a/sound/soc/intel/common/sst-ipc.c
+++ b/sound/soc/intel/common/sst-ipc.c
@@ -26,7 +26,6 @@
26#include <linux/sched.h> 26#include <linux/sched.h>
27#include <linux/delay.h> 27#include <linux/delay.h>
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/kthread.h>
30#include <sound/asound.h> 29#include <sound/asound.h>
31 30
32#include "sst-dsp.h" 31#include "sst-dsp.h"
@@ -109,10 +108,9 @@ static int ipc_tx_message(struct sst_generic_ipc *ipc, u64 header,
109 ipc->ops.tx_data_copy(msg, tx_data, tx_bytes); 108 ipc->ops.tx_data_copy(msg, tx_data, tx_bytes);
110 109
111 list_add_tail(&msg->list, &ipc->tx_list); 110 list_add_tail(&msg->list, &ipc->tx_list);
111 schedule_work(&ipc->kwork);
112 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags); 112 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags);
113 113
114 kthread_queue_work(&ipc->kworker, &ipc->kwork);
115
116 if (wait) 114 if (wait)
117 return tx_wait_done(ipc, msg, rx_data); 115 return tx_wait_done(ipc, msg, rx_data);
118 else 116 else
@@ -156,42 +154,56 @@ free_mem:
156 return -ENOMEM; 154 return -ENOMEM;
157} 155}
158 156
159static void ipc_tx_msgs(struct kthread_work *work) 157static void ipc_tx_msgs(struct work_struct *work)
160{ 158{
161 struct sst_generic_ipc *ipc = 159 struct sst_generic_ipc *ipc =
162 container_of(work, struct sst_generic_ipc, kwork); 160 container_of(work, struct sst_generic_ipc, kwork);
163 struct ipc_message *msg; 161 struct ipc_message *msg;
164 unsigned long flags;
165 162
166 spin_lock_irqsave(&ipc->dsp->spinlock, flags); 163 spin_lock_irq(&ipc->dsp->spinlock);
167 164
168 if (list_empty(&ipc->tx_list) || ipc->pending) { 165 while (!list_empty(&ipc->tx_list) && !ipc->pending) {
169 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags); 166 /* if the DSP is busy, we will TX messages after IRQ.
170 return; 167 * also postpone if we are in the middle of processing
171 } 168 * completion irq
172 169 */
173 /* if the DSP is busy, we will TX messages after IRQ. 170 if (ipc->ops.is_dsp_busy && ipc->ops.is_dsp_busy(ipc->dsp)) {
174 * also postpone if we are in the middle of procesing completion irq*/ 171 dev_dbg(ipc->dev, "ipc_tx_msgs dsp busy\n");
175 if (ipc->ops.is_dsp_busy && ipc->ops.is_dsp_busy(ipc->dsp)) { 172 break;
176 dev_dbg(ipc->dev, "ipc_tx_msgs dsp busy\n"); 173 }
177 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags);
178 return;
179 }
180 174
181 msg = list_first_entry(&ipc->tx_list, struct ipc_message, list); 175 msg = list_first_entry(&ipc->tx_list, struct ipc_message, list);
182 list_move(&msg->list, &ipc->rx_list); 176 list_move(&msg->list, &ipc->rx_list);
183 177
184 if (ipc->ops.tx_msg != NULL) 178 if (ipc->ops.tx_msg != NULL)
185 ipc->ops.tx_msg(ipc, msg); 179 ipc->ops.tx_msg(ipc, msg);
180 }
186 181
187 spin_unlock_irqrestore(&ipc->dsp->spinlock, flags); 182 spin_unlock_irq(&ipc->dsp->spinlock);
188} 183}
189 184
190int sst_ipc_tx_message_wait(struct sst_generic_ipc *ipc, u64 header, 185int sst_ipc_tx_message_wait(struct sst_generic_ipc *ipc, u64 header,
191 void *tx_data, size_t tx_bytes, void *rx_data, size_t rx_bytes) 186 void *tx_data, size_t tx_bytes, void *rx_data, size_t rx_bytes)
192{ 187{
193 return ipc_tx_message(ipc, header, tx_data, tx_bytes, 188 int ret;
189
190 /*
191 * DSP maybe in lower power active state, so
192 * check if the DSP supports DSP lp On method
193 * if so invoke that before sending IPC
194 */
195 if (ipc->ops.check_dsp_lp_on)
196 if (ipc->ops.check_dsp_lp_on(ipc->dsp, true))
197 return -EIO;
198
199 ret = ipc_tx_message(ipc, header, tx_data, tx_bytes,
194 rx_data, rx_bytes, 1); 200 rx_data, rx_bytes, 1);
201
202 if (ipc->ops.check_dsp_lp_on)
203 if (ipc->ops.check_dsp_lp_on(ipc->dsp, false))
204 return -EIO;
205
206 return ret;
195} 207}
196EXPORT_SYMBOL_GPL(sst_ipc_tx_message_wait); 208EXPORT_SYMBOL_GPL(sst_ipc_tx_message_wait);
197 209
@@ -203,6 +215,14 @@ int sst_ipc_tx_message_nowait(struct sst_generic_ipc *ipc, u64 header,
203} 215}
204EXPORT_SYMBOL_GPL(sst_ipc_tx_message_nowait); 216EXPORT_SYMBOL_GPL(sst_ipc_tx_message_nowait);
205 217
218int sst_ipc_tx_message_nopm(struct sst_generic_ipc *ipc, u64 header,
219 void *tx_data, size_t tx_bytes, void *rx_data, size_t rx_bytes)
220{
221 return ipc_tx_message(ipc, header, tx_data, tx_bytes,
222 rx_data, rx_bytes, 1);
223}
224EXPORT_SYMBOL_GPL(sst_ipc_tx_message_nopm);
225
206struct ipc_message *sst_ipc_reply_find_msg(struct sst_generic_ipc *ipc, 226struct ipc_message *sst_ipc_reply_find_msg(struct sst_generic_ipc *ipc,
207 u64 header) 227 u64 header)
208{ 228{
@@ -280,19 +300,7 @@ int sst_ipc_init(struct sst_generic_ipc *ipc)
280 if (ret < 0) 300 if (ret < 0)
281 return -ENOMEM; 301 return -ENOMEM;
282 302
283 /* start the IPC message thread */ 303 INIT_WORK(&ipc->kwork, ipc_tx_msgs);
284 kthread_init_worker(&ipc->kworker);
285 ipc->tx_thread = kthread_run(kthread_worker_fn,
286 &ipc->kworker, "%s",
287 dev_name(ipc->dev));
288 if (IS_ERR(ipc->tx_thread)) {
289 dev_err(ipc->dev, "error: failed to create message TX task\n");
290 ret = PTR_ERR(ipc->tx_thread);
291 kfree(ipc->msg);
292 return ret;
293 }
294
295 kthread_init_work(&ipc->kwork, ipc_tx_msgs);
296 return 0; 304 return 0;
297} 305}
298EXPORT_SYMBOL_GPL(sst_ipc_init); 306EXPORT_SYMBOL_GPL(sst_ipc_init);
@@ -301,8 +309,7 @@ void sst_ipc_fini(struct sst_generic_ipc *ipc)
301{ 309{
302 int i; 310 int i;
303 311
304 if (ipc->tx_thread) 312 cancel_work_sync(&ipc->kwork);
305 kthread_stop(ipc->tx_thread);
306 313
307 if (ipc->msg) { 314 if (ipc->msg) {
308 for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) { 315 for (i = 0; i < IPC_EMPTY_LIST_SIZE; i++) {
diff --git a/sound/soc/intel/common/sst-ipc.h b/sound/soc/intel/common/sst-ipc.h
index ceb7e468a3fa..7ed42a640ad6 100644
--- a/sound/soc/intel/common/sst-ipc.h
+++ b/sound/soc/intel/common/sst-ipc.h
@@ -23,7 +23,6 @@
23#include <linux/list.h> 23#include <linux/list.h>
24#include <linux/workqueue.h> 24#include <linux/workqueue.h>
25#include <linux/sched.h> 25#include <linux/sched.h>
26#include <linux/kthread.h>
27 26
28#define IPC_MAX_MAILBOX_BYTES 256 27#define IPC_MAX_MAILBOX_BYTES 256
29 28
@@ -52,6 +51,7 @@ struct sst_plat_ipc_ops {
52 void (*tx_data_copy)(struct ipc_message *, char *, size_t); 51 void (*tx_data_copy)(struct ipc_message *, char *, size_t);
53 u64 (*reply_msg_match)(u64 header, u64 *mask); 52 u64 (*reply_msg_match)(u64 header, u64 *mask);
54 bool (*is_dsp_busy)(struct sst_dsp *dsp); 53 bool (*is_dsp_busy)(struct sst_dsp *dsp);
54 int (*check_dsp_lp_on)(struct sst_dsp *dsp, bool state);
55}; 55};
56 56
57/* SST generic IPC data */ 57/* SST generic IPC data */
@@ -65,8 +65,7 @@ struct sst_generic_ipc {
65 struct list_head empty_list; 65 struct list_head empty_list;
66 wait_queue_head_t wait_txq; 66 wait_queue_head_t wait_txq;
67 struct task_struct *tx_thread; 67 struct task_struct *tx_thread;
68 struct kthread_worker kworker; 68 struct work_struct kwork;
69 struct kthread_work kwork;
70 bool pending; 69 bool pending;
71 struct ipc_message *msg; 70 struct ipc_message *msg;
72 int tx_data_max_size; 71 int tx_data_max_size;
@@ -81,6 +80,9 @@ int sst_ipc_tx_message_wait(struct sst_generic_ipc *ipc, u64 header,
81int sst_ipc_tx_message_nowait(struct sst_generic_ipc *ipc, u64 header, 80int sst_ipc_tx_message_nowait(struct sst_generic_ipc *ipc, u64 header,
82 void *tx_data, size_t tx_bytes); 81 void *tx_data, size_t tx_bytes);
83 82
83int sst_ipc_tx_message_nopm(struct sst_generic_ipc *ipc, u64 header,
84 void *tx_data, size_t tx_bytes, void *rx_data, size_t rx_bytes);
85
84struct ipc_message *sst_ipc_reply_find_msg(struct sst_generic_ipc *ipc, 86struct ipc_message *sst_ipc_reply_find_msg(struct sst_generic_ipc *ipc,
85 u64 header); 87 u64 header);
86 88
diff --git a/sound/soc/intel/common/sst-match-acpi.c b/sound/soc/intel/common/sst-match-acpi.c
index 789843307a49..1070f3ad23e5 100644
--- a/sound/soc/intel/common/sst-match-acpi.c
+++ b/sound/soc/intel/common/sst-match-acpi.c
@@ -77,5 +77,62 @@ struct sst_acpi_mach *sst_acpi_find_machine(struct sst_acpi_mach *machines)
77} 77}
78EXPORT_SYMBOL_GPL(sst_acpi_find_machine); 78EXPORT_SYMBOL_GPL(sst_acpi_find_machine);
79 79
80static acpi_status sst_acpi_find_package(acpi_handle handle, u32 level,
81 void *context, void **ret)
82{
83 struct acpi_device *adev;
84 acpi_status status = AE_OK;
85 struct sst_acpi_package_context *pkg_ctx = context;
86
87 pkg_ctx->data_valid = false;
88
89 if (acpi_bus_get_device(handle, &adev))
90 return AE_OK;
91
92 if (adev->status.present && adev->status.functional) {
93 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
94 union acpi_object *myobj = NULL;
95
96 status = acpi_evaluate_object_typed(handle, pkg_ctx->name,
97 NULL, &buffer,
98 ACPI_TYPE_PACKAGE);
99 if (ACPI_FAILURE(status))
100 return AE_OK;
101
102 myobj = buffer.pointer;
103 if (!myobj || myobj->package.count != pkg_ctx->length) {
104 kfree(buffer.pointer);
105 return AE_OK;
106 }
107
108 status = acpi_extract_package(myobj,
109 pkg_ctx->format, pkg_ctx->state);
110 if (ACPI_FAILURE(status)) {
111 kfree(buffer.pointer);
112 return AE_OK;
113 }
114
115 kfree(buffer.pointer);
116 pkg_ctx->data_valid = true;
117 return AE_CTRL_TERMINATE;
118 }
119
120 return AE_OK;
121}
122
123bool sst_acpi_find_package_from_hid(const u8 hid[ACPI_ID_LEN],
124 struct sst_acpi_package_context *ctx)
125{
126 acpi_status status;
127
128 status = acpi_get_devices(hid, sst_acpi_find_package, ctx, NULL);
129
130 if (ACPI_FAILURE(status) || !ctx->data_valid)
131 return false;
132
133 return true;
134}
135EXPORT_SYMBOL_GPL(sst_acpi_find_package_from_hid);
136
80MODULE_LICENSE("GPL v2"); 137MODULE_LICENSE("GPL v2");
81MODULE_DESCRIPTION("Intel Common ACPI Match module"); 138MODULE_DESCRIPTION("Intel Common ACPI Match module");
diff --git a/sound/soc/intel/haswell/sst-haswell-ipc.c b/sound/soc/intel/haswell/sst-haswell-ipc.c
index e432a31fd9f2..a3459d1682a6 100644
--- a/sound/soc/intel/haswell/sst-haswell-ipc.c
+++ b/sound/soc/intel/haswell/sst-haswell-ipc.c
@@ -26,7 +26,6 @@
26#include <linux/delay.h> 26#include <linux/delay.h>
27#include <linux/sched.h> 27#include <linux/sched.h>
28#include <linux/platform_device.h> 28#include <linux/platform_device.h>
29#include <linux/kthread.h>
30#include <linux/firmware.h> 29#include <linux/firmware.h>
31#include <linux/dma-mapping.h> 30#include <linux/dma-mapping.h>
32#include <linux/debugfs.h> 31#include <linux/debugfs.h>
@@ -818,7 +817,7 @@ static irqreturn_t hsw_irq_thread(int irq, void *context)
818 spin_unlock_irqrestore(&sst->spinlock, flags); 817 spin_unlock_irqrestore(&sst->spinlock, flags);
819 818
820 /* continue to send any remaining messages... */ 819 /* continue to send any remaining messages... */
821 kthread_queue_work(&ipc->kworker, &ipc->kwork); 820 schedule_work(&ipc->kwork);
822 821
823 return IRQ_HANDLED; 822 return IRQ_HANDLED;
824} 823}
diff --git a/sound/soc/intel/skylake/bxt-sst.c b/sound/soc/intel/skylake/bxt-sst.c
index 1d251d59bcb9..1f9f33d34000 100644
--- a/sound/soc/intel/skylake/bxt-sst.c
+++ b/sound/soc/intel/skylake/bxt-sst.c
@@ -43,6 +43,9 @@
43 43
44#define BXT_ADSP_FW_BIN_HDR_OFFSET 0x2000 44#define BXT_ADSP_FW_BIN_HDR_OFFSET 0x2000
45 45
46/* Delay before scheduling D0i3 entry */
47#define BXT_D0I3_DELAY 5000
48
46static unsigned int bxt_get_errorcode(struct sst_dsp *ctx) 49static unsigned int bxt_get_errorcode(struct sst_dsp *ctx)
47{ 50{
48 return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE); 51 return sst_dsp_shim_read(ctx, BXT_ADSP_ERROR_CODE);
@@ -288,6 +291,141 @@ sst_load_base_firmware_failed:
288 return ret; 291 return ret;
289} 292}
290 293
294/*
295 * Decide the D0i3 state that can be targeted based on the usecase
296 * ref counts and DSP state
297 *
298 * Decision Matrix: (X= dont care; state = target state)
299 *
300 * DSP state != SKL_DSP_RUNNING ; state = no d0i3
301 *
302 * DSP state == SKL_DSP_RUNNING , the following matrix applies
303 * non_d0i3 >0; streaming =X; non_streaming =X; state = no d0i3
304 * non_d0i3 =X; streaming =0; non_streaming =0; state = no d0i3
305 * non_d0i3 =0; streaming >0; non_streaming =X; state = streaming d0i3
306 * non_d0i3 =0; streaming =0; non_streaming =X; state = non-streaming d0i3
307 */
308static int bxt_d0i3_target_state(struct sst_dsp *ctx)
309{
310 struct skl_sst *skl = ctx->thread_context;
311 struct skl_d0i3_data *d0i3 = &skl->d0i3;
312
313 if (skl->cores.state[SKL_DSP_CORE0_ID] != SKL_DSP_RUNNING)
314 return SKL_DSP_D0I3_NONE;
315
316 if (d0i3->non_d0i3)
317 return SKL_DSP_D0I3_NONE;
318 else if (d0i3->streaming)
319 return SKL_DSP_D0I3_STREAMING;
320 else if (d0i3->non_streaming)
321 return SKL_DSP_D0I3_NON_STREAMING;
322 else
323 return SKL_DSP_D0I3_NONE;
324}
325
326static void bxt_set_dsp_D0i3(struct work_struct *work)
327{
328 int ret;
329 struct skl_ipc_d0ix_msg msg;
330 struct skl_sst *skl = container_of(work,
331 struct skl_sst, d0i3.work.work);
332 struct sst_dsp *ctx = skl->dsp;
333 struct skl_d0i3_data *d0i3 = &skl->d0i3;
334 int target_state;
335
336 dev_dbg(ctx->dev, "In %s:\n", __func__);
337
338 /* D0i3 entry allowed only if core 0 alone is running */
339 if (skl_dsp_get_enabled_cores(ctx) != SKL_DSP_CORE0_MASK) {
340 dev_warn(ctx->dev,
341 "D0i3 allowed when only core0 running:Exit\n");
342 return;
343 }
344
345 target_state = bxt_d0i3_target_state(ctx);
346 if (target_state == SKL_DSP_D0I3_NONE)
347 return;
348
349 msg.instance_id = 0;
350 msg.module_id = 0;
351 msg.wake = 1;
352 msg.streaming = 0;
353 if (target_state == SKL_DSP_D0I3_STREAMING)
354 msg.streaming = 1;
355
356 ret = skl_ipc_set_d0ix(&skl->ipc, &msg);
357
358 if (ret < 0) {
359 dev_err(ctx->dev, "Failed to set DSP to D0i3 state\n");
360 return;
361 }
362
363 /* Set Vendor specific register D0I3C.I3 to enable D0i3*/
364 if (skl->update_d0i3c)
365 skl->update_d0i3c(skl->dev, true);
366
367 d0i3->state = target_state;
368 skl->cores.state[SKL_DSP_CORE0_ID] = SKL_DSP_RUNNING_D0I3;
369}
370
371static int bxt_schedule_dsp_D0i3(struct sst_dsp *ctx)
372{
373 struct skl_sst *skl = ctx->thread_context;
374 struct skl_d0i3_data *d0i3 = &skl->d0i3;
375
376 /* Schedule D0i3 only if the usecase ref counts are appropriate */
377 if (bxt_d0i3_target_state(ctx) != SKL_DSP_D0I3_NONE) {
378
379 dev_dbg(ctx->dev, "%s: Schedule D0i3\n", __func__);
380
381 schedule_delayed_work(&d0i3->work,
382 msecs_to_jiffies(BXT_D0I3_DELAY));
383 }
384
385 return 0;
386}
387
388static int bxt_set_dsp_D0i0(struct sst_dsp *ctx)
389{
390 int ret;
391 struct skl_ipc_d0ix_msg msg;
392 struct skl_sst *skl = ctx->thread_context;
393
394 dev_dbg(ctx->dev, "In %s:\n", __func__);
395
396 /* First Cancel any pending attempt to put DSP to D0i3 */
397 cancel_delayed_work_sync(&skl->d0i3.work);
398
399 /* If DSP is currently in D0i3, bring it to D0i0 */
400 if (skl->cores.state[SKL_DSP_CORE0_ID] != SKL_DSP_RUNNING_D0I3)
401 return 0;
402
403 dev_dbg(ctx->dev, "Set DSP to D0i0\n");
404
405 msg.instance_id = 0;
406 msg.module_id = 0;
407 msg.streaming = 0;
408 msg.wake = 0;
409
410 if (skl->d0i3.state == SKL_DSP_D0I3_STREAMING)
411 msg.streaming = 1;
412
413 /* Clear Vendor specific register D0I3C.I3 to disable D0i3*/
414 if (skl->update_d0i3c)
415 skl->update_d0i3c(skl->dev, false);
416
417 ret = skl_ipc_set_d0ix(&skl->ipc, &msg);
418 if (ret < 0) {
419 dev_err(ctx->dev, "Failed to set DSP to D0i0\n");
420 return ret;
421 }
422
423 skl->cores.state[SKL_DSP_CORE0_ID] = SKL_DSP_RUNNING;
424 skl->d0i3.state = SKL_DSP_D0I3_NONE;
425
426 return 0;
427}
428
291static int bxt_set_dsp_D0(struct sst_dsp *ctx, unsigned int core_id) 429static int bxt_set_dsp_D0(struct sst_dsp *ctx, unsigned int core_id)
292{ 430{
293 struct skl_sst *skl = ctx->thread_context; 431 struct skl_sst *skl = ctx->thread_context;
@@ -414,6 +552,8 @@ static int bxt_set_dsp_D3(struct sst_dsp *ctx, unsigned int core_id)
414static struct skl_dsp_fw_ops bxt_fw_ops = { 552static struct skl_dsp_fw_ops bxt_fw_ops = {
415 .set_state_D0 = bxt_set_dsp_D0, 553 .set_state_D0 = bxt_set_dsp_D0,
416 .set_state_D3 = bxt_set_dsp_D3, 554 .set_state_D3 = bxt_set_dsp_D3,
555 .set_state_D0i3 = bxt_schedule_dsp_D0i3,
556 .set_state_D0i0 = bxt_set_dsp_D0i0,
417 .load_fw = bxt_load_base_firmware, 557 .load_fw = bxt_load_base_firmware,
418 .get_fw_errcode = bxt_get_errorcode, 558 .get_fw_errcode = bxt_get_errorcode,
419 .load_library = bxt_load_library, 559 .load_library = bxt_load_library,
@@ -470,10 +610,15 @@ int bxt_sst_dsp_init(struct device *dev, void __iomem *mmio_base, int irq,
470 if (ret) 610 if (ret)
471 return ret; 611 return ret;
472 612
613 /* set the D0i3 check */
614 skl->ipc.ops.check_dsp_lp_on = skl_ipc_check_D0i0;
615
473 skl->cores.count = 2; 616 skl->cores.count = 2;
474 skl->boot_complete = false; 617 skl->boot_complete = false;
475 init_waitqueue_head(&skl->boot_wait); 618 init_waitqueue_head(&skl->boot_wait);
476 skl->is_first_boot = true; 619 skl->is_first_boot = true;
620 INIT_DELAYED_WORK(&skl->d0i3.work, bxt_set_dsp_D0i3);
621 skl->d0i3.state = SKL_DSP_D0I3_NONE;
477 622
478 if (dsp) 623 if (dsp)
479 *dsp = skl; 624 *dsp = skl;
diff --git a/sound/soc/intel/skylake/skl-messages.c b/sound/soc/intel/skylake/skl-messages.c
index 805b7f2173f3..e79cbcf6e462 100644
--- a/sound/soc/intel/skylake/skl-messages.c
+++ b/sound/soc/intel/skylake/skl-messages.c
@@ -294,6 +294,33 @@ int skl_free_dsp(struct skl *skl)
294 return 0; 294 return 0;
295} 295}
296 296
297/*
298 * In the case of "suspend_active" i.e, the Audio IP being active
299 * during system suspend, immediately excecute any pending D0i3 work
300 * before suspending. This is needed for the IP to work in low power
301 * mode during system suspend. In the case of normal suspend, cancel
302 * any pending D0i3 work.
303 */
304int skl_suspend_late_dsp(struct skl *skl)
305{
306 struct skl_sst *ctx = skl->skl_sst;
307 struct delayed_work *dwork;
308
309 if (!ctx)
310 return 0;
311
312 dwork = &ctx->d0i3.work;
313
314 if (dwork->work.func) {
315 if (skl->supend_active)
316 flush_delayed_work(dwork);
317 else
318 cancel_delayed_work_sync(dwork);
319 }
320
321 return 0;
322}
323
297int skl_suspend_dsp(struct skl *skl) 324int skl_suspend_dsp(struct skl *skl)
298{ 325{
299 struct skl_sst *ctx = skl->skl_sst; 326 struct skl_sst *ctx = skl->skl_sst;
@@ -500,16 +527,14 @@ static void skl_setup_cpr_gateway_cfg(struct skl_sst *ctx,
500int skl_dsp_set_dma_control(struct skl_sst *ctx, struct skl_module_cfg *mconfig) 527int skl_dsp_set_dma_control(struct skl_sst *ctx, struct skl_module_cfg *mconfig)
501{ 528{
502 struct skl_dma_control *dma_ctrl; 529 struct skl_dma_control *dma_ctrl;
503 struct skl_i2s_config_blob config_blob;
504 struct skl_ipc_large_config_msg msg = {0}; 530 struct skl_ipc_large_config_msg msg = {0};
505 int err = 0; 531 int err = 0;
506 532
507 533
508 /* 534 /*
509 * if blob size is same as capablity size, then no dma control 535 * if blob size zero, then return
510 * present so return
511 */ 536 */
512 if (mconfig->formats_config.caps_size == sizeof(config_blob)) 537 if (mconfig->formats_config.caps_size == 0)
513 return 0; 538 return 0;
514 539
515 msg.large_param_id = DMA_CONTROL_ID; 540 msg.large_param_id = DMA_CONTROL_ID;
@@ -523,7 +548,7 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, struct skl_module_cfg *mconfig)
523 dma_ctrl->node_id = skl_get_node_id(ctx, mconfig); 548 dma_ctrl->node_id = skl_get_node_id(ctx, mconfig);
524 549
525 /* size in dwords */ 550 /* size in dwords */
526 dma_ctrl->config_length = sizeof(config_blob) / 4; 551 dma_ctrl->config_length = mconfig->formats_config.caps_size / 4;
527 552
528 memcpy(dma_ctrl->config_data, mconfig->formats_config.caps, 553 memcpy(dma_ctrl->config_data, mconfig->formats_config.caps,
529 mconfig->formats_config.caps_size); 554 mconfig->formats_config.caps_size);
@@ -531,7 +556,6 @@ int skl_dsp_set_dma_control(struct skl_sst *ctx, struct skl_module_cfg *mconfig)
531 err = skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)dma_ctrl); 556 err = skl_ipc_set_large_config(&ctx->ipc, &msg, (u32 *)dma_ctrl);
532 557
533 kfree(dma_ctrl); 558 kfree(dma_ctrl);
534
535 return err; 559 return err;
536} 560}
537 561
@@ -1042,7 +1066,8 @@ int skl_create_pipeline(struct skl_sst *ctx, struct skl_pipe *pipe)
1042 dev_dbg(ctx->dev, "%s: pipe_id = %d\n", __func__, pipe->ppl_id); 1066 dev_dbg(ctx->dev, "%s: pipe_id = %d\n", __func__, pipe->ppl_id);
1043 1067
1044 ret = skl_ipc_create_pipeline(&ctx->ipc, pipe->memory_pages, 1068 ret = skl_ipc_create_pipeline(&ctx->ipc, pipe->memory_pages,
1045 pipe->pipe_priority, pipe->ppl_id); 1069 pipe->pipe_priority, pipe->ppl_id,
1070 pipe->lp_mode);
1046 if (ret < 0) { 1071 if (ret < 0) {
1047 dev_err(ctx->dev, "Failed to create pipeline\n"); 1072 dev_err(ctx->dev, "Failed to create pipeline\n");
1048 return ret; 1073 return ret;
diff --git a/sound/soc/intel/skylake/skl-pcm.c b/sound/soc/intel/skylake/skl-pcm.c
index 58c728662600..84b5101e6ca6 100644
--- a/sound/soc/intel/skylake/skl-pcm.c
+++ b/sound/soc/intel/skylake/skl-pcm.c
@@ -144,6 +144,8 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
144 struct hdac_ext_stream *stream; 144 struct hdac_ext_stream *stream;
145 struct snd_pcm_runtime *runtime = substream->runtime; 145 struct snd_pcm_runtime *runtime = substream->runtime;
146 struct skl_dma_params *dma_params; 146 struct skl_dma_params *dma_params;
147 struct skl *skl = get_skl_ctx(dai->dev);
148 struct skl_module_cfg *mconfig;
147 149
148 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); 150 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
149 151
@@ -177,6 +179,9 @@ static int skl_pcm_open(struct snd_pcm_substream *substream,
177 skl_set_suspend_active(substream, dai, true); 179 skl_set_suspend_active(substream, dai, true);
178 snd_pcm_set_sync(substream); 180 snd_pcm_set_sync(substream);
179 181
182 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream);
183 skl_tplg_d0i3_get(skl, mconfig->d0i3_caps);
184
180 return 0; 185 return 0;
181} 186}
182 187
@@ -302,6 +307,7 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
302 struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev); 307 struct hdac_ext_bus *ebus = dev_get_drvdata(dai->dev);
303 struct skl_dma_params *dma_params = NULL; 308 struct skl_dma_params *dma_params = NULL;
304 struct skl *skl = ebus_to_skl(ebus); 309 struct skl *skl = ebus_to_skl(ebus);
310 struct skl_module_cfg *mconfig;
305 311
306 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name); 312 dev_dbg(dai->dev, "%s: %s\n", __func__, dai->name);
307 313
@@ -325,6 +331,9 @@ static void skl_pcm_close(struct snd_pcm_substream *substream,
325 skl->skl_sst->miscbdcg_disabled = false; 331 skl->skl_sst->miscbdcg_disabled = false;
326 } 332 }
327 333
334 mconfig = skl_tplg_fe_get_cpr_module(dai, substream->stream);
335 skl_tplg_d0i3_put(skl, mconfig->d0i3_caps);
336
328 kfree(dma_params); 337 kfree(dma_params);
329} 338}
330 339
@@ -1031,10 +1040,24 @@ static snd_pcm_uframes_t skl_platform_pcm_pointer
1031 (struct snd_pcm_substream *substream) 1040 (struct snd_pcm_substream *substream)
1032{ 1041{
1033 struct hdac_ext_stream *hstream = get_hdac_ext_stream(substream); 1042 struct hdac_ext_stream *hstream = get_hdac_ext_stream(substream);
1043 struct hdac_ext_bus *ebus = get_bus_ctx(substream);
1034 unsigned int pos; 1044 unsigned int pos;
1035 1045
1036 /* use the position buffer as default */ 1046 /*
1037 pos = snd_hdac_stream_get_pos_posbuf(hdac_stream(hstream)); 1047 * Use DPIB for Playback stream as the periodic DMA Position-in-
1048 * Buffer Writes may be scheduled at the same time or later than
1049 * the MSI and does not guarantee to reflect the Position of the
1050 * last buffer that was transferred. Whereas DPIB register in
1051 * HAD space reflects the actual data that is transferred.
1052 * Use the position buffer for capture, as DPIB write gets
1053 * completed earlier than the actual data written to the DDR.
1054 */
1055 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
1056 pos = readl(ebus->bus.remap_addr + AZX_REG_VS_SDXDPIB_XBASE +
1057 (AZX_REG_VS_SDXDPIB_XINTERVAL *
1058 hdac_stream(hstream)->index));
1059 else
1060 pos = snd_hdac_stream_get_pos_posbuf(hdac_stream(hstream));
1038 1061
1039 if (pos >= hdac_stream(hstream)->bufsize) 1062 if (pos >= hdac_stream(hstream)->bufsize)
1040 pos = 0; 1063 pos = 0;
@@ -1197,6 +1220,7 @@ static int skl_platform_soc_probe(struct snd_soc_platform *platform)
1197 return ret; 1220 return ret;
1198 } 1221 }
1199 skl_populate_modules(skl); 1222 skl_populate_modules(skl);
1223 skl->skl_sst->update_d0i3c = skl_update_d0i3c;
1200 } 1224 }
1201 pm_runtime_mark_last_busy(platform->dev); 1225 pm_runtime_mark_last_busy(platform->dev);
1202 pm_runtime_put_autosuspend(platform->dev); 1226 pm_runtime_put_autosuspend(platform->dev);
diff --git a/sound/soc/intel/skylake/skl-sst-cldma.c b/sound/soc/intel/skylake/skl-sst-cldma.c
index efa2532114ba..c9f6d87381db 100644
--- a/sound/soc/intel/skylake/skl-sst-cldma.c
+++ b/sound/soc/intel/skylake/skl-sst-cldma.c
@@ -17,7 +17,6 @@
17 17
18#include <linux/device.h> 18#include <linux/device.h>
19#include <linux/mm.h> 19#include <linux/mm.h>
20#include <linux/kthread.h>
21#include <linux/delay.h> 20#include <linux/delay.h>
22#include "../common/sst-dsp.h" 21#include "../common/sst-dsp.h"
23#include "../common/sst-dsp-priv.h" 22#include "../common/sst-dsp-priv.h"
diff --git a/sound/soc/intel/skylake/skl-sst-dsp.h b/sound/soc/intel/skylake/skl-sst-dsp.h
index b9e71d051fb1..7c272ba0f4b5 100644
--- a/sound/soc/intel/skylake/skl-sst-dsp.h
+++ b/sound/soc/intel/skylake/skl-sst-dsp.h
@@ -126,11 +126,21 @@ struct sst_dsp_device;
126#define SKL_ADSPCS_CPA_SHIFT 24 126#define SKL_ADSPCS_CPA_SHIFT 24
127#define SKL_ADSPCS_CPA_MASK(cm) ((cm) << SKL_ADSPCS_CPA_SHIFT) 127#define SKL_ADSPCS_CPA_MASK(cm) ((cm) << SKL_ADSPCS_CPA_SHIFT)
128 128
129/* DSP Core state */
129enum skl_dsp_states { 130enum skl_dsp_states {
130 SKL_DSP_RUNNING = 1, 131 SKL_DSP_RUNNING = 1,
132 /* Running in D0i3 state; can be in streaming or non-streaming D0i3 */
133 SKL_DSP_RUNNING_D0I3, /* Running in D0i3 state*/
131 SKL_DSP_RESET, 134 SKL_DSP_RESET,
132}; 135};
133 136
137/* D0i3 substates */
138enum skl_dsp_d0i3_states {
139 SKL_DSP_D0I3_NONE = -1, /* No D0i3 */
140 SKL_DSP_D0I3_NON_STREAMING = 0,
141 SKL_DSP_D0I3_STREAMING = 1,
142};
143
134struct skl_dsp_fw_ops { 144struct skl_dsp_fw_ops {
135 int (*load_fw)(struct sst_dsp *ctx); 145 int (*load_fw)(struct sst_dsp *ctx);
136 /* FW module parser/loader */ 146 /* FW module parser/loader */
@@ -139,6 +149,8 @@ struct skl_dsp_fw_ops {
139 int (*parse_fw)(struct sst_dsp *ctx); 149 int (*parse_fw)(struct sst_dsp *ctx);
140 int (*set_state_D0)(struct sst_dsp *ctx, unsigned int core_id); 150 int (*set_state_D0)(struct sst_dsp *ctx, unsigned int core_id);
141 int (*set_state_D3)(struct sst_dsp *ctx, unsigned int core_id); 151 int (*set_state_D3)(struct sst_dsp *ctx, unsigned int core_id);
152 int (*set_state_D0i3)(struct sst_dsp *ctx);
153 int (*set_state_D0i0)(struct sst_dsp *ctx);
142 unsigned int (*get_fw_errcode)(struct sst_dsp *ctx); 154 unsigned int (*get_fw_errcode)(struct sst_dsp *ctx);
143 int (*load_mod)(struct sst_dsp *ctx, u16 mod_id, u8 *mod_name); 155 int (*load_mod)(struct sst_dsp *ctx, u16 mod_id, u8 *mod_name);
144 int (*unload_mod)(struct sst_dsp *ctx, u16 mod_id); 156 int (*unload_mod)(struct sst_dsp *ctx, u16 mod_id);
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.c b/sound/soc/intel/skylake/skl-sst-ipc.c
index 797cf4053235..e1391dfbc9e9 100644
--- a/sound/soc/intel/skylake/skl-sst-ipc.c
+++ b/sound/soc/intel/skylake/skl-sst-ipc.c
@@ -81,6 +81,11 @@
81#define IPC_INSTANCE_ID(x) (((x) & IPC_INSTANCE_ID_MASK) \ 81#define IPC_INSTANCE_ID(x) (((x) & IPC_INSTANCE_ID_MASK) \
82 << IPC_INSTANCE_ID_SHIFT) 82 << IPC_INSTANCE_ID_SHIFT)
83 83
84#define IPC_PPL_LP_MODE_SHIFT 0
85#define IPC_PPL_LP_MODE_MASK 0x1
86#define IPC_PPL_LP_MODE(x) (((x) & IPC_PPL_LP_MODE_MASK) \
87 << IPC_PPL_LP_MODE_SHIFT)
88
84/* Set pipeline state message */ 89/* Set pipeline state message */
85#define IPC_PPL_STATE_SHIFT 0 90#define IPC_PPL_STATE_SHIFT 0
86#define IPC_PPL_STATE_MASK 0x1F 91#define IPC_PPL_STATE_MASK 0x1F
@@ -172,6 +177,17 @@
172 << IPC_INITIAL_BLOCK_SHIFT) 177 << IPC_INITIAL_BLOCK_SHIFT)
173#define IPC_INITIAL_BLOCK_CLEAR ~(IPC_INITIAL_BLOCK_MASK \ 178#define IPC_INITIAL_BLOCK_CLEAR ~(IPC_INITIAL_BLOCK_MASK \
174 << IPC_INITIAL_BLOCK_SHIFT) 179 << IPC_INITIAL_BLOCK_SHIFT)
180/* Set D0ix IPC extension register */
181#define IPC_D0IX_WAKE_SHIFT 0
182#define IPC_D0IX_WAKE_MASK 0x1
183#define IPC_D0IX_WAKE(x) (((x) & IPC_D0IX_WAKE_MASK) \
184 << IPC_D0IX_WAKE_SHIFT)
185
186#define IPC_D0IX_STREAMING_SHIFT 1
187#define IPC_D0IX_STREAMING_MASK 0x1
188#define IPC_D0IX_STREAMING(x) (((x) & IPC_D0IX_STREAMING_MASK) \
189 << IPC_D0IX_STREAMING_SHIFT)
190
175 191
176enum skl_ipc_msg_target { 192enum skl_ipc_msg_target {
177 IPC_FW_GEN_MSG = 0, 193 IPC_FW_GEN_MSG = 0,
@@ -258,7 +274,8 @@ enum skl_ipc_module_msg {
258 IPC_MOD_LARGE_CONFIG_SET = 4, 274 IPC_MOD_LARGE_CONFIG_SET = 4,
259 IPC_MOD_BIND = 5, 275 IPC_MOD_BIND = 5,
260 IPC_MOD_UNBIND = 6, 276 IPC_MOD_UNBIND = 6,
261 IPC_MOD_SET_DX = 7 277 IPC_MOD_SET_DX = 7,
278 IPC_MOD_SET_D0IX = 8
262}; 279};
263 280
264static void skl_ipc_tx_data_copy(struct ipc_message *msg, char *tx_data, 281static void skl_ipc_tx_data_copy(struct ipc_message *msg, char *tx_data,
@@ -289,6 +306,23 @@ static void skl_ipc_tx_msg(struct sst_generic_ipc *ipc, struct ipc_message *msg)
289 header->primary | SKL_ADSP_REG_HIPCI_BUSY); 306 header->primary | SKL_ADSP_REG_HIPCI_BUSY);
290} 307}
291 308
309int skl_ipc_check_D0i0(struct sst_dsp *dsp, bool state)
310{
311 int ret;
312
313 /* check D0i3 support */
314 if (!dsp->fw_ops.set_state_D0i0)
315 return 0;
316
317 /* Attempt D0i0 or D0i3 based on state */
318 if (state)
319 ret = dsp->fw_ops.set_state_D0i0(dsp);
320 else
321 ret = dsp->fw_ops.set_state_D0i3(dsp);
322
323 return ret;
324}
325
292static struct ipc_message *skl_ipc_reply_get_msg(struct sst_generic_ipc *ipc, 326static struct ipc_message *skl_ipc_reply_get_msg(struct sst_generic_ipc *ipc,
293 u64 ipc_header) 327 u64 ipc_header)
294{ 328{
@@ -464,7 +498,7 @@ irqreturn_t skl_dsp_irq_thread_handler(int irq, void *context)
464 skl_ipc_int_enable(dsp); 498 skl_ipc_int_enable(dsp);
465 499
466 /* continue to send any remaining messages... */ 500 /* continue to send any remaining messages... */
467 kthread_queue_work(&ipc->kworker, &ipc->kwork); 501 schedule_work(&ipc->kwork);
468 502
469 return IRQ_HANDLED; 503 return IRQ_HANDLED;
470} 504}
@@ -547,7 +581,7 @@ void skl_ipc_free(struct sst_generic_ipc *ipc)
547} 581}
548 582
549int skl_ipc_create_pipeline(struct sst_generic_ipc *ipc, 583int skl_ipc_create_pipeline(struct sst_generic_ipc *ipc,
550 u16 ppl_mem_size, u8 ppl_type, u8 instance_id) 584 u16 ppl_mem_size, u8 ppl_type, u8 instance_id, u8 lp_mode)
551{ 585{
552 struct skl_ipc_header header = {0}; 586 struct skl_ipc_header header = {0};
553 u64 *ipc_header = (u64 *)(&header); 587 u64 *ipc_header = (u64 *)(&header);
@@ -560,6 +594,8 @@ int skl_ipc_create_pipeline(struct sst_generic_ipc *ipc,
560 header.primary |= IPC_PPL_TYPE(ppl_type); 594 header.primary |= IPC_PPL_TYPE(ppl_type);
561 header.primary |= IPC_PPL_MEM_SIZE(ppl_mem_size); 595 header.primary |= IPC_PPL_MEM_SIZE(ppl_mem_size);
562 596
597 header.extension = IPC_PPL_LP_MODE(lp_mode);
598
563 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary); 599 dev_dbg(ipc->dev, "In %s header=%d\n", __func__, header.primary);
564 ret = sst_ipc_tx_message_wait(ipc, *ipc_header, NULL, 0, NULL, 0); 600 ret = sst_ipc_tx_message_wait(ipc, *ipc_header, NULL, 0, NULL, 0);
565 if (ret < 0) { 601 if (ret < 0) {
@@ -931,3 +967,32 @@ int skl_sst_ipc_load_library(struct sst_generic_ipc *ipc,
931 return ret; 967 return ret;
932} 968}
933EXPORT_SYMBOL_GPL(skl_sst_ipc_load_library); 969EXPORT_SYMBOL_GPL(skl_sst_ipc_load_library);
970
971int skl_ipc_set_d0ix(struct sst_generic_ipc *ipc, struct skl_ipc_d0ix_msg *msg)
972{
973 struct skl_ipc_header header = {0};
974 u64 *ipc_header = (u64 *)(&header);
975 int ret;
976
977 header.primary = IPC_MSG_TARGET(IPC_MOD_MSG);
978 header.primary |= IPC_MSG_DIR(IPC_MSG_REQUEST);
979 header.primary |= IPC_GLB_TYPE(IPC_MOD_SET_D0IX);
980 header.primary |= IPC_MOD_INSTANCE_ID(msg->instance_id);
981 header.primary |= IPC_MOD_ID(msg->module_id);
982
983 header.extension = IPC_D0IX_WAKE(msg->wake);
984 header.extension |= IPC_D0IX_STREAMING(msg->streaming);
985
986 dev_dbg(ipc->dev, "In %s primary=%x ext=%x\n", __func__,
987 header.primary, header.extension);
988
989 /*
990 * Use the nopm IPC here as we dont want it checking for D0iX
991 */
992 ret = sst_ipc_tx_message_nopm(ipc, *ipc_header, NULL, 0, NULL, 0);
993 if (ret < 0)
994 dev_err(ipc->dev, "ipc: set d0ix failed, err %d\n", ret);
995
996 return ret;
997}
998EXPORT_SYMBOL_GPL(skl_ipc_set_d0ix);
diff --git a/sound/soc/intel/skylake/skl-sst-ipc.h b/sound/soc/intel/skylake/skl-sst-ipc.h
index 0334ed4af031..cc40341233fa 100644
--- a/sound/soc/intel/skylake/skl-sst-ipc.h
+++ b/sound/soc/intel/skylake/skl-sst-ipc.h
@@ -16,7 +16,6 @@
16#ifndef __SKL_IPC_H 16#ifndef __SKL_IPC_H
17#define __SKL_IPC_H 17#define __SKL_IPC_H
18 18
19#include <linux/kthread.h>
20#include <linux/irqreturn.h> 19#include <linux/irqreturn.h>
21#include "../common/sst-ipc.h" 20#include "../common/sst-ipc.h"
22 21
@@ -53,6 +52,23 @@ struct skl_dsp_cores {
53 int usage_count[SKL_DSP_CORES_MAX]; 52 int usage_count[SKL_DSP_CORES_MAX];
54}; 53};
55 54
55/**
56 * skl_d0i3_data: skl D0i3 counters data struct
57 *
58 * @streaming: Count of usecases that can attempt streaming D0i3
59 * @non_streaming: Count of usecases that can attempt non-streaming D0i3
60 * @non_d0i3: Count of usecases that cannot attempt D0i3
61 * @state: current state
62 * @work: D0i3 worker thread
63 */
64struct skl_d0i3_data {
65 int streaming;
66 int non_streaming;
67 int non_d0i3;
68 enum skl_dsp_d0i3_states state;
69 struct delayed_work work;
70};
71
56struct skl_sst { 72struct skl_sst {
57 struct device *dev; 73 struct device *dev;
58 struct sst_dsp *dsp; 74 struct sst_dsp *dsp;
@@ -83,6 +99,11 @@ struct skl_sst {
83 99
84 /* tplg manifest */ 100 /* tplg manifest */
85 struct skl_dfw_manifest manifest; 101 struct skl_dfw_manifest manifest;
102
103 /* Callback to update D0i3C register */
104 void (*update_d0i3c)(struct device *dev, bool enable);
105
106 struct skl_d0i3_data d0i3;
86}; 107};
87 108
88struct skl_ipc_init_instance_msg { 109struct skl_ipc_init_instance_msg {
@@ -111,6 +132,13 @@ struct skl_ipc_large_config_msg {
111 u32 param_data_size; 132 u32 param_data_size;
112}; 133};
113 134
135struct skl_ipc_d0ix_msg {
136 u32 module_id;
137 u32 instance_id;
138 u8 streaming;
139 u8 wake;
140};
141
114#define SKL_IPC_BOOT_MSECS 3000 142#define SKL_IPC_BOOT_MSECS 3000
115 143
116#define SKL_IPC_D3_MASK 0 144#define SKL_IPC_D3_MASK 0
@@ -119,7 +147,7 @@ struct skl_ipc_large_config_msg {
119irqreturn_t skl_dsp_irq_thread_handler(int irq, void *context); 147irqreturn_t skl_dsp_irq_thread_handler(int irq, void *context);
120 148
121int skl_ipc_create_pipeline(struct sst_generic_ipc *sst_ipc, 149int skl_ipc_create_pipeline(struct sst_generic_ipc *sst_ipc,
122 u16 ppl_mem_size, u8 ppl_type, u8 instance_id); 150 u16 ppl_mem_size, u8 ppl_type, u8 instance_id, u8 lp_mode);
123 151
124int skl_ipc_delete_pipeline(struct sst_generic_ipc *sst_ipc, u8 instance_id); 152int skl_ipc_delete_pipeline(struct sst_generic_ipc *sst_ipc, u8 instance_id);
125 153
@@ -155,6 +183,11 @@ int skl_ipc_get_large_config(struct sst_generic_ipc *ipc,
155int skl_sst_ipc_load_library(struct sst_generic_ipc *ipc, 183int skl_sst_ipc_load_library(struct sst_generic_ipc *ipc,
156 u8 dma_id, u8 table_id); 184 u8 dma_id, u8 table_id);
157 185
186int skl_ipc_set_d0ix(struct sst_generic_ipc *ipc,
187 struct skl_ipc_d0ix_msg *msg);
188
189int skl_ipc_check_D0i0(struct sst_dsp *dsp, bool state);
190
158void skl_ipc_int_enable(struct sst_dsp *dsp); 191void skl_ipc_int_enable(struct sst_dsp *dsp);
159void skl_ipc_op_int_enable(struct sst_dsp *ctx); 192void skl_ipc_op_int_enable(struct sst_dsp *ctx);
160void skl_ipc_op_int_disable(struct sst_dsp *ctx); 193void skl_ipc_op_int_disable(struct sst_dsp *ctx);
diff --git a/sound/soc/intel/skylake/skl-sst-utils.c b/sound/soc/intel/skylake/skl-sst-utils.c
index 8dc03039b311..ea162fbf68e5 100644
--- a/sound/soc/intel/skylake/skl-sst-utils.c
+++ b/sound/soc/intel/skylake/skl-sst-utils.c
@@ -179,7 +179,7 @@ static inline int skl_getid_32(struct uuid_module *module, u64 *val,
179 index = ffz(mask_val); 179 index = ffz(mask_val);
180 pvt_id = index + word1_mask + word2_mask; 180 pvt_id = index + word1_mask + word2_mask;
181 if (pvt_id <= (max_inst - 1)) { 181 if (pvt_id <= (max_inst - 1)) {
182 *val |= 1 << (index + word1_mask); 182 *val |= 1ULL << (index + word1_mask);
183 return pvt_id; 183 return pvt_id;
184 } 184 }
185 } 185 }
diff --git a/sound/soc/intel/skylake/skl-topology.c b/sound/soc/intel/skylake/skl-topology.c
index b5b1934d8550..bd313c907b20 100644
--- a/sound/soc/intel/skylake/skl-topology.c
+++ b/sound/soc/intel/skylake/skl-topology.c
@@ -36,6 +36,44 @@
36#define SKL_IN_DIR_BIT_MASK BIT(0) 36#define SKL_IN_DIR_BIT_MASK BIT(0)
37#define SKL_PIN_COUNT_MASK GENMASK(7, 4) 37#define SKL_PIN_COUNT_MASK GENMASK(7, 4)
38 38
39void skl_tplg_d0i3_get(struct skl *skl, enum d0i3_capability caps)
40{
41 struct skl_d0i3_data *d0i3 = &skl->skl_sst->d0i3;
42
43 switch (caps) {
44 case SKL_D0I3_NONE:
45 d0i3->non_d0i3++;
46 break;
47
48 case SKL_D0I3_STREAMING:
49 d0i3->streaming++;
50 break;
51
52 case SKL_D0I3_NON_STREAMING:
53 d0i3->non_streaming++;
54 break;
55 }
56}
57
58void skl_tplg_d0i3_put(struct skl *skl, enum d0i3_capability caps)
59{
60 struct skl_d0i3_data *d0i3 = &skl->skl_sst->d0i3;
61
62 switch (caps) {
63 case SKL_D0I3_NONE:
64 d0i3->non_d0i3--;
65 break;
66
67 case SKL_D0I3_STREAMING:
68 d0i3->streaming--;
69 break;
70
71 case SKL_D0I3_NON_STREAMING:
72 d0i3->non_streaming--;
73 break;
74 }
75}
76
39/* 77/*
40 * SKL DSP driver modelling uses only few DAPM widgets so for rest we will 78 * SKL DSP driver modelling uses only few DAPM widgets so for rest we will
41 * ignore. This helpers checks if the SKL driver handles this widget type 79 * ignore. This helpers checks if the SKL driver handles this widget type
@@ -1519,6 +1557,10 @@ static int skl_tplg_fill_pipe_tkn(struct device *dev,
1519 pipe->memory_pages = tkn_val; 1557 pipe->memory_pages = tkn_val;
1520 break; 1558 break;
1521 1559
1560 case SKL_TKN_U32_PMODE:
1561 pipe->lp_mode = tkn_val;
1562 break;
1563
1522 default: 1564 default:
1523 dev_err(dev, "Token not handled %d\n", tkn); 1565 dev_err(dev, "Token not handled %d\n", tkn);
1524 return -EINVAL; 1566 return -EINVAL;
@@ -1826,6 +1868,10 @@ static int skl_tplg_get_token(struct device *dev,
1826 mconfig->converter = tkn_elem->value; 1868 mconfig->converter = tkn_elem->value;
1827 break; 1869 break;
1828 1870
1871 case SKL_TKL_U32_D0I3_CAPS:
1872 mconfig->d0i3_caps = tkn_elem->value;
1873 break;
1874
1829 case SKL_TKN_U32_PIPE_ID: 1875 case SKL_TKN_U32_PIPE_ID:
1830 ret = skl_tplg_add_pipe(dev, 1876 ret = skl_tplg_add_pipe(dev,
1831 mconfig, skl, tkn_elem); 1877 mconfig, skl, tkn_elem);
@@ -1841,6 +1887,7 @@ static int skl_tplg_get_token(struct device *dev,
1841 case SKL_TKN_U32_PIPE_CONN_TYPE: 1887 case SKL_TKN_U32_PIPE_CONN_TYPE:
1842 case SKL_TKN_U32_PIPE_PRIORITY: 1888 case SKL_TKN_U32_PIPE_PRIORITY:
1843 case SKL_TKN_U32_PIPE_MEM_PGS: 1889 case SKL_TKN_U32_PIPE_MEM_PGS:
1890 case SKL_TKN_U32_PMODE:
1844 if (is_pipe_exists) { 1891 if (is_pipe_exists) {
1845 ret = skl_tplg_fill_pipe_tkn(dev, mconfig->pipe, 1892 ret = skl_tplg_fill_pipe_tkn(dev, mconfig->pipe,
1846 tkn_elem->token, tkn_elem->value); 1893 tkn_elem->token, tkn_elem->value);
diff --git a/sound/soc/intel/skylake/skl-topology.h b/sound/soc/intel/skylake/skl-topology.h
index a519360f42a6..08d39280b07b 100644
--- a/sound/soc/intel/skylake/skl-topology.h
+++ b/sound/soc/intel/skylake/skl-topology.h
@@ -113,23 +113,6 @@ struct skl_cpr_gtw_cfg {
113 u32 config_data[1]; 113 u32 config_data[1];
114} __packed; 114} __packed;
115 115
116struct skl_i2s_config_blob {
117 u32 gateway_attrib;
118 u32 tdm_ts_group[8];
119 u32 ssc0;
120 u32 ssc1;
121 u32 sscto;
122 u32 sspsp;
123 u32 sstsa;
124 u32 ssrsa;
125 u32 ssc2;
126 u32 sspsp2;
127 u32 ssc3;
128 u32 ssioc;
129 u32 mdivc;
130 u32 mdivr;
131} __packed;
132
133struct skl_dma_control { 116struct skl_dma_control {
134 u32 node_id; 117 u32 node_id;
135 u32 config_length; 118 u32 config_length;
@@ -279,6 +262,7 @@ struct skl_pipe {
279 u8 pipe_priority; 262 u8 pipe_priority;
280 u16 conn_type; 263 u16 conn_type;
281 u32 memory_pages; 264 u32 memory_pages;
265 u8 lp_mode;
282 struct skl_pipe_params *p_params; 266 struct skl_pipe_params *p_params;
283 enum skl_pipe_state state; 267 enum skl_pipe_state state;
284 struct list_head w_list; 268 struct list_head w_list;
@@ -293,6 +277,12 @@ enum skl_module_state {
293 SKL_MODULE_UNLOADED = 4, 277 SKL_MODULE_UNLOADED = 4,
294}; 278};
295 279
280enum d0i3_capability {
281 SKL_D0I3_NONE = 0,
282 SKL_D0I3_STREAMING = 1,
283 SKL_D0I3_NON_STREAMING = 2,
284};
285
296struct skl_module_cfg { 286struct skl_module_cfg {
297 u8 guid[16]; 287 u8 guid[16];
298 struct skl_module_inst_id id; 288 struct skl_module_inst_id id;
@@ -319,6 +309,7 @@ struct skl_module_cfg {
319 u32 converter; 309 u32 converter;
320 u32 vbus_id; 310 u32 vbus_id;
321 u32 mem_pages; 311 u32 mem_pages;
312 enum d0i3_capability d0i3_caps;
322 struct skl_module_pin *m_in_pin; 313 struct skl_module_pin *m_in_pin;
323 struct skl_module_pin *m_out_pin; 314 struct skl_module_pin *m_out_pin;
324 enum skl_module_type m_type; 315 enum skl_module_type m_type;
@@ -361,6 +352,9 @@ struct skl_module_cfg *skl_tplg_fe_get_cpr_module(
361int skl_tplg_update_pipe_params(struct device *dev, 352int skl_tplg_update_pipe_params(struct device *dev,
362 struct skl_module_cfg *mconfig, struct skl_pipe_params *params); 353 struct skl_module_cfg *mconfig, struct skl_pipe_params *params);
363 354
355void skl_tplg_d0i3_get(struct skl *skl, enum d0i3_capability caps);
356void skl_tplg_d0i3_put(struct skl *skl, enum d0i3_capability caps);
357
364int skl_create_pipeline(struct skl_sst *ctx, struct skl_pipe *pipe); 358int skl_create_pipeline(struct skl_sst *ctx, struct skl_pipe *pipe);
365 359
366int skl_run_pipe(struct skl_sst *ctx, struct skl_pipe *pipe); 360int skl_run_pipe(struct skl_sst *ctx, struct skl_pipe *pipe);
diff --git a/sound/soc/intel/skylake/skl.c b/sound/soc/intel/skylake/skl.c
index 06fa5e85dd0e..da5db5098274 100644
--- a/sound/soc/intel/skylake/skl.c
+++ b/sound/soc/intel/skylake/skl.c
@@ -26,6 +26,7 @@
26#include <linux/pm_runtime.h> 26#include <linux/pm_runtime.h>
27#include <linux/platform_device.h> 27#include <linux/platform_device.h>
28#include <linux/firmware.h> 28#include <linux/firmware.h>
29#include <linux/delay.h>
29#include <sound/pcm.h> 30#include <sound/pcm.h>
30#include "../common/sst-acpi.h" 31#include "../common/sst-acpi.h"
31#include <sound/hda_register.h> 32#include <sound/hda_register.h>
@@ -109,6 +110,52 @@ static int skl_init_chip(struct hdac_bus *bus, bool full_reset)
109 return ret; 110 return ret;
110} 111}
111 112
113void skl_update_d0i3c(struct device *dev, bool enable)
114{
115 struct pci_dev *pci = to_pci_dev(dev);
116 struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
117 struct hdac_bus *bus = ebus_to_hbus(ebus);
118 u8 reg;
119 int timeout = 50;
120
121 reg = snd_hdac_chip_readb(bus, VS_D0I3C);
122 /* Do not write to D0I3C until command in progress bit is cleared */
123 while ((reg & AZX_REG_VS_D0I3C_CIP) && --timeout) {
124 udelay(10);
125 reg = snd_hdac_chip_readb(bus, VS_D0I3C);
126 }
127
128 /* Highly unlikely. But if it happens, flag error explicitly */
129 if (!timeout) {
130 dev_err(bus->dev, "Before D0I3C update: D0I3C CIP timeout\n");
131 return;
132 }
133
134 if (enable)
135 reg = reg | AZX_REG_VS_D0I3C_I3;
136 else
137 reg = reg & (~AZX_REG_VS_D0I3C_I3);
138
139 snd_hdac_chip_writeb(bus, VS_D0I3C, reg);
140
141 timeout = 50;
142 /* Wait for cmd in progress to be cleared before exiting the function */
143 reg = snd_hdac_chip_readb(bus, VS_D0I3C);
144 while ((reg & AZX_REG_VS_D0I3C_CIP) && --timeout) {
145 udelay(10);
146 reg = snd_hdac_chip_readb(bus, VS_D0I3C);
147 }
148
149 /* Highly unlikely. But if it happens, flag error explicitly */
150 if (!timeout) {
151 dev_err(bus->dev, "After D0I3C update: D0I3C CIP timeout\n");
152 return;
153 }
154
155 dev_dbg(bus->dev, "D0I3C register = 0x%x\n",
156 snd_hdac_chip_readb(bus, VS_D0I3C));
157}
158
112/* called from IRQ */ 159/* called from IRQ */
113static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr) 160static void skl_stream_update(struct hdac_bus *bus, struct hdac_stream *hstr)
114{ 161{
@@ -181,6 +228,15 @@ static int skl_acquire_irq(struct hdac_ext_bus *ebus, int do_disconnect)
181 return 0; 228 return 0;
182} 229}
183 230
231static int skl_suspend_late(struct device *dev)
232{
233 struct pci_dev *pci = to_pci_dev(dev);
234 struct hdac_ext_bus *ebus = pci_get_drvdata(pci);
235 struct skl *skl = ebus_to_skl(ebus);
236
237 return skl_suspend_late_dsp(skl);
238}
239
184#ifdef CONFIG_PM 240#ifdef CONFIG_PM
185static int _skl_suspend(struct hdac_ext_bus *ebus) 241static int _skl_suspend(struct hdac_ext_bus *ebus)
186{ 242{
@@ -243,7 +299,6 @@ static int skl_suspend(struct device *dev)
243 299
244 enable_irq_wake(bus->irq); 300 enable_irq_wake(bus->irq);
245 pci_save_state(pci); 301 pci_save_state(pci);
246 pci_disable_device(pci);
247 } else { 302 } else {
248 ret = _skl_suspend(ebus); 303 ret = _skl_suspend(ebus);
249 if (ret < 0) 304 if (ret < 0)
@@ -286,7 +341,6 @@ static int skl_resume(struct device *dev)
286 */ 341 */
287 if (skl->supend_active) { 342 if (skl->supend_active) {
288 pci_restore_state(pci); 343 pci_restore_state(pci);
289 ret = pci_enable_device(pci);
290 snd_hdac_ext_bus_link_power_up_all(ebus); 344 snd_hdac_ext_bus_link_power_up_all(ebus);
291 disable_irq_wake(bus->irq); 345 disable_irq_wake(bus->irq);
292 /* 346 /*
@@ -345,6 +399,7 @@ static int skl_runtime_resume(struct device *dev)
345static const struct dev_pm_ops skl_pm = { 399static const struct dev_pm_ops skl_pm = {
346 SET_SYSTEM_SLEEP_PM_OPS(skl_suspend, skl_resume) 400 SET_SYSTEM_SLEEP_PM_OPS(skl_suspend, skl_resume)
347 SET_RUNTIME_PM_OPS(skl_runtime_suspend, skl_runtime_resume, NULL) 401 SET_RUNTIME_PM_OPS(skl_runtime_suspend, skl_runtime_resume, NULL)
402 .suspend_late = skl_suspend_late,
348}; 403};
349 404
350/* 405/*
diff --git a/sound/soc/intel/skylake/skl.h b/sound/soc/intel/skylake/skl.h
index 5d4fbb094c48..4986e3929dd3 100644
--- a/sound/soc/intel/skylake/skl.h
+++ b/sound/soc/intel/skylake/skl.h
@@ -52,6 +52,9 @@
52#define AZX_PGCTL_LSRMD_MASK (1 << 4) 52#define AZX_PGCTL_LSRMD_MASK (1 << 4)
53#define AZX_PCIREG_CGCTL 0x48 53#define AZX_PCIREG_CGCTL 0x48
54#define AZX_CGCTL_MISCBDCGE_MASK (1 << 6) 54#define AZX_CGCTL_MISCBDCGE_MASK (1 << 6)
55/* D0I3C Register fields */
56#define AZX_REG_VS_D0I3C_CIP 0x1 /* Command in progress */
57#define AZX_REG_VS_D0I3C_I3 0x4 /* D0i3 enable */
55 58
56struct skl_dsp_resource { 59struct skl_dsp_resource {
57 u32 max_mcps; 60 u32 max_mcps;
@@ -121,8 +124,11 @@ int skl_get_dmic_geo(struct skl *skl);
121int skl_nhlt_update_topology_bin(struct skl *skl); 124int skl_nhlt_update_topology_bin(struct skl *skl);
122int skl_init_dsp(struct skl *skl); 125int skl_init_dsp(struct skl *skl);
123int skl_free_dsp(struct skl *skl); 126int skl_free_dsp(struct skl *skl);
127int skl_suspend_late_dsp(struct skl *skl);
124int skl_suspend_dsp(struct skl *skl); 128int skl_suspend_dsp(struct skl *skl);
125int skl_resume_dsp(struct skl *skl); 129int skl_resume_dsp(struct skl *skl);
126void skl_cleanup_resources(struct skl *skl); 130void skl_cleanup_resources(struct skl *skl);
127const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id); 131const struct skl_dsp_ops *skl_get_dsp_ops(int pci_id);
132void skl_update_d0i3c(struct device *dev, bool enable);
133
128#endif /* __SOUND_SOC_SKL_H */ 134#endif /* __SOUND_SOC_SKL_H */
diff --git a/sound/soc/kirkwood/armada-370-db.c b/sound/soc/kirkwood/armada-370-db.c
index e0304d544f26..677a48d7b891 100644
--- a/sound/soc/kirkwood/armada-370-db.c
+++ b/sound/soc/kirkwood/armada-370-db.c
@@ -42,7 +42,7 @@ static int a370db_hw_params(struct snd_pcm_substream *substream,
42 return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN); 42 return snd_soc_dai_set_sysclk(codec_dai, 0, freq, SND_SOC_CLOCK_IN);
43} 43}
44 44
45static struct snd_soc_ops a370db_ops = { 45static const struct snd_soc_ops a370db_ops = {
46 .hw_params = a370db_hw_params, 46 .hw_params = a370db_hw_params,
47}; 47};
48 48
diff --git a/sound/soc/mxs/mxs-saif.c b/sound/soc/mxs/mxs-saif.c
index 13631003cb7c..a002ab892772 100644
--- a/sound/soc/mxs/mxs-saif.c
+++ b/sound/soc/mxs/mxs-saif.c
@@ -735,6 +735,11 @@ static int mxs_saif_probe(struct platform_device *pdev)
735 else 735 else
736 saif->id = ret; 736 saif->id = ret;
737 737
738 if (saif->id >= ARRAY_SIZE(mxs_saif)) {
739 dev_err(&pdev->dev, "get wrong saif id\n");
740 return -EINVAL;
741 }
742
738 /* 743 /*
739 * If there is no "fsl,saif-master" phandle, it's a saif 744 * If there is no "fsl,saif-master" phandle, it's a saif
740 * master. Otherwise, it's a slave and its phandle points 745 * master. Otherwise, it's a slave and its phandle points
@@ -749,11 +754,11 @@ static int mxs_saif_probe(struct platform_device *pdev)
749 return ret; 754 return ret;
750 else 755 else
751 saif->master_id = ret; 756 saif->master_id = ret;
752 }
753 757
754 if (saif->master_id >= ARRAY_SIZE(mxs_saif)) { 758 if (saif->master_id >= ARRAY_SIZE(mxs_saif)) {
755 dev_err(&pdev->dev, "get wrong master id\n"); 759 dev_err(&pdev->dev, "get wrong master id\n");
756 return -EINVAL; 760 return -EINVAL;
761 }
757 } 762 }
758 763
759 mxs_saif[saif->id] = saif; 764 mxs_saif[saif->id] = saif;
diff --git a/sound/soc/mxs/mxs-sgtl5000.c b/sound/soc/mxs/mxs-sgtl5000.c
index 2b23ffbac6b1..a96276e77332 100644
--- a/sound/soc/mxs/mxs-sgtl5000.c
+++ b/sound/soc/mxs/mxs-sgtl5000.c
@@ -68,7 +68,7 @@ static int mxs_sgtl5000_hw_params(struct snd_pcm_substream *substream,
68 return 0; 68 return 0;
69} 69}
70 70
71static struct snd_soc_ops mxs_sgtl5000_hifi_ops = { 71static const struct snd_soc_ops mxs_sgtl5000_hifi_ops = {
72 .hw_params = mxs_sgtl5000_hw_params, 72 .hw_params = mxs_sgtl5000_hw_params,
73}; 73};
74 74
diff --git a/sound/soc/pxa/corgi.c b/sound/soc/pxa/corgi.c
index dcbb7aa9830c..311774e9ca46 100644
--- a/sound/soc/pxa/corgi.c
+++ b/sound/soc/pxa/corgi.c
@@ -244,9 +244,9 @@ static const struct snd_soc_dapm_route corgi_audio_map[] = {
244 {"MICIN", NULL, "Line Jack"}, 244 {"MICIN", NULL, "Line Jack"},
245}; 245};
246 246
247static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset", 247static const char * const jack_function[] = {"Headphone", "Mic", "Line",
248 "Off"}; 248 "Headset", "Off"};
249static const char *spk_function[] = {"On", "Off"}; 249static const char * const spk_function[] = {"On", "Off"};
250static const struct soc_enum corgi_enum[] = { 250static const struct soc_enum corgi_enum[] = {
251 SOC_ENUM_SINGLE_EXT(5, jack_function), 251 SOC_ENUM_SINGLE_EXT(5, jack_function),
252 SOC_ENUM_SINGLE_EXT(2, spk_function), 252 SOC_ENUM_SINGLE_EXT(2, spk_function),
diff --git a/sound/soc/pxa/e740_wm9705.c b/sound/soc/pxa/e740_wm9705.c
index 1de876529aa1..086c37a85630 100644
--- a/sound/soc/pxa/e740_wm9705.c
+++ b/sound/soc/pxa/e740_wm9705.c
@@ -22,7 +22,6 @@
22 22
23#include <asm/mach-types.h> 23#include <asm/mach-types.h>
24 24
25#include "../codecs/wm9705.h"
26#include "pxa2xx-ac97.h" 25#include "pxa2xx-ac97.h"
27 26
28 27
diff --git a/sound/soc/pxa/e750_wm9705.c b/sound/soc/pxa/e750_wm9705.c
index b7eb7cd5df7d..7823278012a6 100644
--- a/sound/soc/pxa/e750_wm9705.c
+++ b/sound/soc/pxa/e750_wm9705.c
@@ -22,7 +22,6 @@
22 22
23#include <asm/mach-types.h> 23#include <asm/mach-types.h>
24 24
25#include "../codecs/wm9705.h"
26#include "pxa2xx-ac97.h" 25#include "pxa2xx-ac97.h"
27 26
28static int e750_spk_amp_event(struct snd_soc_dapm_widget *w, 27static int e750_spk_amp_event(struct snd_soc_dapm_widget *w,
diff --git a/sound/soc/pxa/e800_wm9712.c b/sound/soc/pxa/e800_wm9712.c
index 41bf71466a7b..07b9c6e17df9 100644
--- a/sound/soc/pxa/e800_wm9712.c
+++ b/sound/soc/pxa/e800_wm9712.c
@@ -21,7 +21,6 @@
21#include <mach/audio.h> 21#include <mach/audio.h>
22#include <mach/eseries-gpio.h> 22#include <mach/eseries-gpio.h>
23 23
24#include "../codecs/wm9712.h"
25#include "pxa2xx-ac97.h" 24#include "pxa2xx-ac97.h"
26 25
27static int e800_spk_amp_event(struct snd_soc_dapm_widget *w, 26static int e800_spk_amp_event(struct snd_soc_dapm_widget *w,
diff --git a/sound/soc/pxa/em-x270.c b/sound/soc/pxa/em-x270.c
index 64743a05aeae..966163d1c813 100644
--- a/sound/soc/pxa/em-x270.c
+++ b/sound/soc/pxa/em-x270.c
@@ -30,7 +30,6 @@
30#include <asm/mach-types.h> 30#include <asm/mach-types.h>
31#include <mach/audio.h> 31#include <mach/audio.h>
32 32
33#include "../codecs/wm9712.h"
34#include "pxa2xx-ac97.h" 33#include "pxa2xx-ac97.h"
35 34
36static struct snd_soc_dai_link em_x270_dai[] = { 35static struct snd_soc_dai_link em_x270_dai[] = {
diff --git a/sound/soc/pxa/hx4700.c b/sound/soc/pxa/hx4700.c
index ecbf2873b7ff..85483049b916 100644
--- a/sound/soc/pxa/hx4700.c
+++ b/sound/soc/pxa/hx4700.c
@@ -27,8 +27,6 @@
27#include <asm/mach-types.h> 27#include <asm/mach-types.h>
28#include "pxa2xx-i2s.h" 28#include "pxa2xx-i2s.h"
29 29
30#include "../codecs/ak4641.h"
31
32static struct snd_soc_jack hs_jack; 30static struct snd_soc_jack hs_jack;
33 31
34/* Headphones jack detection DAPM pin */ 32/* Headphones jack detection DAPM pin */
diff --git a/sound/soc/pxa/magician.c b/sound/soc/pxa/magician.c
index 62b8377a9d2b..2d4d4455fe87 100644
--- a/sound/soc/pxa/magician.c
+++ b/sound/soc/pxa/magician.c
@@ -376,7 +376,7 @@ static const struct snd_soc_dapm_route audio_map[] = {
376 {"VINM", NULL, "Call Mic"}, 376 {"VINM", NULL, "Call Mic"},
377}; 377};
378 378
379static const char *input_select[] = {"Call Mic", "Headset Mic"}; 379static const char * const input_select[] = {"Call Mic", "Headset Mic"};
380static const struct soc_enum magician_in_sel_enum = 380static const struct soc_enum magician_in_sel_enum =
381 SOC_ENUM_SINGLE_EXT(2, input_select); 381 SOC_ENUM_SINGLE_EXT(2, input_select);
382 382
diff --git a/sound/soc/pxa/mioa701_wm9713.c b/sound/soc/pxa/mioa701_wm9713.c
index d1661fa6ee08..0fe0abec8fc4 100644
--- a/sound/soc/pxa/mioa701_wm9713.c
+++ b/sound/soc/pxa/mioa701_wm9713.c
@@ -187,7 +187,7 @@ static int mioa701_wm9713_probe(struct platform_device *pdev)
187 mioa701.dev = &pdev->dev; 187 mioa701.dev = &pdev->dev;
188 rc = devm_snd_soc_register_card(&pdev->dev, &mioa701); 188 rc = devm_snd_soc_register_card(&pdev->dev, &mioa701);
189 if (!rc) 189 if (!rc)
190 dev_warn(&pdev->dev, "Be warned that incorrect mixers/muxes setup will" 190 dev_warn(&pdev->dev, "Be warned that incorrect mixers/muxes setup will "
191 "lead to overheating and possible destruction of your device." 191 "lead to overheating and possible destruction of your device."
192 " Do not use without a good knowledge of mio's board design!\n"); 192 " Do not use without a good knowledge of mio's board design!\n");
193 return rc; 193 return rc;
diff --git a/sound/soc/pxa/palm27x.c b/sound/soc/pxa/palm27x.c
index bcc81e920a67..387492d46b6c 100644
--- a/sound/soc/pxa/palm27x.c
+++ b/sound/soc/pxa/palm27x.c
@@ -27,7 +27,6 @@
27#include <mach/audio.h> 27#include <mach/audio.h>
28#include <linux/platform_data/asoc-palm27x.h> 28#include <linux/platform_data/asoc-palm27x.h>
29 29
30#include "../codecs/wm9712.h"
31#include "pxa2xx-ac97.h" 30#include "pxa2xx-ac97.h"
32 31
33static struct snd_soc_jack hs_jack; 32static struct snd_soc_jack hs_jack;
diff --git a/sound/soc/pxa/poodle.c b/sound/soc/pxa/poodle.c
index 4b3b714f5ee7..a879aba0691f 100644
--- a/sound/soc/pxa/poodle.c
+++ b/sound/soc/pxa/poodle.c
@@ -209,8 +209,8 @@ static const struct snd_soc_dapm_route poodle_audio_map[] = {
209 {"MICIN", NULL, "Microphone"}, 209 {"MICIN", NULL, "Microphone"},
210}; 210};
211 211
212static const char *jack_function[] = {"Off", "Headphone"}; 212static const char * const jack_function[] = {"Off", "Headphone"};
213static const char *spk_function[] = {"Off", "On"}; 213static const char * const spk_function[] = {"Off", "On"};
214static const struct soc_enum poodle_enum[] = { 214static const struct soc_enum poodle_enum[] = {
215 SOC_ENUM_SINGLE_EXT(2, jack_function), 215 SOC_ENUM_SINGLE_EXT(2, jack_function),
216 SOC_ENUM_SINGLE_EXT(2, spk_function), 216 SOC_ENUM_SINGLE_EXT(2, spk_function),
diff --git a/sound/soc/pxa/pxa-ssp.h b/sound/soc/pxa/pxa-ssp.h
index bc79da221c0d..abf6ec080258 100644
--- a/sound/soc/pxa/pxa-ssp.h
+++ b/sound/soc/pxa/pxa-ssp.h
@@ -9,12 +9,6 @@
9#ifndef _PXA_SSP_H 9#ifndef _PXA_SSP_H
10#define _PXA_SSP_H 10#define _PXA_SSP_H
11 11
12/* pxa DAI SSP IDs */
13#define PXA_DAI_SSP1 0
14#define PXA_DAI_SSP2 1
15#define PXA_DAI_SSP3 2
16#define PXA_DAI_SSP4 3
17
18/* SSP clock sources */ 12/* SSP clock sources */
19#define PXA_SSP_CLK_PLL 0 13#define PXA_SSP_CLK_PLL 0
20#define PXA_SSP_CLK_EXT 1 14#define PXA_SSP_CLK_EXT 1
diff --git a/sound/soc/pxa/pxa2xx-i2s.h b/sound/soc/pxa/pxa2xx-i2s.h
index 070f3c6059fe..7e218e2105a9 100644
--- a/sound/soc/pxa/pxa2xx-i2s.h
+++ b/sound/soc/pxa/pxa2xx-i2s.h
@@ -9,9 +9,6 @@
9#ifndef _PXA2XX_I2S_H 9#ifndef _PXA2XX_I2S_H
10#define _PXA2XX_I2S_H 10#define _PXA2XX_I2S_H
11 11
12/* pxa2xx DAI ID's */
13#define PXA2XX_DAI_I2S 0
14
15/* I2S clock */ 12/* I2S clock */
16#define PXA2XX_I2S_SYSCLK 0 13#define PXA2XX_I2S_SYSCLK 0
17 14
diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c
index 0e02634c8b7f..07d77cddac60 100644
--- a/sound/soc/pxa/spitz.c
+++ b/sound/soc/pxa/spitz.c
@@ -241,9 +241,9 @@ static const struct snd_soc_dapm_route spitz_audio_map[] = {
241 {"LINPUT1", NULL, "Line Jack"}, 241 {"LINPUT1", NULL, "Line Jack"},
242}; 242};
243 243
244static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset", 244static const char * const jack_function[] = {"Headphone", "Mic", "Line",
245 "Off"}; 245 "Headset", "Off"};
246static const char *spk_function[] = {"On", "Off"}; 246static const char * const spk_function[] = {"On", "Off"};
247static const struct soc_enum spitz_enum[] = { 247static const struct soc_enum spitz_enum[] = {
248 SOC_ENUM_SINGLE_EXT(5, jack_function), 248 SOC_ENUM_SINGLE_EXT(5, jack_function),
249 SOC_ENUM_SINGLE_EXT(2, spk_function), 249 SOC_ENUM_SINGLE_EXT(2, spk_function),
diff --git a/sound/soc/pxa/tosa.c b/sound/soc/pxa/tosa.c
index c508f024ecfb..2e312c62e3c7 100644
--- a/sound/soc/pxa/tosa.c
+++ b/sound/soc/pxa/tosa.c
@@ -31,7 +31,6 @@
31#include <mach/tosa.h> 31#include <mach/tosa.h>
32#include <mach/audio.h> 32#include <mach/audio.h>
33 33
34#include "../codecs/wm9712.h"
35#include "pxa2xx-ac97.h" 34#include "pxa2xx-ac97.h"
36 35
37#define TOSA_HP 0 36#define TOSA_HP 0
@@ -170,9 +169,9 @@ static const struct snd_soc_dapm_route audio_map[] = {
170 {"Mic Bias", NULL, "Headset Jack"}, 169 {"Mic Bias", NULL, "Headset Jack"},
171}; 170};
172 171
173static const char *jack_function[] = {"Headphone", "Mic", "Line", "Headset", 172static const char * const jack_function[] = {"Headphone", "Mic", "Line",
174 "Off"}; 173 "Headset", "Off"};
175static const char *spk_function[] = {"On", "Off"}; 174static const char * const spk_function[] = {"On", "Off"};
176static const struct soc_enum tosa_enum[] = { 175static const struct soc_enum tosa_enum[] = {
177 SOC_ENUM_SINGLE_EXT(5, jack_function), 176 SOC_ENUM_SINGLE_EXT(5, jack_function),
178 SOC_ENUM_SINGLE_EXT(2, spk_function), 177 SOC_ENUM_SINGLE_EXT(2, spk_function),
diff --git a/sound/soc/qcom/apq8016_sbc.c b/sound/soc/qcom/apq8016_sbc.c
index 07f91e918b23..d084d7468299 100644
--- a/sound/soc/qcom/apq8016_sbc.c
+++ b/sound/soc/qcom/apq8016_sbc.c
@@ -123,20 +123,15 @@ static struct apq8016_sbc_data *apq8016_sbc_parse_of(struct snd_soc_card *card)
123 return ERR_PTR(-EINVAL); 123 return ERR_PTR(-EINVAL);
124 } 124 }
125 125
126 link->codec_of_node = of_parse_phandle(codec, "sound-dai", 0);
127 if (!link->codec_of_node) {
128 dev_err(card->dev, "error getting codec phandle\n");
129 return ERR_PTR(-EINVAL);
130 }
131
132 ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name); 126 ret = snd_soc_of_get_dai_name(cpu, &link->cpu_dai_name);
133 if (ret) { 127 if (ret) {
134 dev_err(card->dev, "error getting cpu dai name\n"); 128 dev_err(card->dev, "error getting cpu dai name\n");
135 return ERR_PTR(ret); 129 return ERR_PTR(ret);
136 } 130 }
137 131
138 ret = snd_soc_of_get_dai_name(codec, &link->codec_dai_name); 132 ret = snd_soc_of_get_dai_link_codecs(dev, codec, link);
139 if (ret) { 133
134 if (ret < 0) {
140 dev_err(card->dev, "error getting codec dai name\n"); 135 dev_err(card->dev, "error getting codec dai name\n");
141 return ERR_PTR(ret); 136 return ERR_PTR(ret);
142 } 137 }
diff --git a/sound/soc/qcom/lpass-platform.c b/sound/soc/qcom/lpass-platform.c
index 07000f53db44..dd5bdd0da730 100644
--- a/sound/soc/qcom/lpass-platform.c
+++ b/sound/soc/qcom/lpass-platform.c
@@ -25,8 +25,7 @@
25#include "lpass.h" 25#include "lpass.h"
26 26
27struct lpass_pcm_data { 27struct lpass_pcm_data {
28 int rdma_ch; 28 int dma_ch;
29 int wrdma_ch;
30 int i2s_port; 29 int i2s_port;
31}; 30};
32 31
@@ -75,8 +74,12 @@ static int lpass_platform_pcmops_open(struct snd_pcm_substream *substream)
75 data->i2s_port = cpu_dai->driver->id; 74 data->i2s_port = cpu_dai->driver->id;
76 runtime->private_data = data; 75 runtime->private_data = data;
77 76
77 dma_ch = 0;
78 if (v->alloc_dma_channel) 78 if (v->alloc_dma_channel)
79 dma_ch = v->alloc_dma_channel(drvdata, dir); 79 dma_ch = v->alloc_dma_channel(drvdata, dir);
80 else
81 dma_ch = 0;
82
80 if (dma_ch < 0) 83 if (dma_ch < 0)
81 return dma_ch; 84 return dma_ch;
82 85
@@ -91,10 +94,7 @@ static int lpass_platform_pcmops_open(struct snd_pcm_substream *substream)
91 return ret; 94 return ret;
92 } 95 }
93 96
94 if (dir == SNDRV_PCM_STREAM_PLAYBACK) 97 data->dma_ch = dma_ch;
95 data->rdma_ch = dma_ch;
96 else
97 data->wrdma_ch = dma_ch;
98 98
99 snd_soc_set_runtime_hwparams(substream, &lpass_platform_pcm_hardware); 99 snd_soc_set_runtime_hwparams(substream, &lpass_platform_pcm_hardware);
100 100
@@ -121,20 +121,12 @@ static int lpass_platform_pcmops_close(struct snd_pcm_substream *substream)
121 snd_soc_platform_get_drvdata(soc_runtime->platform); 121 snd_soc_platform_get_drvdata(soc_runtime->platform);
122 struct lpass_variant *v = drvdata->variant; 122 struct lpass_variant *v = drvdata->variant;
123 struct lpass_pcm_data *data; 123 struct lpass_pcm_data *data;
124 int dma_ch, dir = substream->stream;
125 124
126 data = runtime->private_data; 125 data = runtime->private_data;
127 v = drvdata->variant; 126 v = drvdata->variant;
128 127 drvdata->substream[data->dma_ch] = NULL;
129 if (dir == SNDRV_PCM_STREAM_PLAYBACK)
130 dma_ch = data->rdma_ch;
131 else
132 dma_ch = data->wrdma_ch;
133
134 drvdata->substream[dma_ch] = NULL;
135
136 if (v->free_dma_channel) 128 if (v->free_dma_channel)
137 v->free_dma_channel(drvdata, dma_ch); 129 v->free_dma_channel(drvdata, data->dma_ch);
138 130
139 return 0; 131 return 0;
140} 132}
@@ -155,10 +147,7 @@ static int lpass_platform_pcmops_hw_params(struct snd_pcm_substream *substream,
155 int bitwidth; 147 int bitwidth;
156 int ret, dma_port = pcm_data->i2s_port + v->dmactl_audif_start; 148 int ret, dma_port = pcm_data->i2s_port + v->dmactl_audif_start;
157 149
158 if (dir == SNDRV_PCM_STREAM_PLAYBACK) 150 ch = pcm_data->dma_ch;
159 ch = pcm_data->rdma_ch;
160 else
161 ch = pcm_data->wrdma_ch;
162 151
163 bitwidth = snd_pcm_format_width(format); 152 bitwidth = snd_pcm_format_width(format);
164 if (bitwidth < 0) { 153 if (bitwidth < 0) {
@@ -245,11 +234,7 @@ static int lpass_platform_pcmops_hw_free(struct snd_pcm_substream *substream)
245 unsigned int reg; 234 unsigned int reg;
246 int ret; 235 int ret;
247 236
248 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 237 reg = LPAIF_DMACTL_REG(v, pcm_data->dma_ch, substream->stream);
249 reg = LPAIF_RDMACTL_REG(v, pcm_data->rdma_ch);
250 else
251 reg = LPAIF_WRDMACTL_REG(v, pcm_data->wrdma_ch);
252
253 ret = regmap_write(drvdata->lpaif_map, reg, 0); 238 ret = regmap_write(drvdata->lpaif_map, reg, 0);
254 if (ret) 239 if (ret)
255 dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n", 240 dev_err(soc_runtime->dev, "%s() error writing to rdmactl reg: %d\n",
@@ -269,10 +254,7 @@ static int lpass_platform_pcmops_prepare(struct snd_pcm_substream *substream)
269 struct lpass_variant *v = drvdata->variant; 254 struct lpass_variant *v = drvdata->variant;
270 int ret, ch, dir = substream->stream; 255 int ret, ch, dir = substream->stream;
271 256
272 if (dir == SNDRV_PCM_STREAM_PLAYBACK) 257 ch = pcm_data->dma_ch;
273 ch = pcm_data->rdma_ch;
274 else
275 ch = pcm_data->wrdma_ch;
276 258
277 ret = regmap_write(drvdata->lpaif_map, 259 ret = regmap_write(drvdata->lpaif_map,
278 LPAIF_DMABASE_REG(v, ch, dir), 260 LPAIF_DMABASE_REG(v, ch, dir),
@@ -324,10 +306,7 @@ static int lpass_platform_pcmops_trigger(struct snd_pcm_substream *substream,
324 struct lpass_variant *v = drvdata->variant; 306 struct lpass_variant *v = drvdata->variant;
325 int ret, ch, dir = substream->stream; 307 int ret, ch, dir = substream->stream;
326 308
327 if (dir == SNDRV_PCM_STREAM_PLAYBACK) 309 ch = pcm_data->dma_ch;
328 ch = pcm_data->rdma_ch;
329 else
330 ch = pcm_data->wrdma_ch;
331 310
332 switch (cmd) { 311 switch (cmd) {
333 case SNDRV_PCM_TRIGGER_START: 312 case SNDRV_PCM_TRIGGER_START:
@@ -402,10 +381,7 @@ static snd_pcm_uframes_t lpass_platform_pcmops_pointer(
402 unsigned int base_addr, curr_addr; 381 unsigned int base_addr, curr_addr;
403 int ret, ch, dir = substream->stream; 382 int ret, ch, dir = substream->stream;
404 383
405 if (dir == SNDRV_PCM_STREAM_PLAYBACK) 384 ch = pcm_data->dma_ch;
406 ch = pcm_data->rdma_ch;
407 else
408 ch = pcm_data->wrdma_ch;
409 385
410 ret = regmap_read(drvdata->lpaif_map, 386 ret = regmap_read(drvdata->lpaif_map,
411 LPAIF_DMABASE_REG(v, ch, dir), &base_addr); 387 LPAIF_DMABASE_REG(v, ch, dir), &base_addr);
diff --git a/sound/soc/qcom/storm.c b/sound/soc/qcom/storm.c
index 2d833bffdba0..8fcac2ac3aa6 100644
--- a/sound/soc/qcom/storm.c
+++ b/sound/soc/qcom/storm.c
@@ -58,7 +58,7 @@ static int storm_ops_hw_params(struct snd_pcm_substream *substream,
58 return 0; 58 return 0;
59} 59}
60 60
61static struct snd_soc_ops storm_soc_ops = { 61static const struct snd_soc_ops storm_soc_ops = {
62 .hw_params = storm_ops_hw_params, 62 .hw_params = storm_ops_hw_params,
63}; 63};
64 64
diff --git a/sound/soc/rockchip/rk3399_gru_sound.c b/sound/soc/rockchip/rk3399_gru_sound.c
index 9ed735a6cf49..3475c61a5fa0 100644
--- a/sound/soc/rockchip/rk3399_gru_sound.c
+++ b/sound/soc/rockchip/rk3399_gru_sound.c
@@ -38,7 +38,7 @@
38 38
39#define SOUND_FS 256 39#define SOUND_FS 256
40 40
41unsigned int rt5514_dmic_delay; 41static unsigned int rt5514_dmic_delay;
42 42
43static struct snd_soc_jack rockchip_sound_jack; 43static struct snd_soc_jack rockchip_sound_jack;
44 44
@@ -228,15 +228,15 @@ static int rockchip_sound_da7219_init(struct snd_soc_pcm_runtime *rtd)
228 return 0; 228 return 0;
229} 229}
230 230
231static struct snd_soc_ops rockchip_sound_max98357a_ops = { 231static const struct snd_soc_ops rockchip_sound_max98357a_ops = {
232 .hw_params = rockchip_sound_max98357a_hw_params, 232 .hw_params = rockchip_sound_max98357a_hw_params,
233}; 233};
234 234
235static struct snd_soc_ops rockchip_sound_rt5514_ops = { 235static const struct snd_soc_ops rockchip_sound_rt5514_ops = {
236 .hw_params = rockchip_sound_rt5514_hw_params, 236 .hw_params = rockchip_sound_rt5514_hw_params,
237}; 237};
238 238
239static struct snd_soc_ops rockchip_sound_da7219_ops = { 239static const struct snd_soc_ops rockchip_sound_da7219_ops = {
240 .hw_params = rockchip_sound_da7219_hw_params, 240 .hw_params = rockchip_sound_da7219_hw_params,
241}; 241};
242 242
diff --git a/sound/soc/rockchip/rockchip_max98090.c b/sound/soc/rockchip/rockchip_max98090.c
index e70ffad07184..789d6f1e2b5f 100644
--- a/sound/soc/rockchip/rockchip_max98090.c
+++ b/sound/soc/rockchip/rockchip_max98090.c
@@ -119,7 +119,7 @@ static int rk_aif1_hw_params(struct snd_pcm_substream *substream,
119 return ret; 119 return ret;
120} 120}
121 121
122static struct snd_soc_ops rk_aif1_ops = { 122static const struct snd_soc_ops rk_aif1_ops = {
123 .hw_params = rk_aif1_hw_params, 123 .hw_params = rk_aif1_hw_params,
124}; 124};
125 125
diff --git a/sound/soc/rockchip/rockchip_rt5645.c b/sound/soc/rockchip/rockchip_rt5645.c
index 440a8026346a..9e0c17805807 100644
--- a/sound/soc/rockchip/rockchip_rt5645.c
+++ b/sound/soc/rockchip/rockchip_rt5645.c
@@ -135,7 +135,7 @@ static int rk_init(struct snd_soc_pcm_runtime *runtime)
135 &headset_jack); 135 &headset_jack);
136} 136}
137 137
138static struct snd_soc_ops rk_aif1_ops = { 138static const struct snd_soc_ops rk_aif1_ops = {
139 .hw_params = rk_aif1_hw_params, 139 .hw_params = rk_aif1_hw_params,
140}; 140};
141 141
diff --git a/sound/soc/samsung/Kconfig b/sound/soc/samsung/Kconfig
index f6023b46c107..7c423151ef7d 100644
--- a/sound/soc/samsung/Kconfig
+++ b/sound/soc/samsung/Kconfig
@@ -1,6 +1,7 @@
1menuconfig SND_SOC_SAMSUNG 1menuconfig SND_SOC_SAMSUNG
2 tristate "ASoC support for Samsung" 2 tristate "ASoC support for Samsung"
3 depends on (PLAT_SAMSUNG || ARCH_EXYNOS) 3 depends on PLAT_SAMSUNG || ARCH_EXYNOS || COMPILE_TEST
4 depends on COMMON_CLK
4 select SND_SOC_GENERIC_DMAENGINE_PCM 5 select SND_SOC_GENERIC_DMAENGINE_PCM
5 ---help--- 6 ---help---
6 Say Y or M if you want to add support for codecs attached to 7 Say Y or M if you want to add support for codecs attached to
@@ -22,10 +23,6 @@ config SND_S3C2412_SOC_I2S
22config SND_SAMSUNG_PCM 23config SND_SAMSUNG_PCM
23 tristate "Samsung PCM interface support" 24 tristate "Samsung PCM interface support"
24 25
25config SND_SAMSUNG_AC97
26 tristate
27 select SND_SOC_AC97_BUS
28
29config SND_SAMSUNG_SPDIF 26config SND_SAMSUNG_SPDIF
30 tristate "Samsung SPDIF transmitter support" 27 tristate "Samsung SPDIF transmitter support"
31 select SND_SOC_SPDIF 28 select SND_SOC_SPDIF
@@ -53,7 +50,7 @@ config SND_SOC_SAMSUNG_JIVE_WM8750
53 50
54config SND_SOC_SAMSUNG_SMDK_WM8580 51config SND_SOC_SAMSUNG_SMDK_WM8580
55 tristate "SoC I2S Audio support for WM8580 on SMDK" 52 tristate "SoC I2S Audio support for WM8580 on SMDK"
56 depends on MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110 53 depends on MACH_SMDK6410 || COMPILE_TEST
57 depends on I2C 54 depends on I2C
58 select SND_SOC_WM8580 55 select SND_SOC_WM8580
59 select SND_SAMSUNG_I2S 56 select SND_SAMSUNG_I2S
@@ -69,26 +66,6 @@ config SND_SOC_SAMSUNG_SMDK_WM8994
69 help 66 help
70 Say Y if you want to add support for SoC audio on the SMDKs. 67 Say Y if you want to add support for SoC audio on the SMDKs.
71 68
72config SND_SOC_SAMSUNG_SMDK2443_WM9710
73 tristate "SoC AC97 Audio support for SMDK2443 - WM9710"
74 depends on MACH_SMDK2443
75 select AC97_BUS
76 select SND_SOC_AC97_CODEC
77 select SND_SAMSUNG_AC97
78 help
79 Say Y if you want to add support for SoC audio on smdk2443
80 with the WM9710.
81
82config SND_SOC_SAMSUNG_LN2440SBC_ALC650
83 tristate "SoC AC97 Audio support for LN2440SBC - ALC650"
84 depends on ARCH_S3C24XX
85 select AC97_BUS
86 select SND_SOC_AC97_CODEC
87 select SND_SAMSUNG_AC97
88 help
89 Say Y if you want to add support for SoC audio on ln2440sbc
90 with the ALC650.
91
92config SND_SOC_SAMSUNG_S3C24XX_UDA134X 69config SND_SOC_SAMSUNG_S3C24XX_UDA134X
93 tristate "SoC I2S Audio support UDA134X wired to a S3C24XX" 70 tristate "SoC I2S Audio support UDA134X wired to a S3C24XX"
94 depends on ARCH_S3C24XX 71 depends on ARCH_S3C24XX
@@ -131,17 +108,10 @@ config SND_SOC_SAMSUNG_RX1950_UDA1380
131 help 108 help
132 This driver provides audio support for HP iPAQ RX1950 PDA. 109 This driver provides audio support for HP iPAQ RX1950 PDA.
133 110
134config SND_SOC_SAMSUNG_SMDK_WM9713
135 tristate "SoC AC97 Audio support for SMDK with WM9713"
136 depends on MACH_SMDK6410 || MACH_SMDKC100 || MACH_SMDKV210 || MACH_SMDKC110
137 select SND_SOC_WM9713
138 select SND_SAMSUNG_AC97
139 help
140 Say Y if you want to add support for SoC audio on the SMDK.
141
142config SND_SOC_SMARTQ 111config SND_SOC_SMARTQ
143 tristate "SoC I2S Audio support for SmartQ board" 112 tristate "SoC I2S Audio support for SmartQ board"
144 depends on MACH_SMARTQ && I2C 113 depends on MACH_SMARTQ || COMPILE_TEST
114 depends on I2C
145 select SND_SAMSUNG_I2S 115 select SND_SAMSUNG_I2S
146 select SND_SOC_WM8750 116 select SND_SOC_WM8750
147 117
@@ -151,15 +121,6 @@ config SND_SOC_SAMSUNG_SMDK_SPDIF
151 help 121 help
152 Say Y if you want to add support for SoC S/PDIF audio on the SMDK. 122 Say Y if you want to add support for SoC S/PDIF audio on the SMDK.
153 123
154config SND_SOC_SMDK_WM8580_PCM
155 tristate "SoC PCM Audio support for WM8580 on SMDK"
156 depends on MACH_SMDKV210 || MACH_SMDKC110
157 depends on I2C
158 select SND_SOC_WM8580
159 select SND_SAMSUNG_PCM
160 help
161 Say Y if you want to add support for SoC audio on the SMDK.
162
163config SND_SOC_SMDK_WM8994_PCM 124config SND_SOC_SMDK_WM8994_PCM
164 tristate "SoC PCM Audio support for WM8994 on SMDK" 125 tristate "SoC PCM Audio support for WM8994 on SMDK"
165 depends on I2C=y 126 depends on I2C=y
@@ -229,4 +190,13 @@ config SND_SOC_ARNDALE_RT5631_ALC5631
229 select SND_SAMSUNG_I2S 190 select SND_SAMSUNG_I2S
230 select SND_SOC_RT5631 191 select SND_SOC_RT5631
231 192
193config SND_SOC_SAMSUNG_TM2_WM5110
194 tristate "SoC I2S Audio support for WM5110 on TM2 board"
195 depends on SND_SOC_SAMSUNG && MFD_ARIZONA && I2C && SPI_MASTER
196 select SND_SOC_MAX98504
197 select SND_SOC_WM5110
198 select SND_SAMSUNG_I2S
199 help
200 Say Y if you want to add support for SoC audio on the TM2 board.
201
232endif #SND_SOC_SAMSUNG 202endif #SND_SOC_SAMSUNG
diff --git a/sound/soc/samsung/Makefile b/sound/soc/samsung/Makefile
index 5d03f5ce6916..b5df5e2e3d94 100644
--- a/sound/soc/samsung/Makefile
+++ b/sound/soc/samsung/Makefile
@@ -3,7 +3,6 @@ snd-soc-s3c-dma-objs := dmaengine.o
3snd-soc-idma-objs := idma.o 3snd-soc-idma-objs := idma.o
4snd-soc-s3c24xx-i2s-objs := s3c24xx-i2s.o 4snd-soc-s3c24xx-i2s-objs := s3c24xx-i2s.o
5snd-soc-s3c2412-i2s-objs := s3c2412-i2s.o 5snd-soc-s3c2412-i2s-objs := s3c2412-i2s.o
6snd-soc-ac97-objs := ac97.o
7snd-soc-s3c-i2s-v2-objs := s3c-i2s-v2.o 6snd-soc-s3c-i2s-v2-objs := s3c-i2s-v2.o
8snd-soc-samsung-spdif-objs := spdif.o 7snd-soc-samsung-spdif-objs := spdif.o
9snd-soc-pcm-objs := pcm.o 8snd-soc-pcm-objs := pcm.o
@@ -11,7 +10,6 @@ snd-soc-i2s-objs := i2s.o
11 10
12obj-$(CONFIG_SND_SOC_SAMSUNG) += snd-soc-s3c-dma.o 11obj-$(CONFIG_SND_SOC_SAMSUNG) += snd-soc-s3c-dma.o
13obj-$(CONFIG_SND_S3C24XX_I2S) += snd-soc-s3c24xx-i2s.o 12obj-$(CONFIG_SND_S3C24XX_I2S) += snd-soc-s3c24xx-i2s.o
14obj-$(CONFIG_SND_SAMSUNG_AC97) += snd-soc-ac97.o
15obj-$(CONFIG_SND_S3C2412_SOC_I2S) += snd-soc-s3c2412-i2s.o 13obj-$(CONFIG_SND_S3C2412_SOC_I2S) += snd-soc-s3c2412-i2s.o
16obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o 14obj-$(CONFIG_SND_S3C_I2SV2_SOC) += snd-soc-s3c-i2s-v2.o
17obj-$(CONFIG_SND_SAMSUNG_SPDIF) += snd-soc-samsung-spdif.o 15obj-$(CONFIG_SND_SAMSUNG_SPDIF) += snd-soc-samsung-spdif.o
@@ -36,7 +34,6 @@ snd-soc-snow-objs := snow.o
36snd-soc-smdk-wm9713-objs := smdk_wm9713.o 34snd-soc-smdk-wm9713-objs := smdk_wm9713.o
37snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o 35snd-soc-s3c64xx-smartq-wm8987-objs := smartq_wm8987.o
38snd-soc-smdk-spdif-objs := smdk_spdif.o 36snd-soc-smdk-spdif-objs := smdk_spdif.o
39snd-soc-smdk-wm8580pcm-objs := smdk_wm8580pcm.o
40snd-soc-smdk-wm8994pcm-objs := smdk_wm8994pcm.o 37snd-soc-smdk-wm8994pcm-objs := smdk_wm8994pcm.o
41snd-soc-speyside-objs := speyside.o 38snd-soc-speyside-objs := speyside.o
42snd-soc-tobermory-objs := tobermory.o 39snd-soc-tobermory-objs := tobermory.o
@@ -44,11 +41,10 @@ snd-soc-lowland-objs := lowland.o
44snd-soc-littlemill-objs := littlemill.o 41snd-soc-littlemill-objs := littlemill.o
45snd-soc-bells-objs := bells.o 42snd-soc-bells-objs := bells.o
46snd-soc-arndale-rt5631-objs := arndale_rt5631.o 43snd-soc-arndale-rt5631-objs := arndale_rt5631.o
44snd-soc-tm2-wm5110-objs := tm2_wm5110.o
47 45
48obj-$(CONFIG_SND_SOC_SAMSUNG_JIVE_WM8750) += snd-soc-jive-wm8750.o 46obj-$(CONFIG_SND_SOC_SAMSUNG_JIVE_WM8750) += snd-soc-jive-wm8750.o
49obj-$(CONFIG_SND_SOC_SAMSUNG_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o 47obj-$(CONFIG_SND_SOC_SAMSUNG_NEO1973_WM8753) += snd-soc-neo1973-wm8753.o
50obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK2443_WM9710) += snd-soc-smdk2443-wm9710.o
51obj-$(CONFIG_SND_SOC_SAMSUNG_LN2440SBC_ALC650) += snd-soc-ln2440sbc-alc650.o
52obj-$(CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X) += snd-soc-s3c24xx-uda134x.o 48obj-$(CONFIG_SND_SOC_SAMSUNG_S3C24XX_UDA134X) += snd-soc-s3c24xx-uda134x.o
53obj-$(CONFIG_SND_SOC_SAMSUNG_SIMTEC) += snd-soc-s3c24xx-simtec.o 49obj-$(CONFIG_SND_SOC_SAMSUNG_SIMTEC) += snd-soc-s3c24xx-simtec.o
54obj-$(CONFIG_SND_SOC_SAMSUNG_SIMTEC_HERMES) += snd-soc-s3c24xx-simtec-hermes.o 50obj-$(CONFIG_SND_SOC_SAMSUNG_SIMTEC_HERMES) += snd-soc-s3c24xx-simtec-hermes.o
@@ -58,10 +54,8 @@ obj-$(CONFIG_SND_SOC_SAMSUNG_RX1950_UDA1380) += snd-soc-rx1950-uda1380.o
58obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8580) += snd-soc-smdk-wm8580.o 54obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8580) += snd-soc-smdk-wm8580.o
59obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994) += snd-soc-smdk-wm8994.o 55obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM8994) += snd-soc-smdk-wm8994.o
60obj-$(CONFIG_SND_SOC_SNOW) += snd-soc-snow.o 56obj-$(CONFIG_SND_SOC_SNOW) += snd-soc-snow.o
61obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_WM9713) += snd-soc-smdk-wm9713.o
62obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o 57obj-$(CONFIG_SND_SOC_SMARTQ) += snd-soc-s3c64xx-smartq-wm8987.o
63obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF) += snd-soc-smdk-spdif.o 58obj-$(CONFIG_SND_SOC_SAMSUNG_SMDK_SPDIF) += snd-soc-smdk-spdif.o
64obj-$(CONFIG_SND_SOC_SMDK_WM8580_PCM) += snd-soc-smdk-wm8580pcm.o
65obj-$(CONFIG_SND_SOC_SMDK_WM8994_PCM) += snd-soc-smdk-wm8994pcm.o 59obj-$(CONFIG_SND_SOC_SMDK_WM8994_PCM) += snd-soc-smdk-wm8994pcm.o
66obj-$(CONFIG_SND_SOC_SPEYSIDE) += snd-soc-speyside.o 60obj-$(CONFIG_SND_SOC_SPEYSIDE) += snd-soc-speyside.o
67obj-$(CONFIG_SND_SOC_TOBERMORY) += snd-soc-tobermory.o 61obj-$(CONFIG_SND_SOC_TOBERMORY) += snd-soc-tobermory.o
@@ -69,3 +63,4 @@ obj-$(CONFIG_SND_SOC_LOWLAND) += snd-soc-lowland.o
69obj-$(CONFIG_SND_SOC_LITTLEMILL) += snd-soc-littlemill.o 63obj-$(CONFIG_SND_SOC_LITTLEMILL) += snd-soc-littlemill.o
70obj-$(CONFIG_SND_SOC_BELLS) += snd-soc-bells.o 64obj-$(CONFIG_SND_SOC_BELLS) += snd-soc-bells.o
71obj-$(CONFIG_SND_SOC_ARNDALE_RT5631_ALC5631) += snd-soc-arndale-rt5631.o 65obj-$(CONFIG_SND_SOC_ARNDALE_RT5631_ALC5631) += snd-soc-arndale-rt5631.o
66obj-$(CONFIG_SND_SOC_SAMSUNG_TM2_WM5110) += snd-soc-tm2-wm5110.o
diff --git a/sound/soc/samsung/ac97.c b/sound/soc/samsung/ac97.c
deleted file mode 100644
index cbc0023c2bc8..000000000000
--- a/sound/soc/samsung/ac97.c
+++ /dev/null
@@ -1,437 +0,0 @@
1/* sound/soc/samsung/ac97.c
2 *
3 * ALSA SoC Audio Layer - S3C AC97 Controller driver
4 * Evolved from s3c2443-ac97.c
5 *
6 * Copyright (c) 2010 Samsung Electronics Co. Ltd
7 * Author: Jaswinder Singh <jassisinghbrar@gmail.com>
8 * Credits: Graeme Gregory, Sean Choi
9 *
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2 as
12 * published by the Free Software Foundation.
13 */
14
15#include <linux/io.h>
16#include <linux/delay.h>
17#include <linux/clk.h>
18#include <linux/module.h>
19
20#include <sound/soc.h>
21
22#include "regs-ac97.h"
23#include <linux/platform_data/asoc-s3c.h>
24
25#include "dma.h"
26
27#define AC_CMD_ADDR(x) (x << 16)
28#define AC_CMD_DATA(x) (x & 0xffff)
29
30#define S3C_AC97_DAI_PCM 0
31#define S3C_AC97_DAI_MIC 1
32
33struct s3c_ac97_info {
34 struct clk *ac97_clk;
35 void __iomem *regs;
36 struct mutex lock;
37 struct completion done;
38};
39static struct s3c_ac97_info s3c_ac97;
40
41static struct snd_dmaengine_dai_dma_data s3c_ac97_pcm_out = {
42 .addr_width = 4,
43};
44
45static struct snd_dmaengine_dai_dma_data s3c_ac97_pcm_in = {
46 .addr_width = 4,
47};
48
49static struct snd_dmaengine_dai_dma_data s3c_ac97_mic_in = {
50 .addr_width = 4,
51};
52
53static void s3c_ac97_activate(struct snd_ac97 *ac97)
54{
55 u32 ac_glbctrl, stat;
56
57 stat = readl(s3c_ac97.regs + S3C_AC97_GLBSTAT) & 0x7;
58 if (stat == S3C_AC97_GLBSTAT_MAINSTATE_ACTIVE)
59 return; /* Return if already active */
60
61 reinit_completion(&s3c_ac97.done);
62
63 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
64 ac_glbctrl = S3C_AC97_GLBCTRL_ACLINKON;
65 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
66 msleep(1);
67
68 ac_glbctrl |= S3C_AC97_GLBCTRL_TRANSFERDATAENABLE;
69 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
70 msleep(1);
71
72 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
73 ac_glbctrl |= S3C_AC97_GLBCTRL_CODECREADYIE;
74 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
75
76 if (!wait_for_completion_timeout(&s3c_ac97.done, HZ))
77 pr_err("AC97: Unable to activate!\n");
78}
79
80static unsigned short s3c_ac97_read(struct snd_ac97 *ac97,
81 unsigned short reg)
82{
83 u32 ac_glbctrl, ac_codec_cmd;
84 u32 stat, addr, data;
85
86 mutex_lock(&s3c_ac97.lock);
87
88 s3c_ac97_activate(ac97);
89
90 reinit_completion(&s3c_ac97.done);
91
92 ac_codec_cmd = readl(s3c_ac97.regs + S3C_AC97_CODEC_CMD);
93 ac_codec_cmd = S3C_AC97_CODEC_CMD_READ | AC_CMD_ADDR(reg);
94 writel(ac_codec_cmd, s3c_ac97.regs + S3C_AC97_CODEC_CMD);
95
96 udelay(50);
97
98 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
99 ac_glbctrl |= S3C_AC97_GLBCTRL_CODECREADYIE;
100 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
101
102 if (!wait_for_completion_timeout(&s3c_ac97.done, HZ))
103 pr_err("AC97: Unable to read!\n");
104
105 stat = readl(s3c_ac97.regs + S3C_AC97_STAT);
106 addr = (stat >> 16) & 0x7f;
107 data = (stat & 0xffff);
108
109 if (addr != reg)
110 pr_err("ac97: req addr = %02x, rep addr = %02x\n",
111 reg, addr);
112
113 mutex_unlock(&s3c_ac97.lock);
114
115 return (unsigned short)data;
116}
117
118static void s3c_ac97_write(struct snd_ac97 *ac97, unsigned short reg,
119 unsigned short val)
120{
121 u32 ac_glbctrl, ac_codec_cmd;
122
123 mutex_lock(&s3c_ac97.lock);
124
125 s3c_ac97_activate(ac97);
126
127 reinit_completion(&s3c_ac97.done);
128
129 ac_codec_cmd = readl(s3c_ac97.regs + S3C_AC97_CODEC_CMD);
130 ac_codec_cmd = AC_CMD_ADDR(reg) | AC_CMD_DATA(val);
131 writel(ac_codec_cmd, s3c_ac97.regs + S3C_AC97_CODEC_CMD);
132
133 udelay(50);
134
135 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
136 ac_glbctrl |= S3C_AC97_GLBCTRL_CODECREADYIE;
137 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
138
139 if (!wait_for_completion_timeout(&s3c_ac97.done, HZ))
140 pr_err("AC97: Unable to write!\n");
141
142 ac_codec_cmd = readl(s3c_ac97.regs + S3C_AC97_CODEC_CMD);
143 ac_codec_cmd |= S3C_AC97_CODEC_CMD_READ;
144 writel(ac_codec_cmd, s3c_ac97.regs + S3C_AC97_CODEC_CMD);
145
146 mutex_unlock(&s3c_ac97.lock);
147}
148
149static void s3c_ac97_cold_reset(struct snd_ac97 *ac97)
150{
151 pr_debug("AC97: Cold reset\n");
152 writel(S3C_AC97_GLBCTRL_COLDRESET,
153 s3c_ac97.regs + S3C_AC97_GLBCTRL);
154 msleep(1);
155
156 writel(0, s3c_ac97.regs + S3C_AC97_GLBCTRL);
157 msleep(1);
158}
159
160static void s3c_ac97_warm_reset(struct snd_ac97 *ac97)
161{
162 u32 stat;
163
164 stat = readl(s3c_ac97.regs + S3C_AC97_GLBSTAT) & 0x7;
165 if (stat == S3C_AC97_GLBSTAT_MAINSTATE_ACTIVE)
166 return; /* Return if already active */
167
168 pr_debug("AC97: Warm reset\n");
169
170 writel(S3C_AC97_GLBCTRL_WARMRESET, s3c_ac97.regs + S3C_AC97_GLBCTRL);
171 msleep(1);
172
173 writel(0, s3c_ac97.regs + S3C_AC97_GLBCTRL);
174 msleep(1);
175
176 s3c_ac97_activate(ac97);
177}
178
179static irqreturn_t s3c_ac97_irq(int irq, void *dev_id)
180{
181 u32 ac_glbctrl, ac_glbstat;
182
183 ac_glbstat = readl(s3c_ac97.regs + S3C_AC97_GLBSTAT);
184
185 if (ac_glbstat & S3C_AC97_GLBSTAT_CODECREADY) {
186
187 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
188 ac_glbctrl &= ~S3C_AC97_GLBCTRL_CODECREADYIE;
189 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
190
191 complete(&s3c_ac97.done);
192 }
193
194 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
195 ac_glbctrl |= (1<<30); /* Clear interrupt */
196 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
197
198 return IRQ_HANDLED;
199}
200
201static struct snd_ac97_bus_ops s3c_ac97_ops = {
202 .read = s3c_ac97_read,
203 .write = s3c_ac97_write,
204 .warm_reset = s3c_ac97_warm_reset,
205 .reset = s3c_ac97_cold_reset,
206};
207
208static int s3c_ac97_trigger(struct snd_pcm_substream *substream, int cmd,
209 struct snd_soc_dai *dai)
210{
211 u32 ac_glbctrl;
212
213 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
214 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
215 ac_glbctrl &= ~S3C_AC97_GLBCTRL_PCMINTM_MASK;
216 else
217 ac_glbctrl &= ~S3C_AC97_GLBCTRL_PCMOUTTM_MASK;
218
219 switch (cmd) {
220 case SNDRV_PCM_TRIGGER_START:
221 case SNDRV_PCM_TRIGGER_RESUME:
222 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
223 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE)
224 ac_glbctrl |= S3C_AC97_GLBCTRL_PCMINTM_DMA;
225 else
226 ac_glbctrl |= S3C_AC97_GLBCTRL_PCMOUTTM_DMA;
227 break;
228
229 case SNDRV_PCM_TRIGGER_STOP:
230 case SNDRV_PCM_TRIGGER_SUSPEND:
231 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
232 break;
233 }
234
235 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
236
237 return 0;
238}
239
240static int s3c_ac97_mic_trigger(struct snd_pcm_substream *substream,
241 int cmd, struct snd_soc_dai *dai)
242{
243 u32 ac_glbctrl;
244
245 ac_glbctrl = readl(s3c_ac97.regs + S3C_AC97_GLBCTRL);
246 ac_glbctrl &= ~S3C_AC97_GLBCTRL_MICINTM_MASK;
247
248 switch (cmd) {
249 case SNDRV_PCM_TRIGGER_START:
250 case SNDRV_PCM_TRIGGER_RESUME:
251 case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
252 ac_glbctrl |= S3C_AC97_GLBCTRL_MICINTM_DMA;
253 break;
254
255 case SNDRV_PCM_TRIGGER_STOP:
256 case SNDRV_PCM_TRIGGER_SUSPEND:
257 case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
258 break;
259 }
260
261 writel(ac_glbctrl, s3c_ac97.regs + S3C_AC97_GLBCTRL);
262
263 return 0;
264}
265
266static const struct snd_soc_dai_ops s3c_ac97_dai_ops = {
267 .trigger = s3c_ac97_trigger,
268};
269
270static const struct snd_soc_dai_ops s3c_ac97_mic_dai_ops = {
271 .trigger = s3c_ac97_mic_trigger,
272};
273
274static int s3c_ac97_dai_probe(struct snd_soc_dai *dai)
275{
276 snd_soc_dai_init_dma_data(dai, &s3c_ac97_pcm_out, &s3c_ac97_pcm_in);
277
278 return 0;
279}
280
281static int s3c_ac97_mic_dai_probe(struct snd_soc_dai *dai)
282{
283 snd_soc_dai_init_dma_data(dai, NULL, &s3c_ac97_mic_in);
284
285 return 0;
286}
287
288static struct snd_soc_dai_driver s3c_ac97_dai[] = {
289 [S3C_AC97_DAI_PCM] = {
290 .name = "samsung-ac97",
291 .bus_control = true,
292 .playback = {
293 .stream_name = "AC97 Playback",
294 .channels_min = 2,
295 .channels_max = 2,
296 .rates = SNDRV_PCM_RATE_8000_48000,
297 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
298 .capture = {
299 .stream_name = "AC97 Capture",
300 .channels_min = 2,
301 .channels_max = 2,
302 .rates = SNDRV_PCM_RATE_8000_48000,
303 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
304 .probe = s3c_ac97_dai_probe,
305 .ops = &s3c_ac97_dai_ops,
306 },
307 [S3C_AC97_DAI_MIC] = {
308 .name = "samsung-ac97-mic",
309 .bus_control = true,
310 .capture = {
311 .stream_name = "AC97 Mic Capture",
312 .channels_min = 1,
313 .channels_max = 1,
314 .rates = SNDRV_PCM_RATE_8000_48000,
315 .formats = SNDRV_PCM_FMTBIT_S16_LE,},
316 .probe = s3c_ac97_mic_dai_probe,
317 .ops = &s3c_ac97_mic_dai_ops,
318 },
319};
320
321static const struct snd_soc_component_driver s3c_ac97_component = {
322 .name = "s3c-ac97",
323};
324
325static int s3c_ac97_probe(struct platform_device *pdev)
326{
327 struct resource *mem_res, *irq_res;
328 struct s3c_audio_pdata *ac97_pdata;
329 int ret;
330
331 ac97_pdata = pdev->dev.platform_data;
332 if (!ac97_pdata || !ac97_pdata->cfg_gpio) {
333 dev_err(&pdev->dev, "cfg_gpio callback not provided!\n");
334 return -EINVAL;
335 }
336
337 /* Check for availability of necessary resource */
338 irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
339 if (!irq_res) {
340 dev_err(&pdev->dev, "AC97 IRQ not provided!\n");
341 return -ENXIO;
342 }
343
344 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
345 s3c_ac97.regs = devm_ioremap_resource(&pdev->dev, mem_res);
346 if (IS_ERR(s3c_ac97.regs))
347 return PTR_ERR(s3c_ac97.regs);
348
349 s3c_ac97_pcm_out.filter_data = ac97_pdata->dma_playback;
350 s3c_ac97_pcm_out.addr = mem_res->start + S3C_AC97_PCM_DATA;
351 s3c_ac97_pcm_in.filter_data = ac97_pdata->dma_capture;
352 s3c_ac97_pcm_in.addr = mem_res->start + S3C_AC97_PCM_DATA;
353 s3c_ac97_mic_in.filter_data = ac97_pdata->dma_capture_mic;
354 s3c_ac97_mic_in.addr = mem_res->start + S3C_AC97_MIC_DATA;
355
356 init_completion(&s3c_ac97.done);
357 mutex_init(&s3c_ac97.lock);
358
359 s3c_ac97.ac97_clk = devm_clk_get(&pdev->dev, "ac97");
360 if (IS_ERR(s3c_ac97.ac97_clk)) {
361 dev_err(&pdev->dev, "ac97 failed to get ac97_clock\n");
362 ret = -ENODEV;
363 goto err2;
364 }
365 clk_prepare_enable(s3c_ac97.ac97_clk);
366
367 if (ac97_pdata->cfg_gpio(pdev)) {
368 dev_err(&pdev->dev, "Unable to configure gpio\n");
369 ret = -EINVAL;
370 goto err3;
371 }
372
373 ret = request_irq(irq_res->start, s3c_ac97_irq,
374 0, "AC97", NULL);
375 if (ret < 0) {
376 dev_err(&pdev->dev, "ac97: interrupt request failed.\n");
377 goto err4;
378 }
379
380 ret = snd_soc_set_ac97_ops(&s3c_ac97_ops);
381 if (ret != 0) {
382 dev_err(&pdev->dev, "Failed to set AC'97 ops: %d\n", ret);
383 goto err4;
384 }
385
386 ret = samsung_asoc_dma_platform_register(&pdev->dev,
387 ac97_pdata->dma_filter,
388 NULL, NULL);
389 if (ret) {
390 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
391 goto err5;
392 }
393
394 ret = devm_snd_soc_register_component(&pdev->dev, &s3c_ac97_component,
395 s3c_ac97_dai, ARRAY_SIZE(s3c_ac97_dai));
396 if (ret)
397 goto err5;
398
399 return 0;
400err5:
401 free_irq(irq_res->start, NULL);
402err4:
403err3:
404 clk_disable_unprepare(s3c_ac97.ac97_clk);
405err2:
406 snd_soc_set_ac97_ops(NULL);
407 return ret;
408}
409
410static int s3c_ac97_remove(struct platform_device *pdev)
411{
412 struct resource *irq_res;
413
414 irq_res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
415 if (irq_res)
416 free_irq(irq_res->start, NULL);
417
418 clk_disable_unprepare(s3c_ac97.ac97_clk);
419 snd_soc_set_ac97_ops(NULL);
420
421 return 0;
422}
423
424static struct platform_driver s3c_ac97_driver = {
425 .probe = s3c_ac97_probe,
426 .remove = s3c_ac97_remove,
427 .driver = {
428 .name = "samsung-ac97",
429 },
430};
431
432module_platform_driver(s3c_ac97_driver);
433
434MODULE_AUTHOR("Jaswinder Singh, <jassisinghbrar@gmail.com>");
435MODULE_DESCRIPTION("AC97 driver for the Samsung SoC");
436MODULE_LICENSE("GPL");
437MODULE_ALIAS("platform:samsung-ac97");
diff --git a/sound/soc/samsung/dmaengine.c b/sound/soc/samsung/dmaengine.c
index 9104c98deeb7..cda656e4afc6 100644
--- a/sound/soc/samsung/dmaengine.c
+++ b/sound/soc/samsung/dmaengine.c
@@ -37,12 +37,8 @@ int samsung_asoc_dma_platform_register(struct device *dev, dma_filter_fn filter,
37 pcm_conf->prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config; 37 pcm_conf->prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config;
38 pcm_conf->compat_filter_fn = filter; 38 pcm_conf->compat_filter_fn = filter;
39 39
40 if (dev->of_node) { 40 pcm_conf->chan_names[SNDRV_PCM_STREAM_PLAYBACK] = tx;
41 pcm_conf->chan_names[SNDRV_PCM_STREAM_PLAYBACK] = tx; 41 pcm_conf->chan_names[SNDRV_PCM_STREAM_CAPTURE] = rx;
42 pcm_conf->chan_names[SNDRV_PCM_STREAM_CAPTURE] = rx;
43 } else {
44 flags |= SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME;
45 }
46 42
47 return devm_snd_dmaengine_pcm_register(dev, pcm_conf, flags); 43 return devm_snd_dmaengine_pcm_register(dev, pcm_conf, flags);
48} 44}
diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c
index 7825bff45ae3..e00974bc5616 100644
--- a/sound/soc/samsung/i2s.c
+++ b/sound/soc/samsung/i2s.c
@@ -1029,12 +1029,13 @@ static int samsung_i2s_dai_probe(struct snd_soc_dai *dai)
1029static int samsung_i2s_dai_remove(struct snd_soc_dai *dai) 1029static int samsung_i2s_dai_remove(struct snd_soc_dai *dai)
1030{ 1030{
1031 struct i2s_dai *i2s = snd_soc_dai_get_drvdata(dai); 1031 struct i2s_dai *i2s = snd_soc_dai_get_drvdata(dai);
1032 unsigned long flags;
1032 1033
1033 if (!is_secondary(i2s)) { 1034 if (!is_secondary(i2s)) {
1034 if (i2s->quirks & QUIRK_NEED_RSTCLR) { 1035 if (i2s->quirks & QUIRK_NEED_RSTCLR) {
1035 spin_lock(i2s->lock); 1036 spin_lock_irqsave(i2s->lock, flags);
1036 writel(0, i2s->addr + I2SCON); 1037 writel(0, i2s->addr + I2SCON);
1037 spin_unlock(i2s->lock); 1038 spin_unlock_irqrestore(i2s->lock, flags);
1038 } 1039 }
1039 } 1040 }
1040 1041
@@ -1304,8 +1305,6 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1304 } 1305 }
1305 pri_dai->dma_playback.addr = regs_base + I2STXD; 1306 pri_dai->dma_playback.addr = regs_base + I2STXD;
1306 pri_dai->dma_capture.addr = regs_base + I2SRXD; 1307 pri_dai->dma_capture.addr = regs_base + I2SRXD;
1307 pri_dai->dma_playback.chan_name = "tx";
1308 pri_dai->dma_capture.chan_name = "rx";
1309 pri_dai->dma_playback.addr_width = 4; 1308 pri_dai->dma_playback.addr_width = 4;
1310 pri_dai->dma_capture.addr_width = 4; 1309 pri_dai->dma_capture.addr_width = 4;
1311 pri_dai->quirks = quirks; 1310 pri_dai->quirks = quirks;
@@ -1330,7 +1329,6 @@ static int samsung_i2s_probe(struct platform_device *pdev)
1330 sec_dai->lock = &pri_dai->spinlock; 1329 sec_dai->lock = &pri_dai->spinlock;
1331 sec_dai->variant_regs = pri_dai->variant_regs; 1330 sec_dai->variant_regs = pri_dai->variant_regs;
1332 sec_dai->dma_playback.addr = regs_base + I2STXDS; 1331 sec_dai->dma_playback.addr = regs_base + I2STXDS;
1333 sec_dai->dma_playback.chan_name = "tx-sec";
1334 1332
1335 if (!np) { 1333 if (!np) {
1336 sec_dai->dma_playback.filter_data = i2s_pdata->dma_play_sec; 1334 sec_dai->dma_playback.filter_data = i2s_pdata->dma_play_sec;
diff --git a/sound/soc/samsung/ln2440sbc_alc650.c b/sound/soc/samsung/ln2440sbc_alc650.c
deleted file mode 100644
index 9342fc270c2b..000000000000
--- a/sound/soc/samsung/ln2440sbc_alc650.c
+++ /dev/null
@@ -1,72 +0,0 @@
1/*
2 * SoC audio for ln2440sbc
3 *
4 * Copyright 2007 KonekTel, a.s.
5 * Author: Ivan Kuten
6 * ivan.kuten@promwad.com
7 *
8 * Heavily based on smdk2443_wm9710.c
9 * Copyright 2007 Wolfson Microelectronics PLC.
10 * Author: Graeme Gregory
11 * graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
12 *
13 * This program is free software; you can redistribute it and/or modify
14 * it under the terms of the GNU General Public License version 2 as
15 * published by the Free Software Foundation.
16 *
17 */
18
19#include <linux/module.h>
20#include <sound/soc.h>
21
22static struct snd_soc_card ln2440sbc;
23
24static struct snd_soc_dai_link ln2440sbc_dai[] = {
25{
26 .name = "AC97",
27 .stream_name = "AC97 HiFi",
28 .cpu_dai_name = "samsung-ac97",
29 .codec_dai_name = "ac97-hifi",
30 .codec_name = "ac97-codec",
31 .platform_name = "samsung-ac97",
32},
33};
34
35static struct snd_soc_card ln2440sbc = {
36 .name = "LN2440SBC",
37 .owner = THIS_MODULE,
38 .dai_link = ln2440sbc_dai,
39 .num_links = ARRAY_SIZE(ln2440sbc_dai),
40};
41
42static struct platform_device *ln2440sbc_snd_ac97_device;
43
44static int __init ln2440sbc_init(void)
45{
46 int ret;
47
48 ln2440sbc_snd_ac97_device = platform_device_alloc("soc-audio", -1);
49 if (!ln2440sbc_snd_ac97_device)
50 return -ENOMEM;
51
52 platform_set_drvdata(ln2440sbc_snd_ac97_device, &ln2440sbc);
53 ret = platform_device_add(ln2440sbc_snd_ac97_device);
54
55 if (ret)
56 platform_device_put(ln2440sbc_snd_ac97_device);
57
58 return ret;
59}
60
61static void __exit ln2440sbc_exit(void)
62{
63 platform_device_unregister(ln2440sbc_snd_ac97_device);
64}
65
66module_init(ln2440sbc_init);
67module_exit(ln2440sbc_exit);
68
69/* Module information */
70MODULE_AUTHOR("Ivan Kuten");
71MODULE_DESCRIPTION("ALSA SoC ALC650 LN2440SBC");
72MODULE_LICENSE("GPL");
diff --git a/sound/soc/samsung/pcm.c b/sound/soc/samsung/pcm.c
index c484985812ed..d50a6377c23d 100644
--- a/sound/soc/samsung/pcm.c
+++ b/sound/soc/samsung/pcm.c
@@ -499,13 +499,6 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
499 499
500 pcm_pdata = pdev->dev.platform_data; 500 pcm_pdata = pdev->dev.platform_data;
501 501
502 /* Check for availability of necessary resource */
503 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
504 if (!mem_res) {
505 dev_err(&pdev->dev, "Unable to get register resource\n");
506 return -ENXIO;
507 }
508
509 if (pcm_pdata && pcm_pdata->cfg_gpio && pcm_pdata->cfg_gpio(pdev)) { 502 if (pcm_pdata && pcm_pdata->cfg_gpio && pcm_pdata->cfg_gpio(pdev)) {
510 dev_err(&pdev->dev, "Unable to configure gpio\n"); 503 dev_err(&pdev->dev, "Unable to configure gpio\n");
511 return -EINVAL; 504 return -EINVAL;
@@ -519,36 +512,26 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
519 /* Default is 128fs */ 512 /* Default is 128fs */
520 pcm->sclk_per_fs = 128; 513 pcm->sclk_per_fs = 128;
521 514
515 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
516 pcm->regs = devm_ioremap_resource(&pdev->dev, mem_res);
517 if (IS_ERR(pcm->regs))
518 return PTR_ERR(pcm->regs);
519
522 pcm->cclk = devm_clk_get(&pdev->dev, "audio-bus"); 520 pcm->cclk = devm_clk_get(&pdev->dev, "audio-bus");
523 if (IS_ERR(pcm->cclk)) { 521 if (IS_ERR(pcm->cclk)) {
524 dev_err(&pdev->dev, "failed to get audio-bus\n"); 522 dev_err(&pdev->dev, "failed to get audio-bus clock\n");
525 ret = PTR_ERR(pcm->cclk); 523 return PTR_ERR(pcm->cclk);
526 goto err1;
527 } 524 }
528 clk_prepare_enable(pcm->cclk); 525 clk_prepare_enable(pcm->cclk);
529 526
530 /* record our pcm structure for later use in the callbacks */ 527 /* record our pcm structure for later use in the callbacks */
531 dev_set_drvdata(&pdev->dev, pcm); 528 dev_set_drvdata(&pdev->dev, pcm);
532 529
533 if (!request_mem_region(mem_res->start,
534 resource_size(mem_res), "samsung-pcm")) {
535 dev_err(&pdev->dev, "Unable to request register region\n");
536 ret = -EBUSY;
537 goto err2;
538 }
539
540 pcm->regs = ioremap(mem_res->start, 0x100);
541 if (pcm->regs == NULL) {
542 dev_err(&pdev->dev, "cannot ioremap registers\n");
543 ret = -ENXIO;
544 goto err3;
545 }
546
547 pcm->pclk = devm_clk_get(&pdev->dev, "pcm"); 530 pcm->pclk = devm_clk_get(&pdev->dev, "pcm");
548 if (IS_ERR(pcm->pclk)) { 531 if (IS_ERR(pcm->pclk)) {
549 dev_err(&pdev->dev, "failed to get pcm_clock\n"); 532 dev_err(&pdev->dev, "failed to get pcm clock\n");
550 ret = -ENOENT; 533 ret = PTR_ERR(pcm->pclk);
551 goto err4; 534 goto err_dis_cclk;
552 } 535 }
553 clk_prepare_enable(pcm->pclk); 536 clk_prepare_enable(pcm->pclk);
554 537
@@ -569,7 +552,7 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
569 NULL, NULL); 552 NULL, NULL);
570 if (ret) { 553 if (ret) {
571 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret); 554 dev_err(&pdev->dev, "failed to get register DMA: %d\n", ret);
572 goto err5; 555 goto err_dis_pclk;
573 } 556 }
574 557
575 pm_runtime_enable(&pdev->dev); 558 pm_runtime_enable(&pdev->dev);
@@ -578,36 +561,25 @@ static int s3c_pcm_dev_probe(struct platform_device *pdev)
578 &s3c_pcm_dai[pdev->id], 1); 561 &s3c_pcm_dai[pdev->id], 1);
579 if (ret != 0) { 562 if (ret != 0) {
580 dev_err(&pdev->dev, "failed to get register DAI: %d\n", ret); 563 dev_err(&pdev->dev, "failed to get register DAI: %d\n", ret);
581 goto err6; 564 goto err_dis_pm;
582 } 565 }
583 566
584 return 0; 567 return 0;
585err6: 568
569err_dis_pm:
586 pm_runtime_disable(&pdev->dev); 570 pm_runtime_disable(&pdev->dev);
587err5: 571err_dis_pclk:
588 clk_disable_unprepare(pcm->pclk); 572 clk_disable_unprepare(pcm->pclk);
589err4: 573err_dis_cclk:
590 iounmap(pcm->regs);
591err3:
592 release_mem_region(mem_res->start, resource_size(mem_res));
593err2:
594 clk_disable_unprepare(pcm->cclk); 574 clk_disable_unprepare(pcm->cclk);
595err1:
596 return ret; 575 return ret;
597} 576}
598 577
599static int s3c_pcm_dev_remove(struct platform_device *pdev) 578static int s3c_pcm_dev_remove(struct platform_device *pdev)
600{ 579{
601 struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id]; 580 struct s3c_pcm_info *pcm = &s3c_pcm[pdev->id];
602 struct resource *mem_res;
603 581
604 pm_runtime_disable(&pdev->dev); 582 pm_runtime_disable(&pdev->dev);
605
606 iounmap(pcm->regs);
607
608 mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
609 release_mem_region(mem_res->start, resource_size(mem_res));
610
611 clk_disable_unprepare(pcm->cclk); 583 clk_disable_unprepare(pcm->cclk);
612 clk_disable_unprepare(pcm->pclk); 584 clk_disable_unprepare(pcm->pclk);
613 585
diff --git a/sound/soc/samsung/regs-ac97.h b/sound/soc/samsung/regs-ac97.h
deleted file mode 100644
index a71be45bbffc..000000000000
--- a/sound/soc/samsung/regs-ac97.h
+++ /dev/null
@@ -1,66 +0,0 @@
1/*
2 * Copyright (c) 2006 Simtec Electronics <linux@simtec.co.uk>
3 * http://www.simtec.co.uk/products/SWLINUX/
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * S3C2440 AC97 Controller
10*/
11
12#ifndef __SAMSUNG_REGS_AC97_H__
13#define __SAMSUNG_REGS_AC97_H__
14
15#define S3C_AC97_GLBCTRL (0x00)
16
17#define S3C_AC97_GLBCTRL_CODECREADYIE (1<<22)
18#define S3C_AC97_GLBCTRL_PCMOUTURIE (1<<21)
19#define S3C_AC97_GLBCTRL_PCMINORIE (1<<20)
20#define S3C_AC97_GLBCTRL_MICINORIE (1<<19)
21#define S3C_AC97_GLBCTRL_PCMOUTTIE (1<<18)
22#define S3C_AC97_GLBCTRL_PCMINTIE (1<<17)
23#define S3C_AC97_GLBCTRL_MICINTIE (1<<16)
24#define S3C_AC97_GLBCTRL_PCMOUTTM_OFF (0<<12)
25#define S3C_AC97_GLBCTRL_PCMOUTTM_PIO (1<<12)
26#define S3C_AC97_GLBCTRL_PCMOUTTM_DMA (2<<12)
27#define S3C_AC97_GLBCTRL_PCMOUTTM_MASK (3<<12)
28#define S3C_AC97_GLBCTRL_PCMINTM_OFF (0<<10)
29#define S3C_AC97_GLBCTRL_PCMINTM_PIO (1<<10)
30#define S3C_AC97_GLBCTRL_PCMINTM_DMA (2<<10)
31#define S3C_AC97_GLBCTRL_PCMINTM_MASK (3<<10)
32#define S3C_AC97_GLBCTRL_MICINTM_OFF (0<<8)
33#define S3C_AC97_GLBCTRL_MICINTM_PIO (1<<8)
34#define S3C_AC97_GLBCTRL_MICINTM_DMA (2<<8)
35#define S3C_AC97_GLBCTRL_MICINTM_MASK (3<<8)
36#define S3C_AC97_GLBCTRL_TRANSFERDATAENABLE (1<<3)
37#define S3C_AC97_GLBCTRL_ACLINKON (1<<2)
38#define S3C_AC97_GLBCTRL_WARMRESET (1<<1)
39#define S3C_AC97_GLBCTRL_COLDRESET (1<<0)
40
41#define S3C_AC97_GLBSTAT (0x04)
42
43#define S3C_AC97_GLBSTAT_CODECREADY (1<<22)
44#define S3C_AC97_GLBSTAT_PCMOUTUR (1<<21)
45#define S3C_AC97_GLBSTAT_PCMINORI (1<<20)
46#define S3C_AC97_GLBSTAT_MICINORI (1<<19)
47#define S3C_AC97_GLBSTAT_PCMOUTTI (1<<18)
48#define S3C_AC97_GLBSTAT_PCMINTI (1<<17)
49#define S3C_AC97_GLBSTAT_MICINTI (1<<16)
50#define S3C_AC97_GLBSTAT_MAINSTATE_IDLE (0<<0)
51#define S3C_AC97_GLBSTAT_MAINSTATE_INIT (1<<0)
52#define S3C_AC97_GLBSTAT_MAINSTATE_READY (2<<0)
53#define S3C_AC97_GLBSTAT_MAINSTATE_ACTIVE (3<<0)
54#define S3C_AC97_GLBSTAT_MAINSTATE_LP (4<<0)
55#define S3C_AC97_GLBSTAT_MAINSTATE_WARM (5<<0)
56
57#define S3C_AC97_CODEC_CMD (0x08)
58
59#define S3C_AC97_CODEC_CMD_READ (1<<23)
60
61#define S3C_AC97_STAT (0x0c)
62#define S3C_AC97_PCM_ADDR (0x10)
63#define S3C_AC97_PCM_DATA (0x18)
64#define S3C_AC97_MIC_DATA (0x1C)
65
66#endif /* __SAMSUNG_REGS_AC97_H__ */
diff --git a/sound/soc/samsung/s3c2412-i2s.c b/sound/soc/samsung/s3c2412-i2s.c
index 0a4718207e6e..6d0b8897fa6c 100644
--- a/sound/soc/samsung/s3c2412-i2s.c
+++ b/sound/soc/samsung/s3c2412-i2s.c
@@ -35,12 +35,10 @@
35#include <linux/platform_data/asoc-s3c.h> 35#include <linux/platform_data/asoc-s3c.h>
36 36
37static struct snd_dmaengine_dai_dma_data s3c2412_i2s_pcm_stereo_out = { 37static struct snd_dmaengine_dai_dma_data s3c2412_i2s_pcm_stereo_out = {
38 .chan_name = "tx",
39 .addr_width = 4, 38 .addr_width = 4,
40}; 39};
41 40
42static struct snd_dmaengine_dai_dma_data s3c2412_i2s_pcm_stereo_in = { 41static struct snd_dmaengine_dai_dma_data s3c2412_i2s_pcm_stereo_in = {
43 .chan_name = "rx",
44 .addr_width = 4, 42 .addr_width = 4,
45}; 43};
46 44
diff --git a/sound/soc/samsung/s3c24xx-i2s.c b/sound/soc/samsung/s3c24xx-i2s.c
index 9052f6a7073e..07f5091b33e8 100644
--- a/sound/soc/samsung/s3c24xx-i2s.c
+++ b/sound/soc/samsung/s3c24xx-i2s.c
@@ -30,15 +30,11 @@
30#include "dma.h" 30#include "dma.h"
31#include "s3c24xx-i2s.h" 31#include "s3c24xx-i2s.h"
32 32
33#include <linux/platform_data/asoc-s3c.h>
34
35static struct snd_dmaengine_dai_dma_data s3c24xx_i2s_pcm_stereo_out = { 33static struct snd_dmaengine_dai_dma_data s3c24xx_i2s_pcm_stereo_out = {
36 .chan_name = "tx",
37 .addr_width = 2, 34 .addr_width = 2,
38}; 35};
39 36
40static struct snd_dmaengine_dai_dma_data s3c24xx_i2s_pcm_stereo_in = { 37static struct snd_dmaengine_dai_dma_data s3c24xx_i2s_pcm_stereo_in = {
41 .chan_name = "rx",
42 .addr_width = 2, 38 .addr_width = 2,
43}; 39};
44 40
@@ -58,8 +54,6 @@ static void s3c24xx_snd_txctrl(int on)
58 u32 iiscon; 54 u32 iiscon;
59 u32 iismod; 55 u32 iismod;
60 56
61 pr_debug("Entered %s\n", __func__);
62
63 iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON); 57 iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
64 iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON); 58 iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
65 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); 59 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
@@ -103,8 +97,6 @@ static void s3c24xx_snd_rxctrl(int on)
103 u32 iiscon; 97 u32 iiscon;
104 u32 iismod; 98 u32 iismod;
105 99
106 pr_debug("Entered %s\n", __func__);
107
108 iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON); 100 iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
109 iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON); 101 iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
110 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); 102 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
@@ -151,8 +143,6 @@ static int s3c24xx_snd_lrsync(void)
151 u32 iiscon; 143 u32 iiscon;
152 int timeout = 50; /* 5ms */ 144 int timeout = 50; /* 5ms */
153 145
154 pr_debug("Entered %s\n", __func__);
155
156 while (1) { 146 while (1) {
157 iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON); 147 iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
158 if (iiscon & S3C2410_IISCON_LRINDEX) 148 if (iiscon & S3C2410_IISCON_LRINDEX)
@@ -171,8 +161,6 @@ static int s3c24xx_snd_lrsync(void)
171 */ 161 */
172static inline int s3c24xx_snd_is_clkmaster(void) 162static inline int s3c24xx_snd_is_clkmaster(void)
173{ 163{
174 pr_debug("Entered %s\n", __func__);
175
176 return (readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & S3C2410_IISMOD_SLAVE) ? 0:1; 164 return (readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & S3C2410_IISMOD_SLAVE) ? 0:1;
177} 165}
178 166
@@ -184,8 +172,6 @@ static int s3c24xx_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
184{ 172{
185 u32 iismod; 173 u32 iismod;
186 174
187 pr_debug("Entered %s\n", __func__);
188
189 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); 175 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
190 pr_debug("hw_params r: IISMOD: %x \n", iismod); 176 pr_debug("hw_params r: IISMOD: %x \n", iismod);
191 177
@@ -213,6 +199,7 @@ static int s3c24xx_i2s_set_fmt(struct snd_soc_dai *cpu_dai,
213 199
214 writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD); 200 writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
215 pr_debug("hw_params w: IISMOD: %x \n", iismod); 201 pr_debug("hw_params w: IISMOD: %x \n", iismod);
202
216 return 0; 203 return 0;
217} 204}
218 205
@@ -223,8 +210,6 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
223 struct snd_dmaengine_dai_dma_data *dma_data; 210 struct snd_dmaengine_dai_dma_data *dma_data;
224 u32 iismod; 211 u32 iismod;
225 212
226 pr_debug("Entered %s\n", __func__);
227
228 dma_data = snd_soc_dai_get_dma_data(dai, substream); 213 dma_data = snd_soc_dai_get_dma_data(dai, substream);
229 214
230 /* Working copies of register */ 215 /* Working copies of register */
@@ -246,6 +231,7 @@ static int s3c24xx_i2s_hw_params(struct snd_pcm_substream *substream,
246 231
247 writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD); 232 writel(iismod, s3c24xx_i2s.regs + S3C2410_IISMOD);
248 pr_debug("hw_params w: IISMOD: %x\n", iismod); 233 pr_debug("hw_params w: IISMOD: %x\n", iismod);
234
249 return 0; 235 return 0;
250} 236}
251 237
@@ -254,8 +240,6 @@ static int s3c24xx_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
254{ 240{
255 int ret = 0; 241 int ret = 0;
256 242
257 pr_debug("Entered %s\n", __func__);
258
259 switch (cmd) { 243 switch (cmd) {
260 case SNDRV_PCM_TRIGGER_START: 244 case SNDRV_PCM_TRIGGER_START:
261 case SNDRV_PCM_TRIGGER_RESUME: 245 case SNDRV_PCM_TRIGGER_RESUME:
@@ -297,8 +281,6 @@ static int s3c24xx_i2s_set_sysclk(struct snd_soc_dai *cpu_dai,
297{ 281{
298 u32 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); 282 u32 iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
299 283
300 pr_debug("Entered %s\n", __func__);
301
302 iismod &= ~S3C2440_IISMOD_MPLL; 284 iismod &= ~S3C2440_IISMOD_MPLL;
303 285
304 switch (clk_id) { 286 switch (clk_id) {
@@ -323,8 +305,6 @@ static int s3c24xx_i2s_set_clkdiv(struct snd_soc_dai *cpu_dai,
323{ 305{
324 u32 reg; 306 u32 reg;
325 307
326 pr_debug("Entered %s\n", __func__);
327
328 switch (div_id) { 308 switch (div_id) {
329 case S3C24XX_DIV_BCLK: 309 case S3C24XX_DIV_BCLK:
330 reg = readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & ~S3C2410_IISMOD_FS_MASK; 310 reg = readl(s3c24xx_i2s.regs + S3C2410_IISMOD) & ~S3C2410_IISMOD_FS_MASK;
@@ -358,8 +338,6 @@ EXPORT_SYMBOL_GPL(s3c24xx_i2s_get_clockrate);
358 338
359static int s3c24xx_i2s_probe(struct snd_soc_dai *dai) 339static int s3c24xx_i2s_probe(struct snd_soc_dai *dai)
360{ 340{
361 pr_debug("Entered %s\n", __func__);
362
363 snd_soc_dai_init_dma_data(dai, &s3c24xx_i2s_pcm_stereo_out, 341 snd_soc_dai_init_dma_data(dai, &s3c24xx_i2s_pcm_stereo_out,
364 &s3c24xx_i2s_pcm_stereo_in); 342 &s3c24xx_i2s_pcm_stereo_in);
365 343
@@ -385,8 +363,6 @@ static int s3c24xx_i2s_probe(struct snd_soc_dai *dai)
385#ifdef CONFIG_PM 363#ifdef CONFIG_PM
386static int s3c24xx_i2s_suspend(struct snd_soc_dai *cpu_dai) 364static int s3c24xx_i2s_suspend(struct snd_soc_dai *cpu_dai)
387{ 365{
388 pr_debug("Entered %s\n", __func__);
389
390 s3c24xx_i2s.iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON); 366 s3c24xx_i2s.iiscon = readl(s3c24xx_i2s.regs + S3C2410_IISCON);
391 s3c24xx_i2s.iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD); 367 s3c24xx_i2s.iismod = readl(s3c24xx_i2s.regs + S3C2410_IISMOD);
392 s3c24xx_i2s.iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON); 368 s3c24xx_i2s.iisfcon = readl(s3c24xx_i2s.regs + S3C2410_IISFCON);
@@ -399,7 +375,6 @@ static int s3c24xx_i2s_suspend(struct snd_soc_dai *cpu_dai)
399 375
400static int s3c24xx_i2s_resume(struct snd_soc_dai *cpu_dai) 376static int s3c24xx_i2s_resume(struct snd_soc_dai *cpu_dai)
401{ 377{
402 pr_debug("Entered %s\n", __func__);
403 clk_prepare_enable(s3c24xx_i2s.iis_clk); 378 clk_prepare_enable(s3c24xx_i2s.iis_clk);
404 379
405 writel(s3c24xx_i2s.iiscon, s3c24xx_i2s.regs + S3C2410_IISCON); 380 writel(s3c24xx_i2s.iiscon, s3c24xx_i2s.regs + S3C2410_IISCON);
@@ -414,7 +389,6 @@ static int s3c24xx_i2s_resume(struct snd_soc_dai *cpu_dai)
414#define s3c24xx_i2s_resume NULL 389#define s3c24xx_i2s_resume NULL
415#endif 390#endif
416 391
417
418#define S3C24XX_I2S_RATES \ 392#define S3C24XX_I2S_RATES \
419 (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \ 393 (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | \
420 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \ 394 SNDRV_PCM_RATE_22050 | SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
@@ -451,41 +425,28 @@ static const struct snd_soc_component_driver s3c24xx_i2s_component = {
451 425
452static int s3c24xx_iis_dev_probe(struct platform_device *pdev) 426static int s3c24xx_iis_dev_probe(struct platform_device *pdev)
453{ 427{
454 int ret = 0;
455 struct resource *res; 428 struct resource *res;
456 struct s3c_audio_pdata *pdata = dev_get_platdata(&pdev->dev); 429 int ret;
457
458 if (!pdata) {
459 dev_err(&pdev->dev, "missing platform data");
460 return -ENXIO;
461 }
462 430
463 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 431 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
464 if (!res) {
465 dev_err(&pdev->dev, "Can't get IO resource.\n");
466 return -ENOENT;
467 }
468 s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res); 432 s3c24xx_i2s.regs = devm_ioremap_resource(&pdev->dev, res);
469 if (IS_ERR(s3c24xx_i2s.regs)) 433 if (IS_ERR(s3c24xx_i2s.regs))
470 return PTR_ERR(s3c24xx_i2s.regs); 434 return PTR_ERR(s3c24xx_i2s.regs);
471 435
472 s3c24xx_i2s_pcm_stereo_out.addr = res->start + S3C2410_IISFIFO; 436 s3c24xx_i2s_pcm_stereo_out.addr = res->start + S3C2410_IISFIFO;
473 s3c24xx_i2s_pcm_stereo_out.filter_data = pdata->dma_playback;
474 s3c24xx_i2s_pcm_stereo_in.addr = res->start + S3C2410_IISFIFO; 437 s3c24xx_i2s_pcm_stereo_in.addr = res->start + S3C2410_IISFIFO;
475 s3c24xx_i2s_pcm_stereo_in.filter_data = pdata->dma_capture;
476 438
477 ret = samsung_asoc_dma_platform_register(&pdev->dev, 439 ret = samsung_asoc_dma_platform_register(&pdev->dev, NULL,
478 pdata->dma_filter,
479 NULL, NULL); 440 NULL, NULL);
480 if (ret) { 441 if (ret) {
481 pr_err("failed to register the dma: %d\n", ret); 442 dev_err(&pdev->dev, "Failed to register the DMA: %d\n", ret);
482 return ret; 443 return ret;
483 } 444 }
484 445
485 ret = devm_snd_soc_register_component(&pdev->dev, 446 ret = devm_snd_soc_register_component(&pdev->dev,
486 &s3c24xx_i2s_component, &s3c24xx_i2s_dai, 1); 447 &s3c24xx_i2s_component, &s3c24xx_i2s_dai, 1);
487 if (ret) 448 if (ret)
488 pr_err("failed to register the dai\n"); 449 dev_err(&pdev->dev, "Failed to register the DAI\n");
489 450
490 return ret; 451 return ret;
491} 452}
diff --git a/sound/soc/samsung/s3c24xx_uda134x.c b/sound/soc/samsung/s3c24xx_uda134x.c
index 7853fbe6ccc9..81a78940967c 100644
--- a/sound/soc/samsung/s3c24xx_uda134x.c
+++ b/sound/soc/samsung/s3c24xx_uda134x.c
@@ -19,9 +19,15 @@
19#include <sound/s3c24xx_uda134x.h> 19#include <sound/s3c24xx_uda134x.h>
20 20
21#include "regs-iis.h" 21#include "regs-iis.h"
22
23#include "s3c24xx-i2s.h" 22#include "s3c24xx-i2s.h"
24 23
24struct s3c24xx_uda134x {
25 struct clk *xtal;
26 struct clk *pclk;
27 struct mutex clk_lock;
28 int clk_users;
29};
30
25/* #define ENFORCE_RATES 1 */ 31/* #define ENFORCE_RATES 1 */
26/* 32/*
27 Unfortunately the S3C24XX in master mode has a limited capacity of 33 Unfortunately the S3C24XX in master mode has a limited capacity of
@@ -36,15 +42,6 @@
36 possible an error will be returned. 42 possible an error will be returned.
37*/ 43*/
38 44
39static struct clk *xtal;
40static struct clk *pclk;
41/* this is need because we don't have a place where to keep the
42 * pointers to the clocks in each substream. We get the clocks only
43 * when we are actually using them so we don't block stuff like
44 * frequency change or oscillator power-off */
45static int clk_users;
46static DEFINE_MUTEX(clk_lock);
47
48static unsigned int rates[33 * 2]; 45static unsigned int rates[33 * 2];
49#ifdef ENFORCE_RATES 46#ifdef ENFORCE_RATES
50static struct snd_pcm_hw_constraint_list hw_constraints_rates = { 47static struct snd_pcm_hw_constraint_list hw_constraints_rates = {
@@ -57,26 +54,24 @@ static struct snd_pcm_hw_constraint_list hw_constraints_rates = {
57static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream) 54static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream)
58{ 55{
59 struct snd_soc_pcm_runtime *rtd = substream->private_data; 56 struct snd_soc_pcm_runtime *rtd = substream->private_data;
57 struct s3c24xx_uda134x *priv = snd_soc_card_get_drvdata(rtd->card);
60 struct snd_soc_dai *cpu_dai = rtd->cpu_dai; 58 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
61#ifdef ENFORCE_RATES
62 struct snd_pcm_runtime *runtime = substream->runtime;
63#endif
64 int ret = 0; 59 int ret = 0;
65 60
66 mutex_lock(&clk_lock); 61 mutex_lock(&priv->clk_lock);
67 62
68 if (clk_users == 0) { 63 if (priv->clk_users == 0) {
69 xtal = clk_get(rtd->dev, "xtal"); 64 priv->xtal = clk_get(rtd->dev, "xtal");
70 if (IS_ERR(xtal)) { 65 if (IS_ERR(priv->xtal)) {
71 dev_err(rtd->dev, "%s cannot get xtal\n", __func__); 66 dev_err(rtd->dev, "%s cannot get xtal\n", __func__);
72 ret = PTR_ERR(xtal); 67 ret = PTR_ERR(priv->xtal);
73 } else { 68 } else {
74 pclk = clk_get(cpu_dai->dev, "iis"); 69 priv->pclk = clk_get(cpu_dai->dev, "iis");
75 if (IS_ERR(pclk)) { 70 if (IS_ERR(priv->pclk)) {
76 dev_err(rtd->dev, "%s cannot get pclk\n", 71 dev_err(rtd->dev, "%s cannot get pclk\n",
77 __func__); 72 __func__);
78 clk_put(xtal); 73 clk_put(priv->xtal);
79 ret = PTR_ERR(pclk); 74 ret = PTR_ERR(priv->pclk);
80 } 75 }
81 } 76 }
82 if (!ret) { 77 if (!ret) {
@@ -85,18 +80,19 @@ static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream)
85 for (i = 0; i < 2; i++) { 80 for (i = 0; i < 2; i++) {
86 int fs = i ? 256 : 384; 81 int fs = i ? 256 : 384;
87 82
88 rates[i*33] = clk_get_rate(xtal) / fs; 83 rates[i*33] = clk_get_rate(priv->xtal) / fs;
89 for (j = 1; j < 33; j++) 84 for (j = 1; j < 33; j++)
90 rates[i*33 + j] = clk_get_rate(pclk) / 85 rates[i*33 + j] = clk_get_rate(priv->pclk) /
91 (j * fs); 86 (j * fs);
92 } 87 }
93 } 88 }
94 } 89 }
95 clk_users += 1; 90 priv->clk_users += 1;
96 mutex_unlock(&clk_lock); 91 mutex_unlock(&priv->clk_lock);
92
97 if (!ret) { 93 if (!ret) {
98#ifdef ENFORCE_RATES 94#ifdef ENFORCE_RATES
99 ret = snd_pcm_hw_constraint_list(runtime, 0, 95 ret = snd_pcm_hw_constraint_list(substream->runtime, 0,
100 SNDRV_PCM_HW_PARAM_RATE, 96 SNDRV_PCM_HW_PARAM_RATE,
101 &hw_constraints_rates); 97 &hw_constraints_rates);
102 if (ret < 0) 98 if (ret < 0)
@@ -109,15 +105,18 @@ static int s3c24xx_uda134x_startup(struct snd_pcm_substream *substream)
109 105
110static void s3c24xx_uda134x_shutdown(struct snd_pcm_substream *substream) 106static void s3c24xx_uda134x_shutdown(struct snd_pcm_substream *substream)
111{ 107{
112 mutex_lock(&clk_lock); 108 struct snd_soc_pcm_runtime *rtd = substream->private_data;
113 clk_users -= 1; 109 struct s3c24xx_uda134x *priv = snd_soc_card_get_drvdata(rtd->card);
114 if (clk_users == 0) { 110
115 clk_put(xtal); 111 mutex_lock(&priv->clk_lock);
116 xtal = NULL; 112 priv->clk_users -= 1;
117 clk_put(pclk); 113 if (priv->clk_users == 0) {
118 pclk = NULL; 114 clk_put(priv->xtal);
115 priv->xtal = NULL;
116 clk_put(priv->pclk);
117 priv->pclk = NULL;
119 } 118 }
120 mutex_unlock(&clk_lock); 119 mutex_unlock(&priv->clk_lock);
121} 120}
122 121
123static int s3c24xx_uda134x_hw_params(struct snd_pcm_substream *substream, 122static int s3c24xx_uda134x_hw_params(struct snd_pcm_substream *substream,
@@ -228,10 +227,18 @@ static struct snd_soc_card snd_soc_s3c24xx_uda134x = {
228static int s3c24xx_uda134x_probe(struct platform_device *pdev) 227static int s3c24xx_uda134x_probe(struct platform_device *pdev)
229{ 228{
230 struct snd_soc_card *card = &snd_soc_s3c24xx_uda134x; 229 struct snd_soc_card *card = &snd_soc_s3c24xx_uda134x;
230 struct s3c24xx_uda134x *priv;
231 int ret; 231 int ret;
232 232
233 platform_set_drvdata(pdev, card); 233 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL);
234 if (!priv)
235 return -ENOMEM;
236
237 mutex_init(&priv->clk_lock);
238
234 card->dev = &pdev->dev; 239 card->dev = &pdev->dev;
240 platform_set_drvdata(pdev, card);
241 snd_soc_card_set_drvdata(card, priv);
235 242
236 ret = devm_snd_soc_register_card(&pdev->dev, card); 243 ret = devm_snd_soc_register_card(&pdev->dev, card);
237 if (ret) 244 if (ret)
diff --git a/sound/soc/samsung/smdk2443_wm9710.c b/sound/soc/samsung/smdk2443_wm9710.c
deleted file mode 100644
index c390aad68cfb..000000000000
--- a/sound/soc/samsung/smdk2443_wm9710.c
+++ /dev/null
@@ -1,68 +0,0 @@
1/*
2 * smdk2443_wm9710.c -- SoC audio for smdk2443
3 *
4 * Copyright 2007 Wolfson Microelectronics PLC.
5 * Author: Graeme Gregory
6 * graeme.gregory@wolfsonmicro.com or linux@wolfsonmicro.com
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
12 *
13 */
14
15#include <linux/module.h>
16#include <sound/soc.h>
17
18static struct snd_soc_card smdk2443;
19
20static struct snd_soc_dai_link smdk2443_dai[] = {
21{
22 .name = "AC97",
23 .stream_name = "AC97 HiFi",
24 .cpu_dai_name = "samsung-ac97",
25 .codec_dai_name = "ac97-hifi",
26 .codec_name = "ac97-codec",
27 .platform_name = "samsung-ac97",
28},
29};
30
31static struct snd_soc_card smdk2443 = {
32 .name = "SMDK2443",
33 .owner = THIS_MODULE,
34 .dai_link = smdk2443_dai,
35 .num_links = ARRAY_SIZE(smdk2443_dai),
36};
37
38static struct platform_device *smdk2443_snd_ac97_device;
39
40static int __init smdk2443_init(void)
41{
42 int ret;
43
44 smdk2443_snd_ac97_device = platform_device_alloc("soc-audio", -1);
45 if (!smdk2443_snd_ac97_device)
46 return -ENOMEM;
47
48 platform_set_drvdata(smdk2443_snd_ac97_device, &smdk2443);
49 ret = platform_device_add(smdk2443_snd_ac97_device);
50
51 if (ret)
52 platform_device_put(smdk2443_snd_ac97_device);
53
54 return ret;
55}
56
57static void __exit smdk2443_exit(void)
58{
59 platform_device_unregister(smdk2443_snd_ac97_device);
60}
61
62module_init(smdk2443_init);
63module_exit(smdk2443_exit);
64
65/* Module information */
66MODULE_AUTHOR("Graeme Gregory, graeme.gregory@wolfsonmicro.com, www.wolfsonmicro.com");
67MODULE_DESCRIPTION("ALSA SoC WM9710 SMDK2443");
68MODULE_LICENSE("GPL");
diff --git a/sound/soc/samsung/smdk_wm8580.c b/sound/soc/samsung/smdk_wm8580.c
index 548bfd993788..de724ce7b955 100644
--- a/sound/soc/samsung/smdk_wm8580.c
+++ b/sound/soc/samsung/smdk_wm8580.c
@@ -14,8 +14,6 @@
14#include <sound/soc.h> 14#include <sound/soc.h>
15#include <sound/pcm_params.h> 15#include <sound/pcm_params.h>
16 16
17#include <asm/mach-types.h>
18
19#include "../codecs/wm8580.h" 17#include "../codecs/wm8580.h"
20#include "i2s.h" 18#include "i2s.h"
21 19
@@ -147,7 +145,6 @@ static int smdk_wm8580_init_paiftx(struct snd_soc_pcm_runtime *rtd)
147enum { 145enum {
148 PRI_PLAYBACK = 0, 146 PRI_PLAYBACK = 0,
149 PRI_CAPTURE, 147 PRI_CAPTURE,
150 SEC_PLAYBACK,
151}; 148};
152 149
153#define SMDK_DAI_FMT (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | \ 150#define SMDK_DAI_FMT (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | \
@@ -157,7 +154,7 @@ static struct snd_soc_dai_link smdk_dai[] = {
157 [PRI_PLAYBACK] = { /* Primary Playback i/f */ 154 [PRI_PLAYBACK] = { /* Primary Playback i/f */
158 .name = "WM8580 PAIF RX", 155 .name = "WM8580 PAIF RX",
159 .stream_name = "Playback", 156 .stream_name = "Playback",
160 .cpu_dai_name = "samsung-i2s.0", 157 .cpu_dai_name = "samsung-i2s.2",
161 .codec_dai_name = "wm8580-hifi-playback", 158 .codec_dai_name = "wm8580-hifi-playback",
162 .platform_name = "samsung-i2s.0", 159 .platform_name = "samsung-i2s.0",
163 .codec_name = "wm8580.0-001b", 160 .codec_name = "wm8580.0-001b",
@@ -167,7 +164,7 @@ static struct snd_soc_dai_link smdk_dai[] = {
167 [PRI_CAPTURE] = { /* Primary Capture i/f */ 164 [PRI_CAPTURE] = { /* Primary Capture i/f */
168 .name = "WM8580 PAIF TX", 165 .name = "WM8580 PAIF TX",
169 .stream_name = "Capture", 166 .stream_name = "Capture",
170 .cpu_dai_name = "samsung-i2s.0", 167 .cpu_dai_name = "samsung-i2s.2",
171 .codec_dai_name = "wm8580-hifi-capture", 168 .codec_dai_name = "wm8580-hifi-capture",
172 .platform_name = "samsung-i2s.0", 169 .platform_name = "samsung-i2s.0",
173 .codec_name = "wm8580.0-001b", 170 .codec_name = "wm8580.0-001b",
@@ -175,23 +172,13 @@ static struct snd_soc_dai_link smdk_dai[] = {
175 .init = smdk_wm8580_init_paiftx, 172 .init = smdk_wm8580_init_paiftx,
176 .ops = &smdk_ops, 173 .ops = &smdk_ops,
177 }, 174 },
178 [SEC_PLAYBACK] = { /* Sec_Fifo Playback i/f */
179 .name = "Sec_FIFO TX",
180 .stream_name = "Playback",
181 .cpu_dai_name = "samsung-i2s-sec",
182 .codec_dai_name = "wm8580-hifi-playback",
183 .platform_name = "samsung-i2s-sec",
184 .codec_name = "wm8580.0-001b",
185 .dai_fmt = SMDK_DAI_FMT,
186 .ops = &smdk_ops,
187 },
188}; 175};
189 176
190static struct snd_soc_card smdk = { 177static struct snd_soc_card smdk = {
191 .name = "SMDK-I2S", 178 .name = "SMDK-I2S",
192 .owner = THIS_MODULE, 179 .owner = THIS_MODULE,
193 .dai_link = smdk_dai, 180 .dai_link = smdk_dai,
194 .num_links = 2, 181 .num_links = ARRAY_SIZE(smdk_dai),
195 182
196 .dapm_widgets = smdk_wm8580_dapm_widgets, 183 .dapm_widgets = smdk_wm8580_dapm_widgets,
197 .num_dapm_widgets = ARRAY_SIZE(smdk_wm8580_dapm_widgets), 184 .num_dapm_widgets = ARRAY_SIZE(smdk_wm8580_dapm_widgets),
@@ -204,17 +191,6 @@ static struct platform_device *smdk_snd_device;
204static int __init smdk_audio_init(void) 191static int __init smdk_audio_init(void)
205{ 192{
206 int ret; 193 int ret;
207 char *str;
208
209 if (machine_is_smdkc100()
210 || machine_is_smdkv210() || machine_is_smdkc110()) {
211 smdk.num_links = 3;
212 } else if (machine_is_smdk6410()) {
213 str = (char *)smdk_dai[PRI_PLAYBACK].cpu_dai_name;
214 str[strlen(str) - 1] = '2';
215 str = (char *)smdk_dai[PRI_CAPTURE].cpu_dai_name;
216 str[strlen(str) - 1] = '2';
217 }
218 194
219 smdk_snd_device = platform_device_alloc("soc-audio", -1); 195 smdk_snd_device = platform_device_alloc("soc-audio", -1);
220 if (!smdk_snd_device) 196 if (!smdk_snd_device)
diff --git a/sound/soc/samsung/smdk_wm8580pcm.c b/sound/soc/samsung/smdk_wm8580pcm.c
deleted file mode 100644
index a6d223310c67..000000000000
--- a/sound/soc/samsung/smdk_wm8580pcm.c
+++ /dev/null
@@ -1,175 +0,0 @@
1/*
2 * sound/soc/samsung/smdk_wm8580pcm.c
3 *
4 * Copyright (c) 2011 Samsung Electronics Co. Ltd
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 2 of the License, or (at your
9 * option) any later version.
10 */
11#include <linux/module.h>
12#include <sound/soc.h>
13#include <sound/pcm_params.h>
14#include <sound/pcm.h>
15
16#include <asm/mach-types.h>
17
18#include "../codecs/wm8580.h"
19#include "pcm.h"
20
21/*
22 * Board Settings:
23 * o '1' means 'ON'
24 * o '0' means 'OFF'
25 * o 'X' means 'Don't care'
26 *
27 * SMDK6410 Base B/D: CFG1-0000, CFG2-1111
28 * SMDKC110, SMDKV210: CFGB11-100100, CFGB12-0000
29 */
30
31#define SMDK_WM8580_EXT_OSC 12000000
32#define SMDK_WM8580_EXT_MCLK 4096000
33#define SMDK_WM8580_EXT_VOICE 2048000
34
35static unsigned long mclk_freq;
36static unsigned long xtal_freq;
37
38/*
39 * If MCLK clock directly gets from XTAL, we don't have to use PLL
40 * to make MCLK, but if XTAL clock source connects with other codec
41 * pin (like XTI), we should have to set codec's PLL to make MCLK.
42 * Because Samsung SoC does not support pcmcdclk output like I2S.
43 */
44
45static int smdk_wm8580_pcm_hw_params(struct snd_pcm_substream *substream,
46 struct snd_pcm_hw_params *params)
47{
48 struct snd_soc_pcm_runtime *rtd = substream->private_data;
49 struct snd_soc_dai *codec_dai = rtd->codec_dai;
50 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
51 int rfs, ret;
52
53 switch (params_rate(params)) {
54 case 8000:
55 break;
56 default:
57 printk(KERN_ERR "%s:%d Sampling Rate %u not supported!\n",
58 __func__, __LINE__, params_rate(params));
59 return -EINVAL;
60 }
61
62 rfs = mclk_freq / params_rate(params) / 2;
63
64 if (mclk_freq == xtal_freq) {
65 ret = snd_soc_dai_set_sysclk(codec_dai, WM8580_CLKSRC_MCLK,
66 mclk_freq, SND_SOC_CLOCK_IN);
67 if (ret < 0)
68 return ret;
69
70 ret = snd_soc_dai_set_clkdiv(codec_dai, WM8580_MCLK,
71 WM8580_CLKSRC_MCLK);
72 if (ret < 0)
73 return ret;
74 } else {
75 ret = snd_soc_dai_set_sysclk(codec_dai, WM8580_CLKSRC_PLLA,
76 mclk_freq, SND_SOC_CLOCK_IN);
77 if (ret < 0)
78 return ret;
79
80 ret = snd_soc_dai_set_clkdiv(codec_dai, WM8580_MCLK,
81 WM8580_CLKSRC_PLLA);
82 if (ret < 0)
83 return ret;
84
85 ret = snd_soc_dai_set_pll(codec_dai, WM8580_PLLA, 0,
86 xtal_freq, mclk_freq);
87 if (ret < 0)
88 return ret;
89 }
90
91 /* Set PCM source clock on CPU */
92 ret = snd_soc_dai_set_sysclk(cpu_dai, S3C_PCM_CLKSRC_MUX,
93 mclk_freq, SND_SOC_CLOCK_IN);
94 if (ret < 0)
95 return ret;
96
97 /* Set SCLK_DIV for making bclk */
98 ret = snd_soc_dai_set_clkdiv(cpu_dai, S3C_PCM_SCLK_PER_FS, rfs);
99 if (ret < 0)
100 return ret;
101
102 return 0;
103}
104
105static struct snd_soc_ops smdk_wm8580_pcm_ops = {
106 .hw_params = smdk_wm8580_pcm_hw_params,
107};
108
109#define SMDK_DAI_FMT (SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF | \
110 SND_SOC_DAIFMT_CBS_CFS)
111
112static struct snd_soc_dai_link smdk_dai[] = {
113 {
114 .name = "WM8580 PAIF PCM RX",
115 .stream_name = "Playback",
116 .cpu_dai_name = "samsung-pcm.0",
117 .codec_dai_name = "wm8580-hifi-playback",
118 .platform_name = "samsung-audio",
119 .codec_name = "wm8580.0-001b",
120 .dai_fmt = SMDK_DAI_FMT,
121 .ops = &smdk_wm8580_pcm_ops,
122 }, {
123 .name = "WM8580 PAIF PCM TX",
124 .stream_name = "Capture",
125 .cpu_dai_name = "samsung-pcm.0",
126 .codec_dai_name = "wm8580-hifi-capture",
127 .platform_name = "samsung-pcm.0",
128 .codec_name = "wm8580.0-001b",
129 .dai_fmt = SMDK_DAI_FMT,
130 .ops = &smdk_wm8580_pcm_ops,
131 },
132};
133
134static struct snd_soc_card smdk_pcm = {
135 .name = "SMDK-PCM",
136 .owner = THIS_MODULE,
137 .dai_link = smdk_dai,
138 .num_links = 2,
139};
140
141/*
142 * After SMDKC110 Base Board's Rev is '0.1', 12MHz External OSC(X1)
143 * is absent (or not connected), so we connect EXT_VOICE_CLK(OSC4),
144 * 2.0484Mhz, directly with MCLK both Codec and SoC.
145 */
146static int snd_smdk_probe(struct platform_device *pdev)
147{
148 int ret = 0;
149
150 xtal_freq = SMDK_WM8580_EXT_OSC;
151 mclk_freq = SMDK_WM8580_EXT_MCLK;
152
153 if (machine_is_smdkc110() || machine_is_smdkv210())
154 xtal_freq = mclk_freq = SMDK_WM8580_EXT_VOICE;
155
156 smdk_pcm.dev = &pdev->dev;
157 ret = devm_snd_soc_register_card(&pdev->dev, &smdk_pcm);
158 if (ret)
159 dev_err(&pdev->dev, "snd_soc_register_card failed %d\n", ret);
160
161 return ret;
162}
163
164static struct platform_driver snd_smdk_driver = {
165 .driver = {
166 .name = "samsung-smdk-pcm",
167 },
168 .probe = snd_smdk_probe,
169};
170
171module_platform_driver(snd_smdk_driver);
172
173MODULE_AUTHOR("Sangbeom Kim, <sbkim73@samsung.com>");
174MODULE_DESCRIPTION("ALSA SoC SMDK WM8580 for PCM");
175MODULE_LICENSE("GPL");
diff --git a/sound/soc/samsung/smdk_wm9713.c b/sound/soc/samsung/smdk_wm9713.c
deleted file mode 100644
index 0d20e4ed27aa..000000000000
--- a/sound/soc/samsung/smdk_wm9713.c
+++ /dev/null
@@ -1,108 +0,0 @@
1/*
2 * smdk_wm9713.c -- SoC audio for SMDK
3 *
4 * Copyright 2010 Samsung Electronics Co. Ltd.
5 * Author: Jaswinder Singh Brar <jassisinghbrar@gmail.com>
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License as
9 * published by the Free Software Foundation; either version 2 of the
10 * License, or (at your option) any later version.
11 *
12 */
13
14#include <linux/module.h>
15#include <sound/soc.h>
16
17static struct snd_soc_card smdk;
18
19/*
20 * Default CFG switch settings to use this driver:
21 *
22 * SMDK6410: Set CFG1 1-3 On, CFG2 1-4 Off
23 * SMDKC100: Set CFG6 1-3 On, CFG7 1 On
24 * SMDKC110: Set CFGB10 1-2 Off, CFGB12 1-3 On
25 * SMDKV210: Set CFGB10 1-2 Off, CFGB12 1-3 On
26 * SMDKV310: Set CFG2 1-2 Off, CFG4 All On, CFG7 All Off, CFG8 1-On
27 */
28
29/*
30 Playback (HeadPhone):-
31 $ amixer sset 'Headphone' unmute
32 $ amixer sset 'Right Headphone Out Mux' 'Headphone'
33 $ amixer sset 'Left Headphone Out Mux' 'Headphone'
34 $ amixer sset 'Right HP Mixer PCM' unmute
35 $ amixer sset 'Left HP Mixer PCM' unmute
36
37 Capture (LineIn):-
38 $ amixer sset 'Right Capture Source' 'Line'
39 $ amixer sset 'Left Capture Source' 'Line'
40*/
41
42static struct snd_soc_dai_link smdk_dai = {
43 .name = "AC97",
44 .stream_name = "AC97 PCM",
45 .platform_name = "samsung-ac97",
46 .cpu_dai_name = "samsung-ac97",
47 .codec_dai_name = "wm9713-hifi",
48 .codec_name = "wm9713-codec",
49};
50
51static struct snd_soc_card smdk = {
52 .name = "SMDK WM9713",
53 .owner = THIS_MODULE,
54 .dai_link = &smdk_dai,
55 .num_links = 1,
56};
57
58static struct platform_device *smdk_snd_wm9713_device;
59static struct platform_device *smdk_snd_ac97_device;
60
61static int __init smdk_init(void)
62{
63 int ret;
64
65 smdk_snd_wm9713_device = platform_device_alloc("wm9713-codec", -1);
66 if (!smdk_snd_wm9713_device)
67 return -ENOMEM;
68
69 ret = platform_device_add(smdk_snd_wm9713_device);
70 if (ret)
71 goto err1;
72
73 smdk_snd_ac97_device = platform_device_alloc("soc-audio", -1);
74 if (!smdk_snd_ac97_device) {
75 ret = -ENOMEM;
76 goto err2;
77 }
78
79 platform_set_drvdata(smdk_snd_ac97_device, &smdk);
80
81 ret = platform_device_add(smdk_snd_ac97_device);
82 if (ret)
83 goto err3;
84
85 return 0;
86
87err3:
88 platform_device_put(smdk_snd_ac97_device);
89err2:
90 platform_device_del(smdk_snd_wm9713_device);
91err1:
92 platform_device_put(smdk_snd_wm9713_device);
93 return ret;
94}
95
96static void __exit smdk_exit(void)
97{
98 platform_device_unregister(smdk_snd_ac97_device);
99 platform_device_unregister(smdk_snd_wm9713_device);
100}
101
102module_init(smdk_init);
103module_exit(smdk_exit);
104
105/* Module information */
106MODULE_AUTHOR("Jaswinder Singh Brar, jassisinghbrar@gmail.com");
107MODULE_DESCRIPTION("ALSA SoC SMDK+WM9713");
108MODULE_LICENSE("GPL");
diff --git a/sound/soc/samsung/tm2_wm5110.c b/sound/soc/samsung/tm2_wm5110.c
new file mode 100644
index 000000000000..5cdf7d19b87f
--- /dev/null
+++ b/sound/soc/samsung/tm2_wm5110.c
@@ -0,0 +1,552 @@
1/*
2 * Copyright (C) 2015 - 2016 Samsung Electronics Co., Ltd.
3 *
4 * Authors: Inha Song <ideal.song@samsung.com>
5 * Sylwester Nawrocki <s.nawrocki@samsung.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
11 */
12
13#include <linux/clk.h>
14#include <linux/gpio.h>
15#include <linux/module.h>
16#include <linux/of.h>
17#include <sound/pcm_params.h>
18#include <sound/soc.h>
19
20#include "i2s.h"
21#include "../codecs/wm5110.h"
22
23/*
24 * The source clock is XCLKOUT with its mux set to the external fixed rate
25 * oscillator (XXTI).
26 */
27#define MCLK_RATE 24000000U
28
29#define TM2_DAI_AIF1 0
30#define TM2_DAI_AIF2 1
31
32struct tm2_machine_priv {
33 struct snd_soc_codec *codec;
34 unsigned int sysclk_rate;
35 struct gpio_desc *gpio_mic_bias;
36};
37
38static int tm2_start_sysclk(struct snd_soc_card *card)
39{
40 struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(card);
41 struct snd_soc_codec *codec = priv->codec;
42 int ret;
43
44 ret = snd_soc_codec_set_pll(codec, WM5110_FLL1_REFCLK,
45 ARIZONA_FLL_SRC_MCLK1,
46 MCLK_RATE,
47 priv->sysclk_rate);
48 if (ret < 0) {
49 dev_err(codec->dev, "Failed to set FLL1 source: %d\n", ret);
50 return ret;
51 }
52
53 ret = snd_soc_codec_set_pll(codec, WM5110_FLL1,
54 ARIZONA_FLL_SRC_MCLK1,
55 MCLK_RATE,
56 priv->sysclk_rate);
57 if (ret < 0) {
58 dev_err(codec->dev, "Failed to start FLL1: %d\n", ret);
59 return ret;
60 }
61
62 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK,
63 ARIZONA_CLK_SRC_FLL1,
64 priv->sysclk_rate,
65 SND_SOC_CLOCK_IN);
66 if (ret < 0) {
67 dev_err(codec->dev, "Failed to set SYSCLK source: %d\n", ret);
68 return ret;
69 }
70
71 return 0;
72}
73
74static int tm2_stop_sysclk(struct snd_soc_card *card)
75{
76 struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(card);
77 struct snd_soc_codec *codec = priv->codec;
78 int ret;
79
80 ret = snd_soc_codec_set_pll(codec, WM5110_FLL1, 0, 0, 0);
81 if (ret < 0) {
82 dev_err(codec->dev, "Failed to stop FLL1: %d\n", ret);
83 return ret;
84 }
85
86 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_SYSCLK,
87 ARIZONA_CLK_SRC_FLL1, 0, 0);
88 if (ret < 0) {
89 dev_err(codec->dev, "Failed to stop SYSCLK: %d\n", ret);
90 return ret;
91 }
92
93 return 0;
94}
95
96static int tm2_aif1_hw_params(struct snd_pcm_substream *substream,
97 struct snd_pcm_hw_params *params)
98{
99 struct snd_soc_pcm_runtime *rtd = substream->private_data;
100 struct snd_soc_codec *codec = rtd->codec;
101 struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(rtd->card);
102
103 switch (params_rate(params)) {
104 case 4000:
105 case 8000:
106 case 12000:
107 case 16000:
108 case 24000:
109 case 32000:
110 case 48000:
111 case 96000:
112 case 192000:
113 /* Highest possible SYSCLK frequency: 147.456MHz */
114 priv->sysclk_rate = 147456000U;
115 break;
116 case 11025:
117 case 22050:
118 case 44100:
119 case 88200:
120 case 176400:
121 /* Highest possible SYSCLK frequency: 135.4752 MHz */
122 priv->sysclk_rate = 135475200U;
123 break;
124 default:
125 dev_err(codec->dev, "Not supported sample rate: %d\n",
126 params_rate(params));
127 return -EINVAL;
128 }
129
130 return tm2_start_sysclk(rtd->card);
131}
132
133static struct snd_soc_ops tm2_aif1_ops = {
134 .hw_params = tm2_aif1_hw_params,
135};
136
137static int tm2_aif2_hw_params(struct snd_pcm_substream *substream,
138 struct snd_pcm_hw_params *params)
139{
140 struct snd_soc_pcm_runtime *rtd = substream->private_data;
141 struct snd_soc_codec *codec = rtd->codec;
142 unsigned int asyncclk_rate;
143 int ret;
144
145 switch (params_rate(params)) {
146 case 8000:
147 case 12000:
148 case 16000:
149 /* Highest possible ASYNCCLK frequency: 49.152MHz */
150 asyncclk_rate = 49152000U;
151 break;
152 case 11025:
153 /* Highest possible ASYNCCLK frequency: 45.1584 MHz */
154 asyncclk_rate = 45158400U;
155 break;
156 default:
157 dev_err(codec->dev, "Not supported sample rate: %d\n",
158 params_rate(params));
159 return -EINVAL;
160 }
161
162 ret = snd_soc_codec_set_pll(codec, WM5110_FLL2_REFCLK,
163 ARIZONA_FLL_SRC_MCLK1,
164 MCLK_RATE,
165 asyncclk_rate);
166 if (ret < 0) {
167 dev_err(codec->dev, "Failed to set FLL2 source: %d\n", ret);
168 return ret;
169 }
170
171 ret = snd_soc_codec_set_pll(codec, WM5110_FLL2,
172 ARIZONA_FLL_SRC_MCLK1,
173 MCLK_RATE,
174 asyncclk_rate);
175 if (ret < 0) {
176 dev_err(codec->dev, "Failed to start FLL2: %d\n", ret);
177 return ret;
178 }
179
180 ret = snd_soc_codec_set_sysclk(codec, ARIZONA_CLK_ASYNCCLK,
181 ARIZONA_CLK_SRC_FLL2,
182 asyncclk_rate,
183 SND_SOC_CLOCK_IN);
184 if (ret < 0) {
185 dev_err(codec->dev, "Failed to set ASYNCCLK source: %d\n", ret);
186 return ret;
187 }
188
189 return 0;
190}
191
192static int tm2_aif2_hw_free(struct snd_pcm_substream *substream)
193{
194 struct snd_soc_pcm_runtime *rtd = substream->private_data;
195 struct snd_soc_codec *codec = rtd->codec;
196 int ret;
197
198 /* disable FLL2 */
199 ret = snd_soc_codec_set_pll(codec, WM5110_FLL2, ARIZONA_FLL_SRC_MCLK1,
200 0, 0);
201 if (ret < 0)
202 dev_err(codec->dev, "Failed to stop FLL2: %d\n", ret);
203
204 return ret;
205}
206
207static struct snd_soc_ops tm2_aif2_ops = {
208 .hw_params = tm2_aif2_hw_params,
209 .hw_free = tm2_aif2_hw_free,
210};
211
212static int tm2_mic_bias(struct snd_soc_dapm_widget *w,
213 struct snd_kcontrol *kcontrol, int event)
214{
215 struct snd_soc_card *card = w->dapm->card;
216 struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(card);
217
218 switch (event) {
219 case SND_SOC_DAPM_PRE_PMU:
220 gpiod_set_value_cansleep(priv->gpio_mic_bias, 1);
221 break;
222 case SND_SOC_DAPM_POST_PMD:
223 gpiod_set_value_cansleep(priv->gpio_mic_bias, 0);
224 break;
225 }
226
227 return 0;
228}
229
230static int tm2_set_bias_level(struct snd_soc_card *card,
231 struct snd_soc_dapm_context *dapm,
232 enum snd_soc_bias_level level)
233{
234 struct snd_soc_pcm_runtime *rtd;
235
236 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[0].name);
237
238 if (dapm->dev != rtd->codec_dai->dev)
239 return 0;
240
241 switch (level) {
242 case SND_SOC_BIAS_STANDBY:
243 if (card->dapm.bias_level == SND_SOC_BIAS_OFF)
244 tm2_start_sysclk(card);
245 break;
246 case SND_SOC_BIAS_OFF:
247 tm2_stop_sysclk(card);
248 break;
249 default:
250 break;
251 }
252
253 return 0;
254}
255
256static struct snd_soc_aux_dev tm2_speaker_amp_dev;
257
258static int tm2_late_probe(struct snd_soc_card *card)
259{
260 struct tm2_machine_priv *priv = snd_soc_card_get_drvdata(card);
261 struct snd_soc_dai_link_component dlc = { 0 };
262 unsigned int ch_map[] = { 0, 1 };
263 struct snd_soc_dai *amp_pdm_dai;
264 struct snd_soc_pcm_runtime *rtd;
265 struct snd_soc_dai *aif1_dai;
266 struct snd_soc_dai *aif2_dai;
267 int ret;
268
269 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[TM2_DAI_AIF1].name);
270 aif1_dai = rtd->codec_dai;
271 priv->codec = rtd->codec;
272
273 ret = snd_soc_dai_set_sysclk(aif1_dai, ARIZONA_CLK_SYSCLK, 0, 0);
274 if (ret < 0) {
275 dev_err(aif1_dai->dev, "Failed to set SYSCLK: %d\n", ret);
276 return ret;
277 }
278
279 rtd = snd_soc_get_pcm_runtime(card, card->dai_link[TM2_DAI_AIF2].name);
280 aif2_dai = rtd->codec_dai;
281
282 ret = snd_soc_dai_set_sysclk(aif2_dai, ARIZONA_CLK_ASYNCCLK, 0, 0);
283 if (ret < 0) {
284 dev_err(aif2_dai->dev, "Failed to set ASYNCCLK: %d\n", ret);
285 return ret;
286 }
287
288 dlc.of_node = tm2_speaker_amp_dev.codec_of_node;
289 amp_pdm_dai = snd_soc_find_dai(&dlc);
290 if (!amp_pdm_dai)
291 return -ENODEV;
292
293 /* Set the MAX98504 V/I sense PDM Tx DAI channel mapping */
294 ret = snd_soc_dai_set_channel_map(amp_pdm_dai, ARRAY_SIZE(ch_map),
295 ch_map, 0, NULL);
296 if (ret < 0)
297 return ret;
298
299 ret = snd_soc_dai_set_tdm_slot(amp_pdm_dai, 0x3, 0x0, 2, 16);
300 if (ret < 0)
301 return ret;
302
303 return 0;
304}
305
306static const struct snd_kcontrol_new tm2_controls[] = {
307 SOC_DAPM_PIN_SWITCH("HP"),
308 SOC_DAPM_PIN_SWITCH("SPK"),
309 SOC_DAPM_PIN_SWITCH("RCV"),
310 SOC_DAPM_PIN_SWITCH("VPS"),
311 SOC_DAPM_PIN_SWITCH("HDMI"),
312
313 SOC_DAPM_PIN_SWITCH("Main Mic"),
314 SOC_DAPM_PIN_SWITCH("Sub Mic"),
315 SOC_DAPM_PIN_SWITCH("Third Mic"),
316
317 SOC_DAPM_PIN_SWITCH("Headset Mic"),
318};
319
320const struct snd_soc_dapm_widget tm2_dapm_widgets[] = {
321 SND_SOC_DAPM_HP("HP", NULL),
322 SND_SOC_DAPM_SPK("SPK", NULL),
323 SND_SOC_DAPM_SPK("RCV", NULL),
324 SND_SOC_DAPM_LINE("VPS", NULL),
325 SND_SOC_DAPM_LINE("HDMI", NULL),
326
327 SND_SOC_DAPM_MIC("Main Mic", tm2_mic_bias),
328 SND_SOC_DAPM_MIC("Sub Mic", NULL),
329 SND_SOC_DAPM_MIC("Third Mic", NULL),
330
331 SND_SOC_DAPM_MIC("Headset Mic", NULL),
332};
333
334static const struct snd_soc_component_driver tm2_component = {
335 .name = "tm2-audio",
336};
337
338static struct snd_soc_dai_driver tm2_ext_dai[] = {
339 {
340 .name = "Voice call",
341 .playback = {
342 .channels_min = 1,
343 .channels_max = 4,
344 .rate_min = 8000,
345 .rate_max = 48000,
346 .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
347 SNDRV_PCM_RATE_48000),
348 .formats = SNDRV_PCM_FMTBIT_S16_LE,
349 },
350 .capture = {
351 .channels_min = 1,
352 .channels_max = 4,
353 .rate_min = 8000,
354 .rate_max = 48000,
355 .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |
356 SNDRV_PCM_RATE_48000),
357 .formats = SNDRV_PCM_FMTBIT_S16_LE,
358 },
359 },
360 {
361 .name = "Bluetooth",
362 .playback = {
363 .channels_min = 1,
364 .channels_max = 4,
365 .rate_min = 8000,
366 .rate_max = 16000,
367 .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000),
368 .formats = SNDRV_PCM_FMTBIT_S16_LE,
369 },
370 .capture = {
371 .channels_min = 1,
372 .channels_max = 2,
373 .rate_min = 8000,
374 .rate_max = 16000,
375 .rates = (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000),
376 .formats = SNDRV_PCM_FMTBIT_S16_LE,
377 },
378 },
379};
380
381static struct snd_soc_dai_link tm2_dai_links[] = {
382 {
383 .name = "WM5110 AIF1",
384 .stream_name = "HiFi Primary",
385 .codec_dai_name = "wm5110-aif1",
386 .ops = &tm2_aif1_ops,
387 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
388 SND_SOC_DAIFMT_CBM_CFM,
389 }, {
390 .name = "WM5110 Voice",
391 .stream_name = "Voice call",
392 .codec_dai_name = "wm5110-aif2",
393 .ops = &tm2_aif2_ops,
394 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
395 SND_SOC_DAIFMT_CBM_CFM,
396 .ignore_suspend = 1,
397 }, {
398 .name = "WM5110 BT",
399 .stream_name = "Bluetooth",
400 .codec_dai_name = "wm5110-aif3",
401 .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF |
402 SND_SOC_DAIFMT_CBM_CFM,
403 .ignore_suspend = 1,
404 }
405};
406
407static struct snd_soc_card tm2_card = {
408 .owner = THIS_MODULE,
409
410 .dai_link = tm2_dai_links,
411 .num_links = ARRAY_SIZE(tm2_dai_links),
412 .controls = tm2_controls,
413 .num_controls = ARRAY_SIZE(tm2_controls),
414 .dapm_widgets = tm2_dapm_widgets,
415 .num_dapm_widgets = ARRAY_SIZE(tm2_dapm_widgets),
416 .aux_dev = &tm2_speaker_amp_dev,
417 .num_aux_devs = 1,
418
419 .late_probe = tm2_late_probe,
420 .set_bias_level = tm2_set_bias_level,
421};
422
423static int tm2_probe(struct platform_device *pdev)
424{
425 struct device *dev = &pdev->dev;
426 struct snd_soc_card *card = &tm2_card;
427 struct tm2_machine_priv *priv;
428 struct device_node *cpu_dai_node, *codec_dai_node;
429 int ret, i;
430
431 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
432 if (!priv)
433 return -ENOMEM;
434
435 snd_soc_card_set_drvdata(card, priv);
436 card->dev = dev;
437
438 priv->gpio_mic_bias = devm_gpiod_get(dev, "mic-bias",
439 GPIOF_OUT_INIT_LOW);
440 if (IS_ERR(priv->gpio_mic_bias)) {
441 dev_err(dev, "Failed to get mic bias gpio\n");
442 return PTR_ERR(priv->gpio_mic_bias);
443 }
444
445 ret = snd_soc_of_parse_card_name(card, "model");
446 if (ret < 0) {
447 dev_err(dev, "Card name is not specified\n");
448 return ret;
449 }
450
451 ret = snd_soc_of_parse_audio_routing(card, "samsung,audio-routing");
452 if (ret < 0) {
453 dev_err(dev, "Audio routing is not specified or invalid\n");
454 return ret;
455 }
456
457 card->aux_dev[0].codec_of_node = of_parse_phandle(dev->of_node,
458 "audio-amplifier", 0);
459 if (!card->aux_dev[0].codec_of_node) {
460 dev_err(dev, "audio-amplifier property invalid or missing\n");
461 return -EINVAL;
462 }
463
464 cpu_dai_node = of_parse_phandle(dev->of_node, "i2s-controller", 0);
465 if (!cpu_dai_node) {
466 dev_err(dev, "i2s-controllers property invalid or missing\n");
467 ret = -EINVAL;
468 goto amp_node_put;
469 }
470
471 codec_dai_node = of_parse_phandle(dev->of_node, "audio-codec", 0);
472 if (!codec_dai_node) {
473 dev_err(dev, "audio-codec property invalid or missing\n");
474 ret = -EINVAL;
475 goto cpu_dai_node_put;
476 }
477
478 for (i = 0; i < card->num_links; i++) {
479 card->dai_link[i].cpu_dai_name = NULL;
480 card->dai_link[i].cpu_name = NULL;
481 card->dai_link[i].platform_name = NULL;
482 card->dai_link[i].codec_of_node = codec_dai_node;
483 card->dai_link[i].cpu_of_node = cpu_dai_node;
484 card->dai_link[i].platform_of_node = cpu_dai_node;
485 }
486
487 ret = devm_snd_soc_register_component(dev, &tm2_component,
488 tm2_ext_dai, ARRAY_SIZE(tm2_ext_dai));
489 if (ret < 0) {
490 dev_err(dev, "Failed to register component: %d\n", ret);
491 goto codec_dai_node_put;
492 }
493
494 ret = devm_snd_soc_register_card(dev, card);
495 if (ret < 0) {
496 dev_err(dev, "Failed to register card: %d\n", ret);
497 goto codec_dai_node_put;
498 }
499
500codec_dai_node_put:
501 of_node_put(codec_dai_node);
502cpu_dai_node_put:
503 of_node_put(cpu_dai_node);
504amp_node_put:
505 of_node_put(card->aux_dev[0].codec_of_node);
506 return ret;
507}
508
509static int tm2_pm_prepare(struct device *dev)
510{
511 struct snd_soc_card *card = dev_get_drvdata(dev);
512
513 return tm2_stop_sysclk(card);
514}
515
516static void tm2_pm_complete(struct device *dev)
517{
518 struct snd_soc_card *card = dev_get_drvdata(dev);
519
520 tm2_start_sysclk(card);
521}
522
523const struct dev_pm_ops tm2_pm_ops = {
524 .prepare = tm2_pm_prepare,
525 .suspend = snd_soc_suspend,
526 .resume = snd_soc_resume,
527 .complete = tm2_pm_complete,
528 .freeze = snd_soc_suspend,
529 .thaw = snd_soc_resume,
530 .poweroff = snd_soc_poweroff,
531 .restore = snd_soc_resume,
532};
533
534static const struct of_device_id tm2_of_match[] = {
535 { .compatible = "samsung,tm2-audio" },
536 { },
537};
538MODULE_DEVICE_TABLE(of, tm2_of_match);
539
540static struct platform_driver tm2_driver = {
541 .driver = {
542 .name = "tm2-audio",
543 .pm = &tm2_pm_ops,
544 .of_match_table = tm2_of_match,
545 },
546 .probe = tm2_probe,
547};
548module_platform_driver(tm2_driver);
549
550MODULE_AUTHOR("Inha Song <ideal.song@samsung.com>");
551MODULE_DESCRIPTION("ALSA SoC Exynos TM2 Audio Support");
552MODULE_LICENSE("GPL v2");
diff --git a/sound/soc/sh/Kconfig b/sound/soc/sh/Kconfig
index 6db6405d952f..147ebecfed94 100644
--- a/sound/soc/sh/Kconfig
+++ b/sound/soc/sh/Kconfig
@@ -1,5 +1,5 @@
1menu "SoC Audio support for SuperH" 1menu "SoC Audio support for SuperH"
2 depends on SUPERH || ARCH_SHMOBILE 2 depends on SUPERH || ARCH_SHMOBILE || COMPILE_TEST
3 3
4config SND_SOC_PCM_SH7760 4config SND_SOC_PCM_SH7760
5 tristate "SoC Audio support for Renesas SH7760" 5 tristate "SoC Audio support for Renesas SH7760"
@@ -37,6 +37,7 @@ config SND_SOC_SH4_SIU
37config SND_SOC_RCAR 37config SND_SOC_RCAR
38 tristate "R-Car series SRU/SCU/SSIU/SSI support" 38 tristate "R-Car series SRU/SCU/SSIU/SSI support"
39 depends on COMMON_CLK 39 depends on COMMON_CLK
40 depends on OF || COMPILE_TEST
40 select SND_SIMPLE_CARD 41 select SND_SIMPLE_CARD
41 select REGMAP_MMIO 42 select REGMAP_MMIO
42 help 43 help
diff --git a/sound/soc/sh/rcar/adg.c b/sound/soc/sh/rcar/adg.c
index 2145957d0229..85a33ac0a5c4 100644
--- a/sound/soc/sh/rcar/adg.c
+++ b/sound/soc/sh/rcar/adg.c
@@ -34,6 +34,9 @@ struct rsnd_adg {
34 struct clk_onecell_data onecell; 34 struct clk_onecell_data onecell;
35 struct rsnd_mod mod; 35 struct rsnd_mod mod;
36 u32 flags; 36 u32 flags;
37 u32 ckr;
38 u32 rbga;
39 u32 rbgb;
37 40
38 int rbga_rate_for_441khz; /* RBGA */ 41 int rbga_rate_for_441khz; /* RBGA */
39 int rbgb_rate_for_48khz; /* RBGB */ 42 int rbgb_rate_for_48khz; /* RBGB */
@@ -316,9 +319,11 @@ int rsnd_adg_ssi_clk_try_start(struct rsnd_mod *ssi_mod, unsigned int rate)
316 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod); 319 struct rsnd_priv *priv = rsnd_mod_to_priv(ssi_mod);
317 struct rsnd_adg *adg = rsnd_priv_to_adg(priv); 320 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
318 struct device *dev = rsnd_priv_to_dev(priv); 321 struct device *dev = rsnd_priv_to_dev(priv);
322 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
319 struct clk *clk; 323 struct clk *clk;
320 int i; 324 int i;
321 u32 data; 325 u32 data;
326 u32 ckr = 0;
322 int sel_table[] = { 327 int sel_table[] = {
323 [CLKA] = 0x1, 328 [CLKA] = 0x1,
324 [CLKB] = 0x2, 329 [CLKB] = 0x2,
@@ -360,15 +365,14 @@ found_clock:
360 rsnd_adg_set_ssi_clk(ssi_mod, data); 365 rsnd_adg_set_ssi_clk(ssi_mod, data);
361 366
362 if (!(adg_mode_flags(adg) & LRCLK_ASYNC)) { 367 if (!(adg_mode_flags(adg) & LRCLK_ASYNC)) {
363 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
364 u32 ckr = 0;
365
366 if (0 == (rate % 8000)) 368 if (0 == (rate % 8000))
367 ckr = 0x80000000; 369 ckr = 0x80000000;
368
369 rsnd_mod_bset(adg_mod, SSICKR, 0x80000000, ckr);
370 } 370 }
371 371
372 rsnd_mod_bset(adg_mod, BRGCKR, 0x80FF0000, adg->ckr | ckr);
373 rsnd_mod_write(adg_mod, BRRA, adg->rbga);
374 rsnd_mod_write(adg_mod, BRRB, adg->rbgb);
375
372 dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n", 376 dev_dbg(dev, "ADG: %s[%d] selects 0x%x for %d\n",
373 rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod), 377 rsnd_mod_name(ssi_mod), rsnd_mod_id(ssi_mod),
374 data, rate); 378 data, rate);
@@ -376,6 +380,25 @@ found_clock:
376 return 0; 380 return 0;
377} 381}
378 382
383void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable)
384{
385 struct rsnd_adg *adg = rsnd_priv_to_adg(priv);
386 struct device *dev = rsnd_priv_to_dev(priv);
387 struct clk *clk;
388 int i, ret;
389
390 for_each_rsnd_clk(clk, adg, i) {
391 ret = 0;
392 if (enable)
393 ret = clk_prepare_enable(clk);
394 else
395 clk_disable_unprepare(clk);
396
397 if (ret < 0)
398 dev_warn(dev, "can't use clk %d\n", i);
399 }
400}
401
379static void rsnd_adg_get_clkin(struct rsnd_priv *priv, 402static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
380 struct rsnd_adg *adg) 403 struct rsnd_adg *adg)
381{ 404{
@@ -387,27 +410,21 @@ static void rsnd_adg_get_clkin(struct rsnd_priv *priv,
387 [CLKC] = "clk_c", 410 [CLKC] = "clk_c",
388 [CLKI] = "clk_i", 411 [CLKI] = "clk_i",
389 }; 412 };
390 int i, ret; 413 int i;
391 414
392 for (i = 0; i < CLKMAX; i++) { 415 for (i = 0; i < CLKMAX; i++) {
393 clk = devm_clk_get(dev, clk_name[i]); 416 clk = devm_clk_get(dev, clk_name[i]);
394 adg->clk[i] = IS_ERR(clk) ? NULL : clk; 417 adg->clk[i] = IS_ERR(clk) ? NULL : clk;
395 } 418 }
396 419
397 for_each_rsnd_clk(clk, adg, i) { 420 for_each_rsnd_clk(clk, adg, i)
398 ret = clk_prepare_enable(clk);
399 if (ret < 0)
400 dev_warn(dev, "can't use clk %d\n", i);
401
402 dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk)); 421 dev_dbg(dev, "clk %d : %p : %ld\n", i, clk, clk_get_rate(clk));
403 }
404} 422}
405 423
406static void rsnd_adg_get_clkout(struct rsnd_priv *priv, 424static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
407 struct rsnd_adg *adg) 425 struct rsnd_adg *adg)
408{ 426{
409 struct clk *clk; 427 struct clk *clk;
410 struct rsnd_mod *adg_mod = rsnd_mod_get(adg);
411 struct device *dev = rsnd_priv_to_dev(priv); 428 struct device *dev = rsnd_priv_to_dev(priv);
412 struct device_node *np = dev->of_node; 429 struct device_node *np = dev->of_node;
413 u32 ckr, rbgx, rbga, rbgb; 430 u32 ckr, rbgx, rbga, rbgb;
@@ -532,13 +549,13 @@ static void rsnd_adg_get_clkout(struct rsnd_priv *priv,
532 } 549 }
533 } 550 }
534 551
535 rsnd_mod_bset(adg_mod, SSICKR, 0x80FF0000, ckr); 552 adg->ckr = ckr;
536 rsnd_mod_write(adg_mod, BRRA, rbga); 553 adg->rbga = rbga;
537 rsnd_mod_write(adg_mod, BRRB, rbgb); 554 adg->rbgb = rbgb;
538 555
539 for_each_rsnd_clkout(clk, adg, i) 556 for_each_rsnd_clkout(clk, adg, i)
540 dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk)); 557 dev_dbg(dev, "clkout %d : %p : %ld\n", i, clk, clk_get_rate(clk));
541 dev_dbg(dev, "SSICKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n", 558 dev_dbg(dev, "BRGCKR = 0x%08x, BRRA/BRRB = 0x%x/0x%x\n",
542 ckr, rbga, rbgb); 559 ckr, rbga, rbgb);
543} 560}
544 561
@@ -565,16 +582,12 @@ int rsnd_adg_probe(struct rsnd_priv *priv)
565 582
566 priv->adg = adg; 583 priv->adg = adg;
567 584
585 rsnd_adg_clk_enable(priv);
586
568 return 0; 587 return 0;
569} 588}
570 589
571void rsnd_adg_remove(struct rsnd_priv *priv) 590void rsnd_adg_remove(struct rsnd_priv *priv)
572{ 591{
573 struct rsnd_adg *adg = rsnd_priv_to_adg(priv); 592 rsnd_adg_clk_disable(priv);
574 struct clk *clk;
575 int i;
576
577 for_each_rsnd_clk(clk, adg, i) {
578 clk_disable_unprepare(clk);
579 }
580} 593}
diff --git a/sound/soc/sh/rcar/core.c b/sound/soc/sh/rcar/core.c
index f18141098b50..4bd68de76130 100644
--- a/sound/soc/sh/rcar/core.c
+++ b/sound/soc/sh/rcar/core.c
@@ -306,7 +306,7 @@ u32 rsnd_get_adinr_bit(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
306 */ 306 */
307u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io) 307u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
308{ 308{
309 struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io); 309 struct rsnd_mod *ssiu = rsnd_io_to_mod_ssiu(io);
310 struct rsnd_mod *target; 310 struct rsnd_mod *target;
311 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 311 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
312 u32 val = 0x76543210; 312 u32 val = 0x76543210;
@@ -315,11 +315,11 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
315 if (rsnd_io_is_play(io)) { 315 if (rsnd_io_is_play(io)) {
316 struct rsnd_mod *src = rsnd_io_to_mod_src(io); 316 struct rsnd_mod *src = rsnd_io_to_mod_src(io);
317 317
318 target = src ? src : ssi; 318 target = src ? src : ssiu;
319 } else { 319 } else {
320 struct rsnd_mod *cmd = rsnd_io_to_mod_cmd(io); 320 struct rsnd_mod *cmd = rsnd_io_to_mod_cmd(io);
321 321
322 target = cmd ? cmd : ssi; 322 target = cmd ? cmd : ssiu;
323 } 323 }
324 324
325 mask <<= runtime->channels * 4; 325 mask <<= runtime->channels * 4;
@@ -348,32 +348,28 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io)
348/* 348/*
349 * rsnd_dai functions 349 * rsnd_dai functions
350 */ 350 */
351#define rsnd_mod_call(idx, io, func, param...) \ 351struct rsnd_mod *rsnd_mod_next(int *iterator,
352({ \ 352 struct rsnd_dai_stream *io,
353 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \ 353 enum rsnd_mod_type *array,
354 struct rsnd_mod *mod = (io)->mod[idx]; \ 354 int array_size)
355 struct device *dev = rsnd_priv_to_dev(priv); \ 355{
356 u32 *status = mod->get_status(io, mod, idx); \ 356 struct rsnd_mod *mod;
357 u32 mask = 0xF << __rsnd_mod_shift_##func; \ 357 enum rsnd_mod_type type;
358 u8 val = (*status >> __rsnd_mod_shift_##func) & 0xF; \ 358 int max = array ? array_size : RSND_MOD_MAX;
359 u8 add = ((val + __rsnd_mod_add_##func) & 0xF); \ 359
360 int ret = 0; \ 360 for (; *iterator < max; (*iterator)++) {
361 int call = (val == __rsnd_mod_call_##func) && (mod)->ops->func; \ 361 type = (array) ? array[*iterator] : *iterator;
362 if (add == 0xF) \ 362 mod = io->mod[type];
363 call = 0; \ 363 if (!mod)
364 else \ 364 continue;
365 *status = (*status & ~mask) + \ 365
366 (add << __rsnd_mod_shift_##func); \ 366 (*iterator)++;
367 dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \ 367
368 rsnd_mod_name(mod), rsnd_mod_id(mod), \ 368 return mod;
369 *status, call ? #func : ""); \ 369 }
370 if (call) \ 370
371 ret = (mod)->ops->func(mod, io, param); \ 371 return NULL;
372 if (ret) \ 372}
373 dev_dbg(dev, "%s[%d] : rsnd_mod_call error %d\n", \
374 rsnd_mod_name(mod), rsnd_mod_id(mod), ret); \
375 ret; \
376})
377 373
378static enum rsnd_mod_type rsnd_mod_sequence[][RSND_MOD_MAX] = { 374static enum rsnd_mod_type rsnd_mod_sequence[][RSND_MOD_MAX] = {
379 { 375 {
@@ -409,19 +405,49 @@ static enum rsnd_mod_type rsnd_mod_sequence[][RSND_MOD_MAX] = {
409 }, 405 },
410}; 406};
411 407
412#define rsnd_dai_call(fn, io, param...) \ 408static int rsnd_status_update(u32 *status,
413({ \ 409 int shift, int add, int timing)
414 struct rsnd_mod *mod; \ 410{
415 int type, is_play = rsnd_io_is_play(io); \ 411 u32 mask = 0xF << shift;
416 int ret = 0, i; \ 412 u8 val = (*status >> shift) & 0xF;
417 for (i = 0; i < RSND_MOD_MAX; i++) { \ 413 u8 next_val = (val + add) & 0xF;
418 type = rsnd_mod_sequence[is_play][i]; \ 414 int func_call = (val == timing);
419 mod = (io)->mod[type]; \ 415
420 if (!mod) \ 416 if (next_val == 0xF) /* underflow case */
421 continue; \ 417 func_call = 0;
422 ret |= rsnd_mod_call(type, io, fn, param); \ 418 else
423 } \ 419 *status = (*status & ~mask) + (next_val << shift);
424 ret; \ 420
421 return func_call;
422}
423
424#define rsnd_dai_call(fn, io, param...) \
425({ \
426 struct rsnd_priv *priv = rsnd_io_to_priv(io); \
427 struct device *dev = rsnd_priv_to_dev(priv); \
428 struct rsnd_mod *mod; \
429 int is_play = rsnd_io_is_play(io); \
430 int ret = 0, i; \
431 enum rsnd_mod_type *types = rsnd_mod_sequence[is_play]; \
432 for_each_rsnd_mod_arrays(i, mod, io, types, RSND_MOD_MAX) { \
433 int tmp = 0; \
434 u32 *status = mod->get_status(io, mod, types[i]); \
435 int func_call = rsnd_status_update(status, \
436 __rsnd_mod_shift_##fn, \
437 __rsnd_mod_add_##fn, \
438 __rsnd_mod_call_##fn); \
439 dev_dbg(dev, "%s[%d]\t0x%08x %s\n", \
440 rsnd_mod_name(mod), rsnd_mod_id(mod), *status, \
441 (func_call && (mod)->ops->fn) ? #fn : ""); \
442 if (func_call && (mod)->ops->fn) \
443 tmp = (mod)->ops->fn(mod, io, param); \
444 if (tmp) \
445 dev_err(dev, "%s[%d] : %s error %d\n", \
446 rsnd_mod_name(mod), rsnd_mod_id(mod), \
447 #fn, tmp); \
448 ret |= tmp; \
449 } \
450 ret; \
425}) 451})
426 452
427int rsnd_dai_connect(struct rsnd_mod *mod, 453int rsnd_dai_connect(struct rsnd_mod *mod,
@@ -690,7 +716,33 @@ static int rsnd_soc_set_dai_tdm_slot(struct snd_soc_dai *dai,
690 return 0; 716 return 0;
691} 717}
692 718
719static int rsnd_soc_dai_startup(struct snd_pcm_substream *substream,
720 struct snd_soc_dai *dai)
721{
722 struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
723 struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
724
725 /*
726 * call rsnd_dai_call without spinlock
727 */
728 return rsnd_dai_call(nolock_start, io, priv);
729}
730
731static void rsnd_soc_dai_shutdown(struct snd_pcm_substream *substream,
732 struct snd_soc_dai *dai)
733{
734 struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
735 struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
736
737 /*
738 * call rsnd_dai_call without spinlock
739 */
740 rsnd_dai_call(nolock_stop, io, priv);
741}
742
693static const struct snd_soc_dai_ops rsnd_soc_dai_ops = { 743static const struct snd_soc_dai_ops rsnd_soc_dai_ops = {
744 .startup = rsnd_soc_dai_startup,
745 .shutdown = rsnd_soc_dai_shutdown,
694 .trigger = rsnd_soc_dai_trigger, 746 .trigger = rsnd_soc_dai_trigger,
695 .set_fmt = rsnd_soc_dai_set_fmt, 747 .set_fmt = rsnd_soc_dai_set_fmt,
696 .set_tdm_slot = rsnd_soc_set_dai_tdm_slot, 748 .set_tdm_slot = rsnd_soc_set_dai_tdm_slot,
@@ -993,7 +1045,11 @@ static int __rsnd_kctrl_new(struct rsnd_mod *mod,
993 1045
994void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg) 1046void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg)
995{ 1047{
996 snd_ctl_remove(cfg->card, cfg->kctrl); 1048 if (cfg->card && cfg->kctrl)
1049 snd_ctl_remove(cfg->card, cfg->kctrl);
1050
1051 cfg->card = NULL;
1052 cfg->kctrl = NULL;
997} 1053}
998 1054
999int rsnd_kctrl_new_m(struct rsnd_mod *mod, 1055int rsnd_kctrl_new_m(struct rsnd_mod *mod,
@@ -1070,8 +1126,8 @@ static int rsnd_pcm_new(struct snd_soc_pcm_runtime *rtd)
1070 1126
1071 return snd_pcm_lib_preallocate_pages_for_all( 1127 return snd_pcm_lib_preallocate_pages_for_all(
1072 rtd->pcm, 1128 rtd->pcm,
1073 SNDRV_DMA_TYPE_DEV, 1129 SNDRV_DMA_TYPE_CONTINUOUS,
1074 rtd->card->snd_card->dev, 1130 snd_dma_continuous_data(GFP_KERNEL),
1075 PREALLOC_BUFFER, PREALLOC_BUFFER_MAX); 1131 PREALLOC_BUFFER, PREALLOC_BUFFER_MAX);
1076} 1132}
1077 1133
@@ -1092,6 +1148,7 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
1092 ret = rsnd_dai_call(probe, io, priv); 1148 ret = rsnd_dai_call(probe, io, priv);
1093 if (ret == -EAGAIN) { 1149 if (ret == -EAGAIN) {
1094 struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io); 1150 struct rsnd_mod *ssi_mod = rsnd_io_to_mod_ssi(io);
1151 struct rsnd_mod *mod;
1095 int i; 1152 int i;
1096 1153
1097 /* 1154 /*
@@ -1111,8 +1168,8 @@ static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
1111 * remove all mod from io 1168 * remove all mod from io
1112 * and, re connect ssi 1169 * and, re connect ssi
1113 */ 1170 */
1114 for (i = 0; i < RSND_MOD_MAX; i++) 1171 for_each_rsnd_mod(i, mod, io)
1115 rsnd_dai_disconnect((io)->mod[i], io, i); 1172 rsnd_dai_disconnect(mod, io, i);
1116 rsnd_dai_connect(ssi_mod, io, RSND_MOD_SSI); 1173 rsnd_dai_connect(ssi_mod, io, RSND_MOD_SSI);
1117 1174
1118 /* 1175 /*
@@ -1251,9 +1308,33 @@ static int rsnd_remove(struct platform_device *pdev)
1251 return ret; 1308 return ret;
1252} 1309}
1253 1310
1311static int rsnd_suspend(struct device *dev)
1312{
1313 struct rsnd_priv *priv = dev_get_drvdata(dev);
1314
1315 rsnd_adg_clk_disable(priv);
1316
1317 return 0;
1318}
1319
1320static int rsnd_resume(struct device *dev)
1321{
1322 struct rsnd_priv *priv = dev_get_drvdata(dev);
1323
1324 rsnd_adg_clk_enable(priv);
1325
1326 return 0;
1327}
1328
1329static struct dev_pm_ops rsnd_pm_ops = {
1330 .suspend = rsnd_suspend,
1331 .resume = rsnd_resume,
1332};
1333
1254static struct platform_driver rsnd_driver = { 1334static struct platform_driver rsnd_driver = {
1255 .driver = { 1335 .driver = {
1256 .name = "rcar_sound", 1336 .name = "rcar_sound",
1337 .pm = &rsnd_pm_ops,
1257 .of_match_table = rsnd_of_match, 1338 .of_match_table = rsnd_of_match,
1258 }, 1339 },
1259 .probe = rsnd_probe, 1340 .probe = rsnd_probe,
diff --git a/sound/soc/sh/rcar/dma.c b/sound/soc/sh/rcar/dma.c
index 6bc93cbb3049..1f405c833867 100644
--- a/sound/soc/sh/rcar/dma.c
+++ b/sound/soc/sh/rcar/dma.c
@@ -25,6 +25,10 @@
25 25
26struct rsnd_dmaen { 26struct rsnd_dmaen {
27 struct dma_chan *chan; 27 struct dma_chan *chan;
28 dma_addr_t dma_buf;
29 unsigned int dma_len;
30 unsigned int dma_period;
31 unsigned int dma_cnt;
28}; 32};
29 33
30struct rsnd_dmapp { 34struct rsnd_dmapp {
@@ -34,6 +38,8 @@ struct rsnd_dmapp {
34 38
35struct rsnd_dma { 39struct rsnd_dma {
36 struct rsnd_mod mod; 40 struct rsnd_mod mod;
41 struct rsnd_mod *mod_from;
42 struct rsnd_mod *mod_to;
37 dma_addr_t src_addr; 43 dma_addr_t src_addr;
38 dma_addr_t dst_addr; 44 dma_addr_t dst_addr;
39 union { 45 union {
@@ -56,10 +62,38 @@ struct rsnd_dma_ctrl {
56/* 62/*
57 * Audio DMAC 63 * Audio DMAC
58 */ 64 */
65#define rsnd_dmaen_sync(dmaen, io, i) __rsnd_dmaen_sync(dmaen, io, i, 1)
66#define rsnd_dmaen_unsync(dmaen, io, i) __rsnd_dmaen_sync(dmaen, io, i, 0)
67static void __rsnd_dmaen_sync(struct rsnd_dmaen *dmaen, struct rsnd_dai_stream *io,
68 int i, int sync)
69{
70 struct device *dev = dmaen->chan->device->dev;
71 enum dma_data_direction dir;
72 int is_play = rsnd_io_is_play(io);
73 dma_addr_t buf;
74 int len, max;
75 size_t period;
76
77 len = dmaen->dma_len;
78 period = dmaen->dma_period;
79 max = len / period;
80 i = i % max;
81 buf = dmaen->dma_buf + (period * i);
82
83 dir = is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
84
85 if (sync)
86 dma_sync_single_for_device(dev, buf, period, dir);
87 else
88 dma_sync_single_for_cpu(dev, buf, period, dir);
89}
90
59static void __rsnd_dmaen_complete(struct rsnd_mod *mod, 91static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
60 struct rsnd_dai_stream *io) 92 struct rsnd_dai_stream *io)
61{ 93{
62 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 94 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
95 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
96 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
63 bool elapsed = false; 97 bool elapsed = false;
64 unsigned long flags; 98 unsigned long flags;
65 99
@@ -76,9 +110,22 @@ static void __rsnd_dmaen_complete(struct rsnd_mod *mod,
76 */ 110 */
77 spin_lock_irqsave(&priv->lock, flags); 111 spin_lock_irqsave(&priv->lock, flags);
78 112
79 if (rsnd_io_is_working(io)) 113 if (rsnd_io_is_working(io)) {
114 rsnd_dmaen_unsync(dmaen, io, dmaen->dma_cnt);
115
116 /*
117 * Next period is already started.
118 * Let's sync Next Next period
119 * see
120 * rsnd_dmaen_start()
121 */
122 rsnd_dmaen_sync(dmaen, io, dmaen->dma_cnt + 2);
123
80 elapsed = rsnd_dai_pointer_update(io, io->byte_per_period); 124 elapsed = rsnd_dai_pointer_update(io, io->byte_per_period);
81 125
126 dmaen->dma_cnt++;
127 }
128
82 spin_unlock_irqrestore(&priv->lock, flags); 129 spin_unlock_irqrestore(&priv->lock, flags);
83 130
84 if (elapsed) 131 if (elapsed)
@@ -92,6 +139,20 @@ static void rsnd_dmaen_complete(void *data)
92 rsnd_mod_interrupt(mod, __rsnd_dmaen_complete); 139 rsnd_mod_interrupt(mod, __rsnd_dmaen_complete);
93} 140}
94 141
142static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
143 struct rsnd_mod *mod_from,
144 struct rsnd_mod *mod_to)
145{
146 if ((!mod_from && !mod_to) ||
147 (mod_from && mod_to))
148 return NULL;
149
150 if (mod_from)
151 return rsnd_mod_dma_req(io, mod_from);
152 else
153 return rsnd_mod_dma_req(io, mod_to);
154}
155
95static int rsnd_dmaen_stop(struct rsnd_mod *mod, 156static int rsnd_dmaen_stop(struct rsnd_mod *mod,
96 struct rsnd_dai_stream *io, 157 struct rsnd_dai_stream *io,
97 struct rsnd_priv *priv) 158 struct rsnd_priv *priv)
@@ -99,7 +160,66 @@ static int rsnd_dmaen_stop(struct rsnd_mod *mod,
99 struct rsnd_dma *dma = rsnd_mod_to_dma(mod); 160 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
100 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma); 161 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
101 162
102 dmaengine_terminate_all(dmaen->chan); 163 if (dmaen->chan) {
164 int is_play = rsnd_io_is_play(io);
165
166 dmaengine_terminate_all(dmaen->chan);
167 dma_unmap_single(dmaen->chan->device->dev,
168 dmaen->dma_buf, dmaen->dma_len,
169 is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
170 }
171
172 return 0;
173}
174
175static int rsnd_dmaen_nolock_stop(struct rsnd_mod *mod,
176 struct rsnd_dai_stream *io,
177 struct rsnd_priv *priv)
178{
179 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
180 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
181
182 /*
183 * DMAEngine release uses mutex lock.
184 * Thus, it shouldn't be called under spinlock.
185 * Let's call it under nolock_start
186 */
187 if (dmaen->chan)
188 dma_release_channel(dmaen->chan);
189
190 dmaen->chan = NULL;
191
192 return 0;
193}
194
195static int rsnd_dmaen_nolock_start(struct rsnd_mod *mod,
196 struct rsnd_dai_stream *io,
197 struct rsnd_priv *priv)
198{
199 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
200 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
201 struct device *dev = rsnd_priv_to_dev(priv);
202
203 if (dmaen->chan) {
204 dev_err(dev, "it already has dma channel\n");
205 return -EIO;
206 }
207
208 /*
209 * DMAEngine request uses mutex lock.
210 * Thus, it shouldn't be called under spinlock.
211 * Let's call it under nolock_start
212 */
213 dmaen->chan = rsnd_dmaen_request_channel(io,
214 dma->mod_from,
215 dma->mod_to);
216 if (IS_ERR_OR_NULL(dmaen->chan)) {
217 int ret = PTR_ERR(dmaen->chan);
218
219 dmaen->chan = NULL;
220 dev_err(dev, "can't get dma channel\n");
221 return ret;
222 }
103 223
104 return 0; 224 return 0;
105} 225}
@@ -113,12 +233,41 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod,
113 struct snd_pcm_substream *substream = io->substream; 233 struct snd_pcm_substream *substream = io->substream;
114 struct device *dev = rsnd_priv_to_dev(priv); 234 struct device *dev = rsnd_priv_to_dev(priv);
115 struct dma_async_tx_descriptor *desc; 235 struct dma_async_tx_descriptor *desc;
236 struct dma_slave_config cfg = {};
237 dma_addr_t buf;
238 size_t len;
239 size_t period;
116 int is_play = rsnd_io_is_play(io); 240 int is_play = rsnd_io_is_play(io);
241 int i;
242 int ret;
243
244 cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
245 cfg.src_addr = dma->src_addr;
246 cfg.dst_addr = dma->dst_addr;
247 cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
248 cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
249
250 dev_dbg(dev, "%s[%d] %pad -> %pad\n",
251 rsnd_mod_name(mod), rsnd_mod_id(mod),
252 &cfg.src_addr, &cfg.dst_addr);
253
254 ret = dmaengine_slave_config(dmaen->chan, &cfg);
255 if (ret < 0)
256 return ret;
257
258 len = snd_pcm_lib_buffer_bytes(substream);
259 period = snd_pcm_lib_period_bytes(substream);
260 buf = dma_map_single(dmaen->chan->device->dev,
261 substream->runtime->dma_area,
262 len,
263 is_play ? DMA_TO_DEVICE : DMA_FROM_DEVICE);
264 if (dma_mapping_error(dmaen->chan->device->dev, buf)) {
265 dev_err(dev, "dma map failed\n");
266 return -EIO;
267 }
117 268
118 desc = dmaengine_prep_dma_cyclic(dmaen->chan, 269 desc = dmaengine_prep_dma_cyclic(dmaen->chan,
119 substream->runtime->dma_addr, 270 buf, len, period,
120 snd_pcm_lib_buffer_bytes(substream),
121 snd_pcm_lib_period_bytes(substream),
122 is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM, 271 is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM,
123 DMA_PREP_INTERRUPT | DMA_CTRL_ACK); 272 DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
124 273
@@ -130,6 +279,19 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod,
130 desc->callback = rsnd_dmaen_complete; 279 desc->callback = rsnd_dmaen_complete;
131 desc->callback_param = rsnd_mod_get(dma); 280 desc->callback_param = rsnd_mod_get(dma);
132 281
282 dmaen->dma_buf = buf;
283 dmaen->dma_len = len;
284 dmaen->dma_period = period;
285 dmaen->dma_cnt = 0;
286
287 /*
288 * synchronize this and next period
289 * see
290 * __rsnd_dmaen_complete()
291 */
292 for (i = 0; i < 2; i++)
293 rsnd_dmaen_sync(dmaen, io, i);
294
133 if (dmaengine_submit(desc) < 0) { 295 if (dmaengine_submit(desc) < 0) {
134 dev_err(dev, "dmaengine_submit() fail\n"); 296 dev_err(dev, "dmaengine_submit() fail\n");
135 return -EIO; 297 return -EIO;
@@ -143,124 +305,55 @@ static int rsnd_dmaen_start(struct rsnd_mod *mod,
143struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, 305struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
144 struct rsnd_mod *mod, char *name) 306 struct rsnd_mod *mod, char *name)
145{ 307{
146 struct dma_chan *chan; 308 struct dma_chan *chan = NULL;
147 struct device_node *np; 309 struct device_node *np;
148 int i = 0; 310 int i = 0;
149 311
150 for_each_child_of_node(of_node, np) { 312 for_each_child_of_node(of_node, np) {
151 if (i == rsnd_mod_id(mod)) 313 if (i == rsnd_mod_id(mod) && (!chan))
152 break; 314 chan = of_dma_request_slave_channel(np, name);
153 i++; 315 i++;
154 } 316 }
155 317
156 chan = of_dma_request_slave_channel(np, name); 318 /* It should call of_node_put(), since, it is rsnd_xxx_of_node() */
157
158 of_node_put(np);
159 of_node_put(of_node); 319 of_node_put(of_node);
160 320
161 return chan; 321 return chan;
162} 322}
163 323
164static struct dma_chan *rsnd_dmaen_request_channel(struct rsnd_dai_stream *io,
165 struct rsnd_mod *mod_from,
166 struct rsnd_mod *mod_to)
167{
168 if ((!mod_from && !mod_to) ||
169 (mod_from && mod_to))
170 return NULL;
171
172 if (mod_from)
173 return rsnd_mod_dma_req(io, mod_from);
174 else
175 return rsnd_mod_dma_req(io, mod_to);
176}
177
178static int rsnd_dmaen_remove(struct rsnd_mod *mod,
179 struct rsnd_dai_stream *io,
180 struct rsnd_priv *priv)
181{
182 struct rsnd_dma *dma = rsnd_mod_to_dma(mod);
183 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
184
185 if (dmaen->chan)
186 dma_release_channel(dmaen->chan);
187
188 dmaen->chan = NULL;
189
190 return 0;
191}
192
193static int rsnd_dmaen_attach(struct rsnd_dai_stream *io, 324static int rsnd_dmaen_attach(struct rsnd_dai_stream *io,
194 struct rsnd_dma *dma, int id, 325 struct rsnd_dma *dma,
195 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to) 326 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
196{ 327{
197 struct rsnd_mod *mod = rsnd_mod_get(dma);
198 struct rsnd_dmaen *dmaen = rsnd_dma_to_dmaen(dma);
199 struct rsnd_priv *priv = rsnd_io_to_priv(io); 328 struct rsnd_priv *priv = rsnd_io_to_priv(io);
200 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv); 329 struct rsnd_dma_ctrl *dmac = rsnd_priv_to_dmac(priv);
201 struct device *dev = rsnd_priv_to_dev(priv); 330 struct dma_chan *chan;
202 struct dma_slave_config cfg = {};
203 int is_play = rsnd_io_is_play(io);
204 int ret;
205
206 if (dmaen->chan) {
207 dev_err(dev, "it already has dma channel\n");
208 return -EIO;
209 }
210
211 if (dev->of_node) {
212 dmaen->chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
213 } else {
214 dma_cap_mask_t mask;
215
216 dma_cap_zero(mask);
217 dma_cap_set(DMA_SLAVE, mask);
218 331
219 dmaen->chan = dma_request_channel(mask, shdma_chan_filter, 332 /* try to get DMAEngine channel */
220 (void *)(uintptr_t)id); 333 chan = rsnd_dmaen_request_channel(io, mod_from, mod_to);
221 } 334 if (IS_ERR_OR_NULL(chan)) {
222 if (IS_ERR_OR_NULL(dmaen->chan)) { 335 /*
223 dmaen->chan = NULL; 336 * DMA failed. try to PIO mode
224 dev_err(dev, "can't get dma channel\n"); 337 * see
225 goto rsnd_dma_channel_err; 338 * rsnd_ssi_fallback()
339 * rsnd_rdai_continuance_probe()
340 */
341 return -EAGAIN;
226 } 342 }
227 343
228 cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM; 344 dma_release_channel(chan);
229 cfg.src_addr = dma->src_addr;
230 cfg.dst_addr = dma->dst_addr;
231 cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
232 cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
233
234 dev_dbg(dev, "%s[%d] %pad -> %pad\n",
235 rsnd_mod_name(mod), rsnd_mod_id(mod),
236 &cfg.src_addr, &cfg.dst_addr);
237
238 ret = dmaengine_slave_config(dmaen->chan, &cfg);
239 if (ret < 0)
240 goto rsnd_dma_attach_err;
241 345
242 dmac->dmaen_num++; 346 dmac->dmaen_num++;
243 347
244 return 0; 348 return 0;
245
246rsnd_dma_attach_err:
247 rsnd_dmaen_remove(mod, io, priv);
248rsnd_dma_channel_err:
249
250 /*
251 * DMA failed. try to PIO mode
252 * see
253 * rsnd_ssi_fallback()
254 * rsnd_rdai_continuance_probe()
255 */
256 return -EAGAIN;
257} 349}
258 350
259static struct rsnd_mod_ops rsnd_dmaen_ops = { 351static struct rsnd_mod_ops rsnd_dmaen_ops = {
260 .name = "audmac", 352 .name = "audmac",
353 .nolock_start = rsnd_dmaen_nolock_start,
354 .nolock_stop = rsnd_dmaen_nolock_stop,
261 .start = rsnd_dmaen_start, 355 .start = rsnd_dmaen_start,
262 .stop = rsnd_dmaen_stop, 356 .stop = rsnd_dmaen_stop,
263 .remove = rsnd_dmaen_remove,
264}; 357};
265 358
266/* 359/*
@@ -394,7 +487,7 @@ static int rsnd_dmapp_start(struct rsnd_mod *mod,
394} 487}
395 488
396static int rsnd_dmapp_attach(struct rsnd_dai_stream *io, 489static int rsnd_dmapp_attach(struct rsnd_dai_stream *io,
397 struct rsnd_dma *dma, int id, 490 struct rsnd_dma *dma,
398 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to) 491 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to)
399{ 492{
400 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma); 493 struct rsnd_dmapp *dmapp = rsnd_dma_to_dmapp(dma);
@@ -627,7 +720,7 @@ static void rsnd_dma_of_path(struct rsnd_mod *this,
627} 720}
628 721
629int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod, 722int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
630 struct rsnd_mod **dma_mod, int id) 723 struct rsnd_mod **dma_mod)
631{ 724{
632 struct rsnd_mod *mod_from = NULL; 725 struct rsnd_mod *mod_from = NULL;
633 struct rsnd_mod *mod_to = NULL; 726 struct rsnd_mod *mod_to = NULL;
@@ -636,7 +729,7 @@ int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
636 struct device *dev = rsnd_priv_to_dev(priv); 729 struct device *dev = rsnd_priv_to_dev(priv);
637 struct rsnd_mod_ops *ops; 730 struct rsnd_mod_ops *ops;
638 enum rsnd_mod_type type; 731 enum rsnd_mod_type type;
639 int (*attach)(struct rsnd_dai_stream *io, struct rsnd_dma *dma, int id, 732 int (*attach)(struct rsnd_dai_stream *io, struct rsnd_dma *dma,
640 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to); 733 struct rsnd_mod *mod_from, struct rsnd_mod *mod_to);
641 int is_play = rsnd_io_is_play(io); 734 int is_play = rsnd_io_is_play(io);
642 int ret, dma_id; 735 int ret, dma_id;
@@ -682,9 +775,6 @@ int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
682 775
683 *dma_mod = rsnd_mod_get(dma); 776 *dma_mod = rsnd_mod_get(dma);
684 777
685 dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
686 dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0);
687
688 ret = rsnd_mod_init(priv, *dma_mod, ops, NULL, 778 ret = rsnd_mod_init(priv, *dma_mod, ops, NULL,
689 rsnd_mod_get_status, type, dma_id); 779 rsnd_mod_get_status, type, dma_id);
690 if (ret < 0) 780 if (ret < 0)
@@ -695,9 +785,14 @@ int rsnd_dma_attach(struct rsnd_dai_stream *io, struct rsnd_mod *mod,
695 rsnd_mod_name(mod_from), rsnd_mod_id(mod_from), 785 rsnd_mod_name(mod_from), rsnd_mod_id(mod_from),
696 rsnd_mod_name(mod_to), rsnd_mod_id(mod_to)); 786 rsnd_mod_name(mod_to), rsnd_mod_id(mod_to));
697 787
698 ret = attach(io, dma, id, mod_from, mod_to); 788 ret = attach(io, dma, mod_from, mod_to);
699 if (ret < 0) 789 if (ret < 0)
700 return ret; 790 return ret;
791
792 dma->src_addr = rsnd_dma_addr(io, mod_from, is_play, 1);
793 dma->dst_addr = rsnd_dma_addr(io, mod_to, is_play, 0);
794 dma->mod_from = mod_from;
795 dma->mod_to = mod_to;
701 } 796 }
702 797
703 ret = rsnd_dai_connect(*dma_mod, io, type); 798 ret = rsnd_dai_connect(*dma_mod, io, type);
diff --git a/sound/soc/sh/rcar/dvc.c b/sound/soc/sh/rcar/dvc.c
index 02d971f69eff..cf8f59cdd8d7 100644
--- a/sound/soc/sh/rcar/dvc.c
+++ b/sound/soc/sh/rcar/dvc.c
@@ -48,8 +48,6 @@ struct rsnd_dvc {
48 48
49#define rsnd_dvc_get(priv, id) ((struct rsnd_dvc *)(priv->dvc) + id) 49#define rsnd_dvc_get(priv, id) ((struct rsnd_dvc *)(priv->dvc) + id)
50#define rsnd_dvc_nr(priv) ((priv)->dvc_nr) 50#define rsnd_dvc_nr(priv) ((priv)->dvc_nr)
51#define rsnd_dvc_of_node(priv) \
52 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc")
53 51
54#define rsnd_mod_to_dvc(_mod) \ 52#define rsnd_mod_to_dvc(_mod) \
55 container_of((_mod), struct rsnd_dvc, mod) 53 container_of((_mod), struct rsnd_dvc, mod)
diff --git a/sound/soc/sh/rcar/gen.c b/sound/soc/sh/rcar/gen.c
index 7d2fdf8dd188..63b6d3c28021 100644
--- a/sound/soc/sh/rcar/gen.c
+++ b/sound/soc/sh/rcar/gen.c
@@ -211,6 +211,14 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
211 RSND_GEN_S_REG(SSI_MODE1, 0x804), 211 RSND_GEN_S_REG(SSI_MODE1, 0x804),
212 RSND_GEN_S_REG(SSI_MODE2, 0x808), 212 RSND_GEN_S_REG(SSI_MODE2, 0x808),
213 RSND_GEN_S_REG(SSI_CONTROL, 0x810), 213 RSND_GEN_S_REG(SSI_CONTROL, 0x810),
214 RSND_GEN_S_REG(SSI_SYS_STATUS0, 0x840),
215 RSND_GEN_S_REG(SSI_SYS_STATUS1, 0x844),
216 RSND_GEN_S_REG(SSI_SYS_STATUS2, 0x848),
217 RSND_GEN_S_REG(SSI_SYS_STATUS3, 0x84c),
218 RSND_GEN_S_REG(SSI_SYS_STATUS4, 0x880),
219 RSND_GEN_S_REG(SSI_SYS_STATUS5, 0x884),
220 RSND_GEN_S_REG(SSI_SYS_STATUS6, 0x888),
221 RSND_GEN_S_REG(SSI_SYS_STATUS7, 0x88c),
214 222
215 /* FIXME: it needs SSI_MODE2/3 in the future */ 223 /* FIXME: it needs SSI_MODE2/3 in the future */
216 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80), 224 RSND_GEN_M_REG(SSI_BUSIF_MODE, 0x0, 0x80),
@@ -311,7 +319,7 @@ static int rsnd_gen2_probe(struct rsnd_priv *priv)
311 static const struct rsnd_regmap_field_conf conf_adg[] = { 319 static const struct rsnd_regmap_field_conf conf_adg[] = {
312 RSND_GEN_S_REG(BRRA, 0x00), 320 RSND_GEN_S_REG(BRRA, 0x00),
313 RSND_GEN_S_REG(BRRB, 0x04), 321 RSND_GEN_S_REG(BRRB, 0x04),
314 RSND_GEN_S_REG(SSICKR, 0x08), 322 RSND_GEN_S_REG(BRGCKR, 0x08),
315 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c), 323 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c),
316 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10), 324 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10),
317 RSND_GEN_S_REG(AUDIO_CLK_SEL2, 0x14), 325 RSND_GEN_S_REG(AUDIO_CLK_SEL2, 0x14),
@@ -362,7 +370,7 @@ static int rsnd_gen1_probe(struct rsnd_priv *priv)
362 static const struct rsnd_regmap_field_conf conf_adg[] = { 370 static const struct rsnd_regmap_field_conf conf_adg[] = {
363 RSND_GEN_S_REG(BRRA, 0x00), 371 RSND_GEN_S_REG(BRRA, 0x00),
364 RSND_GEN_S_REG(BRRB, 0x04), 372 RSND_GEN_S_REG(BRRB, 0x04),
365 RSND_GEN_S_REG(SSICKR, 0x08), 373 RSND_GEN_S_REG(BRGCKR, 0x08),
366 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c), 374 RSND_GEN_S_REG(AUDIO_CLK_SEL0, 0x0c),
367 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10), 375 RSND_GEN_S_REG(AUDIO_CLK_SEL1, 0x10),
368 }; 376 };
diff --git a/sound/soc/sh/rcar/rsnd.h b/sound/soc/sh/rcar/rsnd.h
index a8f61d79333b..b90df77662df 100644
--- a/sound/soc/sh/rcar/rsnd.h
+++ b/sound/soc/sh/rcar/rsnd.h
@@ -43,17 +43,7 @@
43 * see gen1/gen2 for detail 43 * see gen1/gen2 for detail
44 */ 44 */
45enum rsnd_reg { 45enum rsnd_reg {
46 /* SCU (SRC/SSIU/MIX/CTU/DVC) */ 46 /* SCU (MIX/CTU/DVC) */
47 RSND_REG_SSI_MODE, /* Gen2 only */
48 RSND_REG_SSI_MODE0,
49 RSND_REG_SSI_MODE1,
50 RSND_REG_SSI_MODE2,
51 RSND_REG_SSI_CONTROL,
52 RSND_REG_SSI_CTRL, /* Gen2 only */
53 RSND_REG_SSI_BUSIF_MODE, /* Gen2 only */
54 RSND_REG_SSI_BUSIF_ADINR, /* Gen2 only */
55 RSND_REG_SSI_BUSIF_DALIGN, /* Gen2 only */
56 RSND_REG_SSI_INT_ENABLE, /* Gen2 only */
57 RSND_REG_SRC_I_BUSIF_MODE, 47 RSND_REG_SRC_I_BUSIF_MODE,
58 RSND_REG_SRC_O_BUSIF_MODE, 48 RSND_REG_SRC_O_BUSIF_MODE,
59 RSND_REG_SRC_ROUTE_MODE0, 49 RSND_REG_SRC_ROUTE_MODE0,
@@ -63,29 +53,29 @@ enum rsnd_reg {
63 RSND_REG_SRC_IFSCR, 53 RSND_REG_SRC_IFSCR,
64 RSND_REG_SRC_IFSVR, 54 RSND_REG_SRC_IFSVR,
65 RSND_REG_SRC_SRCCR, 55 RSND_REG_SRC_SRCCR,
66 RSND_REG_SRC_CTRL, /* Gen2 only */ 56 RSND_REG_SRC_CTRL,
67 RSND_REG_SRC_BSDSR, /* Gen2 only */ 57 RSND_REG_SRC_BSDSR,
68 RSND_REG_SRC_BSISR, /* Gen2 only */ 58 RSND_REG_SRC_BSISR,
69 RSND_REG_SRC_INT_ENABLE0, /* Gen2 only */ 59 RSND_REG_SRC_INT_ENABLE0,
70 RSND_REG_SRC_BUSIF_DALIGN, /* Gen2 only */ 60 RSND_REG_SRC_BUSIF_DALIGN,
71 RSND_REG_SRCIN_TIMSEL0, /* Gen2 only */ 61 RSND_REG_SRCIN_TIMSEL0,
72 RSND_REG_SRCIN_TIMSEL1, /* Gen2 only */ 62 RSND_REG_SRCIN_TIMSEL1,
73 RSND_REG_SRCIN_TIMSEL2, /* Gen2 only */ 63 RSND_REG_SRCIN_TIMSEL2,
74 RSND_REG_SRCIN_TIMSEL3, /* Gen2 only */ 64 RSND_REG_SRCIN_TIMSEL3,
75 RSND_REG_SRCIN_TIMSEL4, /* Gen2 only */ 65 RSND_REG_SRCIN_TIMSEL4,
76 RSND_REG_SRCOUT_TIMSEL0, /* Gen2 only */ 66 RSND_REG_SRCOUT_TIMSEL0,
77 RSND_REG_SRCOUT_TIMSEL1, /* Gen2 only */ 67 RSND_REG_SRCOUT_TIMSEL1,
78 RSND_REG_SRCOUT_TIMSEL2, /* Gen2 only */ 68 RSND_REG_SRCOUT_TIMSEL2,
79 RSND_REG_SRCOUT_TIMSEL3, /* Gen2 only */ 69 RSND_REG_SRCOUT_TIMSEL3,
80 RSND_REG_SRCOUT_TIMSEL4, /* Gen2 only */ 70 RSND_REG_SRCOUT_TIMSEL4,
81 RSND_REG_SCU_SYS_STATUS0, 71 RSND_REG_SCU_SYS_STATUS0,
82 RSND_REG_SCU_SYS_STATUS1, /* Gen2 only */ 72 RSND_REG_SCU_SYS_STATUS1,
83 RSND_REG_SCU_SYS_INT_EN0, 73 RSND_REG_SCU_SYS_INT_EN0,
84 RSND_REG_SCU_SYS_INT_EN1, /* Gen2 only */ 74 RSND_REG_SCU_SYS_INT_EN1,
85 RSND_REG_CMD_CTRL, /* Gen2 only */ 75 RSND_REG_CMD_CTRL,
86 RSND_REG_CMD_BUSIF_DALIGN, /* Gen2 only */ 76 RSND_REG_CMD_BUSIF_DALIGN,
87 RSND_REG_CMD_ROUTE_SLCT, 77 RSND_REG_CMD_ROUTE_SLCT,
88 RSND_REG_CMDOUT_TIMSEL, /* Gen2 only */ 78 RSND_REG_CMDOUT_TIMSEL,
89 RSND_REG_CTU_SWRSR, 79 RSND_REG_CTU_SWRSR,
90 RSND_REG_CTU_CTUIR, 80 RSND_REG_CTU_CTUIR,
91 RSND_REG_CTU_ADINR, 81 RSND_REG_CTU_ADINR,
@@ -147,18 +137,38 @@ enum rsnd_reg {
147 RSND_REG_DVC_VOL6R, 137 RSND_REG_DVC_VOL6R,
148 RSND_REG_DVC_VOL7R, 138 RSND_REG_DVC_VOL7R,
149 RSND_REG_DVC_DVUER, 139 RSND_REG_DVC_DVUER,
150 RSND_REG_DVC_VRCTR, /* Gen2 only */ 140 RSND_REG_DVC_VRCTR,
151 RSND_REG_DVC_VRPDR, /* Gen2 only */ 141 RSND_REG_DVC_VRPDR,
152 RSND_REG_DVC_VRDBR, /* Gen2 only */ 142 RSND_REG_DVC_VRDBR,
153 143
154 /* ADG */ 144 /* ADG */
155 RSND_REG_BRRA, 145 RSND_REG_BRRA,
156 RSND_REG_BRRB, 146 RSND_REG_BRRB,
157 RSND_REG_SSICKR, 147 RSND_REG_BRGCKR,
158 RSND_REG_DIV_EN, /* Gen2 only */ 148 RSND_REG_DIV_EN,
159 RSND_REG_AUDIO_CLK_SEL0, 149 RSND_REG_AUDIO_CLK_SEL0,
160 RSND_REG_AUDIO_CLK_SEL1, 150 RSND_REG_AUDIO_CLK_SEL1,
161 RSND_REG_AUDIO_CLK_SEL2, /* Gen2 only */ 151 RSND_REG_AUDIO_CLK_SEL2,
152
153 /* SSIU */
154 RSND_REG_SSI_MODE,
155 RSND_REG_SSI_MODE0,
156 RSND_REG_SSI_MODE1,
157 RSND_REG_SSI_MODE2,
158 RSND_REG_SSI_CONTROL,
159 RSND_REG_SSI_CTRL,
160 RSND_REG_SSI_BUSIF_MODE,
161 RSND_REG_SSI_BUSIF_ADINR,
162 RSND_REG_SSI_BUSIF_DALIGN,
163 RSND_REG_SSI_INT_ENABLE,
164 RSND_REG_SSI_SYS_STATUS0,
165 RSND_REG_SSI_SYS_STATUS1,
166 RSND_REG_SSI_SYS_STATUS2,
167 RSND_REG_SSI_SYS_STATUS3,
168 RSND_REG_SSI_SYS_STATUS4,
169 RSND_REG_SSI_SYS_STATUS5,
170 RSND_REG_SSI_SYS_STATUS6,
171 RSND_REG_SSI_SYS_STATUS7,
162 172
163 /* SSI */ 173 /* SSI */
164 RSND_REG_SSICR, 174 RSND_REG_SSICR,
@@ -199,7 +209,7 @@ u32 rsnd_get_dalign(struct rsnd_mod *mod, struct rsnd_dai_stream *io);
199 * R-Car DMA 209 * R-Car DMA
200 */ 210 */
201int rsnd_dma_attach(struct rsnd_dai_stream *io, 211int rsnd_dma_attach(struct rsnd_dai_stream *io,
202 struct rsnd_mod *mod, struct rsnd_mod **dma_mod, int id); 212 struct rsnd_mod *mod, struct rsnd_mod **dma_mod);
203int rsnd_dma_probe(struct rsnd_priv *priv); 213int rsnd_dma_probe(struct rsnd_priv *priv);
204struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node, 214struct dma_chan *rsnd_dma_request_channel(struct device_node *of_node,
205 struct rsnd_mod *mod, char *name); 215 struct rsnd_mod *mod, char *name);
@@ -259,6 +269,12 @@ struct rsnd_mod_ops {
259 int (*fallback)(struct rsnd_mod *mod, 269 int (*fallback)(struct rsnd_mod *mod,
260 struct rsnd_dai_stream *io, 270 struct rsnd_dai_stream *io,
261 struct rsnd_priv *priv); 271 struct rsnd_priv *priv);
272 int (*nolock_start)(struct rsnd_mod *mod,
273 struct rsnd_dai_stream *io,
274 struct rsnd_priv *priv);
275 int (*nolock_stop)(struct rsnd_mod *mod,
276 struct rsnd_dai_stream *io,
277 struct rsnd_priv *priv);
262}; 278};
263 279
264struct rsnd_dai_stream; 280struct rsnd_dai_stream;
@@ -278,7 +294,7 @@ struct rsnd_mod {
278 * 294 *
279 * 0xH0000CBA 295 * 0xH0000CBA
280 * 296 *
281 * A 0: probe 1: remove 297 * A 0: nolock_start 1: nolock_stop
282 * B 0: init 1: quit 298 * B 0: init 1: quit
283 * C 0: start 1: stop 299 * C 0: start 1: stop
284 * 300 *
@@ -288,19 +304,23 @@ struct rsnd_mod {
288 * H 0: fallback 304 * H 0: fallback
289 * H 0: hw_params 305 * H 0: hw_params
290 */ 306 */
291#define __rsnd_mod_shift_probe 0 307#define __rsnd_mod_shift_nolock_start 0
292#define __rsnd_mod_shift_remove 0 308#define __rsnd_mod_shift_nolock_stop 0
293#define __rsnd_mod_shift_init 4 309#define __rsnd_mod_shift_init 4
294#define __rsnd_mod_shift_quit 4 310#define __rsnd_mod_shift_quit 4
295#define __rsnd_mod_shift_start 8 311#define __rsnd_mod_shift_start 8
296#define __rsnd_mod_shift_stop 8 312#define __rsnd_mod_shift_stop 8
313#define __rsnd_mod_shift_probe 28 /* always called */
314#define __rsnd_mod_shift_remove 28 /* always called */
297#define __rsnd_mod_shift_irq 28 /* always called */ 315#define __rsnd_mod_shift_irq 28 /* always called */
298#define __rsnd_mod_shift_pcm_new 28 /* always called */ 316#define __rsnd_mod_shift_pcm_new 28 /* always called */
299#define __rsnd_mod_shift_fallback 28 /* always called */ 317#define __rsnd_mod_shift_fallback 28 /* always called */
300#define __rsnd_mod_shift_hw_params 28 /* always called */ 318#define __rsnd_mod_shift_hw_params 28 /* always called */
301 319
302#define __rsnd_mod_add_probe 1 320#define __rsnd_mod_add_probe 0
303#define __rsnd_mod_add_remove -1 321#define __rsnd_mod_add_remove 0
322#define __rsnd_mod_add_nolock_start 1
323#define __rsnd_mod_add_nolock_stop -1
304#define __rsnd_mod_add_init 1 324#define __rsnd_mod_add_init 1
305#define __rsnd_mod_add_quit -1 325#define __rsnd_mod_add_quit -1
306#define __rsnd_mod_add_start 1 326#define __rsnd_mod_add_start 1
@@ -311,7 +331,7 @@ struct rsnd_mod {
311#define __rsnd_mod_add_hw_params 0 331#define __rsnd_mod_add_hw_params 0
312 332
313#define __rsnd_mod_call_probe 0 333#define __rsnd_mod_call_probe 0
314#define __rsnd_mod_call_remove 1 334#define __rsnd_mod_call_remove 0
315#define __rsnd_mod_call_init 0 335#define __rsnd_mod_call_init 0
316#define __rsnd_mod_call_quit 1 336#define __rsnd_mod_call_quit 1
317#define __rsnd_mod_call_start 0 337#define __rsnd_mod_call_start 0
@@ -320,6 +340,8 @@ struct rsnd_mod {
320#define __rsnd_mod_call_pcm_new 0 340#define __rsnd_mod_call_pcm_new 0
321#define __rsnd_mod_call_fallback 0 341#define __rsnd_mod_call_fallback 0
322#define __rsnd_mod_call_hw_params 0 342#define __rsnd_mod_call_hw_params 0
343#define __rsnd_mod_call_nolock_start 0
344#define __rsnd_mod_call_nolock_stop 1
323 345
324#define rsnd_mod_to_priv(mod) ((mod)->priv) 346#define rsnd_mod_to_priv(mod) ((mod)->priv)
325#define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1) 347#define rsnd_mod_id(mod) ((mod) ? (mod)->id : -1)
@@ -346,6 +368,18 @@ void rsnd_mod_interrupt(struct rsnd_mod *mod,
346u32 *rsnd_mod_get_status(struct rsnd_dai_stream *io, 368u32 *rsnd_mod_get_status(struct rsnd_dai_stream *io,
347 struct rsnd_mod *mod, 369 struct rsnd_mod *mod,
348 enum rsnd_mod_type type); 370 enum rsnd_mod_type type);
371struct rsnd_mod *rsnd_mod_next(int *iterator,
372 struct rsnd_dai_stream *io,
373 enum rsnd_mod_type *array,
374 int array_size);
375#define for_each_rsnd_mod(iterator, pos, io) \
376 for (iterator = 0; \
377 (pos = rsnd_mod_next(&iterator, io, NULL, 0));)
378#define for_each_rsnd_mod_arrays(iterator, pos, io, array, size) \
379 for (iterator = 0; \
380 (pos = rsnd_mod_next(&iterator, io, array, size));)
381#define for_each_rsnd_mod_array(iterator, pos, io, array) \
382 for_each_rsnd_mod_arrays(iterator, pos, io, array, ARRAY_SIZE(array))
349 383
350void rsnd_parse_connect_common(struct rsnd_dai *rdai, 384void rsnd_parse_connect_common(struct rsnd_dai *rdai,
351 struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id), 385 struct rsnd_mod* (*mod_get)(struct rsnd_priv *priv, int id),
@@ -365,6 +399,18 @@ int rsnd_runtime_is_ssi_multi(struct rsnd_dai_stream *io);
365int rsnd_runtime_is_ssi_tdm(struct rsnd_dai_stream *io); 399int rsnd_runtime_is_ssi_tdm(struct rsnd_dai_stream *io);
366 400
367/* 401/*
402 * DT
403 */
404#define rsnd_parse_of_node(priv, node) \
405 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, node)
406#define RSND_NODE_DAI "rcar_sound,dai"
407#define RSND_NODE_SSI "rcar_sound,ssi"
408#define RSND_NODE_SRC "rcar_sound,src"
409#define RSND_NODE_CTU "rcar_sound,ctu"
410#define RSND_NODE_MIX "rcar_sound,mix"
411#define RSND_NODE_DVC "rcar_sound,dvc"
412
413/*
368 * R-Car sound DAI 414 * R-Car sound DAI
369 */ 415 */
370#define RSND_DAI_NAME_SIZE 16 416#define RSND_DAI_NAME_SIZE 16
@@ -382,6 +428,7 @@ struct rsnd_dai_stream {
382}; 428};
383#define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL) 429#define rsnd_io_to_mod(io, i) ((i) < RSND_MOD_MAX ? (io)->mod[(i)] : NULL)
384#define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI) 430#define rsnd_io_to_mod_ssi(io) rsnd_io_to_mod((io), RSND_MOD_SSI)
431#define rsnd_io_to_mod_ssiu(io) rsnd_io_to_mod((io), RSND_MOD_SSIU)
385#define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP) 432#define rsnd_io_to_mod_ssip(io) rsnd_io_to_mod((io), RSND_MOD_SSIP)
386#define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC) 433#define rsnd_io_to_mod_src(io) rsnd_io_to_mod((io), RSND_MOD_SRC)
387#define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU) 434#define rsnd_io_to_mod_ctu(io) rsnd_io_to_mod((io), RSND_MOD_CTU)
@@ -428,8 +475,7 @@ int rsnd_dai_pointer_offset(struct rsnd_dai_stream *io, int additional);
428int rsnd_dai_connect(struct rsnd_mod *mod, 475int rsnd_dai_connect(struct rsnd_mod *mod,
429 struct rsnd_dai_stream *io, 476 struct rsnd_dai_stream *io,
430 enum rsnd_mod_type type); 477 enum rsnd_mod_type type);
431#define rsnd_dai_of_node(priv) \ 478#define rsnd_dai_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DAI)
432 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dai")
433 479
434/* 480/*
435 * R-Car Gen1/Gen2 481 * R-Car Gen1/Gen2
@@ -453,6 +499,9 @@ int rsnd_adg_set_src_timesel_gen2(struct rsnd_mod *src_mod,
453 unsigned int out_rate); 499 unsigned int out_rate);
454int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod, 500int rsnd_adg_set_cmd_timsel_gen2(struct rsnd_mod *mod,
455 struct rsnd_dai_stream *io); 501 struct rsnd_dai_stream *io);
502#define rsnd_adg_clk_enable(priv) rsnd_adg_clk_control(priv, 1)
503#define rsnd_adg_clk_disable(priv) rsnd_adg_clk_control(priv, 0)
504void rsnd_adg_clk_control(struct rsnd_priv *priv, int enable);
456 505
457/* 506/*
458 * R-Car sound priv 507 * R-Car sound priv
@@ -606,8 +655,7 @@ u32 rsnd_ssi_multi_slaves_runtime(struct rsnd_dai_stream *io);
606 __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io)) 655 __rsnd_ssi_is_pin_sharing(rsnd_io_to_mod_ssi(io))
607int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod); 656int __rsnd_ssi_is_pin_sharing(struct rsnd_mod *mod);
608 657
609#define rsnd_ssi_of_node(priv) \ 658#define rsnd_ssi_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SSI)
610 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ssi")
611void rsnd_parse_connect_ssi(struct rsnd_dai *rdai, 659void rsnd_parse_connect_ssi(struct rsnd_dai *rdai,
612 struct device_node *playback, 660 struct device_node *playback,
613 struct device_node *capture); 661 struct device_node *capture);
@@ -633,8 +681,7 @@ unsigned int rsnd_src_get_rate(struct rsnd_priv *priv,
633 struct rsnd_dai_stream *io, 681 struct rsnd_dai_stream *io,
634 int is_in); 682 int is_in);
635 683
636#define rsnd_src_of_node(priv) \ 684#define rsnd_src_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_SRC)
637 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,src")
638#define rsnd_parse_connect_src(rdai, playback, capture) \ 685#define rsnd_parse_connect_src(rdai, playback, capture) \
639 rsnd_parse_connect_common(rdai, rsnd_src_mod_get, \ 686 rsnd_parse_connect_common(rdai, rsnd_src_mod_get, \
640 rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \ 687 rsnd_src_of_node(rsnd_rdai_to_priv(rdai)), \
@@ -647,8 +694,7 @@ int rsnd_ctu_probe(struct rsnd_priv *priv);
647void rsnd_ctu_remove(struct rsnd_priv *priv); 694void rsnd_ctu_remove(struct rsnd_priv *priv);
648int rsnd_ctu_converted_channel(struct rsnd_mod *mod); 695int rsnd_ctu_converted_channel(struct rsnd_mod *mod);
649struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id); 696struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id);
650#define rsnd_ctu_of_node(priv) \ 697#define rsnd_ctu_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_CTU)
651 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,ctu")
652#define rsnd_parse_connect_ctu(rdai, playback, capture) \ 698#define rsnd_parse_connect_ctu(rdai, playback, capture) \
653 rsnd_parse_connect_common(rdai, rsnd_ctu_mod_get, \ 699 rsnd_parse_connect_common(rdai, rsnd_ctu_mod_get, \
654 rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \ 700 rsnd_ctu_of_node(rsnd_rdai_to_priv(rdai)), \
@@ -660,8 +706,7 @@ struct rsnd_mod *rsnd_ctu_mod_get(struct rsnd_priv *priv, int id);
660int rsnd_mix_probe(struct rsnd_priv *priv); 706int rsnd_mix_probe(struct rsnd_priv *priv);
661void rsnd_mix_remove(struct rsnd_priv *priv); 707void rsnd_mix_remove(struct rsnd_priv *priv);
662struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id); 708struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id);
663#define rsnd_mix_of_node(priv) \ 709#define rsnd_mix_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_MIX)
664 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,mix")
665#define rsnd_parse_connect_mix(rdai, playback, capture) \ 710#define rsnd_parse_connect_mix(rdai, playback, capture) \
666 rsnd_parse_connect_common(rdai, rsnd_mix_mod_get, \ 711 rsnd_parse_connect_common(rdai, rsnd_mix_mod_get, \
667 rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \ 712 rsnd_mix_of_node(rsnd_rdai_to_priv(rdai)), \
@@ -673,8 +718,7 @@ struct rsnd_mod *rsnd_mix_mod_get(struct rsnd_priv *priv, int id);
673int rsnd_dvc_probe(struct rsnd_priv *priv); 718int rsnd_dvc_probe(struct rsnd_priv *priv);
674void rsnd_dvc_remove(struct rsnd_priv *priv); 719void rsnd_dvc_remove(struct rsnd_priv *priv);
675struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id); 720struct rsnd_mod *rsnd_dvc_mod_get(struct rsnd_priv *priv, int id);
676#define rsnd_dvc_of_node(priv) \ 721#define rsnd_dvc_of_node(priv) rsnd_parse_of_node(priv, RSND_NODE_DVC)
677 of_get_child_by_name(rsnd_priv_to_dev(priv)->of_node, "rcar_sound,dvc")
678#define rsnd_parse_connect_dvc(rdai, playback, capture) \ 722#define rsnd_parse_connect_dvc(rdai, playback, capture) \
679 rsnd_parse_connect_common(rdai, rsnd_dvc_mod_get, \ 723 rsnd_parse_connect_common(rdai, rsnd_dvc_mod_get, \
680 rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \ 724 rsnd_dvc_of_node(rsnd_rdai_to_priv(rdai)), \
diff --git a/sound/soc/sh/rcar/src.c b/sound/soc/sh/rcar/src.c
index 969a5169de25..3a8f65bd1bf9 100644
--- a/sound/soc/sh/rcar/src.c
+++ b/sound/soc/sh/rcar/src.c
@@ -189,6 +189,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
189 struct rsnd_priv *priv = rsnd_mod_to_priv(mod); 189 struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
190 struct device *dev = rsnd_priv_to_dev(priv); 190 struct device *dev = rsnd_priv_to_dev(priv);
191 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io); 191 struct snd_pcm_runtime *runtime = rsnd_io_to_runtime(io);
192 int use_src = 0;
192 u32 fin, fout; 193 u32 fin, fout;
193 u32 ifscr, fsrate, adinr; 194 u32 ifscr, fsrate, adinr;
194 u32 cr, route; 195 u32 cr, route;
@@ -214,6 +215,8 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
214 return; 215 return;
215 } 216 }
216 217
218 use_src = (fin != fout) | rsnd_src_sync_is_enabled(mod);
219
217 /* 220 /*
218 * SRC_ADINR 221 * SRC_ADINR
219 */ 222 */
@@ -225,7 +228,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
225 */ 228 */
226 ifscr = 0; 229 ifscr = 0;
227 fsrate = 0; 230 fsrate = 0;
228 if (fin != fout) { 231 if (use_src) {
229 u64 n; 232 u64 n;
230 233
231 ifscr = 1; 234 ifscr = 1;
@@ -239,7 +242,7 @@ static void rsnd_src_set_convert_rate(struct rsnd_dai_stream *io,
239 */ 242 */
240 cr = 0x00011110; 243 cr = 0x00011110;
241 route = 0x0; 244 route = 0x0;
242 if (fin != fout) { 245 if (use_src) {
243 route = 0x1; 246 route = 0x1;
244 247
245 if (rsnd_src_sync_is_enabled(mod)) { 248 if (rsnd_src_sync_is_enabled(mod)) {
@@ -327,8 +330,8 @@ static void rsnd_src_status_clear(struct rsnd_mod *mod)
327{ 330{
328 u32 val = OUF_SRC(rsnd_mod_id(mod)); 331 u32 val = OUF_SRC(rsnd_mod_id(mod));
329 332
330 rsnd_mod_bset(mod, SCU_SYS_STATUS0, val, val); 333 rsnd_mod_write(mod, SCU_SYS_STATUS0, val);
331 rsnd_mod_bset(mod, SCU_SYS_STATUS1, val, val); 334 rsnd_mod_write(mod, SCU_SYS_STATUS1, val);
332} 335}
333 336
334static bool rsnd_src_error_occurred(struct rsnd_mod *mod) 337static bool rsnd_src_error_occurred(struct rsnd_mod *mod)
@@ -475,7 +478,7 @@ static int rsnd_src_probe_(struct rsnd_mod *mod,
475 return ret; 478 return ret;
476 } 479 }
477 480
478 ret = rsnd_dma_attach(io, mod, &src->dma, 0); 481 ret = rsnd_dma_attach(io, mod, &src->dma);
479 482
480 return ret; 483 return ret;
481} 484}
diff --git a/sound/soc/sh/rcar/ssi.c b/sound/soc/sh/rcar/ssi.c
index 6cb6db005fc4..411bda2387ad 100644
--- a/sound/soc/sh/rcar/ssi.c
+++ b/sound/soc/sh/rcar/ssi.c
@@ -417,11 +417,14 @@ static int rsnd_ssi_hw_params(struct rsnd_mod *mod,
417 int chan = params_channels(params); 417 int chan = params_channels(params);
418 418
419 /* 419 /*
420 * Already working. 420 * snd_pcm_ops::hw_params will be called *before*
421 * It will happen if SSI has parent/child connection. 421 * snd_soc_dai_ops::trigger. Thus, ssi->usrcnt is 0
422 * in 1st call.
422 */ 423 */
423 if (ssi->usrcnt > 1) { 424 if (ssi->usrcnt) {
424 /* 425 /*
426 * Already working.
427 * It will happen if SSI has parent/child connection.
425 * it is error if child <-> parent SSI uses 428 * it is error if child <-> parent SSI uses
426 * different channels. 429 * different channels.
427 */ 430 */
@@ -644,10 +647,14 @@ static int rsnd_ssi_common_probe(struct rsnd_mod *mod,
644 if (ret < 0) 647 if (ret < 0)
645 return ret; 648 return ret;
646 649
647 ret = devm_request_irq(dev, ssi->irq, 650 /*
648 rsnd_ssi_interrupt, 651 * SSI might be called again as PIO fallback
649 IRQF_SHARED, 652 * It is easy to manual handling for IRQ request/free
650 dev_name(dev), mod); 653 */
654 ret = request_irq(ssi->irq,
655 rsnd_ssi_interrupt,
656 IRQF_SHARED,
657 dev_name(dev), mod);
651 658
652 return ret; 659 return ret;
653} 660}
@@ -669,7 +676,6 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
669 struct rsnd_priv *priv) 676 struct rsnd_priv *priv)
670{ 677{
671 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 678 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
672 int dma_id = 0; /* not needed */
673 int ret; 679 int ret;
674 680
675 /* 681 /*
@@ -684,7 +690,7 @@ static int rsnd_ssi_dma_probe(struct rsnd_mod *mod,
684 return ret; 690 return ret;
685 691
686 /* SSI probe might be called many times in MUX multi path */ 692 /* SSI probe might be called many times in MUX multi path */
687 ret = rsnd_dma_attach(io, mod, &ssi->dma, dma_id); 693 ret = rsnd_dma_attach(io, mod, &ssi->dma);
688 694
689 return ret; 695 return ret;
690} 696}
@@ -694,11 +700,9 @@ static int rsnd_ssi_dma_remove(struct rsnd_mod *mod,
694 struct rsnd_priv *priv) 700 struct rsnd_priv *priv)
695{ 701{
696 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod); 702 struct rsnd_ssi *ssi = rsnd_mod_to_ssi(mod);
697 struct device *dev = rsnd_priv_to_dev(priv);
698 int irq = ssi->irq;
699 703
700 /* PIO will request IRQ again */ 704 /* PIO will request IRQ again */
701 devm_free_irq(dev, irq, mod); 705 free_irq(ssi->irq, mod);
702 706
703 return 0; 707 return 0;
704} 708}
diff --git a/sound/soc/sh/rcar/ssiu.c b/sound/soc/sh/rcar/ssiu.c
index 6f9b388ec5a8..4e817c8a18c0 100644
--- a/sound/soc/sh/rcar/ssiu.c
+++ b/sound/soc/sh/rcar/ssiu.c
@@ -33,6 +33,26 @@ static int rsnd_ssiu_init(struct rsnd_mod *mod,
33 u32 mask1, val1; 33 u32 mask1, val1;
34 u32 mask2, val2; 34 u32 mask2, val2;
35 35
36 /* clear status */
37 switch (id) {
38 case 0:
39 case 1:
40 case 2:
41 case 3:
42 case 4:
43 rsnd_mod_write(mod, SSI_SYS_STATUS0, 0xf << (id * 4));
44 rsnd_mod_write(mod, SSI_SYS_STATUS2, 0xf << (id * 4));
45 rsnd_mod_write(mod, SSI_SYS_STATUS4, 0xf << (id * 4));
46 rsnd_mod_write(mod, SSI_SYS_STATUS6, 0xf << (id * 4));
47 break;
48 case 9:
49 rsnd_mod_write(mod, SSI_SYS_STATUS1, 0xf << 4);
50 rsnd_mod_write(mod, SSI_SYS_STATUS3, 0xf << 4);
51 rsnd_mod_write(mod, SSI_SYS_STATUS5, 0xf << 4);
52 rsnd_mod_write(mod, SSI_SYS_STATUS7, 0xf << 4);
53 break;
54 }
55
36 /* 56 /*
37 * SSI_MODE0 57 * SSI_MODE0
38 */ 58 */
diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
index bf7b52fce597..bfd71b873ca2 100644
--- a/sound/soc/soc-compress.c
+++ b/sound/soc/soc-compress.c
@@ -30,16 +30,26 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
30{ 30{
31 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 31 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
32 struct snd_soc_platform *platform = rtd->platform; 32 struct snd_soc_platform *platform = rtd->platform;
33 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
33 int ret = 0; 34 int ret = 0;
34 35
35 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 36 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
36 37
38 if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
39 ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
40 if (ret < 0) {
41 dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
42 cpu_dai->name, ret);
43 goto out;
44 }
45 }
46
37 if (platform->driver->compr_ops && platform->driver->compr_ops->open) { 47 if (platform->driver->compr_ops && platform->driver->compr_ops->open) {
38 ret = platform->driver->compr_ops->open(cstream); 48 ret = platform->driver->compr_ops->open(cstream);
39 if (ret < 0) { 49 if (ret < 0) {
40 pr_err("compress asoc: can't open platform %s\n", 50 pr_err("compress asoc: can't open platform %s\n",
41 platform->component.name); 51 platform->component.name);
42 goto out; 52 goto plat_err;
43 } 53 }
44 } 54 }
45 55
@@ -60,6 +70,9 @@ static int soc_compr_open(struct snd_compr_stream *cstream)
60machine_err: 70machine_err:
61 if (platform->driver->compr_ops && platform->driver->compr_ops->free) 71 if (platform->driver->compr_ops && platform->driver->compr_ops->free)
62 platform->driver->compr_ops->free(cstream); 72 platform->driver->compr_ops->free(cstream);
73plat_err:
74 if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
75 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
63out: 76out:
64 mutex_unlock(&rtd->pcm_mutex); 77 mutex_unlock(&rtd->pcm_mutex);
65 return ret; 78 return ret;
@@ -70,6 +83,7 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
70 struct snd_soc_pcm_runtime *fe = cstream->private_data; 83 struct snd_soc_pcm_runtime *fe = cstream->private_data;
71 struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream; 84 struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream;
72 struct snd_soc_platform *platform = fe->platform; 85 struct snd_soc_platform *platform = fe->platform;
86 struct snd_soc_dai *cpu_dai = fe->cpu_dai;
73 struct snd_soc_dpcm *dpcm; 87 struct snd_soc_dpcm *dpcm;
74 struct snd_soc_dapm_widget_list *list; 88 struct snd_soc_dapm_widget_list *list;
75 int stream; 89 int stream;
@@ -82,12 +96,22 @@ static int soc_compr_open_fe(struct snd_compr_stream *cstream)
82 96
83 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 97 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
84 98
99 if (cpu_dai->driver->cops && cpu_dai->driver->cops->startup) {
100 ret = cpu_dai->driver->cops->startup(cstream, cpu_dai);
101 if (ret < 0) {
102 dev_err(cpu_dai->dev, "Compress ASoC: can't open interface %s: %d\n",
103 cpu_dai->name, ret);
104 goto out;
105 }
106 }
107
108
85 if (platform->driver->compr_ops && platform->driver->compr_ops->open) { 109 if (platform->driver->compr_ops && platform->driver->compr_ops->open) {
86 ret = platform->driver->compr_ops->open(cstream); 110 ret = platform->driver->compr_ops->open(cstream);
87 if (ret < 0) { 111 if (ret < 0) {
88 pr_err("compress asoc: can't open platform %s\n", 112 pr_err("compress asoc: can't open platform %s\n",
89 platform->component.name); 113 platform->component.name);
90 goto out; 114 goto plat_err;
91 } 115 }
92 } 116 }
93 117
@@ -144,6 +168,9 @@ fe_err:
144machine_err: 168machine_err:
145 if (platform->driver->compr_ops && platform->driver->compr_ops->free) 169 if (platform->driver->compr_ops && platform->driver->compr_ops->free)
146 platform->driver->compr_ops->free(cstream); 170 platform->driver->compr_ops->free(cstream);
171plat_err:
172 if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
173 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
147out: 174out:
148 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO; 175 fe->dpcm[stream].runtime_update = SND_SOC_DPCM_UPDATE_NO;
149 mutex_unlock(&fe->card->mutex); 176 mutex_unlock(&fe->card->mutex);
@@ -210,6 +237,9 @@ static int soc_compr_free(struct snd_compr_stream *cstream)
210 if (platform->driver->compr_ops && platform->driver->compr_ops->free) 237 if (platform->driver->compr_ops && platform->driver->compr_ops->free)
211 platform->driver->compr_ops->free(cstream); 238 platform->driver->compr_ops->free(cstream);
212 239
240 if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
241 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
242
213 if (cstream->direction == SND_COMPRESS_PLAYBACK) { 243 if (cstream->direction == SND_COMPRESS_PLAYBACK) {
214 if (snd_soc_runtime_ignore_pmdown_time(rtd)) { 244 if (snd_soc_runtime_ignore_pmdown_time(rtd)) {
215 snd_soc_dapm_stream_event(rtd, 245 snd_soc_dapm_stream_event(rtd,
@@ -236,6 +266,7 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
236{ 266{
237 struct snd_soc_pcm_runtime *fe = cstream->private_data; 267 struct snd_soc_pcm_runtime *fe = cstream->private_data;
238 struct snd_soc_platform *platform = fe->platform; 268 struct snd_soc_platform *platform = fe->platform;
269 struct snd_soc_dai *cpu_dai = fe->cpu_dai;
239 struct snd_soc_dpcm *dpcm; 270 struct snd_soc_dpcm *dpcm;
240 int stream, ret; 271 int stream, ret;
241 272
@@ -275,6 +306,9 @@ static int soc_compr_free_fe(struct snd_compr_stream *cstream)
275 if (platform->driver->compr_ops && platform->driver->compr_ops->free) 306 if (platform->driver->compr_ops && platform->driver->compr_ops->free)
276 platform->driver->compr_ops->free(cstream); 307 platform->driver->compr_ops->free(cstream);
277 308
309 if (cpu_dai->driver->cops && cpu_dai->driver->cops->shutdown)
310 cpu_dai->driver->cops->shutdown(cstream, cpu_dai);
311
278 mutex_unlock(&fe->card->mutex); 312 mutex_unlock(&fe->card->mutex);
279 return 0; 313 return 0;
280} 314}
@@ -285,6 +319,7 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
285 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 319 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
286 struct snd_soc_platform *platform = rtd->platform; 320 struct snd_soc_platform *platform = rtd->platform;
287 struct snd_soc_dai *codec_dai = rtd->codec_dai; 321 struct snd_soc_dai *codec_dai = rtd->codec_dai;
322 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
288 int ret = 0; 323 int ret = 0;
289 324
290 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 325 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
@@ -295,6 +330,10 @@ static int soc_compr_trigger(struct snd_compr_stream *cstream, int cmd)
295 goto out; 330 goto out;
296 } 331 }
297 332
333 if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger)
334 cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);
335
336
298 switch (cmd) { 337 switch (cmd) {
299 case SNDRV_PCM_TRIGGER_START: 338 case SNDRV_PCM_TRIGGER_START:
300 snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction); 339 snd_soc_dai_digital_mute(codec_dai, 0, cstream->direction);
@@ -313,6 +352,7 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
313{ 352{
314 struct snd_soc_pcm_runtime *fe = cstream->private_data; 353 struct snd_soc_pcm_runtime *fe = cstream->private_data;
315 struct snd_soc_platform *platform = fe->platform; 354 struct snd_soc_platform *platform = fe->platform;
355 struct snd_soc_dai *cpu_dai = fe->cpu_dai;
316 int ret = 0, stream; 356 int ret = 0, stream;
317 357
318 if (cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN || 358 if (cmd == SND_COMPR_TRIGGER_PARTIAL_DRAIN ||
@@ -332,6 +372,12 @@ static int soc_compr_trigger_fe(struct snd_compr_stream *cstream, int cmd)
332 372
333 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 373 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
334 374
375 if (cpu_dai->driver->cops && cpu_dai->driver->cops->trigger) {
376 ret = cpu_dai->driver->cops->trigger(cstream, cmd, cpu_dai);
377 if (ret < 0)
378 goto out;
379 }
380
335 if (platform->driver->compr_ops && platform->driver->compr_ops->trigger) { 381 if (platform->driver->compr_ops && platform->driver->compr_ops->trigger) {
336 ret = platform->driver->compr_ops->trigger(cstream, cmd); 382 ret = platform->driver->compr_ops->trigger(cstream, cmd);
337 if (ret < 0) 383 if (ret < 0)
@@ -368,6 +414,7 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
368{ 414{
369 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 415 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
370 struct snd_soc_platform *platform = rtd->platform; 416 struct snd_soc_platform *platform = rtd->platform;
417 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
371 int ret = 0; 418 int ret = 0;
372 419
373 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 420 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
@@ -378,6 +425,12 @@ static int soc_compr_set_params(struct snd_compr_stream *cstream,
378 * expectation is that platform and machine will configure everything 425 * expectation is that platform and machine will configure everything
379 * for this compress path, like configuring pcm port for codec 426 * for this compress path, like configuring pcm port for codec
380 */ 427 */
428 if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
429 ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
430 if (ret < 0)
431 goto err;
432 }
433
381 if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) { 434 if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
382 ret = platform->driver->compr_ops->set_params(cstream, params); 435 ret = platform->driver->compr_ops->set_params(cstream, params);
383 if (ret < 0) 436 if (ret < 0)
@@ -416,6 +469,7 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
416 struct snd_soc_pcm_runtime *fe = cstream->private_data; 469 struct snd_soc_pcm_runtime *fe = cstream->private_data;
417 struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream; 470 struct snd_pcm_substream *fe_substream = fe->pcm->streams[0].substream;
418 struct snd_soc_platform *platform = fe->platform; 471 struct snd_soc_platform *platform = fe->platform;
472 struct snd_soc_dai *cpu_dai = fe->cpu_dai;
419 int ret = 0, stream; 473 int ret = 0, stream;
420 474
421 if (cstream->direction == SND_COMPRESS_PLAYBACK) 475 if (cstream->direction == SND_COMPRESS_PLAYBACK)
@@ -425,6 +479,12 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream,
425 479
426 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME); 480 mutex_lock_nested(&fe->card->mutex, SND_SOC_CARD_CLASS_RUNTIME);
427 481
482 if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_params) {
483 ret = cpu_dai->driver->cops->set_params(cstream, params, cpu_dai);
484 if (ret < 0)
485 goto out;
486 }
487
428 if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) { 488 if (platform->driver->compr_ops && platform->driver->compr_ops->set_params) {
429 ret = platform->driver->compr_ops->set_params(cstream, params); 489 ret = platform->driver->compr_ops->set_params(cstream, params);
430 if (ret < 0) 490 if (ret < 0)
@@ -469,13 +529,21 @@ static int soc_compr_get_params(struct snd_compr_stream *cstream,
469{ 529{
470 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 530 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
471 struct snd_soc_platform *platform = rtd->platform; 531 struct snd_soc_platform *platform = rtd->platform;
532 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
472 int ret = 0; 533 int ret = 0;
473 534
474 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 535 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
475 536
537 if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_params) {
538 ret = cpu_dai->driver->cops->get_params(cstream, params, cpu_dai);
539 if (ret < 0)
540 goto err;
541 }
542
476 if (platform->driver->compr_ops && platform->driver->compr_ops->get_params) 543 if (platform->driver->compr_ops && platform->driver->compr_ops->get_params)
477 ret = platform->driver->compr_ops->get_params(cstream, params); 544 ret = platform->driver->compr_ops->get_params(cstream, params);
478 545
546err:
479 mutex_unlock(&rtd->pcm_mutex); 547 mutex_unlock(&rtd->pcm_mutex);
480 return ret; 548 return ret;
481} 549}
@@ -516,13 +584,21 @@ static int soc_compr_ack(struct snd_compr_stream *cstream, size_t bytes)
516{ 584{
517 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 585 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
518 struct snd_soc_platform *platform = rtd->platform; 586 struct snd_soc_platform *platform = rtd->platform;
587 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
519 int ret = 0; 588 int ret = 0;
520 589
521 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 590 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
522 591
592 if (cpu_dai->driver->cops && cpu_dai->driver->cops->ack) {
593 ret = cpu_dai->driver->cops->ack(cstream, bytes, cpu_dai);
594 if (ret < 0)
595 goto err;
596 }
597
523 if (platform->driver->compr_ops && platform->driver->compr_ops->ack) 598 if (platform->driver->compr_ops && platform->driver->compr_ops->ack)
524 ret = platform->driver->compr_ops->ack(cstream, bytes); 599 ret = platform->driver->compr_ops->ack(cstream, bytes);
525 600
601err:
526 mutex_unlock(&rtd->pcm_mutex); 602 mutex_unlock(&rtd->pcm_mutex);
527 return ret; 603 return ret;
528} 604}
@@ -533,9 +609,13 @@ static int soc_compr_pointer(struct snd_compr_stream *cstream,
533 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 609 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
534 struct snd_soc_platform *platform = rtd->platform; 610 struct snd_soc_platform *platform = rtd->platform;
535 int ret = 0; 611 int ret = 0;
612 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
536 613
537 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass); 614 mutex_lock_nested(&rtd->pcm_mutex, rtd->pcm_subclass);
538 615
616 if (cpu_dai->driver->cops && cpu_dai->driver->cops->pointer)
617 cpu_dai->driver->cops->pointer(cstream, tstamp, cpu_dai);
618
539 if (platform->driver->compr_ops && platform->driver->compr_ops->pointer) 619 if (platform->driver->compr_ops && platform->driver->compr_ops->pointer)
540 ret = platform->driver->compr_ops->pointer(cstream, tstamp); 620 ret = platform->driver->compr_ops->pointer(cstream, tstamp);
541 621
@@ -564,8 +644,15 @@ static int soc_compr_set_metadata(struct snd_compr_stream *cstream,
564{ 644{
565 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 645 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
566 struct snd_soc_platform *platform = rtd->platform; 646 struct snd_soc_platform *platform = rtd->platform;
647 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
567 int ret = 0; 648 int ret = 0;
568 649
650 if (cpu_dai->driver->cops && cpu_dai->driver->cops->set_metadata) {
651 ret = cpu_dai->driver->cops->set_metadata(cstream, metadata, cpu_dai);
652 if (ret < 0)
653 return ret;
654 }
655
569 if (platform->driver->compr_ops && platform->driver->compr_ops->set_metadata) 656 if (platform->driver->compr_ops && platform->driver->compr_ops->set_metadata)
570 ret = platform->driver->compr_ops->set_metadata(cstream, metadata); 657 ret = platform->driver->compr_ops->set_metadata(cstream, metadata);
571 658
@@ -577,8 +664,15 @@ static int soc_compr_get_metadata(struct snd_compr_stream *cstream,
577{ 664{
578 struct snd_soc_pcm_runtime *rtd = cstream->private_data; 665 struct snd_soc_pcm_runtime *rtd = cstream->private_data;
579 struct snd_soc_platform *platform = rtd->platform; 666 struct snd_soc_platform *platform = rtd->platform;
667 struct snd_soc_dai *cpu_dai = rtd->cpu_dai;
580 int ret = 0; 668 int ret = 0;
581 669
670 if (cpu_dai->driver->cops && cpu_dai->driver->cops->get_metadata) {
671 ret = cpu_dai->driver->cops->get_metadata(cstream, metadata, cpu_dai);
672 if (ret < 0)
673 return ret;
674 }
675
582 if (platform->driver->compr_ops && platform->driver->compr_ops->get_metadata) 676 if (platform->driver->compr_ops && platform->driver->compr_ops->get_metadata)
583 ret = platform->driver->compr_ops->get_metadata(cstream, metadata); 677 ret = platform->driver->compr_ops->get_metadata(cstream, metadata);
584 678
diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
index c0bbcd903261..f1901bb1466e 100644
--- a/sound/soc/soc-core.c
+++ b/sound/soc/soc-core.c
@@ -626,7 +626,7 @@ static void codec2codec_close_delayed_work(struct work_struct *work)
626int snd_soc_suspend(struct device *dev) 626int snd_soc_suspend(struct device *dev)
627{ 627{
628 struct snd_soc_card *card = dev_get_drvdata(dev); 628 struct snd_soc_card *card = dev_get_drvdata(dev);
629 struct snd_soc_codec *codec; 629 struct snd_soc_component *component;
630 struct snd_soc_pcm_runtime *rtd; 630 struct snd_soc_pcm_runtime *rtd;
631 int i; 631 int i;
632 632
@@ -702,39 +702,39 @@ int snd_soc_suspend(struct device *dev)
702 dapm_mark_endpoints_dirty(card); 702 dapm_mark_endpoints_dirty(card);
703 snd_soc_dapm_sync(&card->dapm); 703 snd_soc_dapm_sync(&card->dapm);
704 704
705 /* suspend all CODECs */ 705 /* suspend all COMPONENTs */
706 list_for_each_entry(codec, &card->codec_dev_list, card_list) { 706 list_for_each_entry(component, &card->component_dev_list, card_list) {
707 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec); 707 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(component);
708 708
709 /* If there are paths active then the CODEC will be held with 709 /* If there are paths active then the COMPONENT will be held with
710 * bias _ON and should not be suspended. */ 710 * bias _ON and should not be suspended. */
711 if (!codec->suspended) { 711 if (!component->suspended) {
712 switch (snd_soc_dapm_get_bias_level(dapm)) { 712 switch (snd_soc_dapm_get_bias_level(dapm)) {
713 case SND_SOC_BIAS_STANDBY: 713 case SND_SOC_BIAS_STANDBY:
714 /* 714 /*
715 * If the CODEC is capable of idle 715 * If the COMPONENT is capable of idle
716 * bias off then being in STANDBY 716 * bias off then being in STANDBY
717 * means it's doing something, 717 * means it's doing something,
718 * otherwise fall through. 718 * otherwise fall through.
719 */ 719 */
720 if (dapm->idle_bias_off) { 720 if (dapm->idle_bias_off) {
721 dev_dbg(codec->dev, 721 dev_dbg(component->dev,
722 "ASoC: idle_bias_off CODEC on over suspend\n"); 722 "ASoC: idle_bias_off CODEC on over suspend\n");
723 break; 723 break;
724 } 724 }
725 725
726 case SND_SOC_BIAS_OFF: 726 case SND_SOC_BIAS_OFF:
727 if (codec->driver->suspend) 727 if (component->suspend)
728 codec->driver->suspend(codec); 728 component->suspend(component);
729 codec->suspended = 1; 729 component->suspended = 1;
730 if (codec->component.regmap) 730 if (component->regmap)
731 regcache_mark_dirty(codec->component.regmap); 731 regcache_mark_dirty(component->regmap);
732 /* deactivate pins to sleep state */ 732 /* deactivate pins to sleep state */
733 pinctrl_pm_select_sleep_state(codec->dev); 733 pinctrl_pm_select_sleep_state(component->dev);
734 break; 734 break;
735 default: 735 default:
736 dev_dbg(codec->dev, 736 dev_dbg(component->dev,
737 "ASoC: CODEC is on over suspend\n"); 737 "ASoC: COMPONENT is on over suspend\n");
738 break; 738 break;
739 } 739 }
740 } 740 }
@@ -768,7 +768,7 @@ static void soc_resume_deferred(struct work_struct *work)
768 struct snd_soc_card *card = 768 struct snd_soc_card *card =
769 container_of(work, struct snd_soc_card, deferred_resume_work); 769 container_of(work, struct snd_soc_card, deferred_resume_work);
770 struct snd_soc_pcm_runtime *rtd; 770 struct snd_soc_pcm_runtime *rtd;
771 struct snd_soc_codec *codec; 771 struct snd_soc_component *component;
772 int i; 772 int i;
773 773
774 /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time, 774 /* our power state is still SNDRV_CTL_POWER_D3hot from suspend time,
@@ -794,11 +794,11 @@ static void soc_resume_deferred(struct work_struct *work)
794 cpu_dai->driver->resume(cpu_dai); 794 cpu_dai->driver->resume(cpu_dai);
795 } 795 }
796 796
797 list_for_each_entry(codec, &card->codec_dev_list, card_list) { 797 list_for_each_entry(component, &card->component_dev_list, card_list) {
798 if (codec->suspended) { 798 if (component->suspended) {
799 if (codec->driver->resume) 799 if (component->resume)
800 codec->driver->resume(codec); 800 component->resume(component);
801 codec->suspended = 0; 801 component->suspended = 0;
802 } 802 }
803 } 803 }
804 804
@@ -972,6 +972,48 @@ struct snd_soc_dai *snd_soc_find_dai(
972} 972}
973EXPORT_SYMBOL_GPL(snd_soc_find_dai); 973EXPORT_SYMBOL_GPL(snd_soc_find_dai);
974 974
975
976/**
977 * snd_soc_find_dai_link - Find a DAI link
978 *
979 * @card: soc card
980 * @id: DAI link ID to match
981 * @name: DAI link name to match, optional
982 * @stream name: DAI link stream name to match, optional
983 *
984 * This function will search all existing DAI links of the soc card to
985 * find the link of the same ID. Since DAI links may not have their
986 * unique ID, so name and stream name should also match if being
987 * specified.
988 *
989 * Return: pointer of DAI link, or NULL if not found.
990 */
991struct snd_soc_dai_link *snd_soc_find_dai_link(struct snd_soc_card *card,
992 int id, const char *name,
993 const char *stream_name)
994{
995 struct snd_soc_dai_link *link, *_link;
996
997 lockdep_assert_held(&client_mutex);
998
999 list_for_each_entry_safe(link, _link, &card->dai_link_list, list) {
1000 if (link->id != id)
1001 continue;
1002
1003 if (name && (!link->name || strcmp(name, link->name)))
1004 continue;
1005
1006 if (stream_name && (!link->stream_name
1007 || strcmp(stream_name, link->stream_name)))
1008 continue;
1009
1010 return link;
1011 }
1012
1013 return NULL;
1014}
1015EXPORT_SYMBOL_GPL(snd_soc_find_dai_link);
1016
975static bool soc_is_dai_link_bound(struct snd_soc_card *card, 1017static bool soc_is_dai_link_bound(struct snd_soc_card *card,
976 struct snd_soc_dai_link *dai_link) 1018 struct snd_soc_dai_link *dai_link)
977{ 1019{
@@ -993,6 +1035,7 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
993 struct snd_soc_dai_link_component cpu_dai_component; 1035 struct snd_soc_dai_link_component cpu_dai_component;
994 struct snd_soc_dai **codec_dais; 1036 struct snd_soc_dai **codec_dais;
995 struct snd_soc_platform *platform; 1037 struct snd_soc_platform *platform;
1038 struct device_node *platform_of_node;
996 const char *platform_name; 1039 const char *platform_name;
997 int i; 1040 int i;
998 1041
@@ -1042,9 +1085,12 @@ static int soc_bind_dai_link(struct snd_soc_card *card,
1042 1085
1043 /* find one from the set of registered platforms */ 1086 /* find one from the set of registered platforms */
1044 list_for_each_entry(platform, &platform_list, list) { 1087 list_for_each_entry(platform, &platform_list, list) {
1088 platform_of_node = platform->dev->of_node;
1089 if (!platform_of_node && platform->dev->parent->of_node)
1090 platform_of_node = platform->dev->parent->of_node;
1091
1045 if (dai_link->platform_of_node) { 1092 if (dai_link->platform_of_node) {
1046 if (platform->dev->of_node != 1093 if (platform_of_node != dai_link->platform_of_node)
1047 dai_link->platform_of_node)
1048 continue; 1094 continue;
1049 } else { 1095 } else {
1050 if (strcmp(platform->component.name, platform_name)) 1096 if (strcmp(platform->component.name, platform_name))
@@ -1072,9 +1118,7 @@ static void soc_remove_component(struct snd_soc_component *component)
1072 if (!component->card) 1118 if (!component->card)
1073 return; 1119 return;
1074 1120
1075 /* This is a HACK and will be removed soon */ 1121 list_del(&component->card_list);
1076 if (component->codec)
1077 list_del(&component->codec->card_list);
1078 1122
1079 if (component->remove) 1123 if (component->remove)
1080 component->remove(component); 1124 component->remove(component);
@@ -1443,10 +1487,7 @@ static int soc_probe_component(struct snd_soc_card *card,
1443 component->num_dapm_routes); 1487 component->num_dapm_routes);
1444 1488
1445 list_add(&dapm->list, &card->dapm_list); 1489 list_add(&dapm->list, &card->dapm_list);
1446 1490 list_add(&component->card_list, &card->component_dev_list);
1447 /* This is a HACK and will be removed soon */
1448 if (component->codec)
1449 list_add(&component->codec->card_list, &card->codec_dev_list);
1450 1491
1451 return 0; 1492 return 0;
1452 1493
@@ -1706,7 +1747,8 @@ static int soc_bind_aux_dev(struct snd_soc_card *card, int num)
1706 } 1747 }
1707 1748
1708 component->init = aux_dev->init; 1749 component->init = aux_dev->init;
1709 list_add(&component->list_aux, &card->aux_comp_list); 1750 component->auxiliary = 1;
1751
1710 return 0; 1752 return 0;
1711 1753
1712err_defer: 1754err_defer:
@@ -1722,7 +1764,10 @@ static int soc_probe_aux_devices(struct snd_soc_card *card)
1722 1764
1723 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST; 1765 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1724 order++) { 1766 order++) {
1725 list_for_each_entry(comp, &card->aux_comp_list, list_aux) { 1767 list_for_each_entry(comp, &card->component_dev_list, card_list) {
1768 if (!comp->auxiliary)
1769 continue;
1770
1726 if (comp->driver->probe_order == order) { 1771 if (comp->driver->probe_order == order) {
1727 ret = soc_probe_component(card, comp); 1772 ret = soc_probe_component(card, comp);
1728 if (ret < 0) { 1773 if (ret < 0) {
@@ -1746,11 +1791,14 @@ static void soc_remove_aux_devices(struct snd_soc_card *card)
1746 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST; 1791 for (order = SND_SOC_COMP_ORDER_FIRST; order <= SND_SOC_COMP_ORDER_LAST;
1747 order++) { 1792 order++) {
1748 list_for_each_entry_safe(comp, _comp, 1793 list_for_each_entry_safe(comp, _comp,
1749 &card->aux_comp_list, list_aux) { 1794 &card->component_dev_list, card_list) {
1795
1796 if (!comp->auxiliary)
1797 continue;
1798
1750 if (comp->driver->remove_order == order) { 1799 if (comp->driver->remove_order == order) {
1751 soc_remove_component(comp); 1800 soc_remove_component(comp);
1752 /* remove it from the card's aux_comp_list */ 1801 comp->auxiliary = 0;
1753 list_del(&comp->list_aux);
1754 } 1802 }
1755 } 1803 }
1756 } 1804 }
@@ -2926,6 +2974,8 @@ static int snd_soc_component_initialize(struct snd_soc_component *component,
2926 component->driver = driver; 2974 component->driver = driver;
2927 component->probe = component->driver->probe; 2975 component->probe = component->driver->probe;
2928 component->remove = component->driver->remove; 2976 component->remove = component->driver->remove;
2977 component->suspend = component->driver->suspend;
2978 component->resume = component->driver->resume;
2929 2979
2930 dapm = &component->dapm; 2980 dapm = &component->dapm;
2931 dapm->dev = dev; 2981 dapm->dev = dev;
@@ -3275,6 +3325,20 @@ static void snd_soc_codec_drv_remove(struct snd_soc_component *component)
3275 codec->driver->remove(codec); 3325 codec->driver->remove(codec);
3276} 3326}
3277 3327
3328static int snd_soc_codec_drv_suspend(struct snd_soc_component *component)
3329{
3330 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3331
3332 return codec->driver->suspend(codec);
3333}
3334
3335static int snd_soc_codec_drv_resume(struct snd_soc_component *component)
3336{
3337 struct snd_soc_codec *codec = snd_soc_component_to_codec(component);
3338
3339 return codec->driver->resume(codec);
3340}
3341
3278static int snd_soc_codec_drv_write(struct snd_soc_component *component, 3342static int snd_soc_codec_drv_write(struct snd_soc_component *component,
3279 unsigned int reg, unsigned int val) 3343 unsigned int reg, unsigned int val)
3280{ 3344{
@@ -3336,6 +3400,10 @@ int snd_soc_register_codec(struct device *dev,
3336 codec->component.probe = snd_soc_codec_drv_probe; 3400 codec->component.probe = snd_soc_codec_drv_probe;
3337 if (codec_drv->remove) 3401 if (codec_drv->remove)
3338 codec->component.remove = snd_soc_codec_drv_remove; 3402 codec->component.remove = snd_soc_codec_drv_remove;
3403 if (codec_drv->suspend)
3404 codec->component.suspend = snd_soc_codec_drv_suspend;
3405 if (codec_drv->resume)
3406 codec->component.resume = snd_soc_codec_drv_resume;
3339 if (codec_drv->write) 3407 if (codec_drv->write)
3340 codec->component.write = snd_soc_codec_drv_write; 3408 codec->component.write = snd_soc_codec_drv_write;
3341 if (codec_drv->read) 3409 if (codec_drv->read)
@@ -3424,10 +3492,10 @@ found:
3424EXPORT_SYMBOL_GPL(snd_soc_unregister_codec); 3492EXPORT_SYMBOL_GPL(snd_soc_unregister_codec);
3425 3493
3426/* Retrieve a card's name from device tree */ 3494/* Retrieve a card's name from device tree */
3427int snd_soc_of_parse_card_name(struct snd_soc_card *card, 3495int snd_soc_of_parse_card_name_from_node(struct snd_soc_card *card,
3428 const char *propname) 3496 struct device_node *np,
3497 const char *propname)
3429{ 3498{
3430 struct device_node *np;
3431 int ret; 3499 int ret;
3432 3500
3433 if (!card->dev) { 3501 if (!card->dev) {
@@ -3435,7 +3503,8 @@ int snd_soc_of_parse_card_name(struct snd_soc_card *card,
3435 return -EINVAL; 3503 return -EINVAL;
3436 } 3504 }
3437 3505
3438 np = card->dev->of_node; 3506 if (!np)
3507 np = card->dev->of_node;
3439 3508
3440 ret = of_property_read_string_index(np, propname, 0, &card->name); 3509 ret = of_property_read_string_index(np, propname, 0, &card->name);
3441 /* 3510 /*
@@ -3452,7 +3521,7 @@ int snd_soc_of_parse_card_name(struct snd_soc_card *card,
3452 3521
3453 return 0; 3522 return 0;
3454} 3523}
3455EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name); 3524EXPORT_SYMBOL_GPL(snd_soc_of_parse_card_name_from_node);
3456 3525
3457static const struct snd_soc_dapm_widget simple_widgets[] = { 3526static const struct snd_soc_dapm_widget simple_widgets[] = {
3458 SND_SOC_DAPM_MIC("Microphone", NULL), 3527 SND_SOC_DAPM_MIC("Microphone", NULL),
@@ -3461,14 +3530,17 @@ static const struct snd_soc_dapm_widget simple_widgets[] = {
3461 SND_SOC_DAPM_SPK("Speaker", NULL), 3530 SND_SOC_DAPM_SPK("Speaker", NULL),
3462}; 3531};
3463 3532
3464int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card, 3533int snd_soc_of_parse_audio_simple_widgets_from_node(struct snd_soc_card *card,
3534 struct device_node *np,
3465 const char *propname) 3535 const char *propname)
3466{ 3536{
3467 struct device_node *np = card->dev->of_node;
3468 struct snd_soc_dapm_widget *widgets; 3537 struct snd_soc_dapm_widget *widgets;
3469 const char *template, *wname; 3538 const char *template, *wname;
3470 int i, j, num_widgets, ret; 3539 int i, j, num_widgets, ret;
3471 3540
3541 if (!np)
3542 np = card->dev->of_node;
3543
3472 num_widgets = of_property_count_strings(np, propname); 3544 num_widgets = of_property_count_strings(np, propname);
3473 if (num_widgets < 0) { 3545 if (num_widgets < 0) {
3474 dev_err(card->dev, 3546 dev_err(card->dev,
@@ -3539,7 +3611,7 @@ int snd_soc_of_parse_audio_simple_widgets(struct snd_soc_card *card,
3539 3611
3540 return 0; 3612 return 0;
3541} 3613}
3542EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets); 3614EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_simple_widgets_from_node);
3543 3615
3544static int snd_soc_of_get_slot_mask(struct device_node *np, 3616static int snd_soc_of_get_slot_mask(struct device_node *np,
3545 const char *prop_name, 3617 const char *prop_name,
@@ -3595,15 +3667,18 @@ int snd_soc_of_parse_tdm_slot(struct device_node *np,
3595} 3667}
3596EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot); 3668EXPORT_SYMBOL_GPL(snd_soc_of_parse_tdm_slot);
3597 3669
3598void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card, 3670void snd_soc_of_parse_audio_prefix_from_node(struct snd_soc_card *card,
3671 struct device_node *np,
3599 struct snd_soc_codec_conf *codec_conf, 3672 struct snd_soc_codec_conf *codec_conf,
3600 struct device_node *of_node, 3673 struct device_node *of_node,
3601 const char *propname) 3674 const char *propname)
3602{ 3675{
3603 struct device_node *np = card->dev->of_node;
3604 const char *str; 3676 const char *str;
3605 int ret; 3677 int ret;
3606 3678
3679 if (!np)
3680 np = card->dev->of_node;
3681
3607 ret = of_property_read_string(np, propname, &str); 3682 ret = of_property_read_string(np, propname, &str);
3608 if (ret < 0) { 3683 if (ret < 0) {
3609 /* no prefix is not error */ 3684 /* no prefix is not error */
@@ -3613,16 +3688,19 @@ void snd_soc_of_parse_audio_prefix(struct snd_soc_card *card,
3613 codec_conf->of_node = of_node; 3688 codec_conf->of_node = of_node;
3614 codec_conf->name_prefix = str; 3689 codec_conf->name_prefix = str;
3615} 3690}
3616EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_prefix); 3691EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_prefix_from_node);
3617 3692
3618int snd_soc_of_parse_audio_routing(struct snd_soc_card *card, 3693int snd_soc_of_parse_audio_routing_from_node(struct snd_soc_card *card,
3694 struct device_node *np,
3619 const char *propname) 3695 const char *propname)
3620{ 3696{
3621 struct device_node *np = card->dev->of_node;
3622 int num_routes; 3697 int num_routes;
3623 struct snd_soc_dapm_route *routes; 3698 struct snd_soc_dapm_route *routes;
3624 int i, ret; 3699 int i, ret;
3625 3700
3701 if (!np)
3702 np = card->dev->of_node;
3703
3626 num_routes = of_property_count_strings(np, propname); 3704 num_routes = of_property_count_strings(np, propname);
3627 if (num_routes < 0 || num_routes & 1) { 3705 if (num_routes < 0 || num_routes & 1) {
3628 dev_err(card->dev, 3706 dev_err(card->dev,
@@ -3669,7 +3747,7 @@ int snd_soc_of_parse_audio_routing(struct snd_soc_card *card,
3669 3747
3670 return 0; 3748 return 0;
3671} 3749}
3672EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing); 3750EXPORT_SYMBOL_GPL(snd_soc_of_parse_audio_routing_from_node);
3673 3751
3674unsigned int snd_soc_of_parse_daifmt(struct device_node *np, 3752unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
3675 const char *prefix, 3753 const char *prefix,
@@ -3784,7 +3862,7 @@ unsigned int snd_soc_of_parse_daifmt(struct device_node *np,
3784} 3862}
3785EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt); 3863EXPORT_SYMBOL_GPL(snd_soc_of_parse_daifmt);
3786 3864
3787static int snd_soc_get_dai_name(struct of_phandle_args *args, 3865int snd_soc_get_dai_name(struct of_phandle_args *args,
3788 const char **dai_name) 3866 const char **dai_name)
3789{ 3867{
3790 struct snd_soc_component *pos; 3868 struct snd_soc_component *pos;
@@ -3836,6 +3914,7 @@ static int snd_soc_get_dai_name(struct of_phandle_args *args,
3836 mutex_unlock(&client_mutex); 3914 mutex_unlock(&client_mutex);
3837 return ret; 3915 return ret;
3838} 3916}
3917EXPORT_SYMBOL_GPL(snd_soc_get_dai_name);
3839 3918
3840int snd_soc_of_get_dai_name(struct device_node *of_node, 3919int snd_soc_of_get_dai_name(struct device_node *of_node,
3841 const char **dai_name) 3920 const char **dai_name)
diff --git a/sound/soc/soc-dapm.c b/sound/soc/soc-dapm.c
index 3bbe32ee4630..27dd02e57b31 100644
--- a/sound/soc/soc-dapm.c
+++ b/sound/soc/soc-dapm.c
@@ -330,6 +330,11 @@ static int dapm_kcontrol_data_alloc(struct snd_soc_dapm_widget *widget,
330 case snd_soc_dapm_mixer_named_ctl: 330 case snd_soc_dapm_mixer_named_ctl:
331 mc = (struct soc_mixer_control *)kcontrol->private_value; 331 mc = (struct soc_mixer_control *)kcontrol->private_value;
332 332
333 if (mc->autodisable && snd_soc_volsw_is_stereo(mc))
334 dev_warn(widget->dapm->dev,
335 "ASoC: Unsupported stereo autodisable control '%s'\n",
336 ctrl_name);
337
333 if (mc->autodisable) { 338 if (mc->autodisable) {
334 struct snd_soc_dapm_widget template; 339 struct snd_soc_dapm_widget template;
335 340
@@ -723,7 +728,8 @@ static int dapm_connect_mux(struct snd_soc_dapm_context *dapm,
723} 728}
724 729
725/* set up initial codec paths */ 730/* set up initial codec paths */
726static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i) 731static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i,
732 int nth_path)
727{ 733{
728 struct soc_mixer_control *mc = (struct soc_mixer_control *) 734 struct soc_mixer_control *mc = (struct soc_mixer_control *)
729 p->sink->kcontrol_news[i].private_value; 735 p->sink->kcontrol_news[i].private_value;
@@ -736,7 +742,25 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i)
736 742
737 if (reg != SND_SOC_NOPM) { 743 if (reg != SND_SOC_NOPM) {
738 soc_dapm_read(p->sink->dapm, reg, &val); 744 soc_dapm_read(p->sink->dapm, reg, &val);
739 val = (val >> shift) & mask; 745 /*
746 * The nth_path argument allows this function to know
747 * which path of a kcontrol it is setting the initial
748 * status for. Ideally this would support any number
749 * of paths and channels. But since kcontrols only come
750 * in mono and stereo variants, we are limited to 2
751 * channels.
752 *
753 * The following code assumes for stereo controls the
754 * first path is the left channel, and all remaining
755 * paths are the right channel.
756 */
757 if (snd_soc_volsw_is_stereo(mc) && nth_path > 0) {
758 if (reg != mc->rreg)
759 soc_dapm_read(p->sink->dapm, mc->rreg, &val);
760 val = (val >> mc->rshift) & mask;
761 } else {
762 val = (val >> shift) & mask;
763 }
740 if (invert) 764 if (invert)
741 val = max - val; 765 val = max - val;
742 p->connect = !!val; 766 p->connect = !!val;
@@ -749,13 +773,13 @@ static void dapm_set_mixer_path_status(struct snd_soc_dapm_path *p, int i)
749static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm, 773static int dapm_connect_mixer(struct snd_soc_dapm_context *dapm,
750 struct snd_soc_dapm_path *path, const char *control_name) 774 struct snd_soc_dapm_path *path, const char *control_name)
751{ 775{
752 int i; 776 int i, nth_path = 0;
753 777
754 /* search for mixer kcontrol */ 778 /* search for mixer kcontrol */
755 for (i = 0; i < path->sink->num_kcontrols; i++) { 779 for (i = 0; i < path->sink->num_kcontrols; i++) {
756 if (!strcmp(control_name, path->sink->kcontrol_news[i].name)) { 780 if (!strcmp(control_name, path->sink->kcontrol_news[i].name)) {
757 path->name = path->sink->kcontrol_news[i].name; 781 path->name = path->sink->kcontrol_news[i].name;
758 dapm_set_mixer_path_status(path, i); 782 dapm_set_mixer_path_status(path, i, nth_path++);
759 return 0; 783 return 0;
760 } 784 }
761 } 785 }
@@ -1626,6 +1650,15 @@ static void dapm_widget_update(struct snd_soc_card *card)
1626 dev_err(w->dapm->dev, "ASoC: %s DAPM update failed: %d\n", 1650 dev_err(w->dapm->dev, "ASoC: %s DAPM update failed: %d\n",
1627 w->name, ret); 1651 w->name, ret);
1628 1652
1653 if (update->has_second_set) {
1654 ret = soc_dapm_update_bits(w->dapm, update->reg2,
1655 update->mask2, update->val2);
1656 if (ret < 0)
1657 dev_err(w->dapm->dev,
1658 "ASoC: %s DAPM update failed: %d\n",
1659 w->name, ret);
1660 }
1661
1629 for (wi = 0; wi < wlist->num_widgets; wi++) { 1662 for (wi = 0; wi < wlist->num_widgets; wi++) {
1630 w = wlist->widgets[wi]; 1663 w = wlist->widgets[wi];
1631 1664
@@ -2177,7 +2210,8 @@ EXPORT_SYMBOL_GPL(snd_soc_dapm_mux_update_power);
2177 2210
2178/* test and update the power status of a mixer or switch widget */ 2211/* test and update the power status of a mixer or switch widget */
2179static int soc_dapm_mixer_update_power(struct snd_soc_card *card, 2212static int soc_dapm_mixer_update_power(struct snd_soc_card *card,
2180 struct snd_kcontrol *kcontrol, int connect) 2213 struct snd_kcontrol *kcontrol,
2214 int connect, int rconnect)
2181{ 2215{
2182 struct snd_soc_dapm_path *path; 2216 struct snd_soc_dapm_path *path;
2183 int found = 0; 2217 int found = 0;
@@ -2186,8 +2220,33 @@ static int soc_dapm_mixer_update_power(struct snd_soc_card *card,
2186 2220
2187 /* find dapm widget path assoc with kcontrol */ 2221 /* find dapm widget path assoc with kcontrol */
2188 dapm_kcontrol_for_each_path(path, kcontrol) { 2222 dapm_kcontrol_for_each_path(path, kcontrol) {
2223 /*
2224 * Ideally this function should support any number of
2225 * paths and channels. But since kcontrols only come
2226 * in mono and stereo variants, we are limited to 2
2227 * channels.
2228 *
2229 * The following code assumes for stereo controls the
2230 * first path (when 'found == 0') is the left channel,
2231 * and all remaining paths (when 'found == 1') are the
2232 * right channel.
2233 *
2234 * A stereo control is signified by a valid 'rconnect'
2235 * value, either 0 for unconnected, or >= 0 for connected.
2236 * This is chosen instead of using snd_soc_volsw_is_stereo,
2237 * so that the behavior of snd_soc_dapm_mixer_update_power
2238 * doesn't change even when the kcontrol passed in is
2239 * stereo.
2240 *
2241 * It passes 'connect' as the path connect status for
2242 * the left channel, and 'rconnect' for the right
2243 * channel.
2244 */
2245 if (found && rconnect >= 0)
2246 soc_dapm_connect_path(path, rconnect, "mixer update");
2247 else
2248 soc_dapm_connect_path(path, connect, "mixer update");
2189 found = 1; 2249 found = 1;
2190 soc_dapm_connect_path(path, connect, "mixer update");
2191 } 2250 }
2192 2251
2193 if (found) 2252 if (found)
@@ -2205,7 +2264,7 @@ int snd_soc_dapm_mixer_update_power(struct snd_soc_dapm_context *dapm,
2205 2264
2206 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 2265 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
2207 card->update = update; 2266 card->update = update;
2208 ret = soc_dapm_mixer_update_power(card, kcontrol, connect); 2267 ret = soc_dapm_mixer_update_power(card, kcontrol, connect, -1);
2209 card->update = NULL; 2268 card->update = NULL;
2210 mutex_unlock(&card->dapm_mutex); 2269 mutex_unlock(&card->dapm_mutex);
2211 if (ret > 0) 2270 if (ret > 0)
@@ -3030,22 +3089,28 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
3030 int reg = mc->reg; 3089 int reg = mc->reg;
3031 unsigned int shift = mc->shift; 3090 unsigned int shift = mc->shift;
3032 int max = mc->max; 3091 int max = mc->max;
3092 unsigned int width = fls(max);
3033 unsigned int mask = (1 << fls(max)) - 1; 3093 unsigned int mask = (1 << fls(max)) - 1;
3034 unsigned int invert = mc->invert; 3094 unsigned int invert = mc->invert;
3035 unsigned int val; 3095 unsigned int reg_val, val, rval = 0;
3036 int ret = 0; 3096 int ret = 0;
3037 3097
3038 if (snd_soc_volsw_is_stereo(mc))
3039 dev_warn(dapm->dev,
3040 "ASoC: Control '%s' is stereo, which is not supported\n",
3041 kcontrol->id.name);
3042
3043 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3098 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3044 if (dapm_kcontrol_is_powered(kcontrol) && reg != SND_SOC_NOPM) { 3099 if (dapm_kcontrol_is_powered(kcontrol) && reg != SND_SOC_NOPM) {
3045 ret = soc_dapm_read(dapm, reg, &val); 3100 ret = soc_dapm_read(dapm, reg, &reg_val);
3046 val = (val >> shift) & mask; 3101 val = (reg_val >> shift) & mask;
3102
3103 if (ret == 0 && reg != mc->rreg)
3104 ret = soc_dapm_read(dapm, mc->rreg, &reg_val);
3105
3106 if (snd_soc_volsw_is_stereo(mc))
3107 rval = (reg_val >> mc->rshift) & mask;
3047 } else { 3108 } else {
3048 val = dapm_kcontrol_get_value(kcontrol); 3109 reg_val = dapm_kcontrol_get_value(kcontrol);
3110 val = reg_val & mask;
3111
3112 if (snd_soc_volsw_is_stereo(mc))
3113 rval = (reg_val >> width) & mask;
3049 } 3114 }
3050 mutex_unlock(&card->dapm_mutex); 3115 mutex_unlock(&card->dapm_mutex);
3051 3116
@@ -3057,6 +3122,13 @@ int snd_soc_dapm_get_volsw(struct snd_kcontrol *kcontrol,
3057 else 3122 else
3058 ucontrol->value.integer.value[0] = val; 3123 ucontrol->value.integer.value[0] = val;
3059 3124
3125 if (snd_soc_volsw_is_stereo(mc)) {
3126 if (invert)
3127 ucontrol->value.integer.value[1] = max - rval;
3128 else
3129 ucontrol->value.integer.value[1] = rval;
3130 }
3131
3060 return ret; 3132 return ret;
3061} 3133}
3062EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw); 3134EXPORT_SYMBOL_GPL(snd_soc_dapm_get_volsw);
@@ -3080,46 +3152,66 @@ int snd_soc_dapm_put_volsw(struct snd_kcontrol *kcontrol,
3080 int reg = mc->reg; 3152 int reg = mc->reg;
3081 unsigned int shift = mc->shift; 3153 unsigned int shift = mc->shift;
3082 int max = mc->max; 3154 int max = mc->max;
3083 unsigned int mask = (1 << fls(max)) - 1; 3155 unsigned int width = fls(max);
3156 unsigned int mask = (1 << width) - 1;
3084 unsigned int invert = mc->invert; 3157 unsigned int invert = mc->invert;
3085 unsigned int val; 3158 unsigned int val, rval = 0;
3086 int connect, change, reg_change = 0; 3159 int connect, rconnect = -1, change, reg_change = 0;
3087 struct snd_soc_dapm_update update; 3160 struct snd_soc_dapm_update update = { NULL };
3088 int ret = 0; 3161 int ret = 0;
3089 3162
3090 if (snd_soc_volsw_is_stereo(mc))
3091 dev_warn(dapm->dev,
3092 "ASoC: Control '%s' is stereo, which is not supported\n",
3093 kcontrol->id.name);
3094
3095 val = (ucontrol->value.integer.value[0] & mask); 3163 val = (ucontrol->value.integer.value[0] & mask);
3096 connect = !!val; 3164 connect = !!val;
3097 3165
3098 if (invert) 3166 if (invert)
3099 val = max - val; 3167 val = max - val;
3100 3168
3169 if (snd_soc_volsw_is_stereo(mc)) {
3170 rval = (ucontrol->value.integer.value[1] & mask);
3171 rconnect = !!rval;
3172 if (invert)
3173 rval = max - rval;
3174 }
3175
3101 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME); 3176 mutex_lock_nested(&card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
3102 3177
3103 change = dapm_kcontrol_set_value(kcontrol, val); 3178 /* This assumes field width < (bits in unsigned int / 2) */
3179 if (width > sizeof(unsigned int) * 8 / 2)
3180 dev_warn(dapm->dev,
3181 "ASoC: control %s field width limit exceeded\n",
3182 kcontrol->id.name);
3183 change = dapm_kcontrol_set_value(kcontrol, val | (rval << width));
3104 3184
3105 if (reg != SND_SOC_NOPM) { 3185 if (reg != SND_SOC_NOPM) {
3106 mask = mask << shift;
3107 val = val << shift; 3186 val = val << shift;
3187 rval = rval << mc->rshift;
3188
3189 reg_change = soc_dapm_test_bits(dapm, reg, mask << shift, val);
3108 3190
3109 reg_change = soc_dapm_test_bits(dapm, reg, mask, val); 3191 if (snd_soc_volsw_is_stereo(mc))
3192 reg_change |= soc_dapm_test_bits(dapm, mc->rreg,
3193 mask << mc->rshift,
3194 rval);
3110 } 3195 }
3111 3196
3112 if (change || reg_change) { 3197 if (change || reg_change) {
3113 if (reg_change) { 3198 if (reg_change) {
3199 if (snd_soc_volsw_is_stereo(mc)) {
3200 update.has_second_set = true;
3201 update.reg2 = mc->rreg;
3202 update.mask2 = mask << mc->rshift;
3203 update.val2 = rval;
3204 }
3114 update.kcontrol = kcontrol; 3205 update.kcontrol = kcontrol;
3115 update.reg = reg; 3206 update.reg = reg;
3116 update.mask = mask; 3207 update.mask = mask << shift;
3117 update.val = val; 3208 update.val = val;
3118 card->update = &update; 3209 card->update = &update;
3119 } 3210 }
3120 change |= reg_change; 3211 change |= reg_change;
3121 3212
3122 ret = soc_dapm_mixer_update_power(card, kcontrol, connect); 3213 ret = soc_dapm_mixer_update_power(card, kcontrol, connect,
3214 rconnect);
3123 3215
3124 card->update = NULL; 3216 card->update = NULL;
3125 } 3217 }
@@ -3192,7 +3284,7 @@ int snd_soc_dapm_put_enum_double(struct snd_kcontrol *kcontrol,
3192 unsigned int *item = ucontrol->value.enumerated.item; 3284 unsigned int *item = ucontrol->value.enumerated.item;
3193 unsigned int val, change, reg_change = 0; 3285 unsigned int val, change, reg_change = 0;
3194 unsigned int mask; 3286 unsigned int mask;
3195 struct snd_soc_dapm_update update; 3287 struct snd_soc_dapm_update update = { NULL };
3196 int ret = 0; 3288 int ret = 0;
3197 3289
3198 if (item[0] >= e->items) 3290 if (item[0] >= e->items)
diff --git a/sound/soc/soc-generic-dmaengine-pcm.c b/sound/soc/soc-generic-dmaengine-pcm.c
index 6cef3977507a..17eb14935577 100644
--- a/sound/soc/soc-generic-dmaengine-pcm.c
+++ b/sound/soc/soc-generic-dmaengine-pcm.c
@@ -263,7 +263,6 @@ static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd)
263 struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform); 263 struct dmaengine_pcm *pcm = soc_platform_to_pcm(rtd->platform);
264 const struct snd_dmaengine_pcm_config *config = pcm->config; 264 const struct snd_dmaengine_pcm_config *config = pcm->config;
265 struct device *dev = rtd->platform->dev; 265 struct device *dev = rtd->platform->dev;
266 struct snd_dmaengine_dai_dma_data *dma_data;
267 struct snd_pcm_substream *substream; 266 struct snd_pcm_substream *substream;
268 size_t prealloc_buffer_size; 267 size_t prealloc_buffer_size;
269 size_t max_buffer_size; 268 size_t max_buffer_size;
@@ -278,19 +277,11 @@ static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd)
278 max_buffer_size = SIZE_MAX; 277 max_buffer_size = SIZE_MAX;
279 } 278 }
280 279
281
282 for (i = SNDRV_PCM_STREAM_PLAYBACK; i <= SNDRV_PCM_STREAM_CAPTURE; i++) { 280 for (i = SNDRV_PCM_STREAM_PLAYBACK; i <= SNDRV_PCM_STREAM_CAPTURE; i++) {
283 substream = rtd->pcm->streams[i].substream; 281 substream = rtd->pcm->streams[i].substream;
284 if (!substream) 282 if (!substream)
285 continue; 283 continue;
286 284
287 dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);
288
289 if (!pcm->chan[i] &&
290 (pcm->flags & SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME))
291 pcm->chan[i] = dma_request_slave_channel(dev,
292 dma_data->chan_name);
293
294 if (!pcm->chan[i] && (pcm->flags & SND_DMAENGINE_PCM_FLAG_COMPAT)) { 285 if (!pcm->chan[i] && (pcm->flags & SND_DMAENGINE_PCM_FLAG_COMPAT)) {
295 pcm->chan[i] = dmaengine_pcm_compat_request_channel(rtd, 286 pcm->chan[i] = dmaengine_pcm_compat_request_channel(rtd,
296 substream); 287 substream);
@@ -359,9 +350,7 @@ static int dmaengine_pcm_request_chan_of(struct dmaengine_pcm *pcm,
359 const char *name; 350 const char *name;
360 struct dma_chan *chan; 351 struct dma_chan *chan;
361 352
362 if ((pcm->flags & (SND_DMAENGINE_PCM_FLAG_NO_DT | 353 if ((pcm->flags & SND_DMAENGINE_PCM_FLAG_NO_DT) || !dev->of_node)
363 SND_DMAENGINE_PCM_FLAG_CUSTOM_CHANNEL_NAME)) ||
364 !dev->of_node)
365 return 0; 354 return 0;
366 355
367 if (config && config->dma_dev) { 356 if (config && config->dma_dev) {
diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
index d56a16a0f6fa..e7a1eaa2772f 100644
--- a/sound/soc/soc-pcm.c
+++ b/sound/soc/soc-pcm.c
@@ -2882,7 +2882,7 @@ int snd_soc_platform_trigger(struct snd_pcm_substream *substream,
2882EXPORT_SYMBOL_GPL(snd_soc_platform_trigger); 2882EXPORT_SYMBOL_GPL(snd_soc_platform_trigger);
2883 2883
2884#ifdef CONFIG_DEBUG_FS 2884#ifdef CONFIG_DEBUG_FS
2885static char *dpcm_state_string(enum snd_soc_dpcm_state state) 2885static const char *dpcm_state_string(enum snd_soc_dpcm_state state)
2886{ 2886{
2887 switch (state) { 2887 switch (state) {
2888 case SND_SOC_DPCM_STATE_NEW: 2888 case SND_SOC_DPCM_STATE_NEW:
diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
index 6b05047a4134..65670b2b408c 100644
--- a/sound/soc/soc-topology.c
+++ b/sound/soc/soc-topology.c
@@ -49,10 +49,68 @@
49#define SOC_TPLG_PASS_GRAPH 5 49#define SOC_TPLG_PASS_GRAPH 5
50#define SOC_TPLG_PASS_PINS 6 50#define SOC_TPLG_PASS_PINS 6
51#define SOC_TPLG_PASS_BE_DAI 7 51#define SOC_TPLG_PASS_BE_DAI 7
52#define SOC_TPLG_PASS_LINK 8
52 53
53#define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST 54#define SOC_TPLG_PASS_START SOC_TPLG_PASS_MANIFEST
54#define SOC_TPLG_PASS_END SOC_TPLG_PASS_BE_DAI 55#define SOC_TPLG_PASS_END SOC_TPLG_PASS_LINK
55 56
57/*
58 * Old version of ABI structs, supported for backward compatibility.
59 */
60
61/* Manifest v4 */
62struct snd_soc_tplg_manifest_v4 {
63 __le32 size; /* in bytes of this structure */
64 __le32 control_elems; /* number of control elements */
65 __le32 widget_elems; /* number of widget elements */
66 __le32 graph_elems; /* number of graph elements */
67 __le32 pcm_elems; /* number of PCM elements */
68 __le32 dai_link_elems; /* number of DAI link elements */
69 struct snd_soc_tplg_private priv;
70} __packed;
71
72/* Stream Capabilities v4 */
73struct snd_soc_tplg_stream_caps_v4 {
74 __le32 size; /* in bytes of this structure */
75 char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
76 __le64 formats; /* supported formats SNDRV_PCM_FMTBIT_* */
77 __le32 rates; /* supported rates SNDRV_PCM_RATE_* */
78 __le32 rate_min; /* min rate */
79 __le32 rate_max; /* max rate */
80 __le32 channels_min; /* min channels */
81 __le32 channels_max; /* max channels */
82 __le32 periods_min; /* min number of periods */
83 __le32 periods_max; /* max number of periods */
84 __le32 period_size_min; /* min period size bytes */
85 __le32 period_size_max; /* max period size bytes */
86 __le32 buffer_size_min; /* min buffer size bytes */
87 __le32 buffer_size_max; /* max buffer size bytes */
88} __packed;
89
90/* PCM v4 */
91struct snd_soc_tplg_pcm_v4 {
92 __le32 size; /* in bytes of this structure */
93 char pcm_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
94 char dai_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
95 __le32 pcm_id; /* unique ID - used to match with DAI link */
96 __le32 dai_id; /* unique ID - used to match */
97 __le32 playback; /* supports playback mode */
98 __le32 capture; /* supports capture mode */
99 __le32 compress; /* 1 = compressed; 0 = PCM */
100 struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* for DAI link */
101 __le32 num_streams; /* number of streams */
102 struct snd_soc_tplg_stream_caps_v4 caps[2]; /* playback and capture for DAI */
103} __packed;
104
105/* Physical link config v4 */
106struct snd_soc_tplg_link_config_v4 {
107 __le32 size; /* in bytes of this structure */
108 __le32 id; /* unique ID - used to match */
109 struct snd_soc_tplg_stream stream[SND_SOC_TPLG_STREAM_CONFIG_MAX]; /* supported configs playback and captrure */
110 __le32 num_streams; /* number of streams */
111} __packed;
112
113/* topology context */
56struct soc_tplg { 114struct soc_tplg {
57 const struct firmware *fw; 115 const struct firmware *fw;
58 116
@@ -428,33 +486,41 @@ static void remove_widget(struct snd_soc_component *comp,
428 dobj->ops->widget_unload(comp, dobj); 486 dobj->ops->widget_unload(comp, dobj);
429 487
430 /* 488 /*
431 * Dynamic Widgets either have 1 enum kcontrol or 1..N mixers. 489 * Dynamic Widgets either have 1..N enum kcontrols or mixers.
432 * The enum may either have an array of values or strings. 490 * The enum may either have an array of values or strings.
433 */ 491 */
434 if (dobj->widget.kcontrol_enum) { 492 if (dobj->widget.kcontrol_type == SND_SOC_TPLG_TYPE_ENUM) {
435 /* enumerated widget mixer */ 493 /* enumerated widget mixer */
436 struct soc_enum *se = 494 for (i = 0; i < w->num_kcontrols; i++) {
437 (struct soc_enum *)w->kcontrols[0]->private_value; 495 struct snd_kcontrol *kcontrol = w->kcontrols[i];
496 struct soc_enum *se =
497 (struct soc_enum *)kcontrol->private_value;
438 498
439 snd_ctl_remove(card, w->kcontrols[0]); 499 snd_ctl_remove(card, kcontrol);
440 500
441 kfree(se->dobj.control.dvalues); 501 kfree(se->dobj.control.dvalues);
442 for (i = 0; i < se->items; i++) 502 for (i = 0; i < se->items; i++)
443 kfree(se->dobj.control.dtexts[i]); 503 kfree(se->dobj.control.dtexts[i]);
444 504
445 kfree(se); 505 kfree(se);
506 }
446 kfree(w->kcontrol_news); 507 kfree(w->kcontrol_news);
447 } else { 508 } else {
448 /* non enumerated widget mixer */ 509 /* volume mixer or bytes controls */
449 for (i = 0; i < w->num_kcontrols; i++) { 510 for (i = 0; i < w->num_kcontrols; i++) {
450 struct snd_kcontrol *kcontrol = w->kcontrols[i]; 511 struct snd_kcontrol *kcontrol = w->kcontrols[i];
451 struct soc_mixer_control *sm =
452 (struct soc_mixer_control *) kcontrol->private_value;
453 512
454 kfree(w->kcontrols[i]->tlv.p); 513 if (dobj->widget.kcontrol_type
514 == SND_SOC_TPLG_TYPE_MIXER)
515 kfree(kcontrol->tlv.p);
455 516
456 snd_ctl_remove(card, w->kcontrols[i]); 517 snd_ctl_remove(card, kcontrol);
457 kfree(sm); 518
519 /* Private value is used as struct soc_mixer_control
520 * for volume mixers or soc_bytes_ext for bytes
521 * controls.
522 */
523 kfree((void *)kcontrol->private_value);
458 } 524 }
459 kfree(w->kcontrol_news); 525 kfree(w->kcontrol_news);
460 } 526 }
@@ -474,6 +540,7 @@ static void remove_dai(struct snd_soc_component *comp,
474 if (dobj->ops && dobj->ops->dai_unload) 540 if (dobj->ops && dobj->ops->dai_unload)
475 dobj->ops->dai_unload(comp, dobj); 541 dobj->ops->dai_unload(comp, dobj);
476 542
543 kfree(dai_drv->name);
477 list_del(&dobj->list); 544 list_del(&dobj->list);
478 kfree(dai_drv); 545 kfree(dai_drv);
479} 546}
@@ -491,6 +558,10 @@ static void remove_link(struct snd_soc_component *comp,
491 if (dobj->ops && dobj->ops->link_unload) 558 if (dobj->ops && dobj->ops->link_unload)
492 dobj->ops->link_unload(comp, dobj); 559 dobj->ops->link_unload(comp, dobj);
493 560
561 kfree(link->name);
562 kfree(link->stream_name);
563 kfree(link->cpu_dai_name);
564
494 list_del(&dobj->list); 565 list_del(&dobj->list);
495 snd_soc_remove_dai_link(comp->card, link); 566 snd_soc_remove_dai_link(comp->card, link);
496 kfree(link); 567 kfree(link);
@@ -1193,98 +1264,105 @@ err:
1193} 1264}
1194 1265
1195static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create( 1266static struct snd_kcontrol_new *soc_tplg_dapm_widget_denum_create(
1196 struct soc_tplg *tplg) 1267 struct soc_tplg *tplg, int num_kcontrols)
1197{ 1268{
1198 struct snd_kcontrol_new *kc; 1269 struct snd_kcontrol_new *kc;
1199 struct snd_soc_tplg_enum_control *ec; 1270 struct snd_soc_tplg_enum_control *ec;
1200 struct soc_enum *se; 1271 struct soc_enum *se;
1201 int i, err; 1272 int i, j, err;
1202
1203 ec = (struct snd_soc_tplg_enum_control *)tplg->pos;
1204 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) +
1205 ec->priv.size);
1206 1273
1207 /* validate kcontrol */ 1274 kc = kcalloc(num_kcontrols, sizeof(*kc), GFP_KERNEL);
1208 if (strnlen(ec->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
1209 SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
1210 return NULL;
1211
1212 kc = kzalloc(sizeof(*kc), GFP_KERNEL);
1213 if (kc == NULL) 1275 if (kc == NULL)
1214 return NULL; 1276 return NULL;
1215 1277
1216 se = kzalloc(sizeof(*se), GFP_KERNEL); 1278 for (i = 0; i < num_kcontrols; i++) {
1217 if (se == NULL) 1279 ec = (struct snd_soc_tplg_enum_control *)tplg->pos;
1218 goto err; 1280 /* validate kcontrol */
1281 if (strnlen(ec->hdr.name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
1282 SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
1283 return NULL;
1219 1284
1220 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n", 1285 se = kzalloc(sizeof(*se), GFP_KERNEL);
1221 ec->hdr.name); 1286 if (se == NULL)
1287 goto err;
1222 1288
1223 kc->name = ec->hdr.name; 1289 dev_dbg(tplg->dev, " adding DAPM widget enum control %s\n",
1224 kc->private_value = (long)se; 1290 ec->hdr.name);
1225 kc->iface = SNDRV_CTL_ELEM_IFACE_MIXER; 1291
1226 kc->access = ec->hdr.access; 1292 kc[i].name = ec->hdr.name;
1293 kc[i].private_value = (long)se;
1294 kc[i].iface = SNDRV_CTL_ELEM_IFACE_MIXER;
1295 kc[i].access = ec->hdr.access;
1227 1296
1228 /* we only support FL/FR channel mapping atm */ 1297 /* we only support FL/FR channel mapping atm */
1229 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL); 1298 se->reg = tplc_chan_get_reg(tplg, ec->channel, SNDRV_CHMAP_FL);
1230 se->shift_l = tplc_chan_get_shift(tplg, ec->channel, SNDRV_CHMAP_FL); 1299 se->shift_l = tplc_chan_get_shift(tplg, ec->channel,
1231 se->shift_r = tplc_chan_get_shift(tplg, ec->channel, SNDRV_CHMAP_FR); 1300 SNDRV_CHMAP_FL);
1301 se->shift_r = tplc_chan_get_shift(tplg, ec->channel,
1302 SNDRV_CHMAP_FR);
1232 1303
1233 se->items = ec->items; 1304 se->items = ec->items;
1234 se->mask = ec->mask; 1305 se->mask = ec->mask;
1235 se->dobj.index = tplg->index; 1306 se->dobj.index = tplg->index;
1236 1307
1237 switch (ec->hdr.ops.info) { 1308 switch (ec->hdr.ops.info) {
1238 case SND_SOC_TPLG_CTL_ENUM_VALUE: 1309 case SND_SOC_TPLG_CTL_ENUM_VALUE:
1239 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: 1310 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE:
1240 err = soc_tplg_denum_create_values(se, ec); 1311 err = soc_tplg_denum_create_values(se, ec);
1241 if (err < 0) { 1312 if (err < 0) {
1242 dev_err(tplg->dev, "ASoC: could not create values for %s\n", 1313 dev_err(tplg->dev, "ASoC: could not create values for %s\n",
1243 ec->hdr.name); 1314 ec->hdr.name);
1315 goto err_se;
1316 }
1317 /* fall through to create texts */
1318 case SND_SOC_TPLG_CTL_ENUM:
1319 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE:
1320 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT:
1321 err = soc_tplg_denum_create_texts(se, ec);
1322 if (err < 0) {
1323 dev_err(tplg->dev, "ASoC: could not create texts for %s\n",
1324 ec->hdr.name);
1325 goto err_se;
1326 }
1327 break;
1328 default:
1329 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n",
1330 ec->hdr.ops.info, ec->hdr.name);
1244 goto err_se; 1331 goto err_se;
1245 } 1332 }
1246 /* fall through to create texts */ 1333
1247 case SND_SOC_TPLG_CTL_ENUM: 1334 /* map io handlers */
1248 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: 1335 err = soc_tplg_kcontrol_bind_io(&ec->hdr, &kc[i], tplg);
1249 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: 1336 if (err) {
1250 err = soc_tplg_denum_create_texts(se, ec); 1337 soc_control_err(tplg, &ec->hdr, ec->hdr.name);
1338 goto err_se;
1339 }
1340
1341 /* pass control to driver for optional further init */
1342 err = soc_tplg_init_kcontrol(tplg, &kc[i],
1343 (struct snd_soc_tplg_ctl_hdr *)ec);
1251 if (err < 0) { 1344 if (err < 0) {
1252 dev_err(tplg->dev, "ASoC: could not create texts for %s\n", 1345 dev_err(tplg->dev, "ASoC: failed to init %s\n",
1253 ec->hdr.name); 1346 ec->hdr.name);
1254 goto err_se; 1347 goto err_se;
1255 } 1348 }
1256 break;
1257 default:
1258 dev_err(tplg->dev, "ASoC: invalid enum control type %d for %s\n",
1259 ec->hdr.ops.info, ec->hdr.name);
1260 goto err_se;
1261 }
1262 1349
1263 /* map io handlers */ 1350 tplg->pos += (sizeof(struct snd_soc_tplg_enum_control) +
1264 err = soc_tplg_kcontrol_bind_io(&ec->hdr, kc, tplg); 1351 ec->priv.size);
1265 if (err) {
1266 soc_control_err(tplg, &ec->hdr, ec->hdr.name);
1267 goto err_se;
1268 }
1269
1270 /* pass control to driver for optional further init */
1271 err = soc_tplg_init_kcontrol(tplg, kc,
1272 (struct snd_soc_tplg_ctl_hdr *)ec);
1273 if (err < 0) {
1274 dev_err(tplg->dev, "ASoC: failed to init %s\n",
1275 ec->hdr.name);
1276 goto err_se;
1277 } 1352 }
1278 1353
1279 return kc; 1354 return kc;
1280 1355
1281err_se: 1356err_se:
1282 /* free values and texts */ 1357 for (; i >= 0; i--) {
1283 kfree(se->dobj.control.dvalues); 1358 /* free values and texts */
1284 for (i = 0; i < ec->items; i++) 1359 se = (struct soc_enum *)kc[i].private_value;
1285 kfree(se->dobj.control.dtexts[i]); 1360 kfree(se->dobj.control.dvalues);
1361 for (j = 0; j < ec->items; j++)
1362 kfree(se->dobj.control.dtexts[j]);
1286 1363
1287 kfree(se); 1364 kfree(se);
1365 }
1288err: 1366err:
1289 kfree(kc); 1367 kfree(kc);
1290 1368
@@ -1366,6 +1444,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
1366 struct snd_soc_dapm_widget template, *widget; 1444 struct snd_soc_dapm_widget template, *widget;
1367 struct snd_soc_tplg_ctl_hdr *control_hdr; 1445 struct snd_soc_tplg_ctl_hdr *control_hdr;
1368 struct snd_soc_card *card = tplg->comp->card; 1446 struct snd_soc_card *card = tplg->comp->card;
1447 unsigned int kcontrol_type;
1369 int ret = 0; 1448 int ret = 0;
1370 1449
1371 if (strnlen(w->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) == 1450 if (strnlen(w->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) ==
@@ -1406,6 +1485,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
1406 tplg->pos += 1485 tplg->pos +=
1407 (sizeof(struct snd_soc_tplg_dapm_widget) + w->priv.size); 1486 (sizeof(struct snd_soc_tplg_dapm_widget) + w->priv.size);
1408 if (w->num_kcontrols == 0) { 1487 if (w->num_kcontrols == 0) {
1488 kcontrol_type = 0;
1409 template.num_kcontrols = 0; 1489 template.num_kcontrols = 0;
1410 goto widget; 1490 goto widget;
1411 } 1491 }
@@ -1421,6 +1501,7 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
1421 case SND_SOC_TPLG_CTL_VOLSW_XR_SX: 1501 case SND_SOC_TPLG_CTL_VOLSW_XR_SX:
1422 case SND_SOC_TPLG_CTL_RANGE: 1502 case SND_SOC_TPLG_CTL_RANGE:
1423 case SND_SOC_TPLG_DAPM_CTL_VOLSW: 1503 case SND_SOC_TPLG_DAPM_CTL_VOLSW:
1504 kcontrol_type = SND_SOC_TPLG_TYPE_MIXER; /* volume mixer */
1424 template.num_kcontrols = w->num_kcontrols; 1505 template.num_kcontrols = w->num_kcontrols;
1425 template.kcontrol_news = 1506 template.kcontrol_news =
1426 soc_tplg_dapm_widget_dmixer_create(tplg, 1507 soc_tplg_dapm_widget_dmixer_create(tplg,
@@ -1435,16 +1516,18 @@ static int soc_tplg_dapm_widget_create(struct soc_tplg *tplg,
1435 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE: 1516 case SND_SOC_TPLG_DAPM_CTL_ENUM_DOUBLE:
1436 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT: 1517 case SND_SOC_TPLG_DAPM_CTL_ENUM_VIRT:
1437 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE: 1518 case SND_SOC_TPLG_DAPM_CTL_ENUM_VALUE:
1438 template.dobj.widget.kcontrol_enum = 1; 1519 kcontrol_type = SND_SOC_TPLG_TYPE_ENUM; /* enumerated mixer */
1439 template.num_kcontrols = 1; 1520 template.num_kcontrols = w->num_kcontrols;
1440 template.kcontrol_news = 1521 template.kcontrol_news =
1441 soc_tplg_dapm_widget_denum_create(tplg); 1522 soc_tplg_dapm_widget_denum_create(tplg,
1523 template.num_kcontrols);
1442 if (!template.kcontrol_news) { 1524 if (!template.kcontrol_news) {
1443 ret = -ENOMEM; 1525 ret = -ENOMEM;
1444 goto hdr_err; 1526 goto hdr_err;
1445 } 1527 }
1446 break; 1528 break;
1447 case SND_SOC_TPLG_CTL_BYTES: 1529 case SND_SOC_TPLG_CTL_BYTES:
1530 kcontrol_type = SND_SOC_TPLG_TYPE_BYTES; /* bytes control */
1448 template.num_kcontrols = w->num_kcontrols; 1531 template.num_kcontrols = w->num_kcontrols;
1449 template.kcontrol_news = 1532 template.kcontrol_news =
1450 soc_tplg_dapm_widget_dbytes_create(tplg, 1533 soc_tplg_dapm_widget_dbytes_create(tplg,
@@ -1481,6 +1564,7 @@ widget:
1481 } 1564 }
1482 1565
1483 widget->dobj.type = SND_SOC_DOBJ_WIDGET; 1566 widget->dobj.type = SND_SOC_DOBJ_WIDGET;
1567 widget->dobj.widget.kcontrol_type = kcontrol_type;
1484 widget->dobj.ops = tplg->ops; 1568 widget->dobj.ops = tplg->ops;
1485 widget->dobj.index = tplg->index; 1569 widget->dobj.index = tplg->index;
1486 kfree(template.sname); 1570 kfree(template.sname);
@@ -1589,7 +1673,8 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
1589 if (dai_drv == NULL) 1673 if (dai_drv == NULL)
1590 return -ENOMEM; 1674 return -ENOMEM;
1591 1675
1592 dai_drv->name = pcm->dai_name; 1676 if (strlen(pcm->dai_name))
1677 dai_drv->name = kstrdup(pcm->dai_name, GFP_KERNEL);
1593 dai_drv->id = pcm->dai_id; 1678 dai_drv->id = pcm->dai_id;
1594 1679
1595 if (pcm->playback) { 1680 if (pcm->playback) {
@@ -1621,8 +1706,31 @@ static int soc_tplg_dai_create(struct soc_tplg *tplg,
1621 return snd_soc_register_dai(tplg->comp, dai_drv); 1706 return snd_soc_register_dai(tplg->comp, dai_drv);
1622} 1707}
1623 1708
1709static void set_link_flags(struct snd_soc_dai_link *link,
1710 unsigned int flag_mask, unsigned int flags)
1711{
1712 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES)
1713 link->symmetric_rates =
1714 flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_RATES ? 1 : 0;
1715
1716 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS)
1717 link->symmetric_channels =
1718 flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_CHANNELS ?
1719 1 : 0;
1720
1721 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS)
1722 link->symmetric_samplebits =
1723 flags & SND_SOC_TPLG_LNK_FLGBIT_SYMMETRIC_SAMPLEBITS ?
1724 1 : 0;
1725
1726 if (flag_mask & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP)
1727 link->ignore_suspend =
1728 flags & SND_SOC_TPLG_LNK_FLGBIT_VOICE_WAKEUP ?
1729 1 : 0;
1730}
1731
1624/* create the FE DAI link */ 1732/* create the FE DAI link */
1625static int soc_tplg_link_create(struct soc_tplg *tplg, 1733static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
1626 struct snd_soc_tplg_pcm *pcm) 1734 struct snd_soc_tplg_pcm *pcm)
1627{ 1735{
1628 struct snd_soc_dai_link *link; 1736 struct snd_soc_dai_link *link;
@@ -1632,11 +1740,15 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
1632 if (link == NULL) 1740 if (link == NULL)
1633 return -ENOMEM; 1741 return -ENOMEM;
1634 1742
1635 link->name = pcm->pcm_name; 1743 if (strlen(pcm->pcm_name)) {
1636 link->stream_name = pcm->pcm_name; 1744 link->name = kstrdup(pcm->pcm_name, GFP_KERNEL);
1745 link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL);
1746 }
1637 link->id = pcm->pcm_id; 1747 link->id = pcm->pcm_id;
1638 1748
1639 link->cpu_dai_name = pcm->dai_name; 1749 if (strlen(pcm->dai_name))
1750 link->cpu_dai_name = kstrdup(pcm->dai_name, GFP_KERNEL);
1751
1640 link->codec_name = "snd-soc-dummy"; 1752 link->codec_name = "snd-soc-dummy";
1641 link->codec_dai_name = "snd-soc-dummy-dai"; 1753 link->codec_dai_name = "snd-soc-dummy-dai";
1642 1754
@@ -1644,6 +1756,8 @@ static int soc_tplg_link_create(struct soc_tplg *tplg,
1644 link->dynamic = 1; 1756 link->dynamic = 1;
1645 link->dpcm_playback = pcm->playback; 1757 link->dpcm_playback = pcm->playback;
1646 link->dpcm_capture = pcm->capture; 1758 link->dpcm_capture = pcm->capture;
1759 if (pcm->flag_mask)
1760 set_link_flags(link, pcm->flag_mask, pcm->flags);
1647 1761
1648 /* pass control to component driver for optional further init */ 1762 /* pass control to component driver for optional further init */
1649 ret = soc_tplg_dai_link_load(tplg, link); 1763 ret = soc_tplg_dai_link_load(tplg, link);
@@ -1672,55 +1786,351 @@ static int soc_tplg_pcm_create(struct soc_tplg *tplg,
1672 if (ret < 0) 1786 if (ret < 0)
1673 return ret; 1787 return ret;
1674 1788
1675 return soc_tplg_link_create(tplg, pcm); 1789 return soc_tplg_fe_link_create(tplg, pcm);
1790}
1791
1792/* copy stream caps from the old version 4 of source */
1793static void stream_caps_new_ver(struct snd_soc_tplg_stream_caps *dest,
1794 struct snd_soc_tplg_stream_caps_v4 *src)
1795{
1796 dest->size = sizeof(*dest);
1797 memcpy(dest->name, src->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
1798 dest->formats = src->formats;
1799 dest->rates = src->rates;
1800 dest->rate_min = src->rate_min;
1801 dest->rate_max = src->rate_max;
1802 dest->channels_min = src->channels_min;
1803 dest->channels_max = src->channels_max;
1804 dest->periods_min = src->periods_min;
1805 dest->periods_max = src->periods_max;
1806 dest->period_size_min = src->period_size_min;
1807 dest->period_size_max = src->period_size_max;
1808 dest->buffer_size_min = src->buffer_size_min;
1809 dest->buffer_size_max = src->buffer_size_max;
1810}
1811
1812/**
1813 * pcm_new_ver - Create the new version of PCM from the old version.
1814 * @tplg: topology context
1815 * @src: older version of pcm as a source
1816 * @pcm: latest version of pcm created from the source
1817 *
1818 * Support from vesion 4. User should free the returned pcm manually.
1819 */
1820static int pcm_new_ver(struct soc_tplg *tplg,
1821 struct snd_soc_tplg_pcm *src,
1822 struct snd_soc_tplg_pcm **pcm)
1823{
1824 struct snd_soc_tplg_pcm *dest;
1825 struct snd_soc_tplg_pcm_v4 *src_v4;
1826 int i;
1827
1828 *pcm = NULL;
1829
1830 if (src->size != sizeof(*src_v4)) {
1831 dev_err(tplg->dev, "ASoC: invalid PCM size\n");
1832 return -EINVAL;
1833 }
1834
1835 dev_warn(tplg->dev, "ASoC: old version of PCM\n");
1836 src_v4 = (struct snd_soc_tplg_pcm_v4 *)src;
1837 dest = kzalloc(sizeof(*dest), GFP_KERNEL);
1838 if (!dest)
1839 return -ENOMEM;
1840
1841 dest->size = sizeof(*dest); /* size of latest abi version */
1842 memcpy(dest->pcm_name, src_v4->pcm_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
1843 memcpy(dest->dai_name, src_v4->dai_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
1844 dest->pcm_id = src_v4->pcm_id;
1845 dest->dai_id = src_v4->dai_id;
1846 dest->playback = src_v4->playback;
1847 dest->capture = src_v4->capture;
1848 dest->compress = src_v4->compress;
1849 dest->num_streams = src_v4->num_streams;
1850 for (i = 0; i < dest->num_streams; i++)
1851 memcpy(&dest->stream[i], &src_v4->stream[i],
1852 sizeof(struct snd_soc_tplg_stream));
1853
1854 for (i = 0; i < 2; i++)
1855 stream_caps_new_ver(&dest->caps[i], &src_v4->caps[i]);
1856
1857 *pcm = dest;
1858 return 0;
1676} 1859}
1677 1860
1678static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg, 1861static int soc_tplg_pcm_elems_load(struct soc_tplg *tplg,
1679 struct snd_soc_tplg_hdr *hdr) 1862 struct snd_soc_tplg_hdr *hdr)
1680{ 1863{
1681 struct snd_soc_tplg_pcm *pcm; 1864 struct snd_soc_tplg_pcm *pcm, *_pcm;
1682 int count = hdr->count; 1865 int count = hdr->count;
1683 int i; 1866 int i, err;
1867 bool abi_match;
1684 1868
1685 if (tplg->pass != SOC_TPLG_PASS_PCM_DAI) 1869 if (tplg->pass != SOC_TPLG_PASS_PCM_DAI)
1686 return 0; 1870 return 0;
1687 1871
1872 /* check the element size and count */
1873 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
1874 if (pcm->size > sizeof(struct snd_soc_tplg_pcm)
1875 || pcm->size < sizeof(struct snd_soc_tplg_pcm_v4)) {
1876 dev_err(tplg->dev, "ASoC: invalid size %d for PCM elems\n",
1877 pcm->size);
1878 return -EINVAL;
1879 }
1880
1688 if (soc_tplg_check_elem_count(tplg, 1881 if (soc_tplg_check_elem_count(tplg,
1689 sizeof(struct snd_soc_tplg_pcm), count, 1882 pcm->size, count,
1690 hdr->payload_size, "PCM DAI")) { 1883 hdr->payload_size, "PCM DAI")) {
1691 dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n", 1884 dev_err(tplg->dev, "ASoC: invalid count %d for PCM DAI elems\n",
1692 count); 1885 count);
1693 return -EINVAL; 1886 return -EINVAL;
1694 } 1887 }
1695 1888
1696 /* create the FE DAIs and DAI links */
1697 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
1698 for (i = 0; i < count; i++) { 1889 for (i = 0; i < count; i++) {
1699 if (pcm->size != sizeof(*pcm)) { 1890 pcm = (struct snd_soc_tplg_pcm *)tplg->pos;
1700 dev_err(tplg->dev, "ASoC: invalid pcm size\n"); 1891
1701 return -EINVAL; 1892 /* check ABI version by size, create a new version of pcm
1893 * if abi not match.
1894 */
1895 if (pcm->size == sizeof(*pcm)) {
1896 abi_match = true;
1897 _pcm = pcm;
1898 } else {
1899 abi_match = false;
1900 err = pcm_new_ver(tplg, pcm, &_pcm);
1702 } 1901 }
1703 1902
1704 soc_tplg_pcm_create(tplg, pcm); 1903 /* create the FE DAIs and DAI links */
1705 pcm++; 1904 soc_tplg_pcm_create(tplg, _pcm);
1905
1906 /* offset by version-specific struct size and
1907 * real priv data size
1908 */
1909 tplg->pos += pcm->size + _pcm->priv.size;
1910
1911 if (!abi_match)
1912 kfree(_pcm); /* free the duplicated one */
1706 } 1913 }
1707 1914
1708 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count); 1915 dev_dbg(tplg->dev, "ASoC: adding %d PCM DAIs\n", count);
1709 tplg->pos += sizeof(struct snd_soc_tplg_pcm) * count;
1710 1916
1711 return 0; 1917 return 0;
1712} 1918}
1713 1919
1714/* * 1920/**
1715 * soc_tplg_be_dai_config - Find and configure an existing BE DAI. 1921 * set_link_hw_format - Set the HW audio format of the physical DAI link.
1922 * @tplg: topology context
1923 * @cfg: physical link configs.
1924 *
1925 * Topology context contains a list of supported HW formats (configs) and
1926 * a default format ID for the physical link. This function will use this
1927 * default ID to choose the HW format to set the link's DAI format for init.
1928 */
1929static void set_link_hw_format(struct snd_soc_dai_link *link,
1930 struct snd_soc_tplg_link_config *cfg)
1931{
1932 struct snd_soc_tplg_hw_config *hw_config;
1933 unsigned char bclk_master, fsync_master;
1934 unsigned char invert_bclk, invert_fsync;
1935 int i;
1936
1937 for (i = 0; i < cfg->num_hw_configs; i++) {
1938 hw_config = &cfg->hw_config[i];
1939 if (hw_config->id != cfg->default_hw_config_id)
1940 continue;
1941
1942 link->dai_fmt = hw_config->fmt & SND_SOC_DAIFMT_FORMAT_MASK;
1943
1944 /* clock signal polarity */
1945 invert_bclk = hw_config->invert_bclk;
1946 invert_fsync = hw_config->invert_fsync;
1947 if (!invert_bclk && !invert_fsync)
1948 link->dai_fmt |= SND_SOC_DAIFMT_NB_NF;
1949 else if (!invert_bclk && invert_fsync)
1950 link->dai_fmt |= SND_SOC_DAIFMT_NB_IF;
1951 else if (invert_bclk && !invert_fsync)
1952 link->dai_fmt |= SND_SOC_DAIFMT_IB_NF;
1953 else
1954 link->dai_fmt |= SND_SOC_DAIFMT_IB_IF;
1955
1956 /* clock masters */
1957 bclk_master = hw_config->bclk_master;
1958 fsync_master = hw_config->fsync_master;
1959 if (!bclk_master && !fsync_master)
1960 link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFM;
1961 else if (bclk_master && !fsync_master)
1962 link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFM;
1963 else if (!bclk_master && fsync_master)
1964 link->dai_fmt |= SND_SOC_DAIFMT_CBM_CFS;
1965 else
1966 link->dai_fmt |= SND_SOC_DAIFMT_CBS_CFS;
1967 }
1968}
1969
1970/**
1971 * link_new_ver - Create a new physical link config from the old
1972 * version of source.
1973 * @toplogy: topology context
1974 * @src: old version of phyical link config as a source
1975 * @link: latest version of physical link config created from the source
1976 *
1977 * Support from vesion 4. User need free the returned link config manually.
1978 */
1979static int link_new_ver(struct soc_tplg *tplg,
1980 struct snd_soc_tplg_link_config *src,
1981 struct snd_soc_tplg_link_config **link)
1982{
1983 struct snd_soc_tplg_link_config *dest;
1984 struct snd_soc_tplg_link_config_v4 *src_v4;
1985 int i;
1986
1987 *link = NULL;
1988
1989 if (src->size != sizeof(struct snd_soc_tplg_link_config_v4)) {
1990 dev_err(tplg->dev, "ASoC: invalid physical link config size\n");
1991 return -EINVAL;
1992 }
1993
1994 dev_warn(tplg->dev, "ASoC: old version of physical link config\n");
1995
1996 src_v4 = (struct snd_soc_tplg_link_config_v4 *)src;
1997 dest = kzalloc(sizeof(*dest), GFP_KERNEL);
1998 if (!dest)
1999 return -ENOMEM;
2000
2001 dest->size = sizeof(*dest);
2002 dest->id = src_v4->id;
2003 dest->num_streams = src_v4->num_streams;
2004 for (i = 0; i < dest->num_streams; i++)
2005 memcpy(&dest->stream[i], &src_v4->stream[i],
2006 sizeof(struct snd_soc_tplg_stream));
2007
2008 *link = dest;
2009 return 0;
2010}
2011
2012/* Find and configure an existing physical DAI link */
2013static int soc_tplg_link_config(struct soc_tplg *tplg,
2014 struct snd_soc_tplg_link_config *cfg)
2015{
2016 struct snd_soc_dai_link *link;
2017 const char *name, *stream_name;
2018 size_t len;
2019 int ret;
2020
2021 len = strnlen(cfg->name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
2022 if (len == SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
2023 return -EINVAL;
2024 else if (len)
2025 name = cfg->name;
2026 else
2027 name = NULL;
2028
2029 len = strnlen(cfg->stream_name, SNDRV_CTL_ELEM_ID_NAME_MAXLEN);
2030 if (len == SNDRV_CTL_ELEM_ID_NAME_MAXLEN)
2031 return -EINVAL;
2032 else if (len)
2033 stream_name = cfg->stream_name;
2034 else
2035 stream_name = NULL;
2036
2037 link = snd_soc_find_dai_link(tplg->comp->card, cfg->id,
2038 name, stream_name);
2039 if (!link) {
2040 dev_err(tplg->dev, "ASoC: physical link %s (id %d) not exist\n",
2041 name, cfg->id);
2042 return -EINVAL;
2043 }
2044
2045 /* hw format */
2046 if (cfg->num_hw_configs)
2047 set_link_hw_format(link, cfg);
2048
2049 /* flags */
2050 if (cfg->flag_mask)
2051 set_link_flags(link, cfg->flag_mask, cfg->flags);
2052
2053 /* pass control to component driver for optional further init */
2054 ret = soc_tplg_dai_link_load(tplg, link);
2055 if (ret < 0) {
2056 dev_err(tplg->dev, "ASoC: physical link loading failed\n");
2057 return ret;
2058 }
2059
2060 return 0;
2061}
2062
2063
2064/* Load physical link config elements from the topology context */
2065static int soc_tplg_link_elems_load(struct soc_tplg *tplg,
2066 struct snd_soc_tplg_hdr *hdr)
2067{
2068 struct snd_soc_tplg_link_config *link, *_link;
2069 int count = hdr->count;
2070 int i, ret;
2071 bool abi_match;
2072
2073 if (tplg->pass != SOC_TPLG_PASS_LINK) {
2074 tplg->pos += hdr->size + hdr->payload_size;
2075 return 0;
2076 };
2077
2078 /* check the element size and count */
2079 link = (struct snd_soc_tplg_link_config *)tplg->pos;
2080 if (link->size > sizeof(struct snd_soc_tplg_link_config)
2081 || link->size < sizeof(struct snd_soc_tplg_link_config_v4)) {
2082 dev_err(tplg->dev, "ASoC: invalid size %d for physical link elems\n",
2083 link->size);
2084 return -EINVAL;
2085 }
2086
2087 if (soc_tplg_check_elem_count(tplg,
2088 link->size, count,
2089 hdr->payload_size, "physical link config")) {
2090 dev_err(tplg->dev, "ASoC: invalid count %d for physical link elems\n",
2091 count);
2092 return -EINVAL;
2093 }
2094
2095 /* config physical DAI links */
2096 for (i = 0; i < count; i++) {
2097 link = (struct snd_soc_tplg_link_config *)tplg->pos;
2098 if (link->size == sizeof(*link)) {
2099 abi_match = true;
2100 _link = link;
2101 } else {
2102 abi_match = false;
2103 ret = link_new_ver(tplg, link, &_link);
2104 if (ret < 0)
2105 return ret;
2106 }
2107
2108 ret = soc_tplg_link_config(tplg, _link);
2109 if (ret < 0)
2110 return ret;
2111
2112 /* offset by version-specific struct size and
2113 * real priv data size
2114 */
2115 tplg->pos += link->size + _link->priv.size;
2116
2117 if (!abi_match)
2118 kfree(_link); /* free the duplicated one */
2119 }
2120
2121 return 0;
2122}
2123
2124/**
2125 * soc_tplg_dai_config - Find and configure an existing physical DAI.
1716 * @tplg: topology context 2126 * @tplg: topology context
1717 * @be: topology BE DAI configs. 2127 * @d: physical DAI configs.
1718 * 2128 *
1719 * The BE dai should already be registered by the platform driver. The 2129 * The physical dai should already be registered by the platform driver.
1720 * platform driver should specify the BE DAI name and ID for matching. 2130 * The platform driver should specify the DAI name and ID for matching.
1721 */ 2131 */
1722static int soc_tplg_be_dai_config(struct soc_tplg *tplg, 2132static int soc_tplg_dai_config(struct soc_tplg *tplg,
1723 struct snd_soc_tplg_be_dai *be) 2133 struct snd_soc_tplg_dai *d)
1724{ 2134{
1725 struct snd_soc_dai_link_component dai_component = {0}; 2135 struct snd_soc_dai_link_component dai_component = {0};
1726 struct snd_soc_dai *dai; 2136 struct snd_soc_dai *dai;
@@ -1729,17 +2139,17 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
1729 struct snd_soc_tplg_stream_caps *caps; 2139 struct snd_soc_tplg_stream_caps *caps;
1730 int ret; 2140 int ret;
1731 2141
1732 dai_component.dai_name = be->dai_name; 2142 dai_component.dai_name = d->dai_name;
1733 dai = snd_soc_find_dai(&dai_component); 2143 dai = snd_soc_find_dai(&dai_component);
1734 if (!dai) { 2144 if (!dai) {
1735 dev_err(tplg->dev, "ASoC: BE DAI %s not registered\n", 2145 dev_err(tplg->dev, "ASoC: physical DAI %s not registered\n",
1736 be->dai_name); 2146 d->dai_name);
1737 return -EINVAL; 2147 return -EINVAL;
1738 } 2148 }
1739 2149
1740 if (be->dai_id != dai->id) { 2150 if (d->dai_id != dai->id) {
1741 dev_err(tplg->dev, "ASoC: BE DAI %s id mismatch\n", 2151 dev_err(tplg->dev, "ASoC: physical DAI %s id mismatch\n",
1742 be->dai_name); 2152 d->dai_name);
1743 return -EINVAL; 2153 return -EINVAL;
1744 } 2154 }
1745 2155
@@ -1747,20 +2157,20 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
1747 if (!dai_drv) 2157 if (!dai_drv)
1748 return -EINVAL; 2158 return -EINVAL;
1749 2159
1750 if (be->playback) { 2160 if (d->playback) {
1751 stream = &dai_drv->playback; 2161 stream = &dai_drv->playback;
1752 caps = &be->caps[SND_SOC_TPLG_STREAM_PLAYBACK]; 2162 caps = &d->caps[SND_SOC_TPLG_STREAM_PLAYBACK];
1753 set_stream_info(stream, caps); 2163 set_stream_info(stream, caps);
1754 } 2164 }
1755 2165
1756 if (be->capture) { 2166 if (d->capture) {
1757 stream = &dai_drv->capture; 2167 stream = &dai_drv->capture;
1758 caps = &be->caps[SND_SOC_TPLG_STREAM_CAPTURE]; 2168 caps = &d->caps[SND_SOC_TPLG_STREAM_CAPTURE];
1759 set_stream_info(stream, caps); 2169 set_stream_info(stream, caps);
1760 } 2170 }
1761 2171
1762 if (be->flag_mask) 2172 if (d->flag_mask)
1763 set_dai_flags(dai_drv, be->flag_mask, be->flags); 2173 set_dai_flags(dai_drv, d->flag_mask, d->flags);
1764 2174
1765 /* pass control to component driver for optional further init */ 2175 /* pass control to component driver for optional further init */
1766 ret = soc_tplg_dai_load(tplg, dai_drv); 2176 ret = soc_tplg_dai_load(tplg, dai_drv);
@@ -1772,10 +2182,11 @@ static int soc_tplg_be_dai_config(struct soc_tplg *tplg,
1772 return 0; 2182 return 0;
1773} 2183}
1774 2184
1775static int soc_tplg_be_dai_elems_load(struct soc_tplg *tplg, 2185/* load physical DAI elements */
1776 struct snd_soc_tplg_hdr *hdr) 2186static int soc_tplg_dai_elems_load(struct soc_tplg *tplg,
2187 struct snd_soc_tplg_hdr *hdr)
1777{ 2188{
1778 struct snd_soc_tplg_be_dai *be; 2189 struct snd_soc_tplg_dai *dai;
1779 int count = hdr->count; 2190 int count = hdr->count;
1780 int i; 2191 int i;
1781 2192
@@ -1784,41 +2195,95 @@ static int soc_tplg_be_dai_elems_load(struct soc_tplg *tplg,
1784 2195
1785 /* config the existing BE DAIs */ 2196 /* config the existing BE DAIs */
1786 for (i = 0; i < count; i++) { 2197 for (i = 0; i < count; i++) {
1787 be = (struct snd_soc_tplg_be_dai *)tplg->pos; 2198 dai = (struct snd_soc_tplg_dai *)tplg->pos;
1788 if (be->size != sizeof(*be)) { 2199 if (dai->size != sizeof(*dai)) {
1789 dev_err(tplg->dev, "ASoC: invalid BE DAI size\n"); 2200 dev_err(tplg->dev, "ASoC: invalid physical DAI size\n");
1790 return -EINVAL; 2201 return -EINVAL;
1791 } 2202 }
1792 2203
1793 soc_tplg_be_dai_config(tplg, be); 2204 soc_tplg_dai_config(tplg, dai);
1794 tplg->pos += (sizeof(*be) + be->priv.size); 2205 tplg->pos += (sizeof(*dai) + dai->priv.size);
1795 } 2206 }
1796 2207
1797 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count); 2208 dev_dbg(tplg->dev, "ASoC: Configure %d BE DAIs\n", count);
1798 return 0; 2209 return 0;
1799} 2210}
1800 2211
2212/**
2213 * manifest_new_ver - Create a new version of manifest from the old version
2214 * of source.
2215 * @toplogy: topology context
2216 * @src: old version of manifest as a source
2217 * @manifest: latest version of manifest created from the source
2218 *
2219 * Support from vesion 4. Users need free the returned manifest manually.
2220 */
2221static int manifest_new_ver(struct soc_tplg *tplg,
2222 struct snd_soc_tplg_manifest *src,
2223 struct snd_soc_tplg_manifest **manifest)
2224{
2225 struct snd_soc_tplg_manifest *dest;
2226 struct snd_soc_tplg_manifest_v4 *src_v4;
2227
2228 *manifest = NULL;
2229
2230 if (src->size != sizeof(*src_v4)) {
2231 dev_err(tplg->dev, "ASoC: invalid manifest size\n");
2232 return -EINVAL;
2233 }
2234
2235 dev_warn(tplg->dev, "ASoC: old version of manifest\n");
2236
2237 src_v4 = (struct snd_soc_tplg_manifest_v4 *)src;
2238 dest = kzalloc(sizeof(*dest) + src_v4->priv.size, GFP_KERNEL);
2239 if (!dest)
2240 return -ENOMEM;
2241
2242 dest->size = sizeof(*dest); /* size of latest abi version */
2243 dest->control_elems = src_v4->control_elems;
2244 dest->widget_elems = src_v4->widget_elems;
2245 dest->graph_elems = src_v4->graph_elems;
2246 dest->pcm_elems = src_v4->pcm_elems;
2247 dest->dai_link_elems = src_v4->dai_link_elems;
2248 dest->priv.size = src_v4->priv.size;
2249 if (dest->priv.size)
2250 memcpy(dest->priv.data, src_v4->priv.data,
2251 src_v4->priv.size);
2252
2253 *manifest = dest;
2254 return 0;
2255}
1801 2256
1802static int soc_tplg_manifest_load(struct soc_tplg *tplg, 2257static int soc_tplg_manifest_load(struct soc_tplg *tplg,
1803 struct snd_soc_tplg_hdr *hdr) 2258 struct snd_soc_tplg_hdr *hdr)
1804{ 2259{
1805 struct snd_soc_tplg_manifest *manifest; 2260 struct snd_soc_tplg_manifest *manifest, *_manifest;
2261 bool abi_match;
2262 int err;
1806 2263
1807 if (tplg->pass != SOC_TPLG_PASS_MANIFEST) 2264 if (tplg->pass != SOC_TPLG_PASS_MANIFEST)
1808 return 0; 2265 return 0;
1809 2266
1810 manifest = (struct snd_soc_tplg_manifest *)tplg->pos; 2267 manifest = (struct snd_soc_tplg_manifest *)tplg->pos;
1811 if (manifest->size != sizeof(*manifest)) {
1812 dev_err(tplg->dev, "ASoC: invalid manifest size\n");
1813 return -EINVAL;
1814 }
1815 2268
1816 tplg->pos += sizeof(struct snd_soc_tplg_manifest); 2269 /* check ABI version by size, create a new manifest if abi not match */
2270 if (manifest->size == sizeof(*manifest)) {
2271 abi_match = true;
2272 _manifest = manifest;
2273 } else {
2274 abi_match = false;
2275 err = manifest_new_ver(tplg, manifest, &_manifest);
2276 if (err < 0)
2277 return err;
2278 }
1817 2279
2280 /* pass control to component driver for optional further init */
1818 if (tplg->comp && tplg->ops && tplg->ops->manifest) 2281 if (tplg->comp && tplg->ops && tplg->ops->manifest)
1819 return tplg->ops->manifest(tplg->comp, manifest); 2282 return tplg->ops->manifest(tplg->comp, _manifest);
2283
2284 if (!abi_match) /* free the duplicated one */
2285 kfree(_manifest);
1820 2286
1821 dev_err(tplg->dev, "ASoC: Firmware manifest not supported\n");
1822 return 0; 2287 return 0;
1823} 2288}
1824 2289
@@ -1854,7 +2319,9 @@ static int soc_valid_header(struct soc_tplg *tplg,
1854 return -EINVAL; 2319 return -EINVAL;
1855 } 2320 }
1856 2321
1857 if (hdr->abi != SND_SOC_TPLG_ABI_VERSION) { 2322 /* Support ABI from version 4 */
2323 if (hdr->abi > SND_SOC_TPLG_ABI_VERSION
2324 || hdr->abi < SND_SOC_TPLG_ABI_VERSION_MIN) {
1858 dev_err(tplg->dev, 2325 dev_err(tplg->dev,
1859 "ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n", 2326 "ASoC: pass %d invalid ABI version got 0x%x need 0x%x at offset 0x%lx size 0x%zx.\n",
1860 tplg->pass, hdr->abi, 2327 tplg->pass, hdr->abi,
@@ -1902,8 +2369,12 @@ static int soc_tplg_load_header(struct soc_tplg *tplg,
1902 return soc_tplg_dapm_widget_elems_load(tplg, hdr); 2369 return soc_tplg_dapm_widget_elems_load(tplg, hdr);
1903 case SND_SOC_TPLG_TYPE_PCM: 2370 case SND_SOC_TPLG_TYPE_PCM:
1904 return soc_tplg_pcm_elems_load(tplg, hdr); 2371 return soc_tplg_pcm_elems_load(tplg, hdr);
1905 case SND_SOC_TPLG_TYPE_BE_DAI: 2372 case SND_SOC_TPLG_TYPE_DAI:
1906 return soc_tplg_be_dai_elems_load(tplg, hdr); 2373 return soc_tplg_dai_elems_load(tplg, hdr);
2374 case SND_SOC_TPLG_TYPE_DAI_LINK:
2375 case SND_SOC_TPLG_TYPE_BACKEND_LINK:
2376 /* physical link configurations */
2377 return soc_tplg_link_elems_load(tplg, hdr);
1907 case SND_SOC_TPLG_TYPE_MANIFEST: 2378 case SND_SOC_TPLG_TYPE_MANIFEST:
1908 return soc_tplg_manifest_load(tplg, hdr); 2379 return soc_tplg_manifest_load(tplg, hdr);
1909 default: 2380 default:
diff --git a/sound/soc/soc-utils.c b/sound/soc/soc-utils.c
index 393e8f0fe2cc..644d9a9ebfbc 100644
--- a/sound/soc/soc-utils.c
+++ b/sound/soc/soc-utils.c
@@ -58,6 +58,205 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *params)
58} 58}
59EXPORT_SYMBOL_GPL(snd_soc_params_to_bclk); 59EXPORT_SYMBOL_GPL(snd_soc_params_to_bclk);
60 60
61int snd_soc_component_enable_pin(struct snd_soc_component *component,
62 const char *pin)
63{
64 struct snd_soc_dapm_context *dapm =
65 snd_soc_component_get_dapm(component);
66 char *full_name;
67 int ret;
68
69 if (!component->name_prefix)
70 return snd_soc_dapm_enable_pin(dapm, pin);
71
72 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
73 if (!full_name)
74 return -ENOMEM;
75
76 ret = snd_soc_dapm_enable_pin(dapm, full_name);
77 kfree(full_name);
78
79 return ret;
80}
81EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin);
82
83int snd_soc_component_enable_pin_unlocked(struct snd_soc_component *component,
84 const char *pin)
85{
86 struct snd_soc_dapm_context *dapm =
87 snd_soc_component_get_dapm(component);
88 char *full_name;
89 int ret;
90
91 if (!component->name_prefix)
92 return snd_soc_dapm_enable_pin_unlocked(dapm, pin);
93
94 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
95 if (!full_name)
96 return -ENOMEM;
97
98 ret = snd_soc_dapm_enable_pin_unlocked(dapm, full_name);
99 kfree(full_name);
100
101 return ret;
102}
103EXPORT_SYMBOL_GPL(snd_soc_component_enable_pin_unlocked);
104
105int snd_soc_component_disable_pin(struct snd_soc_component *component,
106 const char *pin)
107{
108 struct snd_soc_dapm_context *dapm =
109 snd_soc_component_get_dapm(component);
110 char *full_name;
111 int ret;
112
113 if (!component->name_prefix)
114 return snd_soc_dapm_disable_pin(dapm, pin);
115
116 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
117 if (!full_name)
118 return -ENOMEM;
119
120 ret = snd_soc_dapm_disable_pin(dapm, full_name);
121 kfree(full_name);
122
123 return ret;
124}
125EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin);
126
127int snd_soc_component_disable_pin_unlocked(struct snd_soc_component *component,
128 const char *pin)
129{
130 struct snd_soc_dapm_context *dapm =
131 snd_soc_component_get_dapm(component);
132 char *full_name;
133 int ret;
134
135 if (!component->name_prefix)
136 return snd_soc_dapm_disable_pin_unlocked(dapm, pin);
137
138 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
139 if (!full_name)
140 return -ENOMEM;
141
142 ret = snd_soc_dapm_disable_pin_unlocked(dapm, full_name);
143 kfree(full_name);
144
145 return ret;
146}
147EXPORT_SYMBOL_GPL(snd_soc_component_disable_pin_unlocked);
148
149int snd_soc_component_nc_pin(struct snd_soc_component *component,
150 const char *pin)
151{
152 struct snd_soc_dapm_context *dapm =
153 snd_soc_component_get_dapm(component);
154 char *full_name;
155 int ret;
156
157 if (!component->name_prefix)
158 return snd_soc_dapm_nc_pin(dapm, pin);
159
160 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
161 if (!full_name)
162 return -ENOMEM;
163
164 ret = snd_soc_dapm_nc_pin(dapm, full_name);
165 kfree(full_name);
166
167 return ret;
168}
169EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin);
170
171int snd_soc_component_nc_pin_unlocked(struct snd_soc_component *component,
172 const char *pin)
173{
174 struct snd_soc_dapm_context *dapm =
175 snd_soc_component_get_dapm(component);
176 char *full_name;
177 int ret;
178
179 if (!component->name_prefix)
180 return snd_soc_dapm_nc_pin_unlocked(dapm, pin);
181
182 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
183 if (!full_name)
184 return -ENOMEM;
185
186 ret = snd_soc_dapm_nc_pin_unlocked(dapm, full_name);
187 kfree(full_name);
188
189 return ret;
190}
191EXPORT_SYMBOL_GPL(snd_soc_component_nc_pin_unlocked);
192
193int snd_soc_component_get_pin_status(struct snd_soc_component *component,
194 const char *pin)
195{
196 struct snd_soc_dapm_context *dapm =
197 snd_soc_component_get_dapm(component);
198 char *full_name;
199 int ret;
200
201 if (!component->name_prefix)
202 return snd_soc_dapm_get_pin_status(dapm, pin);
203
204 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
205 if (!full_name)
206 return -ENOMEM;
207
208 ret = snd_soc_dapm_get_pin_status(dapm, full_name);
209 kfree(full_name);
210
211 return ret;
212}
213EXPORT_SYMBOL_GPL(snd_soc_component_get_pin_status);
214
215int snd_soc_component_force_enable_pin(struct snd_soc_component *component,
216 const char *pin)
217{
218 struct snd_soc_dapm_context *dapm =
219 snd_soc_component_get_dapm(component);
220 char *full_name;
221 int ret;
222
223 if (!component->name_prefix)
224 return snd_soc_dapm_force_enable_pin(dapm, pin);
225
226 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
227 if (!full_name)
228 return -ENOMEM;
229
230 ret = snd_soc_dapm_force_enable_pin(dapm, full_name);
231 kfree(full_name);
232
233 return ret;
234}
235EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin);
236
237int snd_soc_component_force_enable_pin_unlocked(
238 struct snd_soc_component *component,
239 const char *pin)
240{
241 struct snd_soc_dapm_context *dapm =
242 snd_soc_component_get_dapm(component);
243 char *full_name;
244 int ret;
245
246 if (!component->name_prefix)
247 return snd_soc_dapm_force_enable_pin_unlocked(dapm, pin);
248
249 full_name = kasprintf(GFP_KERNEL, "%s %s", component->name_prefix, pin);
250 if (!full_name)
251 return -ENOMEM;
252
253 ret = snd_soc_dapm_force_enable_pin_unlocked(dapm, full_name);
254 kfree(full_name);
255
256 return ret;
257}
258EXPORT_SYMBOL_GPL(snd_soc_component_force_enable_pin_unlocked);
259
61static const struct snd_pcm_hardware dummy_dma_hardware = { 260static const struct snd_pcm_hardware dummy_dma_hardware = {
62 /* Random values to keep userspace happy when checking constraints */ 261 /* Random values to keep userspace happy when checking constraints */
63 .info = SNDRV_PCM_INFO_INTERLEAVED | 262 .info = SNDRV_PCM_INFO_INTERLEAVED |
diff --git a/sound/soc/sti/sti_uniperif.c b/sound/soc/sti/sti_uniperif.c
index 549fac349fa0..98eb205a0b62 100644
--- a/sound/soc/sti/sti_uniperif.c
+++ b/sound/soc/sti/sti_uniperif.c
@@ -7,6 +7,7 @@
7 7
8#include <linux/module.h> 8#include <linux/module.h>
9#include <linux/pinctrl/consumer.h> 9#include <linux/pinctrl/consumer.h>
10#include <linux/delay.h>
10 11
11#include "uniperif.h" 12#include "uniperif.h"
12 13
@@ -97,6 +98,28 @@ static const struct of_device_id snd_soc_sti_match[] = {
97 {}, 98 {},
98}; 99};
99 100
101int sti_uniperiph_reset(struct uniperif *uni)
102{
103 int count = 10;
104
105 /* Reset uniperipheral uni */
106 SET_UNIPERIF_SOFT_RST_SOFT_RST(uni);
107
108 if (uni->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) {
109 while (GET_UNIPERIF_SOFT_RST_SOFT_RST(uni) && count) {
110 udelay(5);
111 count--;
112 }
113 }
114
115 if (!count) {
116 dev_err(uni->dev, "Failed to reset uniperif\n");
117 return -EIO;
118 }
119
120 return 0;
121}
122
100int sti_uniperiph_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 123int sti_uniperiph_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
101 unsigned int rx_mask, int slots, 124 unsigned int rx_mask, int slots,
102 int slot_width) 125 int slot_width)
@@ -293,7 +316,7 @@ static int sti_uniperiph_dai_suspend(struct snd_soc_dai *dai)
293 316
294 /* The uniperipheral should be in stopped state */ 317 /* The uniperipheral should be in stopped state */
295 if (uni->state != UNIPERIF_STATE_STOPPED) { 318 if (uni->state != UNIPERIF_STATE_STOPPED) {
296 dev_err(uni->dev, "%s: invalid uni state( %d)", 319 dev_err(uni->dev, "%s: invalid uni state( %d)\n",
297 __func__, (int)uni->state); 320 __func__, (int)uni->state);
298 return -EBUSY; 321 return -EBUSY;
299 } 322 }
@@ -301,7 +324,7 @@ static int sti_uniperiph_dai_suspend(struct snd_soc_dai *dai)
301 /* Pinctrl: switch pinstate to sleep */ 324 /* Pinctrl: switch pinstate to sleep */
302 ret = pinctrl_pm_select_sleep_state(uni->dev); 325 ret = pinctrl_pm_select_sleep_state(uni->dev);
303 if (ret) 326 if (ret)
304 dev_err(uni->dev, "%s: failed to select pinctrl state", 327 dev_err(uni->dev, "%s: failed to select pinctrl state\n",
305 __func__); 328 __func__);
306 329
307 return ret; 330 return ret;
@@ -322,7 +345,7 @@ static int sti_uniperiph_dai_resume(struct snd_soc_dai *dai)
322 /* pinctrl: switch pinstate to default */ 345 /* pinctrl: switch pinstate to default */
323 ret = pinctrl_pm_select_default_state(uni->dev); 346 ret = pinctrl_pm_select_default_state(uni->dev);
324 if (ret) 347 if (ret)
325 dev_err(uni->dev, "%s: failed to select pinctrl state", 348 dev_err(uni->dev, "%s: failed to select pinctrl state\n",
326 __func__); 349 __func__);
327 350
328 return ret; 351 return ret;
@@ -366,11 +389,12 @@ static int sti_uniperiph_cpu_dai_of(struct device_node *node,
366 const struct of_device_id *of_id; 389 const struct of_device_id *of_id;
367 const struct sti_uniperiph_dev_data *dev_data; 390 const struct sti_uniperiph_dev_data *dev_data;
368 const char *mode; 391 const char *mode;
392 int ret;
369 393
370 /* Populate data structure depending on compatibility */ 394 /* Populate data structure depending on compatibility */
371 of_id = of_match_node(snd_soc_sti_match, node); 395 of_id = of_match_node(snd_soc_sti_match, node);
372 if (!of_id->data) { 396 if (!of_id->data) {
373 dev_err(dev, "data associated to device is missing"); 397 dev_err(dev, "data associated to device is missing\n");
374 return -EINVAL; 398 return -EINVAL;
375 } 399 }
376 dev_data = (struct sti_uniperiph_dev_data *)of_id->data; 400 dev_data = (struct sti_uniperiph_dev_data *)of_id->data;
@@ -389,7 +413,7 @@ static int sti_uniperiph_cpu_dai_of(struct device_node *node,
389 uni->mem_region = platform_get_resource(priv->pdev, IORESOURCE_MEM, 0); 413 uni->mem_region = platform_get_resource(priv->pdev, IORESOURCE_MEM, 0);
390 414
391 if (!uni->mem_region) { 415 if (!uni->mem_region) {
392 dev_err(dev, "Failed to get memory resource"); 416 dev_err(dev, "Failed to get memory resource\n");
393 return -ENODEV; 417 return -ENODEV;
394 } 418 }
395 419
@@ -403,7 +427,7 @@ static int sti_uniperiph_cpu_dai_of(struct device_node *node,
403 427
404 uni->irq = platform_get_irq(priv->pdev, 0); 428 uni->irq = platform_get_irq(priv->pdev, 0);
405 if (uni->irq < 0) { 429 if (uni->irq < 0) {
406 dev_err(dev, "Failed to get IRQ resource"); 430 dev_err(dev, "Failed to get IRQ resource\n");
407 return -ENXIO; 431 return -ENXIO;
408 } 432 }
409 433
@@ -421,12 +445,15 @@ static int sti_uniperiph_cpu_dai_of(struct device_node *node,
421 dai_data->stream = dev_data->stream; 445 dai_data->stream = dev_data->stream;
422 446
423 if (priv->dai_data.stream == SNDRV_PCM_STREAM_PLAYBACK) { 447 if (priv->dai_data.stream == SNDRV_PCM_STREAM_PLAYBACK) {
424 uni_player_init(priv->pdev, uni); 448 ret = uni_player_init(priv->pdev, uni);
425 stream = &dai->playback; 449 stream = &dai->playback;
426 } else { 450 } else {
427 uni_reader_init(priv->pdev, uni); 451 ret = uni_reader_init(priv->pdev, uni);
428 stream = &dai->capture; 452 stream = &dai->capture;
429 } 453 }
454 if (ret < 0)
455 return ret;
456
430 dai->ops = uni->dai_ops; 457 dai->ops = uni->dai_ops;
431 458
432 stream->stream_name = dai->name; 459 stream->stream_name = dai->name;
diff --git a/sound/soc/sti/uniperif.h b/sound/soc/sti/uniperif.h
index 1993c655fb79..d487dd2ef016 100644
--- a/sound/soc/sti/uniperif.h
+++ b/sound/soc/sti/uniperif.h
@@ -1397,6 +1397,8 @@ static inline int sti_uniperiph_get_unip_tdm_frame_size(struct uniperif *uni)
1397 return (uni->tdm_slot.slots * uni->tdm_slot.slot_width / 8); 1397 return (uni->tdm_slot.slots * uni->tdm_slot.slot_width / 8);
1398} 1398}
1399 1399
1400int sti_uniperiph_reset(struct uniperif *uni);
1401
1400int sti_uniperiph_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask, 1402int sti_uniperiph_set_tdm_slot(struct snd_soc_dai *dai, unsigned int tx_mask,
1401 unsigned int rx_mask, int slots, 1403 unsigned int rx_mask, int slots,
1402 int slot_width); 1404 int slot_width);
diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c
index ad54d4cf58ad..60ae31a303ab 100644
--- a/sound/soc/sti/uniperif_player.c
+++ b/sound/soc/sti/uniperif_player.c
@@ -6,8 +6,6 @@
6 */ 6 */
7 7
8#include <linux/clk.h> 8#include <linux/clk.h>
9#include <linux/delay.h>
10#include <linux/io.h>
11#include <linux/mfd/syscon.h> 9#include <linux/mfd/syscon.h>
12 10
13#include <sound/asoundef.h> 11#include <sound/asoundef.h>
@@ -55,25 +53,6 @@ static const struct snd_pcm_hardware uni_player_pcm_hw = {
55 .buffer_bytes_max = 256 * PAGE_SIZE 53 .buffer_bytes_max = 256 * PAGE_SIZE
56}; 54};
57 55
58static inline int reset_player(struct uniperif *player)
59{
60 int count = 10;
61
62 if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0) {
63 while (GET_UNIPERIF_SOFT_RST_SOFT_RST(player) && count) {
64 udelay(5);
65 count--;
66 }
67 }
68
69 if (!count) {
70 dev_err(player->dev, "Failed to reset uniperif");
71 return -EIO;
72 }
73
74 return 0;
75}
76
77/* 56/*
78 * uni_player_irq_handler 57 * uni_player_irq_handler
79 * In case of error audio stream is stopped; stop action is protected via PCM 58 * In case of error audio stream is stopped; stop action is protected via PCM
@@ -97,7 +76,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
97 76
98 /* Check for fifo error (underrun) */ 77 /* Check for fifo error (underrun) */
99 if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(player))) { 78 if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(player))) {
100 dev_err(player->dev, "FIFO underflow error detected"); 79 dev_err(player->dev, "FIFO underflow error detected\n");
101 80
102 /* Interrupt is just for information when underflow recovery */ 81 /* Interrupt is just for information when underflow recovery */
103 if (player->underflow_enabled) { 82 if (player->underflow_enabled) {
@@ -119,7 +98,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
119 98
120 /* Check for dma error (overrun) */ 99 /* Check for dma error (overrun) */
121 if (unlikely(status & UNIPERIF_ITS_DMA_ERROR_MASK(player))) { 100 if (unlikely(status & UNIPERIF_ITS_DMA_ERROR_MASK(player))) {
122 dev_err(player->dev, "DMA error detected"); 101 dev_err(player->dev, "DMA error detected\n");
123 102
124 /* Disable interrupt so doesn't continually fire */ 103 /* Disable interrupt so doesn't continually fire */
125 SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player); 104 SET_UNIPERIF_ITM_BCLR_DMA_ERROR(player);
@@ -135,11 +114,14 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
135 /* Check for underflow recovery done */ 114 /* Check for underflow recovery done */
136 if (unlikely(status & UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(player))) { 115 if (unlikely(status & UNIPERIF_ITM_UNDERFLOW_REC_DONE_MASK(player))) {
137 if (!player->underflow_enabled) { 116 if (!player->underflow_enabled) {
138 dev_err(player->dev, "unexpected Underflow recovering"); 117 dev_err(player->dev,
118 "unexpected Underflow recovering\n");
139 return -EPERM; 119 return -EPERM;
140 } 120 }
141 /* Read the underflow recovery duration */ 121 /* Read the underflow recovery duration */
142 tmp = GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(player); 122 tmp = GET_UNIPERIF_STATUS_1_UNDERFLOW_DURATION(player);
123 dev_dbg(player->dev, "Underflow recovered (%d LR clocks max)\n",
124 tmp);
143 125
144 /* Clear the underflow recovery duration */ 126 /* Clear the underflow recovery duration */
145 SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(player); 127 SET_UNIPERIF_BIT_CONTROL_CLR_UNDERFLOW_DURATION(player);
@@ -153,7 +135,7 @@ static irqreturn_t uni_player_irq_handler(int irq, void *dev_id)
153 /* Check if underflow recovery failed */ 135 /* Check if underflow recovery failed */
154 if (unlikely(status & 136 if (unlikely(status &
155 UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(player))) { 137 UNIPERIF_ITM_UNDERFLOW_REC_FAILED_MASK(player))) {
156 dev_err(player->dev, "Underflow recovery failed"); 138 dev_err(player->dev, "Underflow recovery failed\n");
157 139
158 /* Stop the player */ 140 /* Stop the player */
159 snd_pcm_stream_lock(player->substream); 141 snd_pcm_stream_lock(player->substream);
@@ -336,7 +318,7 @@ static int uni_player_prepare_iec958(struct uniperif *player,
336 318
337 /* Oversampling must be multiple of 128 as iec958 frame is 32-bits */ 319 /* Oversampling must be multiple of 128 as iec958 frame is 32-bits */
338 if ((clk_div % 128) || (clk_div <= 0)) { 320 if ((clk_div % 128) || (clk_div <= 0)) {
339 dev_err(player->dev, "%s: invalid clk_div %d", 321 dev_err(player->dev, "%s: invalid clk_div %d\n",
340 __func__, clk_div); 322 __func__, clk_div);
341 return -EINVAL; 323 return -EINVAL;
342 } 324 }
@@ -359,7 +341,7 @@ static int uni_player_prepare_iec958(struct uniperif *player,
359 SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(player); 341 SET_UNIPERIF_I2S_FMT_DATA_SIZE_24(player);
360 break; 342 break;
361 default: 343 default:
362 dev_err(player->dev, "format not supported"); 344 dev_err(player->dev, "format not supported\n");
363 return -EINVAL; 345 return -EINVAL;
364 } 346 }
365 347
@@ -448,12 +430,12 @@ static int uni_player_prepare_pcm(struct uniperif *player,
448 * for 16 bits must be a multiple of 64 430 * for 16 bits must be a multiple of 64
449 */ 431 */
450 if ((slot_width == 32) && (clk_div % 128)) { 432 if ((slot_width == 32) && (clk_div % 128)) {
451 dev_err(player->dev, "%s: invalid clk_div", __func__); 433 dev_err(player->dev, "%s: invalid clk_div\n", __func__);
452 return -EINVAL; 434 return -EINVAL;
453 } 435 }
454 436
455 if ((slot_width == 16) && (clk_div % 64)) { 437 if ((slot_width == 16) && (clk_div % 64)) {
456 dev_err(player->dev, "%s: invalid clk_div", __func__); 438 dev_err(player->dev, "%s: invalid clk_div\n", __func__);
457 return -EINVAL; 439 return -EINVAL;
458 } 440 }
459 441
@@ -471,7 +453,7 @@ static int uni_player_prepare_pcm(struct uniperif *player,
471 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player); 453 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(player);
472 break; 454 break;
473 default: 455 default:
474 dev_err(player->dev, "subframe format not supported"); 456 dev_err(player->dev, "subframe format not supported\n");
475 return -EINVAL; 457 return -EINVAL;
476 } 458 }
477 459
@@ -491,7 +473,7 @@ static int uni_player_prepare_pcm(struct uniperif *player,
491 break; 473 break;
492 474
493 default: 475 default:
494 dev_err(player->dev, "format not supported"); 476 dev_err(player->dev, "format not supported\n");
495 return -EINVAL; 477 return -EINVAL;
496 } 478 }
497 479
@@ -504,7 +486,7 @@ static int uni_player_prepare_pcm(struct uniperif *player,
504 /* Number of channelsmust be even*/ 486 /* Number of channelsmust be even*/
505 if ((runtime->channels % 2) || (runtime->channels < 2) || 487 if ((runtime->channels % 2) || (runtime->channels < 2) ||
506 (runtime->channels > 10)) { 488 (runtime->channels > 10)) {
507 dev_err(player->dev, "%s: invalid nb of channels", __func__); 489 dev_err(player->dev, "%s: invalid nb of channels\n", __func__);
508 return -EINVAL; 490 return -EINVAL;
509 } 491 }
510 492
@@ -762,7 +744,7 @@ static int uni_player_prepare(struct snd_pcm_substream *substream,
762 744
763 /* The player should be stopped */ 745 /* The player should be stopped */
764 if (player->state != UNIPERIF_STATE_STOPPED) { 746 if (player->state != UNIPERIF_STATE_STOPPED) {
765 dev_err(player->dev, "%s: invalid player state %d", __func__, 747 dev_err(player->dev, "%s: invalid player state %d\n", __func__,
766 player->state); 748 player->state);
767 return -EINVAL; 749 return -EINVAL;
768 } 750 }
@@ -791,7 +773,8 @@ static int uni_player_prepare(struct snd_pcm_substream *substream,
791 /* Trigger limit must be an even number */ 773 /* Trigger limit must be an even number */
792 if ((!trigger_limit % 2) || (trigger_limit != 1 && transfer_size % 2) || 774 if ((!trigger_limit % 2) || (trigger_limit != 1 && transfer_size % 2) ||
793 (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(player))) { 775 (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(player))) {
794 dev_err(player->dev, "invalid trigger limit %d", trigger_limit); 776 dev_err(player->dev, "invalid trigger limit %d\n",
777 trigger_limit);
795 return -EINVAL; 778 return -EINVAL;
796 } 779 }
797 780
@@ -812,7 +795,7 @@ static int uni_player_prepare(struct snd_pcm_substream *substream,
812 ret = uni_player_prepare_tdm(player, runtime); 795 ret = uni_player_prepare_tdm(player, runtime);
813 break; 796 break;
814 default: 797 default:
815 dev_err(player->dev, "invalid player type"); 798 dev_err(player->dev, "invalid player type\n");
816 return -EINVAL; 799 return -EINVAL;
817 } 800 }
818 801
@@ -852,16 +835,14 @@ static int uni_player_prepare(struct snd_pcm_substream *substream,
852 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player); 835 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(player);
853 break; 836 break;
854 default: 837 default:
855 dev_err(player->dev, "format not supported"); 838 dev_err(player->dev, "format not supported\n");
856 return -EINVAL; 839 return -EINVAL;
857 } 840 }
858 841
859 SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(player, 0); 842 SET_UNIPERIF_I2S_FMT_NO_OF_SAMPLES_TO_READ(player, 0);
860 843
861 /* Reset uniperipheral player */
862 SET_UNIPERIF_SOFT_RST_SOFT_RST(player);
863 844
864 return reset_player(player); 845 return sti_uniperiph_reset(player);
865} 846}
866 847
867static int uni_player_start(struct uniperif *player) 848static int uni_player_start(struct uniperif *player)
@@ -870,13 +851,13 @@ static int uni_player_start(struct uniperif *player)
870 851
871 /* The player should be stopped */ 852 /* The player should be stopped */
872 if (player->state != UNIPERIF_STATE_STOPPED) { 853 if (player->state != UNIPERIF_STATE_STOPPED) {
873 dev_err(player->dev, "%s: invalid player state", __func__); 854 dev_err(player->dev, "%s: invalid player state\n", __func__);
874 return -EINVAL; 855 return -EINVAL;
875 } 856 }
876 857
877 ret = clk_prepare_enable(player->clk); 858 ret = clk_prepare_enable(player->clk);
878 if (ret) { 859 if (ret) {
879 dev_err(player->dev, "%s: Failed to enable clock", __func__); 860 dev_err(player->dev, "%s: Failed to enable clock\n", __func__);
880 return ret; 861 return ret;
881 } 862 }
882 863
@@ -893,10 +874,7 @@ static int uni_player_start(struct uniperif *player)
893 SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(player); 874 SET_UNIPERIF_ITM_BSET_UNDERFLOW_REC_FAILED(player);
894 } 875 }
895 876
896 /* Reset uniperipheral player */ 877 ret = sti_uniperiph_reset(player);
897 SET_UNIPERIF_SOFT_RST_SOFT_RST(player);
898
899 ret = reset_player(player);
900 if (ret < 0) { 878 if (ret < 0) {
901 clk_disable_unprepare(player->clk); 879 clk_disable_unprepare(player->clk);
902 return ret; 880 return ret;
@@ -938,17 +916,14 @@ static int uni_player_stop(struct uniperif *player)
938 916
939 /* The player should not be in stopped state */ 917 /* The player should not be in stopped state */
940 if (player->state == UNIPERIF_STATE_STOPPED) { 918 if (player->state == UNIPERIF_STATE_STOPPED) {
941 dev_err(player->dev, "%s: invalid player state", __func__); 919 dev_err(player->dev, "%s: invalid player state\n", __func__);
942 return -EINVAL; 920 return -EINVAL;
943 } 921 }
944 922
945 /* Turn the player off */ 923 /* Turn the player off */
946 SET_UNIPERIF_CTRL_OPERATION_OFF(player); 924 SET_UNIPERIF_CTRL_OPERATION_OFF(player);
947 925
948 /* Soft reset the player */ 926 ret = sti_uniperiph_reset(player);
949 SET_UNIPERIF_SOFT_RST_SOFT_RST(player);
950
951 ret = reset_player(player);
952 if (ret < 0) 927 if (ret < 0)
953 return ret; 928 return ret;
954 929
@@ -973,7 +948,7 @@ int uni_player_resume(struct uniperif *player)
973 ret = regmap_field_write(player->clk_sel, 1); 948 ret = regmap_field_write(player->clk_sel, 1);
974 if (ret) { 949 if (ret) {
975 dev_err(player->dev, 950 dev_err(player->dev,
976 "%s: Failed to select freq synth clock", 951 "%s: Failed to select freq synth clock\n",
977 __func__); 952 __func__);
978 return ret; 953 return ret;
979 } 954 }
@@ -1070,7 +1045,7 @@ int uni_player_init(struct platform_device *pdev,
1070 ret = uni_player_parse_dt_audio_glue(pdev, player); 1045 ret = uni_player_parse_dt_audio_glue(pdev, player);
1071 1046
1072 if (ret < 0) { 1047 if (ret < 0) {
1073 dev_err(player->dev, "Failed to parse DeviceTree"); 1048 dev_err(player->dev, "Failed to parse DeviceTree\n");
1074 return ret; 1049 return ret;
1075 } 1050 }
1076 1051
@@ -1085,15 +1060,17 @@ int uni_player_init(struct platform_device *pdev,
1085 1060
1086 /* Get uniperif resource */ 1061 /* Get uniperif resource */
1087 player->clk = of_clk_get(pdev->dev.of_node, 0); 1062 player->clk = of_clk_get(pdev->dev.of_node, 0);
1088 if (IS_ERR(player->clk)) 1063 if (IS_ERR(player->clk)) {
1064 dev_err(player->dev, "Failed to get clock\n");
1089 ret = PTR_ERR(player->clk); 1065 ret = PTR_ERR(player->clk);
1066 }
1090 1067
1091 /* Select the frequency synthesizer clock */ 1068 /* Select the frequency synthesizer clock */
1092 if (player->clk_sel) { 1069 if (player->clk_sel) {
1093 ret = regmap_field_write(player->clk_sel, 1); 1070 ret = regmap_field_write(player->clk_sel, 1);
1094 if (ret) { 1071 if (ret) {
1095 dev_err(player->dev, 1072 dev_err(player->dev,
1096 "%s: Failed to select freq synth clock", 1073 "%s: Failed to select freq synth clock\n",
1097 __func__); 1074 __func__);
1098 return ret; 1075 return ret;
1099 } 1076 }
@@ -1105,7 +1082,7 @@ int uni_player_init(struct platform_device *pdev,
1105 ret = regmap_field_write(player->valid_sel, player->id); 1082 ret = regmap_field_write(player->valid_sel, player->id);
1106 if (ret) { 1083 if (ret) {
1107 dev_err(player->dev, 1084 dev_err(player->dev,
1108 "%s: unable to connect to tdm bus", __func__); 1085 "%s: unable to connect to tdm bus\n", __func__);
1109 return ret; 1086 return ret;
1110 } 1087 }
1111 } 1088 }
@@ -1113,8 +1090,10 @@ int uni_player_init(struct platform_device *pdev,
1113 ret = devm_request_irq(&pdev->dev, player->irq, 1090 ret = devm_request_irq(&pdev->dev, player->irq,
1114 uni_player_irq_handler, IRQF_SHARED, 1091 uni_player_irq_handler, IRQF_SHARED,
1115 dev_name(&pdev->dev), player); 1092 dev_name(&pdev->dev), player);
1116 if (ret < 0) 1093 if (ret < 0) {
1094 dev_err(player->dev, "unable to request IRQ %d\n", player->irq);
1117 return ret; 1095 return ret;
1096 }
1118 1097
1119 mutex_init(&player->ctrl_lock); 1098 mutex_init(&player->ctrl_lock);
1120 1099
diff --git a/sound/soc/sti/uniperif_reader.c b/sound/soc/sti/uniperif_reader.c
index 0e1c3ee56675..5992c6ab3833 100644
--- a/sound/soc/sti/uniperif_reader.c
+++ b/sound/soc/sti/uniperif_reader.c
@@ -5,10 +5,6 @@
5 * License terms: GNU General Public License (GPL), version 2 5 * License terms: GNU General Public License (GPL), version 2
6 */ 6 */
7 7
8#include <linux/clk.h>
9#include <linux/delay.h>
10#include <linux/io.h>
11
12#include <sound/soc.h> 8#include <sound/soc.h>
13 9
14#include "uniperif.h" 10#include "uniperif.h"
@@ -52,7 +48,7 @@ static irqreturn_t uni_reader_irq_handler(int irq, void *dev_id)
52 48
53 if (reader->state == UNIPERIF_STATE_STOPPED) { 49 if (reader->state == UNIPERIF_STATE_STOPPED) {
54 /* Unexpected IRQ: do nothing */ 50 /* Unexpected IRQ: do nothing */
55 dev_warn(reader->dev, "unexpected IRQ "); 51 dev_warn(reader->dev, "unexpected IRQ\n");
56 return IRQ_HANDLED; 52 return IRQ_HANDLED;
57 } 53 }
58 54
@@ -62,7 +58,7 @@ static irqreturn_t uni_reader_irq_handler(int irq, void *dev_id)
62 58
63 /* Check for fifo overflow error */ 59 /* Check for fifo overflow error */
64 if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(reader))) { 60 if (unlikely(status & UNIPERIF_ITS_FIFO_ERROR_MASK(reader))) {
65 dev_err(reader->dev, "FIFO error detected"); 61 dev_err(reader->dev, "FIFO error detected\n");
66 62
67 snd_pcm_stream_lock(reader->substream); 63 snd_pcm_stream_lock(reader->substream);
68 snd_pcm_stop(reader->substream, SNDRV_PCM_STATE_XRUN); 64 snd_pcm_stop(reader->substream, SNDRV_PCM_STATE_XRUN);
@@ -105,7 +101,7 @@ static int uni_reader_prepare_pcm(struct snd_pcm_runtime *runtime,
105 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(reader); 101 SET_UNIPERIF_I2S_FMT_DATA_SIZE_16(reader);
106 break; 102 break;
107 default: 103 default:
108 dev_err(reader->dev, "subframe format not supported"); 104 dev_err(reader->dev, "subframe format not supported\n");
109 return -EINVAL; 105 return -EINVAL;
110 } 106 }
111 107
@@ -125,14 +121,14 @@ static int uni_reader_prepare_pcm(struct snd_pcm_runtime *runtime,
125 break; 121 break;
126 122
127 default: 123 default:
128 dev_err(reader->dev, "format not supported"); 124 dev_err(reader->dev, "format not supported\n");
129 return -EINVAL; 125 return -EINVAL;
130 } 126 }
131 127
132 /* Number of channels must be even */ 128 /* Number of channels must be even */
133 if ((runtime->channels % 2) || (runtime->channels < 2) || 129 if ((runtime->channels % 2) || (runtime->channels < 2) ||
134 (runtime->channels > 10)) { 130 (runtime->channels > 10)) {
135 dev_err(reader->dev, "%s: invalid nb of channels", __func__); 131 dev_err(reader->dev, "%s: invalid nb of channels\n", __func__);
136 return -EINVAL; 132 return -EINVAL;
137 } 133 }
138 134
@@ -186,11 +182,10 @@ static int uni_reader_prepare(struct snd_pcm_substream *substream,
186 struct uniperif *reader = priv->dai_data.uni; 182 struct uniperif *reader = priv->dai_data.uni;
187 struct snd_pcm_runtime *runtime = substream->runtime; 183 struct snd_pcm_runtime *runtime = substream->runtime;
188 int transfer_size, trigger_limit, ret; 184 int transfer_size, trigger_limit, ret;
189 int count = 10;
190 185
191 /* The reader should be stopped */ 186 /* The reader should be stopped */
192 if (reader->state != UNIPERIF_STATE_STOPPED) { 187 if (reader->state != UNIPERIF_STATE_STOPPED) {
193 dev_err(reader->dev, "%s: invalid reader state %d", __func__, 188 dev_err(reader->dev, "%s: invalid reader state %d\n", __func__,
194 reader->state); 189 reader->state);
195 return -EINVAL; 190 return -EINVAL;
196 } 191 }
@@ -219,7 +214,8 @@ static int uni_reader_prepare(struct snd_pcm_substream *substream,
219 if ((!trigger_limit % 2) || 214 if ((!trigger_limit % 2) ||
220 (trigger_limit != 1 && transfer_size % 2) || 215 (trigger_limit != 1 && transfer_size % 2) ||
221 (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(reader))) { 216 (trigger_limit > UNIPERIF_CONFIG_DMA_TRIG_LIMIT_MASK(reader))) {
222 dev_err(reader->dev, "invalid trigger limit %d", trigger_limit); 217 dev_err(reader->dev, "invalid trigger limit %d\n",
218 trigger_limit);
223 return -EINVAL; 219 return -EINVAL;
224 } 220 }
225 221
@@ -246,7 +242,7 @@ static int uni_reader_prepare(struct snd_pcm_substream *substream,
246 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(reader); 242 SET_UNIPERIF_I2S_FMT_PADDING_SONY_MODE(reader);
247 break; 243 break;
248 default: 244 default:
249 dev_err(reader->dev, "format not supported"); 245 dev_err(reader->dev, "format not supported\n");
250 return -EINVAL; 246 return -EINVAL;
251 } 247 }
252 248
@@ -287,25 +283,14 @@ static int uni_reader_prepare(struct snd_pcm_substream *substream,
287 } 283 }
288 284
289 /* Reset uniperipheral reader */ 285 /* Reset uniperipheral reader */
290 SET_UNIPERIF_SOFT_RST_SOFT_RST(reader); 286 return sti_uniperiph_reset(reader);
291
292 while (GET_UNIPERIF_SOFT_RST_SOFT_RST(reader)) {
293 udelay(5);
294 count--;
295 }
296 if (!count) {
297 dev_err(reader->dev, "Failed to reset uniperif");
298 return -EIO;
299 }
300
301 return 0;
302} 287}
303 288
304static int uni_reader_start(struct uniperif *reader) 289static int uni_reader_start(struct uniperif *reader)
305{ 290{
306 /* The reader should be stopped */ 291 /* The reader should be stopped */
307 if (reader->state != UNIPERIF_STATE_STOPPED) { 292 if (reader->state != UNIPERIF_STATE_STOPPED) {
308 dev_err(reader->dev, "%s: invalid reader state", __func__); 293 dev_err(reader->dev, "%s: invalid reader state\n", __func__);
309 return -EINVAL; 294 return -EINVAL;
310 } 295 }
311 296
@@ -325,7 +310,7 @@ static int uni_reader_stop(struct uniperif *reader)
325{ 310{
326 /* The reader should not be in stopped state */ 311 /* The reader should not be in stopped state */
327 if (reader->state == UNIPERIF_STATE_STOPPED) { 312 if (reader->state == UNIPERIF_STATE_STOPPED) {
328 dev_err(reader->dev, "%s: invalid reader state", __func__); 313 dev_err(reader->dev, "%s: invalid reader state\n", __func__);
329 return -EINVAL; 314 return -EINVAL;
330 } 315 }
331 316
@@ -423,7 +408,7 @@ int uni_reader_init(struct platform_device *pdev,
423 uni_reader_irq_handler, IRQF_SHARED, 408 uni_reader_irq_handler, IRQF_SHARED,
424 dev_name(&pdev->dev), reader); 409 dev_name(&pdev->dev), reader);
425 if (ret < 0) { 410 if (ret < 0) {
426 dev_err(&pdev->dev, "Failed to request IRQ"); 411 dev_err(&pdev->dev, "Failed to request IRQ\n");
427 return -EBUSY; 412 return -EBUSY;
428 } 413 }
429 414
diff --git a/sound/soc/sunxi/Kconfig b/sound/soc/sunxi/Kconfig
index dd2368297fd3..6c344e16aca4 100644
--- a/sound/soc/sunxi/Kconfig
+++ b/sound/soc/sunxi/Kconfig
@@ -9,6 +9,14 @@ config SND_SUN4I_CODEC
9 Select Y or M to add support for the Codec embedded in the Allwinner 9 Select Y or M to add support for the Codec embedded in the Allwinner
10 A10 and affiliated SoCs. 10 A10 and affiliated SoCs.
11 11
12config SND_SUN8I_CODEC_ANALOG
13 tristate "Allwinner sun8i Codec Analog Controls Support"
14 depends on MACH_SUN8I || COMPILE_TEST
15 select REGMAP
16 help
17 Say Y or M if you want to add support for the analog controls for
18 the codec embedded in newer Allwinner SoCs.
19
12config SND_SUN4I_I2S 20config SND_SUN4I_I2S
13 tristate "Allwinner A10 I2S Support" 21 tristate "Allwinner A10 I2S Support"
14 select SND_SOC_GENERIC_DMAENGINE_PCM 22 select SND_SOC_GENERIC_DMAENGINE_PCM
diff --git a/sound/soc/sunxi/Makefile b/sound/soc/sunxi/Makefile
index 604c7b842837..241c0df9ca0c 100644
--- a/sound/soc/sunxi/Makefile
+++ b/sound/soc/sunxi/Makefile
@@ -1,3 +1,4 @@
1obj-$(CONFIG_SND_SUN4I_CODEC) += sun4i-codec.o 1obj-$(CONFIG_SND_SUN4I_CODEC) += sun4i-codec.o
2obj-$(CONFIG_SND_SUN4I_I2S) += sun4i-i2s.o 2obj-$(CONFIG_SND_SUN4I_I2S) += sun4i-i2s.o
3obj-$(CONFIG_SND_SUN4I_SPDIF) += sun4i-spdif.o 3obj-$(CONFIG_SND_SUN4I_SPDIF) += sun4i-spdif.o
4obj-$(CONFIG_SND_SUN8I_CODEC_ANALOG) += sun8i-codec-analog.o
diff --git a/sound/soc/sunxi/sun4i-codec.c b/sound/soc/sunxi/sun4i-codec.c
index 56ed9472e89f..848af01692a0 100644
--- a/sound/soc/sunxi/sun4i-codec.c
+++ b/sound/soc/sunxi/sun4i-codec.c
@@ -3,6 +3,7 @@
3 * Copyright 2014 Jon Smirl <jonsmirl@gmail.com> 3 * Copyright 2014 Jon Smirl <jonsmirl@gmail.com>
4 * Copyright 2015 Maxime Ripard <maxime.ripard@free-electrons.com> 4 * Copyright 2015 Maxime Ripard <maxime.ripard@free-electrons.com>
5 * Copyright 2015 Adam Sampson <ats@offog.org> 5 * Copyright 2015 Adam Sampson <ats@offog.org>
6 * Copyright 2016 Chen-Yu Tsai <wens@csie.org>
6 * 7 *
7 * Based on the Allwinner SDK driver, released under the GPL. 8 * Based on the Allwinner SDK driver, released under the GPL.
8 * 9 *
@@ -24,10 +25,12 @@
24#include <linux/delay.h> 25#include <linux/delay.h>
25#include <linux/slab.h> 26#include <linux/slab.h>
26#include <linux/of.h> 27#include <linux/of.h>
27#include <linux/of_platform.h>
28#include <linux/of_address.h> 28#include <linux/of_address.h>
29#include <linux/of_device.h>
30#include <linux/of_platform.h>
29#include <linux/clk.h> 31#include <linux/clk.h>
30#include <linux/regmap.h> 32#include <linux/regmap.h>
33#include <linux/reset.h>
31#include <linux/gpio/consumer.h> 34#include <linux/gpio/consumer.h>
32 35
33#include <sound/core.h> 36#include <sound/core.h>
@@ -38,7 +41,7 @@
38#include <sound/initval.h> 41#include <sound/initval.h>
39#include <sound/dmaengine_pcm.h> 42#include <sound/dmaengine_pcm.h>
40 43
41/* Codec DAC register offsets and bit fields */ 44/* Codec DAC digital controls and FIFO registers */
42#define SUN4I_CODEC_DAC_DPC (0x00) 45#define SUN4I_CODEC_DAC_DPC (0x00)
43#define SUN4I_CODEC_DAC_DPC_EN_DA (31) 46#define SUN4I_CODEC_DAC_DPC_EN_DA (31)
44#define SUN4I_CODEC_DAC_DPC_DVOL (12) 47#define SUN4I_CODEC_DAC_DPC_DVOL (12)
@@ -55,6 +58,8 @@
55#define SUN4I_CODEC_DAC_FIFOC_FIFO_FLUSH (0) 58#define SUN4I_CODEC_DAC_FIFOC_FIFO_FLUSH (0)
56#define SUN4I_CODEC_DAC_FIFOS (0x08) 59#define SUN4I_CODEC_DAC_FIFOS (0x08)
57#define SUN4I_CODEC_DAC_TXDATA (0x0c) 60#define SUN4I_CODEC_DAC_TXDATA (0x0c)
61
62/* Codec DAC side analog signal controls */
58#define SUN4I_CODEC_DAC_ACTL (0x10) 63#define SUN4I_CODEC_DAC_ACTL (0x10)
59#define SUN4I_CODEC_DAC_ACTL_DACAENR (31) 64#define SUN4I_CODEC_DAC_ACTL_DACAENR (31)
60#define SUN4I_CODEC_DAC_ACTL_DACAENL (30) 65#define SUN4I_CODEC_DAC_ACTL_DACAENL (30)
@@ -69,7 +74,7 @@
69#define SUN4I_CODEC_DAC_TUNE (0x14) 74#define SUN4I_CODEC_DAC_TUNE (0x14)
70#define SUN4I_CODEC_DAC_DEBUG (0x18) 75#define SUN4I_CODEC_DAC_DEBUG (0x18)
71 76
72/* Codec ADC register offsets and bit fields */ 77/* Codec ADC digital controls and FIFO registers */
73#define SUN4I_CODEC_ADC_FIFOC (0x1c) 78#define SUN4I_CODEC_ADC_FIFOC (0x1c)
74#define SUN4I_CODEC_ADC_FIFOC_ADC_FS (29) 79#define SUN4I_CODEC_ADC_FIFOC_ADC_FS (29)
75#define SUN4I_CODEC_ADC_FIFOC_EN_AD (28) 80#define SUN4I_CODEC_ADC_FIFOC_EN_AD (28)
@@ -81,6 +86,8 @@
81#define SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH (0) 86#define SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH (0)
82#define SUN4I_CODEC_ADC_FIFOS (0x20) 87#define SUN4I_CODEC_ADC_FIFOS (0x20)
83#define SUN4I_CODEC_ADC_RXDATA (0x24) 88#define SUN4I_CODEC_ADC_RXDATA (0x24)
89
90/* Codec ADC side analog signal controls */
84#define SUN4I_CODEC_ADC_ACTL (0x28) 91#define SUN4I_CODEC_ADC_ACTL (0x28)
85#define SUN4I_CODEC_ADC_ACTL_ADC_R_EN (31) 92#define SUN4I_CODEC_ADC_ACTL_ADC_R_EN (31)
86#define SUN4I_CODEC_ADC_ACTL_ADC_L_EN (30) 93#define SUN4I_CODEC_ADC_ACTL_ADC_L_EN (30)
@@ -93,19 +100,141 @@
93#define SUN4I_CODEC_ADC_ACTL_DDE (3) 100#define SUN4I_CODEC_ADC_ACTL_DDE (3)
94#define SUN4I_CODEC_ADC_DEBUG (0x2c) 101#define SUN4I_CODEC_ADC_DEBUG (0x2c)
95 102
96/* Other various ADC registers */ 103/* FIFO counters */
97#define SUN4I_CODEC_DAC_TXCNT (0x30) 104#define SUN4I_CODEC_DAC_TXCNT (0x30)
98#define SUN4I_CODEC_ADC_RXCNT (0x34) 105#define SUN4I_CODEC_ADC_RXCNT (0x34)
106
107/* Calibration register (sun7i only) */
99#define SUN7I_CODEC_AC_DAC_CAL (0x38) 108#define SUN7I_CODEC_AC_DAC_CAL (0x38)
109
110/* Microphone controls (sun7i only) */
100#define SUN7I_CODEC_AC_MIC_PHONE_CAL (0x3c) 111#define SUN7I_CODEC_AC_MIC_PHONE_CAL (0x3c)
101 112
113/*
114 * sun6i specific registers
115 *
116 * sun6i shares the same digital control and FIFO registers as sun4i,
117 * but only the DAC digital controls are at the same offset. The others
118 * have been moved around to accommodate extra analog controls.
119 */
120
121/* Codec DAC digital controls and FIFO registers */
122#define SUN6I_CODEC_ADC_FIFOC (0x10)
123#define SUN6I_CODEC_ADC_FIFOC_EN_AD (28)
124#define SUN6I_CODEC_ADC_FIFOS (0x14)
125#define SUN6I_CODEC_ADC_RXDATA (0x18)
126
127/* Output mixer and gain controls */
128#define SUN6I_CODEC_OM_DACA_CTRL (0x20)
129#define SUN6I_CODEC_OM_DACA_CTRL_DACAREN (31)
130#define SUN6I_CODEC_OM_DACA_CTRL_DACALEN (30)
131#define SUN6I_CODEC_OM_DACA_CTRL_RMIXEN (29)
132#define SUN6I_CODEC_OM_DACA_CTRL_LMIXEN (28)
133#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_MIC1 (23)
134#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_MIC2 (22)
135#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_PHONE (21)
136#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_PHONEP (20)
137#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_LINEINR (19)
138#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_DACR (18)
139#define SUN6I_CODEC_OM_DACA_CTRL_RMIX_DACL (17)
140#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_MIC1 (16)
141#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_MIC2 (15)
142#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_PHONE (14)
143#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_PHONEN (13)
144#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_LINEINL (12)
145#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_DACL (11)
146#define SUN6I_CODEC_OM_DACA_CTRL_LMIX_DACR (10)
147#define SUN6I_CODEC_OM_DACA_CTRL_RHPIS (9)
148#define SUN6I_CODEC_OM_DACA_CTRL_LHPIS (8)
149#define SUN6I_CODEC_OM_DACA_CTRL_RHPPAMUTE (7)
150#define SUN6I_CODEC_OM_DACA_CTRL_LHPPAMUTE (6)
151#define SUN6I_CODEC_OM_DACA_CTRL_HPVOL (0)
152#define SUN6I_CODEC_OM_PA_CTRL (0x24)
153#define SUN6I_CODEC_OM_PA_CTRL_HPPAEN (31)
154#define SUN6I_CODEC_OM_PA_CTRL_HPCOM_CTL (29)
155#define SUN6I_CODEC_OM_PA_CTRL_COMPTEN (28)
156#define SUN6I_CODEC_OM_PA_CTRL_MIC1G (15)
157#define SUN6I_CODEC_OM_PA_CTRL_MIC2G (12)
158#define SUN6I_CODEC_OM_PA_CTRL_LINEING (9)
159#define SUN6I_CODEC_OM_PA_CTRL_PHONEG (6)
160#define SUN6I_CODEC_OM_PA_CTRL_PHONEPG (3)
161#define SUN6I_CODEC_OM_PA_CTRL_PHONENG (0)
162
163/* Microphone, line out and phone out controls */
164#define SUN6I_CODEC_MIC_CTRL (0x28)
165#define SUN6I_CODEC_MIC_CTRL_HBIASEN (31)
166#define SUN6I_CODEC_MIC_CTRL_MBIASEN (30)
167#define SUN6I_CODEC_MIC_CTRL_MIC1AMPEN (28)
168#define SUN6I_CODEC_MIC_CTRL_MIC1BOOST (25)
169#define SUN6I_CODEC_MIC_CTRL_MIC2AMPEN (24)
170#define SUN6I_CODEC_MIC_CTRL_MIC2BOOST (21)
171#define SUN6I_CODEC_MIC_CTRL_MIC2SLT (20)
172#define SUN6I_CODEC_MIC_CTRL_LINEOUTLEN (19)
173#define SUN6I_CODEC_MIC_CTRL_LINEOUTREN (18)
174#define SUN6I_CODEC_MIC_CTRL_LINEOUTLSRC (17)
175#define SUN6I_CODEC_MIC_CTRL_LINEOUTRSRC (16)
176#define SUN6I_CODEC_MIC_CTRL_LINEOUTVC (11)
177#define SUN6I_CODEC_MIC_CTRL_PHONEPREG (8)
178
179/* ADC mixer controls */
180#define SUN6I_CODEC_ADC_ACTL (0x2c)
181#define SUN6I_CODEC_ADC_ACTL_ADCREN (31)
182#define SUN6I_CODEC_ADC_ACTL_ADCLEN (30)
183#define SUN6I_CODEC_ADC_ACTL_ADCRG (27)
184#define SUN6I_CODEC_ADC_ACTL_ADCLG (24)
185#define SUN6I_CODEC_ADC_ACTL_RADCMIX_MIC1 (13)
186#define SUN6I_CODEC_ADC_ACTL_RADCMIX_MIC2 (12)
187#define SUN6I_CODEC_ADC_ACTL_RADCMIX_PHONE (11)
188#define SUN6I_CODEC_ADC_ACTL_RADCMIX_PHONEP (10)
189#define SUN6I_CODEC_ADC_ACTL_RADCMIX_LINEINR (9)
190#define SUN6I_CODEC_ADC_ACTL_RADCMIX_OMIXR (8)
191#define SUN6I_CODEC_ADC_ACTL_RADCMIX_OMIXL (7)
192#define SUN6I_CODEC_ADC_ACTL_LADCMIX_MIC1 (6)
193#define SUN6I_CODEC_ADC_ACTL_LADCMIX_MIC2 (5)
194#define SUN6I_CODEC_ADC_ACTL_LADCMIX_PHONE (4)
195#define SUN6I_CODEC_ADC_ACTL_LADCMIX_PHONEN (3)
196#define SUN6I_CODEC_ADC_ACTL_LADCMIX_LINEINL (2)
197#define SUN6I_CODEC_ADC_ACTL_LADCMIX_OMIXL (1)
198#define SUN6I_CODEC_ADC_ACTL_LADCMIX_OMIXR (0)
199
200/* Analog performance tuning controls */
201#define SUN6I_CODEC_ADDA_TUNE (0x30)
202
203/* Calibration controls */
204#define SUN6I_CODEC_CALIBRATION (0x34)
205
206/* FIFO counters */
207#define SUN6I_CODEC_DAC_TXCNT (0x40)
208#define SUN6I_CODEC_ADC_RXCNT (0x44)
209
210/* headset jack detection and button support registers */
211#define SUN6I_CODEC_HMIC_CTL (0x50)
212#define SUN6I_CODEC_HMIC_DATA (0x54)
213
214/* TODO sun6i DAP (Digital Audio Processing) bits */
215
216/* FIFO counters moved on A23 */
217#define SUN8I_A23_CODEC_DAC_TXCNT (0x1c)
218#define SUN8I_A23_CODEC_ADC_RXCNT (0x20)
219
220/* TX FIFO moved on H3 */
221#define SUN8I_H3_CODEC_DAC_TXDATA (0x20)
222#define SUN8I_H3_CODEC_DAC_DBG (0x48)
223#define SUN8I_H3_CODEC_ADC_DBG (0x4c)
224
225/* TODO H3 DAP (Digital Audio Processing) bits */
226
102struct sun4i_codec { 227struct sun4i_codec {
103 struct device *dev; 228 struct device *dev;
104 struct regmap *regmap; 229 struct regmap *regmap;
105 struct clk *clk_apb; 230 struct clk *clk_apb;
106 struct clk *clk_module; 231 struct clk *clk_module;
232 struct reset_control *rst;
107 struct gpio_desc *gpio_pa; 233 struct gpio_desc *gpio_pa;
108 234
235 /* ADC_FIFOC register is at different offset on different SoCs */
236 struct regmap_field *reg_adc_fifoc;
237
109 struct snd_dmaengine_dai_dma_data capture_dma_data; 238 struct snd_dmaengine_dai_dma_data capture_dma_data;
110 struct snd_dmaengine_dai_dma_data playback_dma_data; 239 struct snd_dmaengine_dai_dma_data playback_dma_data;
111}; 240};
@@ -134,16 +263,16 @@ static void sun4i_codec_stop_playback(struct sun4i_codec *scodec)
134static void sun4i_codec_start_capture(struct sun4i_codec *scodec) 263static void sun4i_codec_start_capture(struct sun4i_codec *scodec)
135{ 264{
136 /* Enable ADC DRQ */ 265 /* Enable ADC DRQ */
137 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 266 regmap_field_update_bits(scodec->reg_adc_fifoc,
138 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN), 267 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN),
139 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN)); 268 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN));
140} 269}
141 270
142static void sun4i_codec_stop_capture(struct sun4i_codec *scodec) 271static void sun4i_codec_stop_capture(struct sun4i_codec *scodec)
143{ 272{
144 /* Disable ADC DRQ */ 273 /* Disable ADC DRQ */
145 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 274 regmap_field_update_bits(scodec->reg_adc_fifoc,
146 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN), 0); 275 BIT(SUN4I_CODEC_ADC_FIFOC_ADC_DRQ_EN), 0);
147} 276}
148 277
149static int sun4i_codec_trigger(struct snd_pcm_substream *substream, int cmd, 278static int sun4i_codec_trigger(struct snd_pcm_substream *substream, int cmd,
@@ -186,24 +315,29 @@ static int sun4i_codec_prepare_capture(struct snd_pcm_substream *substream,
186 315
187 316
188 /* Flush RX FIFO */ 317 /* Flush RX FIFO */
189 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 318 regmap_field_update_bits(scodec->reg_adc_fifoc,
190 BIT(SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH), 319 BIT(SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH),
191 BIT(SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH)); 320 BIT(SUN4I_CODEC_ADC_FIFOC_FIFO_FLUSH));
192 321
193 322
194 /* Set RX FIFO trigger level */ 323 /* Set RX FIFO trigger level */
195 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 324 regmap_field_update_bits(scodec->reg_adc_fifoc,
196 0xf << SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL, 325 0xf << SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL,
197 0x7 << SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL); 326 0x7 << SUN4I_CODEC_ADC_FIFOC_RX_TRIG_LEVEL);
198 327
199 /* 328 /*
200 * FIXME: Undocumented in the datasheet, but 329 * FIXME: Undocumented in the datasheet, but
201 * Allwinner's code mentions that it is related 330 * Allwinner's code mentions that it is related
202 * related to microphone gain 331 * related to microphone gain
203 */ 332 */
204 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_ACTL, 333 if (of_device_is_compatible(scodec->dev->of_node,
205 0x3 << 25, 334 "allwinner,sun4i-a10-codec") ||
206 0x1 << 25); 335 of_device_is_compatible(scodec->dev->of_node,
336 "allwinner,sun7i-a20-codec")) {
337 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_ACTL,
338 0x3 << 25,
339 0x1 << 25);
340 }
207 341
208 if (of_device_is_compatible(scodec->dev->of_node, 342 if (of_device_is_compatible(scodec->dev->of_node,
209 "allwinner,sun7i-a20-codec")) 343 "allwinner,sun7i-a20-codec"))
@@ -213,9 +347,9 @@ static int sun4i_codec_prepare_capture(struct snd_pcm_substream *substream,
213 0x1 << 8); 347 0x1 << 8);
214 348
215 /* Fill most significant bits with valid data MSB */ 349 /* Fill most significant bits with valid data MSB */
216 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 350 regmap_field_update_bits(scodec->reg_adc_fifoc,
217 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE), 351 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE),
218 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE)); 352 BIT(SUN4I_CODEC_ADC_FIFOC_RX_FIFO_MODE));
219 353
220 return 0; 354 return 0;
221} 355}
@@ -342,18 +476,19 @@ static int sun4i_codec_hw_params_capture(struct sun4i_codec *scodec,
342 unsigned int hwrate) 476 unsigned int hwrate)
343{ 477{
344 /* Set ADC sample rate */ 478 /* Set ADC sample rate */
345 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 479 regmap_field_update_bits(scodec->reg_adc_fifoc,
346 7 << SUN4I_CODEC_ADC_FIFOC_ADC_FS, 480 7 << SUN4I_CODEC_ADC_FIFOC_ADC_FS,
347 hwrate << SUN4I_CODEC_ADC_FIFOC_ADC_FS); 481 hwrate << SUN4I_CODEC_ADC_FIFOC_ADC_FS);
348 482
349 /* Set the number of channels we want to use */ 483 /* Set the number of channels we want to use */
350 if (params_channels(params) == 1) 484 if (params_channels(params) == 1)
351 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 485 regmap_field_update_bits(scodec->reg_adc_fifoc,
352 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN), 486 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN),
353 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN)); 487 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN));
354 else 488 else
355 regmap_update_bits(scodec->regmap, SUN4I_CODEC_ADC_FIFOC, 489 regmap_field_update_bits(scodec->reg_adc_fifoc,
356 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN), 0); 490 BIT(SUN4I_CODEC_ADC_FIFOC_MONO_EN),
491 0);
357 492
358 return 0; 493 return 0;
359} 494}
@@ -502,7 +637,7 @@ static struct snd_soc_dai_driver sun4i_codec_dai = {
502 }, 637 },
503}; 638};
504 639
505/*** Codec ***/ 640/*** sun4i Codec ***/
506static const struct snd_kcontrol_new sun4i_codec_pa_mute = 641static const struct snd_kcontrol_new sun4i_codec_pa_mute =
507 SOC_DAPM_SINGLE("Switch", SUN4I_CODEC_DAC_ACTL, 642 SOC_DAPM_SINGLE("Switch", SUN4I_CODEC_DAC_ACTL,
508 SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0); 643 SUN4I_CODEC_DAC_ACTL_PA_MUTE, 1, 0);
@@ -638,6 +773,337 @@ static struct snd_soc_codec_driver sun4i_codec_codec = {
638 }, 773 },
639}; 774};
640 775
776/*** sun6i Codec ***/
777
778/* mixer controls */
779static const struct snd_kcontrol_new sun6i_codec_mixer_controls[] = {
780 SOC_DAPM_DOUBLE("DAC Playback Switch",
781 SUN6I_CODEC_OM_DACA_CTRL,
782 SUN6I_CODEC_OM_DACA_CTRL_LMIX_DACL,
783 SUN6I_CODEC_OM_DACA_CTRL_RMIX_DACR, 1, 0),
784 SOC_DAPM_DOUBLE("DAC Reversed Playback Switch",
785 SUN6I_CODEC_OM_DACA_CTRL,
786 SUN6I_CODEC_OM_DACA_CTRL_LMIX_DACR,
787 SUN6I_CODEC_OM_DACA_CTRL_RMIX_DACL, 1, 0),
788 SOC_DAPM_DOUBLE("Line In Playback Switch",
789 SUN6I_CODEC_OM_DACA_CTRL,
790 SUN6I_CODEC_OM_DACA_CTRL_LMIX_LINEINL,
791 SUN6I_CODEC_OM_DACA_CTRL_RMIX_LINEINR, 1, 0),
792 SOC_DAPM_DOUBLE("Mic1 Playback Switch",
793 SUN6I_CODEC_OM_DACA_CTRL,
794 SUN6I_CODEC_OM_DACA_CTRL_LMIX_MIC1,
795 SUN6I_CODEC_OM_DACA_CTRL_RMIX_MIC1, 1, 0),
796 SOC_DAPM_DOUBLE("Mic2 Playback Switch",
797 SUN6I_CODEC_OM_DACA_CTRL,
798 SUN6I_CODEC_OM_DACA_CTRL_LMIX_MIC2,
799 SUN6I_CODEC_OM_DACA_CTRL_RMIX_MIC2, 1, 0),
800};
801
802/* ADC mixer controls */
803static const struct snd_kcontrol_new sun6i_codec_adc_mixer_controls[] = {
804 SOC_DAPM_DOUBLE("Mixer Capture Switch",
805 SUN6I_CODEC_ADC_ACTL,
806 SUN6I_CODEC_ADC_ACTL_LADCMIX_OMIXL,
807 SUN6I_CODEC_ADC_ACTL_RADCMIX_OMIXR, 1, 0),
808 SOC_DAPM_DOUBLE("Mixer Reversed Capture Switch",
809 SUN6I_CODEC_ADC_ACTL,
810 SUN6I_CODEC_ADC_ACTL_LADCMIX_OMIXR,
811 SUN6I_CODEC_ADC_ACTL_RADCMIX_OMIXL, 1, 0),
812 SOC_DAPM_DOUBLE("Line In Capture Switch",
813 SUN6I_CODEC_ADC_ACTL,
814 SUN6I_CODEC_ADC_ACTL_LADCMIX_LINEINL,
815 SUN6I_CODEC_ADC_ACTL_RADCMIX_LINEINR, 1, 0),
816 SOC_DAPM_DOUBLE("Mic1 Capture Switch",
817 SUN6I_CODEC_ADC_ACTL,
818 SUN6I_CODEC_ADC_ACTL_LADCMIX_MIC1,
819 SUN6I_CODEC_ADC_ACTL_RADCMIX_MIC1, 1, 0),
820 SOC_DAPM_DOUBLE("Mic2 Capture Switch",
821 SUN6I_CODEC_ADC_ACTL,
822 SUN6I_CODEC_ADC_ACTL_LADCMIX_MIC2,
823 SUN6I_CODEC_ADC_ACTL_RADCMIX_MIC2, 1, 0),
824};
825
826/* headphone controls */
827static const char * const sun6i_codec_hp_src_enum_text[] = {
828 "DAC", "Mixer",
829};
830
831static SOC_ENUM_DOUBLE_DECL(sun6i_codec_hp_src_enum,
832 SUN6I_CODEC_OM_DACA_CTRL,
833 SUN6I_CODEC_OM_DACA_CTRL_LHPIS,
834 SUN6I_CODEC_OM_DACA_CTRL_RHPIS,
835 sun6i_codec_hp_src_enum_text);
836
837static const struct snd_kcontrol_new sun6i_codec_hp_src[] = {
838 SOC_DAPM_ENUM("Headphone Source Playback Route",
839 sun6i_codec_hp_src_enum),
840};
841
842/* microphone controls */
843static const char * const sun6i_codec_mic2_src_enum_text[] = {
844 "Mic2", "Mic3",
845};
846
847static SOC_ENUM_SINGLE_DECL(sun6i_codec_mic2_src_enum,
848 SUN6I_CODEC_MIC_CTRL,
849 SUN6I_CODEC_MIC_CTRL_MIC2SLT,
850 sun6i_codec_mic2_src_enum_text);
851
852static const struct snd_kcontrol_new sun6i_codec_mic2_src[] = {
853 SOC_DAPM_ENUM("Mic2 Amplifier Source Route",
854 sun6i_codec_mic2_src_enum),
855};
856
857/* line out controls */
858static const char * const sun6i_codec_lineout_src_enum_text[] = {
859 "Stereo", "Mono Differential",
860};
861
862static SOC_ENUM_DOUBLE_DECL(sun6i_codec_lineout_src_enum,
863 SUN6I_CODEC_MIC_CTRL,
864 SUN6I_CODEC_MIC_CTRL_LINEOUTLSRC,
865 SUN6I_CODEC_MIC_CTRL_LINEOUTRSRC,
866 sun6i_codec_lineout_src_enum_text);
867
868static const struct snd_kcontrol_new sun6i_codec_lineout_src[] = {
869 SOC_DAPM_ENUM("Line Out Source Playback Route",
870 sun6i_codec_lineout_src_enum),
871};
872
873/* volume / mute controls */
874static const DECLARE_TLV_DB_SCALE(sun6i_codec_dvol_scale, -7308, 116, 0);
875static const DECLARE_TLV_DB_SCALE(sun6i_codec_hp_vol_scale, -6300, 100, 1);
876static const DECLARE_TLV_DB_SCALE(sun6i_codec_out_mixer_pregain_scale,
877 -450, 150, 0);
878static const DECLARE_TLV_DB_RANGE(sun6i_codec_lineout_vol_scale,
879 0, 1, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
880 2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
881);
882static const DECLARE_TLV_DB_RANGE(sun6i_codec_mic_gain_scale,
883 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
884 1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0),
885);
886
887static const struct snd_kcontrol_new sun6i_codec_codec_widgets[] = {
888 SOC_SINGLE_TLV("DAC Playback Volume", SUN4I_CODEC_DAC_DPC,
889 SUN4I_CODEC_DAC_DPC_DVOL, 0x3f, 1,
890 sun6i_codec_dvol_scale),
891 SOC_SINGLE_TLV("Headphone Playback Volume",
892 SUN6I_CODEC_OM_DACA_CTRL,
893 SUN6I_CODEC_OM_DACA_CTRL_HPVOL, 0x3f, 0,
894 sun6i_codec_hp_vol_scale),
895 SOC_SINGLE_TLV("Line Out Playback Volume",
896 SUN6I_CODEC_MIC_CTRL,
897 SUN6I_CODEC_MIC_CTRL_LINEOUTVC, 0x1f, 0,
898 sun6i_codec_lineout_vol_scale),
899 SOC_DOUBLE("Headphone Playback Switch",
900 SUN6I_CODEC_OM_DACA_CTRL,
901 SUN6I_CODEC_OM_DACA_CTRL_LHPPAMUTE,
902 SUN6I_CODEC_OM_DACA_CTRL_RHPPAMUTE, 1, 0),
903 SOC_DOUBLE("Line Out Playback Switch",
904 SUN6I_CODEC_MIC_CTRL,
905 SUN6I_CODEC_MIC_CTRL_LINEOUTLEN,
906 SUN6I_CODEC_MIC_CTRL_LINEOUTREN, 1, 0),
907 /* Mixer pre-gains */
908 SOC_SINGLE_TLV("Line In Playback Volume",
909 SUN6I_CODEC_OM_PA_CTRL, SUN6I_CODEC_OM_PA_CTRL_LINEING,
910 0x7, 0, sun6i_codec_out_mixer_pregain_scale),
911 SOC_SINGLE_TLV("Mic1 Playback Volume",
912 SUN6I_CODEC_OM_PA_CTRL, SUN6I_CODEC_OM_PA_CTRL_MIC1G,
913 0x7, 0, sun6i_codec_out_mixer_pregain_scale),
914 SOC_SINGLE_TLV("Mic2 Playback Volume",
915 SUN6I_CODEC_OM_PA_CTRL, SUN6I_CODEC_OM_PA_CTRL_MIC2G,
916 0x7, 0, sun6i_codec_out_mixer_pregain_scale),
917
918 /* Microphone Amp boost gains */
919 SOC_SINGLE_TLV("Mic1 Boost Volume", SUN6I_CODEC_MIC_CTRL,
920 SUN6I_CODEC_MIC_CTRL_MIC1BOOST, 0x7, 0,
921 sun6i_codec_mic_gain_scale),
922 SOC_SINGLE_TLV("Mic2 Boost Volume", SUN6I_CODEC_MIC_CTRL,
923 SUN6I_CODEC_MIC_CTRL_MIC2BOOST, 0x7, 0,
924 sun6i_codec_mic_gain_scale),
925 SOC_DOUBLE_TLV("ADC Capture Volume",
926 SUN6I_CODEC_ADC_ACTL, SUN6I_CODEC_ADC_ACTL_ADCLG,
927 SUN6I_CODEC_ADC_ACTL_ADCRG, 0x7, 0,
928 sun6i_codec_out_mixer_pregain_scale),
929};
930
931static const struct snd_soc_dapm_widget sun6i_codec_codec_dapm_widgets[] = {
932 /* Microphone inputs */
933 SND_SOC_DAPM_INPUT("MIC1"),
934 SND_SOC_DAPM_INPUT("MIC2"),
935 SND_SOC_DAPM_INPUT("MIC3"),
936
937 /* Microphone Bias */
938 SND_SOC_DAPM_SUPPLY("HBIAS", SUN6I_CODEC_MIC_CTRL,
939 SUN6I_CODEC_MIC_CTRL_HBIASEN, 0, NULL, 0),
940 SND_SOC_DAPM_SUPPLY("MBIAS", SUN6I_CODEC_MIC_CTRL,
941 SUN6I_CODEC_MIC_CTRL_MBIASEN, 0, NULL, 0),
942
943 /* Mic input path */
944 SND_SOC_DAPM_MUX("Mic2 Amplifier Source Route",
945 SND_SOC_NOPM, 0, 0, sun6i_codec_mic2_src),
946 SND_SOC_DAPM_PGA("Mic1 Amplifier", SUN6I_CODEC_MIC_CTRL,
947 SUN6I_CODEC_MIC_CTRL_MIC1AMPEN, 0, NULL, 0),
948 SND_SOC_DAPM_PGA("Mic2 Amplifier", SUN6I_CODEC_MIC_CTRL,
949 SUN6I_CODEC_MIC_CTRL_MIC2AMPEN, 0, NULL, 0),
950
951 /* Line In */
952 SND_SOC_DAPM_INPUT("LINEIN"),
953
954 /* Digital parts of the ADCs */
955 SND_SOC_DAPM_SUPPLY("ADC Enable", SUN6I_CODEC_ADC_FIFOC,
956 SUN6I_CODEC_ADC_FIFOC_EN_AD, 0,
957 NULL, 0),
958
959 /* Analog parts of the ADCs */
960 SND_SOC_DAPM_ADC("Left ADC", "Codec Capture", SUN6I_CODEC_ADC_ACTL,
961 SUN6I_CODEC_ADC_ACTL_ADCLEN, 0),
962 SND_SOC_DAPM_ADC("Right ADC", "Codec Capture", SUN6I_CODEC_ADC_ACTL,
963 SUN6I_CODEC_ADC_ACTL_ADCREN, 0),
964
965 /* ADC Mixers */
966 SOC_MIXER_ARRAY("Left ADC Mixer", SND_SOC_NOPM, 0, 0,
967 sun6i_codec_adc_mixer_controls),
968 SOC_MIXER_ARRAY("Right ADC Mixer", SND_SOC_NOPM, 0, 0,
969 sun6i_codec_adc_mixer_controls),
970
971 /* Digital parts of the DACs */
972 SND_SOC_DAPM_SUPPLY("DAC Enable", SUN4I_CODEC_DAC_DPC,
973 SUN4I_CODEC_DAC_DPC_EN_DA, 0,
974 NULL, 0),
975
976 /* Analog parts of the DACs */
977 SND_SOC_DAPM_DAC("Left DAC", "Codec Playback",
978 SUN6I_CODEC_OM_DACA_CTRL,
979 SUN6I_CODEC_OM_DACA_CTRL_DACALEN, 0),
980 SND_SOC_DAPM_DAC("Right DAC", "Codec Playback",
981 SUN6I_CODEC_OM_DACA_CTRL,
982 SUN6I_CODEC_OM_DACA_CTRL_DACAREN, 0),
983
984 /* Mixers */
985 SOC_MIXER_ARRAY("Left Mixer", SUN6I_CODEC_OM_DACA_CTRL,
986 SUN6I_CODEC_OM_DACA_CTRL_LMIXEN, 0,
987 sun6i_codec_mixer_controls),
988 SOC_MIXER_ARRAY("Right Mixer", SUN6I_CODEC_OM_DACA_CTRL,
989 SUN6I_CODEC_OM_DACA_CTRL_RMIXEN, 0,
990 sun6i_codec_mixer_controls),
991
992 /* Headphone output path */
993 SND_SOC_DAPM_MUX("Headphone Source Playback Route",
994 SND_SOC_NOPM, 0, 0, sun6i_codec_hp_src),
995 SND_SOC_DAPM_OUT_DRV("Headphone Amp", SUN6I_CODEC_OM_PA_CTRL,
996 SUN6I_CODEC_OM_PA_CTRL_HPPAEN, 0, NULL, 0),
997 SND_SOC_DAPM_SUPPLY("HPCOM Protection", SUN6I_CODEC_OM_PA_CTRL,
998 SUN6I_CODEC_OM_PA_CTRL_COMPTEN, 0, NULL, 0),
999 SND_SOC_DAPM_REG(snd_soc_dapm_supply, "HPCOM", SUN6I_CODEC_OM_PA_CTRL,
1000 SUN6I_CODEC_OM_PA_CTRL_HPCOM_CTL, 0x3, 0x3, 0),
1001 SND_SOC_DAPM_OUTPUT("HP"),
1002
1003 /* Line Out path */
1004 SND_SOC_DAPM_MUX("Line Out Source Playback Route",
1005 SND_SOC_NOPM, 0, 0, sun6i_codec_lineout_src),
1006 SND_SOC_DAPM_OUTPUT("LINEOUT"),
1007};
1008
1009static const struct snd_soc_dapm_route sun6i_codec_codec_dapm_routes[] = {
1010 /* DAC Routes */
1011 { "Left DAC", NULL, "DAC Enable" },
1012 { "Right DAC", NULL, "DAC Enable" },
1013
1014 /* Microphone Routes */
1015 { "Mic1 Amplifier", NULL, "MIC1"},
1016 { "Mic2 Amplifier Source Route", "Mic2", "MIC2" },
1017 { "Mic2 Amplifier Source Route", "Mic3", "MIC3" },
1018 { "Mic2 Amplifier", NULL, "Mic2 Amplifier Source Route"},
1019
1020 /* Left Mixer Routes */
1021 { "Left Mixer", "DAC Playback Switch", "Left DAC" },
1022 { "Left Mixer", "DAC Reversed Playback Switch", "Right DAC" },
1023 { "Left Mixer", "Line In Playback Switch", "LINEIN" },
1024 { "Left Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
1025 { "Left Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
1026
1027 /* Right Mixer Routes */
1028 { "Right Mixer", "DAC Playback Switch", "Right DAC" },
1029 { "Right Mixer", "DAC Reversed Playback Switch", "Left DAC" },
1030 { "Right Mixer", "Line In Playback Switch", "LINEIN" },
1031 { "Right Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
1032 { "Right Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
1033
1034 /* Left ADC Mixer Routes */
1035 { "Left ADC Mixer", "Mixer Capture Switch", "Left Mixer" },
1036 { "Left ADC Mixer", "Mixer Reversed Capture Switch", "Right Mixer" },
1037 { "Left ADC Mixer", "Line In Capture Switch", "LINEIN" },
1038 { "Left ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
1039 { "Left ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
1040
1041 /* Right ADC Mixer Routes */
1042 { "Right ADC Mixer", "Mixer Capture Switch", "Right Mixer" },
1043 { "Right ADC Mixer", "Mixer Reversed Capture Switch", "Left Mixer" },
1044 { "Right ADC Mixer", "Line In Capture Switch", "LINEIN" },
1045 { "Right ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
1046 { "Right ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
1047
1048 /* Headphone Routes */
1049 { "Headphone Source Playback Route", "DAC", "Left DAC" },
1050 { "Headphone Source Playback Route", "DAC", "Right DAC" },
1051 { "Headphone Source Playback Route", "Mixer", "Left Mixer" },
1052 { "Headphone Source Playback Route", "Mixer", "Right Mixer" },
1053 { "Headphone Amp", NULL, "Headphone Source Playback Route" },
1054 { "HP", NULL, "Headphone Amp" },
1055 { "HPCOM", NULL, "HPCOM Protection" },
1056
1057 /* Line Out Routes */
1058 { "Line Out Source Playback Route", "Stereo", "Left Mixer" },
1059 { "Line Out Source Playback Route", "Stereo", "Right Mixer" },
1060 { "Line Out Source Playback Route", "Mono Differential", "Left Mixer" },
1061 { "LINEOUT", NULL, "Line Out Source Playback Route" },
1062
1063 /* ADC Routes */
1064 { "Left ADC", NULL, "ADC Enable" },
1065 { "Right ADC", NULL, "ADC Enable" },
1066 { "Left ADC", NULL, "Left ADC Mixer" },
1067 { "Right ADC", NULL, "Right ADC Mixer" },
1068};
1069
1070static struct snd_soc_codec_driver sun6i_codec_codec = {
1071 .component_driver = {
1072 .controls = sun6i_codec_codec_widgets,
1073 .num_controls = ARRAY_SIZE(sun6i_codec_codec_widgets),
1074 .dapm_widgets = sun6i_codec_codec_dapm_widgets,
1075 .num_dapm_widgets = ARRAY_SIZE(sun6i_codec_codec_dapm_widgets),
1076 .dapm_routes = sun6i_codec_codec_dapm_routes,
1077 .num_dapm_routes = ARRAY_SIZE(sun6i_codec_codec_dapm_routes),
1078 },
1079};
1080
1081/* sun8i A23 codec */
1082static const struct snd_kcontrol_new sun8i_a23_codec_codec_controls[] = {
1083 SOC_SINGLE_TLV("DAC Playback Volume", SUN4I_CODEC_DAC_DPC,
1084 SUN4I_CODEC_DAC_DPC_DVOL, 0x3f, 1,
1085 sun6i_codec_dvol_scale),
1086};
1087
1088static const struct snd_soc_dapm_widget sun8i_a23_codec_codec_widgets[] = {
1089 /* Digital parts of the ADCs */
1090 SND_SOC_DAPM_SUPPLY("ADC Enable", SUN6I_CODEC_ADC_FIFOC,
1091 SUN6I_CODEC_ADC_FIFOC_EN_AD, 0, NULL, 0),
1092 /* Digital parts of the DACs */
1093 SND_SOC_DAPM_SUPPLY("DAC Enable", SUN4I_CODEC_DAC_DPC,
1094 SUN4I_CODEC_DAC_DPC_EN_DA, 0, NULL, 0),
1095
1096};
1097
1098static struct snd_soc_codec_driver sun8i_a23_codec_codec = {
1099 .component_driver = {
1100 .controls = sun8i_a23_codec_codec_controls,
1101 .num_controls = ARRAY_SIZE(sun8i_a23_codec_codec_controls),
1102 .dapm_widgets = sun8i_a23_codec_codec_widgets,
1103 .num_dapm_widgets = ARRAY_SIZE(sun8i_a23_codec_codec_widgets),
1104 },
1105};
1106
641static const struct snd_soc_component_driver sun4i_codec_component = { 1107static const struct snd_soc_component_driver sun4i_codec_component = {
642 .name = "sun4i-codec", 1108 .name = "sun4i-codec",
643}; 1109};
@@ -678,45 +1144,6 @@ static struct snd_soc_dai_driver dummy_cpu_dai = {
678 }, 1144 },
679}; 1145};
680 1146
681static const struct regmap_config sun4i_codec_regmap_config = {
682 .reg_bits = 32,
683 .reg_stride = 4,
684 .val_bits = 32,
685 .max_register = SUN4I_CODEC_ADC_RXCNT,
686};
687
688static const struct regmap_config sun7i_codec_regmap_config = {
689 .reg_bits = 32,
690 .reg_stride = 4,
691 .val_bits = 32,
692 .max_register = SUN7I_CODEC_AC_MIC_PHONE_CAL,
693};
694
695struct sun4i_codec_quirks {
696 const struct regmap_config *regmap_config;
697};
698
699static const struct sun4i_codec_quirks sun4i_codec_quirks = {
700 .regmap_config = &sun4i_codec_regmap_config,
701};
702
703static const struct sun4i_codec_quirks sun7i_codec_quirks = {
704 .regmap_config = &sun7i_codec_regmap_config,
705};
706
707static const struct of_device_id sun4i_codec_of_match[] = {
708 {
709 .compatible = "allwinner,sun4i-a10-codec",
710 .data = &sun4i_codec_quirks,
711 },
712 {
713 .compatible = "allwinner,sun7i-a20-codec",
714 .data = &sun7i_codec_quirks,
715 },
716 {}
717};
718MODULE_DEVICE_TABLE(of, sun4i_codec_of_match);
719
720static struct snd_soc_dai_link *sun4i_codec_create_link(struct device *dev, 1147static struct snd_soc_dai_link *sun4i_codec_create_link(struct device *dev,
721 int *num_links) 1148 int *num_links)
722{ 1149{
@@ -781,6 +1208,259 @@ static struct snd_soc_card *sun4i_codec_create_card(struct device *dev)
781 return card; 1208 return card;
782}; 1209};
783 1210
1211static const struct snd_soc_dapm_widget sun6i_codec_card_dapm_widgets[] = {
1212 SND_SOC_DAPM_HP("Headphone", NULL),
1213 SND_SOC_DAPM_LINE("Line In", NULL),
1214 SND_SOC_DAPM_LINE("Line Out", NULL),
1215 SND_SOC_DAPM_MIC("Headset Mic", NULL),
1216 SND_SOC_DAPM_MIC("Mic", NULL),
1217 SND_SOC_DAPM_SPK("Speaker", sun4i_codec_spk_event),
1218};
1219
1220static struct snd_soc_card *sun6i_codec_create_card(struct device *dev)
1221{
1222 struct snd_soc_card *card;
1223 int ret;
1224
1225 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
1226 if (!card)
1227 return ERR_PTR(-ENOMEM);
1228
1229 card->dai_link = sun4i_codec_create_link(dev, &card->num_links);
1230 if (!card->dai_link)
1231 return ERR_PTR(-ENOMEM);
1232
1233 card->dev = dev;
1234 card->name = "A31 Audio Codec";
1235 card->dapm_widgets = sun6i_codec_card_dapm_widgets;
1236 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets);
1237 card->fully_routed = true;
1238
1239 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing");
1240 if (ret)
1241 dev_warn(dev, "failed to parse audio-routing: %d\n", ret);
1242
1243 return card;
1244};
1245
1246/* Connect digital side enables to analog side widgets */
1247static const struct snd_soc_dapm_route sun8i_codec_card_routes[] = {
1248 /* ADC Routes */
1249 { "Left ADC", NULL, "ADC Enable" },
1250 { "Right ADC", NULL, "ADC Enable" },
1251 { "Codec Capture", NULL, "Left ADC" },
1252 { "Codec Capture", NULL, "Right ADC" },
1253
1254 /* DAC Routes */
1255 { "Left DAC", NULL, "DAC Enable" },
1256 { "Right DAC", NULL, "DAC Enable" },
1257 { "Left DAC", NULL, "Codec Playback" },
1258 { "Right DAC", NULL, "Codec Playback" },
1259};
1260
1261static struct snd_soc_aux_dev aux_dev = {
1262 .name = "Codec Analog Controls",
1263};
1264
1265static struct snd_soc_card *sun8i_a23_codec_create_card(struct device *dev)
1266{
1267 struct snd_soc_card *card;
1268 int ret;
1269
1270 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
1271 if (!card)
1272 return ERR_PTR(-ENOMEM);
1273
1274 aux_dev.codec_of_node = of_parse_phandle(dev->of_node,
1275 "allwinner,codec-analog-controls",
1276 0);
1277 if (!aux_dev.codec_of_node) {
1278 dev_err(dev, "Can't find analog controls for codec.\n");
1279 return ERR_PTR(-EINVAL);
1280 };
1281
1282 card->dai_link = sun4i_codec_create_link(dev, &card->num_links);
1283 if (!card->dai_link)
1284 return ERR_PTR(-ENOMEM);
1285
1286 card->dev = dev;
1287 card->name = "A23 Audio Codec";
1288 card->dapm_widgets = sun6i_codec_card_dapm_widgets;
1289 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets);
1290 card->dapm_routes = sun8i_codec_card_routes;
1291 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes);
1292 card->aux_dev = &aux_dev;
1293 card->num_aux_devs = 1;
1294 card->fully_routed = true;
1295
1296 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing");
1297 if (ret)
1298 dev_warn(dev, "failed to parse audio-routing: %d\n", ret);
1299
1300 return card;
1301};
1302
1303static struct snd_soc_card *sun8i_h3_codec_create_card(struct device *dev)
1304{
1305 struct snd_soc_card *card;
1306 int ret;
1307
1308 card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
1309 if (!card)
1310 return ERR_PTR(-ENOMEM);
1311
1312 aux_dev.codec_of_node = of_parse_phandle(dev->of_node,
1313 "allwinner,codec-analog-controls",
1314 0);
1315 if (!aux_dev.codec_of_node) {
1316 dev_err(dev, "Can't find analog controls for codec.\n");
1317 return ERR_PTR(-EINVAL);
1318 };
1319
1320 card->dai_link = sun4i_codec_create_link(dev, &card->num_links);
1321 if (!card->dai_link)
1322 return ERR_PTR(-ENOMEM);
1323
1324 card->dev = dev;
1325 card->name = "H3 Audio Codec";
1326 card->dapm_widgets = sun6i_codec_card_dapm_widgets;
1327 card->num_dapm_widgets = ARRAY_SIZE(sun6i_codec_card_dapm_widgets);
1328 card->dapm_routes = sun8i_codec_card_routes;
1329 card->num_dapm_routes = ARRAY_SIZE(sun8i_codec_card_routes);
1330 card->aux_dev = &aux_dev;
1331 card->num_aux_devs = 1;
1332 card->fully_routed = true;
1333
1334 ret = snd_soc_of_parse_audio_routing(card, "allwinner,audio-routing");
1335 if (ret)
1336 dev_warn(dev, "failed to parse audio-routing: %d\n", ret);
1337
1338 return card;
1339};
1340
1341static const struct regmap_config sun4i_codec_regmap_config = {
1342 .reg_bits = 32,
1343 .reg_stride = 4,
1344 .val_bits = 32,
1345 .max_register = SUN4I_CODEC_ADC_RXCNT,
1346};
1347
1348static const struct regmap_config sun6i_codec_regmap_config = {
1349 .reg_bits = 32,
1350 .reg_stride = 4,
1351 .val_bits = 32,
1352 .max_register = SUN6I_CODEC_HMIC_DATA,
1353};
1354
1355static const struct regmap_config sun7i_codec_regmap_config = {
1356 .reg_bits = 32,
1357 .reg_stride = 4,
1358 .val_bits = 32,
1359 .max_register = SUN7I_CODEC_AC_MIC_PHONE_CAL,
1360};
1361
1362static const struct regmap_config sun8i_a23_codec_regmap_config = {
1363 .reg_bits = 32,
1364 .reg_stride = 4,
1365 .val_bits = 32,
1366 .max_register = SUN8I_A23_CODEC_ADC_RXCNT,
1367};
1368
1369static const struct regmap_config sun8i_h3_codec_regmap_config = {
1370 .reg_bits = 32,
1371 .reg_stride = 4,
1372 .val_bits = 32,
1373 .max_register = SUN8I_H3_CODEC_ADC_DBG,
1374};
1375
1376struct sun4i_codec_quirks {
1377 const struct regmap_config *regmap_config;
1378 const struct snd_soc_codec_driver *codec;
1379 struct snd_soc_card * (*create_card)(struct device *dev);
1380 struct reg_field reg_adc_fifoc; /* used for regmap_field */
1381 unsigned int reg_dac_txdata; /* TX FIFO offset for DMA config */
1382 unsigned int reg_adc_rxdata; /* RX FIFO offset for DMA config */
1383 bool has_reset;
1384};
1385
1386static const struct sun4i_codec_quirks sun4i_codec_quirks = {
1387 .regmap_config = &sun4i_codec_regmap_config,
1388 .codec = &sun4i_codec_codec,
1389 .create_card = sun4i_codec_create_card,
1390 .reg_adc_fifoc = REG_FIELD(SUN4I_CODEC_ADC_FIFOC, 0, 31),
1391 .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
1392 .reg_adc_rxdata = SUN4I_CODEC_ADC_RXDATA,
1393};
1394
1395static const struct sun4i_codec_quirks sun6i_a31_codec_quirks = {
1396 .regmap_config = &sun6i_codec_regmap_config,
1397 .codec = &sun6i_codec_codec,
1398 .create_card = sun6i_codec_create_card,
1399 .reg_adc_fifoc = REG_FIELD(SUN6I_CODEC_ADC_FIFOC, 0, 31),
1400 .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
1401 .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
1402 .has_reset = true,
1403};
1404
1405static const struct sun4i_codec_quirks sun7i_codec_quirks = {
1406 .regmap_config = &sun7i_codec_regmap_config,
1407 .codec = &sun4i_codec_codec,
1408 .create_card = sun4i_codec_create_card,
1409 .reg_adc_fifoc = REG_FIELD(SUN4I_CODEC_ADC_FIFOC, 0, 31),
1410 .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
1411 .reg_adc_rxdata = SUN4I_CODEC_ADC_RXDATA,
1412};
1413
1414static const struct sun4i_codec_quirks sun8i_a23_codec_quirks = {
1415 .regmap_config = &sun8i_a23_codec_regmap_config,
1416 .codec = &sun8i_a23_codec_codec,
1417 .create_card = sun8i_a23_codec_create_card,
1418 .reg_adc_fifoc = REG_FIELD(SUN6I_CODEC_ADC_FIFOC, 0, 31),
1419 .reg_dac_txdata = SUN4I_CODEC_DAC_TXDATA,
1420 .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
1421 .has_reset = true,
1422};
1423
1424static const struct sun4i_codec_quirks sun8i_h3_codec_quirks = {
1425 .regmap_config = &sun8i_h3_codec_regmap_config,
1426 /*
1427 * TODO Share the codec structure with A23 for now.
1428 * This should be split out when adding digital audio
1429 * processing support for the H3.
1430 */
1431 .codec = &sun8i_a23_codec_codec,
1432 .create_card = sun8i_h3_codec_create_card,
1433 .reg_adc_fifoc = REG_FIELD(SUN6I_CODEC_ADC_FIFOC, 0, 31),
1434 .reg_dac_txdata = SUN8I_H3_CODEC_DAC_TXDATA,
1435 .reg_adc_rxdata = SUN6I_CODEC_ADC_RXDATA,
1436 .has_reset = true,
1437};
1438
1439static const struct of_device_id sun4i_codec_of_match[] = {
1440 {
1441 .compatible = "allwinner,sun4i-a10-codec",
1442 .data = &sun4i_codec_quirks,
1443 },
1444 {
1445 .compatible = "allwinner,sun6i-a31-codec",
1446 .data = &sun6i_a31_codec_quirks,
1447 },
1448 {
1449 .compatible = "allwinner,sun7i-a20-codec",
1450 .data = &sun7i_codec_quirks,
1451 },
1452 {
1453 .compatible = "allwinner,sun8i-a23-codec",
1454 .data = &sun8i_a23_codec_quirks,
1455 },
1456 {
1457 .compatible = "allwinner,sun8i-h3-codec",
1458 .data = &sun8i_h3_codec_quirks,
1459 },
1460 {}
1461};
1462MODULE_DEVICE_TABLE(of, sun4i_codec_of_match);
1463
784static int sun4i_codec_probe(struct platform_device *pdev) 1464static int sun4i_codec_probe(struct platform_device *pdev)
785{ 1465{
786 struct snd_soc_card *card; 1466 struct snd_soc_card *card;
@@ -829,6 +1509,14 @@ static int sun4i_codec_probe(struct platform_device *pdev)
829 return PTR_ERR(scodec->clk_module); 1509 return PTR_ERR(scodec->clk_module);
830 } 1510 }
831 1511
1512 if (quirks->has_reset) {
1513 scodec->rst = devm_reset_control_get(&pdev->dev, NULL);
1514 if (IS_ERR(scodec->rst)) {
1515 dev_err(&pdev->dev, "Failed to get reset control\n");
1516 return PTR_ERR(scodec->rst);
1517 }
1518 }
1519
832 scodec->gpio_pa = devm_gpiod_get_optional(&pdev->dev, "allwinner,pa", 1520 scodec->gpio_pa = devm_gpiod_get_optional(&pdev->dev, "allwinner,pa",
833 GPIOD_OUT_LOW); 1521 GPIOD_OUT_LOW);
834 if (IS_ERR(scodec->gpio_pa)) { 1522 if (IS_ERR(scodec->gpio_pa)) {
@@ -838,27 +1526,48 @@ static int sun4i_codec_probe(struct platform_device *pdev)
838 return ret; 1526 return ret;
839 } 1527 }
840 1528
1529 /* reg_field setup */
1530 scodec->reg_adc_fifoc = devm_regmap_field_alloc(&pdev->dev,
1531 scodec->regmap,
1532 quirks->reg_adc_fifoc);
1533 if (IS_ERR(scodec->reg_adc_fifoc)) {
1534 ret = PTR_ERR(scodec->reg_adc_fifoc);
1535 dev_err(&pdev->dev, "Failed to create regmap fields: %d\n",
1536 ret);
1537 return ret;
1538 }
1539
841 /* Enable the bus clock */ 1540 /* Enable the bus clock */
842 if (clk_prepare_enable(scodec->clk_apb)) { 1541 if (clk_prepare_enable(scodec->clk_apb)) {
843 dev_err(&pdev->dev, "Failed to enable the APB clock\n"); 1542 dev_err(&pdev->dev, "Failed to enable the APB clock\n");
844 return -EINVAL; 1543 return -EINVAL;
845 } 1544 }
846 1545
1546 /* Deassert the reset control */
1547 if (scodec->rst) {
1548 ret = reset_control_deassert(scodec->rst);
1549 if (ret) {
1550 dev_err(&pdev->dev,
1551 "Failed to deassert the reset control\n");
1552 goto err_clk_disable;
1553 }
1554 }
1555
847 /* DMA configuration for TX FIFO */ 1556 /* DMA configuration for TX FIFO */
848 scodec->playback_dma_data.addr = res->start + SUN4I_CODEC_DAC_TXDATA; 1557 scodec->playback_dma_data.addr = res->start + quirks->reg_dac_txdata;
849 scodec->playback_dma_data.maxburst = 4; 1558 scodec->playback_dma_data.maxburst = 8;
850 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; 1559 scodec->playback_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
851 1560
852 /* DMA configuration for RX FIFO */ 1561 /* DMA configuration for RX FIFO */
853 scodec->capture_dma_data.addr = res->start + SUN4I_CODEC_ADC_RXDATA; 1562 scodec->capture_dma_data.addr = res->start + quirks->reg_adc_rxdata;
854 scodec->capture_dma_data.maxburst = 4; 1563 scodec->capture_dma_data.maxburst = 8;
855 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; 1564 scodec->capture_dma_data.addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES;
856 1565
857 ret = snd_soc_register_codec(&pdev->dev, &sun4i_codec_codec, 1566 ret = snd_soc_register_codec(&pdev->dev, quirks->codec,
858 &sun4i_codec_dai, 1); 1567 &sun4i_codec_dai, 1);
859 if (ret) { 1568 if (ret) {
860 dev_err(&pdev->dev, "Failed to register our codec\n"); 1569 dev_err(&pdev->dev, "Failed to register our codec\n");
861 goto err_clk_disable; 1570 goto err_assert_reset;
862 } 1571 }
863 1572
864 ret = devm_snd_soc_register_component(&pdev->dev, 1573 ret = devm_snd_soc_register_component(&pdev->dev,
@@ -875,7 +1584,7 @@ static int sun4i_codec_probe(struct platform_device *pdev)
875 goto err_unregister_codec; 1584 goto err_unregister_codec;
876 } 1585 }
877 1586
878 card = sun4i_codec_create_card(&pdev->dev); 1587 card = quirks->create_card(&pdev->dev);
879 if (IS_ERR(card)) { 1588 if (IS_ERR(card)) {
880 ret = PTR_ERR(card); 1589 ret = PTR_ERR(card);
881 dev_err(&pdev->dev, "Failed to create our card\n"); 1590 dev_err(&pdev->dev, "Failed to create our card\n");
@@ -895,6 +1604,9 @@ static int sun4i_codec_probe(struct platform_device *pdev)
895 1604
896err_unregister_codec: 1605err_unregister_codec:
897 snd_soc_unregister_codec(&pdev->dev); 1606 snd_soc_unregister_codec(&pdev->dev);
1607err_assert_reset:
1608 if (scodec->rst)
1609 reset_control_assert(scodec->rst);
898err_clk_disable: 1610err_clk_disable:
899 clk_disable_unprepare(scodec->clk_apb); 1611 clk_disable_unprepare(scodec->clk_apb);
900 return ret; 1612 return ret;
@@ -907,6 +1619,8 @@ static int sun4i_codec_remove(struct platform_device *pdev)
907 1619
908 snd_soc_unregister_card(card); 1620 snd_soc_unregister_card(card);
909 snd_soc_unregister_codec(&pdev->dev); 1621 snd_soc_unregister_codec(&pdev->dev);
1622 if (scodec->rst)
1623 reset_control_assert(scodec->rst);
910 clk_disable_unprepare(scodec->clk_apb); 1624 clk_disable_unprepare(scodec->clk_apb);
911 1625
912 return 0; 1626 return 0;
@@ -926,4 +1640,5 @@ MODULE_DESCRIPTION("Allwinner A10 codec driver");
926MODULE_AUTHOR("Emilio López <emilio@elopez.com.ar>"); 1640MODULE_AUTHOR("Emilio López <emilio@elopez.com.ar>");
927MODULE_AUTHOR("Jon Smirl <jonsmirl@gmail.com>"); 1641MODULE_AUTHOR("Jon Smirl <jonsmirl@gmail.com>");
928MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>"); 1642MODULE_AUTHOR("Maxime Ripard <maxime.ripard@free-electrons.com>");
1643MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");
929MODULE_LICENSE("GPL"); 1644MODULE_LICENSE("GPL");
diff --git a/sound/soc/sunxi/sun4i-i2s.c b/sound/soc/sunxi/sun4i-i2s.c
index 687a8f83dbe5..f24d19526603 100644
--- a/sound/soc/sunxi/sun4i-i2s.c
+++ b/sound/soc/sunxi/sun4i-i2s.c
@@ -93,6 +93,9 @@ struct sun4i_i2s {
93 struct clk *mod_clk; 93 struct clk *mod_clk;
94 struct regmap *regmap; 94 struct regmap *regmap;
95 95
96 unsigned int mclk_freq;
97
98 struct snd_dmaengine_dai_dma_data capture_dma_data;
96 struct snd_dmaengine_dai_dma_data playback_dma_data; 99 struct snd_dmaengine_dai_dma_data playback_dma_data;
97}; 100};
98 101
@@ -157,14 +160,24 @@ static int sun4i_i2s_get_mclk_div(struct sun4i_i2s *i2s,
157} 160}
158 161
159static int sun4i_i2s_oversample_rates[] = { 128, 192, 256, 384, 512, 768 }; 162static int sun4i_i2s_oversample_rates[] = { 128, 192, 256, 384, 512, 768 };
163static bool sun4i_i2s_oversample_is_valid(unsigned int oversample)
164{
165 int i;
166
167 for (i = 0; i < ARRAY_SIZE(sun4i_i2s_oversample_rates); i++)
168 if (sun4i_i2s_oversample_rates[i] == oversample)
169 return true;
170
171 return false;
172}
160 173
161static int sun4i_i2s_set_clk_rate(struct sun4i_i2s *i2s, 174static int sun4i_i2s_set_clk_rate(struct sun4i_i2s *i2s,
162 unsigned int rate, 175 unsigned int rate,
163 unsigned int word_size) 176 unsigned int word_size)
164{ 177{
165 unsigned int clk_rate; 178 unsigned int oversample_rate, clk_rate;
166 int bclk_div, mclk_div; 179 int bclk_div, mclk_div;
167 int ret, i; 180 int ret;
168 181
169 switch (rate) { 182 switch (rate) {
170 case 176400: 183 case 176400:
@@ -196,21 +209,18 @@ static int sun4i_i2s_set_clk_rate(struct sun4i_i2s *i2s,
196 if (ret) 209 if (ret)
197 return ret; 210 return ret;
198 211
199 /* Always favor the highest oversampling rate */ 212 oversample_rate = i2s->mclk_freq / rate;
200 for (i = (ARRAY_SIZE(sun4i_i2s_oversample_rates) - 1); i >= 0; i--) { 213 if (!sun4i_i2s_oversample_is_valid(oversample_rate))
201 unsigned int oversample_rate = sun4i_i2s_oversample_rates[i]; 214 return -EINVAL;
202
203 bclk_div = sun4i_i2s_get_bclk_div(i2s, oversample_rate,
204 word_size);
205 mclk_div = sun4i_i2s_get_mclk_div(i2s, oversample_rate,
206 clk_rate,
207 rate);
208 215
209 if ((bclk_div >= 0) && (mclk_div >= 0)) 216 bclk_div = sun4i_i2s_get_bclk_div(i2s, oversample_rate,
210 break; 217 word_size);
211 } 218 if (bclk_div < 0)
219 return -EINVAL;
212 220
213 if ((bclk_div < 0) || (mclk_div < 0)) 221 mclk_div = sun4i_i2s_get_mclk_div(i2s, oversample_rate,
222 clk_rate, rate);
223 if (mclk_div < 0)
214 return -EINVAL; 224 return -EINVAL;
215 225
216 regmap_write(i2s->regmap, SUN4I_I2S_CLK_DIV_REG, 226 regmap_write(i2s->regmap, SUN4I_I2S_CLK_DIV_REG,
@@ -341,6 +351,27 @@ static int sun4i_i2s_set_fmt(struct snd_soc_dai *dai, unsigned int fmt)
341 return 0; 351 return 0;
342} 352}
343 353
354static void sun4i_i2s_start_capture(struct sun4i_i2s *i2s)
355{
356 /* Flush RX FIFO */
357 regmap_update_bits(i2s->regmap, SUN4I_I2S_FIFO_CTRL_REG,
358 SUN4I_I2S_FIFO_CTRL_FLUSH_RX,
359 SUN4I_I2S_FIFO_CTRL_FLUSH_RX);
360
361 /* Clear RX counter */
362 regmap_write(i2s->regmap, SUN4I_I2S_RX_CNT_REG, 0);
363
364 /* Enable RX Block */
365 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
366 SUN4I_I2S_CTRL_RX_EN,
367 SUN4I_I2S_CTRL_RX_EN);
368
369 /* Enable RX DRQ */
370 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG,
371 SUN4I_I2S_DMA_INT_CTRL_RX_DRQ_EN,
372 SUN4I_I2S_DMA_INT_CTRL_RX_DRQ_EN);
373}
374
344static void sun4i_i2s_start_playback(struct sun4i_i2s *i2s) 375static void sun4i_i2s_start_playback(struct sun4i_i2s *i2s)
345{ 376{
346 /* Flush TX FIFO */ 377 /* Flush TX FIFO */
@@ -362,6 +393,18 @@ static void sun4i_i2s_start_playback(struct sun4i_i2s *i2s)
362 SUN4I_I2S_DMA_INT_CTRL_TX_DRQ_EN); 393 SUN4I_I2S_DMA_INT_CTRL_TX_DRQ_EN);
363} 394}
364 395
396static void sun4i_i2s_stop_capture(struct sun4i_i2s *i2s)
397{
398 /* Disable RX Block */
399 regmap_update_bits(i2s->regmap, SUN4I_I2S_CTRL_REG,
400 SUN4I_I2S_CTRL_RX_EN,
401 0);
402
403 /* Disable RX DRQ */
404 regmap_update_bits(i2s->regmap, SUN4I_I2S_DMA_INT_CTRL_REG,
405 SUN4I_I2S_DMA_INT_CTRL_RX_DRQ_EN,
406 0);
407}
365 408
366static void sun4i_i2s_stop_playback(struct sun4i_i2s *i2s) 409static void sun4i_i2s_stop_playback(struct sun4i_i2s *i2s)
367{ 410{
@@ -388,7 +431,7 @@ static int sun4i_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
388 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 431 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
389 sun4i_i2s_start_playback(i2s); 432 sun4i_i2s_start_playback(i2s);
390 else 433 else
391 return -EINVAL; 434 sun4i_i2s_start_capture(i2s);
392 break; 435 break;
393 436
394 case SNDRV_PCM_TRIGGER_STOP: 437 case SNDRV_PCM_TRIGGER_STOP:
@@ -397,7 +440,7 @@ static int sun4i_i2s_trigger(struct snd_pcm_substream *substream, int cmd,
397 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) 440 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
398 sun4i_i2s_stop_playback(i2s); 441 sun4i_i2s_stop_playback(i2s);
399 else 442 else
400 return -EINVAL; 443 sun4i_i2s_stop_capture(i2s);
401 break; 444 break;
402 445
403 default: 446 default:
@@ -447,9 +490,23 @@ static void sun4i_i2s_shutdown(struct snd_pcm_substream *substream,
447 regmap_write(i2s->regmap, SUN4I_I2S_CTRL_REG, 0); 490 regmap_write(i2s->regmap, SUN4I_I2S_CTRL_REG, 0);
448} 491}
449 492
493static int sun4i_i2s_set_sysclk(struct snd_soc_dai *dai, int clk_id,
494 unsigned int freq, int dir)
495{
496 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
497
498 if (clk_id != 0)
499 return -EINVAL;
500
501 i2s->mclk_freq = freq;
502
503 return 0;
504}
505
450static const struct snd_soc_dai_ops sun4i_i2s_dai_ops = { 506static const struct snd_soc_dai_ops sun4i_i2s_dai_ops = {
451 .hw_params = sun4i_i2s_hw_params, 507 .hw_params = sun4i_i2s_hw_params,
452 .set_fmt = sun4i_i2s_set_fmt, 508 .set_fmt = sun4i_i2s_set_fmt,
509 .set_sysclk = sun4i_i2s_set_sysclk,
453 .shutdown = sun4i_i2s_shutdown, 510 .shutdown = sun4i_i2s_shutdown,
454 .startup = sun4i_i2s_startup, 511 .startup = sun4i_i2s_startup,
455 .trigger = sun4i_i2s_trigger, 512 .trigger = sun4i_i2s_trigger,
@@ -459,7 +516,9 @@ static int sun4i_i2s_dai_probe(struct snd_soc_dai *dai)
459{ 516{
460 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai); 517 struct sun4i_i2s *i2s = snd_soc_dai_get_drvdata(dai);
461 518
462 snd_soc_dai_init_dma_data(dai, &i2s->playback_dma_data, NULL); 519 snd_soc_dai_init_dma_data(dai,
520 &i2s->playback_dma_data,
521 &i2s->capture_dma_data);
463 522
464 snd_soc_dai_set_drvdata(dai, i2s); 523 snd_soc_dai_set_drvdata(dai, i2s);
465 524
@@ -468,6 +527,13 @@ static int sun4i_i2s_dai_probe(struct snd_soc_dai *dai)
468 527
469static struct snd_soc_dai_driver sun4i_i2s_dai = { 528static struct snd_soc_dai_driver sun4i_i2s_dai = {
470 .probe = sun4i_i2s_dai_probe, 529 .probe = sun4i_i2s_dai_probe,
530 .capture = {
531 .stream_name = "Capture",
532 .channels_min = 2,
533 .channels_max = 2,
534 .rates = SNDRV_PCM_RATE_8000_192000,
535 .formats = SNDRV_PCM_FMTBIT_S16_LE,
536 },
471 .playback = { 537 .playback = {
472 .stream_name = "Playback", 538 .stream_name = "Playback",
473 .channels_min = 2, 539 .channels_min = 2,
@@ -630,6 +696,9 @@ static int sun4i_i2s_probe(struct platform_device *pdev)
630 i2s->playback_dma_data.addr = res->start + SUN4I_I2S_FIFO_TX_REG; 696 i2s->playback_dma_data.addr = res->start + SUN4I_I2S_FIFO_TX_REG;
631 i2s->playback_dma_data.maxburst = 4; 697 i2s->playback_dma_data.maxburst = 4;
632 698
699 i2s->capture_dma_data.addr = res->start + SUN4I_I2S_FIFO_RX_REG;
700 i2s->capture_dma_data.maxburst = 4;
701
633 pm_runtime_enable(&pdev->dev); 702 pm_runtime_enable(&pdev->dev);
634 if (!pm_runtime_enabled(&pdev->dev)) { 703 if (!pm_runtime_enabled(&pdev->dev)) {
635 ret = sun4i_i2s_runtime_resume(&pdev->dev); 704 ret = sun4i_i2s_runtime_resume(&pdev->dev);
diff --git a/sound/soc/sunxi/sun8i-codec-analog.c b/sound/soc/sunxi/sun8i-codec-analog.c
new file mode 100644
index 000000000000..af02290ebe49
--- /dev/null
+++ b/sound/soc/sunxi/sun8i-codec-analog.c
@@ -0,0 +1,665 @@
1/*
2 * This driver supports the analog controls for the internal codec
3 * found in Allwinner's A31s, A23, A33 and H3 SoCs.
4 *
5 * Copyright 2016 Chen-Yu Tsai <wens@csie.org>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 */
17
18#include <linux/io.h>
19#include <linux/kernel.h>
20#include <linux/module.h>
21#include <linux/of.h>
22#include <linux/of_device.h>
23#include <linux/platform_device.h>
24#include <linux/regmap.h>
25
26#include <sound/soc.h>
27#include <sound/soc-dapm.h>
28#include <sound/tlv.h>
29
30/* Codec analog control register offsets and bit fields */
31#define SUN8I_ADDA_HP_VOLC 0x00
32#define SUN8I_ADDA_HP_VOLC_PA_CLK_GATE 7
33#define SUN8I_ADDA_HP_VOLC_HP_VOL 0
34#define SUN8I_ADDA_LOMIXSC 0x01
35#define SUN8I_ADDA_LOMIXSC_MIC1 6
36#define SUN8I_ADDA_LOMIXSC_MIC2 5
37#define SUN8I_ADDA_LOMIXSC_PHONE 4
38#define SUN8I_ADDA_LOMIXSC_PHONEN 3
39#define SUN8I_ADDA_LOMIXSC_LINEINL 2
40#define SUN8I_ADDA_LOMIXSC_DACL 1
41#define SUN8I_ADDA_LOMIXSC_DACR 0
42#define SUN8I_ADDA_ROMIXSC 0x02
43#define SUN8I_ADDA_ROMIXSC_MIC1 6
44#define SUN8I_ADDA_ROMIXSC_MIC2 5
45#define SUN8I_ADDA_ROMIXSC_PHONE 4
46#define SUN8I_ADDA_ROMIXSC_PHONEP 3
47#define SUN8I_ADDA_ROMIXSC_LINEINR 2
48#define SUN8I_ADDA_ROMIXSC_DACR 1
49#define SUN8I_ADDA_ROMIXSC_DACL 0
50#define SUN8I_ADDA_DAC_PA_SRC 0x03
51#define SUN8I_ADDA_DAC_PA_SRC_DACAREN 7
52#define SUN8I_ADDA_DAC_PA_SRC_DACALEN 6
53#define SUN8I_ADDA_DAC_PA_SRC_RMIXEN 5
54#define SUN8I_ADDA_DAC_PA_SRC_LMIXEN 4
55#define SUN8I_ADDA_DAC_PA_SRC_RHPPAMUTE 3
56#define SUN8I_ADDA_DAC_PA_SRC_LHPPAMUTE 2
57#define SUN8I_ADDA_DAC_PA_SRC_RHPIS 1
58#define SUN8I_ADDA_DAC_PA_SRC_LHPIS 0
59#define SUN8I_ADDA_PHONEIN_GCTRL 0x04
60#define SUN8I_ADDA_PHONEIN_GCTRL_PHONEPG 4
61#define SUN8I_ADDA_PHONEIN_GCTRL_PHONENG 0
62#define SUN8I_ADDA_LINEIN_GCTRL 0x05
63#define SUN8I_ADDA_LINEIN_GCTRL_LINEING 4
64#define SUN8I_ADDA_LINEIN_GCTRL_PHONEG 0
65#define SUN8I_ADDA_MICIN_GCTRL 0x06
66#define SUN8I_ADDA_MICIN_GCTRL_MIC1G 4
67#define SUN8I_ADDA_MICIN_GCTRL_MIC2G 0
68#define SUN8I_ADDA_PAEN_HP_CTRL 0x07
69#define SUN8I_ADDA_PAEN_HP_CTRL_HPPAEN 7
70#define SUN8I_ADDA_PAEN_HP_CTRL_LINEOUTEN 7 /* H3 specific */
71#define SUN8I_ADDA_PAEN_HP_CTRL_HPCOM_FC 5
72#define SUN8I_ADDA_PAEN_HP_CTRL_COMPTEN 4
73#define SUN8I_ADDA_PAEN_HP_CTRL_PA_ANTI_POP_CTRL 2
74#define SUN8I_ADDA_PAEN_HP_CTRL_LTRNMUTE 1
75#define SUN8I_ADDA_PAEN_HP_CTRL_RTLNMUTE 0
76#define SUN8I_ADDA_PHONEOUT_CTRL 0x08
77#define SUN8I_ADDA_PHONEOUT_CTRL_PHONEOUTG 5
78#define SUN8I_ADDA_PHONEOUT_CTRL_PHONEOUTEN 4
79#define SUN8I_ADDA_PHONEOUT_CTRL_PHONEOUT_MIC1 3
80#define SUN8I_ADDA_PHONEOUT_CTRL_PHONEOUT_MIC2 2
81#define SUN8I_ADDA_PHONEOUT_CTRL_PHONEOUT_RMIX 1
82#define SUN8I_ADDA_PHONEOUT_CTRL_PHONEOUT_LMIX 0
83#define SUN8I_ADDA_PHONE_GAIN_CTRL 0x09
84#define SUN8I_ADDA_PHONE_GAIN_CTRL_LINEOUT_VOL 3
85#define SUN8I_ADDA_PHONE_GAIN_CTRL_PHONEPREG 0
86#define SUN8I_ADDA_MIC2G_CTRL 0x0a
87#define SUN8I_ADDA_MIC2G_CTRL_MIC2AMPEN 7
88#define SUN8I_ADDA_MIC2G_CTRL_MIC2BOOST 4
89#define SUN8I_ADDA_MIC2G_CTRL_LINEOUTLEN 3
90#define SUN8I_ADDA_MIC2G_CTRL_LINEOUTREN 2
91#define SUN8I_ADDA_MIC2G_CTRL_LINEOUTLSRC 1
92#define SUN8I_ADDA_MIC2G_CTRL_LINEOUTRSRC 0
93#define SUN8I_ADDA_MIC1G_MICBIAS_CTRL 0x0b
94#define SUN8I_ADDA_MIC1G_MICBIAS_CTRL_HMICBIASEN 7
95#define SUN8I_ADDA_MIC1G_MICBIAS_CTRL_MMICBIASEN 6
96#define SUN8I_ADDA_MIC1G_MICBIAS_CTRL_HMICBIAS_MODE 5
97#define SUN8I_ADDA_MIC1G_MICBIAS_CTRL_MIC1AMPEN 3
98#define SUN8I_ADDA_MIC1G_MICBIAS_CTRL_MIC1BOOST 0
99#define SUN8I_ADDA_LADCMIXSC 0x0c
100#define SUN8I_ADDA_LADCMIXSC_MIC1 6
101#define SUN8I_ADDA_LADCMIXSC_MIC2 5
102#define SUN8I_ADDA_LADCMIXSC_PHONE 4
103#define SUN8I_ADDA_LADCMIXSC_PHONEN 3
104#define SUN8I_ADDA_LADCMIXSC_LINEINL 2
105#define SUN8I_ADDA_LADCMIXSC_OMIXRL 1
106#define SUN8I_ADDA_LADCMIXSC_OMIXRR 0
107#define SUN8I_ADDA_RADCMIXSC 0x0d
108#define SUN8I_ADDA_RADCMIXSC_MIC1 6
109#define SUN8I_ADDA_RADCMIXSC_MIC2 5
110#define SUN8I_ADDA_RADCMIXSC_PHONE 4
111#define SUN8I_ADDA_RADCMIXSC_PHONEP 3
112#define SUN8I_ADDA_RADCMIXSC_LINEINR 2
113#define SUN8I_ADDA_RADCMIXSC_OMIXR 1
114#define SUN8I_ADDA_RADCMIXSC_OMIXL 0
115#define SUN8I_ADDA_RES 0x0e
116#define SUN8I_ADDA_RES_MMICBIAS_SEL 4
117#define SUN8I_ADDA_RES_PA_ANTI_POP_CTRL 0
118#define SUN8I_ADDA_ADC_AP_EN 0x0f
119#define SUN8I_ADDA_ADC_AP_EN_ADCREN 7
120#define SUN8I_ADDA_ADC_AP_EN_ADCLEN 6
121#define SUN8I_ADDA_ADC_AP_EN_ADCG 0
122
123/* Analog control register access bits */
124#define ADDA_PR 0x0 /* PRCM base + 0x1c0 */
125#define ADDA_PR_RESET BIT(28)
126#define ADDA_PR_WRITE BIT(24)
127#define ADDA_PR_ADDR_SHIFT 16
128#define ADDA_PR_ADDR_MASK GENMASK(4, 0)
129#define ADDA_PR_DATA_IN_SHIFT 8
130#define ADDA_PR_DATA_IN_MASK GENMASK(7, 0)
131#define ADDA_PR_DATA_OUT_SHIFT 0
132#define ADDA_PR_DATA_OUT_MASK GENMASK(7, 0)
133
134/* regmap access bits */
135static int adda_reg_read(void *context, unsigned int reg, unsigned int *val)
136{
137 void __iomem *base = (void __iomem *)context;
138 u32 tmp;
139
140 /* De-assert reset */
141 writel(readl(base) | ADDA_PR_RESET, base);
142
143 /* Clear write bit */
144 writel(readl(base) & ~ADDA_PR_WRITE, base);
145
146 /* Set register address */
147 tmp = readl(base);
148 tmp &= ~(ADDA_PR_ADDR_MASK << ADDA_PR_ADDR_SHIFT);
149 tmp |= (reg & ADDA_PR_ADDR_MASK) << ADDA_PR_ADDR_SHIFT;
150 writel(tmp, base);
151
152 /* Read back value */
153 *val = readl(base) & ADDA_PR_DATA_OUT_MASK;
154
155 return 0;
156}
157
158static int adda_reg_write(void *context, unsigned int reg, unsigned int val)
159{
160 void __iomem *base = (void __iomem *)context;
161 u32 tmp;
162
163 /* De-assert reset */
164 writel(readl(base) | ADDA_PR_RESET, base);
165
166 /* Set register address */
167 tmp = readl(base);
168 tmp &= ~(ADDA_PR_ADDR_MASK << ADDA_PR_ADDR_SHIFT);
169 tmp |= (reg & ADDA_PR_ADDR_MASK) << ADDA_PR_ADDR_SHIFT;
170 writel(tmp, base);
171
172 /* Set data to write */
173 tmp = readl(base);
174 tmp &= ~(ADDA_PR_DATA_IN_MASK << ADDA_PR_DATA_IN_SHIFT);
175 tmp |= (val & ADDA_PR_DATA_IN_MASK) << ADDA_PR_DATA_IN_SHIFT;
176 writel(tmp, base);
177
178 /* Set write bit to signal a write */
179 writel(readl(base) | ADDA_PR_WRITE, base);
180
181 /* Clear write bit */
182 writel(readl(base) & ~ADDA_PR_WRITE, base);
183
184 return 0;
185}
186
187static const struct regmap_config adda_pr_regmap_cfg = {
188 .name = "adda-pr",
189 .reg_bits = 5,
190 .reg_stride = 1,
191 .val_bits = 8,
192 .reg_read = adda_reg_read,
193 .reg_write = adda_reg_write,
194 .fast_io = true,
195 .max_register = 24,
196};
197
198/* mixer controls */
199static const struct snd_kcontrol_new sun8i_codec_mixer_controls[] = {
200 SOC_DAPM_DOUBLE_R("DAC Playback Switch",
201 SUN8I_ADDA_LOMIXSC,
202 SUN8I_ADDA_ROMIXSC,
203 SUN8I_ADDA_LOMIXSC_DACL, 1, 0),
204 SOC_DAPM_DOUBLE_R("DAC Reversed Playback Switch",
205 SUN8I_ADDA_LOMIXSC,
206 SUN8I_ADDA_ROMIXSC,
207 SUN8I_ADDA_LOMIXSC_DACR, 1, 0),
208 SOC_DAPM_DOUBLE_R("Line In Playback Switch",
209 SUN8I_ADDA_LOMIXSC,
210 SUN8I_ADDA_ROMIXSC,
211 SUN8I_ADDA_LOMIXSC_LINEINL, 1, 0),
212 SOC_DAPM_DOUBLE_R("Mic1 Playback Switch",
213 SUN8I_ADDA_LOMIXSC,
214 SUN8I_ADDA_ROMIXSC,
215 SUN8I_ADDA_LOMIXSC_MIC1, 1, 0),
216 SOC_DAPM_DOUBLE_R("Mic2 Playback Switch",
217 SUN8I_ADDA_LOMIXSC,
218 SUN8I_ADDA_ROMIXSC,
219 SUN8I_ADDA_LOMIXSC_MIC2, 1, 0),
220};
221
222/* ADC mixer controls */
223static const struct snd_kcontrol_new sun8i_codec_adc_mixer_controls[] = {
224 SOC_DAPM_DOUBLE_R("Mixer Capture Switch",
225 SUN8I_ADDA_LADCMIXSC,
226 SUN8I_ADDA_RADCMIXSC,
227 SUN8I_ADDA_LADCMIXSC_OMIXRL, 1, 0),
228 SOC_DAPM_DOUBLE_R("Mixer Reversed Capture Switch",
229 SUN8I_ADDA_LADCMIXSC,
230 SUN8I_ADDA_RADCMIXSC,
231 SUN8I_ADDA_LADCMIXSC_OMIXRR, 1, 0),
232 SOC_DAPM_DOUBLE_R("Line In Capture Switch",
233 SUN8I_ADDA_LADCMIXSC,
234 SUN8I_ADDA_RADCMIXSC,
235 SUN8I_ADDA_LADCMIXSC_LINEINL, 1, 0),
236 SOC_DAPM_DOUBLE_R("Mic1 Capture Switch",
237 SUN8I_ADDA_LADCMIXSC,
238 SUN8I_ADDA_RADCMIXSC,
239 SUN8I_ADDA_LADCMIXSC_MIC1, 1, 0),
240 SOC_DAPM_DOUBLE_R("Mic2 Capture Switch",
241 SUN8I_ADDA_LADCMIXSC,
242 SUN8I_ADDA_RADCMIXSC,
243 SUN8I_ADDA_LADCMIXSC_MIC2, 1, 0),
244};
245
246/* volume / mute controls */
247static const DECLARE_TLV_DB_SCALE(sun8i_codec_out_mixer_pregain_scale,
248 -450, 150, 0);
249static const DECLARE_TLV_DB_RANGE(sun8i_codec_mic_gain_scale,
250 0, 0, TLV_DB_SCALE_ITEM(0, 0, 0),
251 1, 7, TLV_DB_SCALE_ITEM(2400, 300, 0),
252);
253
254static const struct snd_kcontrol_new sun8i_codec_common_controls[] = {
255 /* Mixer pre-gains */
256 SOC_SINGLE_TLV("Line In Playback Volume", SUN8I_ADDA_LINEIN_GCTRL,
257 SUN8I_ADDA_LINEIN_GCTRL_LINEING,
258 0x7, 0, sun8i_codec_out_mixer_pregain_scale),
259 SOC_SINGLE_TLV("Mic1 Playback Volume", SUN8I_ADDA_MICIN_GCTRL,
260 SUN8I_ADDA_MICIN_GCTRL_MIC1G,
261 0x7, 0, sun8i_codec_out_mixer_pregain_scale),
262 SOC_SINGLE_TLV("Mic2 Playback Volume",
263 SUN8I_ADDA_MICIN_GCTRL, SUN8I_ADDA_MICIN_GCTRL_MIC2G,
264 0x7, 0, sun8i_codec_out_mixer_pregain_scale),
265
266 /* Microphone Amp boost gains */
267 SOC_SINGLE_TLV("Mic1 Boost Volume", SUN8I_ADDA_MIC1G_MICBIAS_CTRL,
268 SUN8I_ADDA_MIC1G_MICBIAS_CTRL_MIC1BOOST, 0x7, 0,
269 sun8i_codec_mic_gain_scale),
270 SOC_SINGLE_TLV("Mic2 Boost Volume", SUN8I_ADDA_MIC2G_CTRL,
271 SUN8I_ADDA_MIC2G_CTRL_MIC2BOOST, 0x7, 0,
272 sun8i_codec_mic_gain_scale),
273
274 /* ADC */
275 SOC_SINGLE_TLV("ADC Gain Capture Volume", SUN8I_ADDA_ADC_AP_EN,
276 SUN8I_ADDA_ADC_AP_EN_ADCG, 0x7, 0,
277 sun8i_codec_out_mixer_pregain_scale),
278};
279
280static const struct snd_soc_dapm_widget sun8i_codec_common_widgets[] = {
281 /* ADC */
282 SND_SOC_DAPM_ADC("Left ADC", NULL, SUN8I_ADDA_ADC_AP_EN,
283 SUN8I_ADDA_ADC_AP_EN_ADCLEN, 0),
284 SND_SOC_DAPM_ADC("Right ADC", NULL, SUN8I_ADDA_ADC_AP_EN,
285 SUN8I_ADDA_ADC_AP_EN_ADCREN, 0),
286
287 /* DAC */
288 SND_SOC_DAPM_DAC("Left DAC", NULL, SUN8I_ADDA_DAC_PA_SRC,
289 SUN8I_ADDA_DAC_PA_SRC_DACALEN, 0),
290 SND_SOC_DAPM_DAC("Right DAC", NULL, SUN8I_ADDA_DAC_PA_SRC,
291 SUN8I_ADDA_DAC_PA_SRC_DACAREN, 0),
292 /*
293 * Due to this component and the codec belonging to separate DAPM
294 * contexts, we need to manually link the above widgets to their
295 * stream widgets at the card level.
296 */
297
298 /* Line In */
299 SND_SOC_DAPM_INPUT("LINEIN"),
300
301 /* Microphone inputs */
302 SND_SOC_DAPM_INPUT("MIC1"),
303 SND_SOC_DAPM_INPUT("MIC2"),
304
305 /* Microphone Bias */
306 SND_SOC_DAPM_SUPPLY("MBIAS", SUN8I_ADDA_MIC1G_MICBIAS_CTRL,
307 SUN8I_ADDA_MIC1G_MICBIAS_CTRL_MMICBIASEN,
308 0, NULL, 0),
309
310 /* Mic input path */
311 SND_SOC_DAPM_PGA("Mic1 Amplifier", SUN8I_ADDA_MIC1G_MICBIAS_CTRL,
312 SUN8I_ADDA_MIC1G_MICBIAS_CTRL_MIC1AMPEN, 0, NULL, 0),
313 SND_SOC_DAPM_PGA("Mic2 Amplifier", SUN8I_ADDA_MIC2G_CTRL,
314 SUN8I_ADDA_MIC2G_CTRL_MIC2AMPEN, 0, NULL, 0),
315
316 /* Mixers */
317 SND_SOC_DAPM_MIXER("Left Mixer", SUN8I_ADDA_DAC_PA_SRC,
318 SUN8I_ADDA_DAC_PA_SRC_LMIXEN, 0,
319 sun8i_codec_mixer_controls,
320 ARRAY_SIZE(sun8i_codec_mixer_controls)),
321 SND_SOC_DAPM_MIXER("Right Mixer", SUN8I_ADDA_DAC_PA_SRC,
322 SUN8I_ADDA_DAC_PA_SRC_RMIXEN, 0,
323 sun8i_codec_mixer_controls,
324 ARRAY_SIZE(sun8i_codec_mixer_controls)),
325 SND_SOC_DAPM_MIXER("Left ADC Mixer", SUN8I_ADDA_ADC_AP_EN,
326 SUN8I_ADDA_ADC_AP_EN_ADCLEN, 0,
327 sun8i_codec_adc_mixer_controls,
328 ARRAY_SIZE(sun8i_codec_adc_mixer_controls)),
329 SND_SOC_DAPM_MIXER("Right ADC Mixer", SUN8I_ADDA_ADC_AP_EN,
330 SUN8I_ADDA_ADC_AP_EN_ADCREN, 0,
331 sun8i_codec_adc_mixer_controls,
332 ARRAY_SIZE(sun8i_codec_adc_mixer_controls)),
333};
334
335static const struct snd_soc_dapm_route sun8i_codec_common_routes[] = {
336 /* Microphone Routes */
337 { "Mic1 Amplifier", NULL, "MIC1"},
338 { "Mic2 Amplifier", NULL, "MIC2"},
339
340 /* Left Mixer Routes */
341 { "Left Mixer", "DAC Playback Switch", "Left DAC" },
342 { "Left Mixer", "DAC Reversed Playback Switch", "Right DAC" },
343 { "Left Mixer", "Line In Playback Switch", "LINEIN" },
344 { "Left Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
345 { "Left Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
346
347 /* Right Mixer Routes */
348 { "Right Mixer", "DAC Playback Switch", "Right DAC" },
349 { "Right Mixer", "DAC Reversed Playback Switch", "Left DAC" },
350 { "Right Mixer", "Line In Playback Switch", "LINEIN" },
351 { "Right Mixer", "Mic1 Playback Switch", "Mic1 Amplifier" },
352 { "Right Mixer", "Mic2 Playback Switch", "Mic2 Amplifier" },
353
354 /* Left ADC Mixer Routes */
355 { "Left ADC Mixer", "Mixer Capture Switch", "Left Mixer" },
356 { "Left ADC Mixer", "Mixer Reversed Capture Switch", "Right Mixer" },
357 { "Left ADC Mixer", "Line In Capture Switch", "LINEIN" },
358 { "Left ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
359 { "Left ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
360
361 /* Right ADC Mixer Routes */
362 { "Right ADC Mixer", "Mixer Capture Switch", "Right Mixer" },
363 { "Right ADC Mixer", "Mixer Reversed Capture Switch", "Left Mixer" },
364 { "Right ADC Mixer", "Line In Capture Switch", "LINEIN" },
365 { "Right ADC Mixer", "Mic1 Capture Switch", "Mic1 Amplifier" },
366 { "Right ADC Mixer", "Mic2 Capture Switch", "Mic2 Amplifier" },
367
368 /* ADC Routes */
369 { "Left ADC", NULL, "Left ADC Mixer" },
370 { "Right ADC", NULL, "Right ADC Mixer" },
371};
372
373/* headphone specific controls, widgets, and routes */
374static const DECLARE_TLV_DB_SCALE(sun8i_codec_hp_vol_scale, -6300, 100, 1);
375static const struct snd_kcontrol_new sun8i_codec_headphone_controls[] = {
376 SOC_SINGLE_TLV("Headphone Playback Volume",
377 SUN8I_ADDA_HP_VOLC,
378 SUN8I_ADDA_HP_VOLC_HP_VOL, 0x3f, 0,
379 sun8i_codec_hp_vol_scale),
380 SOC_DOUBLE("Headphone Playback Switch",
381 SUN8I_ADDA_DAC_PA_SRC,
382 SUN8I_ADDA_DAC_PA_SRC_LHPPAMUTE,
383 SUN8I_ADDA_DAC_PA_SRC_RHPPAMUTE, 1, 0),
384};
385
386static const char * const sun8i_codec_hp_src_enum_text[] = {
387 "DAC", "Mixer",
388};
389
390static SOC_ENUM_DOUBLE_DECL(sun8i_codec_hp_src_enum,
391 SUN8I_ADDA_DAC_PA_SRC,
392 SUN8I_ADDA_DAC_PA_SRC_LHPIS,
393 SUN8I_ADDA_DAC_PA_SRC_RHPIS,
394 sun8i_codec_hp_src_enum_text);
395
396static const struct snd_kcontrol_new sun8i_codec_hp_src[] = {
397 SOC_DAPM_ENUM("Headphone Source Playback Route",
398 sun8i_codec_hp_src_enum),
399};
400
401static const struct snd_soc_dapm_widget sun8i_codec_headphone_widgets[] = {
402 SND_SOC_DAPM_MUX("Headphone Source Playback Route",
403 SND_SOC_NOPM, 0, 0, sun8i_codec_hp_src),
404 SND_SOC_DAPM_OUT_DRV("Headphone Amp", SUN8I_ADDA_PAEN_HP_CTRL,
405 SUN8I_ADDA_PAEN_HP_CTRL_HPPAEN, 0, NULL, 0),
406 SND_SOC_DAPM_SUPPLY("HPCOM Protection", SUN8I_ADDA_PAEN_HP_CTRL,
407 SUN8I_ADDA_PAEN_HP_CTRL_COMPTEN, 0, NULL, 0),
408 SND_SOC_DAPM_REG(snd_soc_dapm_supply, "HPCOM", SUN8I_ADDA_PAEN_HP_CTRL,
409 SUN8I_ADDA_PAEN_HP_CTRL_HPCOM_FC, 0x3, 0x3, 0),
410 SND_SOC_DAPM_OUTPUT("HP"),
411};
412
413static const struct snd_soc_dapm_route sun8i_codec_headphone_routes[] = {
414 { "Headphone Source Playback Route", "DAC", "Left DAC" },
415 { "Headphone Source Playback Route", "DAC", "Right DAC" },
416 { "Headphone Source Playback Route", "Mixer", "Left Mixer" },
417 { "Headphone Source Playback Route", "Mixer", "Right Mixer" },
418 { "Headphone Amp", NULL, "Headphone Source Playback Route" },
419 { "HPCOM", NULL, "HPCOM Protection" },
420 { "HP", NULL, "Headphone Amp" },
421};
422
423static int sun8i_codec_add_headphone(struct snd_soc_component *cmpnt)
424{
425 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(cmpnt);
426 struct device *dev = cmpnt->dev;
427 int ret;
428
429 ret = snd_soc_add_component_controls(cmpnt,
430 sun8i_codec_headphone_controls,
431 ARRAY_SIZE(sun8i_codec_headphone_controls));
432 if (ret) {
433 dev_err(dev, "Failed to add Headphone controls: %d\n", ret);
434 return ret;
435 }
436
437 ret = snd_soc_dapm_new_controls(dapm, sun8i_codec_headphone_widgets,
438 ARRAY_SIZE(sun8i_codec_headphone_widgets));
439 if (ret) {
440 dev_err(dev, "Failed to add Headphone DAPM widgets: %d\n", ret);
441 return ret;
442 }
443
444 ret = snd_soc_dapm_add_routes(dapm, sun8i_codec_headphone_routes,
445 ARRAY_SIZE(sun8i_codec_headphone_routes));
446 if (ret) {
447 dev_err(dev, "Failed to add Headphone DAPM routes: %d\n", ret);
448 return ret;
449 }
450
451 return 0;
452}
453
454/* hmic specific widget */
455static const struct snd_soc_dapm_widget sun8i_codec_hmic_widgets[] = {
456 SND_SOC_DAPM_SUPPLY("HBIAS", SUN8I_ADDA_MIC1G_MICBIAS_CTRL,
457 SUN8I_ADDA_MIC1G_MICBIAS_CTRL_HMICBIASEN,
458 0, NULL, 0),
459};
460
461static int sun8i_codec_add_hmic(struct snd_soc_component *cmpnt)
462{
463 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(cmpnt);
464 struct device *dev = cmpnt->dev;
465 int ret;
466
467 ret = snd_soc_dapm_new_controls(dapm, sun8i_codec_hmic_widgets,
468 ARRAY_SIZE(sun8i_codec_hmic_widgets));
469 if (ret)
470 dev_err(dev, "Failed to add Mic3 DAPM widgets: %d\n", ret);
471
472 return ret;
473}
474
475/* line out specific controls, widgets and routes */
476static const DECLARE_TLV_DB_RANGE(sun8i_codec_lineout_vol_scale,
477 0, 1, TLV_DB_SCALE_ITEM(TLV_DB_GAIN_MUTE, 0, 1),
478 2, 31, TLV_DB_SCALE_ITEM(-4350, 150, 0),
479);
480static const struct snd_kcontrol_new sun8i_codec_lineout_controls[] = {
481 SOC_SINGLE_TLV("Line Out Playback Volume",
482 SUN8I_ADDA_PHONE_GAIN_CTRL,
483 SUN8I_ADDA_PHONE_GAIN_CTRL_LINEOUT_VOL, 0x1f, 0,
484 sun8i_codec_lineout_vol_scale),
485 SOC_DOUBLE("Line Out Playback Switch",
486 SUN8I_ADDA_MIC2G_CTRL,
487 SUN8I_ADDA_MIC2G_CTRL_LINEOUTLEN,
488 SUN8I_ADDA_MIC2G_CTRL_LINEOUTREN, 1, 0),
489};
490
491static const char * const sun8i_codec_lineout_src_enum_text[] = {
492 "Stereo", "Mono Differential",
493};
494
495static SOC_ENUM_DOUBLE_DECL(sun8i_codec_lineout_src_enum,
496 SUN8I_ADDA_MIC2G_CTRL,
497 SUN8I_ADDA_MIC2G_CTRL_LINEOUTLSRC,
498 SUN8I_ADDA_MIC2G_CTRL_LINEOUTRSRC,
499 sun8i_codec_lineout_src_enum_text);
500
501static const struct snd_kcontrol_new sun8i_codec_lineout_src[] = {
502 SOC_DAPM_ENUM("Line Out Source Playback Route",
503 sun8i_codec_lineout_src_enum),
504};
505
506static const struct snd_soc_dapm_widget sun8i_codec_lineout_widgets[] = {
507 SND_SOC_DAPM_MUX("Line Out Source Playback Route",
508 SND_SOC_NOPM, 0, 0, sun8i_codec_lineout_src),
509 /* It is unclear if this is a buffer or gate, model it as a supply */
510 SND_SOC_DAPM_SUPPLY("Line Out Enable", SUN8I_ADDA_PAEN_HP_CTRL,
511 SUN8I_ADDA_PAEN_HP_CTRL_LINEOUTEN, 0, NULL, 0),
512 SND_SOC_DAPM_OUTPUT("LINEOUT"),
513};
514
515static const struct snd_soc_dapm_route sun8i_codec_lineout_routes[] = {
516 { "Line Out Source Playback Route", "Stereo", "Left Mixer" },
517 { "Line Out Source Playback Route", "Stereo", "Right Mixer" },
518 { "Line Out Source Playback Route", "Mono Differential", "Left Mixer" },
519 { "Line Out Source Playback Route", "Mono Differential", "Right Mixer" },
520 { "LINEOUT", NULL, "Line Out Source Playback Route" },
521 { "LINEOUT", NULL, "Line Out Enable", },
522};
523
524static int sun8i_codec_add_lineout(struct snd_soc_component *cmpnt)
525{
526 struct snd_soc_dapm_context *dapm = snd_soc_component_get_dapm(cmpnt);
527 struct device *dev = cmpnt->dev;
528 int ret;
529
530 ret = snd_soc_add_component_controls(cmpnt,
531 sun8i_codec_lineout_controls,
532 ARRAY_SIZE(sun8i_codec_lineout_controls));
533 if (ret) {
534 dev_err(dev, "Failed to add Line Out controls: %d\n", ret);
535 return ret;
536 }
537
538 ret = snd_soc_dapm_new_controls(dapm, sun8i_codec_lineout_widgets,
539 ARRAY_SIZE(sun8i_codec_lineout_widgets));
540 if (ret) {
541 dev_err(dev, "Failed to add Line Out DAPM widgets: %d\n", ret);
542 return ret;
543 }
544
545 ret = snd_soc_dapm_add_routes(dapm, sun8i_codec_lineout_routes,
546 ARRAY_SIZE(sun8i_codec_lineout_routes));
547 if (ret) {
548 dev_err(dev, "Failed to add Line Out DAPM routes: %d\n", ret);
549 return ret;
550 }
551
552 return 0;
553}
554
555struct sun8i_codec_analog_quirks {
556 bool has_headphone;
557 bool has_hmic;
558 bool has_lineout;
559};
560
561static const struct sun8i_codec_analog_quirks sun8i_a23_quirks = {
562 .has_headphone = true,
563 .has_hmic = true,
564};
565
566static const struct sun8i_codec_analog_quirks sun8i_h3_quirks = {
567 .has_lineout = true,
568};
569
570static int sun8i_codec_analog_cmpnt_probe(struct snd_soc_component *cmpnt)
571{
572 struct device *dev = cmpnt->dev;
573 const struct sun8i_codec_analog_quirks *quirks;
574 int ret;
575
576 /*
577 * This would never return NULL unless someone directly registers a
578 * platform device matching this driver's name, without specifying a
579 * device tree node.
580 */
581 quirks = of_device_get_match_data(dev);
582
583 /* Add controls, widgets, and routes for individual features */
584
585 if (quirks->has_headphone) {
586 ret = sun8i_codec_add_headphone(cmpnt);
587 if (ret)
588 return ret;
589 }
590
591 if (quirks->has_hmic) {
592 ret = sun8i_codec_add_hmic(cmpnt);
593 if (ret)
594 return ret;
595 }
596
597 if (quirks->has_lineout) {
598 ret = sun8i_codec_add_lineout(cmpnt);
599 if (ret)
600 return ret;
601 }
602
603 return 0;
604}
605
606static const struct snd_soc_component_driver sun8i_codec_analog_cmpnt_drv = {
607 .controls = sun8i_codec_common_controls,
608 .num_controls = ARRAY_SIZE(sun8i_codec_common_controls),
609 .dapm_widgets = sun8i_codec_common_widgets,
610 .num_dapm_widgets = ARRAY_SIZE(sun8i_codec_common_widgets),
611 .dapm_routes = sun8i_codec_common_routes,
612 .num_dapm_routes = ARRAY_SIZE(sun8i_codec_common_routes),
613 .probe = sun8i_codec_analog_cmpnt_probe,
614};
615
616static const struct of_device_id sun8i_codec_analog_of_match[] = {
617 {
618 .compatible = "allwinner,sun8i-a23-codec-analog",
619 .data = &sun8i_a23_quirks,
620 },
621 {
622 .compatible = "allwinner,sun8i-h3-codec-analog",
623 .data = &sun8i_h3_quirks,
624 },
625 {}
626};
627MODULE_DEVICE_TABLE(of, sun8i_codec_analog_of_match);
628
629static int sun8i_codec_analog_probe(struct platform_device *pdev)
630{
631 struct resource *res;
632 struct regmap *regmap;
633 void __iomem *base;
634
635 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
636 base = devm_ioremap_resource(&pdev->dev, res);
637 if (IS_ERR(base)) {
638 dev_err(&pdev->dev, "Failed to map the registers\n");
639 return PTR_ERR(base);
640 }
641
642 regmap = devm_regmap_init(&pdev->dev, NULL, base, &adda_pr_regmap_cfg);
643 if (IS_ERR(regmap)) {
644 dev_err(&pdev->dev, "Failed to create regmap\n");
645 return PTR_ERR(regmap);
646 }
647
648 return devm_snd_soc_register_component(&pdev->dev,
649 &sun8i_codec_analog_cmpnt_drv,
650 NULL, 0);
651}
652
653static struct platform_driver sun8i_codec_analog_driver = {
654 .driver = {
655 .name = "sun8i-codec-analog",
656 .of_match_table = sun8i_codec_analog_of_match,
657 },
658 .probe = sun8i_codec_analog_probe,
659};
660module_platform_driver(sun8i_codec_analog_driver);
661
662MODULE_DESCRIPTION("Allwinner internal codec analog controls driver");
663MODULE_AUTHOR("Chen-Yu Tsai <wens@csie.org>");
664MODULE_LICENSE("GPL");
665MODULE_ALIAS("platform:sun8i-codec-analog");
diff --git a/sound/soc/tegra/tegra_alc5632.c b/sound/soc/tegra/tegra_alc5632.c
index deb597f7c302..eead6e7f205b 100644
--- a/sound/soc/tegra/tegra_alc5632.c
+++ b/sound/soc/tegra/tegra_alc5632.c
@@ -65,7 +65,7 @@ static int tegra_alc5632_asoc_hw_params(struct snd_pcm_substream *substream,
65 return 0; 65 return 0;
66} 66}
67 67
68static struct snd_soc_ops tegra_alc5632_asoc_ops = { 68static const struct snd_soc_ops tegra_alc5632_asoc_ops = {
69 .hw_params = tegra_alc5632_asoc_hw_params, 69 .hw_params = tegra_alc5632_asoc_hw_params,
70}; 70};
71 71
diff --git a/sound/soc/tegra/tegra_max98090.c b/sound/soc/tegra/tegra_max98090.c
index 902da36581d1..a403db6d563e 100644
--- a/sound/soc/tegra/tegra_max98090.c
+++ b/sound/soc/tegra/tegra_max98090.c
@@ -93,7 +93,7 @@ static int tegra_max98090_asoc_hw_params(struct snd_pcm_substream *substream,
93 return 0; 93 return 0;
94} 94}
95 95
96static struct snd_soc_ops tegra_max98090_ops = { 96static const struct snd_soc_ops tegra_max98090_ops = {
97 .hw_params = tegra_max98090_asoc_hw_params, 97 .hw_params = tegra_max98090_asoc_hw_params,
98}; 98};
99 99
diff --git a/sound/soc/tegra/tegra_rt5640.c b/sound/soc/tegra/tegra_rt5640.c
index e5ef4e9c4ac5..25b9fc03ba62 100644
--- a/sound/soc/tegra/tegra_rt5640.c
+++ b/sound/soc/tegra/tegra_rt5640.c
@@ -76,7 +76,7 @@ static int tegra_rt5640_asoc_hw_params(struct snd_pcm_substream *substream,
76 return 0; 76 return 0;
77} 77}
78 78
79static struct snd_soc_ops tegra_rt5640_ops = { 79static const struct snd_soc_ops tegra_rt5640_ops = {
80 .hw_params = tegra_rt5640_asoc_hw_params, 80 .hw_params = tegra_rt5640_asoc_hw_params,
81}; 81};
82 82
diff --git a/sound/soc/tegra/tegra_rt5677.c b/sound/soc/tegra/tegra_rt5677.c
index 1470873ecde6..ebf58d0e0f10 100644
--- a/sound/soc/tegra/tegra_rt5677.c
+++ b/sound/soc/tegra/tegra_rt5677.c
@@ -93,7 +93,7 @@ static int tegra_rt5677_event_hp(struct snd_soc_dapm_widget *w,
93 return 0; 93 return 0;
94} 94}
95 95
96static struct snd_soc_ops tegra_rt5677_ops = { 96static const struct snd_soc_ops tegra_rt5677_ops = {
97 .hw_params = tegra_rt5677_asoc_hw_params, 97 .hw_params = tegra_rt5677_asoc_hw_params,
98}; 98};
99 99
diff --git a/sound/soc/tegra/tegra_sgtl5000.c b/sound/soc/tegra/tegra_sgtl5000.c
index 1e76869dd488..4bbab098f50b 100644
--- a/sound/soc/tegra/tegra_sgtl5000.c
+++ b/sound/soc/tegra/tegra_sgtl5000.c
@@ -82,7 +82,7 @@ static int tegra_sgtl5000_hw_params(struct snd_pcm_substream *substream,
82 return 0; 82 return 0;
83} 83}
84 84
85static struct snd_soc_ops tegra_sgtl5000_ops = { 85static const struct snd_soc_ops tegra_sgtl5000_ops = {
86 .hw_params = tegra_sgtl5000_hw_params, 86 .hw_params = tegra_sgtl5000_hw_params,
87}; 87};
88 88
diff --git a/sound/soc/tegra/tegra_wm8753.c b/sound/soc/tegra/tegra_wm8753.c
index f0cd01dbfc38..bdedd1028569 100644
--- a/sound/soc/tegra/tegra_wm8753.c
+++ b/sound/soc/tegra/tegra_wm8753.c
@@ -89,7 +89,7 @@ static int tegra_wm8753_hw_params(struct snd_pcm_substream *substream,
89 return 0; 89 return 0;
90} 90}
91 91
92static struct snd_soc_ops tegra_wm8753_ops = { 92static const struct snd_soc_ops tegra_wm8753_ops = {
93 .hw_params = tegra_wm8753_hw_params, 93 .hw_params = tegra_wm8753_hw_params,
94}; 94};
95 95
diff --git a/sound/soc/tegra/tegra_wm8903.c b/sound/soc/tegra/tegra_wm8903.c
index e485278e027a..2013e9c4bba0 100644
--- a/sound/soc/tegra/tegra_wm8903.c
+++ b/sound/soc/tegra/tegra_wm8903.c
@@ -96,7 +96,7 @@ static int tegra_wm8903_hw_params(struct snd_pcm_substream *substream,
96 return 0; 96 return 0;
97} 97}
98 98
99static struct snd_soc_ops tegra_wm8903_ops = { 99static const struct snd_soc_ops tegra_wm8903_ops = {
100 .hw_params = tegra_wm8903_hw_params, 100 .hw_params = tegra_wm8903_hw_params,
101}; 101};
102 102
diff --git a/sound/soc/tegra/trimslice.c b/sound/soc/tegra/trimslice.c
index 2cea203c4f5f..870f84ab5005 100644
--- a/sound/soc/tegra/trimslice.c
+++ b/sound/soc/tegra/trimslice.c
@@ -74,7 +74,7 @@ static int trimslice_asoc_hw_params(struct snd_pcm_substream *substream,
74 return 0; 74 return 0;
75} 75}
76 76
77static struct snd_soc_ops trimslice_asoc_ops = { 77static const struct snd_soc_ops trimslice_asoc_ops = {
78 .hw_params = trimslice_asoc_hw_params, 78 .hw_params = trimslice_asoc_hw_params,
79}; 79};
80 80
diff --git a/sound/soc/zte/Kconfig b/sound/soc/zte/Kconfig
index c47eb25e441f..6d8a90d36315 100644
--- a/sound/soc/zte/Kconfig
+++ b/sound/soc/zte/Kconfig
@@ -1,17 +1,17 @@
1config ZX296702_SPDIF 1config ZX_SPDIF
2 tristate "ZX296702 spdif" 2 tristate "ZTE ZX SPDIF Driver Support"
3 depends on SOC_ZX296702 || COMPILE_TEST 3 depends on ARCH_ZX || COMPILE_TEST
4 depends on COMMON_CLK 4 depends on COMMON_CLK
5 select SND_SOC_GENERIC_DMAENGINE_PCM 5 select SND_SOC_GENERIC_DMAENGINE_PCM
6 help 6 help
7 Say Y or M if you want to add support for codecs attached to the 7 Say Y or M if you want to add support for codecs attached to the
8 zx296702 spdif interface 8 ZTE ZX SPDIF interface
9 9
10config ZX296702_I2S 10config ZX_I2S
11 tristate "ZX296702 i2s" 11 tristate "ZTE ZX I2S Driver Support"
12 depends on SOC_ZX296702 || COMPILE_TEST 12 depends on ARCH_ZX || COMPILE_TEST
13 depends on COMMON_CLK 13 depends on COMMON_CLK
14 select SND_SOC_GENERIC_DMAENGINE_PCM 14 select SND_SOC_GENERIC_DMAENGINE_PCM
15 help 15 help
16 Say Y or M if you want to add support for codecs attached to the 16 Say Y or M if you want to add support for codecs attached to the
17 zx296702 i2s interface 17 ZTE ZX I2S interface
diff --git a/sound/soc/zte/Makefile b/sound/soc/zte/Makefile
index 254ed2c8c1a0..77768f5fd10c 100644
--- a/sound/soc/zte/Makefile
+++ b/sound/soc/zte/Makefile
@@ -1,2 +1,2 @@
1obj-$(CONFIG_ZX296702_SPDIF) += zx296702-spdif.o 1obj-$(CONFIG_ZX_SPDIF) += zx-spdif.o
2obj-$(CONFIG_ZX296702_I2S) += zx296702-i2s.o 2obj-$(CONFIG_ZX_I2S) += zx-i2s.o
diff --git a/sound/soc/zte/zx296702-i2s.c b/sound/soc/zte/zx-i2s.c
index 1cad93dc1fcf..1cad93dc1fcf 100644
--- a/sound/soc/zte/zx296702-i2s.c
+++ b/sound/soc/zte/zx-i2s.c
diff --git a/sound/soc/zte/zx296702-spdif.c b/sound/soc/zte/zx-spdif.c
index 26265ce4caca..9fa6463ce5d7 100644
--- a/sound/soc/zte/zx296702-spdif.c
+++ b/sound/soc/zte/zx-spdif.c
@@ -71,7 +71,7 @@
71#define ZX_VALID_RIGHT_TRACK (2 << 0) 71#define ZX_VALID_RIGHT_TRACK (2 << 0)
72#define ZX_VALID_TRACK_MASK (3 << 0) 72#define ZX_VALID_TRACK_MASK (3 << 0)
73 73
74#define ZX_SPDIF_CLK_RAT (4 * 32) 74#define ZX_SPDIF_CLK_RAT (2 * 32)
75 75
76struct zx_spdif_info { 76struct zx_spdif_info {
77 struct snd_dmaengine_dai_dma_data dma_data; 77 struct snd_dmaengine_dai_dma_data dma_data;
diff --git a/sound/sparc/dbri.c b/sound/sparc/dbri.c
index 0190cb6332f2..52063b262667 100644
--- a/sound/sparc/dbri.c
+++ b/sound/sparc/dbri.c
@@ -304,7 +304,7 @@ struct snd_dbri {
304 spinlock_t lock; 304 spinlock_t lock;
305 305
306 struct dbri_dma *dma; /* Pointer to our DMA block */ 306 struct dbri_dma *dma; /* Pointer to our DMA block */
307 u32 dma_dvma; /* DBRI visible DMA address */ 307 dma_addr_t dma_dvma; /* DBRI visible DMA address */
308 308
309 void __iomem *regs; /* dbri HW regs */ 309 void __iomem *regs; /* dbri HW regs */
310 int dbri_irqp; /* intr queue pointer */ 310 int dbri_irqp; /* intr queue pointer */
@@ -657,12 +657,14 @@ static void dbri_cmdwait(struct snd_dbri *dbri)
657 */ 657 */
658static s32 *dbri_cmdlock(struct snd_dbri *dbri, int len) 658static s32 *dbri_cmdlock(struct snd_dbri *dbri, int len)
659{ 659{
660 u32 dvma_addr = (u32)dbri->dma_dvma;
661
660 /* Space for 2 WAIT cmds (replaced later by 1 JUMP cmd) */ 662 /* Space for 2 WAIT cmds (replaced later by 1 JUMP cmd) */
661 len += 2; 663 len += 2;
662 spin_lock(&dbri->cmdlock); 664 spin_lock(&dbri->cmdlock);
663 if (dbri->cmdptr - dbri->dma->cmd + len < DBRI_NO_CMDS - 2) 665 if (dbri->cmdptr - dbri->dma->cmd + len < DBRI_NO_CMDS - 2)
664 return dbri->cmdptr + 2; 666 return dbri->cmdptr + 2;
665 else if (len < sbus_readl(dbri->regs + REG8) - dbri->dma_dvma) 667 else if (len < sbus_readl(dbri->regs + REG8) - dvma_addr)
666 return dbri->dma->cmd; 668 return dbri->dma->cmd;
667 else 669 else
668 printk(KERN_ERR "DBRI: no space for commands."); 670 printk(KERN_ERR "DBRI: no space for commands.");
@@ -680,6 +682,7 @@ static s32 *dbri_cmdlock(struct snd_dbri *dbri, int len)
680 */ 682 */
681static void dbri_cmdsend(struct snd_dbri *dbri, s32 *cmd, int len) 683static void dbri_cmdsend(struct snd_dbri *dbri, s32 *cmd, int len)
682{ 684{
685 u32 dvma_addr = (u32)dbri->dma_dvma;
683 s32 tmp, addr; 686 s32 tmp, addr;
684 static int wait_id = 0; 687 static int wait_id = 0;
685 688
@@ -689,7 +692,7 @@ static void dbri_cmdsend(struct snd_dbri *dbri, s32 *cmd, int len)
689 *(cmd+1) = DBRI_CMD(D_WAIT, 1, wait_id); 692 *(cmd+1) = DBRI_CMD(D_WAIT, 1, wait_id);
690 693
691 /* Replace the last command with JUMP */ 694 /* Replace the last command with JUMP */
692 addr = dbri->dma_dvma + (cmd - len - dbri->dma->cmd) * sizeof(s32); 695 addr = dvma_addr + (cmd - len - dbri->dma->cmd) * sizeof(s32);
693 *(dbri->cmdptr+1) = addr; 696 *(dbri->cmdptr+1) = addr;
694 *(dbri->cmdptr) = DBRI_CMD(D_JUMP, 0, 0); 697 *(dbri->cmdptr) = DBRI_CMD(D_JUMP, 0, 0);
695 698
@@ -747,6 +750,7 @@ static void dbri_reset(struct snd_dbri *dbri)
747/* Lock must not be held before calling this */ 750/* Lock must not be held before calling this */
748static void dbri_initialize(struct snd_dbri *dbri) 751static void dbri_initialize(struct snd_dbri *dbri)
749{ 752{
753 u32 dvma_addr = (u32)dbri->dma_dvma;
750 s32 *cmd; 754 s32 *cmd;
751 u32 dma_addr; 755 u32 dma_addr;
752 unsigned long flags; 756 unsigned long flags;
@@ -764,7 +768,7 @@ static void dbri_initialize(struct snd_dbri *dbri)
764 /* 768 /*
765 * Initialize the interrupt ring buffer. 769 * Initialize the interrupt ring buffer.
766 */ 770 */
767 dma_addr = dbri->dma_dvma + dbri_dma_off(intr, 0); 771 dma_addr = dvma_addr + dbri_dma_off(intr, 0);
768 dbri->dma->intr[0] = dma_addr; 772 dbri->dma->intr[0] = dma_addr;
769 dbri->dbri_irqp = 1; 773 dbri->dbri_irqp = 1;
770 /* 774 /*
@@ -778,7 +782,7 @@ static void dbri_initialize(struct snd_dbri *dbri)
778 dbri->cmdptr = cmd; 782 dbri->cmdptr = cmd;
779 *(cmd++) = DBRI_CMD(D_WAIT, 1, 0); 783 *(cmd++) = DBRI_CMD(D_WAIT, 1, 0);
780 *(cmd++) = DBRI_CMD(D_WAIT, 1, 0); 784 *(cmd++) = DBRI_CMD(D_WAIT, 1, 0);
781 dma_addr = dbri->dma_dvma + dbri_dma_off(cmd, 0); 785 dma_addr = dvma_addr + dbri_dma_off(cmd, 0);
782 sbus_writel(dma_addr, dbri->regs + REG8); 786 sbus_writel(dma_addr, dbri->regs + REG8);
783 spin_unlock(&dbri->cmdlock); 787 spin_unlock(&dbri->cmdlock);
784 788
@@ -1077,6 +1081,7 @@ static void recv_fixed(struct snd_dbri *dbri, int pipe, volatile __u32 *ptr)
1077static int setup_descs(struct snd_dbri *dbri, int streamno, unsigned int period) 1081static int setup_descs(struct snd_dbri *dbri, int streamno, unsigned int period)
1078{ 1082{
1079 struct dbri_streaminfo *info = &dbri->stream_info[streamno]; 1083 struct dbri_streaminfo *info = &dbri->stream_info[streamno];
1084 u32 dvma_addr = (u32)dbri->dma_dvma;
1080 __u32 dvma_buffer; 1085 __u32 dvma_buffer;
1081 int desc; 1086 int desc;
1082 int len; 1087 int len;
@@ -1177,7 +1182,7 @@ static int setup_descs(struct snd_dbri *dbri, int streamno, unsigned int period)
1177 else { 1182 else {
1178 dbri->next_desc[last_desc] = desc; 1183 dbri->next_desc[last_desc] = desc;
1179 dbri->dma->desc[last_desc].nda = 1184 dbri->dma->desc[last_desc].nda =
1180 dbri->dma_dvma + dbri_dma_off(desc, desc); 1185 dvma_addr + dbri_dma_off(desc, desc);
1181 } 1186 }
1182 1187
1183 last_desc = desc; 1188 last_desc = desc;
@@ -1192,7 +1197,7 @@ static int setup_descs(struct snd_dbri *dbri, int streamno, unsigned int period)
1192 } 1197 }
1193 1198
1194 dbri->dma->desc[last_desc].nda = 1199 dbri->dma->desc[last_desc].nda =
1195 dbri->dma_dvma + dbri_dma_off(desc, first_desc); 1200 dvma_addr + dbri_dma_off(desc, first_desc);
1196 dbri->next_desc[last_desc] = first_desc; 1201 dbri->next_desc[last_desc] = first_desc;
1197 dbri->pipes[info->pipe].first_desc = first_desc; 1202 dbri->pipes[info->pipe].first_desc = first_desc;
1198 dbri->pipes[info->pipe].desc = first_desc; 1203 dbri->pipes[info->pipe].desc = first_desc;
@@ -1697,6 +1702,7 @@ interrupts are disabled.
1697static void xmit_descs(struct snd_dbri *dbri) 1702static void xmit_descs(struct snd_dbri *dbri)
1698{ 1703{
1699 struct dbri_streaminfo *info; 1704 struct dbri_streaminfo *info;
1705 u32 dvma_addr;
1700 s32 *cmd; 1706 s32 *cmd;
1701 unsigned long flags; 1707 unsigned long flags;
1702 int first_td; 1708 int first_td;
@@ -1704,6 +1710,7 @@ static void xmit_descs(struct snd_dbri *dbri)
1704 if (dbri == NULL) 1710 if (dbri == NULL)
1705 return; /* Disabled */ 1711 return; /* Disabled */
1706 1712
1713 dvma_addr = (u32)dbri->dma_dvma;
1707 info = &dbri->stream_info[DBRI_REC]; 1714 info = &dbri->stream_info[DBRI_REC];
1708 spin_lock_irqsave(&dbri->lock, flags); 1715 spin_lock_irqsave(&dbri->lock, flags);
1709 1716
@@ -1718,7 +1725,7 @@ static void xmit_descs(struct snd_dbri *dbri)
1718 *(cmd++) = DBRI_CMD(D_SDP, 0, 1725 *(cmd++) = DBRI_CMD(D_SDP, 0,
1719 dbri->pipes[info->pipe].sdp 1726 dbri->pipes[info->pipe].sdp
1720 | D_SDP_P | D_SDP_EVERY | D_SDP_C); 1727 | D_SDP_P | D_SDP_EVERY | D_SDP_C);
1721 *(cmd++) = dbri->dma_dvma + 1728 *(cmd++) = dvma_addr +
1722 dbri_dma_off(desc, first_td); 1729 dbri_dma_off(desc, first_td);
1723 dbri_cmdsend(dbri, cmd, 2); 1730 dbri_cmdsend(dbri, cmd, 2);
1724 1731
@@ -1740,7 +1747,7 @@ static void xmit_descs(struct snd_dbri *dbri)
1740 *(cmd++) = DBRI_CMD(D_SDP, 0, 1747 *(cmd++) = DBRI_CMD(D_SDP, 0,
1741 dbri->pipes[info->pipe].sdp 1748 dbri->pipes[info->pipe].sdp
1742 | D_SDP_P | D_SDP_EVERY | D_SDP_C); 1749 | D_SDP_P | D_SDP_EVERY | D_SDP_C);
1743 *(cmd++) = dbri->dma_dvma + 1750 *(cmd++) = dvma_addr +
1744 dbri_dma_off(desc, first_td); 1751 dbri_dma_off(desc, first_td);
1745 dbri_cmdsend(dbri, cmd, 2); 1752 dbri_cmdsend(dbri, cmd, 2);
1746 1753
@@ -2539,7 +2546,7 @@ static int snd_dbri_create(struct snd_card *card,
2539 if (!dbri->dma) 2546 if (!dbri->dma)
2540 return -ENOMEM; 2547 return -ENOMEM;
2541 2548
2542 dprintk(D_GEN, "DMA Cmd Block 0x%p (0x%08x)\n", 2549 dprintk(D_GEN, "DMA Cmd Block 0x%p (%pad)\n",
2543 dbri->dma, dbri->dma_dvma); 2550 dbri->dma, dbri->dma_dvma);
2544 2551
2545 /* Map the registers into memory. */ 2552 /* Map the registers into memory. */
diff --git a/tools/objtool/arch/x86/decode.c b/tools/objtool/arch/x86/decode.c
index b63a31be1218..5e0dea2cdc01 100644
--- a/tools/objtool/arch/x86/decode.c
+++ b/tools/objtool/arch/x86/decode.c
@@ -99,7 +99,7 @@ int arch_decode_instruction(struct elf *elf, struct section *sec,
99 break; 99 break;
100 100
101 case 0x8d: 101 case 0x8d:
102 if (insn.rex_prefix.bytes && 102 if (insn.rex_prefix.nbytes &&
103 insn.rex_prefix.bytes[0] == 0x48 && 103 insn.rex_prefix.bytes[0] == 0x48 &&
104 insn.modrm.nbytes && insn.modrm.bytes[0] == 0x2c && 104 insn.modrm.nbytes && insn.modrm.bytes[0] == 0x2c &&
105 insn.sib.nbytes && insn.sib.bytes[0] == 0x24) 105 insn.sib.nbytes && insn.sib.bytes[0] == 0x24)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 4ffff7be9299..a53fef0c673b 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -1337,8 +1337,8 @@ static int hist_browser__show_hierarchy_entry(struct hist_browser *browser,
1337 } 1337 }
1338 1338
1339 if (first) { 1339 if (first) {
1340 ui_browser__printf(&browser->b, "%c", folded_sign); 1340 ui_browser__printf(&browser->b, "%c ", folded_sign);
1341 width--; 1341 width -= 2;
1342 first = false; 1342 first = false;
1343 } else { 1343 } else {
1344 ui_browser__printf(&browser->b, " "); 1344 ui_browser__printf(&browser->b, " ");
@@ -1361,8 +1361,10 @@ static int hist_browser__show_hierarchy_entry(struct hist_browser *browser,
1361 width -= hpp.buf - s; 1361 width -= hpp.buf - s;
1362 } 1362 }
1363 1363
1364 ui_browser__write_nstring(&browser->b, "", hierarchy_indent); 1364 if (!first) {
1365 width -= hierarchy_indent; 1365 ui_browser__write_nstring(&browser->b, "", hierarchy_indent);
1366 width -= hierarchy_indent;
1367 }
1366 1368
1367 if (column >= browser->b.horiz_scroll) { 1369 if (column >= browser->b.horiz_scroll) {
1368 char s[2048]; 1370 char s[2048];
@@ -1381,7 +1383,13 @@ static int hist_browser__show_hierarchy_entry(struct hist_browser *browser,
1381 } 1383 }
1382 1384
1383 perf_hpp_list__for_each_format(entry->hpp_list, fmt) { 1385 perf_hpp_list__for_each_format(entry->hpp_list, fmt) {
1384 ui_browser__write_nstring(&browser->b, "", 2); 1386 if (first) {
1387 ui_browser__printf(&browser->b, "%c ", folded_sign);
1388 first = false;
1389 } else {
1390 ui_browser__write_nstring(&browser->b, "", 2);
1391 }
1392
1385 width -= 2; 1393 width -= 2;
1386 1394
1387 /* 1395 /*
@@ -1555,10 +1563,11 @@ static int hists_browser__scnprintf_hierarchy_headers(struct hist_browser *brows
1555 int indent = hists->nr_hpp_node - 2; 1563 int indent = hists->nr_hpp_node - 2;
1556 bool first_node, first_col; 1564 bool first_node, first_col;
1557 1565
1558 ret = scnprintf(buf, size, " "); 1566 ret = scnprintf(buf, size, " ");
1559 if (advance_hpp_check(&dummy_hpp, ret)) 1567 if (advance_hpp_check(&dummy_hpp, ret))
1560 return ret; 1568 return ret;
1561 1569
1570 first_node = true;
1562 /* the first hpp_list_node is for overhead columns */ 1571 /* the first hpp_list_node is for overhead columns */
1563 fmt_node = list_first_entry(&hists->hpp_formats, 1572 fmt_node = list_first_entry(&hists->hpp_formats,
1564 struct perf_hpp_list_node, list); 1573 struct perf_hpp_list_node, list);
@@ -1573,12 +1582,16 @@ static int hists_browser__scnprintf_hierarchy_headers(struct hist_browser *brows
1573 ret = scnprintf(dummy_hpp.buf, dummy_hpp.size, " "); 1582 ret = scnprintf(dummy_hpp.buf, dummy_hpp.size, " ");
1574 if (advance_hpp_check(&dummy_hpp, ret)) 1583 if (advance_hpp_check(&dummy_hpp, ret))
1575 break; 1584 break;
1585
1586 first_node = false;
1576 } 1587 }
1577 1588
1578 ret = scnprintf(dummy_hpp.buf, dummy_hpp.size, "%*s", 1589 if (!first_node) {
1579 indent * HIERARCHY_INDENT, ""); 1590 ret = scnprintf(dummy_hpp.buf, dummy_hpp.size, "%*s",
1580 if (advance_hpp_check(&dummy_hpp, ret)) 1591 indent * HIERARCHY_INDENT, "");
1581 return ret; 1592 if (advance_hpp_check(&dummy_hpp, ret))
1593 return ret;
1594 }
1582 1595
1583 first_node = true; 1596 first_node = true;
1584 list_for_each_entry_continue(fmt_node, &hists->hpp_formats, list) { 1597 list_for_each_entry_continue(fmt_node, &hists->hpp_formats, list) {
@@ -2076,8 +2089,21 @@ void hist_browser__init(struct hist_browser *browser,
2076 browser->b.use_navkeypressed = true; 2089 browser->b.use_navkeypressed = true;
2077 browser->show_headers = symbol_conf.show_hist_headers; 2090 browser->show_headers = symbol_conf.show_hist_headers;
2078 2091
2079 hists__for_each_format(hists, fmt) 2092 if (symbol_conf.report_hierarchy) {
2093 struct perf_hpp_list_node *fmt_node;
2094
2095 /* count overhead columns (in the first node) */
2096 fmt_node = list_first_entry(&hists->hpp_formats,
2097 struct perf_hpp_list_node, list);
2098 perf_hpp_list__for_each_format(&fmt_node->hpp, fmt)
2099 ++browser->b.columns;
2100
2101 /* add a single column for whole hierarchy sort keys*/
2080 ++browser->b.columns; 2102 ++browser->b.columns;
2103 } else {
2104 hists__for_each_format(hists, fmt)
2105 ++browser->b.columns;
2106 }
2081 2107
2082 hists__reset_column_width(hists); 2108 hists__reset_column_width(hists);
2083} 2109}
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index b02992efb513..a69f027368ef 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1600,18 +1600,18 @@ static void hists__hierarchy_output_resort(struct hists *hists,
1600 if (prog) 1600 if (prog)
1601 ui_progress__update(prog, 1); 1601 ui_progress__update(prog, 1);
1602 1602
1603 hists->nr_entries++;
1604 if (!he->filtered) {
1605 hists->nr_non_filtered_entries++;
1606 hists__calc_col_len(hists, he);
1607 }
1608
1603 if (!he->leaf) { 1609 if (!he->leaf) {
1604 hists__hierarchy_output_resort(hists, prog, 1610 hists__hierarchy_output_resort(hists, prog,
1605 &he->hroot_in, 1611 &he->hroot_in,
1606 &he->hroot_out, 1612 &he->hroot_out,
1607 min_callchain_hits, 1613 min_callchain_hits,
1608 use_callchain); 1614 use_callchain);
1609 hists->nr_entries++;
1610 if (!he->filtered) {
1611 hists->nr_non_filtered_entries++;
1612 hists__calc_col_len(hists, he);
1613 }
1614
1615 continue; 1615 continue;
1616 } 1616 }
1617 1617
diff --git a/tools/power/acpi/Makefile.config b/tools/power/acpi/Makefile.config
index a538ff44b108..a1883bbb0144 100644
--- a/tools/power/acpi/Makefile.config
+++ b/tools/power/acpi/Makefile.config
@@ -8,18 +8,19 @@
8# as published by the Free Software Foundation; version 2 8# as published by the Free Software Foundation; version 2
9# of the License. 9# of the License.
10 10
11include ../../../../scripts/Makefile.include 11ifeq ($(srctree),)
12 12srctree := $(patsubst %/,%,$(dir $(shell pwd)))
13OUTPUT=./ 13srctree := $(patsubst %/,%,$(dir $(srctree)))
14ifeq ("$(origin O)", "command line") 14#$(info Determined 'srctree' to be $(srctree))
15 OUTPUT := $(O)/
16endif 15endif
17 16
18ifneq ($(OUTPUT),) 17include $(srctree)/../../scripts/Makefile.include
19# check that the output directory actually exists 18
20OUTDIR := $(shell cd $(OUTPUT) && /bin/pwd) 19OUTPUT=$(srctree)/
21$(if $(OUTDIR),, $(error output directory "$(OUTPUT)" does not exist)) 20ifeq ("$(origin O)", "command line")
21 OUTPUT := $(O)/power/acpi/
22endif 22endif
23#$(info Determined 'OUTPUT' to be $(OUTPUT))
23 24
24# --- CONFIGURATION BEGIN --- 25# --- CONFIGURATION BEGIN ---
25 26
@@ -70,8 +71,8 @@ WARNINGS := -Wall
70WARNINGS += $(call cc-supports,-Wstrict-prototypes) 71WARNINGS += $(call cc-supports,-Wstrict-prototypes)
71WARNINGS += $(call cc-supports,-Wdeclaration-after-statement) 72WARNINGS += $(call cc-supports,-Wdeclaration-after-statement)
72 73
73KERNEL_INCLUDE := ../../../include 74KERNEL_INCLUDE := $(OUTPUT)include
74ACPICA_INCLUDE := ../../../drivers/acpi/acpica 75ACPICA_INCLUDE := $(srctree)/../../../drivers/acpi/acpica
75CFLAGS += -D_LINUX -I$(KERNEL_INCLUDE) -I$(ACPICA_INCLUDE) 76CFLAGS += -D_LINUX -I$(KERNEL_INCLUDE) -I$(ACPICA_INCLUDE)
76CFLAGS += $(WARNINGS) 77CFLAGS += $(WARNINGS)
77 78
diff --git a/tools/power/acpi/Makefile.rules b/tools/power/acpi/Makefile.rules
index ec87a9e562c0..373738338f51 100644
--- a/tools/power/acpi/Makefile.rules
+++ b/tools/power/acpi/Makefile.rules
@@ -8,28 +8,42 @@
8# as published by the Free Software Foundation; version 2 8# as published by the Free Software Foundation; version 2
9# of the License. 9# of the License.
10 10
11$(OUTPUT)$(TOOL): $(TOOL_OBJS) FORCE 11objdir := $(OUTPUT)tools/$(TOOL)/
12 $(ECHO) " LD " $@ 12toolobjs := $(addprefix $(objdir),$(TOOL_OBJS))
13 $(QUIET) $(LD) $(CFLAGS) $(LDFLAGS) $(TOOL_OBJS) -L$(OUTPUT) -o $@ 13$(OUTPUT)$(TOOL): $(toolobjs) FORCE
14 $(ECHO) " LD " $(subst $(OUTPUT),,$@)
15 $(QUIET) $(LD) $(CFLAGS) $(LDFLAGS) $(toolobjs) -L$(OUTPUT) -o $@
16 $(ECHO) " STRIP " $(subst $(OUTPUT),,$@)
14 $(QUIET) $(STRIPCMD) $@ 17 $(QUIET) $(STRIPCMD) $@
15 18
16$(OUTPUT)%.o: %.c 19$(KERNEL_INCLUDE):
17 $(ECHO) " CC " $@ 20 $(ECHO) " MKDIR " $(subst $(OUTPUT),,$@)
21 $(QUIET) mkdir -p $(KERNEL_INCLUDE)
22 $(ECHO) " CP " $(subst $(OUTPUT),,$@)
23 $(QUIET) cp -rf $(srctree)/../../../include/acpi $(KERNEL_INCLUDE)/
24
25$(objdir)%.o: %.c $(KERNEL_INCLUDE)
26 $(ECHO) " CC " $(subst $(OUTPUT),,$@)
18 $(QUIET) $(CC) -c $(CFLAGS) -o $@ $< 27 $(QUIET) $(CC) -c $(CFLAGS) -o $@ $<
19 28
20all: $(OUTPUT)$(TOOL) 29all: $(OUTPUT)$(TOOL)
21clean: 30clean:
22 -find $(OUTPUT) \( -not -type d \) \ 31 $(ECHO) " RMOBJ " $(subst $(OUTPUT),,$(objdir))
23 -and \( -name '*~' -o -name '*.[oas]' \) \ 32 $(QUIET) find $(objdir) \( -not -type d \)\
24 -type f -print \ 33 -and \( -name '*~' -o -name '*.[oas]' \)\
25 | xargs rm -f 34 -type f -print | xargs rm -f
26 -rm -f $(OUTPUT)$(TOOL) 35 $(ECHO) " RM " $(TOOL)
36 $(QUIET) rm -f $(OUTPUT)$(TOOL)
37 $(ECHO) " RMINC " $(subst $(OUTPUT),,$(KERNEL_INCLUDE))
38 $(QUIET) rm -rf $(KERNEL_INCLUDE)
27 39
28install-tools: 40install-tools:
29 $(INSTALL) -d $(DESTDIR)${sbindir} 41 $(ECHO) " INST " $(TOOL)
30 $(INSTALL_PROGRAM) $(OUTPUT)$(TOOL) $(DESTDIR)${sbindir} 42 $(QUIET) $(INSTALL) -d $(DESTDIR)$(sbindir)
43 $(QUIET) $(INSTALL_PROGRAM) $(OUTPUT)$(TOOL) $(DESTDIR)$(sbindir)
31uninstall-tools: 44uninstall-tools:
32 - rm -f $(DESTDIR)${sbindir}/$(TOOL) 45 $(ECHO) " UNINST " $(TOOL)
46 $(QUIET) rm -f $(DESTDIR)$(sbindir)/$(TOOL)
33 47
34install: all install-tools $(EXTRA_INSTALL) 48install: all install-tools $(EXTRA_INSTALL)
35uninstall: uninstall-tools $(EXTRA_UNINSTALL) 49uninstall: uninstall-tools $(EXTRA_UNINSTALL)
diff --git a/tools/power/acpi/tools/acpidbg/Makefile b/tools/power/acpi/tools/acpidbg/Makefile
index 352df4b41ae9..f2d06e773eb4 100644
--- a/tools/power/acpi/tools/acpidbg/Makefile
+++ b/tools/power/acpi/tools/acpidbg/Makefile
@@ -17,9 +17,7 @@ vpath %.c \
17 ../../os_specific/service_layers\ 17 ../../os_specific/service_layers\
18 . 18 .
19CFLAGS += -DACPI_APPLICATION -DACPI_SINGLE_THREAD -DACPI_DEBUGGER\ 19CFLAGS += -DACPI_APPLICATION -DACPI_SINGLE_THREAD -DACPI_DEBUGGER\
20 -I.\ 20 -I.
21 -I../../../../../drivers/acpi/acpica\
22 -I../../../../../include
23LDFLAGS += -lpthread 21LDFLAGS += -lpthread
24TOOL_OBJS = \ 22TOOL_OBJS = \
25 acpidbg.o 23 acpidbg.o
diff --git a/tools/power/acpi/tools/acpidbg/acpidbg.c b/tools/power/acpi/tools/acpidbg/acpidbg.c
index a88ac45b7756..4308362d7068 100644
--- a/tools/power/acpi/tools/acpidbg/acpidbg.c
+++ b/tools/power/acpi/tools/acpidbg/acpidbg.c
@@ -12,10 +12,16 @@
12#include <acpi/acpi.h> 12#include <acpi/acpi.h>
13 13
14/* Headers not included by include/acpi/platform/aclinux.h */ 14/* Headers not included by include/acpi/platform/aclinux.h */
15#include <unistd.h>
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <error.h>
15#include <stdbool.h> 20#include <stdbool.h>
16#include <fcntl.h> 21#include <fcntl.h>
17#include <assert.h> 22#include <assert.h>
18#include <linux/circ_buf.h> 23#include <sys/select.h>
24#include "../../../../../include/linux/circ_buf.h"
19 25
20#define ACPI_AML_FILE "/sys/kernel/debug/acpi/acpidbg" 26#define ACPI_AML_FILE "/sys/kernel/debug/acpi/acpidbg"
21#define ACPI_AML_SEC_TICK 1 27#define ACPI_AML_SEC_TICK 1
diff --git a/tools/power/acpi/tools/acpidump/Makefile b/tools/power/acpi/tools/acpidump/Makefile
index 04b5db7c7c0b..f7c7af1f9258 100644
--- a/tools/power/acpi/tools/acpidump/Makefile
+++ b/tools/power/acpi/tools/acpidump/Makefile
@@ -19,9 +19,7 @@ vpath %.c \
19 ./\ 19 ./\
20 ../../common\ 20 ../../common\
21 ../../os_specific/service_layers 21 ../../os_specific/service_layers
22CFLAGS += -DACPI_DUMP_APP -I.\ 22CFLAGS += -DACPI_DUMP_APP -I.
23 -I../../../../../drivers/acpi/acpica\
24 -I../../../../../include
25TOOL_OBJS = \ 23TOOL_OBJS = \
26 apdump.o\ 24 apdump.o\
27 apfiles.o\ 25 apfiles.o\
@@ -49,7 +47,9 @@ TOOL_OBJS = \
49 47
50include ../../Makefile.rules 48include ../../Makefile.rules
51 49
52install-man: ../../man/acpidump.8 50install-man: $(srctree)/man/acpidump.8
53 $(INSTALL_DATA) -D $< $(DESTDIR)${mandir}/man8/acpidump.8 51 $(ECHO) " INST " acpidump.8
52 $(QUIET) $(INSTALL_DATA) -D $< $(DESTDIR)$(mandir)/man8/acpidump.8
54uninstall-man: 53uninstall-man:
55 - rm -f $(DESTDIR)${mandir}/man8/acpidump.8 54 $(ECHO) " UNINST " acpidump.8
55 $(QUIET) rm -f $(DESTDIR)$(mandir)/man8/acpidump.8
diff --git a/tools/power/cpupower/utils/cpufreq-set.c b/tools/power/cpupower/utils/cpufreq-set.c
index b4bf76971dc9..1eef0aed6423 100644
--- a/tools/power/cpupower/utils/cpufreq-set.c
+++ b/tools/power/cpupower/utils/cpufreq-set.c
@@ -296,7 +296,7 @@ int cmd_freq_set(int argc, char **argv)
296 struct cpufreq_affected_cpus *cpus; 296 struct cpufreq_affected_cpus *cpus;
297 297
298 if (!bitmask_isbitset(cpus_chosen, cpu) || 298 if (!bitmask_isbitset(cpus_chosen, cpu) ||
299 cpupower_is_cpu_online(cpu)) 299 cpupower_is_cpu_online(cpu) != 1)
300 continue; 300 continue;
301 301
302 cpus = cpufreq_get_related_cpus(cpu); 302 cpus = cpufreq_get_related_cpus(cpu);
@@ -316,10 +316,7 @@ int cmd_freq_set(int argc, char **argv)
316 cpu <= bitmask_last(cpus_chosen); cpu++) { 316 cpu <= bitmask_last(cpus_chosen); cpu++) {
317 317
318 if (!bitmask_isbitset(cpus_chosen, cpu) || 318 if (!bitmask_isbitset(cpus_chosen, cpu) ||
319 cpupower_is_cpu_online(cpu)) 319 cpupower_is_cpu_online(cpu) != 1)
320 continue;
321
322 if (cpupower_is_cpu_online(cpu) != 1)
323 continue; 320 continue;
324 321
325 printf(_("Setting cpu: %d\n"), cpu); 322 printf(_("Setting cpu: %d\n"), cpu);
diff --git a/tools/testing/nvdimm/Kbuild b/tools/testing/nvdimm/Kbuild
index 582db95127ed..405212be044a 100644
--- a/tools/testing/nvdimm/Kbuild
+++ b/tools/testing/nvdimm/Kbuild
@@ -14,6 +14,7 @@ ldflags-y += --wrap=devm_memremap_pages
14ldflags-y += --wrap=insert_resource 14ldflags-y += --wrap=insert_resource
15ldflags-y += --wrap=remove_resource 15ldflags-y += --wrap=remove_resource
16ldflags-y += --wrap=acpi_evaluate_object 16ldflags-y += --wrap=acpi_evaluate_object
17ldflags-y += --wrap=acpi_evaluate_dsm
17 18
18DRIVERS := ../../../drivers 19DRIVERS := ../../../drivers
19NVDIMM_SRC := $(DRIVERS)/nvdimm 20NVDIMM_SRC := $(DRIVERS)/nvdimm
diff --git a/tools/testing/nvdimm/test/iomap.c b/tools/testing/nvdimm/test/iomap.c
index 3ccef732fce9..64cae1a5deff 100644
--- a/tools/testing/nvdimm/test/iomap.c
+++ b/tools/testing/nvdimm/test/iomap.c
@@ -26,14 +26,17 @@ static LIST_HEAD(iomap_head);
26 26
27static struct iomap_ops { 27static struct iomap_ops {
28 nfit_test_lookup_fn nfit_test_lookup; 28 nfit_test_lookup_fn nfit_test_lookup;
29 nfit_test_evaluate_dsm_fn evaluate_dsm;
29 struct list_head list; 30 struct list_head list;
30} iomap_ops = { 31} iomap_ops = {
31 .list = LIST_HEAD_INIT(iomap_ops.list), 32 .list = LIST_HEAD_INIT(iomap_ops.list),
32}; 33};
33 34
34void nfit_test_setup(nfit_test_lookup_fn lookup) 35void nfit_test_setup(nfit_test_lookup_fn lookup,
36 nfit_test_evaluate_dsm_fn evaluate)
35{ 37{
36 iomap_ops.nfit_test_lookup = lookup; 38 iomap_ops.nfit_test_lookup = lookup;
39 iomap_ops.evaluate_dsm = evaluate;
37 list_add_rcu(&iomap_ops.list, &iomap_head); 40 list_add_rcu(&iomap_ops.list, &iomap_head);
38} 41}
39EXPORT_SYMBOL(nfit_test_setup); 42EXPORT_SYMBOL(nfit_test_setup);
@@ -367,4 +370,22 @@ acpi_status __wrap_acpi_evaluate_object(acpi_handle handle, acpi_string path,
367} 370}
368EXPORT_SYMBOL(__wrap_acpi_evaluate_object); 371EXPORT_SYMBOL(__wrap_acpi_evaluate_object);
369 372
373union acpi_object * __wrap_acpi_evaluate_dsm(acpi_handle handle, const u8 *uuid,
374 u64 rev, u64 func, union acpi_object *argv4)
375{
376 union acpi_object *obj = ERR_PTR(-ENXIO);
377 struct iomap_ops *ops;
378
379 rcu_read_lock();
380 ops = list_first_or_null_rcu(&iomap_head, typeof(*ops), list);
381 if (ops)
382 obj = ops->evaluate_dsm(handle, uuid, rev, func, argv4);
383 rcu_read_unlock();
384
385 if (IS_ERR(obj))
386 return acpi_evaluate_dsm(handle, uuid, rev, func, argv4);
387 return obj;
388}
389EXPORT_SYMBOL(__wrap_acpi_evaluate_dsm);
390
370MODULE_LICENSE("GPL v2"); 391MODULE_LICENSE("GPL v2");
diff --git a/tools/testing/nvdimm/test/nfit.c b/tools/testing/nvdimm/test/nfit.c
index c9a6458cb63e..71620fa95953 100644
--- a/tools/testing/nvdimm/test/nfit.c
+++ b/tools/testing/nvdimm/test/nfit.c
@@ -23,6 +23,7 @@
23#include <linux/sizes.h> 23#include <linux/sizes.h>
24#include <linux/list.h> 24#include <linux/list.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <nd-core.h>
26#include <nfit.h> 27#include <nfit.h>
27#include <nd.h> 28#include <nd.h>
28#include "nfit_test.h" 29#include "nfit_test.h"
@@ -1506,6 +1507,225 @@ static int nfit_test_blk_do_io(struct nd_blk_region *ndbr, resource_size_t dpa,
1506 return 0; 1507 return 0;
1507} 1508}
1508 1509
1510static unsigned long nfit_ctl_handle;
1511
1512union acpi_object *result;
1513
1514static union acpi_object *nfit_test_evaluate_dsm(acpi_handle handle,
1515 const u8 *uuid, u64 rev, u64 func, union acpi_object *argv4)
1516{
1517 if (handle != &nfit_ctl_handle)
1518 return ERR_PTR(-ENXIO);
1519
1520 return result;
1521}
1522
1523static int setup_result(void *buf, size_t size)
1524{
1525 result = kmalloc(sizeof(union acpi_object) + size, GFP_KERNEL);
1526 if (!result)
1527 return -ENOMEM;
1528 result->package.type = ACPI_TYPE_BUFFER,
1529 result->buffer.pointer = (void *) (result + 1);
1530 result->buffer.length = size;
1531 memcpy(result->buffer.pointer, buf, size);
1532 memset(buf, 0, size);
1533 return 0;
1534}
1535
1536static int nfit_ctl_test(struct device *dev)
1537{
1538 int rc, cmd_rc;
1539 struct nvdimm *nvdimm;
1540 struct acpi_device *adev;
1541 struct nfit_mem *nfit_mem;
1542 struct nd_ars_record *record;
1543 struct acpi_nfit_desc *acpi_desc;
1544 const u64 test_val = 0x0123456789abcdefULL;
1545 unsigned long mask, cmd_size, offset;
1546 union {
1547 struct nd_cmd_get_config_size cfg_size;
1548 struct nd_cmd_ars_status ars_stat;
1549 struct nd_cmd_ars_cap ars_cap;
1550 char buf[sizeof(struct nd_cmd_ars_status)
1551 + sizeof(struct nd_ars_record)];
1552 } cmds;
1553
1554 adev = devm_kzalloc(dev, sizeof(*adev), GFP_KERNEL);
1555 if (!adev)
1556 return -ENOMEM;
1557 *adev = (struct acpi_device) {
1558 .handle = &nfit_ctl_handle,
1559 .dev = {
1560 .init_name = "test-adev",
1561 },
1562 };
1563
1564 acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL);
1565 if (!acpi_desc)
1566 return -ENOMEM;
1567 *acpi_desc = (struct acpi_nfit_desc) {
1568 .nd_desc = {
1569 .cmd_mask = 1UL << ND_CMD_ARS_CAP
1570 | 1UL << ND_CMD_ARS_START
1571 | 1UL << ND_CMD_ARS_STATUS
1572 | 1UL << ND_CMD_CLEAR_ERROR,
1573 .module = THIS_MODULE,
1574 .provider_name = "ACPI.NFIT",
1575 .ndctl = acpi_nfit_ctl,
1576 },
1577 .dev = &adev->dev,
1578 };
1579
1580 nfit_mem = devm_kzalloc(dev, sizeof(*nfit_mem), GFP_KERNEL);
1581 if (!nfit_mem)
1582 return -ENOMEM;
1583
1584 mask = 1UL << ND_CMD_SMART | 1UL << ND_CMD_SMART_THRESHOLD
1585 | 1UL << ND_CMD_DIMM_FLAGS | 1UL << ND_CMD_GET_CONFIG_SIZE
1586 | 1UL << ND_CMD_GET_CONFIG_DATA | 1UL << ND_CMD_SET_CONFIG_DATA
1587 | 1UL << ND_CMD_VENDOR;
1588 *nfit_mem = (struct nfit_mem) {
1589 .adev = adev,
1590 .family = NVDIMM_FAMILY_INTEL,
1591 .dsm_mask = mask,
1592 };
1593
1594 nvdimm = devm_kzalloc(dev, sizeof(*nvdimm), GFP_KERNEL);
1595 if (!nvdimm)
1596 return -ENOMEM;
1597 *nvdimm = (struct nvdimm) {
1598 .provider_data = nfit_mem,
1599 .cmd_mask = mask,
1600 .dev = {
1601 .init_name = "test-dimm",
1602 },
1603 };
1604
1605
1606 /* basic checkout of a typical 'get config size' command */
1607 cmd_size = sizeof(cmds.cfg_size);
1608 cmds.cfg_size = (struct nd_cmd_get_config_size) {
1609 .status = 0,
1610 .config_size = SZ_128K,
1611 .max_xfer = SZ_4K,
1612 };
1613 rc = setup_result(cmds.buf, cmd_size);
1614 if (rc)
1615 return rc;
1616 rc = acpi_nfit_ctl(&acpi_desc->nd_desc, nvdimm, ND_CMD_GET_CONFIG_SIZE,
1617 cmds.buf, cmd_size, &cmd_rc);
1618
1619 if (rc < 0 || cmd_rc || cmds.cfg_size.status != 0
1620 || cmds.cfg_size.config_size != SZ_128K
1621 || cmds.cfg_size.max_xfer != SZ_4K) {
1622 dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
1623 __func__, __LINE__, rc, cmd_rc);
1624 return -EIO;
1625 }
1626
1627
1628 /* test ars_status with zero output */
1629 cmd_size = offsetof(struct nd_cmd_ars_status, address);
1630 cmds.ars_stat = (struct nd_cmd_ars_status) {
1631 .out_length = 0,
1632 };
1633 rc = setup_result(cmds.buf, cmd_size);
1634 if (rc)
1635 return rc;
1636 rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
1637 cmds.buf, cmd_size, &cmd_rc);
1638
1639 if (rc < 0 || cmd_rc) {
1640 dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
1641 __func__, __LINE__, rc, cmd_rc);
1642 return -EIO;
1643 }
1644
1645
1646 /* test ars_cap with benign extended status */
1647 cmd_size = sizeof(cmds.ars_cap);
1648 cmds.ars_cap = (struct nd_cmd_ars_cap) {
1649 .status = ND_ARS_PERSISTENT << 16,
1650 };
1651 offset = offsetof(struct nd_cmd_ars_cap, status);
1652 rc = setup_result(cmds.buf + offset, cmd_size - offset);
1653 if (rc)
1654 return rc;
1655 rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_CAP,
1656 cmds.buf, cmd_size, &cmd_rc);
1657
1658 if (rc < 0 || cmd_rc) {
1659 dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
1660 __func__, __LINE__, rc, cmd_rc);
1661 return -EIO;
1662 }
1663
1664
1665 /* test ars_status with 'status' trimmed from 'out_length' */
1666 cmd_size = sizeof(cmds.ars_stat) + sizeof(struct nd_ars_record);
1667 cmds.ars_stat = (struct nd_cmd_ars_status) {
1668 .out_length = cmd_size - 4,
1669 };
1670 record = &cmds.ars_stat.records[0];
1671 *record = (struct nd_ars_record) {
1672 .length = test_val,
1673 };
1674 rc = setup_result(cmds.buf, cmd_size);
1675 if (rc)
1676 return rc;
1677 rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
1678 cmds.buf, cmd_size, &cmd_rc);
1679
1680 if (rc < 0 || cmd_rc || record->length != test_val) {
1681 dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
1682 __func__, __LINE__, rc, cmd_rc);
1683 return -EIO;
1684 }
1685
1686
1687 /* test ars_status with 'Output (Size)' including 'status' */
1688 cmd_size = sizeof(cmds.ars_stat) + sizeof(struct nd_ars_record);
1689 cmds.ars_stat = (struct nd_cmd_ars_status) {
1690 .out_length = cmd_size,
1691 };
1692 record = &cmds.ars_stat.records[0];
1693 *record = (struct nd_ars_record) {
1694 .length = test_val,
1695 };
1696 rc = setup_result(cmds.buf, cmd_size);
1697 if (rc)
1698 return rc;
1699 rc = acpi_nfit_ctl(&acpi_desc->nd_desc, NULL, ND_CMD_ARS_STATUS,
1700 cmds.buf, cmd_size, &cmd_rc);
1701
1702 if (rc < 0 || cmd_rc || record->length != test_val) {
1703 dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
1704 __func__, __LINE__, rc, cmd_rc);
1705 return -EIO;
1706 }
1707
1708
1709 /* test extended status for get_config_size results in failure */
1710 cmd_size = sizeof(cmds.cfg_size);
1711 cmds.cfg_size = (struct nd_cmd_get_config_size) {
1712 .status = 1 << 16,
1713 };
1714 rc = setup_result(cmds.buf, cmd_size);
1715 if (rc)
1716 return rc;
1717 rc = acpi_nfit_ctl(&acpi_desc->nd_desc, nvdimm, ND_CMD_GET_CONFIG_SIZE,
1718 cmds.buf, cmd_size, &cmd_rc);
1719
1720 if (rc < 0 || cmd_rc >= 0) {
1721 dev_dbg(dev, "%s: failed at: %d rc: %d cmd_rc: %d\n",
1722 __func__, __LINE__, rc, cmd_rc);
1723 return -EIO;
1724 }
1725
1726 return 0;
1727}
1728
1509static int nfit_test_probe(struct platform_device *pdev) 1729static int nfit_test_probe(struct platform_device *pdev)
1510{ 1730{
1511 struct nvdimm_bus_descriptor *nd_desc; 1731 struct nvdimm_bus_descriptor *nd_desc;
@@ -1516,6 +1736,12 @@ static int nfit_test_probe(struct platform_device *pdev)
1516 union acpi_object *obj; 1736 union acpi_object *obj;
1517 int rc; 1737 int rc;
1518 1738
1739 if (strcmp(dev_name(&pdev->dev), "nfit_test.0") == 0) {
1740 rc = nfit_ctl_test(&pdev->dev);
1741 if (rc)
1742 return rc;
1743 }
1744
1519 nfit_test = to_nfit_test(&pdev->dev); 1745 nfit_test = to_nfit_test(&pdev->dev);
1520 1746
1521 /* common alloc */ 1747 /* common alloc */
@@ -1639,11 +1865,13 @@ static __init int nfit_test_init(void)
1639{ 1865{
1640 int rc, i; 1866 int rc, i;
1641 1867
1642 nfit_test_dimm = class_create(THIS_MODULE, "nfit_test_dimm"); 1868 nfit_test_setup(nfit_test_lookup, nfit_test_evaluate_dsm);
1643 if (IS_ERR(nfit_test_dimm))
1644 return PTR_ERR(nfit_test_dimm);
1645 1869
1646 nfit_test_setup(nfit_test_lookup); 1870 nfit_test_dimm = class_create(THIS_MODULE, "nfit_test_dimm");
1871 if (IS_ERR(nfit_test_dimm)) {
1872 rc = PTR_ERR(nfit_test_dimm);
1873 goto err_register;
1874 }
1647 1875
1648 for (i = 0; i < NUM_NFITS; i++) { 1876 for (i = 0; i < NUM_NFITS; i++) {
1649 struct nfit_test *nfit_test; 1877 struct nfit_test *nfit_test;
diff --git a/tools/testing/nvdimm/test/nfit_test.h b/tools/testing/nvdimm/test/nfit_test.h
index c281dd2e5e2d..f54c0032c6ff 100644
--- a/tools/testing/nvdimm/test/nfit_test.h
+++ b/tools/testing/nvdimm/test/nfit_test.h
@@ -31,11 +31,17 @@ struct nfit_test_resource {
31 void *buf; 31 void *buf;
32}; 32};
33 33
34union acpi_object;
35typedef void *acpi_handle;
36
34typedef struct nfit_test_resource *(*nfit_test_lookup_fn)(resource_size_t); 37typedef struct nfit_test_resource *(*nfit_test_lookup_fn)(resource_size_t);
38typedef union acpi_object *(*nfit_test_evaluate_dsm_fn)(acpi_handle handle,
39 const u8 *uuid, u64 rev, u64 func, union acpi_object *argv4);
35void __iomem *__wrap_ioremap_nocache(resource_size_t offset, 40void __iomem *__wrap_ioremap_nocache(resource_size_t offset,
36 unsigned long size); 41 unsigned long size);
37void __wrap_iounmap(volatile void __iomem *addr); 42void __wrap_iounmap(volatile void __iomem *addr);
38void nfit_test_setup(nfit_test_lookup_fn lookup); 43void nfit_test_setup(nfit_test_lookup_fn lookup,
44 nfit_test_evaluate_dsm_fn evaluate);
39void nfit_test_teardown(void); 45void nfit_test_teardown(void);
40struct nfit_test_resource *get_nfit_res(resource_size_t resource); 46struct nfit_test_resource *get_nfit_res(resource_size_t resource);
41#endif 47#endif
diff --git a/virt/kvm/arm/pmu.c b/virt/kvm/arm/pmu.c
index 6e9c40eea208..69ccce308458 100644
--- a/virt/kvm/arm/pmu.c
+++ b/virt/kvm/arm/pmu.c
@@ -305,7 +305,7 @@ void kvm_pmu_software_increment(struct kvm_vcpu *vcpu, u64 val)
305 continue; 305 continue;
306 type = vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i) 306 type = vcpu_sys_reg(vcpu, PMEVTYPER0_EL0 + i)
307 & ARMV8_PMU_EVTYPE_EVENT; 307 & ARMV8_PMU_EVTYPE_EVENT;
308 if ((type == ARMV8_PMU_EVTYPE_EVENT_SW_INCR) 308 if ((type == ARMV8_PMUV3_PERFCTR_SW_INCR)
309 && (enable & BIT(i))) { 309 && (enable & BIT(i))) {
310 reg = vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1; 310 reg = vcpu_sys_reg(vcpu, PMEVCNTR0_EL0 + i) + 1;
311 reg = lower_32_bits(reg); 311 reg = lower_32_bits(reg);
@@ -379,7 +379,8 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
379 eventsel = data & ARMV8_PMU_EVTYPE_EVENT; 379 eventsel = data & ARMV8_PMU_EVTYPE_EVENT;
380 380
381 /* Software increment event does't need to be backed by a perf event */ 381 /* Software increment event does't need to be backed by a perf event */
382 if (eventsel == ARMV8_PMU_EVTYPE_EVENT_SW_INCR) 382 if (eventsel == ARMV8_PMUV3_PERFCTR_SW_INCR &&
383 select_idx != ARMV8_PMU_CYCLE_IDX)
383 return; 384 return;
384 385
385 memset(&attr, 0, sizeof(struct perf_event_attr)); 386 memset(&attr, 0, sizeof(struct perf_event_attr));
@@ -391,7 +392,8 @@ void kvm_pmu_set_counter_event_type(struct kvm_vcpu *vcpu, u64 data,
391 attr.exclude_kernel = data & ARMV8_PMU_EXCLUDE_EL1 ? 1 : 0; 392 attr.exclude_kernel = data & ARMV8_PMU_EXCLUDE_EL1 ? 1 : 0;
392 attr.exclude_hv = 1; /* Don't count EL2 events */ 393 attr.exclude_hv = 1; /* Don't count EL2 events */
393 attr.exclude_host = 1; /* Don't count host events */ 394 attr.exclude_host = 1; /* Don't count host events */
394 attr.config = eventsel; 395 attr.config = (select_idx == ARMV8_PMU_CYCLE_IDX) ?
396 ARMV8_PMUV3_PERFCTR_CPU_CYCLES : eventsel;
395 397
396 counter = kvm_pmu_get_counter_value(vcpu, select_idx); 398 counter = kvm_pmu_get_counter_value(vcpu, select_idx);
397 /* The initial sample period (overflow count) of an event. */ 399 /* The initial sample period (overflow count) of an event. */
diff --git a/virt/kvm/arm/vgic/vgic-mmio.c b/virt/kvm/arm/vgic/vgic-mmio.c
index e18b30ddcdce..ebe1b9fa3c4d 100644
--- a/virt/kvm/arm/vgic/vgic-mmio.c
+++ b/virt/kvm/arm/vgic/vgic-mmio.c
@@ -453,17 +453,33 @@ struct vgic_io_device *kvm_to_vgic_iodev(const struct kvm_io_device *dev)
453 return container_of(dev, struct vgic_io_device, dev); 453 return container_of(dev, struct vgic_io_device, dev);
454} 454}
455 455
456static bool check_region(const struct vgic_register_region *region, 456static bool check_region(const struct kvm *kvm,
457 const struct vgic_register_region *region,
457 gpa_t addr, int len) 458 gpa_t addr, int len)
458{ 459{
459 if ((region->access_flags & VGIC_ACCESS_8bit) && len == 1) 460 int flags, nr_irqs = kvm->arch.vgic.nr_spis + VGIC_NR_PRIVATE_IRQS;
460 return true; 461
461 if ((region->access_flags & VGIC_ACCESS_32bit) && 462 switch (len) {
462 len == sizeof(u32) && !(addr & 3)) 463 case sizeof(u8):
463 return true; 464 flags = VGIC_ACCESS_8bit;
464 if ((region->access_flags & VGIC_ACCESS_64bit) && 465 break;
465 len == sizeof(u64) && !(addr & 7)) 466 case sizeof(u32):
466 return true; 467 flags = VGIC_ACCESS_32bit;
468 break;
469 case sizeof(u64):
470 flags = VGIC_ACCESS_64bit;
471 break;
472 default:
473 return false;
474 }
475
476 if ((region->access_flags & flags) && IS_ALIGNED(addr, len)) {
477 if (!region->bits_per_irq)
478 return true;
479
480 /* Do we access a non-allocated IRQ? */
481 return VGIC_ADDR_TO_INTID(addr, region->bits_per_irq) < nr_irqs;
482 }
467 483
468 return false; 484 return false;
469} 485}
@@ -477,7 +493,7 @@ static int dispatch_mmio_read(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
477 493
478 region = vgic_find_mmio_region(iodev->regions, iodev->nr_regions, 494 region = vgic_find_mmio_region(iodev->regions, iodev->nr_regions,
479 addr - iodev->base_addr); 495 addr - iodev->base_addr);
480 if (!region || !check_region(region, addr, len)) { 496 if (!region || !check_region(vcpu->kvm, region, addr, len)) {
481 memset(val, 0, len); 497 memset(val, 0, len);
482 return 0; 498 return 0;
483 } 499 }
@@ -510,10 +526,7 @@ static int dispatch_mmio_write(struct kvm_vcpu *vcpu, struct kvm_io_device *dev,
510 526
511 region = vgic_find_mmio_region(iodev->regions, iodev->nr_regions, 527 region = vgic_find_mmio_region(iodev->regions, iodev->nr_regions,
512 addr - iodev->base_addr); 528 addr - iodev->base_addr);
513 if (!region) 529 if (!region || !check_region(vcpu->kvm, region, addr, len))
514 return 0;
515
516 if (!check_region(region, addr, len))
517 return 0; 530 return 0;
518 531
519 switch (iodev->iodev_type) { 532 switch (iodev->iodev_type) {
diff --git a/virt/kvm/arm/vgic/vgic-mmio.h b/virt/kvm/arm/vgic/vgic-mmio.h
index 4c34d39d44a0..84961b4e4422 100644
--- a/virt/kvm/arm/vgic/vgic-mmio.h
+++ b/virt/kvm/arm/vgic/vgic-mmio.h
@@ -50,15 +50,15 @@ extern struct kvm_io_device_ops kvm_io_gic_ops;
50#define VGIC_ADDR_IRQ_MASK(bits) (((bits) * 1024 / 8) - 1) 50#define VGIC_ADDR_IRQ_MASK(bits) (((bits) * 1024 / 8) - 1)
51 51
52/* 52/*
53 * (addr & mask) gives us the byte offset for the INT ID, so we want to 53 * (addr & mask) gives us the _byte_ offset for the INT ID.
54 * divide this with 'bytes per irq' to get the INT ID, which is given 54 * We multiply this by 8 the get the _bit_ offset, then divide this by
55 * by '(bits) / 8'. But we do this with fixed-point-arithmetic and 55 * the number of bits to learn the actual INT ID.
56 * take advantage of the fact that division by a fraction equals 56 * But instead of a division (which requires a "long long div" implementation),
57 * multiplication with the inverted fraction, and scale up both the 57 * we shift by the binary logarithm of <bits>.
58 * numerator and denominator with 8 to support at most 64 bits per IRQ: 58 * This assumes that <bits> is a power of two.
59 */ 59 */
60#define VGIC_ADDR_TO_INTID(addr, bits) (((addr) & VGIC_ADDR_IRQ_MASK(bits)) * \ 60#define VGIC_ADDR_TO_INTID(addr, bits) (((addr) & VGIC_ADDR_IRQ_MASK(bits)) * \
61 64 / (bits) / 8) 61 8 >> ilog2(bits))
62 62
63/* 63/*
64 * Some VGIC registers store per-IRQ information, with a different number 64 * Some VGIC registers store per-IRQ information, with a different number
diff --git a/virt/kvm/arm/vgic/vgic-v2.c b/virt/kvm/arm/vgic/vgic-v2.c
index 0a063af40565..9bab86757fa4 100644
--- a/virt/kvm/arm/vgic/vgic-v2.c
+++ b/virt/kvm/arm/vgic/vgic-v2.c
@@ -50,8 +50,10 @@ void vgic_v2_process_maintenance(struct kvm_vcpu *vcpu)
50 50
51 WARN_ON(cpuif->vgic_lr[lr] & GICH_LR_STATE); 51 WARN_ON(cpuif->vgic_lr[lr] & GICH_LR_STATE);
52 52
53 kvm_notify_acked_irq(vcpu->kvm, 0, 53 /* Only SPIs require notification */
54 intid - VGIC_NR_PRIVATE_IRQS); 54 if (vgic_valid_spi(vcpu->kvm, intid))
55 kvm_notify_acked_irq(vcpu->kvm, 0,
56 intid - VGIC_NR_PRIVATE_IRQS);
55 } 57 }
56 } 58 }
57 59
diff --git a/virt/kvm/arm/vgic/vgic-v3.c b/virt/kvm/arm/vgic/vgic-v3.c
index 9f0dae397d9c..5c9f9745e6ca 100644
--- a/virt/kvm/arm/vgic/vgic-v3.c
+++ b/virt/kvm/arm/vgic/vgic-v3.c
@@ -41,8 +41,10 @@ void vgic_v3_process_maintenance(struct kvm_vcpu *vcpu)
41 41
42 WARN_ON(cpuif->vgic_lr[lr] & ICH_LR_STATE); 42 WARN_ON(cpuif->vgic_lr[lr] & ICH_LR_STATE);
43 43
44 kvm_notify_acked_irq(vcpu->kvm, 0, 44 /* Only SPIs require notification */
45 intid - VGIC_NR_PRIVATE_IRQS); 45 if (vgic_valid_spi(vcpu->kvm, intid))
46 kvm_notify_acked_irq(vcpu->kvm, 0,
47 intid - VGIC_NR_PRIVATE_IRQS);
46 } 48 }
47 49
48 /* 50 /*
diff --git a/virt/kvm/arm/vgic/vgic.c b/virt/kvm/arm/vgic/vgic.c
index 2893d5ba523a..6440b56ec90e 100644
--- a/virt/kvm/arm/vgic/vgic.c
+++ b/virt/kvm/arm/vgic/vgic.c
@@ -273,6 +273,18 @@ retry:
273 * no more work for us to do. 273 * no more work for us to do.
274 */ 274 */
275 spin_unlock(&irq->irq_lock); 275 spin_unlock(&irq->irq_lock);
276
277 /*
278 * We have to kick the VCPU here, because we could be
279 * queueing an edge-triggered interrupt for which we
280 * get no EOI maintenance interrupt. In that case,
281 * while the IRQ is already on the VCPU's AP list, the
282 * VCPU could have EOI'ed the original interrupt and
283 * won't see this one until it exits for some other
284 * reason.
285 */
286 if (vcpu)
287 kvm_vcpu_kick(vcpu);
276 return false; 288 return false;
277 } 289 }
278 290
diff --git a/virt/kvm/async_pf.c b/virt/kvm/async_pf.c
index 8035cc1eb955..efeceb0a222d 100644
--- a/virt/kvm/async_pf.c
+++ b/virt/kvm/async_pf.c
@@ -91,6 +91,7 @@ static void async_pf_execute(struct work_struct *work)
91 91
92 spin_lock(&vcpu->async_pf.lock); 92 spin_lock(&vcpu->async_pf.lock);
93 list_add_tail(&apf->link, &vcpu->async_pf.done); 93 list_add_tail(&apf->link, &vcpu->async_pf.done);
94 apf->vcpu = NULL;
94 spin_unlock(&vcpu->async_pf.lock); 95 spin_unlock(&vcpu->async_pf.lock);
95 96
96 /* 97 /*
@@ -113,6 +114,8 @@ static void async_pf_execute(struct work_struct *work)
113 114
114void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu) 115void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu)
115{ 116{
117 spin_lock(&vcpu->async_pf.lock);
118
116 /* cancel outstanding work queue item */ 119 /* cancel outstanding work queue item */
117 while (!list_empty(&vcpu->async_pf.queue)) { 120 while (!list_empty(&vcpu->async_pf.queue)) {
118 struct kvm_async_pf *work = 121 struct kvm_async_pf *work =
@@ -120,6 +123,14 @@ void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu)
120 typeof(*work), queue); 123 typeof(*work), queue);
121 list_del(&work->queue); 124 list_del(&work->queue);
122 125
126 /*
127 * We know it's present in vcpu->async_pf.done, do
128 * nothing here.
129 */
130 if (!work->vcpu)
131 continue;
132
133 spin_unlock(&vcpu->async_pf.lock);
123#ifdef CONFIG_KVM_ASYNC_PF_SYNC 134#ifdef CONFIG_KVM_ASYNC_PF_SYNC
124 flush_work(&work->work); 135 flush_work(&work->work);
125#else 136#else
@@ -129,9 +140,9 @@ void kvm_clear_async_pf_completion_queue(struct kvm_vcpu *vcpu)
129 kmem_cache_free(async_pf_cache, work); 140 kmem_cache_free(async_pf_cache, work);
130 } 141 }
131#endif 142#endif
143 spin_lock(&vcpu->async_pf.lock);
132 } 144 }
133 145
134 spin_lock(&vcpu->async_pf.lock);
135 while (!list_empty(&vcpu->async_pf.done)) { 146 while (!list_empty(&vcpu->async_pf.done)) {
136 struct kvm_async_pf *work = 147 struct kvm_async_pf *work =
137 list_first_entry(&vcpu->async_pf.done, 148 list_first_entry(&vcpu->async_pf.done,
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 5c360347a1e9..7f9ee2929cfe 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -2889,10 +2889,10 @@ static int kvm_ioctl_create_device(struct kvm *kvm,
2889 2889
2890 ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC); 2890 ret = anon_inode_getfd(ops->name, &kvm_device_fops, dev, O_RDWR | O_CLOEXEC);
2891 if (ret < 0) { 2891 if (ret < 0) {
2892 ops->destroy(dev);
2893 mutex_lock(&kvm->lock); 2892 mutex_lock(&kvm->lock);
2894 list_del(&dev->vm_node); 2893 list_del(&dev->vm_node);
2895 mutex_unlock(&kvm->lock); 2894 mutex_unlock(&kvm->lock);
2895 ops->destroy(dev);
2896 return ret; 2896 return ret;
2897 } 2897 }
2898 2898