There may be instances when the device tree is not suitable to interface with the ocores implementation. For example, when the FPGA/ASIC is not on the same silicon die (e.g. the communication between the CPU and the FPGA/ASIC is over PCI), information about the ocore implementation, such as whether the gaisler implementation is used, must be determined during runtime. In this case, the client driver would prepopulate the platform data during device instantiation. Thus, a boolean needs to be added in the platform data, to instruct the i2c-ocores driver whether the gaisler register callbacks should be used. Signed-off-by: Mohammed Billoo <mab@xxxxxxxxxxxx> --- drivers/i2c/busses/i2c-ocores.c | 4 ++++ include/linux/platform_data/i2c-ocores.h | 1 + 2 files changed, 5 insertions(+) diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index f5fc75b65a19..0975f6797069 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c @@ -647,6 +647,10 @@ static int ocores_i2c_probe(struct platform_device *pdev) i2c->bus_clock_khz = pdata->bus_khz; else i2c->bus_clock_khz = 100; + if (pdata->gaisler) { + i2c->setreg = oc_setreg_grlib; + i2c->getreg = oc_getreg_grlib; + } } else { ret = ocores_i2c_of_probe(pdev, i2c); if (ret) diff --git a/include/linux/platform_data/i2c-ocores.h b/include/linux/platform_data/i2c-ocores.h index e6326cbafe59..8a5849f1e267 100644 --- a/include/linux/platform_data/i2c-ocores.h +++ b/include/linux/platform_data/i2c-ocores.h @@ -14,6 +14,7 @@ struct ocores_i2c_platform_data { u32 clock_khz; /* input clock in kHz */ u32 bus_khz; /* bus clock in kHz */ bool big_endian; /* registers are big endian */ + bool gaisler; /* use grlib accessors */ u8 num_devices; /* number of devices in the devices list */ struct i2c_board_info const *devices; /* devices connected to the bus */ }; -- 2.17.1