Commit d74bcb21 authored by Jorge Machado's avatar Jorge Machado

Update spec-sdb-scan.c to detect DIO V2

parent 96a81d1a
......@@ -49,7 +49,8 @@
// Vendor
#define SDB_7SOLS_VENDOR 0x000075cb
// Products
#define SDB_DIO_PID 0x00000001
#define SDB_DIO_PID 0x00000001
#define SDB_DIO_PID_V2 0x00000003
#define SDB_DIO_NAME "DIO"
// Designs entry points, bitstreams and firmware files
......@@ -161,11 +162,13 @@ static void fpga_dev_release(struct device *dev){}
#define FPGA_DEVS_DIO_DEV 2
#define FPGA_DEVS_DIO_DEV_NAME "spec-fmc-dio"
#define FPGA_DEVS_DIO_DEV_DIO 0
#define FPGA_DEVS_DIO_DEV_DIO_V2 1
#define FPGA_DEVS_DIO_DEV_DIO_IRQ 3
#define FPGA_DEVS_DIO_DEV_GPIO 1
#define FPGA_DEVS_DIO_DEV_PPSG 2
#define FPGA_DEVS_DIO_DEV_NUM 3
#define FPGA_DEVS_DIO_DEV_GPIO 2
#define FPGA_DEVS_DIO_DEV_PPSG 3
#define FPGA_DEVS_DIO_DEV_NUM 4
#define FPGA_DEVS_DIO_DEV_PDEV_NAME "fmc-dio-spec"
#define FPGA_DEVS_DIO_DEV_PDEV_NAME_V2 "fmc-diov2-spec"
#define FPGA_DEVS_DIO_DEV_PDEV_RELEASE_F fpga_dev_release
// Global structure for FPGA devices
......@@ -185,6 +188,7 @@ static struct fpga_dev fpga_devs[] =
/* DIO */
FPGA_DEVS_CREATE_BEGIN_DEV(FPGA_DEVS_DIO_DEV,FPGA_DEVS_DIO_DEV_NAME)
FPGA_DEV_CREATE_SFULL(FPGA_DEVS_DIO_DEV_DIO,SDB_DIO_NAME,SDB_7SOLS_VENDOR,SDB_DIO_PID,FPGA_DEVS_DIO_DEV_DIO_IRQ)
FPGA_DEV_CREATE_SFULL(FPGA_DEVS_DIO_DEV_DIO_V2,SDB_DIO_NAME,SDB_7SOLS_VENDOR,SDB_DIO_PID_V2,FPGA_DEVS_DIO_DEV_DIO_IRQ)
FPGA_DEV_CREATE(FPGA_DEVS_DIO_DEV_GPIO,SDB_GPIO_NAME,SDB_CERN_VENDOR,SDB_GPIO_PID)
FPGA_DEV_CREATE(FPGA_DEVS_DIO_DEV_PPSG,SDB_PPSG_NAME,SDB_CERN_VENDOR,SDB_PPSG_PID)
FPGA_DEVS_CREATE_END_DEV(FPGA_DEVS_DIO_DEV_NUM,FPGA_DEVS_DIO_DEV_PDEV_NAME,FPGA_DEVS_DIO_DEV_PDEV_RELEASE_F)
......@@ -212,6 +216,9 @@ static int spec_sdb_fpga_dev_register(struct fmc_device *fmc, struct fpga_dev *f
int i, j, r;
unsigned int n_irqs = 0;
unsigned int n_res = 0;
int find_v2 = 0;
int v1_found = 0;
int v2_found = 0;
if(fdev->n_cores <= 0 || fdev->n_cores >= FPGA_DEV_MAX_CORES)
return -EINVAL;
......@@ -231,11 +238,33 @@ static int spec_sdb_fpga_dev_register(struct fmc_device *fmc, struct fpga_dev *f
start = fmc_find_sdb_device(fmc->sdb,
fdev->cores[i].vid,
fdev->cores[i].pid,&size);
if(start < 0) {
// If DIO V1 is not found, try to find DIO V2
if(fdev->cores[i].vid == SDB_7SOLS_VENDOR) {
if(fdev->cores[i].pid == SDB_DIO_PID) {
find_v2 = 1;
continue;
}
else if(fdev->cores[i].pid == SDB_DIO_PID_V2 && v1_found == 1){
continue;
}
}
kfree(res);
return -EINVAL;
}
if(fdev->cores[i].vid == SDB_7SOLS_VENDOR) {
if(fdev->cores[i].pid == SDB_DIO_PID) {
v1_found = 1;
}
else if(fdev->cores[i].pid == SDB_DIO_PID_V2)
{
v2_found = 1;
}
}
res[j].name = fdev->cores[i].name;
res[j].flags = IORESOURCE_MEM;
res[j].start = spec->area[0]->start+start;
......@@ -258,6 +287,11 @@ static int spec_sdb_fpga_dev_register(struct fmc_device *fmc, struct fpga_dev *f
fdev->dev.resource = res;
fdev->dev.num_resources = n_res;
//set V2 device name if necessary
if(v2_found == 1) {
fdev->dev.name = FPGA_DEVS_DIO_DEV_PDEV_NAME_V2;
}
platform_set_drvdata(&fdev->dev,fdev->priv);
r = platform_device_register(&fdev->dev);
......
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