diff options
-rw-r--r-- | drivers/i2c/i2c-core.c | 126 | ||||
-rw-r--r-- | include/linux/i2c.h | 1 |
2 files changed, 101 insertions, 26 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index a7dcdc69b9e7..c50229bd9f85 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -320,38 +320,19 @@ static void i2c_scan_static_board_info(struct i2c_adapter *adapter) | |||
320 | mutex_unlock(&__i2c_board_lock); | 320 | mutex_unlock(&__i2c_board_lock); |
321 | } | 321 | } |
322 | 322 | ||
323 | 323 | static int i2c_register_adapter(struct i2c_adapter *adap) | |
324 | /* ----- | ||
325 | * i2c_add_adapter is called from within the algorithm layer, | ||
326 | * when a new hw adapter registers. A new device is register to be | ||
327 | * available for clients. | ||
328 | */ | ||
329 | int i2c_add_adapter(struct i2c_adapter *adap) | ||
330 | { | 324 | { |
331 | int id, res = 0; | 325 | int res = 0; |
332 | struct list_head *item; | 326 | struct list_head *item; |
333 | struct i2c_driver *driver; | 327 | struct i2c_driver *driver; |
334 | 328 | ||
335 | mutex_lock(&core_lists); | ||
336 | |||
337 | if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) { | ||
338 | res = -ENOMEM; | ||
339 | goto out_unlock; | ||
340 | } | ||
341 | |||
342 | res = idr_get_new(&i2c_adapter_idr, adap, &id); | ||
343 | if (res < 0) { | ||
344 | if (res == -EAGAIN) | ||
345 | res = -ENOMEM; | ||
346 | goto out_unlock; | ||
347 | } | ||
348 | |||
349 | adap->nr = id & MAX_ID_MASK; | ||
350 | mutex_init(&adap->bus_lock); | 329 | mutex_init(&adap->bus_lock); |
351 | mutex_init(&adap->clist_lock); | 330 | mutex_init(&adap->clist_lock); |
352 | list_add_tail(&adap->list,&adapters); | ||
353 | INIT_LIST_HEAD(&adap->clients); | 331 | INIT_LIST_HEAD(&adap->clients); |
354 | 332 | ||
333 | mutex_lock(&core_lists); | ||
334 | list_add_tail(&adap->list, &adapters); | ||
335 | |||
355 | /* Add the adapter to the driver core. | 336 | /* Add the adapter to the driver core. |
356 | * If the parent pointer is not set up, | 337 | * If the parent pointer is not set up, |
357 | * we add this adapter to the host bus. | 338 | * we add this adapter to the host bus. |
@@ -370,6 +351,10 @@ int i2c_add_adapter(struct i2c_adapter *adap) | |||
370 | 351 | ||
371 | dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); | 352 | dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name); |
372 | 353 | ||
354 | /* create pre-declared device nodes for new-style drivers */ | ||
355 | if (adap->nr < __i2c_first_dynamic_bus_num) | ||
356 | i2c_scan_static_board_info(adap); | ||
357 | |||
373 | /* let legacy drivers scan this bus for matching devices */ | 358 | /* let legacy drivers scan this bus for matching devices */ |
374 | list_for_each(item,&drivers) { | 359 | list_for_each(item,&drivers) { |
375 | driver = list_entry(item, struct i2c_driver, list); | 360 | driver = list_entry(item, struct i2c_driver, list); |
@@ -388,6 +373,93 @@ out_list: | |||
388 | goto out_unlock; | 373 | goto out_unlock; |
389 | } | 374 | } |
390 | 375 | ||
376 | /** | ||
377 | * i2c_add_adapter - declare i2c adapter, use dynamic bus number | ||
378 | * @adapter: the adapter to add | ||
379 | * | ||
380 | * This routine is used to declare an I2C adapter when its bus number | ||
381 | * doesn't matter. Examples: for I2C adapters dynamically added by | ||
382 | * USB links or PCI plugin cards. | ||
383 | * | ||
384 | * When this returns zero, a new bus number was allocated and stored | ||
385 | * in adap->nr, and the specified adapter became available for clients. | ||
386 | * Otherwise, a negative errno value is returned. | ||
387 | */ | ||
388 | int i2c_add_adapter(struct i2c_adapter *adapter) | ||
389 | { | ||
390 | int id, res = 0; | ||
391 | |||
392 | retry: | ||
393 | if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) | ||
394 | return -ENOMEM; | ||
395 | |||
396 | mutex_lock(&core_lists); | ||
397 | /* "above" here means "above or equal to", sigh */ | ||
398 | res = idr_get_new_above(&i2c_adapter_idr, adapter, | ||
399 | __i2c_first_dynamic_bus_num, &id); | ||
400 | mutex_unlock(&core_lists); | ||
401 | |||
402 | if (res < 0) { | ||
403 | if (res == -EAGAIN) | ||
404 | goto retry; | ||
405 | return res; | ||
406 | } | ||
407 | |||
408 | adapter->nr = id; | ||
409 | return i2c_register_adapter(adapter); | ||
410 | } | ||
411 | EXPORT_SYMBOL(i2c_add_adapter); | ||
412 | |||
413 | /** | ||
414 | * i2c_add_numbered_adapter - declare i2c adapter, use static bus number | ||
415 | * @adap: the adapter to register (with adap->nr initialized) | ||
416 | * | ||
417 | * This routine is used to declare an I2C adapter when its bus number | ||
418 | * matters. Example: for I2C adapters from system-on-chip CPUs, or | ||
419 | * otherwise built in to the system's mainboard, and where i2c_board_info | ||
420 | * is used to properly configure I2C devices. | ||
421 | * | ||
422 | * If no devices have pre-been declared for this bus, then be sure to | ||
423 | * register the adapter before any dynamically allocated ones. Otherwise | ||
424 | * the required bus ID may not be available. | ||
425 | * | ||
426 | * When this returns zero, the specified adapter became available for | ||
427 | * clients using the bus number provided in adap->nr. Also, the table | ||
428 | * of I2C devices pre-declared using i2c_register_board_info() is scanned, | ||
429 | * and the appropriate driver model device nodes are created. Otherwise, a | ||
430 | * negative errno value is returned. | ||
431 | */ | ||
432 | int i2c_add_numbered_adapter(struct i2c_adapter *adap) | ||
433 | { | ||
434 | int id; | ||
435 | int status; | ||
436 | |||
437 | if (adap->nr & ~MAX_ID_MASK) | ||
438 | return -EINVAL; | ||
439 | |||
440 | retry: | ||
441 | if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0) | ||
442 | return -ENOMEM; | ||
443 | |||
444 | mutex_lock(&core_lists); | ||
445 | /* "above" here means "above or equal to", sigh; | ||
446 | * we need the "equal to" result to force the result | ||
447 | */ | ||
448 | status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id); | ||
449 | if (status == 0 && id != adap->nr) { | ||
450 | status = -EBUSY; | ||
451 | idr_remove(&i2c_adapter_idr, id); | ||
452 | } | ||
453 | mutex_unlock(&core_lists); | ||
454 | if (status == -EAGAIN) | ||
455 | goto retry; | ||
456 | |||
457 | if (status == 0) | ||
458 | status = i2c_register_adapter(adap); | ||
459 | return status; | ||
460 | } | ||
461 | EXPORT_SYMBOL_GPL(i2c_add_numbered_adapter); | ||
462 | |||
391 | int i2c_del_adapter(struct i2c_adapter *adap) | 463 | int i2c_del_adapter(struct i2c_adapter *adap) |
392 | { | 464 | { |
393 | struct list_head *item, *_n; | 465 | struct list_head *item, *_n; |
@@ -452,7 +524,7 @@ int i2c_del_adapter(struct i2c_adapter *adap) | |||
452 | /* wait for sysfs to drop all references */ | 524 | /* wait for sysfs to drop all references */ |
453 | wait_for_completion(&adap->dev_released); | 525 | wait_for_completion(&adap->dev_released); |
454 | 526 | ||
455 | /* free dynamically allocated bus id */ | 527 | /* free bus id */ |
456 | idr_remove(&i2c_adapter_idr, adap->nr); | 528 | idr_remove(&i2c_adapter_idr, adap->nr); |
457 | 529 | ||
458 | dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); | 530 | dev_dbg(&adap->dev, "adapter [%s] unregistered\n", adap->name); |
@@ -493,6 +565,9 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) | |||
493 | driver->driver.owner = owner; | 565 | driver->driver.owner = owner; |
494 | driver->driver.bus = &i2c_bus_type; | 566 | driver->driver.bus = &i2c_bus_type; |
495 | 567 | ||
568 | /* for new style drivers, when registration returns the driver core | ||
569 | * will have called probe() for all matching-but-unbound devices. | ||
570 | */ | ||
496 | res = driver_register(&driver->driver); | 571 | res = driver_register(&driver->driver); |
497 | if (res) | 572 | if (res) |
498 | return res; | 573 | return res; |
@@ -1377,7 +1452,6 @@ EXPORT_SYMBOL_GPL(i2c_adapter_dev_release); | |||
1377 | EXPORT_SYMBOL_GPL(i2c_adapter_class); | 1452 | EXPORT_SYMBOL_GPL(i2c_adapter_class); |
1378 | EXPORT_SYMBOL_GPL(i2c_bus_type); | 1453 | EXPORT_SYMBOL_GPL(i2c_bus_type); |
1379 | 1454 | ||
1380 | EXPORT_SYMBOL(i2c_add_adapter); | ||
1381 | EXPORT_SYMBOL(i2c_del_adapter); | 1455 | EXPORT_SYMBOL(i2c_del_adapter); |
1382 | EXPORT_SYMBOL(i2c_del_driver); | 1456 | EXPORT_SYMBOL(i2c_del_driver); |
1383 | EXPORT_SYMBOL(i2c_attach_client); | 1457 | EXPORT_SYMBOL(i2c_attach_client); |
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 382a43bf3ad5..36d6814a6df4 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
@@ -363,6 +363,7 @@ struct i2c_client_address_data { | |||
363 | */ | 363 | */ |
364 | extern int i2c_add_adapter(struct i2c_adapter *); | 364 | extern int i2c_add_adapter(struct i2c_adapter *); |
365 | extern int i2c_del_adapter(struct i2c_adapter *); | 365 | extern int i2c_del_adapter(struct i2c_adapter *); |
366 | extern int i2c_add_numbered_adapter(struct i2c_adapter *); | ||
366 | 367 | ||
367 | extern int i2c_register_driver(struct module *, struct i2c_driver *); | 368 | extern int i2c_register_driver(struct module *, struct i2c_driver *); |
368 | extern int i2c_del_driver(struct i2c_driver *); | 369 | extern int i2c_del_driver(struct i2c_driver *); |