]> Git Repo - J-linux.git/commitdiff
ASoC: Merge up fixes
authorMark Brown <[email protected]>
Tue, 29 Nov 2022 12:55:12 +0000 (12:55 +0000)
committerMark Brown <[email protected]>
Tue, 29 Nov 2022 12:55:51 +0000 (12:55 +0000)
Merge the fixes branch up so we can apply further AMD work.

1  2 
.mailmap
MAINTAINERS
sound/soc/codecs/tas2780.c
sound/soc/fsl/fsl_micfil.c
sound/soc/fsl/fsl_sai.c
sound/soc/intel/boards/bytcht_es8316.c
sound/soc/soc-core.c
sound/soc/soc-dapm.c
sound/soc/soc-pcm.c
sound/soc/sof/topology.c

diff --combined .mailmap
index fdd7989492fc35c441554944b7ccf37eff521131,84342d7814077637341fd8d4aeb263265bfee292..406b99f7ea8b9c5d4288736f0d25326d6f0ca380
+++ b/.mailmap
@@@ -104,7 -104,6 +104,7 @@@ Christoph Hellwig <[email protected]
  Colin Ian King <[email protected]> <[email protected]>
  Corey Minyard <[email protected]>
  Damian Hobson-Garcia <[email protected]>
 +Dan Carpenter <[email protected]> <[email protected]>
  Daniel Borkmann <[email protected]> <[email protected]>
  Daniel Borkmann <[email protected]> <[email protected]>
  Daniel Borkmann <[email protected]> <[email protected]>
@@@ -354,8 -353,7 +354,8 @@@ Peter Oruba <[email protected]
  Pratyush Anand <[email protected]> <[email protected]>
  Praveen BP <[email protected]>
  Punit Agrawal <[email protected]> <[email protected]>
  Quentin Monnet <[email protected]> <[email protected]>
  Quentin Perret <[email protected]> <[email protected]>
  Rafael J. Wysocki <[email protected]> <[email protected]>
@@@ -416,6 -414,7 +416,7 @@@ TripleX Chung <[email protected]> <trip
  TripleX Chung <[email protected]> <[email protected]>
  Tsuneo Yoshioka <[email protected]>
  Tycho Andersen <[email protected]> <[email protected]>
+ Tzung-Bi Shih <[email protected]> <[email protected]>
  Uwe Kleine-König <[email protected]>
  Uwe Kleine-König <[email protected]>
  Uwe Kleine-König <[email protected]>
diff --combined MAINTAINERS
index bdc084dadfe1e0766ec1cecec061b2789836c88f,f9749afc0b9d72cd044d54eea3318aae61736221..774e200ec870562403ac18f44415960ef7d3d09c
@@@ -3984,7 -3984,7 +3984,7 @@@ M:      Rafał Miłecki <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/arm/bcm/brcm,bcmbca.yaml
  F:    arch/arm64/boot/dts/broadcom/bcmbca/*
  N:    bcmbca
@@@ -4009,7 -4009,7 +4009,7 @@@ R:      Broadcom internal kernel review lis
  L:    [email protected] (moderated for non-subscribers)
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    drivers/pci/controller/pcie-brcmstb.c
  F:    drivers/staging/vc04_services
@@@ -4023,7 -4023,7 +4023,7 @@@ M:      Ray Jui <[email protected]
  M:    Scott Branden <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  S:    Maintained
 -T:    git git://github.com/broadcom/mach-bcm
 +T:    git https://github.com/broadcom/mach-bcm
  F:    arch/arm/mach-bcm/
  N:    bcm281*
  N:    bcm113*
@@@ -4088,7 -4088,7 +4088,7 @@@ M:      Florian Fainelli <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    Documentation/devicetree/bindings/pci/brcm,stb-pcie.yaml
  F:    arch/arm/boot/dts/bcm7*.dts*
  F:    arch/arm/include/asm/hardware/cache-b15-rac.h
@@@ -4101,7 -4101,6 +4101,7 @@@ N:      bcm703
  N:    bcm7120
  
  BROADCOM BDC DRIVER
 +M:    Justin Chen <[email protected]>
  M:    Al Cooper <[email protected]>
  L:    [email protected]
  R:    Broadcom internal kernel review list <[email protected]>
@@@ -4121,7 -4120,7 +4121,7 @@@ M:      Florian Fainelli <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    arch/mips/bmips/*
  F:    arch/mips/boot/dts/brcm/bcm*.dts*
  F:    arch/mips/include/asm/mach-bmips/*
@@@ -4208,7 -4207,6 +4208,7 @@@ F:      Documentation/devicetree/bindings/se
  F:    drivers/tty/serial/8250/8250_bcm7271.c
  
  BROADCOM BRCMSTB USB EHCI DRIVER
 +M:    Justin Chen <[email protected]>
  M:    Al Cooper <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
@@@ -4225,7 -4223,6 +4225,7 @@@ F:      Documentation/devicetree/bindings/us
  F:    drivers/usb/misc/brcmstb-usb-pinmap.c
  
  BROADCOM BRCMSTB USB2 and USB3 PHY DRIVER
 +M:    Justin Chen <[email protected]>
  M:    Al Cooper <[email protected]>
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
@@@ -4262,7 -4259,7 +4262,7 @@@ M:      Scott Branden <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    arch/arm64/boot/dts/broadcom/northstar2/*
  F:    arch/arm64/boot/dts/broadcom/stingray/*
  F:    drivers/clk/bcm/clk-ns*
@@@ -4332,7 -4329,7 +4332,7 @@@ M:      Florian Fainelli <[email protected]
  R:    Broadcom internal kernel review list <[email protected]>
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/broadcom/stblinux.git
 +T:    git https://github.com/broadcom/stblinux.git
  F:    drivers/soc/bcm/bcm63xx/bcm-pmb.c
  F:    include/dt-bindings/soc/bcm-pmb.h
  
@@@ -4462,15 -4459,13 +4462,15 @@@ M:   Josef Bacik <[email protected]
  M:    David Sterba <[email protected]>
  L:    [email protected]
  S:    Maintained
 -W:    http://btrfs.wiki.kernel.org/
 -Q:    http://patchwork.kernel.org/project/linux-btrfs/list/
 +W:    https://btrfs.readthedocs.io
 +W:    https://btrfs.wiki.kernel.org/
 +Q:    https://patchwork.kernel.org/project/linux-btrfs/list/
  C:    irc://irc.libera.chat/btrfs
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux.git
  F:    Documentation/filesystems/btrfs.rst
  F:    fs/btrfs/
  F:    include/linux/btrfs*
 +F:    include/trace/events/btrfs.h
  F:    include/uapi/linux/btrfs*
  
  BTTV VIDEO4LINUX DRIVER
@@@ -4911,7 -4906,7 +4911,7 @@@ F:      drivers/platform/chrome
  
  CHROMEOS EC CODEC DRIVER
  M:    Cheng-Yi Chiang <[email protected]>
- M:    Tzung-Bi Shih <tzungbi@google.com>
+ M:    Tzung-Bi Shih <tzungbi@kernel.org>
  R:    Guenter Roeck <[email protected]>
  L:    [email protected]
  S:    Maintained
@@@ -5041,7 -5036,7 +5041,7 @@@ F:      drivers/scsi/snic
  
  CISCO VIC ETHERNET NIC DRIVER
  M:    Christian Benvenuti <[email protected]>
 -M:    Govindarajulu Varadarajan <_govind@gmx.com>
 +M:    Satish Kharat <satishkh@cisco.com>
  S:    Supported
  F:    drivers/net/ethernet/cisco/enic/
  
@@@ -5271,7 -5266,6 +5271,7 @@@ F:      tools/testing/selftests/cgroup
  
  CONTROL GROUP - BLOCK IO CONTROLLER (BLKIO)
  M:    Tejun Heo <[email protected]>
 +M:    Josef Bacik <[email protected]>
  M:    Jens Axboe <[email protected]>
  L:    [email protected]
  L:    [email protected]
@@@ -5279,7 -5273,6 +5279,7 @@@ T:      git git://git.kernel.dk/linux-bloc
  F:    Documentation/admin-guide/cgroup-v1/blkio-controller.rst
  F:    block/bfq-cgroup.c
  F:    block/blk-cgroup.c
 +F:    block/blk-iocost.c
  F:    block/blk-iolatency.c
  F:    block/blk-throttle.c
  F:    include/linux/blk-cgroup.h
@@@ -6287,7 -6280,7 +6287,7 @@@ M:      Sakari Ailus <[email protected]
  L:    [email protected]
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
 -F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.txt
 +F:    Documentation/devicetree/bindings/media/i2c/dongwoon,dw9714.yaml
  F:    drivers/media/i2c/dw9714.c
  
  DONGWOON DW9768 LENS VOICE COIL DRIVER
@@@ -8602,8 -8595,8 +8602,8 @@@ F:      include/asm-generic
  F:    include/uapi/asm-generic/
  
  GENERIC PHY FRAMEWORK
 -M:    Kishon Vijay Abraham I <[email protected]>
  M:    Vinod Koul <[email protected]>
 +M:    Kishon Vijay Abraham I <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-phy/list/
@@@ -9217,7 -9210,7 +9217,7 @@@ W:      https://www.hisilicon.co
  F:    drivers/i2c/busses/i2c-hisi.c
  
  HISILICON LPC BUS DRIVER
 -M:    [email protected]
 +M:    Jay Fang <[email protected]>
  S:    Maintained
  W:    http://www.hisilicon.com
  F:    Documentation/devicetree/bindings/arm/hisilicon/low-pin-count.yaml
@@@ -9341,7 -9334,7 +9341,7 @@@ S:      Maintaine
  F:    drivers/crypto/hisilicon/trng/trng.c
  
  HISILICON V3XX SPI NOR FLASH Controller Driver
 -M:    John Garry <john.garry@huawei.com>
 +M:    Jay Fang <f.fangjian@huawei.com>
  S:    Maintained
  W:    http://www.hisilicon.com
  F:    drivers/spi/spi-hisi-sfc-v3xx.c
@@@ -9507,6 -9500,7 +9507,6 @@@ F:      drivers/media/i2c/hi847.
  Hyper-V/Azure CORE AND DRIVERS
  M:    "K. Y. Srinivasan" <[email protected]>
  M:    Haiyang Zhang <[email protected]>
 -M:    Stephen Hemminger <[email protected]>
  M:    Wei Liu <[email protected]>
  M:    Dexuan Cui <[email protected]>
  L:    [email protected]
@@@ -9777,10 -9771,7 +9777,10 @@@ S:    Supporte
  F:    drivers/pci/hotplug/rpaphp*
  
  IBM Power SRIOV Virtual NIC Device Driver
 -M:    Dany Madden <[email protected]>
 +M:    Haren Myneni <[email protected]>
 +M:    Rick Lindsley <[email protected]>
 +R:    Nick Child <[email protected]>
 +R:    Dany Madden <[email protected]>
  R:    Thomas Falcon <[email protected]>
  L:    [email protected]
  S:    Supported
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
 -T:    git git://github.com/kvm-riscv/linux.git
 +T:    git https://github.com/kvm-riscv/linux.git
  F:    arch/riscv/include/asm/kvm*
  F:    arch/riscv/include/uapi/asm/kvm*
  F:    arch/riscv/kvm/
@@@ -11263,6 -11254,7 +11263,6 @@@ M:   Claudio Imbrenda <[email protected]
  R:    David Hildenbrand <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux.git
  F:    Documentation/virt/kvm/s390*
  F:    arch/s390/include/asm/gmap.h
@@@ -12225,6 -12217,7 +12225,6 @@@ F:   arch/mips/boot/dts/img/pistachio
  
  MARVELL 88E6XXX ETHERNET SWITCH FABRIC DRIVER
  M:    Andrew Lunn <[email protected]>
 -M:    Vivien Didelot <[email protected]>
  L:    [email protected]
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/dsa/marvell.txt
@@@ -14322,6 -14315,7 +14322,6 @@@ F:   drivers/net/wireless
  
  NETWORKING [DSA]
  M:    Andrew Lunn <[email protected]>
 -M:    Vivien Didelot <[email protected]>
  M:    Florian Fainelli <[email protected]>
  M:    Vladimir Oltean <[email protected]>
  S:    Maintained
  S:    Supported
  W:    https://nilfs.sourceforge.io/
  W:    https://nilfs.osdn.jp/
 -T:    git git://github.com/konis/nilfs2.git
 +T:    git https://github.com/konis/nilfs2.git
  F:    Documentation/filesystems/nilfs2.rst
  F:    fs/nilfs2/
  F:    include/trace/events/nilfs2.h
@@@ -14715,12 -14709,6 +14715,12 @@@ F: drivers/nvme/target/auth.
  F:    drivers/nvme/target/fabrics-cmd-auth.c
  F:    include/linux/nvme-auth.h
  
 +NVM EXPRESS HARDWARE MONITORING SUPPORT
 +M:    Guenter Roeck <[email protected]>
 +L:    [email protected]
 +S:    Supported
 +F:    drivers/nvme/host/hwmon.c
 +
  NVM EXPRESS FC TRANSPORT DRIVERS
  M:    James Smart <[email protected]>
  L:    [email protected]
@@@ -15438,7 -15426,6 +15438,7 @@@ S:   Maintaine
  W:    http://openvswitch.org
  F:    include/uapi/linux/openvswitch.h
  F:    net/openvswitch/
 +F:    tools/testing/selftests/net/openvswitch/
  
  OPERATING PERFORMANCE POINTS (OPP)
  M:    Viresh Kumar <[email protected]>
@@@ -15630,7 -15617,7 +15630,7 @@@ F:   drivers/input/serio/gscps2.
  F:    drivers/input/serio/hp_sdc*
  F:    drivers/parisc/
  F:    drivers/parport/parport_gsc.*
 -F:    drivers/tty/serial/8250/8250_gsc.c
 +F:    drivers/tty/serial/8250/8250_parisc.c
  F:    drivers/video/console/sti*
  F:    drivers/video/fbdev/sti*
  F:    drivers/video/logo/logo_parisc*
@@@ -15852,7 -15839,7 +15852,7 @@@ F:   Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/dwc/*designware*
  
  PCI DRIVER FOR TI DRA7XX/J721E
 -M:    Kishon Vijay Abraham I <kishon@ti.com>
 +M:    Vignesh Raghavendra <vigneshr@ti.com>
  L:    [email protected]
  L:    [email protected]
  L:    [email protected] (moderated for non-subscribers)
@@@ -15869,10 -15856,10 +15869,10 @@@ F:        Documentation/devicetree/bindings/pc
  F:    drivers/pci/controller/pci-v3-semi.c
  
  PCI ENDPOINT SUBSYSTEM
 -M:    Kishon Vijay Abraham I <[email protected]>
  M:    Lorenzo Pieralisi <[email protected]>
  R:    Krzysztof Wilczyński <[email protected]>
  R:    Manivannan Sadhasivam <[email protected]>
 +R:    Kishon Vijay Abraham I <[email protected]>
  L:    [email protected]
  S:    Supported
  Q:    https://patchwork.kernel.org/project/linux-pci/list/
@@@ -16678,7 -16665,6 +16678,7 @@@ F:   Documentation/driver-api/ptp.rs
  F:    drivers/net/phy/dp83640*
  F:    drivers/ptp/*
  F:    include/linux/ptp_cl*
 +K:    (?:\b|_)ptp(?:\b|_)
  
  PTP VIRTUAL CLOCK SUPPORT
  M:    Yangbo Lu <[email protected]>
@@@ -16799,7 -16785,7 +16799,7 @@@ M:   Srinivas Kandagatla <srinivas.kandag
  M:    Banajit Goswami <[email protected]>
  L:    [email protected] (moderated for non-subscribers)
  S:    Supported
 -F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr.yaml
 +F:    Documentation/devicetree/bindings/soc/qcom/qcom,apr*
  F:    Documentation/devicetree/bindings/sound/qcom,*
  F:    drivers/soc/qcom/apr.c
  F:    include/dt-bindings/sound/qcom,wcd9335.h
@@@ -17815,7 -17801,7 +17815,7 @@@ S:   Odd Fixe
  F:    drivers/tty/serial/rp2.*
  
  ROHM BD99954 CHARGER IC
 -R:    Matti Vaittinen <[email protected]>
 +M:    Matti Vaittinen <[email protected]>
  S:    Supported
  F:    drivers/power/supply/bd99954-charger.c
  F:    drivers/power/supply/bd99954-charger.h
@@@ -17838,7 -17824,7 +17838,7 @@@ F:   drivers/regulator/bd9571mwv-regulato
  F:    include/linux/mfd/bd9571mwv.h
  
  ROHM POWER MANAGEMENT IC DEVICE DRIVERS
 -R:    Matti Vaittinen <[email protected]>
 +M:    Matti Vaittinen <[email protected]>
  S:    Supported
  F:    drivers/clk/clk-bd718x7.c
  F:    drivers/gpio/gpio-bd71815.c
@@@ -18000,6 -17986,7 +18000,6 @@@ R:   Christian Borntraeger <borntraeger@l
  R:    Sven Schnelle <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  T:    git git://git.kernel.org/pub/scm/linux/kernel/git/s390/linux.git
  F:    Documentation/driver-api/s390-drivers.rst
  F:    Documentation/s390/
@@@ -18011,6 -17998,7 +18011,6 @@@ M:   Vineeth Vijayan <[email protected]
  M:    Peter Oberparleiter <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/cio/
  
  S390 DASD DRIVER
@@@ -18018,6 -18006,7 +18018,6 @@@ M:   Stefan Haberland <[email protected]
  M:    Jan Hoeppner <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    block/partitions/ibm.c
  F:    drivers/s390/block/dasd*
  F:    include/linux/dasd_mod.h
@@@ -18027,6 -18016,7 +18027,6 @@@ M:   Matthew Rosato <[email protected]
  M:    Gerald Schaefer <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/iommu/s390-iommu.c
  
  S390 IUCV NETWORK LAYER
@@@ -18035,6 -18025,7 +18035,6 @@@ M:   Wenjia Zhang <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/*iucv*
  F:    include/net/iucv/
  F:    net/iucv/
@@@ -18045,6 -18036,7 +18045,6 @@@ M:   Wenjia Zhang <[email protected]
  L:    [email protected]
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/net/
  
  S390 PCI SUBSYSTEM
@@@ -18052,6 -18044,7 +18052,6 @@@ M:   Niklas Schnelle <[email protected].
  M:    Gerald Schaefer <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    arch/s390/pci/
  F:    drivers/pci/hotplug/s390_pci_hpc.c
  F:    Documentation/s390/pci.rst
@@@ -18062,6 -18055,7 +18062,6 @@@ M:   Halil Pasic <[email protected]
  M:    Jason Herne <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    Documentation/s390/vfio-ap*
  F:    drivers/s390/crypto/vfio_ap*
  
@@@ -18090,6 -18084,7 +18090,6 @@@ S390 ZCRYPT DRIVE
  M:    Harald Freudenberger <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/crypto/
  
  S390 ZFCP DRIVER
@@@ -18097,6 -18092,7 +18097,6 @@@ M:   Steffen Maier <[email protected]
  M:    Benjamin Block <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    drivers/s390/scsi/zfcp_*
  
  S3C ADC BATTERY DRIVER
  S:    Maintained
  T:    git git://linuxtv.org/media_tree.git
  F:    drivers/staging/media/deprecated/saa7146/
 -F:    include/media/drv-intf/saa7146*
  
  SAFESETID SECURITY MODULE
  M:    Micah Morton <[email protected]>
@@@ -18214,6 -18211,7 +18214,6 @@@ F:   include/media/drv-intf/s3c_camif.
  
  SAMSUNG S3FWRN5 NFC DRIVER
  M:    Krzysztof Kozlowski <[email protected]>
 -M:    Krzysztof Opasiak <[email protected]>
  L:    [email protected] (subscribers-only)
  S:    Maintained
  F:    Documentation/devicetree/bindings/net/nfc/samsung,s3fwrn5.yaml
@@@ -18668,6 -18666,7 +18668,6 @@@ M:   Wenjia Zhang <[email protected]
  M:    Jan Karcher <[email protected]>
  L:    [email protected]
  S:    Supported
 -W:    http://www.ibm.com/developerworks/linux/linux390/
  F:    net/smc/
  
  SHARP GP2AP002A00F/GP2AP002S00F SENSOR DRIVER
@@@ -18778,7 -18777,7 +18778,7 @@@ M:   Palmer Dabbelt <[email protected]
  M:    Paul Walmsley <[email protected]>
  L:    [email protected]
  S:    Supported
 -T:    git git://github.com/sifive/riscv-linux.git
 +T:    git https://github.com/sifive/riscv-linux.git
  N:    sifive
  K:    [^@]sifive
  
@@@ -21182,6 -21181,15 +21182,6 @@@ S:  Maintaine
  F:    Documentation/usb/ehci.rst
  F:    drivers/usb/host/ehci*
  
 -USB GADGET/PERIPHERAL SUBSYSTEM
 -M:    Felipe Balbi <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -W:    http://www.linux-usb.org/gadget
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -F:    drivers/usb/gadget/
 -F:    include/linux/usb/gadget*
 -
  USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
  M:    Jiri Kosina <[email protected]>
  M:    Benjamin Tissoires <[email protected]>
  L:    [email protected]
  S:    Maintained
  W:    https://github.com/petkan/pegasus
 -T:    git git://github.com/petkan/pegasus.git
 +T:    git https://github.com/petkan/pegasus.git
  F:    drivers/net/usb/pegasus.*
  
 -USB PHY LAYER
 -M:    Felipe Balbi <[email protected]>
 -L:    [email protected]
 -S:    Maintained
 -T:    git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
 -F:    drivers/usb/phy/
 -
  USB PRINTER DRIVER (usblp)
  M:    Pete Zaitcev <[email protected]>
  L:    [email protected]
  L:    [email protected]
  S:    Maintained
  W:    https://github.com/petkan/rtl8150
 -T:    git git://github.com/petkan/rtl8150.git
 +T:    git https://github.com/petkan/rtl8150.git
  F:    drivers/net/usb/rtl8150.c
  
  USB SERIAL SUBSYSTEM
@@@ -22106,7 -22121,6 +22106,7 @@@ F:   Documentation/watchdog
  F:    drivers/watchdog/
  F:    include/linux/watchdog.h
  F:    include/uapi/linux/watchdog.h
 +F:    include/trace/events/watchdog.h
  
  WHISKEYCOVE PMIC GPIO DRIVER
  M:    Kuppuswamy Sathyanarayanan <[email protected]>
@@@ -22747,7 -22761,7 +22747,7 @@@ S:   Maintaine
  W:    http://mjpeg.sourceforge.net/driver-zoran/
  Q:    https://patchwork.linuxtv.org/project/linux-media/list/
  F:    Documentation/driver-api/media/drivers/zoran.rst
 -F:    drivers/staging/media/zoran/
 +F:    drivers/media/pci/zoran/
  
  ZRAM COMPRESSED RAM BLOCK DEVICE DRVIER
  M:    Minchan Kim <[email protected]>
index 9e3108fd35194faf2f7100b9d4a59b0e1dc3fea3,afdf0c863aa10d9dc07de991eefdc8bcd81b4a7f..09e7ada1bca4e9f53fc36445eff20267e138c04d
@@@ -380,20 -380,13 +380,13 @@@ static int tas2780_set_dai_tdm_slot(str
        if (tx_mask == 0 || rx_mask != 0)
                return -EINVAL;
  
-       if (slots == 1) {
-               if (tx_mask != 1)
-                       return -EINVAL;
-               left_slot = 0;
-               right_slot = 0;
+       left_slot = __ffs(tx_mask);
+       tx_mask &= ~(1 << left_slot);
+       if (tx_mask == 0) {
+               right_slot = left_slot;
        } else {
-               left_slot = __ffs(tx_mask);
-               tx_mask &= ~(1 << left_slot);
-               if (tx_mask == 0) {
-                       right_slot = left_slot;
-               } else {
-                       right_slot = __ffs(tx_mask);
-                       tx_mask &= ~(1 << right_slot);
-               }
+               right_slot = __ffs(tx_mask);
+               tx_mask &= ~(1 << right_slot);
        }
  
        if (tx_mask != 0 || left_slot >= slots || right_slot >= slots)
@@@ -598,7 -591,8 +591,7 @@@ static int tas2780_parse_dt(struct devi
        return 0;
  }
  
 -static int tas2780_i2c_probe(struct i2c_client *client,
 -                      const struct i2c_device_id *id)
 +static int tas2780_i2c_probe(struct i2c_client *client)
  {
        struct tas2780_priv *tas2780;
        int result;
@@@ -652,7 -646,7 +645,7 @@@ static struct i2c_driver tas2780_i2c_dr
                .name   = "tas2780",
                .of_match_table = of_match_ptr(tas2780_of_match),
        },
 -      .probe  = tas2780_i2c_probe,
 +      .probe_new  = tas2780_i2c_probe,
        .id_table   = tas2780_i2c_id,
  };
  module_i2c_driver(tas2780_i2c_driver);
index 22e75c14cac4be8953fb3afaa68228658351f59e,4b86ef82fd930ae8f2a2d30d5f1a1e941fee8ed0..7b17f152bbf3cb344f76a62e592299be8e5c016e
@@@ -47,15 -47,11 +47,15 @@@ struct fsl_micfil 
        struct clk *pll11k_clk;
        struct snd_dmaengine_dai_dma_data dma_params_rx;
        struct sdma_peripheral_config sdmacfg;
 +      struct snd_soc_card *card;
        unsigned int dataline;
        char name[32];
        int irq[MICFIL_IRQ_LINES];
        enum quality quality;
        int dc_remover;
 +      int vad_init_mode;
 +      int vad_enabled;
 +      int vad_detected;
  };
  
  struct fsl_micfil_soc_data {
@@@ -63,7 -59,6 +63,7 @@@
        unsigned int fifo_depth;
        unsigned int dataline;
        bool imx;
 +      bool use_edma;
        u64  formats;
  };
  
@@@ -83,19 -78,9 +83,19 @@@ static struct fsl_micfil_soc_data fsl_m
        .formats = SNDRV_PCM_FMTBIT_S32_LE,
  };
  
 +static struct fsl_micfil_soc_data fsl_micfil_imx93 = {
 +      .imx = true,
 +      .fifos = 8,
 +      .fifo_depth = 32,
 +      .dataline =  0xf,
 +      .formats = SNDRV_PCM_FMTBIT_S32_LE,
 +      .use_edma = true,
 +};
 +
  static const struct of_device_id fsl_micfil_dt_ids[] = {
        { .compatible = "fsl,imx8mm-micfil", .data = &fsl_micfil_imx8mm },
        { .compatible = "fsl,imx8mp-micfil", .data = &fsl_micfil_imx8mp },
 +      { .compatible = "fsl,imx93-micfil", .data = &fsl_micfil_imx93 },
        {}
  };
  MODULE_DEVICE_TABLE(of, fsl_micfil_dt_ids);
@@@ -167,152 -152,6 +167,152 @@@ static int micfil_quality_set(struct sn
        return micfil_set_quality(micfil);
  }
  
 +static const char * const micfil_hwvad_enable[] = {
 +      "Disable (Record only)",
 +      "Enable (Record with Vad)",
 +};
 +
 +static const char * const micfil_hwvad_init_mode[] = {
 +      "Envelope mode", "Energy mode",
 +};
 +
 +static const char * const micfil_hwvad_hpf_texts[] = {
 +      "Filter bypass",
 +      "Cut-off @1750Hz",
 +      "Cut-off @215Hz",
 +      "Cut-off @102Hz",
 +};
 +
 +/*
 + * DC Remover Control
 + * Filter Bypassed    1 1
 + * Cut-off @21Hz      0 0
 + * Cut-off @83Hz      0 1
 + * Cut-off @152HZ     1 0
 + */
 +static const char * const micfil_dc_remover_texts[] = {
 +      "Cut-off @21Hz", "Cut-off @83Hz",
 +      "Cut-off @152Hz", "Bypass",
 +};
 +
 +static const struct soc_enum hwvad_enable_enum =
 +      SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(micfil_hwvad_enable),
 +                          micfil_hwvad_enable);
 +static const struct soc_enum hwvad_init_mode_enum =
 +      SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(micfil_hwvad_init_mode),
 +                          micfil_hwvad_init_mode);
 +static const struct soc_enum hwvad_hpf_enum =
 +      SOC_ENUM_SINGLE(REG_MICFIL_VAD0_CTRL2, 0,
 +                      ARRAY_SIZE(micfil_hwvad_hpf_texts),
 +                      micfil_hwvad_hpf_texts);
 +static const struct soc_enum fsl_micfil_dc_remover_enum =
 +      SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(micfil_dc_remover_texts),
 +                          micfil_dc_remover_texts);
 +
 +static int micfil_put_dc_remover_state(struct snd_kcontrol *kcontrol,
 +                                     struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +      unsigned int *item = ucontrol->value.enumerated.item;
 +      int val = snd_soc_enum_item_to_val(e, item[0]);
 +      int i = 0, ret = 0;
 +      u32 reg_val = 0;
 +
 +      if (val < 0 || val > 3)
 +              return -EINVAL;
 +
 +      micfil->dc_remover = val;
 +
 +      /* Calculate total value for all channels */
 +      for (i = 0; i < MICFIL_OUTPUT_CHANNELS; i++)
 +              reg_val |= val << MICFIL_DC_CHX_SHIFT(i);
 +
 +      /* Update DC Remover mode for all channels */
 +      ret = snd_soc_component_update_bits(comp, REG_MICFIL_DC_CTRL,
 +                                          MICFIL_DC_CTRL_CONFIG, reg_val);
 +      if (ret < 0)
 +              return ret;
 +
 +      return 0;
 +}
 +
 +static int micfil_get_dc_remover_state(struct snd_kcontrol *kcontrol,
 +                                     struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +
 +      ucontrol->value.enumerated.item[0] = micfil->dc_remover;
 +
 +      return 0;
 +}
 +
 +static int hwvad_put_enable(struct snd_kcontrol *kcontrol,
 +                          struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 +      unsigned int *item = ucontrol->value.enumerated.item;
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +      int val = snd_soc_enum_item_to_val(e, item[0]);
 +
 +      micfil->vad_enabled = val;
 +
 +      return 0;
 +}
 +
 +static int hwvad_get_enable(struct snd_kcontrol *kcontrol,
 +                          struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +
 +      ucontrol->value.enumerated.item[0] = micfil->vad_enabled;
 +
 +      return 0;
 +}
 +
 +static int hwvad_put_init_mode(struct snd_kcontrol *kcontrol,
 +                             struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
 +      unsigned int *item = ucontrol->value.enumerated.item;
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +      int val = snd_soc_enum_item_to_val(e, item[0]);
 +
 +      /* 0 - Envelope-based Mode
 +       * 1 - Energy-based Mode
 +       */
 +      micfil->vad_init_mode = val;
 +
 +      return 0;
 +}
 +
 +static int hwvad_get_init_mode(struct snd_kcontrol *kcontrol,
 +                             struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +
 +      ucontrol->value.enumerated.item[0] = micfil->vad_init_mode;
 +
 +      return 0;
 +}
 +
 +static int hwvad_detected(struct snd_kcontrol *kcontrol,
 +                        struct snd_ctl_elem_value *ucontrol)
 +{
 +      struct snd_soc_component *comp = snd_kcontrol_chip(kcontrol);
 +      struct fsl_micfil *micfil = snd_soc_component_get_drvdata(comp);
 +
 +      ucontrol->value.enumerated.item[0] = micfil->vad_detected;
 +
 +      return 0;
 +}
 +
  static const struct snd_kcontrol_new fsl_micfil_snd_controls[] = {
        SOC_SINGLE_SX_TLV("CH0 Volume", REG_MICFIL_OUT_CTRL,
                          MICFIL_OUTGAIN_CHX_SHIFT(0), 0xF, 0x7, gain_tlv),
        SOC_ENUM_EXT("MICFIL Quality Select",
                     fsl_micfil_quality_enum,
                     micfil_quality_get, micfil_quality_set),
 +      SOC_ENUM_EXT("HWVAD Enablement Switch", hwvad_enable_enum,
 +                   hwvad_get_enable, hwvad_put_enable),
 +      SOC_ENUM_EXT("HWVAD Initialization Mode", hwvad_init_mode_enum,
 +                   hwvad_get_init_mode, hwvad_put_init_mode),
 +      SOC_ENUM("HWVAD High-Pass Filter", hwvad_hpf_enum),
 +      SOC_SINGLE("HWVAD ZCD Switch", REG_MICFIL_VAD0_ZCD, 0, 1, 0),
 +      SOC_SINGLE("HWVAD ZCD Auto Threshold Switch",
 +                 REG_MICFIL_VAD0_ZCD, 2, 1, 0),
 +      SOC_ENUM_EXT("MICFIL DC Remover Control", fsl_micfil_dc_remover_enum,
 +                   micfil_get_dc_remover_state, micfil_put_dc_remover_state),
 +      SOC_SINGLE("HWVAD Input Gain", REG_MICFIL_VAD0_CTRL2, 8, 15, 0),
 +      SOC_SINGLE("HWVAD Sound Gain", REG_MICFIL_VAD0_SCONFIG, 0, 15, 0),
 +      SOC_SINGLE("HWVAD Noise Gain", REG_MICFIL_VAD0_NCONFIG, 0, 15, 0),
 +      SOC_SINGLE_RANGE("HWVAD Detector Frame Time", REG_MICFIL_VAD0_CTRL2, 16, 0, 63, 0),
 +      SOC_SINGLE("HWVAD Detector Initialization Time", REG_MICFIL_VAD0_CTRL1, 8, 31, 0),
 +      SOC_SINGLE("HWVAD Noise Filter Adjustment", REG_MICFIL_VAD0_NCONFIG, 8, 31, 0),
 +      SOC_SINGLE("HWVAD ZCD Threshold", REG_MICFIL_VAD0_ZCD, 16, 1023, 0),
 +      SOC_SINGLE("HWVAD ZCD Adjustment", REG_MICFIL_VAD0_ZCD, 8, 15, 0),
 +      SOC_SINGLE("HWVAD ZCD And Behavior Switch",
 +                 REG_MICFIL_VAD0_ZCD, 4, 1, 0),
 +      SOC_SINGLE_BOOL_EXT("VAD Detected", 0, hwvad_detected, NULL),
  };
  
  /* The SRES is a self-negated bit which provides the CPU with the
@@@ -376,6 -194,25 +376,25 @@@ static int fsl_micfil_reset(struct devi
        if (ret)
                return ret;
  
+       /*
+        * SRES is self-cleared bit, but REG_MICFIL_CTRL1 is defined
+        * as non-volatile register, so SRES still remain in regmap
+        * cache after set, that every update of REG_MICFIL_CTRL1,
+        * software reset happens. so clear it explicitly.
+        */
+       ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
+                               MICFIL_CTRL1_SRES);
+       if (ret)
+               return ret;
+       /*
+        * Set SRES should clear CHnF flags, But even add delay here
+        * the CHnF may not be cleared sometimes, so clear CHnF explicitly.
+        */
+       ret = regmap_write_bits(micfil->regmap, REG_MICFIL_STAT, 0xFF, 0xFF);
+       if (ret)
+               return ret;
        return 0;
  }
  
@@@ -392,167 -229,6 +411,167 @@@ static int fsl_micfil_startup(struct sn
        return 0;
  }
  
 +/* Enable/disable hwvad interrupts */
 +static int fsl_micfil_configure_hwvad_interrupts(struct fsl_micfil *micfil, int enable)
 +{
 +      u32 vadie_reg = enable ? MICFIL_VAD0_CTRL1_IE : 0;
 +      u32 vaderie_reg = enable ? MICFIL_VAD0_CTRL1_ERIE : 0;
 +
 +      /* Voice Activity Detector Error Interruption */
 +      regmap_update_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                         MICFIL_VAD0_CTRL1_ERIE, vaderie_reg);
 +
 +      /* Voice Activity Detector Interruption */
 +      regmap_update_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                         MICFIL_VAD0_CTRL1_IE, vadie_reg);
 +
 +      return 0;
 +}
 +
 +/* Configuration done only in energy-based initialization mode */
 +static int fsl_micfil_init_hwvad_energy_mode(struct fsl_micfil *micfil)
 +{
 +      /* Keep the VADFRENDIS bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL2,
 +                        MICFIL_VAD0_CTRL2_FRENDIS);
 +
 +      /* Keep the VADPREFEN bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL2,
 +                        MICFIL_VAD0_CTRL2_PREFEN);
 +
 +      /* Keep the VADSFILEN bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_SCONFIG,
 +                        MICFIL_VAD0_SCONFIG_SFILEN);
 +
 +      /* Keep the VADSMAXEN bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_SCONFIG,
 +                        MICFIL_VAD0_SCONFIG_SMAXEN);
 +
 +      /* Keep the VADNFILAUTO bitfield asserted. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                      MICFIL_VAD0_NCONFIG_NFILAUT);
 +
 +      /* Keep the VADNMINEN bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                        MICFIL_VAD0_NCONFIG_NMINEN);
 +
 +      /* Keep the VADNDECEN bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                        MICFIL_VAD0_NCONFIG_NDECEN);
 +
 +      /* Keep the VADNOREN bitfield cleared. */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                        MICFIL_VAD0_NCONFIG_NOREN);
 +
 +      return 0;
 +}
 +
 +/* Configuration done only in envelope-based initialization mode */
 +static int fsl_micfil_init_hwvad_envelope_mode(struct fsl_micfil *micfil)
 +{
 +      /* Assert the VADFRENDIS bitfield */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL2,
 +                      MICFIL_VAD0_CTRL2_FRENDIS);
 +
 +      /* Assert the VADPREFEN bitfield. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL2,
 +                      MICFIL_VAD0_CTRL2_PREFEN);
 +
 +      /* Assert the VADSFILEN bitfield. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_SCONFIG,
 +                      MICFIL_VAD0_SCONFIG_SFILEN);
 +
 +      /* Assert the VADSMAXEN bitfield. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_SCONFIG,
 +                      MICFIL_VAD0_SCONFIG_SMAXEN);
 +
 +      /* Clear the VADNFILAUTO bitfield */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                        MICFIL_VAD0_NCONFIG_NFILAUT);
 +
 +      /* Assert the VADNMINEN bitfield. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                      MICFIL_VAD0_NCONFIG_NMINEN);
 +
 +      /* Assert the VADNDECEN bitfield. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                      MICFIL_VAD0_NCONFIG_NDECEN);
 +
 +      /* Assert VADNOREN bitfield. */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_NCONFIG,
 +                      MICFIL_VAD0_NCONFIG_NOREN);
 +
 +      return 0;
 +}
 +
 +/*
 + * Hardware Voice Active Detection: The HWVAD takes data from the input
 + * of a selected PDM microphone to detect if there is any
 + * voice activity. When a voice activity is detected, an interrupt could
 + * be delivered to the system. Initialization in section 8.4:
 + * Can work in two modes:
 + *  -> Eneveope-based mode (section 8.4.1)
 + *  -> Energy-based mode (section 8.4.2)
 + *
 + * It is important to remark that the HWVAD detector could be enabled
 + * or reset only when the MICFIL isn't running i.e. when the BSY_FIL
 + * bit in STAT register is cleared
 + */
 +static int fsl_micfil_hwvad_enable(struct fsl_micfil *micfil)
 +{
 +      int ret;
 +
 +      micfil->vad_detected = 0;
 +
 +      /* envelope-based specific initialization */
 +      if (micfil->vad_init_mode == MICFIL_HWVAD_ENVELOPE_MODE)
 +              ret = fsl_micfil_init_hwvad_envelope_mode(micfil);
 +      else
 +              ret = fsl_micfil_init_hwvad_energy_mode(micfil);
 +      if (ret)
 +              return ret;
 +
 +      /* Voice Activity Detector Internal Filters Initialization*/
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                      MICFIL_VAD0_CTRL1_ST10);
 +
 +      /* Voice Activity Detector Internal Filter */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                        MICFIL_VAD0_CTRL1_ST10);
 +
 +      /* Enable Interrupts */
 +      ret = fsl_micfil_configure_hwvad_interrupts(micfil, 1);
 +      if (ret)
 +              return ret;
 +
 +      /* Voice Activity Detector Reset */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                      MICFIL_VAD0_CTRL1_RST);
 +
 +      /* Voice Activity Detector Enabled */
 +      regmap_set_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                      MICFIL_VAD0_CTRL1_EN);
 +
 +      return 0;
 +}
 +
 +static int fsl_micfil_hwvad_disable(struct fsl_micfil *micfil)
 +{
 +      struct device *dev = &micfil->pdev->dev;
 +      int ret = 0;
 +
 +      /* Disable HWVAD */
 +      regmap_clear_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                        MICFIL_VAD0_CTRL1_EN);
 +
 +      /* Disable hwvad interrupts */
 +      ret = fsl_micfil_configure_hwvad_interrupts(micfil, 0);
 +      if (ret)
 +              dev_err(dev, "Failed to disable interrupts\n");
 +
 +      return ret;
 +}
 +
  static int fsl_micfil_trigger(struct snd_pcm_substream *substream, int cmd,
                              struct snd_soc_dai *dai)
  {
                if (ret)
                        return ret;
  
 +              if (micfil->vad_enabled)
 +                      fsl_micfil_hwvad_enable(micfil);
 +
                break;
        case SNDRV_PCM_TRIGGER_STOP:
        case SNDRV_PCM_TRIGGER_SUSPEND:
        case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
 +              if (micfil->vad_enabled)
 +                      fsl_micfil_hwvad_disable(micfil);
 +
                /* Disable the module */
                ret = regmap_clear_bits(micfil->regmap, REG_MICFIL_CTRL1,
                                        MICFIL_CTRL1_PDMIEN);
@@@ -677,23 -347,11 +696,23 @@@ static int fsl_micfil_hw_params(struct 
                                 FIELD_PREP(MICFIL_CTRL2_CLKDIV, clk_div) |
                                 FIELD_PREP(MICFIL_CTRL2_CICOSR, 16 - osr));
  
 +      /* Configure CIC OSR in VADCICOSR */
 +      regmap_update_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                         MICFIL_VAD0_CTRL1_CICOSR,
 +                         FIELD_PREP(MICFIL_VAD0_CTRL1_CICOSR, 16 - osr));
 +
 +      /* Configure source channel in VADCHSEL */
 +      regmap_update_bits(micfil->regmap, REG_MICFIL_VAD0_CTRL1,
 +                         MICFIL_VAD0_CTRL1_CHSEL,
 +                         FIELD_PREP(MICFIL_VAD0_CTRL1_CHSEL, (channels - 1)));
 +
        micfil->dma_params_rx.peripheral_config = &micfil->sdmacfg;
        micfil->dma_params_rx.peripheral_size = sizeof(micfil->sdmacfg);
        micfil->sdmacfg.n_fifos_src = channels;
        micfil->sdmacfg.sw_done = true;
        micfil->dma_params_rx.maxburst = channels * MICFIL_DMA_MAXBURST_RX;
 +      if (micfil->soc->use_edma)
 +              micfil->dma_params_rx.maxburst = channels;
  
        return 0;
  }
@@@ -712,7 -370,6 +731,7 @@@ static int fsl_micfil_dai_probe(struct 
        int ret, i;
  
        micfil->quality = QUALITY_VLOW0;
 +      micfil->card = cpu_dai->component->card;
  
        /* set default gain to 2 */
        regmap_write(micfil->regmap, REG_MICFIL_OUT_CTRL, 0x22222222);
@@@ -947,71 -604,6 +966,71 @@@ static irqreturn_t micfil_err_isr(int i
        return IRQ_HANDLED;
  }
  
 +static irqreturn_t voice_detected_fn(int irq, void *devid)
 +{
 +      struct fsl_micfil *micfil = (struct fsl_micfil *)devid;
 +      struct snd_kcontrol *kctl;
 +
 +      if (!micfil->card)
 +              return IRQ_HANDLED;
 +
 +      kctl = snd_soc_card_get_kcontrol(micfil->card, "VAD Detected");
 +      if (!kctl)
 +              return IRQ_HANDLED;
 +
 +      if (micfil->vad_detected)
 +              snd_ctl_notify(micfil->card->snd_card,
 +                             SNDRV_CTL_EVENT_MASK_VALUE,
 +                             &kctl->id);
 +
 +      return IRQ_HANDLED;
 +}
 +
 +static irqreturn_t hwvad_isr(int irq, void *devid)
 +{
 +      struct fsl_micfil *micfil = (struct fsl_micfil *)devid;
 +      struct device *dev = &micfil->pdev->dev;
 +      u32 vad0_reg;
 +      int ret;
 +
 +      regmap_read(micfil->regmap, REG_MICFIL_VAD0_STAT, &vad0_reg);
 +
 +      /*
 +       * The only difference between MICFIL_VAD0_STAT_EF and
 +       * MICFIL_VAD0_STAT_IF is that the former requires Write
 +       * 1 to Clear. Since both flags are set, it is enough
 +       * to only read one of them
 +       */
 +      if (vad0_reg & MICFIL_VAD0_STAT_IF) {
 +              /* Write 1 to clear */
 +              regmap_write_bits(micfil->regmap, REG_MICFIL_VAD0_STAT,
 +                                MICFIL_VAD0_STAT_IF,
 +                                MICFIL_VAD0_STAT_IF);
 +
 +              micfil->vad_detected = 1;
 +      }
 +
 +      ret = fsl_micfil_hwvad_disable(micfil);
 +      if (ret)
 +              dev_err(dev, "Failed to disable hwvad\n");
 +
 +      return IRQ_WAKE_THREAD;
 +}
 +
 +static irqreturn_t hwvad_err_isr(int irq, void *devid)
 +{
 +      struct fsl_micfil *micfil = (struct fsl_micfil *)devid;
 +      struct device *dev = &micfil->pdev->dev;
 +      u32 vad0_reg;
 +
 +      regmap_read(micfil->regmap, REG_MICFIL_VAD0_STAT, &vad0_reg);
 +
 +      if (vad0_reg & MICFIL_VAD0_STAT_INSATF)
 +              dev_dbg(dev, "voice activity input overflow/underflow detected\n");
 +
 +      return IRQ_HANDLED;
 +}
 +
  static int fsl_micfil_probe(struct platform_device *pdev)
  {
        struct device_node *np = pdev->dev.of_node;
                return ret;
        }
  
 +      /* Digital Microphone interface voice activity detector event */
 +      ret = devm_request_threaded_irq(&pdev->dev, micfil->irq[2],
 +                                      hwvad_isr, voice_detected_fn,
 +                                      IRQF_SHARED, micfil->name, micfil);
 +      if (ret) {
 +              dev_err(&pdev->dev, "failed to claim hwvad event irq %u\n",
 +                      micfil->irq[0]);
 +              return ret;
 +      }
 +
 +      /* Digital Microphone interface voice activity detector error */
 +      ret = devm_request_irq(&pdev->dev, micfil->irq[3],
 +                             hwvad_err_isr, IRQF_SHARED,
 +                             micfil->name, micfil);
 +      if (ret) {
 +              dev_err(&pdev->dev, "failed to claim hwvad error irq %u\n",
 +                      micfil->irq[1]);
 +              return ret;
 +      }
 +
        micfil->dma_params_rx.chan_name = "rx";
        micfil->dma_params_rx.addr = res->start + REG_MICFIL_DATACH0;
        micfil->dma_params_rx.maxburst = MICFIL_DMA_MAXBURST_RX;
diff --combined sound/soc/fsl/fsl_sai.c
index a0ea27f06997d5c882feda2a2037c7116663dd5d,e60c7b3445623b625ff013297d249652e86018bd..1c9be8a5dcb13c4a549f789c621995d84918b898
@@@ -872,10 -872,10 +872,10 @@@ static int fsl_sai_dai_probe(struct snd
  
        regmap_update_bits(sai->regmap, FSL_SAI_TCR1(ofs),
                           FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth),
 -                         sai->soc_data->fifo_depth - FSL_SAI_MAXBURST_TX);
 +                         sai->soc_data->fifo_depth - sai->dma_params_tx.maxburst);
        regmap_update_bits(sai->regmap, FSL_SAI_RCR1(ofs),
                           FSL_SAI_CR1_RFW_MASK(sai->soc_data->fifo_depth),
 -                         FSL_SAI_MAXBURST_RX - 1);
 +                         sai->dma_params_rx.maxburst - 1);
  
        snd_soc_dai_init_dma_data(cpu_dai, &sai->dma_params_tx,
                                &sai->dma_params_rx);
@@@ -1416,10 -1416,8 +1416,10 @@@ static int fsl_sai_probe(struct platfor
  
        sai->dma_params_rx.addr = sai->res->start + FSL_SAI_RDR0;
        sai->dma_params_tx.addr = sai->res->start + FSL_SAI_TDR0;
 -      sai->dma_params_rx.maxburst = FSL_SAI_MAXBURST_RX;
 -      sai->dma_params_tx.maxburst = FSL_SAI_MAXBURST_TX;
 +      sai->dma_params_rx.maxburst =
 +              sai->soc_data->max_burst[RX] ? sai->soc_data->max_burst[RX] : FSL_SAI_MAXBURST_RX;
 +      sai->dma_params_tx.maxburst =
 +              sai->soc_data->max_burst[TX] ? sai->soc_data->max_burst[TX] : FSL_SAI_MAXBURST_TX;
  
        sai->pinctrl = devm_pinctrl_get(&pdev->dev);
  
        }
  
        ret = pm_runtime_put_sync(dev);
-       if (ret < 0)
+       if (ret < 0 && ret != -ENOSYS)
                goto err_pm_get_sync;
  
        /*
@@@ -1581,18 -1579,6 +1581,18 @@@ static const struct fsl_sai_soc_data fs
        .max_register = FSL_SAI_RTCAP,
  };
  
 +static const struct fsl_sai_soc_data fsl_sai_imx93_data = {
 +      .use_imx_pcm = true,
 +      .use_edma = true,
 +      .fifo_depth = 128,
 +      .reg_offset = 8,
 +      .mclk0_is_mclk1 = false,
 +      .pins = 4,
 +      .flags = 0,
 +      .max_register = FSL_SAI_MCTL,
 +      .max_burst = {8, 8},
 +};
 +
  static const struct of_device_id fsl_sai_ids[] = {
        { .compatible = "fsl,vf610-sai", .data = &fsl_sai_vf610_data },
        { .compatible = "fsl,imx6sx-sai", .data = &fsl_sai_imx6sx_data },
        { .compatible = "fsl,imx8mp-sai", .data = &fsl_sai_imx8mp_data },
        { .compatible = "fsl,imx8ulp-sai", .data = &fsl_sai_imx8ulp_data },
        { .compatible = "fsl,imx8mn-sai", .data = &fsl_sai_imx8mp_data },
 +      { .compatible = "fsl,imx93-sai", .data = &fsl_sai_imx93_data },
        { /* sentinel */ }
  };
  MODULE_DEVICE_TABLE(of, fsl_sai_ids);
index cdcb448d5212ba77d0d06e0fa7ac1b01caa0a6b5,a935c5fd9edbc0131c561f3ea4db0dc775998900..09d1f0f6d68658b77581458466d94c85f0993510
@@@ -243,7 -243,7 +243,7 @@@ static int byt_cht_es8316_codec_fixup(s
                                                SNDRV_PCM_HW_PARAM_CHANNELS);
        int ret, bits;
  
 -      /* The DSP will covert the FE rate to 48k, stereo */
 +      /* The DSP will convert the FE rate to 48k, stereo */
        rate->min = rate->max = 48000;
        channels->min = channels->max = 2;
  
@@@ -443,6 -443,13 +443,13 @@@ static const struct dmi_system_id byt_c
                                        | BYT_CHT_ES8316_INTMIC_IN2_MAP
                                        | BYT_CHT_ES8316_JD_INVERTED),
        },
+       {       /* Nanote UMPC-01 */
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "RWC CO.,LTD"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "UMPC-01"),
+               },
+               .driver_data = (void *)BYT_CHT_ES8316_INTMIC_IN1_MAP,
+       },
        {       /* Teclast X98 Plus II */
                .matches = {
                        DMI_MATCH(DMI_SYS_VENDOR, "TECLAST"),
diff --combined sound/soc/soc-core.c
index d8b092f129aed81c73d8a5f1a23e80269c09c049,a409fbed8f34ce2ee64b3a425fde587649233906..e613698824fdd0efc060fe7dfd26f72bbc95c231
@@@ -447,7 -447,7 +447,7 @@@ static struct snd_soc_pcm_runtime *soc_
         */
        rtd = devm_kzalloc(dev,
                           sizeof(*rtd) +
 -                         sizeof(*component) * (dai_link->num_cpus +
 +                         sizeof(component) * (dai_link->num_cpus +
                                                 dai_link->num_codecs +
                                                 dai_link->num_platforms),
                           GFP_KERNEL);
@@@ -939,6 -939,9 +939,6 @@@ void snd_soc_remove_pcm_runtime(struct 
  {
        lockdep_assert_held(&client_mutex);
  
 -      /* release machine specific resources */
 -      snd_soc_link_exit(rtd);
 -
        /*
         * Notify the machine driver for extra destruction
         */
@@@ -1887,9 -1890,6 +1887,9 @@@ static void soc_cleanup_card_resources(
  
        snd_soc_dapm_shutdown(card);
  
 +      /* release machine specific resources */
 +      for_each_card_rtds(card, rtd)
 +              snd_soc_link_exit(rtd);
        /* remove and free each DAI */
        soc_remove_link_dais(card);
        soc_remove_link_components(card);
@@@ -3477,10 -3477,23 +3477,23 @@@ EXPORT_SYMBOL_GPL(snd_soc_of_get_dai_li
  
  static int __init snd_soc_init(void)
  {
+       int ret;
        snd_soc_debugfs_init();
-       snd_soc_util_init();
+       ret = snd_soc_util_init();
+       if (ret)
+               goto err_util_init;
  
-       return platform_driver_register(&soc_driver);
+       ret = platform_driver_register(&soc_driver);
+       if (ret)
+               goto err_register;
+       return 0;
+ err_register:
+       snd_soc_util_exit();
+ err_util_init:
+       snd_soc_debugfs_exit();
+       return ret;
  }
  module_init(snd_soc_init);
  
diff --combined sound/soc/soc-dapm.c
index 954ca9af3e484322c761b75876bcf8823d91d6ec,879cf1be67a9f4a7d174c43f6a69abdc27d0158a..f61c8633e7eb39ab671d943f447e09b592249d03
@@@ -71,9 -71,9 +71,9 @@@ static int dapm_up_seq[] = 
        [snd_soc_dapm_pinctrl] = 2,
        [snd_soc_dapm_clock_supply] = 2,
        [snd_soc_dapm_supply] = 3,
 +      [snd_soc_dapm_dai_link] = 3,
        [snd_soc_dapm_micbias] = 4,
        [snd_soc_dapm_vmid] = 4,
 -      [snd_soc_dapm_dai_link] = 3,
        [snd_soc_dapm_dai_in] = 5,
        [snd_soc_dapm_dai_out] = 5,
        [snd_soc_dapm_aif_in] = 5,
@@@ -652,8 -652,10 +652,8 @@@ static void soc_dapm_async_complete(str
  }
  
  static struct snd_soc_dapm_widget *
 -dapm_wcache_lookup(struct snd_soc_dapm_wcache *wcache, const char *name)
 +dapm_wcache_lookup(struct snd_soc_dapm_widget *w, const char *name)
  {
 -      struct snd_soc_dapm_widget *w = wcache->widget;
 -
        if (w) {
                struct list_head *wlist = &w->dapm->card->widgets;
                const int depth = 2;
        return NULL;
  }
  
 -static inline void dapm_wcache_update(struct snd_soc_dapm_wcache *wcache,
 -                                    struct snd_soc_dapm_widget *w)
 -{
 -      wcache->widget = w;
 -}
 -
  /**
   * snd_soc_dapm_force_bias_level() - Sets the DAPM bias level
   * @dapm: The DAPM context for which to set the level
@@@ -1873,52 -1881,58 +1873,52 @@@ static void dapm_widget_set_peer_power(
                dapm_mark_dirty(peer, "peer state change");
  }
  
 -static void dapm_widget_set_power(struct snd_soc_dapm_widget *w, bool power,
 +static void dapm_power_one_widget(struct snd_soc_dapm_widget *w,
                                  struct list_head *up_list,
                                  struct list_head *down_list)
  {
        struct snd_soc_dapm_path *path;
 +      int power;
 +
 +      switch (w->id) {
 +      case snd_soc_dapm_pre:
 +              power = 0;
 +              goto end;
 +      case snd_soc_dapm_post:
 +              power = 1;
 +              goto end;
 +      default:
 +              break;
 +      }
 +
 +      power = dapm_widget_power_check(w);
  
        if (w->power == power)
                return;
  
        trace_snd_soc_dapm_widget_power(w, power);
  
 -      /* If we changed our power state perhaps our neigbours changed
 -       * also.
 +      /*
 +       * If we changed our power state perhaps our neigbours
 +       * changed also.
         */
        snd_soc_dapm_widget_for_each_source_path(w, path)
                dapm_widget_set_peer_power(path->source, power, path->connect);
  
 -      /* Supplies can't affect their outputs, only their inputs */
 -      if (!w->is_supply) {
 +      /*
 +       * Supplies can't affect their outputs, only their inputs
 +       */
 +      if (!w->is_supply)
                snd_soc_dapm_widget_for_each_sink_path(w, path)
 -                      dapm_widget_set_peer_power(path->sink, power,
 -                                                 path->connect);
 -      }
 +                      dapm_widget_set_peer_power(path->sink, power, path->connect);
  
 +end:
        if (power)
                dapm_seq_insert(w, up_list, true);
        else
                dapm_seq_insert(w, down_list, false);
  }
  
 -static void dapm_power_one_widget(struct snd_soc_dapm_widget *w,
 -                                struct list_head *up_list,
 -                                struct list_head *down_list)
 -{
 -      int power;
 -
 -      switch (w->id) {
 -      case snd_soc_dapm_pre:
 -              dapm_seq_insert(w, down_list, false);
 -              break;
 -      case snd_soc_dapm_post:
 -              dapm_seq_insert(w, up_list, true);
 -              break;
 -
 -      default:
 -              power = dapm_widget_power_check(w);
 -
 -              dapm_widget_set_power(w, power, up_list, down_list);
 -              break;
 -      }
 -}
 -
  static bool dapm_idle_bias_off(struct snd_soc_dapm_context *dapm)
  {
        if (dapm->idle_bias_off)
@@@ -2483,9 -2497,6 +2483,9 @@@ void snd_soc_dapm_free_widget(struct sn
        struct snd_soc_dapm_path *p, *next_p;
        enum snd_soc_dapm_direction dir;
  
 +      if (!w)
 +              return;
 +
        list_del(&w->list);
        list_del(&w->dirty);
        /*
  }
  EXPORT_SYMBOL_GPL(snd_soc_dapm_free_widget);
  
 -void snd_soc_dapm_reset_cache(struct snd_soc_dapm_context *dapm)
 -{
 -      dapm->path_sink_cache.widget = NULL;
 -      dapm->path_source_cache.widget = NULL;
 -}
 -
  /* free all dapm widgets and resources */
  static void dapm_free_widgets(struct snd_soc_dapm_context *dapm)
  {
                        continue;
                snd_soc_dapm_free_widget(w);
        }
 -      snd_soc_dapm_reset_cache(dapm);
 +
 +      dapm->wcache_sink       = NULL;
 +      dapm->wcache_source     = NULL;
  }
  
  static struct snd_soc_dapm_widget *dapm_find_widget(
@@@ -2823,6 -2838,7 +2823,6 @@@ static int snd_soc_dapm_add_path(struc
        int (*connected)(struct snd_soc_dapm_widget *source,
                         struct snd_soc_dapm_widget *sink))
  {
 -      struct snd_soc_dapm_widget *widgets[2];
        enum snd_soc_dapm_direction dir;
        struct snd_soc_dapm_path *path;
        int ret;
  
        path->node[SND_SOC_DAPM_DIR_IN] = wsource;
        path->node[SND_SOC_DAPM_DIR_OUT] = wsink;
 -      widgets[SND_SOC_DAPM_DIR_IN] = wsource;
 -      widgets[SND_SOC_DAPM_DIR_OUT] = wsink;
  
        path->connected = connected;
        INIT_LIST_HEAD(&path->list);
        }
  
        list_add(&path->list, &dapm->card->paths);
 +
        snd_soc_dapm_for_each_direction(dir)
 -              list_add(&path->list_node[dir], &widgets[dir]->edges[dir]);
 +              list_add(&path->list_node[dir], &path->node[dir]->edges[dir]);
  
        snd_soc_dapm_for_each_direction(dir) {
 -              dapm_update_widget_flags(widgets[dir]);
 -              dapm_mark_dirty(widgets[dir], "Route added");
 +              dapm_update_widget_flags(path->node[dir]);
 +              dapm_mark_dirty(path->node[dir], "Route added");
        }
  
        if (dapm->card->instantiated && path->connect)
@@@ -2944,8 -2961,8 +2944,8 @@@ static int snd_soc_dapm_add_route(struc
                source = route->source;
        }
  
 -      wsource = dapm_wcache_lookup(&dapm->path_source_cache, source);
 -      wsink = dapm_wcache_lookup(&dapm->path_sink_cache, sink);
 +      wsource = dapm_wcache_lookup(dapm->wcache_source, source);
 +      wsink   = dapm_wcache_lookup(dapm->wcache_sink,   sink);
  
        if (wsink && wsource)
                goto skip_search;
        if (!wsource)
                wsource = wtsource;
  
 -      if (wsource == NULL) {
 -              dev_err(dapm->dev, "ASoC: no source widget found for %s\n",
 -                      route->source);
 -              return -ENODEV;
 -      }
 -      if (wsink == NULL) {
 -              dev_err(dapm->dev, "ASoC: no sink widget found for %s\n",
 -                      route->sink);
 -              return -ENODEV;
 -      }
 +      ret = -ENODEV;
 +      if (!wsource)
 +              goto err;
 +      if (!wsink)
 +              goto err;
  
  skip_search:
 -      dapm_wcache_update(&dapm->path_sink_cache, wsink);
 -      dapm_wcache_update(&dapm->path_source_cache, wsource);
 +      /* update cache */
 +      dapm->wcache_sink       = wsink;
 +      dapm->wcache_source     = wsource;
  
        ret = snd_soc_dapm_add_path(dapm, wsource, wsink, route->control,
                route->connected);
 -      if (ret)
 -              goto err;
 -
 -      return 0;
  err:
 -      dev_warn(dapm->dev, "ASoC: no dapm match for %s --> %s --> %s\n",
 -               source, route->control, sink);
 +      if (ret)
 +              dev_err(dapm->dev, "ASoC: Failed to add route %s%s -%s%s%s> %s%s\n",
 +                      source, !wsource ? "(*)" : "",
 +                      !route->control ? "" : "> [",
 +                      !route->control ? "" : route->control,
 +                      !route->control ? "" : "] -",
 +                      sink,  !wsink ? "(*)" : "");
        return ret;
  }
  
@@@ -3095,8 -3115,13 +3095,8 @@@ int snd_soc_dapm_add_routes(struct snd_
        mutex_lock_nested(&dapm->card->dapm_mutex, SND_SOC_DAPM_CLASS_RUNTIME);
        for (i = 0; i < num; i++) {
                int r = snd_soc_dapm_add_route(dapm, route);
 -              if (r < 0) {
 -                      dev_err(dapm->dev, "ASoC: Failed to add route %s -> %s -> %s\n",
 -                              route->source,
 -                              route->control ? route->control : "direct",
 -                              route->sink);
 +              if (r < 0)
                        ret = r;
 -              }
                route++;
        }
        mutex_unlock(&dapm->card->dapm_mutex);
@@@ -3620,7 -3645,7 +3620,7 @@@ snd_soc_dapm_new_control_unlocked(struc
  
        switch (w->id) {
        case snd_soc_dapm_regulator_supply:
-               w->regulator = devm_regulator_get(dapm->dev, w->name);
+               w->regulator = devm_regulator_get(dapm->dev, widget->name);
                if (IS_ERR(w->regulator)) {
                        ret = PTR_ERR(w->regulator);
                        goto request_failed;
@@@ -4132,53 -4157,56 +4132,53 @@@ snd_soc_dapm_new_dai(struct snd_soc_car
        struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
        struct snd_soc_dapm_widget template;
        struct snd_soc_dapm_widget *w;
 +      const struct snd_kcontrol_new *kcontrol_news;
 +      int num_kcontrols;
        const char **w_param_text;
        unsigned long private_value = 0;
        char *link_name;
 -      int ret;
 +      int ret = -ENOMEM;
  
        link_name = devm_kasprintf(card->dev, GFP_KERNEL, "%s-%s",
                                   rtd->dai_link->name, id);
        if (!link_name)
 -              return ERR_PTR(-ENOMEM);
 -
 -      memset(&template, 0, sizeof(template));
 -      template.reg = SND_SOC_NOPM;
 -      template.id = snd_soc_dapm_dai_link;
 -      template.name = link_name;
 -      template.event = snd_soc_dai_link_event;
 -      template.event_flags = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
 -              SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD;
 -      template.kcontrol_news = NULL;
 +              goto name_fail;
  
        /* allocate memory for control, only in case of multiple configs */
 +      w_param_text    = NULL;
 +      kcontrol_news   = NULL;
 +      num_kcontrols   = 0;
        if (rtd->dai_link->num_params > 1) {
                w_param_text = devm_kcalloc(card->dev,
                                            rtd->dai_link->num_params,
                                            sizeof(char *), GFP_KERNEL);
 -              if (!w_param_text) {
 -                      ret = -ENOMEM;
 +              if (!w_param_text)
                        goto param_fail;
 -              }
  
 -              template.num_kcontrols = 1;
 -              template.kcontrol_news =
 -                                      snd_soc_dapm_alloc_kcontrol(card,
 -                                              link_name,
 -                                              rtd->dai_link->params,
 -                                              rtd->dai_link->num_params,
 -                                              w_param_text, &private_value);
 -              if (!template.kcontrol_news) {
 -                      ret = -ENOMEM;
 +              num_kcontrols = 1;
 +              kcontrol_news = snd_soc_dapm_alloc_kcontrol(card, link_name,
 +                                                          rtd->dai_link->params,
 +                                                          rtd->dai_link->num_params,
 +                                                          w_param_text, &private_value);
 +              if (!kcontrol_news)
                        goto param_fail;
 -              }
 -      } else {
 -              w_param_text = NULL;
        }
 +
 +      memset(&template, 0, sizeof(template));
 +      template.reg            = SND_SOC_NOPM;
 +      template.id             = snd_soc_dapm_dai_link;
 +      template.name           = link_name;
 +      template.event          = snd_soc_dai_link_event;
 +      template.event_flags    = SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
 +                                SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD;
 +      template.kcontrol_news  = kcontrol_news;
 +      template.num_kcontrols  = num_kcontrols;
 +
        dev_dbg(card->dev, "ASoC: adding %s widget\n", link_name);
  
        w = snd_soc_dapm_new_control_unlocked(&card->dapm, &template);
        if (IS_ERR(w)) {
                ret = PTR_ERR(w);
 -              dev_err(rtd->dev, "ASoC: Failed to create %s widget: %d\n",
 -                      link_name, ret);
                goto outfree_kcontrol_news;
        }
  
@@@ -4192,9 -4220,6 +4192,9 @@@ outfree_kcontrol_news
                                   rtd->dai_link->num_params, w_param_text);
  param_fail:
        devm_kfree(card->dev, link_name);
 +name_fail:
 +      dev_err(rtd->dev, "ASoC: Failed to create %s-%s widget: %d\n",
 +              rtd->dai_link->name, id, ret);
        return ERR_PTR(ret);
  }
  
diff --combined sound/soc/soc-pcm.c
index d8e4677f300230da2e5894a85bc4481408ef96d3,35a16c3f9591badb85b944502dc13bc4161de5cb..a7810c78ffa18aba42ba5c527eba8afc4232d10f
@@@ -155,7 -155,7 +155,7 @@@ static ssize_t dpcm_show_state(struct s
  
        for_each_dpcm_be(fe, stream, dpcm) {
                struct snd_soc_pcm_runtime *be = dpcm->be;
 -              params = &dpcm->hw_params;
 +              params = &be->dpcm[stream].hw_params;
  
                offset += scnprintf(buf + offset, size - offset,
                                   "- %s\n", be->dai_link->name);
@@@ -822,11 -822,6 +822,6 @@@ static int __soc_pcm_open(struct snd_so
                ret = snd_soc_dai_startup(dai, substream);
                if (ret < 0)
                        goto err;
-               if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
-                       dai->tx_mask = 0;
-               else
-                       dai->rx_mask = 0;
        }
  
        /* Dynamic PCM DAI links compat checks use dynamic capabilities */
@@@ -1252,6 -1247,8 +1247,8 @@@ static void dpcm_be_reparent(struct snd
                return;
  
        be_substream = snd_soc_dpcm_get_substream(be, stream);
+       if (!be_substream)
+               return;
  
        for_each_dpcm_fe(be, stream, dpcm) {
                if (dpcm->fe == fe)
@@@ -1980,8 -1977,6 +1977,8 @@@ int dpcm_be_dai_hw_params(struct snd_so
        int ret;
  
        for_each_dpcm_be(fe, stream, dpcm) {
 +              struct snd_pcm_hw_params hw_params;
 +
                be = dpcm->be;
                be_substream = snd_soc_dpcm_get_substream(be, stream);
  
                        continue;
  
                /* copy params for each dpcm */
 -              memcpy(&dpcm->hw_params, &fe->dpcm[stream].hw_params,
 +              memcpy(&hw_params, &fe->dpcm[stream].hw_params,
                                sizeof(struct snd_pcm_hw_params));
  
                /* perform any hw_params fixups */
 -              ret = snd_soc_link_be_hw_params_fixup(be, &dpcm->hw_params);
 +              ret = snd_soc_link_be_hw_params_fixup(be, &hw_params);
                if (ret < 0)
                        goto unwind;
  
                /* copy the fixed-up hw params for BE dai */
 -              memcpy(&be->dpcm[stream].hw_params, &dpcm->hw_params,
 +              memcpy(&be->dpcm[stream].hw_params, &hw_params,
                       sizeof(struct snd_pcm_hw_params));
  
                /* only allow hw_params() if no connected FEs are running */
                dev_dbg(be->dev, "ASoC: hw_params BE %s\n",
                        be->dai_link->name);
  
 -              ret = __soc_pcm_hw_params(be, be_substream, &dpcm->hw_params);
 +              ret = __soc_pcm_hw_params(be, be_substream, &hw_params);
                if (ret < 0)
                        goto unwind;
  
diff --combined sound/soc/sof/topology.c
index 176f64a86c26126c0a54a751fa277a32eae58e2e,6a0e7f3b5023440e90006d8b1ca5d413445ddb95..9d9fcaa2a94860454dd76765d97a0678867942ab
@@@ -360,21 -360,6 +360,21 @@@ int get_token_uuid(void *elem, void *ob
        return 0;
  }
  
 +/*
 + * The string gets from topology will be stored in heap, the owner only
 + * holds a char* member point to the heap.
 + */
 +int get_token_string(void *elem, void *object, u32 offset)
 +{
 +      /* "dst" here points to the char* member of the owner */
 +      char **dst = (char **)((u8 *)object + offset);
 +
 +      *dst = kstrdup(elem, GFP_KERNEL);
 +      if (!*dst)
 +              return -ENOMEM;
 +      return 0;
 +};
 +
  int get_token_comp_format(void *elem, void *object, u32 offset)
  {
        u32 *val = (u32 *)((u8 *)object + offset);
@@@ -407,23 -392,6 +407,23 @@@ static const struct sof_topology_token 
                offsetof(struct snd_sof_led_control, direction)},
  };
  
 +static const struct sof_topology_token comp_pin_tokens[] = {
 +      {SOF_TKN_COMP_NUM_SINK_PINS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
 +              offsetof(struct snd_sof_widget, num_sink_pins)},
 +      {SOF_TKN_COMP_NUM_SOURCE_PINS, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
 +              offsetof(struct snd_sof_widget, num_source_pins)},
 +};
 +
 +static const struct sof_topology_token comp_sink_pin_binding_tokens[] = {
 +      {SOF_TKN_COMP_SINK_PIN_BINDING_WNAME, SND_SOC_TPLG_TUPLE_TYPE_STRING,
 +              get_token_string, 0},
 +};
 +
 +static const struct sof_topology_token comp_src_pin_binding_tokens[] = {
 +      {SOF_TKN_COMP_SRC_PIN_BINDING_WNAME, SND_SOC_TPLG_TUPLE_TYPE_STRING,
 +              get_token_string, 0},
 +};
 +
  /**
   * sof_parse_uuid_tokens - Parse multiple sets of UUID tokens
   * @scomp: pointer to soc component
@@@ -604,7 -572,7 +604,7 @@@ static int sof_parse_string_tokens(stru
  {
        struct snd_soc_tplg_vendor_string_elem *elem;
        int found = 0;
 -      int i, j;
 +      int i, j, ret;
  
        /* parse element by element */
        for (i = 0; i < le32_to_cpu(array->num_elems); i++) {
                                continue;
  
                        /* matched - now load token */
 -                      tokens[j].get_token(elem->string, object, offset + tokens[j].offset);
 +                      ret = tokens[j].get_token(elem->string, object, offset + tokens[j].offset);
 +                      if (ret < 0)
 +                              return ret;
  
                        found++;
                }
@@@ -703,7 -669,6 +703,7 @@@ static int sof_parse_token_sets(struct 
        int found = 0;
        int total = 0;
        int asize;
 +      int ret;
  
        while (array_size > 0 && total < count * token_instance_num) {
                asize = le32_to_cpu(array->size);
                                                       array);
                        break;
                case SND_SOC_TPLG_TUPLE_TYPE_STRING:
 -                      found += sof_parse_string_tokens(scomp, object, offset, tokens, count,
 -                                                       array);
 +
 +                      ret = sof_parse_string_tokens(scomp, object, offset, tokens, count,
 +                                                    array);
 +                      if (ret < 0) {
 +                              dev_err(scomp->dev, "error: no memory to copy string token\n");
 +                              return ret;
 +                      }
 +
 +                      found += ret;
                        break;
                case SND_SOC_TPLG_TUPLE_TYPE_BOOL:
                case SND_SOC_TPLG_TUPLE_TYPE_BYTE:
        return ret;
  }
  
 +static void sof_free_pin_binding(struct snd_sof_widget *swidget,
 +                               bool pin_type)
 +{
 +      char **pin_binding;
 +      u32 num_pins;
 +      int i;
 +
 +      if (pin_type == SOF_PIN_TYPE_SINK) {
 +              pin_binding = swidget->sink_pin_binding;
 +              num_pins = swidget->num_sink_pins;
 +      } else {
 +              pin_binding = swidget->src_pin_binding;
 +              num_pins = swidget->num_source_pins;
 +      }
 +
 +      if (pin_binding) {
 +              for (i = 0; i < num_pins; i++)
 +                      kfree(pin_binding[i]);
 +      }
 +
 +      kfree(pin_binding);
 +}
 +
 +static int sof_parse_pin_binding(struct snd_sof_widget *swidget,
 +                               struct snd_soc_tplg_private *priv, bool pin_type)
 +{
 +      const struct sof_topology_token *pin_binding_token;
 +      char *pin_binding[SOF_WIDGET_MAX_NUM_PINS];
 +      int token_count;
 +      u32 num_pins;
 +      char **pb;
 +      int ret;
 +      int i;
 +
 +      if (pin_type == SOF_PIN_TYPE_SINK) {
 +              num_pins = swidget->num_sink_pins;
 +              pin_binding_token = comp_sink_pin_binding_tokens;
 +              token_count = ARRAY_SIZE(comp_sink_pin_binding_tokens);
 +      } else {
 +              num_pins = swidget->num_source_pins;
 +              pin_binding_token = comp_src_pin_binding_tokens;
 +              token_count = ARRAY_SIZE(comp_src_pin_binding_tokens);
 +      }
 +
 +      memset(pin_binding, 0, SOF_WIDGET_MAX_NUM_PINS * sizeof(char *));
 +      ret = sof_parse_token_sets(swidget->scomp, pin_binding, pin_binding_token,
 +                                 token_count, priv->array, le32_to_cpu(priv->size),
 +                                 num_pins, sizeof(char *));
 +      if (ret < 0)
 +              goto err;
 +
 +      /* copy pin binding array to swidget only if it is defined in topology */
 +      if (pin_binding[0]) {
 +              pb = kmemdup(pin_binding, num_pins * sizeof(char *), GFP_KERNEL);
 +              if (!pb) {
 +                      ret = -ENOMEM;
 +                      goto err;
 +              }
 +              if (pin_type == SOF_PIN_TYPE_SINK)
 +                      swidget->sink_pin_binding = pb;
 +              else
 +                      swidget->src_pin_binding = pb;
 +      }
 +
 +      return 0;
 +
 +err:
 +      for (i = 0; i < num_pins; i++)
 +              kfree(pin_binding[i]);
 +
 +      return ret;
 +}
 +
  /* external widget init - used for any driver specific init */
  static int sof_widget_ready(struct snd_soc_component *scomp, int index,
                            struct snd_soc_dapm_widget *w,
        struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
        const struct sof_ipc_tplg_ops *ipc_tplg_ops = sdev->ipc->ops->tplg;
        const struct sof_ipc_tplg_widget_ops *widget_ops = ipc_tplg_ops->widget;
 +      struct snd_soc_tplg_private *priv = &tw->priv;
        struct snd_sof_widget *swidget;
        struct snd_sof_dai *dai;
        enum sof_tokens *token_list;
        swidget->id = w->id;
        swidget->pipeline_id = index;
        swidget->private = NULL;
 +      ida_init(&swidget->src_queue_ida);
 +      ida_init(&swidget->sink_queue_ida);
  
 -      dev_dbg(scomp->dev, "tplg: ready widget id %d pipe %d type %d name : %s stream %s\n",
 -              swidget->comp_id, index, swidget->id, tw->name,
 -              strnlen(tw->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0
 -                      ? tw->sname : "none");
 +      ret = sof_parse_tokens(scomp, swidget, comp_pin_tokens,
 +                             ARRAY_SIZE(comp_pin_tokens), priv->array,
 +                             le32_to_cpu(priv->size));
 +      if (ret < 0) {
 +              dev_err(scomp->dev, "failed to parse component pin tokens for %s\n",
 +                      w->name);
 +              return ret;
 +      }
 +
 +      if (swidget->num_sink_pins > SOF_WIDGET_MAX_NUM_PINS ||
 +          swidget->num_source_pins > SOF_WIDGET_MAX_NUM_PINS) {
 +              dev_err(scomp->dev, "invalid pins for %s: [sink: %d, src: %d]\n",
 +                      swidget->widget->name, swidget->num_sink_pins, swidget->num_source_pins);
 +              return -EINVAL;
 +      }
 +
 +      if (swidget->num_sink_pins > 1) {
 +              ret = sof_parse_pin_binding(swidget, priv, SOF_PIN_TYPE_SINK);
 +              /* on parsing error, pin binding is not allocated, nothing to free. */
 +              if (ret < 0) {
 +                      dev_err(scomp->dev, "failed to parse sink pin binding for %s\n",
 +                              w->name);
 +                      return ret;
 +              }
 +      }
 +
 +      if (swidget->num_source_pins > 1) {
 +              ret = sof_parse_pin_binding(swidget, priv, SOF_PIN_TYPE_SOURCE);
 +              /* on parsing error, pin binding is not allocated, nothing to free. */
 +              if (ret < 0) {
 +                      dev_err(scomp->dev, "failed to parse source pin binding for %s\n",
 +                              w->name);
 +                      return ret;
 +              }
 +      }
 +
 +      dev_dbg(scomp->dev,
 +              "tplg: widget %d (%s) is ready [type: %d, pipe: %d, pins: %d / %d, stream: %s]\n",
 +              swidget->comp_id, w->name, swidget->id, index,
 +              swidget->num_sink_pins, swidget->num_source_pins,
 +              strnlen(w->sname, SNDRV_CTL_ELEM_ID_NAME_MAXLEN) > 0 ? w->sname : "none");
  
        token_list = widget_ops[w->id].token_list;
        token_list_size = widget_ops[w->id].token_list_size;
                break;
        }
  
-       if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE)) {
-               swidget->core = SOF_DSP_PRIMARY_CORE;
-       } else {
-               int core = sof_get_token_value(SOF_TKN_COMP_CORE_ID, swidget->tuples,
-                                              swidget->num_tuples);
-               if (core >= 0)
-                       swidget->core = core;
-       }
        /* check token parsing reply */
        if (ret < 0) {
                dev_err(scomp->dev,
                return ret;
        }
  
+       if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE)) {
+               swidget->core = SOF_DSP_PRIMARY_CORE;
+       } else {
+               int core = sof_get_token_value(SOF_TKN_COMP_CORE_ID, swidget->tuples,
+                                              swidget->num_tuples);
+               if (core >= 0)
+                       swidget->core = core;
+       }
        /* bind widget to external event */
        if (tw->event_type) {
                if (widget_ops[w->id].bind_event) {
        if (widget_ops[swidget->id].ipc_free)
                widget_ops[swidget->id].ipc_free(swidget);
  
 +      ida_destroy(&swidget->src_queue_ida);
 +      ida_destroy(&swidget->sink_queue_ida);
 +
 +      sof_free_pin_binding(swidget, SOF_PIN_TYPE_SINK);
 +      sof_free_pin_binding(swidget, SOF_PIN_TYPE_SOURCE);
 +
        kfree(swidget->tuples);
  
        /* remove and free swidget object */
This page took 0.175574 seconds and 4 git commands to generate.