1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26#include <linux/kernel.h>
27#include <linux/platform_device.h>
28#include <linux/i2c.h>
29#include <linux/i2c-omap.h>
30#include <linux/slab.h>
31#include <linux/err.h>
32#include <linux/clk.h>
33
34#include <plat/i2c.h>
35
36#define OMAP_I2C_MAX_CONTROLLERS 4
37static struct omap_i2c_bus_platform_data i2c_pdata[OMAP_I2C_MAX_CONTROLLERS];
38
39#define OMAP_I2C_CMDLINE_SETUP (BIT(31))
40
41
42
43
44
45
46
47
48
49
50
51
52static int __init omap_i2c_bus_setup(char *str)
53{
54 int ints[3];
55
56 get_options(str, 3, ints);
57 if (ints[0] < 2 || ints[1] < 1 ||
58 ints[1] > OMAP_I2C_MAX_CONTROLLERS)
59 return 0;
60 i2c_pdata[ints[1] - 1].clkrate = ints[2];
61 i2c_pdata[ints[1] - 1].clkrate |= OMAP_I2C_CMDLINE_SETUP;
62
63 return 1;
64}
65__setup("i2c_bus=", omap_i2c_bus_setup);
66
67
68
69
70
71int __init omap_register_i2c_bus_cmdline(void)
72{
73 int i, err = 0;
74
75 for (i = 0; i < ARRAY_SIZE(i2c_pdata); i++)
76 if (i2c_pdata[i].clkrate & OMAP_I2C_CMDLINE_SETUP) {
77 i2c_pdata[i].clkrate &= ~OMAP_I2C_CMDLINE_SETUP;
78 err = omap_i2c_add_bus(&i2c_pdata[i], i + 1);
79 if (err)
80 goto out;
81 }
82
83out:
84 return err;
85}
86
87
88
89
90
91
92
93
94
95
96int __init omap_register_i2c_bus(int bus_id, u32 clkrate,
97 struct i2c_board_info const *info,
98 unsigned len)
99{
100 int err;
101
102 BUG_ON(bus_id < 1 || bus_id > OMAP_I2C_MAX_CONTROLLERS);
103
104 if (info) {
105 err = i2c_register_board_info(bus_id, info, len);
106 if (err)
107 return err;
108 }
109
110 if (!i2c_pdata[bus_id - 1].clkrate)
111 i2c_pdata[bus_id - 1].clkrate = clkrate;
112
113 i2c_pdata[bus_id - 1].clkrate &= ~OMAP_I2C_CMDLINE_SETUP;
114
115 return omap_i2c_add_bus(&i2c_pdata[bus_id - 1], bus_id);
116}
117