# 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)
	  - OMAP4
	  - 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_SELECT_VOICE_CODECS
	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

