# SPDX-License-Identifier: GPL-2.0-only
menu "Audio support for Texas Instruments SoCs"
depends on DMA_OMAP || TI_EDMA || TI_K3_UDMA || COMPILE_TEST

config SND_SOC_TI_EDMA_PCM
	tristate
	select SND_SOC_GENERIC_DMAENGINE_PCM

config SND_SOC_TI_SDMA_PCM
	tristate
	select SND_SOC_GENERIC_DMAENGINE_PCM

config SND_SOC_TI_UDMA_PCM
	tristate
	select SND_SOC_GENERIC_DMAENGINE_PCM

comment "Texas Instruments DAI support for:"
config SND_SOC_DAVINCI_ASP
	tristate "daVinci Audio Serial Port (ASP) or McBSP support"
	depends on ARCH_DAVINCI || COMPILE_TEST
	select SND_SOC_TI_EDMA_PCM
	help
	  Say Y or M here if you want audio support via daVinci ASP or McBSP.
	  The driver only implements the ASP support which is a subset of
	  daVinci McBSP (w/o the multichannel support).

config SND_SOC_DAVINCI_MCASP
	tristate "Multichannel Audio Serial Port (McASP) support"
	depends on COMMON_CLK
	select SND_SOC_TI_EDMA_PCM
	select SND_SOC_TI_SDMA_PCM
	select SND_SOC_TI_UDMA_PCM
	help
	  Say Y or M here if you want to have support for McASP IP found in
	  various Texas Instruments SoCs like:
	  - daVinci devices
	  - Sitara line of SoCs (AM335x, AM438x, etc)
	  - DRA7x devices
	  - Keystone devices
	  - K3 devices (am654, j721e)

config SND_SOC_DAVINCI_VCIF
	tristate "daVinci Voice Interface (VCIF) support"
	depends on ARCH_DAVINCI || COMPILE_TEST
	select SND_SOC_TI_EDMA_PCM
	help
	  Say Y or M here if you want audio support via daVinci VCIF.

config SND_SOC_OMAP_DMIC
	tristate "Digital Microphone Module (DMIC) support"
	depends on ARCH_OMAP4 || SOC_OMAP5 || COMPILE_TEST && COMMON_CLK
	select SND_SOC_TI_SDMA_PCM
	help
	  Say Y or M here if you want to have support for DMIC IP found in
	  OMAP4 and OMAP5.

config SND_SOC_OMAP_MCBSP
	tristate "Multichannel Buffered Serial Port (McBSP) support"
	depends on ARCH_OMAP || ARCH_OMAP1 || COMPILE_TEST && COMMON_CLK
	select SND_SOC_TI_SDMA_PCM
	help
	  Say Y or M here if you want to have support for McBSP IP found in
	  Texas Instruments OMAP1/2/3/4/5 SoCs.

config SND_SOC_OMAP_MCPDM
	tristate "Multichannel PDM Controller (McPDM) support"
	depends on ARCH_OMAP4 || SOC_OMAP5 || COMPILE_TEST
	select SND_SOC_TI_SDMA_PCM
	help
	  Say Y or M here if you want to have support for McPDM IP found in
	  OMAP4 and OMAP5.

comment "Audio support for boards with Texas Instruments SoCs"
config SND_SOC_NOKIA_N810
	tristate "SoC Audio support for Nokia N810"
	depends on MACH_NOKIA_N810 && I2C
	select SND_SOC_OMAP_MCBSP
	select SND_SOC_TLV320AIC3X
	help
	  Say Y or M if you want to add support for SoC audio on Nokia N810.

config SND_SOC_NOKIA_RX51
	tristate "SoC Audio support for Nokia RX-51"
	depends on ARCH_OMAP3 && I2C && GPIOLIB
	select SND_SOC_OMAP_MCBSP
	select SND_SOC_TLV320AIC3X
	select SND_SOC_TPA6130A2
	help
	  Say Y or M if you want to add support for SoC audio on Nokia RX-51
	  hardware. This is also known as Nokia N900 product.

config SND_SOC_OMAP3_PANDORA
	tristate "SoC Audio support for OMAP3 Pandora"
	depends on ARCH_OMAP3
	depends on TWL4030_CORE
	select SND_SOC_OMAP_MCBSP
	select SND_SOC_TWL4030
	help
	  Say Y or M if you want to add support for SoC audio on the OMAP3 Pandora.

config SND_SOC_OMAP3_TWL4030
	tristate "SoC Audio support for OMAP3 based boards with twl4030 codec"
	depends on ARCH_OMAP3 || COMPILE_TEST && COMMON_CLK
	depends on TWL4030_CORE
	select SND_SOC_OMAP_MCBSP
	select SND_SOC_TWL4030
	help
	  Say Y or M if you want to add support for SoC audio on OMAP3 based
	  boards using twl4030 as codec. This driver currently supports:
	  - Beagleboard or Devkit8000
	  - Gumstix Overo or CompuLab CM-T35/CM-T3730
	  - IGEP v2
	  - OMAP3EVM
	  - SDP3430
	  - Zoom2

config SND_SOC_OMAP_ABE_TWL6040
	tristate "SoC Audio support for OMAP boards using ABE and twl6040 codec"
	depends on TWL6040_CORE && COMMON_CLK
	depends on ARCH_OMAP4 || (SOC_OMAP5 && MFD_PALMAS) || COMPILE_TEST
	select SND_SOC_OMAP_DMIC
	select SND_SOC_OMAP_MCPDM
	select SND_SOC_TWL6040
	help
	  Say Y or M if you want to add support for SoC audio on OMAP boards
	  using ABE and twl6040 codec. This driver currently supports:
	  - SDP4430/Blaze boards
	  - PandaBoard (4430)
	  - PandaBoardES (4460)
	  - OMAP5 uEVM

config SND_SOC_OMAP_AMS_DELTA
	tristate "SoC Audio support for Amstrad E3 (Delta) videophone"
	depends on MACH_AMS_DELTA && TTY
	select SND_SOC_OMAP_MCBSP
	select SND_SOC_CX20442
	help
	  Say Y  or M if you want to add support  for SoC audio device
	  connected to a handset and a speakerphone found on Amstrad E3 (Delta)
	  videophone.

	  Note that in order to get those devices fully supported,  you have to
	  build  the kernel  with  standard  serial port  driver  included  and
	  configured for at least 4 ports.  Then, from userspace, you must load
	  a line discipline #19 on the modem (ttyS3) serial line.  The simplest
	  way to achieve this is to install util-linux-ng  and use the included
	  ldattach  utility.  This  can be  started  automatically  from  udev,
	  a simple rule like this one should do the trick (it does for me):
		ACTION=="add", KERNEL=="controlC0", \
				RUN+="/usr/sbin/ldattach 19 /dev/ttyS3"

config SND_SOC_OMAP_HDMI
	tristate "OMAP4/5 HDMI audio support"
	depends on OMAP4_DSS_HDMI || OMAP5_DSS_HDMI || COMPILE_TEST
	select SND_SOC_TI_SDMA_PCM
	help
	  For HDMI audio to work OMAPDSS HDMI support should be
	  enabled.
	  The hdmi audio driver implements cpu-dai component using the
	  callbacks provided by OMAPDSS and registers the component
	  under DSS HDMI device. Omap-pcm is registered for platform
	  component also under DSS HDMI device. Dummy codec is used as
	  as codec component. The hdmi audio driver implements also
	  the card and registers it under its own platform device.
	  The device for the driver is registered by OMAPDSS hdmi
	  driver.

config SND_SOC_OMAP_OSK5912
	tristate "SoC Audio support for omap osk5912"
	depends on MACH_OMAP_OSK && I2C
	select SND_SOC_OMAP_MCBSP
	select SND_SOC_TLV320AIC23_I2C
	help
	  Say Y or M if you want to add support for SoC audio on osk5912.

config SND_SOC_DAVINCI_EVM
	tristate "SoC Audio support for DaVinci EVMs"
	depends on ARCH_DAVINCI && I2C
	select SND_SOC_DAVINCI_ASP if MACH_DAVINCI_DM355_EVM
	select SND_SOC_DAVINCI_ASP if SND_SOC_DM365_AIC3X_CODEC
	select SND_SOC_DAVINCI_VCIF if SND_SOC_DM365_VOICE_CODEC
	select SND_SOC_DAVINCI_ASP if MACH_DAVINCI_EVM # DM6446
	select SND_SOC_DAVINCI_MCASP if MACH_DAVINCI_DM6467_EVM
	select SND_SOC_SPDIF if MACH_DAVINCI_DM6467_EVM
	select SND_SOC_DAVINCI_MCASP if MACH_DAVINCI_DA830_EVM
	select SND_SOC_DAVINCI_MCASP if MACH_DAVINCI_DA850_EVM
	select SND_SOC_TLV320AIC3X
	help
	  Say Y if you want to add support for SoC audio on the following TI
	  DaVinci EVM platforms:
	  - DM355
	  - DM365
	  - DM6446
	  - DM6447
	  - DM830
	  - DM850

choice
	prompt "DM365 codec select"
	depends on SND_SOC_DAVINCI_EVM
	depends on MACH_DAVINCI_DM365_EVM

config SND_SOC_DM365_AIC3X_CODEC
	bool "Audio Codec - AIC3101"
	help
	  Say Y if you want to add support for AIC3101 audio codec

config SND_SOC_DM365_VOICE_CODEC
	bool "Voice Codec - CQ93VC"
	help
	  Say Y if you want to add support for SoC On-chip voice codec
endchoice

config SND_SOC_DM365_VOICE_CODEC_MODULE
	def_tristate y
	depends on SND_SOC_DM365_VOICE_CODEC && SND_SOC
	select MFD_DAVINCI_VOICECODEC
	select SND_SOC_CQ0093VC
	help
	  The is an internal symbol needed to ensure that the codec
	  and MFD driver can be built as loadable modules if necessary.

config SND_SOC_J721E_EVM
	tristate "SoC Audio support for j721e EVM"
	depends on ARCH_K3 || COMPILE_TEST && COMMON_CLK
	depends on I2C
	select SND_SOC_PCM3168A_I2C
	select SND_SOC_DAVINCI_MCASP
	help
	  Say Y if you want to add support for SoC audio on j721e Common
	  Processor Board and Infotainment expansion board.
endmenu

