418 if (!master->device) { |
418 if (!master->device) { |
419 EC_ERR("Master %i has no assigned device!\n", master_index); |
419 EC_ERR("Master %i has no assigned device!\n", master_index); |
420 goto out_release; |
420 goto out_release; |
421 } |
421 } |
422 |
422 |
423 if (!try_module_get(master->device->module)) { |
423 if (!try_module_get(master->device->module)) { // possible race? |
424 EC_ERR("Failed to reserve device module!\n"); |
424 EC_ERR("Failed to reserve device module!\n"); |
425 goto out_release; |
425 goto out_release; |
426 } |
426 } |
427 |
427 |
428 ec_master_measure_bus_time(master); |
428 if (!master->device->link_state) { |
429 ec_master_idle_stop(master); |
429 EC_ERR("Link is DOWN.\n"); |
430 ec_master_reset(master); |
430 goto out_module_put; |
|
431 } |
|
432 |
|
433 ec_master_reset(master); // also stops idle mode |
431 master->mode = EC_MASTER_MODE_OPERATION; |
434 master->mode = EC_MASTER_MODE_OPERATION; |
432 |
435 |
433 if (!master->device->link_state) EC_WARN("Link is DOWN.\n"); |
436 if (ec_master_measure_bus_time(master)) { |
|
437 EC_ERR("Bus time measuring failed!\n"); |
|
438 goto out_reset; |
|
439 } |
434 |
440 |
435 if (ec_master_bus_scan(master)) { |
441 if (ec_master_bus_scan(master)) { |
436 EC_ERR("Bus scan failed!\n"); |
442 EC_ERR("Bus scan failed!\n"); |
437 goto out_module_put; |
443 goto out_reset; |
438 } |
444 } |
439 |
445 |
440 EC_INFO("Master %i is ready.\n", master_index); |
446 EC_INFO("Successfully requested master %i.\n", master_index); |
441 return master; |
447 return master; |
442 |
448 |
|
449 out_reset: |
|
450 ec_master_reset(master); |
|
451 ec_master_idle_start(master); |
443 out_module_put: |
452 out_module_put: |
444 module_put(master->device->module); |
453 module_put(master->device->module); |
445 ec_master_reset(master); |
|
446 ec_master_idle_start(master); |
|
447 out_release: |
454 out_release: |
448 master->reserved = 0; |
455 master->reserved = 0; |
449 out_return: |
456 out_return: |
450 EC_ERR("Failed requesting master %i.\n", master_index); |
457 EC_ERR("Failed to request master %i.\n", master_index); |
451 return NULL; |
458 return NULL; |
452 } |
459 } |
453 |
460 |
454 /*****************************************************************************/ |
461 /*****************************************************************************/ |
455 |
462 |
471 ec_master_idle_start(master); |
478 ec_master_idle_start(master); |
472 |
479 |
473 module_put(master->device->module); |
480 module_put(master->device->module); |
474 master->reserved = 0; |
481 master->reserved = 0; |
475 |
482 |
476 EC_INFO("Released master %i.\n", master->index); |
483 EC_INFO("Successfully released master %i.\n", master->index); |
477 return; |
484 return; |
478 } |
485 } |
479 |
486 |
480 /*****************************************************************************/ |
487 /*****************************************************************************/ |
481 |
488 |