# SPDX-License-Identifier: GPL-2.0
#
# Makefile for the input core drivers.
#

# Each configuration option enables a list of files.

obj-$(CONFIG_SERIO)		+= serio.o
obj-$(CONFIG_SERIO_PARKBD)	+= parkbd.o
obj-$(CONFIG_SERIO_CT82C710)	+= ct82c710.o
obj-$(CONFIG_SERIO_RPCKBD)	+= rpckbd.o
obj-$(CONFIG_SERIO_SA1111)	+= sa1111ps2.o
obj-$(CONFIG_SERIO_Q40KBD)	+= q40kbd.o
obj-$(CONFIG_SERIO_GSCPS2)	+= gscps2.o
obj-$(CONFIG_HP_SDC)		+= hp_sdc.o
obj-$(CONFIG_HIL_MLC)		+= hp_sdc_mlc.o hil_mlc.o
obj-$(CONFIG_SERIO_MACEPS2)	+= maceps2.o
obj-$(CONFIG_SERIO_SGI_IOC3)	+= ioc3kbd.o
obj-$(CONFIG_SERIO_LIBPS2)	+= libps2.o
obj-$(CONFIG_SERIO_AMS_DELTA)	+= ams_delta_serio.o
obj-$(CONFIG_SERIO_XILINX_XPS_PS2)	+= xilinx_ps2.o
obj-$(CONFIG_HYPERV_KEYBOARD)	+= hyperv-keyboard.o

# Rust 驱动配置：按驱动分别链接 Rust .o，避免 depmod 循环依赖 (arc_ps2 <-> serio_raw <-> altera_ps2)
ifdef CONFIG_RUST_DRIVERS
  RUST_DRV := input/serio
  include $(srctree)/drivers/rust/templates/kbuild-rust-driver.mk

  # 每个驱动单独构建 Rust 对象（CARGO_FEATURES=驱动名），只引用该驱动的 C 符号
  # Build into a temporary file first and use cmp to avoid unnecessary timestamp
  # updates that cascade into vmlinux re-link via CONFIG_DEBUG_INFO_BTF_MODULES.
  define rust_serio_one
$(obj)/rust/serio_$(1)_rust.o: FORCE
	$$(Q)mkdir -p $$(dir $$@)
	$$(Q)OBJTREE=$$(abspath $$(objtree)) OBJ=$$(abspath $$(obj)) OUTPUT_FILE=$$(abspath $$@).__rust_tmp CARGO_FEATURES=$(1) CROSS_COMPILE="$$(CROSS_COMPILE)" $$(RUST_BUILD_SH)
	$$(Q)if [ ! -f $$@ ] || ! cmp -s $$@.__rust_tmp $$@; then \
		mv $$@.__rust_tmp $$@; \
	else \
		rm -f $$@.__rust_tmp; \
	fi
	$$(Q)echo 'savedcmd_$$@ := rust-build $$(RUST_BUILD_SH)' > $$(dir $$@).$$(notdir $$@).cmd
OBJECT_FILES_NON_STANDARD_serio_$(1)_rust.o := y
endef
  $(foreach _d,serport arc_ps2 apbps2 phytium_ps2 altera_ps2 ps2_gpio ps2mult pcips2 sun4i_ps2 olpc_apsp serio_raw ambakmi userio i8042,$(eval $(call rust_serio_one,$(_d))))

  obj-$(CONFIG_SERIO_SERPORT) += serport-drv.o
  serport-drv-y := serport.o rust/serio_serport_rust.o

  obj-$(CONFIG_SERIO_ARC_PS2) += arc_ps2-drv.o
  arc_ps2-drv-y := arc_ps2.o rust/serio_arc_ps2_rust.o

  obj-$(CONFIG_SERIO_APBPS2) += apbps2-drv.o
  apbps2-drv-y := apbps2.o rust/serio_apbps2_rust.o

  obj-$(CONFIG_SERIO_PHYTIUM_PS2) += phytium-ps2-drv.o
  phytium-ps2-drv-y := phytium-ps2.o rust/serio_phytium_ps2_rust.o

  obj-$(CONFIG_SERIO_ALTERA_PS2) += altera_ps2-drv.o
  altera_ps2-drv-y := altera_ps2.o rust/serio_altera_ps2_rust.o

  obj-$(CONFIG_SERIO_GPIO_PS2) += ps2-gpio-drv.o
  ps2-gpio-drv-y := ps2-gpio.o rust/serio_ps2_gpio_rust.o

  obj-$(CONFIG_SERIO_PS2MULT) += ps2mult-drv.o
  ps2mult-drv-y := ps2mult.o rust/serio_ps2mult_rust.o

  obj-$(CONFIG_SERIO_PCIPS2) += pcips2-drv.o
  pcips2-drv-y := pcips2.o rust/serio_pcips2_rust.o

  obj-$(CONFIG_SERIO_SUN4I_PS2) += sun4i-ps2-drv.o
  sun4i-ps2-drv-y := sun4i-ps2.o rust/serio_sun4i_ps2_rust.o

  obj-$(CONFIG_SERIO_OLPC_APSP) += olpc-apsp-drv.o
  olpc-apsp-drv-y := olpc_apsp.o rust/serio_olpc_apsp_rust.o

  obj-$(CONFIG_SERIO_RAW) += serio_raw-drv.o
  serio_raw-drv-y := serio_raw.o rust/serio_serio_raw_rust.o

  obj-$(CONFIG_SERIO_AMBAKMI) += ambakmi-drv.o
  ambakmi-drv-y := ambakmi.o rust/serio_ambakmi_rust.o

  obj-$(CONFIG_USERIO) += userio-drv.o
  userio-drv-y := userio.o rust/serio_userio_rust.o

  obj-$(CONFIG_SERIO_I8042) += i8042-drv.o
  i8042-drv-y := i8042.o rust/serio_i8042_rust.o
else
  # 纯 C 模式：直接编译 C 文件
  obj-$(CONFIG_SERIO_SERPORT) += serport.o
  obj-$(CONFIG_SERIO_ARC_PS2) += arc_ps2.o
  obj-$(CONFIG_SERIO_APBPS2) += apbps2.o
  obj-$(CONFIG_SERIO_PHYTIUM_PS2) += phytium-ps2.o
  obj-$(CONFIG_SERIO_ALTERA_PS2) += altera_ps2.o
  obj-$(CONFIG_SERIO_GPIO_PS2) += ps2-gpio.o
  obj-$(CONFIG_SERIO_PS2MULT) += ps2mult.o
  obj-$(CONFIG_SERIO_PCIPS2) += pcips2.o
  obj-$(CONFIG_SERIO_SUN4I_PS2) += sun4i-ps2.o
  obj-$(CONFIG_SERIO_OLPC_APSP) += olpc_apsp.o
  obj-$(CONFIG_SERIO_RAW) += serio_raw.o
  obj-$(CONFIG_SERIO_AMBAKMI) += ambakmi.o
  obj-$(CONFIG_USERIO) += userio.o
  obj-$(CONFIG_SERIO_I8042) += i8042.o
 endif
