static int tegra_battery_probe(struct platform_device *pdev) { int i, rc; NvBool result; batt_dev = kzalloc(sizeof(*batt_dev), GFP_KERNEL); if (!batt_dev) { return -ENOMEM; } memset(batt_dev, 0, sizeof(*batt_dev)); /* Assume battery is present at start */ batt_dev->present = 1; batt_dev->batt_id = 0; batt_dev->charging_source = NvCharger_Type_AC; batt_dev->charging_enabled = NvCharge_Control_Charging_Enable; result = NvOdmBatteryDeviceOpen(&(batt_dev->hOdmBattDev), NULL); if (!result) { pr_err("NvOdmBatteryDeviceOpen FAILED\n"); goto err; } for (i = 0; i < ARRAY_SIZE(tegra_supplies); i++) { rc = power_supply_register(&pdev->dev, &tegra_supplies[i]); if (rc) { printk(KERN_ERR "Failed to register power supply\n"); while (i--) power_supply_unregister(&tegra_supplies[i]); kfree(batt_dev); return rc; } } printk(KERN_INFO "%s: battery driver registered\n", pdev->name); batt_dev->batt_status_poll_period = NVBATTERY_POLLING_INTERVAL; setup_timer(&(batt_dev->battery_poll_timer), tegra_battery_poll_timer_func, 0); mod_timer(&(batt_dev->battery_poll_timer), jiffies + msecs_to_jiffies(batt_dev->batt_status_poll_period)); rc = device_create_file(&pdev->dev, &tegra_battery_attr); if (rc) { for (i = 0; i < ARRAY_SIZE(tegra_supplies); i++) { power_supply_unregister(&tegra_supplies[i]); } del_timer_sync(&(batt_dev->battery_poll_timer)); pr_err("tegra_battery_probe:device_create_file FAILED"); return rc; } return 0; err: if (batt_dev) { kfree(batt_dev); batt_dev = NULL; } return -1; }
static int nvec_battery_probe(struct nvec_device *pdev) { int i, rc; NvError ErrorStatus = NvSuccess; NvBool result = NV_FALSE; batt_dev = kzalloc(sizeof(struct tegra_battery_dev), GFP_KERNEL); if (!batt_dev) { pr_err("nvec_battery_probe:NOMEM\n"); return -ENOMEM; } ErrorStatus = NvOsMutexCreate(&batt_dev->hBattEventMutex); if (NvSuccess != ErrorStatus) { pr_err("NvOsMutexCreate Failed!\n"); goto Cleanup; } ErrorStatus = NvOsSemaphoreCreate(&batt_dev->hOdmSemaphore, 0); if (NvSuccess != ErrorStatus) { pr_err("NvOsSemaphoreCreate Failed!\n"); goto Cleanup; } /*Henry++ adjust thread to be createn at last batt_dev->exitThread = NV_FALSE; batt_dev->inSuspend = NV_FALSE; ErrorStatus = NvOsThreadCreate(NvBatteryEventHandlerThread, batt_dev, &(batt_dev->hBattEventThread)); if (NvSuccess != ErrorStatus) { pr_err("NvOsThreadCreate FAILED\n"); goto Cleanup; } */ //Henry add retry when fail **** for(i=0;i<BATTERY_RETRY_TIMES;i++){ result = NvOdmBatteryDeviceOpen(&(batt_dev->hOdmBattDev), (NvOdmOsSemaphoreHandle *)&batt_dev->hOdmSemaphore); if (!result || !batt_dev->hOdmBattDev) { pr_err("NvOdmBatteryDeviceOpen FAILED,retry i=%i\n",i); NvOsWaitUS(10000); continue; } else{ break; } } if(i==BATTERY_RETRY_TIMES){ pr_err("NvOdmBatteryDeviceOpen FAILED\n"); goto Cleanup; } //****************************** for (i = 0; i < ARRAY_SIZE(tegra_power_supplies); i++) { if (power_supply_register(&pdev->dev, &tegra_power_supplies[i])) pr_err("Failed to register power supply\n"); } batt_dev->batt_status_poll_period = NVBATTERY_POLLING_INTERVAL; rc = device_create_file(&pdev->dev, &tegra_battery_attr); if (rc) { for (i = 0; i < ARRAY_SIZE(tegra_power_supplies); i++) { power_supply_unregister(&tegra_power_supplies[i]); } pr_err("nvec_battery_probe:device_create_file FAILED"); goto Cleanup; } //Henry++ adjust thread to be createn at last batt_dev->exitThread = NV_FALSE; batt_dev->inSuspend = NV_FALSE; ErrorStatus = NvOsThreadCreate(NvBatteryEventHandlerThread, batt_dev, &(batt_dev->hBattEventThread)); if (NvSuccess != ErrorStatus) { pr_err("NvOsThreadCreate FAILED\n"); goto Cleanup; } return 0; Cleanup: batt_dev->exitThread = NV_TRUE; if (batt_dev->hOdmSemaphore) { NvOsSemaphoreSignal(batt_dev->hOdmSemaphore); NvOsSemaphoreDestroy(batt_dev->hOdmSemaphore); batt_dev->hOdmSemaphore = NULL; } if (batt_dev->hBattEventThread) { NvOsThreadJoin(batt_dev->hBattEventThread); } if (batt_dev->hBattEventMutex) { NvOsMutexDestroy(batt_dev->hBattEventMutex); batt_dev->hBattEventMutex = NULL; } if (batt_dev->hOdmBattDev) { NvOdmBatteryDeviceClose(batt_dev->hOdmBattDev); batt_dev->hOdmBattDev = NULL; } kfree(batt_dev); batt_dev = NULL; //return -1; return 0; //henry++ workaround system can't enter suspend }
static int nvec_battery_probe(struct nvec_device *pdev) { int i, rc; NvError ErrorStatus = NvSuccess; NvBool result = NV_FALSE; batt_dev = kzalloc(sizeof(struct tegra_battery_dev), GFP_KERNEL); if (!batt_dev) { pr_err("nvec_battery_probe:NOMEM\n"); return -ENOMEM; } ErrorStatus = NvOsSemaphoreCreate(&batt_dev->hOdmSemaphore, 0); if (NvSuccess != ErrorStatus) { pr_err("NvOsSemaphoreCreate Failed!\n"); goto Cleanup; } batt_dev->exitThread = NV_FALSE; ErrorStatus = NvOsThreadCreate(NvBatteryEventHandlerThread, batt_dev, &(batt_dev->hBattEventThread)); if (NvSuccess != ErrorStatus) { pr_err("NvOsThreadCreate FAILED\n"); goto Cleanup; } result = NvOdmBatteryDeviceOpen(&(batt_dev->hOdmBattDev), (NvOdmOsSemaphoreHandle *)&batt_dev->hOdmSemaphore, &(batt_dev->ec_version)); //Daniel 20100823, put ec version to fs. if (!result || !batt_dev->hOdmBattDev) { pr_err("NvOdmBatteryDeviceOpen FAILED\n"); goto Cleanup; } for (i = 0; i < ARRAY_SIZE(tegra_power_supplies); i++) { if (power_supply_register(&pdev->dev, &tegra_power_supplies[i])) pr_err("Failed to register power supply\n"); } batt_dev->batt_status_poll_period = NVBATTERY_POLLING_INTERVAL_MILLISECS; setup_timer(&(batt_dev->battery_poll_timer), tegra_battery_poll_timer_func, 0); mod_timer(&(batt_dev->battery_poll_timer), jiffies + msecs_to_jiffies(batt_dev->batt_status_poll_period)); rc = device_create_file(&pdev->dev, &tegra_battery_attr); rc = device_create_file(&pdev->dev, &tegra_battery_version); //Daniel 20100823, put ec version to fs if (rc) { for (i = 0; i < ARRAY_SIZE(tegra_power_supplies); i++) { power_supply_unregister(&tegra_power_supplies[i]); } del_timer_sync(&(batt_dev->battery_poll_timer)); pr_err("nvec_battery_probe:device_create_file FAILED"); goto Cleanup; } return 0; Cleanup: batt_dev->exitThread = NV_TRUE; if (batt_dev->hOdmSemaphore) { NvOsSemaphoreSignal(batt_dev->hOdmSemaphore); NvOsSemaphoreDestroy(batt_dev->hOdmSemaphore); batt_dev->hOdmSemaphore = NULL; } if (batt_dev->hBattEventThread) { NvOsThreadJoin(batt_dev->hBattEventThread); } if (batt_dev->hOdmBattDev) { NvOdmBatteryDeviceClose(batt_dev->hOdmBattDev); batt_dev->hOdmBattDev = NULL; } kfree(batt_dev); batt_dev = NULL; return -1; }