Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@
"optoe"
],
"pddf_kos": [
"pddf_multifpgapci_i2c_module",
"pddf_multifpgapci_gpio_module",
"pddf_client_module",
"pddf_multifpgapci_driver",
"pddf_multifpgapci_module",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -540,32 +540,25 @@ static int fpgai2c_init(struct fpgalogic_i2c *i2c)

static int adap_data_init(struct i2c_adapter *adap, int index)
{
struct pddf_multifpgapci_drvdata *pci_privdata = 0;
pci_privdata = (struct pddf_multifpgapci_drvdata*) dev_get_drvdata(adap->dev.parent);

if (pci_privdata == 0) {
printk("[%s]: ERROR pci_privdata is 0\n", __FUNCTION__);
struct pci_dev *dev = to_pci_dev(adap->dev.parent);
struct i2c_adapter_data i2c_data;
int error = pddf_multifpgapci_i2c_get_adapter_data(dev, &i2c_data);
if (error) {
printk("[%s]: ERROR getting i2c adapter_data: %d\n", __FUNCTION__, error);
return -1;
}

if (pci_privdata->i2c_adapter_drvdata_initialized != 1) {
printk("[%s]: ERROR i2c_adapter_drvdata is not initialized\n", __FUNCTION__);
return -1;
}
struct i2c_adapter_drvdata *i2c_privdata = &pci_privdata->i2c_adapter_drvdata;

int i2c_ch_index = index + i2c_privdata->virt_bus;
int i2c_ch_index = index + i2c_data.virt_bus;

pddf_dbg(FPGA, KERN_INFO "[%s] index: [%d] fpga_data__base_addr:0x%08lx"
" fpgapci_bar_len:0x%08lx fpga_i2c_ch_base_addr:0x%08lx ch_ssize=0x%x supported_i2c_ch=%d",
__FUNCTION__, i2c_ch_index, pci_privdata->fpga_data_base_addr,
pci_privdata->bar_length, i2c_privdata->ch_base_addr,
i2c_privdata->ch_size, i2c_privdata->num_virt_ch);
pddf_dbg(FPGA, KERN_INFO "[%s] index: [%d] pci_dev: [%s]"
" fpga_i2c_ch_base_addr:0x%08lx ch_ssize=0x%x supported_i2c_ch=%d",
__FUNCTION__, i2c_ch_index, pci_name(dev),
i2c_data.ch_base_addr, i2c_data.ch_size, i2c_data.num_virt_ch);

if (index >= i2c_privdata->num_virt_ch
|| i2c_privdata->num_virt_ch > I2C_PCI_MAX_BUS){
if (index >= i2c_data.num_virt_ch
|| i2c_data.num_virt_ch > I2C_PCI_MAX_BUS){
printk("[%s]: ERROR i2c_ch_index=%d max_ch_index=%d out of range: %d\n",
__FUNCTION__, i2c_ch_index, i2c_privdata->num_virt_ch, I2C_PCI_MAX_BUS);
__FUNCTION__, i2c_ch_index, i2c_data.num_virt_ch, I2C_PCI_MAX_BUS);
return -1;
}

Expand All @@ -574,8 +567,8 @@ static int adap_data_init(struct i2c_adapter *adap, int index)
#else
memset(&fpgalogic_i2c[i2c_ch_index], 0, sizeof(fpgalogic_i2c[0]));
#endif
fpgalogic_i2c[i2c_ch_index].base = i2c_privdata->ch_base_addr +
index * i2c_privdata->ch_size;
fpgalogic_i2c[i2c_ch_index].base = i2c_data.ch_base_addr +
index * i2c_data.ch_size;
mutex_init(&fpgalogic_i2c[i2c_ch_index].lock);
fpgai2c_init(&fpgalogic_i2c[i2c_ch_index]);

Expand All @@ -597,7 +590,7 @@ static int pddf_i2c_multifpgapci_add_numbered_bus_default (struct i2c_adapter *a
/*
* FPGAPCI APIs
*/
static int board_i2c_fpgapci_read(const char *bdf, uint32_t offset)
int board_i2c_fpgapci_read(const char *bdf, uint32_t offset)
{
if (get_fpga_ctl_addr == NULL) {
printk(KERN_ERR "get_fpga_ctl_addr function not available\n");
Expand All @@ -615,7 +608,7 @@ static int board_i2c_fpgapci_read(const char *bdf, uint32_t offset)
}


static int board_i2c_fpgapci_write(const char *bdf, uint32_t offset, uint32_t value)
int board_i2c_fpgapci_write(const char *bdf, uint32_t offset, uint32_t value)
{
if (get_fpga_ctl_addr == NULL) {
printk(KERN_ERR "get_fpga_ctl_addr function not available\n");
Expand Down
34 changes: 26 additions & 8 deletions platform/pddf/i2c/modules/include/pddf_multifpgapci_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,19 @@
#include "pddf_multifpgapci_i2c_defs.h"

#define NAME_SIZE 32

#ifndef KOBJ_FREE
#define KOBJ_FREE(obj) \
if (obj) \
kobject_put(obj);
#endif

struct pddf_multifpgapci_drvdata {
struct pci_dev *pci_dev;
resource_size_t bar_start;
void *__iomem fpga_data_base_addr;
// i2c
size_t bar_length;
struct kobject *i2c_kobj;
struct i2c_adapter_drvdata i2c_adapter_drvdata;
bool i2c_adapter_drvdata_initialized;
// gpio
struct kobject *gpio_kobj;
struct gpio_chip_drvdata gpio_chip_drvdata;
bool gpio_chip_drvdata_initialized;
bool bar_initialized;
};

// FPGA
Expand All @@ -54,9 +50,31 @@ struct pddf_multi_fpgapci_ops_t {
int (*post_device_operation)(struct pci_dev *);
};

// Protocol function pointer types
typedef int (*attach_fn)(struct pci_dev *pci_dev, struct kobject *kobj);
typedef void (*detach_fn)(struct pci_dev *pci_dev, struct kobject *kobj);
typedef void (*map_bar_fn)(struct pci_dev *pci_dev, void *__iomem bar_base,
unsigned long bar_start, unsigned long bar_len);
typedef void (*unmap_bar_fn)(struct pci_dev *pci_dev, void *__iomem bar_base,
unsigned long bar_start, unsigned long bar_len);

// Protocol operations structure
struct protocol_ops {
attach_fn attach;
detach_fn detach;
map_bar_fn map_bar;
unmap_bar_fn unmap_bar;
const char *name;
};

extern struct pddf_multi_fpgapci_ops_t pddf_multi_fpgapci_ops;

extern int (*ptr_multifpgapci_readpci)(struct pci_dev *, uint32_t, uint32_t *);
extern int (*ptr_multifpgapci_writepci)(struct pci_dev *, uint32_t, uint32_t);

extern int multifpgapci_register_protocol(const char *name,
struct protocol_ops *ops);
extern void multifpgapci_unregister_protocol(const char *name);
extern unsigned long multifpgapci_get_pci_dev_index(struct pci_dev *pci_dev);

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ struct gpio_chip_attrs {
sizeof(PDDF_ATTR))

struct gpio_chip_drvdata {
struct kobject *gpio_kobj;
// pdata is passed to gpio platform driver.
struct pddf_multifpgapci_gpio_chip_pdata pdata;
// temp_line_data is mutated by sysfs attrs and copied to pdata.
Expand Down
17 changes: 16 additions & 1 deletion platform/pddf/i2c/modules/include/pddf_multifpgapci_i2c_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,18 @@ struct i2c_adapter_sysfs_vals {
uint32_t num_virt_ch;
};

struct i2c_adapter_data {
int virt_bus;
void *__iomem ch_base_addr;
int ch_size;
int num_virt_ch;
};

struct i2c_adapter_drvdata {
struct pci_dev *pci_dev;
size_t bar_length;
struct kobject *i2c_kobj;

// temp_sysfs_vals store temporary values provided by sysfs,
// which are eventually copied/saved to I2C adapter platform data.
struct i2c_adapter_sysfs_vals temp_sysfs_vals;
Expand All @@ -70,4 +81,8 @@ extern int pddf_multifpgapci_i2c_module_init(struct pci_dev *pci_dev,
extern void pddf_multifpgapci_i2c_module_exit(struct pci_dev *pci_dev,
struct kobject *kobj);

#endif
extern int
pddf_multifpgapci_i2c_get_adapter_data(struct pci_dev *pci_dev,
struct i2c_adapter_data *data);

#endif
2 changes: 1 addition & 1 deletion platform/pddf/i2c/modules/multifpgapci/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
obj-m := driver/ gpio/ i2c/
obj-m += pddf_multifpgapci_module.o

ccflags-y:= -I$(M)/modules/include
ccflags-y := -I$(M)/modules/include
Loading
Loading