Commit f22fff86 authored by Maciej Lipinski's avatar Maciej Lipinski

Merge branch 'dio_extension' into 'starting-kit-master'

Dio extension

See merge request !3
parents 96a81d1a a8c6809f
......@@ -49,7 +49,10 @@
// Vendor
#define SDB_7SOLS_VENDOR 0x000075cb
// Products
#define SDB_DIO_PID 0x00000001
#define SDB_DIO_PID 0x00000001
// V2 DIO gateware product ID. The 0x3 value should
// be used to mantain backward compatibility
#define SDB_DIO_PID_V2 0x00000003
#define SDB_DIO_NAME "DIO"
// Designs entry points, bitstreams and firmware files
......@@ -161,11 +164,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 +190,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 +218,7 @@ 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 version_found = 0;
if(fdev->n_cores <= 0 || fdev->n_cores >= FPGA_DEV_MAX_CORES)
return -EINVAL;
......@@ -231,11 +238,35 @@ 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(fdev->cores[i].vid == SDB_7SOLS_VENDOR) {
// If DIO V1 is not found, continue to find DIO V2
if(fdev->cores[i].pid == SDB_DIO_PID) {
continue;
}
// If DIO V2 is not found, check if DIO V2 has been found previously
else if(fdev->cores[i].pid == SDB_DIO_PID_V2 && version_found == 1){
continue;
}
}
kfree(res);
return -EINVAL;
}
if(fdev->cores[i].vid == SDB_7SOLS_VENDOR) {
//DIO v1 has been detected
if(fdev->cores[i].pid == SDB_DIO_PID) {
version_found = 1;
}
//DIO v2 has been detected
else if(fdev->cores[i].pid == SDB_DIO_PID_V2)
{
version_found = 2;
}
}
res[j].name = fdev->cores[i].name;
res[j].flags = IORESOURCE_MEM;
res[j].start = spec->area[0]->start+start;
......@@ -258,6 +289,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 it has been detected
if(version_found == 2) {
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