Commit cf6b2894 authored by Federico Vaga's avatar Federico Vaga

sw:drv: fix I2C filter function

Signed-off-by: Federico Vaga's avatarFederico Vaga <federico.vaga@cern.ch>
parent 84ff1837
...@@ -516,9 +516,15 @@ static const struct fmc_carrier_operations svec_fmc_ops = { ...@@ -516,9 +516,15 @@ static const struct fmc_carrier_operations svec_fmc_ops = {
.is_present = svec_fmc_is_present, .is_present = svec_fmc_is_present,
}; };
struct svec_i2c_filter {
struct svec_fpga *svec_fpga;
unsigned int slot_nr;
};
static int svec_i2c_find_adapter(struct device *dev, void *data) static int svec_i2c_find_adapter(struct device *dev, void *data)
{ {
struct svec_fpga *svec_fpga = data; struct svec_i2c_filter *flt = data;
struct svec_fpga *svec_fpga = flt->svec_fpga;
struct i2c_adapter *adap, *adap_parent; struct i2c_adapter *adap, *adap_parent;
if (dev->type != &i2c_adapter_type) if (dev->type != &i2c_adapter_type)
...@@ -533,7 +539,11 @@ static int svec_i2c_find_adapter(struct device *dev, void *data) ...@@ -533,7 +539,11 @@ static int svec_i2c_find_adapter(struct device *dev, void *data)
if (&svec_fpga->dev != adap_parent->dev.parent->parent) if (&svec_fpga->dev != adap_parent->dev.parent->parent)
return 0; return 0;
/* Found! Return the bus ID */ if (flt->slot_nr > 0) {
/* We want the following one */
flt->slot_nr--;
return 0;
}
return i2c_adapter_id(adap); return i2c_adapter_id(adap);
} }
...@@ -544,9 +554,9 @@ static int svec_i2c_find_adapter(struct device *dev, void *data) ...@@ -544,9 +554,9 @@ static int svec_i2c_find_adapter(struct device *dev, void *data)
* *
* Return: the I2C bus to be used * Return: the I2C bus to be used
*/ */
static int svec_i2c_get_bus(struct svec_fpga *svec_fpga) static int svec_i2c_get_bus(struct svec_i2c_filter *flt)
{ {
return i2c_for_each_dev(svec_fpga, svec_i2c_find_adapter); return i2c_for_each_dev(flt, svec_i2c_find_adapter);
} }
/** /**
...@@ -557,7 +567,9 @@ static int svec_fmc_init(struct svec_fpga *svec_fpga) ...@@ -557,7 +567,9 @@ static int svec_fmc_init(struct svec_fpga *svec_fpga)
int err, i; int err, i;
for (i = 0; i < SVEC_FMC_SLOTS; ++i) { for (i = 0; i < SVEC_FMC_SLOTS; ++i) {
svec_fpga->slot_info[i].i2c_bus_nr = svec_i2c_get_bus(svec_fpga); struct svec_i2c_filter flt = {svec_fpga, i};
svec_fpga->slot_info[i].i2c_bus_nr = svec_i2c_get_bus(&flt);
if (svec_fpga->slot_info[i].i2c_bus_nr <= 0) if (svec_fpga->slot_info[i].i2c_bus_nr <= 0)
return -ENODEV; return -ENODEV;
svec_fpga->slot_info[i].ga = i; svec_fpga->slot_info[i].ga = i;
......
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