# SPDX-License-Identifier: GPL-2.0-only
config DRM_ROCKCHIP
	tristate "DRM Support for Rockchip"
	depends on DRM && ROCKCHIP_IOMMU
	select DRM_GEM_CMA_HELPER
	select DRM_KMS_HELPER
	select DRM_PANEL
	select VIDEOMODE_HELPERS
	select DRM_ANALOGIX_DP if ROCKCHIP_ANALOGIX_DP
	select DRM_DW_HDMI if ROCKCHIP_DW_HDMI
	select DRM_DW_MIPI_DSI if ROCKCHIP_DW_MIPI_DSI
	select DRM_RGB if ROCKCHIP_RGB
	select GENERIC_PHY if ROCKCHIP_DW_MIPI_DSI
	select GENERIC_PHY_MIPI_DPHY if ROCKCHIP_DW_MIPI_DSI
	select SND_SOC_HDMI_CODEC if ROCKCHIP_CDN_DP && SND_SOC
	help
	  Choose this option if you have a Rockchip soc chipset.
	  This driver provides kernel mode setting and buffer
	  management to userspace. This driver does not provide
	  2D or 3D acceleration; acceleration is performed by other
	  IP found on the SoC.

if DRM_ROCKCHIP

config ROCKCHIP_ANALOGIX_DP
	bool "Rockchip specific extensions for Analogix DP driver"
	help
	  This selects support for Rockchip SoC specific extensions
	  for the Analogix Core DP driver. If you want to enable DP
	  on RK3288 or RK3399 based SoC, you should select this option.

config ROCKCHIP_CDN_DP
	bool "Rockchip cdn DP"
	depends on EXTCON=y || (EXTCON=m && DRM_ROCKCHIP=m)
	help
	  This selects support for Rockchip SoC specific extensions
	  for the cdn DP driver. If you want to enable Dp on
	  RK3399 based SoC, you should select this
	  option.

config ROCKCHIP_DW_HDMI
	bool "Rockchip specific extensions for Synopsys DW HDMI"
	help
	  This selects support for Rockchip SoC specific extensions
	  for the Synopsys DesignWare HDMI driver. If you want to
	  enable HDMI on RK3288 or RK3399 based SoC, you should select
	  this option.

config ROCKCHIP_DW_MIPI_DSI
	bool "Rockchip specific extensions for Synopsys DW MIPI DSI"
	select GENERIC_PHY_MIPI_DPHY
	help
	  This selects support for Rockchip SoC specific extensions
	  for the Synopsys DesignWare dsi driver. If you want to
	  enable MIPI DSI on RK3288 or RK3399 based SoC, you should
	  select this option.

config ROCKCHIP_INNO_HDMI
	bool "Rockchip specific extensions for Innosilicon HDMI"
	help
	  This selects support for Rockchip SoC specific extensions
	  for the Innosilicon HDMI driver. If you want to enable
	  HDMI on RK3036 based SoC, you should select this option.

config ROCKCHIP_LVDS
	bool "Rockchip LVDS support"
	depends on DRM_ROCKCHIP
	depends on PINCTRL && OF
	help
	  Choose this option to enable support for Rockchip LVDS controllers.
	  Rockchip rk3288 SoC has LVDS TX Controller can be used, and it
	  support LVDS, rgb, dual LVDS output mode. say Y to enable its
	  driver.

config ROCKCHIP_RGB
	bool "Rockchip RGB support"
	depends on DRM_ROCKCHIP
	depends on PINCTRL
	help
	  Choose this option to enable support for Rockchip RGB output.
	  Some Rockchip CRTCs, like rv1108, can directly output parallel
	  and serial RGB format to panel or connect to a conversion chip.
	  say Y to enable its driver.

config ROCKCHIP_RK3066_HDMI
	bool "Rockchip specific extensions for RK3066 HDMI"
	depends on DRM_ROCKCHIP
	help
	  This selects support for Rockchip SoC specific extensions
	  for the RK3066 HDMI driver. If you want to enable
	  HDMI on RK3066 based SoC, you should select this option.
endif
