mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
i2c-ocores: Can add I2C devices to the bus
There is sometimes a need for the ocores driver to add devices to the bus when installed. i2c_register_board_info can not always be used, because the I2C devices are not known at an early state, they could for instance be connected on a I2C bus on a PCI device which has the Open Cores IP. i2c_new_device can not be used in all cases either since the resulting bus nummer might be unknown. The solution is the pass a list of I2C devices in the platform data to the Open Cores driver. This is useful for MFD drivers. Signed-off-by: Richard Röjfors <richard.rojfors.ext@mocean-labs.com> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
parent
7d85ccd816
commit
dd14be4c27
3 changed files with 24 additions and 0 deletions
|
@ -20,6 +20,8 @@ platform_device with the base address and interrupt number. The
|
||||||
dev.platform_data of the device should also point to a struct
|
dev.platform_data of the device should also point to a struct
|
||||||
ocores_i2c_platform_data (see linux/i2c-ocores.h) describing the
|
ocores_i2c_platform_data (see linux/i2c-ocores.h) describing the
|
||||||
distance between registers and the input clock speed.
|
distance between registers and the input clock speed.
|
||||||
|
There is also a possibility to attach a list of i2c_board_info which
|
||||||
|
the i2c-ocores driver will add to the bus upon creation.
|
||||||
|
|
||||||
E.G. something like:
|
E.G. something like:
|
||||||
|
|
||||||
|
@ -36,9 +38,24 @@ static struct resource ocores_resources[] = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* optional board info */
|
||||||
|
struct i2c_board_info ocores_i2c_board_info[] = {
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("tsc2003", 0x48),
|
||||||
|
.platform_data = &tsc2003_platform_data,
|
||||||
|
.irq = TSC_IRQ
|
||||||
|
},
|
||||||
|
{
|
||||||
|
I2C_BOARD_INFO("adv7180", 0x42 >> 1),
|
||||||
|
.irq = ADV_IRQ
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
static struct ocores_i2c_platform_data myi2c_data = {
|
static struct ocores_i2c_platform_data myi2c_data = {
|
||||||
.regstep = 2, /* two bytes between registers */
|
.regstep = 2, /* two bytes between registers */
|
||||||
.clock_khz = 50000, /* input clock of 50MHz */
|
.clock_khz = 50000, /* input clock of 50MHz */
|
||||||
|
.devices = ocores_i2c_board_info, /* optional table of devices */
|
||||||
|
.num_devices = ARRAY_SIZE(ocores_i2c_board_info), /* table size */
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct platform_device myi2c = {
|
static struct platform_device myi2c = {
|
||||||
|
|
|
@ -216,6 +216,7 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
|
||||||
struct ocores_i2c_platform_data *pdata;
|
struct ocores_i2c_platform_data *pdata;
|
||||||
struct resource *res, *res2;
|
struct resource *res, *res2;
|
||||||
int ret;
|
int ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
if (!res)
|
if (!res)
|
||||||
|
@ -271,6 +272,10 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev)
|
||||||
goto add_adapter_failed;
|
goto add_adapter_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* add in known devices to the bus */
|
||||||
|
for (i = 0; i < pdata->num_devices; i++)
|
||||||
|
i2c_new_device(&i2c->adap, pdata->devices + i);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
add_adapter_failed:
|
add_adapter_failed:
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
struct ocores_i2c_platform_data {
|
struct ocores_i2c_platform_data {
|
||||||
u32 regstep; /* distance between registers */
|
u32 regstep; /* distance between registers */
|
||||||
u32 clock_khz; /* input clock in kHz */
|
u32 clock_khz; /* input clock in kHz */
|
||||||
|
u8 num_devices; /* number of devices in the devices list */
|
||||||
|
struct i2c_board_info const *devices; /* devices connected to the bus */
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* _LINUX_I2C_OCORES_H */
|
#endif /* _LINUX_I2C_OCORES_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue