static void s3c_bat_work(struct work_struct *work) { dev_dbg(dev, "%s\n", __func__); s3c_bat_status_update( &s3c_power_supplies[CHARGER_BATTERY]); }
static void s3c_polling_func(unsigned long unused) { s3c_bat_status_update( &s3c_power_supplies[CHARGER_BATTERY]); mod_timer(&polling_timer, jiffies + msecs_to_jiffies(10000)); }
static int __devinit s3c_bat_probe(struct platform_device *pdev) { int i; int ret = 0; dev = &pdev->dev; dev_info(dev, "%s\n", __func__); s3c_bat_info.present = 1; s3c_bat_info.bat_info.batt_id = 0; s3c_bat_info.bat_info.batt_vol = 0; s3c_bat_info.bat_info.batt_vol_adc = 0; s3c_bat_info.bat_info.batt_vol_adc_cal = 0; s3c_bat_info.bat_info.batt_temp = 0; s3c_bat_info.bat_info.batt_temp_adc = 0; s3c_bat_info.bat_info.batt_temp_adc_cal = 0; s3c_bat_info.bat_info.batt_current = 0; s3c_bat_info.bat_info.level = 0; s3c_bat_info.bat_info.charging_source = CHARGER_BATTERY; s3c_bat_info.bat_info.charging_enabled = 0; s3c_bat_info.bat_info.batt_health = POWER_SUPPLY_HEALTH_GOOD; /* init power supplier framework */ for (i = 0; i < ARRAY_SIZE(s3c_power_supplies); i++) { ret = power_supply_register(&pdev->dev, &s3c_power_supplies[i]); if (ret) { dev_err(dev, "Failed to register" "power supply %d,%d\n", i, ret); goto __end__; } } /* create sec detail attributes */ s3c_bat_create_attrs(s3c_power_supplies[CHARGER_BATTERY].dev); s3c_battery_initial = 1; force_update = 0; s3c_bat_status_update( &s3c_power_supplies[CHARGER_BATTERY]); __end__: return ret; }
static ssize_t s3c_bat_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int x = 0; int ret = 0; const ptrdiff_t off = attr - s3c_battery_attrs; switch (off) { case BATT_VOL_ADC_CAL: if (sscanf(buf, "%d\n", &x) == 1) { s3c_bat_info.bat_info.batt_vol_adc_cal = x; s3c_bat_set_vol_cal(x); ret = count; } dev_info(dev, "%s: batt_vol_adc_cal = %d\n", __func__, x); break; case BATT_TEMP_ADC_CAL: if (sscanf(buf, "%d\n", &x) == 1) { s3c_bat_info.bat_info.batt_temp_adc_cal = x; ret = count; } dev_info(dev, "%s: batt_temp_adc_cal = %d\n", __func__, x); break; #ifdef __TEST_MODE_INTERFACE__ case BATT_TEST_MODE: if (sscanf(buf, "%d\n", &x) == 1) { s3c_bat_info.bat_info.batt_test_mode = x; ret = count; } if (s3c_bat_info.bat_info.batt_test_mode) { s3c_bat_info.polling_interval = POLLING_INTERVAL_TEST; if (s3c_bat_info.polling) { del_timer_sync(&polling_timer); mod_timer(&polling_timer, jiffies + msecs_to_jiffies(s3c_bat_info.polling_interval)); } s3c_bat_status_update( &s3c_power_supplies_test[CHARGER_BATTERY]); } else { s3c_bat_info.polling_interval = POLLING_INTERVAL; if (s3c_bat_info.polling) { del_timer_sync(&polling_timer); mod_timer(&polling_timer,jiffies + msecs_to_jiffies(s3c_bat_info.polling_interval)); } s3c_bat_status_update( &s3c_power_supplies_test[CHARGER_BATTERY]); } dev_info(dev, "%s: batt_test_mode = %d\n", __func__, x); break; #endif /* __TEST_MODE_INTERFACE__ */ case BATT_RESET_SOC: if (sscanf(buf, "%d\n", &x) == 1) { if (x == 1) fg_reset_soc(); ret = count; } dev_info(dev, "%s: Reset SOC:%d\n", __func__, x); break; case BATT_MAX_SOC: if (sscanf(buf, "%d\n", &x)) { if (x && x<=100) s3c_bat_info.max_soc_value=x; ret = count; } dev_info(dev, "%s: Max SOC:%d\n", __func__, x); break; #ifdef S3C_CALL_STATE case BATT_VOICE_CALL_2G: if (sscanf(buf, "%d\n", &x) == 1) { if(x) call_state |= OFFSET_VOICE_CALL_2G; else call_state &= ~OFFSET_VOICE_CALL_2G; ret = count; } printk("%s: voice call 2G = %d\n", __func__, x); break; case BATT_VOICE_CALL_3G: if (sscanf(buf, "%d\n", &x) == 1) { if(x) call_state |= OFFSET_VOICE_CALL_3G; else call_state &= ~OFFSET_VOICE_CALL_3G; ret = count; } printk("%s: voice call 3G = %d\n", __func__, x); break; #endif default: ret = -EINVAL; } return ret; }
static int __devinit s3c_bat_probe(struct platform_device *pdev) { int i; int ret = 0; dev = &pdev->dev; dev_info(dev, "%s\n", __func__); s3c_bat_info.present = 1; s3c_bat_info.polling = 1; s3c_bat_info.polling_interval = POLLING_INTERVAL; s3c_bat_info.device_state = 0; s3c_bat_info.bat_info.batt_vol_adc_aver = 0; #ifdef __TEST_MODE_INTERFACE__ s3c_bat_info.bat_info.batt_vol_aver = 0; s3c_bat_info.bat_info.batt_temp_aver = 0; s3c_bat_info.bat_info.batt_temp_adc_aver = 0; s3c_bat_info.bat_info.batt_v_f_adc = 0; s3c_bat_info.bat_info.batt_test_mode = 0; s3c_power_supplies_test = s3c_power_supplies; #endif /* __TEST_MODE_INTERFACE__ */ s3c_bat_info.bat_info.batt_id = 0; s3c_bat_info.bat_info.batt_vol = 0; s3c_bat_info.bat_info.batt_vol_adc = 0; s3c_bat_info.bat_info.batt_vol_adc_cal = 0; s3c_bat_info.bat_info.batt_temp = 0; s3c_bat_info.bat_info.batt_temp_adc = 0; s3c_bat_info.bat_info.batt_temp_adc_cal = 0; s3c_bat_info.bat_info.batt_current = 0; s3c_bat_info.bat_info.level = 100; s3c_bat_info.bat_info.charging_source = CHARGER_BATTERY; s3c_bat_info.bat_info.charging_enabled = 0; s3c_bat_info.bat_info.batt_health = POWER_SUPPLY_HEALTH_GOOD; s3c_bat_info.max_soc_value=96; memset(adc_sample, 0x00, sizeof adc_sample); batt_max = BATT_CAL + BATT_MAXIMUM; batt_full = BATT_CAL + BATT_FULL; batt_safe_rech = BATT_CAL + BATT_SAFE_RECHARGE; batt_almost = BATT_CAL + BATT_ALMOST_FULL; batt_high = BATT_CAL + BATT_HIGH; batt_medium = BATT_CAL + BATT_MED; batt_low = BATT_CAL + BATT_LOW; batt_critical = BATT_CAL + BATT_CRITICAL; batt_min = BATT_CAL + BATT_MINIMUM; batt_off = BATT_CAL + BATT_OFF; INIT_WORK(&bat_work, s3c_bat_work); INIT_WORK(&cable_work, s3c_cable_work); #ifdef COMPENSATE_BOOTING INIT_WORK(&compensate_boot_work, s3c_compensate_boot_work); batt_drv_wqueue = create_singlethread_workqueue("batt_drv_workqueue"); #endif /* COMPENSATE_BOOTING */ /* init power supplier framework */ for (i = 0; i < ARRAY_SIZE(s3c_power_supplies); i++) { ret = power_supply_register(&pdev->dev, &s3c_power_supplies[i]); if (ret) { dev_err(dev, "Failed to register" "power supply %d,%d\n", i, ret); goto __end__; } } /* create sec detail attributes */ s3c_bat_create_attrs(s3c_power_supplies[CHARGER_BATTERY].dev); #ifdef __TEST_DEVICE_DRIVER__ s3c_test_create_attrs(s3c_power_supplies[CHARGER_AC].dev); #endif /* __TEST_DEVICE_DRIVER__ */ /* Request IRQ */ set_irq_type(IRQ_TA_CONNECTED_N, IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_TA_CONNECTED_N, s3c_cable_changed_isr, IRQF_DISABLED, DRIVER_NAME, &s3c_power_supplies[CHARGER_BATTERY]); if(ret) goto __end__; set_irq_type(IRQ_TA_CHG_N, IRQ_TYPE_EDGE_BOTH); ret = request_irq(IRQ_TA_CHG_N, s3c_cable_charging_isr, IRQF_DISABLED, DRIVER_NAME, &s3c_power_supplies[CHARGER_BATTERY]); if (ret) goto __ta_connected_irq_failed__; if (s3c_bat_info.polling) { dev_dbg(dev, "%s: will poll for status\n", __func__); setup_timer(&polling_timer, polling_timer_func, 0); mod_timer(&polling_timer, jiffies + msecs_to_jiffies(s3c_bat_info.polling_interval)); } setup_timer(&cable_timer, cable_timer_func, 0); s3c_battery_initial = 1; force_update = 0; full_charge_flag = 0; s3c_bat_status_update( &s3c_power_supplies[CHARGER_BATTERY]); #ifdef __CHECK_BATTERY_V_F__ s3c_bat_check_v_f(); #endif /* __CHECK_BATTERY_V_F__ */ s3c_cable_check_status(); __end__: return ret; __ta_connected_irq_failed__: free_irq(IRQ_TA_CONNECTED_N, &s3c_power_supplies[CHARGER_BATTERY]); return ret; }