diff options
Diffstat (limited to 'drivers/i2c')
-rw-r--r-- | drivers/i2c/busses/i2c-powermac.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/i2c/busses/i2c-powermac.c b/drivers/i2c/busses/i2c-powermac.c index 0e7b1c6724aa..60ca91745e55 100644 --- a/drivers/i2c/busses/i2c-powermac.c +++ b/drivers/i2c/busses/i2c-powermac.c | |||
@@ -259,6 +259,35 @@ static int __devinit i2c_powermac_probe(struct platform_device *dev) | |||
259 | } | 259 | } |
260 | 260 | ||
261 | printk(KERN_INFO "PowerMac i2c bus %s registered\n", name); | 261 | printk(KERN_INFO "PowerMac i2c bus %s registered\n", name); |
262 | |||
263 | if (!strncmp(basename, "uni-n", 5)) { | ||
264 | struct device_node *np; | ||
265 | const u32 *prop; | ||
266 | struct i2c_board_info info; | ||
267 | |||
268 | /* Instantiate I2C motion sensor if present */ | ||
269 | np = of_find_node_by_name(NULL, "accelerometer"); | ||
270 | if (np && of_device_is_compatible(np, "AAPL,accelerometer_1") && | ||
271 | (prop = of_get_property(np, "reg", NULL))) { | ||
272 | int i2c_bus; | ||
273 | const char *tmp_bus; | ||
274 | |||
275 | /* look for bus either using "reg" or by path */ | ||
276 | tmp_bus = strstr(np->full_name, "/i2c-bus@"); | ||
277 | if (tmp_bus) | ||
278 | i2c_bus = *(tmp_bus + 9) - '0'; | ||
279 | else | ||
280 | i2c_bus = ((*prop) >> 8) & 0x0f; | ||
281 | |||
282 | if (pmac_i2c_get_channel(bus) == i2c_bus) { | ||
283 | memset(&info, 0, sizeof(struct i2c_board_info)); | ||
284 | info.addr = ((*prop) & 0xff) >> 1; | ||
285 | strlcpy(info.type, "ams", I2C_NAME_SIZE); | ||
286 | i2c_new_device(adapter, &info); | ||
287 | } | ||
288 | } | ||
289 | } | ||
290 | |||
262 | return rc; | 291 | return rc; |
263 | } | 292 | } |
264 | 293 | ||