#
# Makefile for ADB3 series Linux 2.6.x / 3+.x / 4.x / 5.x / 6.x monolithic driver
#
# (C) Copyright 2010-2015, 2019, 024 Alpha Data
#
# Requires GNUMake.
#
# Available targets:
# ------------------
#
# The following targets should be run as an unprivileged user:
#
#   all     - builds the kernel module
#   clean   - removes object files including kernel module
#   tidy    - deletes emacs ~ backup files
#
# The following targets should be run as root:
#
#   install - installs the kernel module in the directory
#             under /lib/modules/<version>/kernel/drivers/addon/adb3,
#             runs 'depmod' and installs the service script 'adb3.rc'
#
# Note that the 'install' target does NOT automatically build the kernel
# module. This is intentional, in order to avoid inadvertantly compiling
# the driver as root and creating "undeletable" files when it has been
# unpacked in an unprivileged user's home directory. When root is both
# building and installing the driver, use 'make clean all install'.
#

ifneq ($(KERNELRELEASE),)

include $(src)/../../version.mak

OBJS_ADMXRC3 = \
	../../modules/admxrc3/clock.o \
	../../modules/admxrc3/diagnostic.o \
	../../modules/admxrc3/derror.o \
	../../modules/admxrc3/dma.o \
	../../modules/admxrc3/dmabus.o \
	../../modules/admxrc3/event.o \
	../../modules/admxrc3/flash.o \
	../../modules/admxrc3/fpga.o \
	../../modules/admxrc3/identify.o \
	../../modules/admxrc3/info.o \
	../../modules/admxrc3/lock.o \
	../../modules/admxrc3/main.o  \
	../../modules/admxrc3/module.o \
	../../modules/admxrc3/model_admad01478.o \
	../../modules/admxrc3/model_admad01479.o \
	../../modules/admxrc3/model_admpcie7v3.o \
	../../modules/admxrc3/model_admpcie8v3.o \
	../../modules/admxrc3/model_admpcie8k5.o \
	../../modules/admxrc3/model_admpcieku3.o \
	../../modules/admxrc3/model_admxrc2.o \
	../../modules/admxrc3/model_admxrc6tadv8.o \
	../../modules/admxrc3/model_admxrc6tda1.o \
	../../modules/admxrc3/model_admxrc6tge.o \
	../../modules/admxrc3/model_admxrc6tl.o \
	../../modules/admxrc3/model_admxrc6t1.o \
	../../modules/admxrc3/model_admxrc7k1.o \
	../../modules/admxrc3/model_admxrc7v1.o \
	../../modules/admxrc3/model_admxrc7z1.o \
	../../modules/admxrc3/model_admxrcku1.o \
	../../modules/admxrc3/model_admxrcku1at8.o \
	../../modules/admxrc3/model_adpexrc5t.o \
	../../modules/admxrc3/model_adpexrc6t.o \
	../../modules/admxrc3/model_adpexrc6tadv.o \
	../../modules/admxrc3/model_generic.o \
	../../modules/admxrc3/pio.o \
	../../modules/admxrc3/vpd.o

OBJS_CORE = \
	../../core/admxrc6tx_common.o \
	../../core/avr.o \
	../../core/avr_clock.o \
	../../core/avr_flash.o \
	../../core/avr_fmc.o \
	../../core/avr_sensor.o \
	../../core/avr2.o \
	../../core/avr2_clock.o \
	../../core/avr2_flash.o \
	../../core/avr2_mez.o \
	../../core/coreclock.o \
	../../core/coredma.o \
	../../core/coredmabus.o \
	../../core/coreflash.o \
	../../core/corefpga.o \
	../../core/coremisc.o \
	../../core/coremodule.o \
	../../core/corenotify.o \
	../../core/coresensor.o \
	../../core/corevpd.o \
	../../core/ddr3_spd_common.o \
	../../core/flash.o \
	../../core/flash_cfi.o \
	../../core/hwmon.o \
	../../core/i2c.o \
	../../core/icap.o \
	../../core/icd2061.o \
	../../core/ics843034_01.o \
	../../core/identify.o \
	../../core/interrupt.o \
	../../core/main.o \
	../../core/model_adb3.o \
	../../core/model_admad01478.o \
	../../core/model_admad01479.o \
	../../core/model_admpcie7v3.o \
	../../core/model_admpcie8v3.o \
	../../core/model_admpcie8k5.o \
	../../core/model_admpcieku3.o \
	../../core/model_admxrc2.o \
	../../core/model_admxrc6tadv8.o \
	../../core/model_admxrc6tda1.o \
	../../core/model_admxrc6tge.o \
	../../core/model_admxrc6tl.o \
	../../core/model_admxrc6t1.o \
	../../core/model_admxrc7k1.o \
	../../core/model_admxrc7v1.o \
	../../core/model_admxrc7z1.o \
	../../core/model_admxrcku1.o \
	../../core/model_adpexrc5t.o \
	../../core/model_adpexrc6t.o \
	../../core/model_adpexrc6tadv.o \
	../../core/pci9xxx_93x6.o \
	../../core/prodtest.o \
	../../core/resource.o \
	../../core/serializer.o \
	../../core/si5338.o \
	../../core/ucd90120buf.o \
	../../core/v5clksynth.o \
	../../core/v6clksynth.o

OBJS_FRAMEWORK = \
	../../framework/linux/buffer_desc.o \
	../../framework/linux/debug.o \
	../../framework/linux/directif.o \
	../../framework/linux/dma.o \
	../../framework/linux/dpc.o \
	../../framework/linux/drvparam.o \
	../../framework/linux/interrupt.o \
	../../framework/linux/mapio.o \
	../../framework/linux/mmap.o \
	../../framework/linux/pci_driver.o \
	../../framework/linux/pool.o \
	../../framework/linux/time.o \
	../../framework/linux/timer.o \
	../../framework/linux/userif.o

OBJS_LINUX = \
	linux-2.6.o

OBJS_MONO = \
	../main.o

OBJS = $(OBJS_ADMXRC3) $(OBJS_CORE) $(OBJS_FRAMEWORK) $(OBJS_LINUX) $(OBJS_MONO)

EXTRA_CFLAGS += \
	-DDF_DBG_BUILD=1 \
	-DADB3_MONOLITHIC=1 \
	-DADMXRC3_LOCKED_BUFFERS_GLOBAL=1 \
	-DADMXRC3_SINGLE_REQUEST_PER_HANDLE=0 \
	-DADMXRC3_CHECK_FLAGS \
	-DADB3_VERSION_0=$(VERSION_0) \
	-DADB3_VERSION_1=$(VERSION_1) \
	-DADB3_VERSION_2=$(VERSION_2) \
	-DADB3_VERSION_3=$(VERSION_BUILD) \
	-I$(src)/../../../include \
	-I$(src)/../../../api/adb3 -I$(src)/../../../api/adb3/linux \
	-I$(src)/../../../api/modules/admxrc3 -I$(src)/../../../api/modules/admxrc3/linux \
	-I$(src)/../../../api/platform/linux \
	-I$(src)/../.. -I$(src)/../../framework/linux \
	-DUSE_CLASS_SIMPLE=0 \
	-DHAS_UINTPTR_T=1 \
	-DHAS_RESOURCE_SIZE_T=1 \
	-DSTRUCT_PCI_DEV_HAS_PIN=1 \
	-DKMEM_CACHE_CREATE_5=1 \
	-DNO_PAGE_STRUCT_VM_FAULT

ifdef FUSSY
EXTRA_CFLAGS+=-Werror
endif

ccflags-y := $(EXTRA_CFLAGS)

obj-m := adb3.o

adb3-objs := $(OBJS)

else

.PHONY: all clean install dkms_install uninstall rules_install rules_uninstall tidy

MODULE = adb3

KERNEL=$(SYSROOT)/lib/modules/`uname -r`
KERNEL_BUILD=$(KERNEL)/build

all:
	make -C $(KERNEL_BUILD) M="`pwd`" SUBDIRS="`pwd`" modules

clean:
	make -C $(KERNEL_BUILD) M="`pwd`" SUBDIRS="`pwd`" clean
	rm -f `find ../../ -name '*.o'`
	rm -f `find ../../ -name '*.o.cmd'`
	rm -rf Module.symvers

rules_install:
	install -D -m 644 51-adb3.rules $(SYSROOT)/etc/udev/rules.d/51-adb3.rules
	install -D -m 644 51-admxrc3.rules $(SYSROOT)/etc/udev/rules.d/51-admxrc3.rules

rules_uninstall:
	rm -f $(SYSROOT)/etc/udev/rules.d/51-adb3.rules
	rm -f $(SYSROOT)/etc/udev/rules.d/51-admxrc3.rules

install: rules_install
	install -D -m 644 $(MODULE).ko $(KERNEL)/kernel/drivers/addon/adb3/$(MODULE).ko
ifndef CROSS_COMPILE
	depmod
endif
#	./installrc adb3.rc adb3 $(SYSROOT)

# Only install udev rules, because DKMS will perform installation of kernel module
dkms_install: rules_install

tidy:
	rm -rf *~

# This requires root privileges
uninstall: rules_uninstall
	rm -f $(KERNEL)/kernel/drivers/addon/adb3/$(MODULE).ko
ifndef CROSS_COMPILE
	depmod
endif

endif
