Commit 5056e81c authored by Federico Vaga's avatar Federico Vaga

sw:drv: make GN412X FCL driver independent

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 67fb45e4
......@@ -3,8 +3,11 @@ PACKAGE_VERSION="@PKGVER@"
CLEAN="make clean"
MAKE[0]="make KVERSION=$kernelver all"
MAKE[1]="make KVERSION=$kernelver all"
MAKE[2]="make KVERSION=$kernelver all"
BUILT_MODULE_NAME[0]="@PKGNAME@"
BUILT_MODULE_NAME[1]="gn412x-gpio"
BUILT_MODULE_NAME[2]="gn412x-fcl"
DEST_MODULE_LOCATION[0]="/updates"
DEST_MODULE_LOCATION[1]="/updates"
DEST_MODULE_LOCATION[2]="/updates"
AUTOINSTALL="yes"
......@@ -29,10 +29,10 @@ KBUILD_EXTRA_SYMBOLS += $(FMC_ABS)/drivers/fmc/Module.symvers
obj-m := spec-fmc-carrier.o
obj-m += gn412x-gpio.o
obj-m += gn412x-fcl.o
spec-fmc-carrier-objs := spec-core.o
spec-fmc-carrier-objs += spec-core-fpga.o
spec-fmc-carrier-objs += spec-fpga.o
spec-fmc-carrier-objs += spec-dbg.o
spec-fmc-carrier-objs += spec-fmc.o
spec-fmc-carrier-objs += spec-compat.o
......
This diff is collapsed.
......@@ -6,97 +6,11 @@
#include <linux/kallsyms.h>
#include <linux/module.h>
#include <linux/fpga/fpga-mgr.h>
#include <linux/mfd/core.h>
#include <linux/version.h>
#include <linux/gpio/driver.h>
#include "spec-compat.h"
int compat_get_fpga_last_word_size(struct fpga_image_info *info, size_t count)
{
#if KERNEL_VERSION(4, 16, 0) > LINUX_VERSION_CODE && !defined(CONFIG_FPGA_MGR_BACKPORT)
return count;
#else
return info ? info->count : count;
#endif
}
#if KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE && !defined(CONFIG_FPGA_MGR_BACKPORT)
int compat_spec_fpga_write_init(struct fpga_manager *mgr,
u32 flags,
const char *buf, size_t count)
{
return spec_fpga_write_init(mgr, NULL, buf, count);
}
int compat_spec_fpga_write_complete(struct fpga_manager *mgr,
u32 flags)
{
return spec_fpga_write_complete(mgr, NULL);
}
#else
int compat_spec_fpga_write_init(struct fpga_manager *mgr,
struct fpga_image_info *info,
const char *buf, size_t count)
{
return spec_fpga_write_init(mgr, info, buf, count);
}
int compat_spec_fpga_write_complete(struct fpga_manager *mgr,
struct fpga_image_info *info)
{
return spec_fpga_write_complete(mgr, info);
}
#endif
#if KERNEL_VERSION(4, 18, 0) > LINUX_VERSION_CODE && !defined(CONFIG_FPGA_MGR_BACKPORT)
struct fpga_manager *compat_fpga_mgr_create(struct device *dev, const char *name,
const struct fpga_manager_ops *mops,
void *priv)
{
int err;
err = fpga_mgr_register(dev, name, mops, priv);
if (err)
return NULL;
return (struct fpga_manager *)dev;
}
void compat_fpga_mgr_free(struct fpga_manager *mgr)
{
fpga_mgr_unregister((struct device *)mgr);
}
int compat_fpga_mgr_register(struct fpga_manager *mgr)
{
return mgr ? 0 : 1;
}
void compat_fpga_mgr_unregister(struct fpga_manager *mgr)
{
fpga_mgr_unregister((struct device *)mgr);
}
#else
struct fpga_manager *compat_fpga_mgr_create(struct device *dev,
const char *name,
const struct fpga_manager_ops *mops,
void *priv)
{
return fpga_mgr_create(dev, name, mops, priv);
}
void compat_fpga_mgr_free(struct fpga_manager *mgr)
{
fpga_mgr_free(mgr);
}
int compat_fpga_mgr_register(struct fpga_manager *mgr)
{
return fpga_mgr_register(mgr);
}
void compat_fpga_mgr_unregister(struct fpga_manager *mgr)
{
fpga_mgr_unregister(mgr);
}
#endif
#if KERNEL_VERSION(4, 10, 0) > LINUX_VERSION_CODE && !defined(CONFIG_FPGA_MGR_BACKPORT)
......@@ -176,12 +90,33 @@ static int __compat_spec_fw_load(struct fpga_manager *mgr, const char *name)
#endif
}
int compat_spec_fw_load(struct spec_dev *spec, const char *name)
static int mfd_find_device_match(struct device *dev, void *data)
{
struct mfd_cell *cell = data;
struct platform_device *pdev = to_platform_device(dev);
return (strncmp(cell->name, mfd_get_cell(pdev)->name,
strnlen(cell->name, 32)) == 0);
}
static struct device *mfd_find_device(struct device *parent,
const struct mfd_cell *cell)
{
return device_find_child(parent, (void *)cell, mfd_find_device_match);
}
int compat_spec_fw_load(struct spec_dev *spec, const struct mfd_cell *cell,
const char *name)
{
struct fpga_manager *mgr;
struct device *fpga_dev;
int err;
mgr = fpga_mgr_get(&spec->dev);
fpga_dev = mfd_find_device(&spec->dev, cell);
if (!fpga_dev)
return -ENODEV;
mgr = fpga_mgr_get(fpga_dev);
if (IS_ERR(mgr))
return -ENODEV;
......
......@@ -49,14 +49,8 @@ int compat_spec_fpga_write_complete(struct fpga_manager *mgr,
#endif
int compat_get_fpga_last_word_size(struct fpga_image_info *info,
size_t count);
struct fpga_manager *compat_fpga_mgr_create(struct device *dev,
const char *name,
const struct fpga_manager_ops *mops,
void *priv);
void compat_fpga_mgr_free(struct fpga_manager *mgr);
int compat_fpga_mgr_register(struct fpga_manager *mgr);
void compat_fpga_mgr_unregister(struct fpga_manager *mgr);
int compat_spec_fw_load(struct spec_dev *spec, const char *name);
int compat_spec_fw_load(struct spec_dev *spec, const struct mfd_cell *cell,
const char *name);
#if KERNEL_VERSION(3, 11, 0) > LINUX_VERSION_CODE
#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO), \
......
......@@ -46,8 +46,23 @@ static struct resource gn412x_gpio_res[] = {
}
};
static struct resource gn412x_fcl_res[] = {
{
.name = "gn412x-fcl-mem",
.flags = IORESOURCE_MEM,
.start = 0,
.end = 0x1000 - 1,
}, {
.name = "gn412x-fcl-irq",
.flags = IORESOURCE_IRQ,
.start = 0,
.end = 0,
}
};
enum spec_mfd_enum {
SPEC_MFD_GN412X_GPIO = 0,
SPEC_MFD_GN412X_FCL,
};
static const struct mfd_cell spec_mfd_devs[] = {
......@@ -58,6 +73,13 @@ static const struct mfd_cell spec_mfd_devs[] = {
.num_resources = ARRAY_SIZE(gn412x_gpio_res),
.resources = gn412x_gpio_res,
},
[SPEC_MFD_GN412X_FCL] = {
.name = "gn412x-fcl",
.platform_data = NULL,
.pdata_size = 0,
.num_resources = ARRAY_SIZE(gn412x_fcl_res),
.resources = gn412x_fcl_res,
},
};
......@@ -104,14 +126,21 @@ static int spec_fw_load(struct spec_dev *spec, const char *name)
return err;
}
err = compat_spec_fw_load(spec, name);
spec_gpio_fpga_select(spec, SPEC_FPGA_SELECT_GN4124);
err = compat_spec_fw_load(spec, &spec_mfd_devs[SPEC_MFD_GN412X_FCL], name);
if (err)
return err;
goto out;
err = spec_core_fpga_init(spec);
if (err)
dev_warn(&spec->dev, "FPGA incorrectly programmed\n");
return 0;
out:
spec_gpio_fpga_select(spec, SPEC_FPGA_SELECT_FLASH);
return err;
}
/**
......@@ -230,10 +259,6 @@ static int spec_probe(struct pci_dev *pdev,
if (err)
goto err_sgpio;
err = spec_fpga_init(spec);
if (err)
goto err_fpga;
err = spec_core_fpga_init(spec);
if (err)
dev_warn(&spec->dev, "FPGA incorrectly programmed or empty\n");
......@@ -242,8 +267,6 @@ static int spec_probe(struct pci_dev *pdev,
return 0;
err_fpga:
spec_gpio_exit(spec);
err_sgpio:
mfd_remove_devices(&spec->dev);
err_mfd:
......@@ -269,7 +292,6 @@ static void spec_remove(struct pci_dev *pdev)
spec_dbg_exit(spec);
spec_core_fpga_exit(spec);
spec_fpga_exit(spec);
spec_gpio_exit(spec);
mfd_remove_devices(&spec->dev);
......
......@@ -8,7 +8,6 @@
#define __SPEC_H__
#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/fpga/fpga-mgr.h>
#include <linux/i2c.h>
#include <linux/irqdomain.h>
#include <linux/pci.h>
......@@ -109,8 +108,6 @@ struct spec_meta_id {
struct spec_dev {
struct device dev;
struct fpga_manager *mgr;
DECLARE_BITMAP(flags, SPEC_FLAG_BITS);
void __iomem *remap[3]; /* ioremap of bar 0, 2, 4 */
void __iomem *fpga;
......@@ -181,9 +178,6 @@ static inline void gennum_mask_val(struct spec_dev *spec,
gennum_writel(spec, v, reg);
}
extern int spec_fpga_init(struct spec_dev *spec);
extern void spec_fpga_exit(struct spec_dev *spec);
extern int spec_irq_init(struct spec_dev *spec);
extern void spec_irq_exit(struct spec_dev *spec);
......
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