master/module.c
changeset 377 ecac8252f114
parent 361 29af81543ce1
child 378 8fe6cd43787a
equal deleted inserted replaced
376:d1441d87f5c1 377:ecac8252f114
   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