123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- #include <linux/kernel.h>
- #include <linux/platform_device.h>
- #include <linux/i2c.h>
- #include <linux/i2c-omap.h>
- #include <linux/slab.h>
- #include <linux/err.h>
- #include <linux/clk.h>
- #include <plat/i2c.h>
- #define OMAP_I2C_MAX_CONTROLLERS 4
- static struct omap_i2c_bus_platform_data i2c_pdata[OMAP_I2C_MAX_CONTROLLERS];
- #define OMAP_I2C_CMDLINE_SETUP (BIT(31))
- static int __init omap_i2c_bus_setup(char *str)
- {
- int ints[3];
- get_options(str, 3, ints);
- if (ints[0] < 2 || ints[1] < 1 ||
- ints[1] > OMAP_I2C_MAX_CONTROLLERS)
- return 0;
- i2c_pdata[ints[1] - 1].clkrate = ints[2];
- i2c_pdata[ints[1] - 1].clkrate |= OMAP_I2C_CMDLINE_SETUP;
- return 1;
- }
- __setup("i2c_bus=", omap_i2c_bus_setup);
- int __init omap_register_i2c_bus_cmdline(void)
- {
- int i, err = 0;
- for (i = 0; i < ARRAY_SIZE(i2c_pdata); i++)
- if (i2c_pdata[i].clkrate & OMAP_I2C_CMDLINE_SETUP) {
- i2c_pdata[i].clkrate &= ~OMAP_I2C_CMDLINE_SETUP;
- err = omap_i2c_add_bus(&i2c_pdata[i], i + 1);
- if (err)
- goto out;
- }
- out:
- return err;
- }
- int __init omap_register_i2c_bus(int bus_id, u32 clkrate,
- struct i2c_board_info const *info,
- unsigned len)
- {
- int err;
- BUG_ON(bus_id < 1 || bus_id > OMAP_I2C_MAX_CONTROLLERS);
- if (info) {
- err = i2c_register_board_info(bus_id, info, len);
- if (err)
- return err;
- }
- if (!i2c_pdata[bus_id - 1].clkrate)
- i2c_pdata[bus_id - 1].clkrate = clkrate;
- i2c_pdata[bus_id - 1].clkrate &= ~OMAP_I2C_CMDLINE_SETUP;
- return omap_i2c_add_bus(&i2c_pdata[bus_id - 1], bus_id);
- }
|