Commit 79104a0c authored by Federico Vaga's avatar Federico Vaga Committed by Dimitris Lampridis

[sw] drv: add top level driver for wrtd-ref-spec150t-adc

This driver will load the Mock Turtle device and
the FMC ADC 100M device
Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent effe1288
......@@ -10,7 +10,7 @@ REPO_PARENT ?= $(CURDIR)/..
# on Mock Turtle.
WRTD_DEP_TRTL ?= $(CURDIR)/../dependencies/mock-turtle
DIRS = $(WRTD_DEP_TRTL)/software lib firmware
DIRS = $(WRTD_DEP_TRTL)/software drivers lib firmware
all clean: $(DIRS)
......
.tmp_versions
*.ko
*.mod.c
*.o
*.o.cmd
*.ko.cmd
Module.symvers
modules.order
\ No newline at end of file
# add versions of supermodule. It is useful when svec-sw is included as sub-module
# of a bigger project that we want to track
ifdef CONFIG_SUPER_REPO
ifdef CONFIG_SUPER_REPO_VERSION
SUBMODULE_VERSIONS += MODULE_INFO(version_$(CONFIG_SUPER_REPO),\"$(CONFIG_SUPER_REPO_VERSION)\");
endif
endif
# add versions of used submodules
ccflags-y += -DADDITIONAL_VERSIONS="$(SUBMODULE_VERSIONS)"
ccflags-y += -DDRV_VERSION=\"$(DRV_VERSION)\"
ccflags-y += -Wall -Werror
obj-m := wrtd-ref-spec150t-adc.o
wrtd-ref-spec150t-adc-objs := wrtd-ref-spec150t-adc-core.o
-include Makefile.specific
# include parent_common.mk for buildsystem's defines
#use absolute path for REPO_PARENT
REPO_PARENT ?= $(shell /bin/pwd)/../..
-include $(REPO_PARENT)/parent_common.mk
LINUX ?= /lib/modules/$(shell uname -r)/build
DRV_VERSION := $(shell git describe --dirty --long --tags)
all: modules
.PHONY: all modules clean help install modules_install
modules help install modules_install:
$(MAKE) -C $(LINUX) M=$(shell pwd) DRV_VERSION=$(DRV_VERSION) $@
# be able to run the "clean" rule even if $(LINUX) is not valid
clean:
rm -rf *.o *~ .*.cmd *.ko *.mod.c .tmp_versions Module.symvers \
Module.markers modules.order
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* Copyright (C) 2019 CERN (www.cern.ch)
* Author: Federico Vaga <federico.vaga@cern.ch>
*/
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/mfd/core.h>
static int mfd_id;
enum wrtd_s150a_dev_offsets {
WRTD_S150A_FA100_MEM_START = 0x00002000,
WRTD_S150A_FA100_MEM_END = 0x00002000,
WRTD_S150A_TRTL_MEM_START = 0x0001E000,
WRTD_S150A_TRTL_MEM_END = 0x0001E000,
};
/* MFD devices */
enum spec_fpga_mfd_devs_enum {
WRTD_S150A_MFD_TRTL = 0,
WRTD_S150A_MFD_FA100,
};
static struct resource wrtd_s150a_fa100_res[] = {
{
.name = "fmc-adc-100m14b4ch-mem",
.flags = IORESOURCE_MEM,
.start = WRTD_S150A_FA100_MEM_START,
.end = WRTD_S150A_FA100_MEM_END,
}, {
.name = "fmc-adc-100m14b4ch-irq",
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
.start = 4,
.end = 4,
},
};
static struct resource wrtd_s150a_trtl_res[] = {
{
.name = "mock-turtle-mem",
.flags = IORESOURCE_MEM,
.start = WRTD_S150A_TRTL_MEM_START,
.end = WRTD_S150A_TRTL_MEM_END,
}, {
.name = "mock-turtle-irq_in",
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
.start = 0,
.end = 0,
}, {
.name = "mock-turtle-irq_out",
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
.start = 1,
.end = 1,
}, {
.name = "mock-turtle-irq_con",
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
.start = 2,
.end = 2,
}, {
.name = "mock-turtle-irq_not",
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
.start = 3,
.end = 3,
},
};
static const struct mfd_cell wrtd_s150a_mfd_devs[] = {
[WRTD_S150A_MFD_TRTL] = {
.name = "mock-turtle",
.platform_data = NULL,
.pdata_size = 0,
.num_resources = ARRAY_SIZE(wrtd_s150a_trtl_res),
.resources = wrtd_s150a_trtl_res,
},
[WRTD_S150A_MFD_FA100] = {
.name = "adc-100m-spec",
.platform_data = NULL,
.pdata_size = 0,
.num_resources = ARRAY_SIZE(wrtd_s150a_fa100_res),
.resources = wrtd_s150a_fa100_res,
},
};
static int wrtd_s150a_probe(struct platform_device *pdev)
{
struct resource *rmem;
int irq;
rmem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!rmem) {
dev_err(&pdev->dev, "Missing memory resource\n");
return -EINVAL;
}
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
dev_err(&pdev->dev, "Missing IRQ number\n");
return -EINVAL;
}
/*
* We know that this design uses the HTVIC IRQ controller.
* This IRQ controller has a linear mapping, so it is enough
* to give the first one as input
*/
return mfd_add_devices(&pdev->dev, mfd_id++,
wrtd_s150a_mfd_devs,
ARRAY_SIZE(wrtd_s150a_mfd_devs),
rmem, irq, NULL);
}
static int wrtd_s150a_remove(struct platform_device *pdev)
{
mfd_remove_devices(&pdev->dev);
return 0;
}
/**
* List of supported platform
*/
enum wrtd_s150a_version {
WRTD_S150A_VER = 0,
};
static const struct platform_device_id wrtd_s150a_id_table[] = {
{
.name = "wrtd-s150a",
.driver_data = WRTD_S150A_VER,
}, {
.name = "id:000010DC574E0001",
.driver_data = WRTD_S150A_VER,
},
{},
};
static struct platform_driver wrtd_s150a_driver = {
.driver = {
.name = "wrtd-s150a",
.owner = THIS_MODULE,
},
.id_table = wrtd_s150a_id_table,
.probe = wrtd_s150a_probe,
.remove = wrtd_s150a_remove,
};
module_platform_driver(wrtd_s150a_driver);
MODULE_AUTHOR("Federico Vaga <federico.vaga@cern.ch>");
MODULE_LICENSE("GPL");
MODULE_VERSION(DRV_VERSION);
MODULE_DESCRIPTION("Driver for the WRTD SPEC 150T FMC ADC");
MODULE_DEVICE_TABLE(platform, wrtd_s150a_id_table);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment