generalized kernel feature ready for next time.
PLEASE check your patch with the automated style checker
- (scripts/checkpatch.pl) to catch trival style violations.
+ (scripts/checkpatch.pl) to catch trivial style violations.
See Documentation/CodingStyle for guidance here.
PLEASE CC: the maintainers and mailing lists that are generated
F: drivers/pnp/pnpacpi/
F: include/linux/acpi.h
F: include/acpi/
- F: Documentation/acpi
+ F: Documentation/acpi/
F: Documentation/ABI/testing/sysfs-bus-acpi
F: drivers/pci/*acpi*
F: drivers/pci/*/*acpi*
F: drivers/pci/*/*/*acpi*
- F: tools/power/acpi
+ F: tools/power/acpi/
ACPI COMPONENT ARCHITECTURE (ACPICA)
M: Robert Moore <robert.moore@intel.com>
L: linux-alpha@vger.kernel.org
F: arch/alpha/
+ ALTERA MAILBOX DRIVER
+ M: Ley Foon Tan <lftan@altera.com>
+ L: nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
+ S: Maintained
+ F: drivers/mailbox/mailbox-altera.c
+
ALTERA TRIPLE SPEED ETHERNET DRIVER
M: Vince Bridgers <vbridger@opensource.altera.com>
L: netdev@vger.kernel.org
T: git git://people.freedesktop.org/~gabbayo/linux.git
S: Supported
F: drivers/gpu/drm/amd/amdkfd/
+ F: drivers/gpu/drm/amd/include/cik_structs.h
+ F: drivers/gpu/drm/amd/include/kgd_kfd_interface.h
F: drivers/gpu/drm/radeon/radeon_kfd.c
F: drivers/gpu/drm/radeon/radeon_kfd.h
F: include/uapi/linux/kfd_ioctl.h
AMD MICROCODE UPDATE SUPPORT
----M: Andreas Herrmann <herrmann.der.user@googlemail.com>
----L: amd64-microcode@amd64.org
++++M: Borislav Petkov <bp@alien8.de>
S: Maintained
F: arch/x86/kernel/cpu/microcode/amd*
S: Maintained
F: drivers/media/i2c/ad9389b*
+ ANALOG DEVICES INC ADV7180 DRIVER
+ M: Lars-Peter Clausen <lars@metafoo.de>
+ L: linux-media@vger.kernel.org
+ W: http://ez.analog.com/community/linux-device-drivers
+ S: Supported
+ F: drivers/media/i2c/adv7180.c
+
ANALOG DEVICES INC ADV7511 DRIVER
M: Hans Verkuil <hans.verkuil@cisco.com>
L: linux-media@vger.kernel.org
W: http://blackfin.uclinux.org/
S: Supported
F: sound/soc/blackfin/*
-
+
ANALOG DEVICES INC IIO DRIVERS
M: Lars-Peter Clausen <lars@metafoo.de>
M: Michael Hennerich <Michael.Hennerich@analog.com>
F: drivers/staging/iio/*/ad*
F: staging/iio/trigger/iio-trig-bfin-timer.c
+ ANDROID DRIVERS
+ M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+ M: Arve Hjønnevåg <arve@android.com>
+ M: Riley Andrews <riandrews@android.com>
+ T: git git://git.kernel.org/pub/scm/linux/kernel/gregkh/staging.git
+ L: devel@driverdev.osuosl.org
+ S: Supported
+ F: drivers/android/
+ F: drivers/staging/android/
+
AOA (Apple Onboard Audio) ALSA DRIVER
M: Johannes Berg <johannes@sipsolutions.net>
L: linuxppc-dev@lists.ozlabs.org
F: drivers/char/apm-emulation.c
APPLE BCM5974 MULTITOUCH DRIVER
- M: Henrik Rydberg <rydberg@euromail.se>
+ M: Henrik Rydberg <rydberg@bitmath.org>
L: linux-input@vger.kernel.org
- S: Maintained
+ S: Odd fixes
F: drivers/input/mouse/bcm5974.c
APPLE SMC DRIVER
- M: Henrik Rydberg <rydberg@euromail.se>
+ M: Henrik Rydberg <rydberg@bitmath.org>
L: lm-sensors@lm-sensors.org
- S: Maintained
+ S: Odd fixes
F: drivers/hwmon/applesmc.c
APPLETALK NETWORK LAYER
S: Maintained
F: drivers/media/i2c/aptina-pll.*
- ARASAN COMPACT FLASH PATA CONTROLLER
- M: Viresh Kumar <viresh.linux@gmail.com>
- L: linux-ide@vger.kernel.org
- S: Maintained
- F: include/linux/pata_arasan_cf_data.h
- F: drivers/ata/pata_arasan_cf.c
-
ARC FRAMEBUFFER DRIVER
M: Jaya Kumar <jayalk@intworks.biz>
S: Maintained
F: arch/arm/boot/dts/at91*.dtsi
F: arch/arm/boot/dts/sama*.dts
F: arch/arm/boot/dts/sama*.dtsi
+ F: arch/arm/include/debug/at91.S
ARM/ATMEL AT91 Clock Support
M: Boris Brezillon <boris.brezillon@free-electrons.com>
F: arch/arm/mach-prima2/
F: drivers/clk/sirf/
F: drivers/clocksource/timer-prima2.c
- F: drivers/clocksource/timer-marco.c
+ F: drivers/clocksource/timer-atlas7.c
N: [^a-z]sirf
ARM/EBSA110 MACHINE SUPPORT
F: arch/arm/boot/dts/imx*
F: arch/arm/configs/imx*_defconfig
++++ARM/FREESCALE VYBRID ARM ARCHITECTURE
++++M: Shawn Guo <shawn.guo@linaro.org>
++++M: Sascha Hauer <kernel@pengutronix.de>
++++R: Stefan Agner <stefan@agner.ch>
++++L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
++++S: Maintained
++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
++++F: arch/arm/mach-imx/*vf610*
++++F: arch/arm/boot/dts/vf*
++++
ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
M: Lennert Buytenhek <kernel@wantstofly.org>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/mach-mvebu/
---F: drivers/rtc/armada38x-rtc
++++F: drivers/rtc/rtc-armada38x.c
ARM/Marvell Berlin SoC support
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
M: Jason Cooper <jason@lakedaemon.net>
M: Andrew Lunn <andrew@lunn.ch>
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
++++M: Gregory Clement <gregory.clement@free-electrons.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: arch/arm/mach-dove/
ARM/QUALCOMM SUPPORT
M: Kumar Gala <galak@codeaurora.org>
+ M: Andy Gross <agross@codeaurora.org>
M: David Brown <davidb@codeaurora.org>
L: linux-arm-msm@vger.kernel.org
+ L: linux-soc@vger.kernel.org
S: Maintained
F: arch/arm/mach-qcom/
+ F: drivers/soc/qcom/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/galak/linux-qcom.git
ARM/RADISYS ENP2611 MACHINE SUPPORT
F: drivers/*/*rockchip*
F: drivers/*/*/*rockchip*
F: sound/soc/rockchip/
++++N: rockchip
ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
M: Kukjin Kim <kgene@kernel.org>
F: arch/arm/configs/armadillo800eva_defconfig
F: arch/arm/configs/bockw_defconfig
F: arch/arm/configs/kzm9g_defconfig
- F: arch/arm/configs/lager_defconfig
F: arch/arm/configs/mackerel_defconfig
F: arch/arm/configs/marzen_defconfig
F: arch/arm/configs/shmobile_defconfig
F: drivers/clocksource/cadence_ttc_timer.c
F: drivers/i2c/busses/i2c-cadence.c
F: drivers/mmc/host/sdhci-of-arasan.c
+ F: drivers/edac/synopsys_edac.c
ARM SMMU DRIVER
M: Will Deacon <will.deacon@arm.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
S: Maintained
F: drivers/iommu/arm-smmu.c
+ F: drivers/iommu/io-pgtable-arm.c
ARM64 PORT (AARCH64 ARCHITECTURE)
M: Catalin Marinas <catalin.marinas@arm.com>
F: include/linux/platform_data/at24.h
ATA OVER ETHERNET (AOE) DRIVER
----M: "Ed L. Cashin" <ecashin@coraid.com>
----W: http://support.coraid.com/support/linux
++++M: "Ed L. Cashin" <ed.cashin@acm.org>
++++W: http://www.openaoe.org/
S: Supported
F: Documentation/aoe/
F: drivers/block/aoe/
M: Nick Kossifidis <mickflemm@gmail.com>
M: "Luis R. Rodriguez" <mcgrof@do-not-panic.com>
L: linux-wireless@vger.kernel.org
- L: ath5k-devel@lists.ath5k.org
W: http://wireless.kernel.org/en/users/Drivers/ath5k
S: Maintained
F: drivers/net/wireless/ath/ath5k/
F: drivers/net/ethernet/atheros/
ATM
----M: Chas Williams <chas@cmf.nrl.navy.mil>
++++M: Chas Williams <3chas3@gmail.com>
L: linux-atm-general@lists.sourceforge.net (moderated for non-subscribers)
L: netdev@vger.kernel.org
W: http://linux-atm.sourceforge.net
F: drivers/tty/serial/atmel_serial.c
ATMEL Audio ALSA driver
----M: Bo Shen <voice.shen@atmel.com>
++++M: Nicolas Ferre <nicolas.ferre@atmel.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
S: Supported
F: sound/soc/atmel
BONDING DRIVER
M: Jay Vosburgh <j.vosburgh@gmail.com>
M: Veaceslav Falico <vfalico@gmail.com>
----M: Andy Gospodarek <andy@greyhouse.net>
++++M: Andy Gospodarek <gospo@cumulusnetworks.com>
L: netdev@vger.kernel.org
W: http://sourceforge.net/projects/bonding/
S: Supported
BROADCOM BCM281XX/BCM11XXX/BCM216XX ARM ARCHITECTURE
M: Christian Daudt <bcm@fixthebug.org>
----M: Matt Porter <mporter@linaro.org>
M: Florian Fainelli <f.fainelli@gmail.com>
L: bcm-kernel-feedback-list@broadcom.com
T: git git://github.com/broadcom/mach-bcm
BROADCOM BCM63XX ARM ARCHITECTURE
M: Florian Fainelli <f.fainelli@gmail.com>
L: linux-arm-kernel@lists.infradead.org
- T: git git://git.github.com/brcm/linux.git
+ T: git git://github.com/broadcom/arm-bcm63xx.git
S: Maintained
F: arch/arm/mach-bcm/bcm63xx.c
F: arch/arm/include/debug/bcm63xx.S
M: Gregory Fong <gregory.0xf0@gmail.com>
M: Florian Fainelli <f.fainelli@gmail.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
+ T: git git://github.com/broadcom/stblinux.git
S: Maintained
F: arch/arm/mach-bcm/*brcmstb*
F: arch/arm/boot/dts/bcm7*.dts*
M: Kevin Cernekee <cernekee@gmail.com>
M: Florian Fainelli <f.fainelli@gmail.com>
L: linux-mips@linux-mips.org
+ T: git git://github.com/broadcom/stblinux.git
S: Maintained
F: arch/mips/bmips/*
F: arch/mips/include/asm/mach-bmips/*
M: Scott Branden <sbranden@broadcom.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: bcm-kernel-feedback-list@broadcom.com
- T: git git://git.github.com/brcm/linux.git
+ T: git git://github.com/broadcom/cygnus-linux.git
S: Maintained
N: iproc
N: cygnus
BTRFS FILE SYSTEM
M: Chris Mason <clm@fb.com>
M: Josef Bacik <jbacik@fb.com>
+ M: David Sterba <dsterba@suse.cz>
L: linux-btrfs@vger.kernel.org
W: http://btrfs.wiki.kernel.org/
Q: http://patchwork.kernel.org/project/linux-btrfs/list/
CAN NETWORK LAYER
M: Oliver Hartkopp <socketcan@hartkopp.net>
++++M: Marc Kleine-Budde <mkl@pengutronix.de>
L: linux-can@vger.kernel.org
----W: http://gitorious.org/linux-can
- T: git git://gitorious.org/linux-can/linux-can-next.git
++++W: https://github.com/linux-can
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
S: Maintained
F: Documentation/networking/can.txt
F: net/can/
M: Wolfgang Grandegger <wg@grandegger.com>
M: Marc Kleine-Budde <mkl@pengutronix.de>
L: linux-can@vger.kernel.org
----W: http://gitorious.org/linux-can
- T: git git://gitorious.org/linux-can/linux-can-next.git
++++W: https://github.com/linux-can
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can.git
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next.git
S: Maintained
F: drivers/net/can/
F: include/linux/can/dev.h
F: security/commoncap.c
F: kernel/capability.c
+ CAPELLA MICROSYSTEMS LIGHT SENSOR DRIVER
+ M: Kevin Tsai <ktsai@capellamicro.com>
+ S: Maintained
+ F: drivers/iio/light/cm*
+ F: Documentation/devicetree/bindings/i2c/trivial-devices.txt
+
CC2520 IEEE-802.15.4 RADIO DRIVER
M: Varka Bhadram <varkabhadram@gmail.com>
L: linux-wpan@vger.kernel.org
F: arch/powerpc/platforms/cell/
CEPH DISTRIBUTED FILE SYSTEM CLIENT
- M: Sage Weil <sage@inktank.com>
+ M: Yan, Zheng <zyan@redhat.com>
+ M: Sage Weil <sage@redhat.com>
L: ceph-devel@vger.kernel.org
W: http://ceph.com/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
F: drivers/input/touchscreen/cyttsp*
F: include/linux/input/cyttsp.h
+ DALLAS/MAXIM DS1685-FAMILY REAL TIME CLOCK
+ M: Joshua Kinard <kumba@gentoo.org>
+ S: Maintained
+ F: drivers/rtc/rtc-ds1685.c
+ F: include/linux/rtc/ds1685.h
+
DAMA SLAVE for AX.25
M: Joerg Reuter <jreuter@yaina.de>
W: http://yaina.de/jreuter/
DELL LAPTOP SMM DRIVER
M: Guenter Roeck <linux@roeck-us.net>
+ S: Maintained
F: drivers/char/i8k.c
F: include/uapi/linux/i8k.h
F: drivers/platform/x86/dell-wmi.c
DESIGNWARE USB2 DRD IP DRIVER
- M: Paul Zimmerman <paulz@synopsys.com>
+ M: John Youn <johnyoun@synopsys.com>
L: linux-usb@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb.git
S: Maintained
S: Maintained
F: drivers/i2c/busses/i2c-diolan-u2c.c
+ DIRECT ACCESS (DAX)
+ M: Matthew Wilcox <willy@linux.intel.com>
+ L: linux-fsdevel@vger.kernel.org
+ S: Supported
+ F: fs/dax.c
+
DIRECTORY NOTIFICATION (DNOTIFY)
M: Eric Paris <eparis@parisplace.org>
S: Maintained
Q: https://patchwork.kernel.org/project/linux-dmaengine/list/
S: Maintained
F: drivers/dma/
- F: include/linux/dma*
+ F: include/linux/dmaengine.h
F: Documentation/dmaengine/
T: git git://git.infradead.org/users/vkoul/slave-dma.git
F: Documentation/hwmon/dme1737
F: drivers/hwmon/dme1737.c
++++DMI/SMBIOS SUPPORT
++++M: Jean Delvare <jdelvare@suse.de>
++++S: Maintained
++++F: drivers/firmware/dmi-id.c
++++F: drivers/firmware/dmi_scan.c
++++F: include/linux/dmi.h
++++
DOCKING STATION DRIVER
M: Shaohua Li <shaohua.li@intel.com>
L: linux-acpi@vger.kernel.org
X: Documentation/ABI/
X: Documentation/devicetree/
X: Documentation/[a-z][a-z]_[A-Z][A-Z]/
+ T: git git://git.lwn.net/linux-2.6.git docs-next
DOUBLETALK DRIVER
M: "James R. Van Zandt" <jrv@vanzandt.mv.com>
S: Maintained
F: drivers/tty/serial/dz.*
+ E3X0 POWER BUTTON DRIVER
+ M: Moritz Fischer <moritz.fischer@ettus.com>
+ L: usrp-users@lists.ettus.com
+ W: http://www.ettus.com
+ S: Supported
+ F: drivers/input/misc/e3x0-button.c
+ F: Documentation/devicetree/bindings/input/e3x0-button.txt
+
E4000 MEDIA DRIVER
M: Antti Palosaari <crope@iki.fi>
L: linux-media@vger.kernel.org
M: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
L: linux-edac@vger.kernel.org
W: bluesmoke.sourceforge.net
+ T: git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git#for-next
+ T: git://git.kernel.org/pub/linux/kernel/git/mchehab/linux-edac.git#linux_next
S: Supported
F: Documentation/edac.txt
F: drivers/edac/
F: Documentation/fault-injection/
F: lib/fault-inject.c
+ FBTFT Framebuffer drivers
+ M: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+ M: Noralf Trønnes <noralf@tronnes.org>
+ S: Maintained
+ F: drivers/staging/fbtft/
+
FCOE SUBSYSTEM (libfc, libfcoe, fcoe)
- M: Robert Love <robert.w.love@intel.com>
+ M: Vasu Dev <vasu.dev@intel.com>
L: fcoe-devel@open-fcoe.org
W: www.Open-FCoE.org
S: Supported
F: include/linux/platform_data/video-imxfb.h
F: drivers/video/fbdev/imxfb.c
+ FREESCALE QUAD SPI DRIVER
+ M: Han Xu <han.xu@freescale.com>
+ L: linux-mtd@lists.infradead.org
+ S: Maintained
+ F: drivers/mtd/spi-nor/fsl-quadspi.c
+
FREESCALE SOC FS_ENET DRIVER
M: Pantelis Antoniou <pantelis.antoniou@gmail.com>
M: Vitaly Bordug <vbordug@ru.mvista.com>
S: Supported
F: drivers/scsi/gdt*
+ GDB KERNEL DEBUGGING HELPER SCRIPTS
+ M: Jan Kiszka <jan.kiszka@siemens.com>
+ S: Supported
+ F: scripts/gdb/
+
GEMTEK FM RADIO RECEIVER DRIVER
M: Hans Verkuil <hverkuil@xs4all.nl>
L: linux-media@vger.kernel.org
HARDWARE RANDOM NUMBER GENERATOR CORE
M: Matt Mackall <mpm@selenic.com>
M: Herbert Xu <herbert@gondor.apana.org.au>
+ L: linux-crypto@vger.kernel.org
S: Odd fixes
F: Documentation/hw_random.txt
F: drivers/char/hw_random/
F: drivers/scsi/ipr.*
IBM Power Virtual Ethernet Device Driver
- M: Santiago Leon <santil@linux.vnet.ibm.com>
+ M: Thomas Falcon <tlfalcon@linux.vnet.ibm.com>
L: netdev@vger.kernel.org
S: Supported
F: drivers/net/ethernet/ibm/ibmveth.*
IBM Power Virtual SCSI Device Drivers
- M: Nathan Fontenot <nfont@linux.vnet.ibm.com>
+ M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
L: linux-scsi@vger.kernel.org
S: Supported
F: drivers/scsi/ibmvscsi/ibmvscsi*
F: drivers/scsi/ibmvscsi/viosrp.h
IBM Power Virtual FC Device Drivers
- M: Brian King <brking@linux.vnet.ibm.com>
+ M: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
L: linux-scsi@vger.kernel.org
S: Supported
F: drivers/scsi/ibmvscsi/ibmvfc*
INTEGRITY MEASUREMENT ARCHITECTURE (IMA)
M: Mimi Zohar <zohar@linux.vnet.ibm.com>
- M: Dmitry Kasatkin <d.kasatkin@samsung.com>
+ M: Dmitry Kasatkin <dmitry.kasatkin@gmail.com>
L: linux-ima-devel@lists.sourceforge.net
L: linux-ima-user@lists.sourceforge.net
L: linux-security-module@vger.kernel.org
INPUT (KEYBOARD, MOUSE, JOYSTICK, TOUCHSCREEN) DRIVERS
M: Dmitry Torokhov <dmitry.torokhov@gmail.com>
- M: Dmitry Torokhov <dtor@mail.ru>
L: linux-input@vger.kernel.org
Q: http://patchwork.kernel.org/project/linux-input/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git
F: include/linux/input/
INPUT MULTITOUCH (MT) PROTOCOL
- M: Henrik Rydberg <rydberg@euromail.se>
+ M: Henrik Rydberg <rydberg@bitmath.org>
L: linux-input@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rydberg/input-mt.git
- S: Maintained
+ S: Odd fixes
F: Documentation/input/multi-touch-protocol.txt
F: drivers/input/input-mt.c
K: \b(ABS|SYN)_MT_
+ INTEL ASoC BDW/HSW DRIVERS
+ M: Jie Yang <yang.jie@linux.intel.com>
+ L: alsa-devel@alsa-project.org
+ S: Supported
+ F: sound/soc/intel/sst-haswell*
+ F: sound/soc/intel/sst-dsp*
+ F: sound/soc/intel/sst-firmware.c
+ F: sound/soc/intel/broadwell.c
+ F: sound/soc/intel/haswell.c
+
INTEL C600 SERIES SAS CONTROLLER DRIVER
M: Intel SCU Linux support <intel-linux-scu@intel.com>
M: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
- M: Dave Jiang <dave.jiang@intel.com>
L: linux-scsi@vger.kernel.org
T: git git://git.code.sf.net/p/intel-sas/isci
S: Supported
F: drivers/platform/x86/intel_menlow.c
INTEL IA32 MICROCODE UPDATE SUPPORT
----M: Tigran Aivazian <tigran@aivazian.fsnet.co.uk>
++++M: Borislav Petkov <bp@alien8.de>
S: Maintained
F: arch/x86/kernel/cpu/microcode/core*
F: arch/x86/kernel/cpu/microcode/intel*
S: Maintained
F: drivers/char/hw_random/ixp4xx-rng.c
----INTEL ETHERNET DRIVERS (e100/e1000/e1000e/fm10k/igb/igbvf/ixgb/ixgbe/ixgbevf/i40e/i40evf)
++++INTEL ETHERNET DRIVERS
M: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
----M: Jesse Brandeburg <jesse.brandeburg@intel.com>
----M: Bruce Allan <bruce.w.allan@intel.com>
----M: Carolyn Wyborny <carolyn.wyborny@intel.com>
----M: Don Skidmore <donald.c.skidmore@intel.com>
----M: Greg Rose <gregory.v.rose@intel.com>
----M: Matthew Vick <matthew.vick@intel.com>
----M: John Ronciak <john.ronciak@intel.com>
----M: Mitch Williams <mitch.a.williams@intel.com>
----M: Linux NICS <linux.nics@intel.com>
----L: e1000-devel@lists.sourceforge.net
++++R: Jesse Brandeburg <jesse.brandeburg@intel.com>
++++R: Shannon Nelson <shannon.nelson@intel.com>
++++R: Carolyn Wyborny <carolyn.wyborny@intel.com>
++++R: Don Skidmore <donald.c.skidmore@intel.com>
++++R: Matthew Vick <matthew.vick@intel.com>
++++R: John Ronciak <john.ronciak@intel.com>
++++R: Mitch Williams <mitch.a.williams@intel.com>
++++L: intel-wired-lan@lists.osuosl.org
W: http://www.intel.com/support/feedback.htm
W: http://e1000.sourceforge.net/
----T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net.git
----T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-next.git
++++Q: http://patchwork.ozlabs.org/project/intel-wired-lan/list/
++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/net-queue.git
++++T: git git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue.git
S: Supported
F: Documentation/networking/e100.txt
F: Documentation/networking/e1000.txt
F: include/linux/ipmi*
F: include/uapi/linux/ipmi*
++ ++QCOM AUDIO (ASoC) DRIVERS
++ ++M: Patrick Lai <plai@codeaurora.org>
++ ++M: Banajit Goswami <bgoswami@codeaurora.org>
++ ++L: alsa-devel@alsa-project.org (moderated for non-subscribers)
++ ++S: Supported
++ ++F: sound/soc/qcom/
++ ++
IPS SCSI RAID DRIVER
M: Adaptec OEM Raid Solutions <aacraid@adaptec.com>
L: linux-scsi@vger.kernel.org
Q: http://patchwork.kernel.org/project/linux-rdma/list/
F: drivers/infiniband/ulp/iser/
+ ISCSI EXTENSIONS FOR RDMA (ISER) TARGET
+ M: Sagi Grimberg <sagig@mellanox.com>
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/nab/target-pending.git master
+ L: linux-rdma@vger.kernel.org
+ L: target-devel@vger.kernel.org
+ S: Supported
+ W: http://www.linux-iscsi.org
+ F: drivers/infiniband/ulp/isert
+
ISDN SUBSYSTEM
M: Karsten Keil <isdn@linux-pingi.de>
L: isdn4linux@listserv.isdn4linux.de (subscribers-only)
F: include/linux/lguest*.h
F: tools/lguest/
+ LIBATA SUBSYSTEM (Serial and Parallel ATA drivers)
+ M: Tejun Heo <tj@kernel.org>
+ L: linux-ide@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
+ S: Maintained
+ F: drivers/ata/
+ F: include/linux/ata.h
+ F: include/linux/libata.h
+
+ LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
+ M: Viresh Kumar <viresh.linux@gmail.com>
+ L: linux-ide@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
+ S: Maintained
+ F: include/linux/pata_arasan_cf_data.h
+ F: drivers/ata/pata_arasan_cf.c
+
+ LIBATA PATA DRIVERS
+ M: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
+ M: Tejun Heo <tj@kernel.org>
+ L: linux-ide@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
+ S: Maintained
+ F: drivers/ata/pata_*.c
+ F: drivers/ata/ata_generic.c
+
+ LIBATA SATA AHCI PLATFORM devices support
+ M: Hans de Goede <hdegoede@redhat.com>
+ M: Tejun Heo <tj@kernel.org>
+ L: linux-ide@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
+ S: Maintained
+ F: drivers/ata/ahci_platform.c
+ F: drivers/ata/libahci_platform.c
+ F: include/linux/ahci_platform.h
+
+ LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
+ M: Mikael Pettersson <mikpelinux@gmail.com>
+ L: linux-ide@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
+ S: Maintained
+ F: drivers/ata/sata_promise.*
+
LIBLOCKDEP
M: Sasha Levin <sasha.levin@oracle.com>
S: Maintained
F: drivers/misc/lis3lv02d/
F: drivers/platform/x86/hp_accel.c
+ LIVE PATCHING
+ M: Josh Poimboeuf <jpoimboe@redhat.com>
+ M: Seth Jennings <sjenning@redhat.com>
+ M: Jiri Kosina <jkosina@suse.cz>
+ M: Vojtech Pavlik <vojtech@suse.cz>
+ S: Maintained
+ F: kernel/livepatch/
+ F: include/linux/livepatch.h
+ F: arch/x86/include/asm/livepatch.h
+ F: arch/x86/kernel/livepatch.c
+ F: Documentation/ABI/testing/sysfs-kernel-livepatch
+ F: samples/livepatch/
+ L: live-patching@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/livepatching.git
+
LLC (802.2)
M: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
S: Maintained
F: drivers/hwmon/max6697.c
F: include/linux/platform_data/max6697.h
+ MAXIM MUIC CHARGER DRIVERS FOR EXYNOS BASED BOARDS
+ M: Krzysztof Kozlowski <k.kozlowski@samsung.com>
+ L: linux-pm@vger.kernel.org
+ S: Supported
+ F: drivers/power/max14577_charger.c
+ F: drivers/power/max77693_charger.c
+
+ MAXIM PMIC AND MUIC DRIVERS FOR EXYNOS BASED BOARDS
+ M: Chanwoo Choi <cw00.choi@samsung.com>
+ M: Krzysztof Kozlowski <k.kozlowski@samsung.com>
+ L: linux-kernel@vger.kernel.org
+ S: Supported
+ F: drivers/*/max14577.c
+ F: drivers/*/max77686.c
+ F: drivers/*/max77693.c
+ F: drivers/extcon/extcon-max14577.c
+ F: drivers/extcon/extcon-max77693.c
+ F: drivers/rtc/rtc-max77686.c
+ F: drivers/clk/clk-max77686.c
+ F: Documentation/devicetree/bindings/mfd/max14577.txt
+ F: Documentation/devicetree/bindings/mfd/max77686.txt
+ F: Documentation/devicetree/bindings/mfd/max77693.txt
+ F: Documentation/devicetree/bindings/clock/maxim,max77686.txt
+ F: include/linux/mfd/max14577*.h
+ F: include/linux/mfd/max77686*.h
+ F: include/linux/mfd/max77693*.h
+
MAXIRADIO FM RADIO RECEIVER DRIVER
M: Hans Verkuil <hverkuil@xs4all.nl>
L: linux-media@vger.kernel.org
F: include/uapi/linux/ivtv*
F: include/uapi/linux/uvcvideo.h
- MEDIAVISION PRO MOVIE STUDIO DRIVER
- M: Hans Verkuil <hverkuil@xs4all.nl>
- L: linux-media@vger.kernel.org
- T: git git://linuxtv.org/media_tree.git
- W: http://linuxtv.org
- S: Odd Fixes
- F: drivers/media/parport/pms*
-
MEGARAID SCSI/SAS DRIVERS
M: Kashyap Desai <kashyap.desai@avagotech.com>
M: Sumit Saxena <sumit.saxena@avagotech.com>
F: net/netrom/
NETWORK BLOCK DEVICE (NBD)
- M: Paul Clements <Paul.Clements@steeleye.com>
+ M: Markus Pargmann <mpa@pengutronix.de>
S: Maintained
L: nbd-general@lists.sourceforge.net
+ T: git git://git.pengutronix.de/git/mpa/linux-nbd.git
F: Documentation/blockdev/nbd.txt
F: drivers/block/nbd.c
F: include/linux/nbd.h
F: include/uapi/linux/in.h
F: include/uapi/linux/net.h
F: include/uapi/linux/netdevice.h
+ F: include/uapi/linux/net_namespace.h
F: tools/net/
F: tools/testing/selftests/net/
F: lib/random32.c
NFS, SUNRPC, AND LOCKD CLIENTS
M: Trond Myklebust <trond.myklebust@primarydata.com>
+ M: Anna Schumaker <anna.schumaker@netapp.com>
L: linux-nfs@vger.kernel.org
W: http://client.linux-nfs.org
T: git git://git.linux-nfs.org/projects/trondmy/linux-nfs.git
NIOS2 ARCHITECTURE
M: Ley Foon Tan <lftan@altera.com>
L: nios2-dev@lists.rocketboards.org (moderated for non-subscribers)
- T: git git://git.rocketboards.org/linux-socfpga.git
+ T: git git://git.rocketboards.org/linux-socfpga-next.git
S: Maintained
F: arch/nios2/
S: Maintained
F: arch/arm/mach-omap2/omap_hwmod.*
+ OMAP HWMOD DATA
+ M: Paul Walmsley <paul@pwsan.com>
+ L: linux-omap@vger.kernel.org
+ S: Maintained
+ F: arch/arm/mach-omap2/omap_hwmod*data*
+
OMAP HWMOD DATA FOR OMAP4-BASED DEVICES
M: Benoît Cousson <bcousson@baylibre.com>
L: linux-omap@vger.kernel.org
M: Grant Likely <grant.likely@linaro.org>
M: Rob Herring <robh+dt@kernel.org>
L: devicetree@vger.kernel.org
- W: http://fdt.secretlab.ca
- T: git git://git.secretlab.ca/git/linux-2.6.git
+ W: http://www.devicetree.org/
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/glikely/linux.git
S: Maintained
F: drivers/of/
F: include/linux/of*.h
F: scripts/dtc/
- K: of_get_property
- K: of_match_table
OPEN FIRMWARE AND FLATTENED DEVICE TREE BINDINGS
M: Rob Herring <robh+dt@kernel.org>
OPENVSWITCH
M: Pravin Shelar <pshelar@nicira.com>
+ L: netdev@vger.kernel.org
L: dev@openvswitch.org
W: http://openvswitch.org
- T: git git://git.kernel.org/pub/scm/linux/kernel/git/pshelar/openvswitch.git
S: Maintained
F: net/openvswitch/
+ F: include/uapi/linux/openvswitch.h
OPL4 DRIVER
M: Clemens Ladisch <clemens@ladisch.de>
M: Mark Fasheh <mfasheh@suse.com>
M: Joel Becker <jlbec@evilplan.org>
L: ocfs2-devel@oss.oracle.com (moderated for non-subscribers)
----W: http://oss.oracle.com/projects/ocfs2/
----T: git git://git.kernel.org/pub/scm/linux/kernel/git/jlbec/ocfs2.git
++++W: http://ocfs2.wiki.kernel.org
S: Supported
F: Documentation/filesystems/ocfs2.txt
F: Documentation/filesystems/dlmfs.txt
M: Rusty Russell <rusty@rustcorp.com.au>
L: virtualization@lists.linux-foundation.org
S: Supported
- F: Documentation/ia64/paravirt_ops.txt
+ F: Documentation/virtual/paravirt_ops.txt
F: arch/*/kernel/paravirt*
F: arch/*/include/asm/paravirt.h
F: arch/x86/pci/
F: arch/x86/kernel/quirks.c
+ PCI DRIVER FOR ARM VERSATILE PLATFORM
+ M: Rob Herring <robh@kernel.org>
+ L: linux-pci@vger.kernel.org
+ L: linux-arm-kernel@lists.infradead.org
+ S: Maintained
+ F: Documentation/devicetree/bindings/pci/versatile.txt
+ F: drivers/pci/host/pci-versatile.c
+
PCI DRIVER FOR APPLIEDMICRO XGENE
M: Tanmay Inamdar <tinamdar@apm.com>
L: linux-pci@vger.kernel.org
F: drivers/pci/host/*layerscape*
PCI DRIVER FOR IMX6
- M: Richard Zhu <r65037@freescale.com>
+ M: Richard Zhu <Richard.Zhu@freescale.com>
M: Lucas Stach <l.stach@pengutronix.de>
L: linux-pci@vger.kernel.org
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
PIN CONTROL SUBSYSTEM
M: Linus Walleij <linus.walleij@linaro.org>
L: linux-gpio@vger.kernel.org
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl.git
S: Maintained
F: drivers/pinctrl/
F: include/linux/pinctrl/
S: Obsolete
F: drivers/net/wireless/prism54/
- PROMISE SATA TX2/TX4 CONTROLLER LIBATA DRIVER
- M: Mikael Pettersson <mikpelinux@gmail.com>
- L: linux-ide@vger.kernel.org
- S: Maintained
- F: drivers/ata/sata_promise.*
-
PS3 NETWORK SUPPORT
M: Geoff Levand <geoff@infradead.org>
L: netdev@vger.kernel.org
F: drivers/scsi/qla2xxx/
QLOGIC QLA4XXX iSCSI DRIVER
- M: Vikas Chaudhary <vikas.chaudhary@qlogic.com>
- M: iscsi-driver@qlogic.com
+ M: QLogic-Storage-Upstream@qlogic.com
L: linux-scsi@vger.kernel.org
S: Supported
F: Documentation/scsi/LICENSE.qla4xxx
S: Supported
F: drivers/net/wireless/ath/wcn36xx/
- QUICKCAM PARALLEL PORT WEBCAMS
- M: Hans Verkuil <hverkuil@xs4all.nl>
- L: linux-media@vger.kernel.org
- T: git git://linuxtv.org/media_tree.git
- W: http://linuxtv.org
- S: Odd Fixes
- F: drivers/media/parport/*-qcam*
-
RADOS BLOCK DEVICE (RBD)
- M: Yehuda Sadeh <yehuda@inktank.com>
- M: Sage Weil <sage@inktank.com>
+ M: Ilya Dryomov <idryomov@gmail.com>
+ M: Sage Weil <sage@redhat.com>
M: Alex Elder <elder@kernel.org>
M: ceph-devel@vger.kernel.org
W: http://ceph.com/
F: Documentation/rfkill.txt
F: net/rfkill/
+ RHASHTABLE
+ M: Thomas Graf <tgraf@suug.ch>
+ L: netdev@vger.kernel.org
+ S: Maintained
+ F: lib/rhashtable.c
+ F: include/linux/rhashtable.h
+
RICOH SMARTMEDIA/XD DRIVER
M: Maxim Levitsky <maximlevitsky@gmail.com>
S: Maintained
L: netdev@vger.kernel.org
F: drivers/net/ethernet/samsung/sxgbe/
++++SAMSUNG THERMAL DRIVER
++++M: Lukasz Majewski <l.majewski@samsung.com>
++++L: linux-pm@vger.kernel.org
++++L: linux-samsung-soc@vger.kernel.org
++++S: Supported
++++T: https://github.com/lmajewski/linux-samsung-thermal.git
++++F: drivers/thermal/samsung/
++++
SAMSUNG USB2 PHY DRIVER
M: Kamil Debski <k.debski@samsung.com>
L: linux-kernel@vger.kernel.org
M: Viresh Kumar <viresh.linux@gmail.com>
M: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
S: Maintained
+ F: include/linux/dma/dw.h
F: include/linux/platform_data/dma-dw.h
F: drivers/dma/dw/
F: kernel/time/time*.c
F: kernel/time/ntp.c
- TLG2300 VIDEO4LINUX-2 DRIVER
- M: Huang Shijie <shijie8@gmail.com>
- M: Hans Verkuil <hverkuil@xs4all.nl>
- S: Odd Fixes
- F: drivers/media/usb/tlg2300/
-
SC1200 WDT DRIVER
M: Zwane Mwaikambo <zwanem@gmail.com>
S: Maintained
F: drivers/scsi/sr*
SCSI RDMA PROTOCOL (SRP) INITIATOR
- M: Bart Van Assche <bvanassche@acm.org>
+ M: Bart Van Assche <bart.vanassche@sandisk.com>
L: linux-rdma@vger.kernel.org
S: Supported
W: http://www.openfabrics.org
F: drivers/misc/phantom.c
F: include/uapi/linux/phantom.h
- SERIAL ATA (SATA) SUBSYSTEM
- M: Tejun Heo <tj@kernel.org>
- L: linux-ide@vger.kernel.org
- T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
- S: Supported
- F: drivers/ata/
- F: include/linux/ata.h
- F: include/linux/libata.h
-
- SERIAL ATA AHCI PLATFORM devices support
- M: Hans de Goede <hdegoede@redhat.com>
- M: Tejun Heo <tj@kernel.org>
- L: linux-ide@vger.kernel.org
- T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
- S: Supported
- F: drivers/ata/ahci_platform.c
- F: drivers/ata/libahci_platform.c
- F: include/linux/ahci_platform.h
-
SERVER ENGINES 10Gbps iSCSI - BladeEngine 2 DRIVER
M: Jayamohan Kallickal <jayamohan.kallickal@emulex.com>
L: linux-scsi@vger.kernel.org
F: drivers/media/platform/davinci/
F: include/media/davinci/
+ TI AM437X VPFE DRIVER
+ M: Lad, Prabhakar <prabhakar.csengg@gmail.com>
+ L: linux-media@vger.kernel.org
+ W: http://linuxtv.org/
+ Q: http://patchwork.linuxtv.org/project/linux-media/list/
+ T: git git://linuxtv.org/mhadli/v4l-dvb-davinci_devices.git
+ S: Maintained
+ F: drivers/media/platform/am437x/
+
SIS 190 ETHERNET DRIVER
M: Francois Romieu <romieu@fr.zoreil.com>
L: netdev@vger.kernel.org
F: include/media/smiapp.h
F: drivers/media/i2c/smiapp-pll.c
F: drivers/media/i2c/smiapp-pll.h
+ F: include/uapi/linux/smiapp.h
+ F: Documentation/devicetree/bindings/media/i2c/nokia,smia.txt
SMM665 HARDWARE MONITOR DRIVER
M: Guenter Roeck <linux@roeck-us.net>
M: Bluecherry Maintainers <maintainers@bluecherrydvr.com>
M: Andrey Utkin <andrey.utkin@corp.bluecherry.net>
M: Andrey Utkin <andrey.krieger.utkin@gmail.com>
+ M: Ismael Luceno <ismael@iodev.co.uk>
L: linux-media@vger.kernel.org
S: Supported
F: drivers/media/pci/solo6x10/
S: Maintained
F: drivers/staging/rtl8723au/
+ STAGING - SILICON MOTION SM7XX FRAME BUFFER DRIVER
+ M: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
+ M: Teddy Wang <teddy.wang@siliconmotion.com>
+ M: Sudip Mukherjee <sudip@vectorindia.org>
+ L: linux-fbdev@vger.kernel.org
+ S: Maintained
+ F: drivers/staging/sm7xxfb/
+
STAGING - SLICOSS
M: Lior Dotan <liodot@gmail.com>
M: Christopher Harrer <charrer@alacritech.com>
F: arch/m68k/include/asm/sun3*
F: drivers/net/ethernet/i825xx/sun3*
+ SUN4I LOW RES ADC ATTACHED TABLET KEYS DRIVER
+ M: Hans de Goede <hdegoede@redhat.com>
+ L: linux-input@vger.kernel.org
+ S: Maintained
+ F: Documentation/devicetree/bindings/input/sun4i-lradc-keys.txt
+ F: drivers/input/keyboard/sun4i-lradc-keys.c
+
SUNDANCE NETWORK DRIVER
M: Denis Kirjanov <kda@linux-powerpc.org>
L: netdev@vger.kernel.org
SUPERH
L: linux-sh@vger.kernel.org
- W: http://www.linux-sh.org
Q: http://patchwork.kernel.org/project/linux-sh/list/
S: Orphan
F: Documentation/sh/
TI BANDGAP AND THERMAL DRIVER
M: Eduardo Valentin <edubezval@gmail.com>
L: linux-pm@vger.kernel.org
- S: Supported
+ L: linux-omap@vger.kernel.org
+ S: Maintained
F: drivers/thermal/ti-soc-thermal/
+ TI CDCE706 CLOCK DRIVER
+ M: Max Filippov <jcmvbkbc@gmail.com>
+ S: Maintained
+ F: drivers/clk/clk-cdce706.c
+
TI CLOCK DRIVER
M: Tero Kristo <t-kristo@ti.com>
L: linux-omap@vger.kernel.org
F: drivers/regulator/lp8788-*.c
F: include/linux/mfd/lp8788*.h
+ TI NETCP ETHERNET DRIVER
+ M: Wingman Kwok <w-kwok2@ti.com>
+ M: Murali Karicheri <m-karicheri2@ti.com>
+ L: netdev@vger.kernel.org
+ S: Maintained
+ F: drivers/net/ethernet/ti/netcp*
+
TI TWL4030 SERIES SOC CODEC DRIVER
M: Peter Ujfalusi <peter.ujfalusi@ti.com>
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
TILE ARCHITECTURE
M: Chris Metcalf <cmetcalf@ezchip.com>
- W: http://www.tilera.com/scm/
+ W: http://www.ezchip.com/scm/
S: Supported
F: arch/tile/
F: drivers/char/tile-srom.c
TPM DEVICE DRIVER
M: Peter Huewe <peterhuewe@gmx.de>
- M: Ashley Lai <ashley@ashleylai.com>
M: Marcel Selhorst <tpmdd@selhorst.net>
W: http://tpmdd.sourceforge.net
L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
+ Q: git git://github.com/PeterHuewe/linux-tpmdd.git
+ T: https://github.com/PeterHuewe/linux-tpmdd
S: Maintained
F: drivers/char/tpm/
+ TPM IBM_VTPM DEVICE DRIVER
+ M: Ashley Lai <ashleydlai@gmail.com>
+ W: http://tpmdd.sourceforge.net
+ L: tpmdd-devel@lists.sourceforge.net (moderated for non-subscribers)
+ S: Maintained
+ F: drivers/char/tpm/tpm_ibmvtpm*
+
TRACING
M: Steven Rostedt <rostedt@goodmis.org>
M: Ingo Molnar <mingo@redhat.com>
UNSORTED BLOCK IMAGES (UBI)
M: Artem Bityutskiy <dedekind1@gmail.com>
+ M: Richard Weinberger <richard@nod.at>
W: http://www.linux-mtd.infradead.org/
L: linux-mtd@lists.infradead.org
T: git git://git.infradead.org/ubifs-2.6.git
- S: Maintained
+ S: Supported
F: drivers/mtd/ubi/
F: include/linux/mtd/ubi.h
F: include/uapi/mtd/ubi-user.h
- UNSORTED BLOCK IMAGES (UBI) Fastmap
- M: Richard Weinberger <richard@nod.at>
- L: linux-mtd@lists.infradead.org
- S: Maintained
- F: drivers/mtd/ubi/fastmap.c
-
USB ACM DRIVER
M: Oliver Neukum <oliver@neukum.org>
L: linux-usb@vger.kernel.org
F: Documentation/usb/ohci.txt
F: drivers/usb/host/ohci*
++++USB OTG FSM (Finite State Machine)
++++M: Peter Chen <Peter.Chen@freescale.com>
++++T: git git://github.com/hzpeterchen/linux-usb.git
++++L: linux-usb@vger.kernel.org
++++S: Maintained
++++F: drivers/usb/common/usb-otg-fsm.c
++++
USB OVER IP DRIVER
M: Valentina Manea <valentina.manea.m@gmail.com>
M: Shuah Khan <shuah.kh@samsung.com>
M: "Hans J. Koch" <hjk@hansjkoch.de>
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
S: Maintained
+ T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git
F: Documentation/DocBook/uio-howto.tmpl
F: drivers/uio/
F: include/linux/uio*.h
XEN BLOCK SUBSYSTEM
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
+ M: Roger Pau Monné <roger.pau@citrix.com>
L: xen-devel@lists.xenproject.org (moderated for non-subscribers)
S: Supported
F: drivers/block/xen-blkback/*
L: linux-xtensa@linux-xtensa.org
S: Maintained
F: drivers/spi/spi-xtensa-xtfpga.c
+ F: sound/soc/xtensa/xtfpga-i2s.c
YAM DRIVER FOR AX.25
M: Jean-Paul Roubelat <jpr@f6fbb.org>
#include "rt286.h"
#define RT286_VENDOR_ID 0x10ec0286
+ #define RT288_VENDOR_ID 0x10ec0288
struct rt286_priv {
struct regmap *regmap;
*hp = false;
*mic = false;
+ if (!rt286->codec)
+ return -EINVAL;
if (rt286->pdata.cbj_en) {
regmap_read(rt286->regmap, RT286_GET_HP_SENSE, &buf);
*hp = buf & 0x80000000;
rt286->jack = jack;
--- /* Send an initial empty report */
--- snd_soc_jack_report(rt286->jack, 0,
--- SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
+++ if (jack) {
+++ /* enable IRQ */
- if (rt286->jack->status | SND_JACK_HEADPHONE)
++++ if (rt286->jack->status & SND_JACK_HEADPHONE)
+++ snd_soc_dapm_force_enable_pin(&codec->dapm, "LDO1");
+++ regmap_update_bits(rt286->regmap, RT286_IRQ_CTRL, 0x2, 0x2);
+++ /* Send an initial empty report */
+++ snd_soc_jack_report(rt286->jack, rt286->jack->status,
+++ SND_JACK_MICROPHONE | SND_JACK_HEADPHONE);
+++ } else {
+++ /* disable IRQ */
+++ regmap_update_bits(rt286->regmap, RT286_IRQ_CTRL, 0x2, 0x0);
+++ snd_soc_dapm_disable_pin(&codec->dapm, "LDO1");
+++ }
+++ snd_soc_dapm_sync(&codec->dapm);
return 0;
}
static int is_mclk_mode(struct snd_soc_dapm_widget *source,
struct snd_soc_dapm_widget *sink)
{
- struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(source->codec);
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(source->dapm);
+ struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
if (rt286->clk_id == RT286_SCLK_S_MCLK)
return 1;
static const struct snd_kcontrol_new rt286_snd_controls[] = {
SOC_DOUBLE_R_TLV("DAC0 Playback Volume", RT286_DACL_GAIN,
RT286_DACR_GAIN, 0, 0x7f, 0, out_vol_tlv),
+ SOC_DOUBLE_R("ADC0 Capture Switch", RT286_ADCL_GAIN,
+ RT286_ADCR_GAIN, 7, 1, 1),
SOC_DOUBLE_R_TLV("ADC0 Capture Volume", RT286_ADCL_GAIN,
RT286_ADCR_GAIN, 0, 0x7f, 0, out_vol_tlv),
SOC_SINGLE_TLV("AMIC Volume", RT286_MIC_GAIN,
static int rt286_spk_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
- struct snd_soc_codec *codec = w->codec;
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
static int rt286_set_dmic1_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
- struct snd_soc_codec *codec = w->codec;
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
return 0;
}
- static int rt286_adc_event(struct snd_soc_dapm_widget *w,
- struct snd_kcontrol *kcontrol, int event)
- {
- struct snd_soc_codec *codec = w->codec;
- unsigned int nid;
-
- nid = (w->reg >> 20) & 0xff;
-
- switch (event) {
- case SND_SOC_DAPM_POST_PMU:
- snd_soc_update_bits(codec,
- VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0),
- 0x7080, 0x7000);
- break;
- case SND_SOC_DAPM_PRE_PMD:
- snd_soc_update_bits(codec,
- VERB_CMD(AC_VERB_SET_AMP_GAIN_MUTE, nid, 0),
- 0x7080, 0x7080);
- break;
- default:
- return 0;
- }
-
- return 0;
- }
-
static int rt286_vref_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
- struct snd_soc_codec *codec = w->codec;
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
static int rt286_ldo2_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
- struct snd_soc_codec *codec = w->codec;
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
switch (event) {
case SND_SOC_DAPM_POST_PMU:
static int rt286_mic1_event(struct snd_soc_dapm_widget *w,
struct snd_kcontrol *kcontrol, int event)
{
- struct snd_soc_codec *codec = w->codec;
+ struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
switch (event) {
case SND_SOC_DAPM_PRE_PMU:
SND_SOC_DAPM_ADC("ADC 1", NULL, SND_SOC_NOPM, 0, 0),
/* ADC Mux */
- SND_SOC_DAPM_MUX_E("ADC 0 Mux", RT286_SET_POWER(RT286_ADC_IN1), 0, 1,
- &rt286_adc0_mux, rt286_adc_event, SND_SOC_DAPM_PRE_PMD |
- SND_SOC_DAPM_POST_PMU),
- SND_SOC_DAPM_MUX_E("ADC 1 Mux", RT286_SET_POWER(RT286_ADC_IN2), 0, 1,
- &rt286_adc1_mux, rt286_adc_event, SND_SOC_DAPM_PRE_PMD |
- SND_SOC_DAPM_POST_PMU),
+ SND_SOC_DAPM_MUX("ADC 0 Mux", RT286_SET_POWER(RT286_ADC_IN1), 0, 1,
+ &rt286_adc0_mux),
+ SND_SOC_DAPM_MUX("ADC 1 Mux", RT286_SET_POWER(RT286_ADC_IN2), 0, 1,
+ &rt286_adc1_mux),
/* Audio Interface */
SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
RT286_I2S_CTRL1, 0x0018, d_len_code << 3);
dev_dbg(codec->dev, "format val = 0x%x\n", val);
- if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
- snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val);
- else
- snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val);
+ snd_soc_update_bits(codec, RT286_DAC_FORMAT, 0x407f, val);
+ snd_soc_update_bits(codec, RT286_ADC_FORMAT, 0x407f, val);
return 0;
}
struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
rt286->codec = codec;
---- codec->dapm.bias_level = SND_SOC_BIAS_OFF;
if (rt286->i2c->irq) {
regmap_update_bits(rt286->regmap,
static const struct i2c_device_id rt286_i2c_id[] = {
{"rt286", 0},
+ {"rt288", 0},
{}
};
MODULE_DEVICE_TABLE(i2c, rt286_i2c_id);
{ }
};
--- DMI_MATCH(DMI_BOARD_NAME, "0144P8")
+ static struct dmi_system_id dmi_dell_dino[] = {
+ {
+ .ident = "Dell Dino",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++++ DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9343")
+ }
+ },
+ { }
+ };
+
static int rt286_i2c_probe(struct i2c_client *i2c,
const struct i2c_device_id *id)
{
struct rt286_platform_data *pdata = dev_get_platdata(&i2c->dev);
struct rt286_priv *rt286;
---- int i, ret;
++++ int i, ret, val;
rt286 = devm_kzalloc(&i2c->dev, sizeof(*rt286),
GFP_KERNEL);
return ret;
}
---- regmap_read(rt286->regmap,
---- RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &ret);
- -- if (ret != RT286_VENDOR_ID && ret != RT288_VENDOR_ID) {
- if (ret != RT286_VENDOR_ID) {
++++ ret = regmap_read(rt286->regmap,
++++ RT286_GET_PARAM(AC_NODE_ROOT, AC_PAR_VENDOR_ID), &val);
++++ if (ret != 0) {
++++ dev_err(&i2c->dev, "I2C error %d\n", ret);
++++ return ret;
++++ }
++++ if (val != RT286_VENDOR_ID && val != RT288_VENDOR_ID) {
dev_err(&i2c->dev,
---- "Device with ID register %x is not rt286\n", ret);
++++ "Device with ID register %x is not rt286\n", val);
return -ENODEV;
}
rt286->i2c = i2c;
i2c_set_clientdata(i2c, rt286);
++++ /* restore codec default */
++++ for (i = 0; i < INDEX_CACHE_SIZE; i++)
++++ regmap_write(rt286->regmap, rt286->index_cache[i].reg,
++++ rt286->index_cache[i].def);
++++ for (i = 0; i < ARRAY_SIZE(rt286_reg); i++)
++++ regmap_write(rt286->regmap, rt286_reg[i].reg,
++++ rt286_reg[i].def);
++++
if (pdata)
rt286->pdata = *pdata;
- if (dmi_check_system(force_combo_jack_table))
+ if (dmi_check_system(force_combo_jack_table) ||
+ dmi_check_system(dmi_dell_dino))
rt286->pdata.cbj_en = true;
regmap_write(rt286->regmap, RT286_SET_AUDIO_POWER, AC_PWRST_D3);
regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL3, 0xf777, 0x4737);
regmap_update_bits(rt286->regmap, RT286_DEPOP_CTRL4, 0x00ff, 0x003f);
+ if (dmi_check_system(dmi_dell_dino)) {
+ regmap_update_bits(rt286->regmap,
+ RT286_SET_GPIO_MASK, 0x40, 0x40);
+ regmap_update_bits(rt286->regmap,
+ RT286_SET_GPIO_DIRECTION, 0x40, 0x40);
+ regmap_update_bits(rt286->regmap,
+ RT286_SET_GPIO_DATA, 0x40, 0x40);
+ regmap_update_bits(rt286->regmap,
+ RT286_GPIO_CTRL, 0xc, 0x8);
+ }
+
if (rt286->i2c->irq) {
ret = request_threaded_irq(rt286->i2c->irq, NULL, rt286_irq,
IRQF_TRIGGER_HIGH | IRQF_ONESHOT, "rt286", rt286);
iec->status[0] |= IEC958_AES0_CON_EMPHASIS_NONE;
- --- iec->status[0] |= IEC958_AES1_PRO_MODE_NOTID;
- ---
iec->status[1] = IEC958_AES1_CON_GENERAL;
iec->status[2] |= IEC958_AES2_CON_SOURCE_UNSPEC;
return ret;
card = devm_kzalloc(dev, sizeof(*card), GFP_KERNEL);
++++ if (!card)
++++ return -ENOMEM;
++++
card->name = devm_kasprintf(dev, GFP_KERNEL,
"HDMI %s", dev_name(ad->dssdev));
card->owner = THIS_MODULE;
*
*/
#include <linux/pm_runtime.h>
--- -#include <linux/shdma-base.h>
#include "rsnd.h"
#define RSND_RATES SNDRV_PCM_RATE_8000_96000
#define RSND_FMTS (SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S16_LE)
--- -static struct rsnd_of_data rsnd_of_data_gen1 = {
+++ +static const struct rsnd_of_data rsnd_of_data_gen1 = {
.flags = RSND_GEN1,
};
--- -static struct rsnd_of_data rsnd_of_data_gen2 = {
+++ +static const struct rsnd_of_data rsnd_of_data_gen2 = {
.flags = RSND_GEN2,
};
--- -static struct of_device_id rsnd_of_match[] = {
+++ +static const struct of_device_id rsnd_of_match[] = {
{ .compatible = "renesas,rcar_sound-gen1", .data = &rsnd_of_data_gen1 },
{ .compatible = "renesas,rcar_sound-gen2", .data = &rsnd_of_data_gen2 },
{},
return mod->ops->name;
}
--- -char *rsnd_mod_dma_name(struct rsnd_mod *mod)
+++ +struct dma_chan *rsnd_mod_dma_req(struct rsnd_mod *mod)
{
--- - if (!mod || !mod->ops)
--- - return "unknown";
--- -
--- - if (!mod->ops->dma_name)
--- - return mod->ops->name;
+++ + if (!mod || !mod->ops || !mod->ops->dma_req)
+++ + return NULL;
--- - return mod->ops->dma_name(mod);
+++ + return mod->ops->dma_req(mod);
}
- void rsnd_mod_init(struct rsnd_priv *priv,
- struct rsnd_mod *mod,
- -void rsnd_mod_init(struct rsnd_mod *mod,
++ +int rsnd_mod_init(struct rsnd_mod *mod,
struct rsnd_mod_ops *ops,
+ struct clk *clk,
enum rsnd_mod_type type,
int id)
{
- mod->priv = priv;
++ + int ret = clk_prepare(clk);
++ +
++ + if (ret)
++ + return ret;
++ +
mod->id = id;
mod->ops = ops;
mod->type = type;
- }
-
- /*
- * rsnd_dma functions
- */
- void rsnd_dma_stop(struct rsnd_dma *dma)
- {
- dmaengine_terminate_all(dma->chan);
- }
-
- static void rsnd_dma_complete(void *data)
- {
- struct rsnd_dma *dma = (struct rsnd_dma *)data;
- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
-
- /*
- * Renesas sound Gen1 needs 1 DMAC,
- * Gen2 needs 2 DMAC.
- * In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
- * But, Audio-DMAC-peri-peri doesn't have interrupt,
- * and this driver is assuming that here.
- *
- * If Audio-DMAC-peri-peri has interrpt,
- * rsnd_dai_pointer_update() will be called twice,
- * ant it will breaks io->byte_pos
- */
-
- rsnd_dai_pointer_update(io, io->byte_per_period);
- }
-
- void rsnd_dma_start(struct rsnd_dma *dma)
- {
- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
- struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
- struct snd_pcm_substream *substream = io->substream;
- struct device *dev = rsnd_priv_to_dev(priv);
- struct dma_async_tx_descriptor *desc;
-
- desc = dmaengine_prep_dma_cyclic(dma->chan,
- (dma->addr) ? dma->addr :
- substream->runtime->dma_addr,
- snd_pcm_lib_buffer_bytes(substream),
- snd_pcm_lib_period_bytes(substream),
- dma->dir,
- DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
-
- if (!desc) {
- dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
- return;
- }
-
- desc->callback = rsnd_dma_complete;
- desc->callback_param = dma;
-
- if (dmaengine_submit(desc) < 0) {
- dev_err(dev, "dmaengine_submit() fail\n");
- return;
- }
-
- dma_async_issue_pending(dma->chan);
- }
-
- int rsnd_dma_available(struct rsnd_dma *dma)
- {
- return !!dma->chan;
- }
-
- #define DMA_NAME_SIZE 16
- #define MOD_MAX 4 /* MEM/SSI/SRC/DVC */
- static int _rsnd_dma_of_name(char *dma_name, struct rsnd_mod *mod)
- {
- if (mod)
- return snprintf(dma_name, DMA_NAME_SIZE / 2, "%s%d",
- rsnd_mod_dma_name(mod), rsnd_mod_id(mod));
- else
- return snprintf(dma_name, DMA_NAME_SIZE / 2, "mem");
-
- }
-
- static void rsnd_dma_of_name(struct rsnd_mod *mod_from,
- struct rsnd_mod *mod_to,
- char *dma_name)
- {
- int index = 0;
-
- index = _rsnd_dma_of_name(dma_name + index, mod_from);
- *(dma_name + index++) = '_';
- index = _rsnd_dma_of_name(dma_name + index, mod_to);
- }
-
- static void rsnd_dma_of_path(struct rsnd_dma *dma,
- int is_play,
- struct rsnd_mod **mod_from,
- struct rsnd_mod **mod_to)
- {
- struct rsnd_mod *this = rsnd_dma_to_mod(dma);
- struct rsnd_dai_stream *io = rsnd_mod_to_io(this);
- struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
- struct rsnd_mod *src = rsnd_io_to_mod_src(io);
- struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
- struct rsnd_mod *mod[MOD_MAX];
- int i, index;
-
-
- for (i = 0; i < MOD_MAX; i++)
- mod[i] = NULL;
-
- /*
- * in play case...
- *
- * src -> dst
- *
- * mem -> SSI
- * mem -> SRC -> SSI
- * mem -> SRC -> DVC -> SSI
- */
- mod[0] = NULL; /* for "mem" */
- index = 1;
- for (i = 1; i < MOD_MAX; i++) {
- if (!src) {
- mod[i] = ssi;
- } else if (!dvc) {
- mod[i] = src;
- src = NULL;
- } else {
- if ((!is_play) && (this == src))
- this = dvc;
-
- mod[i] = (is_play) ? src : dvc;
- i++;
- mod[i] = (is_play) ? dvc : src;
- src = NULL;
- dvc = NULL;
- }
-
- if (mod[i] == this)
- index = i;
-
- if (mod[i] == ssi)
- break;
- }
+ mod->clk = clk;
- -}
- -
- -/*
- - * rsnd_dma functions
- - */
- -void rsnd_dma_stop(struct rsnd_dma *dma)
- -{
- - dmaengine_terminate_all(dma->chan);
- -}
- -
- -static void rsnd_dma_complete(void *data)
- -{
- - struct rsnd_dma *dma = (struct rsnd_dma *)data;
- - struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
- - struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
- -
- - /*
- - * Renesas sound Gen1 needs 1 DMAC,
- - * Gen2 needs 2 DMAC.
- - * In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
- - * But, Audio-DMAC-peri-peri doesn't have interrupt,
- - * and this driver is assuming that here.
- - *
- - * If Audio-DMAC-peri-peri has interrpt,
- - * rsnd_dai_pointer_update() will be called twice,
- - * ant it will breaks io->byte_pos
- - */
- -
- - rsnd_dai_pointer_update(io, io->byte_per_period);
- -}
- -
- -void rsnd_dma_start(struct rsnd_dma *dma)
- -{
- - struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
- - struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
- - struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
- - struct snd_pcm_substream *substream = io->substream;
- - struct device *dev = rsnd_priv_to_dev(priv);
- - struct dma_async_tx_descriptor *desc;
- -
- - desc = dmaengine_prep_dma_cyclic(dma->chan,
- - (dma->addr) ? dma->addr :
- - substream->runtime->dma_addr,
- - snd_pcm_lib_buffer_bytes(substream),
- - snd_pcm_lib_period_bytes(substream),
- - dma->dir,
- - DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
- -
- - if (!desc) {
- - dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
- - return;
- - }
- -
- - desc->callback = rsnd_dma_complete;
- - desc->callback_param = dma;
- -
- - if (dmaengine_submit(desc) < 0) {
- - dev_err(dev, "dmaengine_submit() fail\n");
- - return;
- - }
- -
- - dma_async_issue_pending(dma->chan);
- -}
- -
- -int rsnd_dma_available(struct rsnd_dma *dma)
- -{
- - return !!dma->chan;
- -}
- -
- -#define DMA_NAME_SIZE 16
- -#define MOD_MAX 4 /* MEM/SSI/SRC/DVC */
- -static int _rsnd_dma_of_name(char *dma_name, struct rsnd_mod *mod)
- -{
- - if (mod)
- - return snprintf(dma_name, DMA_NAME_SIZE / 2, "%s%d",
- - rsnd_mod_dma_name(mod), rsnd_mod_id(mod));
- - else
- - return snprintf(dma_name, DMA_NAME_SIZE / 2, "mem");
- -
- -}
- -
- -static void rsnd_dma_of_name(struct rsnd_mod *mod_from,
- - struct rsnd_mod *mod_to,
- - char *dma_name)
- -{
- - int index = 0;
- -
- - index = _rsnd_dma_of_name(dma_name + index, mod_from);
- - *(dma_name + index++) = '_';
- - index = _rsnd_dma_of_name(dma_name + index, mod_to);
- -}
- -
- -static void rsnd_dma_of_path(struct rsnd_dma *dma,
- - int is_play,
- - struct rsnd_mod **mod_from,
- - struct rsnd_mod **mod_to)
- -{
- - struct rsnd_mod *this = rsnd_dma_to_mod(dma);
- - struct rsnd_dai_stream *io = rsnd_mod_to_io(this);
- - struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
- - struct rsnd_mod *src = rsnd_io_to_mod_src(io);
- - struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
- - struct rsnd_mod *mod[MOD_MAX];
- - int i, index;
- -
- -
- - for (i = 0; i < MOD_MAX; i++)
- - mod[i] = NULL;
- - /*
- - * in play case...
- - *
- - * src -> dst
- - *
- - * mem -> SSI
- - * mem -> SRC -> SSI
- - * mem -> SRC -> DVC -> SSI
- - */
- - mod[0] = NULL; /* for "mem" */
- - index = 1;
- - for (i = 1; i < MOD_MAX; i++) {
- - if (!src) {
- - mod[i] = ssi;
- - } else if (!dvc) {
- - mod[i] = src;
- - src = NULL;
- - } else {
- - if ((!is_play) && (this == src))
- - this = dvc;
- -
- - mod[i] = (is_play) ? src : dvc;
- - i++;
- - mod[i] = (is_play) ? dvc : src;
- - src = NULL;
- - dvc = NULL;
- - }
- -
- - if (mod[i] == this)
- - index = i;
- -
- - if (mod[i] == ssi)
- - break;
- - }
- -
-- - if (is_play) {
-- - *mod_from = mod[index - 1];
-- - *mod_to = mod[index];
-- - } else {
-- - *mod_from = mod[index];
-- - *mod_to = mod[index - 1];
-- - }
-- -}
-- -
-- -int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma,
-- - int is_play, int id)
-- -{
-- - struct device *dev = rsnd_priv_to_dev(priv);
-- - struct dma_slave_config cfg;
-- - struct rsnd_mod *mod_from;
-- - struct rsnd_mod *mod_to;
-- - char dma_name[DMA_NAME_SIZE];
-- - dma_cap_mask_t mask;
-- - int ret;
-- -
-- - if (dma->chan) {
-- - dev_err(dev, "it already has dma channel\n");
-- - return -EIO;
-- - }
-- -
-- - dma_cap_zero(mask);
-- - dma_cap_set(DMA_SLAVE, mask);
-- -
-- - rsnd_dma_of_path(dma, is_play, &mod_from, &mod_to);
-- - rsnd_dma_of_name(mod_from, mod_to, dma_name);
-- -
-- - cfg.slave_id = id;
-- - cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
-- - cfg.src_addr = rsnd_gen_dma_addr(priv, mod_from, is_play, 1);
-- - cfg.dst_addr = rsnd_gen_dma_addr(priv, mod_to, is_play, 0);
-- - cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-- - cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-- -
-- - dev_dbg(dev, "dma : %s %pad -> %pad\n",
-- - dma_name, &cfg.src_addr, &cfg.dst_addr);
-- -
-- - dma->chan = dma_request_slave_channel_compat(mask, shdma_chan_filter,
-- - (void *)id, dev,
-- - dma_name);
-- - if (!dma->chan) {
-- - dev_err(dev, "can't get dma channel\n");
-- - goto rsnd_dma_channel_err;
-- - }
-- -
-- - ret = dmaengine_slave_config(dma->chan, &cfg);
-- - if (ret < 0)
-- - goto rsnd_dma_init_err;
-- -
-- - dma->addr = is_play ? cfg.src_addr : cfg.dst_addr;
-- - dma->dir = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
-- -
-- - return 0;
-- -
-- -rsnd_dma_init_err:
-- - rsnd_dma_quit(priv, dma);
-- -rsnd_dma_channel_err:
-- -
-- - /*
-- - * DMA failed. try to PIO mode
-- - * see
-- - * rsnd_ssi_fallback()
-- - * rsnd_rdai_continuance_probe()
-- - */
-- - return -EAGAIN;
++ + return ret;
}
-- -void rsnd_dma_quit(struct rsnd_priv *priv,
-- - struct rsnd_dma *dma)
++ +void rsnd_mod_quit(struct rsnd_mod *mod)
{
-- - if (dma->chan)
-- - dma_release_channel(dma->chan);
-- -
-- - dma->chan = NULL;
++ + if (mod->clk)
++ + clk_unprepare(mod->clk);
}
- /*
- * rsnd_dma functions
- */
- void rsnd_dma_stop(struct rsnd_dma *dma)
- {
- dmaengine_terminate_all(dma->chan);
- }
-
- static void rsnd_dma_complete(void *data)
- {
- struct rsnd_dma *dma = (struct rsnd_dma *)data;
- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
-
- /*
- * Renesas sound Gen1 needs 1 DMAC,
- * Gen2 needs 2 DMAC.
- * In Gen2 case, it are Audio-DMAC, and Audio-DMAC-peri-peri.
- * But, Audio-DMAC-peri-peri doesn't have interrupt,
- * and this driver is assuming that here.
- *
- * If Audio-DMAC-peri-peri has interrpt,
- * rsnd_dai_pointer_update() will be called twice,
- * ant it will breaks io->byte_pos
- */
-
- rsnd_dai_pointer_update(io, io->byte_per_period);
- }
-
- void rsnd_dma_start(struct rsnd_dma *dma)
- {
- struct rsnd_mod *mod = rsnd_dma_to_mod(dma);
- struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
- struct rsnd_dai_stream *io = rsnd_mod_to_io(mod);
- struct snd_pcm_substream *substream = io->substream;
- struct device *dev = rsnd_priv_to_dev(priv);
- struct dma_async_tx_descriptor *desc;
-
- desc = dmaengine_prep_dma_cyclic(dma->chan,
- (dma->addr) ? dma->addr :
- substream->runtime->dma_addr,
- snd_pcm_lib_buffer_bytes(substream),
- snd_pcm_lib_period_bytes(substream),
- dma->dir,
- DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
-
- if (!desc) {
- dev_err(dev, "dmaengine_prep_slave_sg() fail\n");
- return;
- }
-
- desc->callback = rsnd_dma_complete;
- desc->callback_param = dma;
-
- if (dmaengine_submit(desc) < 0) {
- dev_err(dev, "dmaengine_submit() fail\n");
- return;
- }
-
- dma_async_issue_pending(dma->chan);
- }
-
- int rsnd_dma_available(struct rsnd_dma *dma)
- {
- return !!dma->chan;
- }
-
- #define DMA_NAME_SIZE 16
- #define MOD_MAX 4 /* MEM/SSI/SRC/DVC */
- static int _rsnd_dma_of_name(char *dma_name, struct rsnd_mod *mod)
- {
- if (mod)
- return snprintf(dma_name, DMA_NAME_SIZE / 2, "%s%d",
- rsnd_mod_dma_name(mod), rsnd_mod_id(mod));
- else
- return snprintf(dma_name, DMA_NAME_SIZE / 2, "mem");
-
- }
-
- static void rsnd_dma_of_name(struct rsnd_mod *mod_from,
- struct rsnd_mod *mod_to,
- char *dma_name)
- {
- int index = 0;
-
- index = _rsnd_dma_of_name(dma_name + index, mod_from);
- *(dma_name + index++) = '_';
- index = _rsnd_dma_of_name(dma_name + index, mod_to);
- }
-
- static void rsnd_dma_of_path(struct rsnd_dma *dma,
- int is_play,
- struct rsnd_mod **mod_from,
- struct rsnd_mod **mod_to)
- {
- struct rsnd_mod *this = rsnd_dma_to_mod(dma);
- struct rsnd_dai_stream *io = rsnd_mod_to_io(this);
- struct rsnd_mod *ssi = rsnd_io_to_mod_ssi(io);
- struct rsnd_mod *src = rsnd_io_to_mod_src(io);
- struct rsnd_mod *dvc = rsnd_io_to_mod_dvc(io);
- struct rsnd_mod *mod[MOD_MAX];
- int i, index;
-
-
- for (i = 0; i < MOD_MAX; i++)
- mod[i] = NULL;
-
- /*
- * in play case...
- *
- * src -> dst
- *
- * mem -> SSI
- * mem -> SRC -> SSI
- * mem -> SRC -> DVC -> SSI
- */
- mod[0] = NULL; /* for "mem" */
- index = 1;
- for (i = 1; i < MOD_MAX; i++) {
- if (!src) {
- mod[i] = ssi;
- } else if (!dvc) {
- mod[i] = src;
- src = NULL;
- } else {
- if ((!is_play) && (this == src))
- this = dvc;
-
- mod[i] = (is_play) ? src : dvc;
- i++;
- mod[i] = (is_play) ? dvc : src;
- src = NULL;
- dvc = NULL;
- }
-
- if (mod[i] == this)
- index = i;
-
- if (mod[i] == ssi)
- break;
- }
-
- if (is_play) {
- *mod_from = mod[index - 1];
- *mod_to = mod[index];
- } else {
- *mod_from = mod[index];
- *mod_to = mod[index - 1];
- }
- }
-
- int rsnd_dma_init(struct rsnd_priv *priv, struct rsnd_dma *dma,
- int is_play, int id)
- {
- struct device *dev = rsnd_priv_to_dev(priv);
- struct dma_slave_config cfg;
- struct rsnd_mod *mod_from;
- struct rsnd_mod *mod_to;
- char dma_name[DMA_NAME_SIZE];
- dma_cap_mask_t mask;
- int ret;
-
- if (dma->chan) {
- dev_err(dev, "it already has dma channel\n");
- return -EIO;
- }
-
- dma_cap_zero(mask);
- dma_cap_set(DMA_SLAVE, mask);
-
- rsnd_dma_of_path(dma, is_play, &mod_from, &mod_to);
- rsnd_dma_of_name(mod_from, mod_to, dma_name);
-
- cfg.slave_id = id;
- cfg.direction = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
- cfg.src_addr = rsnd_gen_dma_addr(priv, mod_from, is_play, 1);
- cfg.dst_addr = rsnd_gen_dma_addr(priv, mod_to, is_play, 0);
- cfg.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
- cfg.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES;
-
- dev_dbg(dev, "dma : %s %pad -> %pad\n",
- dma_name, &cfg.src_addr, &cfg.dst_addr);
-
- dma->chan = dma_request_slave_channel_compat(mask, shdma_chan_filter,
- (void *)id, dev,
- dma_name);
- if (!dma->chan) {
- dev_err(dev, "can't get dma channel\n");
- goto rsnd_dma_channel_err;
- }
-
- ret = dmaengine_slave_config(dma->chan, &cfg);
- if (ret < 0)
- goto rsnd_dma_init_err;
-
- dma->addr = is_play ? cfg.src_addr : cfg.dst_addr;
- dma->dir = is_play ? DMA_MEM_TO_DEV : DMA_DEV_TO_MEM;
-
- return 0;
-
- rsnd_dma_init_err:
- rsnd_dma_quit(priv, dma);
- rsnd_dma_channel_err:
-
- /*
- * DMA failed. try to PIO mode
- * see
- * rsnd_ssi_fallback()
- * rsnd_rdai_continuance_probe()
- */
- return -EAGAIN;
- }
-
- void rsnd_dma_quit(struct rsnd_priv *priv,
- struct rsnd_dma *dma)
- {
- if (dma->chan)
- dma_release_channel(dma->chan);
-
- dma->chan = NULL;
- }
-
/*
* settting function
*/
/*
* rsnd_dai functions
*/
- #define __rsnd_mod_call(mod, func, rdai...) \
+ #define __rsnd_mod_call(mod, func, param...) \
({ \
struct rsnd_priv *priv = rsnd_mod_to_priv(mod); \
struct device *dev = rsnd_priv_to_dev(priv); \
--- - u32 mask = 1 << __rsnd_mod_shift_##func; \
+++ + u32 mask = (1 << __rsnd_mod_shift_##func) & ~(1 << 31); \
u32 call = __rsnd_mod_call_##func << __rsnd_mod_shift_##func; \
int ret = 0; \
if ((mod->status & mask) == call) { \
dev_dbg(dev, "%s[%d] %s\n", \
rsnd_mod_name(mod), rsnd_mod_id(mod), #func); \
- ret = (mod)->ops->func(mod, rdai); \
+ ret = (mod)->ops->func(mod, param); \
mod->status = (mod->status & ~mask) | (~call & mask); \
} \
ret; \
})
- #define rsnd_mod_call(mod, func, rdai...) \
+ #define rsnd_mod_call(mod, func, param...) \
(!(mod) ? -ENODEV : \
!((mod)->ops->func) ? 0 : \
- __rsnd_mod_call(mod, func, rdai))
+ __rsnd_mod_call(mod, func, param))
- #define rsnd_dai_call(fn, io, rdai...) \
+ #define rsnd_dai_call(fn, io, param...) \
({ \
struct rsnd_mod *mod; \
int ret = 0, i; \
mod = (io)->mod[i]; \
if (!mod) \
continue; \
- ret = rsnd_mod_call(mod, fn, rdai); \
+ ret = rsnd_mod_call(mod, fn, param); \
if (ret < 0) \
break; \
} \
struct rsnd_priv *priv = rsnd_mod_to_priv(mod);
struct device *dev = rsnd_priv_to_dev(priv);
--- - dev_err(dev, "%s%d is not empty\n",
+++ + dev_err(dev, "%s[%d] is not empty\n",
rsnd_mod_name(mod),
rsnd_mod_id(mod));
return -EIO;
io->mod[mod->type] = NULL;
}
- int rsnd_dai_id(struct rsnd_priv *priv, struct rsnd_dai *rdai)
- {
- int id = rdai - priv->rdai;
-
- if ((id < 0) || (id >= rsnd_rdai_nr(priv)))
- return -EINVAL;
-
- return id;
- }
-
- struct rsnd_dai *rsnd_dai_get(struct rsnd_priv *priv, int id)
+ struct rsnd_dai *rsnd_rdai_get(struct rsnd_priv *priv, int id)
{
if ((id < 0) || (id >= rsnd_rdai_nr(priv)))
return NULL;
{
struct rsnd_priv *priv = snd_soc_dai_get_drvdata(dai);
- return rsnd_dai_get(priv, dai->id);
- }
-
- int rsnd_dai_is_play(struct rsnd_dai *rdai, struct rsnd_dai_stream *io)
- {
- return &rdai->playback == io;
+ return rsnd_rdai_get(priv, dai->id);
}
/*
if (ret < 0)
goto dai_trigger_end;
- ret = rsnd_dai_call(init, io, rdai);
+ ret = rsnd_dai_call(init, io, priv);
if (ret < 0)
goto dai_trigger_end;
- ret = rsnd_dai_call(start, io, rdai);
+ ret = rsnd_dai_call(start, io, priv);
if (ret < 0)
goto dai_trigger_end;
break;
case SNDRV_PCM_TRIGGER_STOP:
- ret = rsnd_dai_call(stop, io, rdai);
+ ret = rsnd_dai_call(stop, io, priv);
if (ret < 0)
goto dai_trigger_end;
- ret = rsnd_dai_call(quit, io, rdai);
+ ret = rsnd_dai_call(quit, io, priv);
if (ret < 0)
goto dai_trigger_end;
priv->rdai = rdai;
for (i = 0; i < dai_nr; i++) {
- rdai[i].info = &info->dai_info[i];
- pmod = rdai[i].info->playback.ssi;
- cmod = rdai[i].info->capture.ssi;
+ pmod = info->dai_info[i].playback.ssi;
+ cmod = info->dai_info[i].capture.ssi;
/*
* init rsnd_dai
*/
snprintf(rdai[i].name, RSND_DAI_NAME_SIZE, "rsnd-dai.%d", i);
+ rdai[i].priv = priv;
/*
* init snd_soc_dai_driver
drv[i].name = rdai[i].name;
drv[i].ops = &rsnd_soc_dai_ops;
if (pmod) {
+++ + snprintf(rdai[i].playback.name, RSND_DAI_NAME_SIZE,
+++ + "DAI%d Playback", i);
+++ +
drv[i].playback.rates = RSND_RATES;
drv[i].playback.formats = RSND_FMTS;
drv[i].playback.channels_min = 2;
drv[i].playback.channels_max = 2;
+++ + drv[i].playback.stream_name = rdai[i].playback.name;
rdai[i].playback.info = &info->dai_info[i].playback;
+ rdai[i].playback.rdai = rdai + i;
rsnd_path_init(priv, &rdai[i], &rdai[i].playback);
}
if (cmod) {
+++ + snprintf(rdai[i].capture.name, RSND_DAI_NAME_SIZE,
+++ + "DAI%d Capture", i);
+++ +
drv[i].capture.rates = RSND_RATES;
drv[i].capture.formats = RSND_FMTS;
drv[i].capture.channels_min = 2;
drv[i].capture.channels_max = 2;
+++ + drv[i].capture.stream_name = rdai[i].capture.name;
rdai[i].capture.info = &info->dai_info[i].capture;
+ rdai[i].capture.rdai = rdai + i;
rsnd_path_init(priv, &rdai[i], &rdai[i].capture);
}
static int rsnd_hw_params(struct snd_pcm_substream *substream,
struct snd_pcm_hw_params *hw_params)
{
+++ + struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
+++ + struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
+++ + struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
+++ + int ret;
+++ +
+++ + ret = rsnd_dai_call(hw_params, io, substream, hw_params);
+++ + if (ret)
+++ + return ret;
+++ +
return snd_pcm_lib_malloc_pages(substream,
params_buffer_bytes(hw_params));
}
}
static int __rsnd_kctrl_new(struct rsnd_mod *mod,
- struct rsnd_dai *rdai,
struct snd_soc_pcm_runtime *rtd,
const unsigned char *name,
struct rsnd_kctrl_cfg *cfg,
return -ENOMEM;
ret = snd_ctl_add(card, kctrl);
- if (ret < 0)
+ if (ret < 0) {
+ snd_ctl_free_one(kctrl);
return ret;
+ }
cfg->update = update;
+ cfg->card = card;
+ cfg->kctrl = kctrl;
return 0;
}
+ void _rsnd_kctrl_remove(struct rsnd_kctrl_cfg *cfg)
+ {
+ snd_ctl_remove(cfg->card, cfg->kctrl);
+ }
+
int rsnd_kctrl_new_m(struct rsnd_mod *mod,
- struct rsnd_dai *rdai,
struct snd_soc_pcm_runtime *rtd,
const unsigned char *name,
void (*update)(struct rsnd_mod *mod),
_cfg->cfg.max = max;
_cfg->cfg.size = RSND_DVC_CHANNELS;
_cfg->cfg.val = _cfg->val;
- return __rsnd_kctrl_new(mod, rdai, rtd, name, &_cfg->cfg, update);
+ return __rsnd_kctrl_new(mod, rtd, name, &_cfg->cfg, update);
}
int rsnd_kctrl_new_s(struct rsnd_mod *mod,
- struct rsnd_dai *rdai,
struct snd_soc_pcm_runtime *rtd,
const unsigned char *name,
void (*update)(struct rsnd_mod *mod),
_cfg->cfg.max = max;
_cfg->cfg.size = 1;
_cfg->cfg.val = &_cfg->val;
- return __rsnd_kctrl_new(mod, rdai, rtd, name, &_cfg->cfg, update);
+ return __rsnd_kctrl_new(mod, rtd, name, &_cfg->cfg, update);
}
int rsnd_kctrl_new_e(struct rsnd_mod *mod,
- struct rsnd_dai *rdai,
struct snd_soc_pcm_runtime *rtd,
const unsigned char *name,
struct rsnd_kctrl_cfg_s *_cfg,
_cfg->cfg.size = 1;
_cfg->cfg.val = &_cfg->val;
_cfg->cfg.texts = texts;
- return __rsnd_kctrl_new(mod, rdai, rtd, name, &_cfg->cfg, update);
+ return __rsnd_kctrl_new(mod, rtd, name, &_cfg->cfg, update);
}
/*
struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
int ret;
- ret = rsnd_dai_call(pcm_new, &rdai->playback, rdai, rtd);
+ ret = rsnd_dai_call(pcm_new, &rdai->playback, rtd);
if (ret)
return ret;
- ret = rsnd_dai_call(pcm_new, &rdai->capture, rdai, rtd);
+ ret = rsnd_dai_call(pcm_new, &rdai->capture, rtd);
if (ret)
return ret;
PREALLOC_BUFFER, PREALLOC_BUFFER_MAX);
}
- static void rsnd_pcm_free(struct snd_pcm *pcm)
- {
- snd_pcm_lib_preallocate_free_for_all(pcm);
- }
-
static struct snd_soc_platform_driver rsnd_soc_platform = {
.ops = &rsnd_pcm_ops,
.pcm_new = rsnd_pcm_new,
- .pcm_free = rsnd_pcm_free,
};
static const struct snd_soc_component_driver rsnd_soc_component = {
};
static int rsnd_rdai_continuance_probe(struct rsnd_priv *priv,
- struct rsnd_dai *rdai,
- int is_play)
+ struct rsnd_dai_stream *io)
{
- struct rsnd_dai_stream *io = is_play ? &rdai->playback : &rdai->capture;
int ret;
- ret = rsnd_dai_call(probe, io, rdai);
+ ret = rsnd_dai_call(probe, io, priv);
if (ret == -EAGAIN) {
/*
* Fallback to PIO mode
* rsnd_dma_init()
* rsnd_ssi_fallback()
*/
- rsnd_dai_call(remove, io, rdai);
+ rsnd_dai_call(remove, io, priv);
/*
* remove SRC/DVC from DAI,
/*
* fallback
*/
- rsnd_dai_call(fallback, io, rdai);
+ rsnd_dai_call(fallback, io, priv);
/*
* retry to "probe".
* DAI has SSI which is PIO mode only now.
*/
- ret = rsnd_dai_call(probe, io, rdai);
+ ret = rsnd_dai_call(probe, io, priv);
}
return ret;
const struct rsnd_of_data *of_data,
struct rsnd_priv *priv) = {
rsnd_gen_probe,
+++ + rsnd_dma_probe,
rsnd_ssi_probe,
rsnd_src_probe,
rsnd_dvc_probe,
}
for_each_rsnd_dai(rdai, priv, i) {
- ret = rsnd_rdai_continuance_probe(priv, rdai, 1);
+ ret = rsnd_rdai_continuance_probe(priv, &rdai->playback);
if (ret)
goto exit_snd_probe;
- ret = rsnd_rdai_continuance_probe(priv, rdai, 0);
+ ret = rsnd_rdai_continuance_probe(priv, &rdai->capture);
if (ret)
goto exit_snd_probe;
}
++++ dev_set_drvdata(dev, priv);
++++
/*
* asoc register
*/
goto exit_snd_soc;
}
---- dev_set_drvdata(dev, priv);
----
pm_runtime_enable(dev);
dev_info(dev, "probed\n");
snd_soc_unregister_platform(dev);
exit_snd_probe:
for_each_rsnd_dai(rdai, priv, i) {
- rsnd_dai_call(remove, &rdai->playback, rdai);
- rsnd_dai_call(remove, &rdai->capture, rdai);
+ rsnd_dai_call(remove, &rdai->playback, priv);
+ rsnd_dai_call(remove, &rdai->capture, priv);
}
return ret;
{
struct rsnd_priv *priv = dev_get_drvdata(&pdev->dev);
struct rsnd_dai *rdai;
++ + void (*remove_func[])(struct platform_device *pdev,
++ + struct rsnd_priv *priv) = {
++ + rsnd_ssi_remove,
++ + rsnd_src_remove,
++ + rsnd_dvc_remove,
++ + };
int ret = 0, i;
pm_runtime_disable(&pdev->dev);
for_each_rsnd_dai(rdai, priv, i) {
- ret |= rsnd_dai_call(remove, &rdai->playback, rdai);
- ret |= rsnd_dai_call(remove, &rdai->capture, rdai);
+ ret |= rsnd_dai_call(remove, &rdai->playback, priv);
+ ret |= rsnd_dai_call(remove, &rdai->capture, priv);
}
++ + for (i = 0; i < ARRAY_SIZE(remove_func); i++)
++ + remove_func[i](pdev, priv);
++ +
+ snd_soc_unregister_component(&pdev->dev);
+ snd_soc_unregister_platform(&pdev->dev);
+
return ret;
}