int _get_t2adc_data_( int ch ) { int ret = 0; int val[5]; int i; struct twl4030_madc_request req; // To control thermal sensor power gpio_set_value(OMAP_GPIO_EN_TEMP_VDD, 1); if ( ch >= 1 && ch <= 7 ){ turn_resources_on_for_adc(); twl_i2c_write_u8( TWL4030_MODULE_USB, SEL_MADC_MCPC, CARKIT_ANA_CTRL ); msleep(100); } req.channels = ( 1 << ch ); req.do_avg = 0; req.method = TWL4030_MADC_SW1; req.active = 0; req.func_cb = NULL; #if 0 twl4030_madc_conversion( &req ); ret = req.rbuf[ch]; #else for ( i = 0; i < 5 ; i++ ) { twl4030_madc_conversion( &req ); val[i] = req.rbuf[ch]; } ret = _get_average_value_( val, 5 ); #endif if ( ch >= 1 && ch <= 7 ){ turn_resources_off_for_adc(); } // To control thermal sensor power gpio_set_value(OMAP_GPIO_EN_TEMP_VDD, 0); return ret; }
int _get_t2adc_data_( int ch ) // ---------------------------------------------------------------------------- // Description : // Input Argument : // Return Value : { int ret = 0; int val[5]; int i; //u8 ana_val; struct twl4030_madc_request req; // mutex_lock( &battery_lock ); // msleep( 100 ); wake_lock(&adc_wakelock); if ( ch >= 1 && ch <= 7 ) { turn_resources_on_for_adc(); //msleep(100); //twl4030_i2c_read_u8(TWL4030_MODULE_USB, &ana_val, CARKIT_ANA_CTRL); twl_i2c_write_u8( TWL4030_MODULE_USB, SEL_MADC_MCPC, CARKIT_ANA_CTRL ); msleep(100); } #if 0 req.channels = ( 1 << ch ); req.do_avg = 0; req.method = TWL4030_MADC_SW1; req.active = 0; req.func_cb = NULL; twl4030_madc_conversion( &req ); ret = req.rbuf[ch]; #else req.channels = ( 1 << ch ); req.do_avg = 0; req.method = TWL4030_MADC_SW1; req.active = 0; req.func_cb = NULL; for ( i = 0; i < 5 ; i++ ) { twl4030_madc_conversion( &req ); val[i] = req.rbuf[ch]; } ret = _get_average_value_( val, 5 ); #endif if ( ch >= 1 && ch <= 7 ) { //twl4030_i2c_write_u8( TWL4030_MODULE_USB, ana_val, CARKIT_ANA_CTRL ); // rechg egkim turn_resources_off_for_adc(); } wake_unlock(&adc_wakelock); // mutex_unlock( &battery_lock ); return ret; }
static int __devinit battery_probe( struct platform_device *pdev ) // ---------------------------------------------------------------------------- // Description : probe function for battery driver. // Input Argument : // Return Value : { int ret = 0; int i = 0; int Debug_Usepopup = 1; struct battery_device_info *di; printk( "[BR] Battery Probe...\n\n" ); this_dev = &pdev->dev; di = kzalloc( sizeof(*di), GFP_KERNEL ); if(!di) return -ENOMEM; platform_set_drvdata( pdev, di ); di->dev = &pdev->dev; device_config = pdev->dev.platform_data; INIT_DELAYED_WORK( &di->battery_monitor_work, battery_monitor_work_handler ); // [ USE_REGULATOR di->usb3v1 = regulator_get( &pdev->dev, "usb3v1" ); if( IS_ERR( di->usb3v1 ) ) goto fail_regulator1; di->usb1v8 = regulator_get( &pdev->dev, "usb1v8" ); if( IS_ERR( di->usb1v8 ) ) goto fail_regulator2; di->usb1v5 = regulator_get( &pdev->dev, "usb1v5" ); if( IS_ERR( di->usb1v5 ) ) goto fail_regulator3; // ] /*Create power supplies*/ di->sec_battery.name = "battery"; di->sec_battery.type = POWER_SUPPLY_TYPE_BATTERY; di->sec_battery.properties = samsung_battery_props; di->sec_battery.num_properties = ARRAY_SIZE( samsung_battery_props ); di->sec_battery.get_property = samsung_battery_get_property; di->sec_battery.external_power_changed = samsung_pwr_external_power_changed; //di->sec_battery.use_for_apm = 1; di->sec_ac.name = "ac"; di->sec_ac.type = POWER_SUPPLY_TYPE_MAINS; di->sec_ac.supplied_to = samsung_bci_supplied_to; di->sec_ac.num_supplicants = ARRAY_SIZE( samsung_bci_supplied_to ); di->sec_ac.properties = samsung_ac_props; di->sec_ac.num_properties = ARRAY_SIZE( samsung_ac_props ); di->sec_ac.get_property = samsung_ac_get_property; di->sec_ac.external_power_changed = samsung_pwr_external_power_changed; di->sec_usb.name = "usb"; di->sec_usb.type = POWER_SUPPLY_TYPE_USB; di->sec_usb.supplied_to = samsung_bci_supplied_to; di->sec_usb.num_supplicants = ARRAY_SIZE( samsung_bci_supplied_to ); di->sec_usb.properties = samsung_usb_props; di->sec_usb.num_properties = ARRAY_SIZE( samsung_usb_props ); di->sec_usb.get_property = samsung_usb_get_property; di->sec_usb.external_power_changed = samsung_pwr_external_power_changed; ret = power_supply_register( &pdev->dev, &di->sec_battery ); if( ret ) { printk( "failed to register main battery, charger\n" ); goto batt_regi_fail1; } ret = power_supply_register( &pdev->dev, &di->sec_ac ); if( ret ) { printk( "failed to register ac\n" ); goto batt_regi_fail2; } ret = power_supply_register( &pdev->dev, &di->sec_usb ); if( ret ) { printk( "failed to register usb\n" ); goto batt_regi_fail3; } ret = sysfs_create_file( &di->sec_battery.dev->kobj, &batt_vol_toolow.attr ); if ( ret ) { printk( "sysfs create fail - %s\n", batt_vol_toolow.attr.name ); } ret = sysfs_create_file( &di->sec_battery.dev->kobj, &charging_source.attr ); if ( ret ) { printk( "sysfs create fail - %s\n", charging_source.attr.name ); } for( i = 0; i < ARRAY_SIZE( batt_sysfs_testmode ); i++ ) { ret = sysfs_create_file( &di->sec_battery.dev->kobj, &batt_sysfs_testmode[i].attr ); if ( ret ) { printk( "sysfs create fail - %s\n", batt_sysfs_testmode[i].attr.name ); } } // Init. ADC turn_resources_on_for_adc(); twl_i2c_write_u8( TWL4030_MODULE_USB, SEL_MADC_MCPC, CARKIT_ANA_CTRL ); turn_resources_off_for_adc(); batt_gptimer_12.name = "samsung_battery_timer"; batt_gptimer_12.expire_time =(unsigned int) MONITOR_DURATION_DUR_SLEEP; batt_gptimer_12.expire_callback = &battery_monitor_fleeting_wakeup_handler; batt_gptimer_12.data = (unsigned long) di; #if defined(CONFIG_SAMSUNG_ARCHER_TARGET_SK) if ( sec_get_param_value ) { sec_get_param_value(__DEBUG_BLOCKPOPUP, &Debug_Usepopup); } #endif if ( (Debug_Usepopup & 0x1) == 1 ) { sec_bci.battery.support_monitor_temp = 1; sec_bci.battery.support_monitor_timeout = 1; sec_bci.battery.support_monitor_full = 1; } else if ( (Debug_Usepopup & 0x1) == 0 ) { sec_bci.battery.support_monitor_temp = 0; sec_bci.battery.support_monitor_timeout = 0; sec_bci.battery.support_monitor_full = 0; } //schedule_delayed_work( &di->battery_monitor_work, 3*HZ ); queue_delayed_work( sec_bci.sec_battery_workq, &di->battery_monitor_work, 3*HZ ); // ready to go!! sec_bci.ready = true; return 0; batt_regi_fail3: power_supply_unregister( &di->sec_ac ); batt_regi_fail2: power_supply_unregister( &di->sec_battery ); batt_regi_fail1: // [ USE_REGULATOR regulator_put( di->usb1v5 ); di->usb1v5 = NULL; fail_regulator3: regulator_put( di->usb1v8 ); di->usb1v8 = NULL; fail_regulator2: regulator_put( di->usb3v1 ); di->usb3v1 = NULL; fail_regulator1: // ] kfree(di); return ret; }
// ------------------------------------------------------------------------- // // Driver interface // // ------------------------------------------------------------------------- // static int __devinit battery_probe( struct platform_device *pdev ) { int ret = 0; int i = 0; struct battery_device_info *di; printk( "[BM] Battery Probe... bootmode = %d\n\n"); this_dev = &pdev->dev; di = kzalloc( sizeof(*di), GFP_KERNEL ); if(!di) return -ENOMEM; platform_set_drvdata( pdev, di ); di->dev = &pdev->dev; device_config = pdev->dev.platform_data; INIT_DELAYED_WORK( &di->battery_monitor_work, battery_monitor_work_handler ); /*Create power supplies*/ di->sec_battery.name = "battery"; di->sec_battery.type = POWER_SUPPLY_TYPE_BATTERY; di->sec_battery.properties = samsung_battery_props; di->sec_battery.num_properties = ARRAY_SIZE( samsung_battery_props ); di->sec_battery.get_property = samsung_battery_get_property; di->sec_battery.external_power_changed = samsung_pwr_external_power_changed; di->sec_ac.name = "ac"; di->sec_ac.type = POWER_SUPPLY_TYPE_MAINS; di->sec_ac.supplied_to = samsung_bci_supplied_to; di->sec_ac.num_supplicants = ARRAY_SIZE( samsung_bci_supplied_to ); di->sec_ac.properties = samsung_ac_props; di->sec_ac.num_properties = ARRAY_SIZE( samsung_ac_props ); di->sec_ac.get_property = samsung_ac_get_property; di->sec_ac.external_power_changed = samsung_pwr_external_power_changed; di->sec_usb.name = "usb"; di->sec_usb.type = POWER_SUPPLY_TYPE_USB; di->sec_usb.supplied_to = samsung_bci_supplied_to; di->sec_usb.num_supplicants = ARRAY_SIZE( samsung_bci_supplied_to ); di->sec_usb.properties = samsung_usb_props; di->sec_usb.num_properties = ARRAY_SIZE( samsung_usb_props ); di->sec_usb.get_property = samsung_usb_get_property; di->sec_usb.external_power_changed = samsung_pwr_external_power_changed; // USE_REGULATOR [+] di->usb3v1 = regulator_get( &pdev->dev, "usb3v1" ); if( IS_ERR( di->usb3v1 ) ) goto fail_regulator1; di->usb1v8 = regulator_get( &pdev->dev, "usb1v8" ); if( IS_ERR( di->usb1v8 ) ) goto fail_regulator2; di->usb1v5 = regulator_get( &pdev->dev, "usb1v5" ); if( IS_ERR( di->usb1v5 ) ) goto fail_regulator3; // USE_REGULATOR [-] ret = power_supply_register( &pdev->dev, &di->sec_battery ); if( ret ) { printk( "[BM] Failed to register main battery, charger\n" ); goto batt_regi_fail1; } ret = power_supply_register( &pdev->dev, &di->sec_ac ); if( ret ) { printk( "[BM] Failed to register ac\n" ); goto batt_regi_fail2; } ret = power_supply_register( &pdev->dev, &di->sec_usb ); if( ret ) { printk( "[BM] Failed to register usb\n" ); goto batt_regi_fail3; } #ifdef _OMS_FEATURES_ // Create battery sysfs files for sharing battery information with platform. ret = sysfs_create_file( &di->sec_battery.dev->kobj, &batt_vol_toolow.attr ); if ( ret ) { printk( "[BM] sysfs create fail - %s\n", batt_vol_toolow.attr.name ); } #endif for( i = 0; i < ARRAY_SIZE( batt_sysfs_testmode ); i++ ) { ret = sysfs_create_file( &di->sec_battery.dev->kobj, &batt_sysfs_testmode[i].attr ); if ( ret ) { printk( "[BM] sysfs create fail - %s\n", batt_sysfs_testmode[i].attr.name ); } } // Set GPIO to control thermal sensor power if (gpio_is_valid(OMAP_GPIO_EN_TEMP_VDD)) { printk(KERN_ERR "[BM] OMAP_GPIO_EN_TEMP_VDD is valid\n"); ret = gpio_request(OMAP_GPIO_EN_TEMP_VDD, NULL); if (ret < 0) printk(KERN_ERR "[BM] Failed to request OMAP_GPIO_EN_TEMP_VDD\n"); gpio_direction_output(OMAP_GPIO_EN_TEMP_VDD, 0); } // Init. ADC turn_resources_on_for_adc(); twl_i2c_write_u8( TWL4030_MODULE_USB, SEL_MADC_MCPC, CARKIT_ANA_CTRL ); turn_resources_off_for_adc(); // Set gptimer12 for checking battery status in sleep mode. batt_gptimer_12.name = "samsung_battery_timer"; batt_gptimer_12.expire_time =(unsigned int) MONITOR_DURATION_DUR_SLEEP; batt_gptimer_12.expire_callback = &battery_monitor_fleeting_wakeup_handler; batt_gptimer_12.data = (unsigned long) di; #ifdef CONFIG_SEC_BATTERY_USE_RECOVERY_MODE if (likely(recovery_mode == 0)) queue_delayed_work( sec_bci.sec_battery_workq, &di->battery_monitor_work, HZ/2 ); else queue_delayed_work( sec_bci.sec_battery_workq, &di->battery_monitor_work, 0 ); #else queue_delayed_work( sec_bci.sec_battery_workq, &di->battery_monitor_work, HZ/2 ); #endif sec_bci.ready = true; return 0; batt_regi_fail3: power_supply_unregister( &di->sec_ac ); batt_regi_fail2: power_supply_unregister( &di->sec_battery ); batt_regi_fail1: // USE_REGULATOR [+] regulator_put( di->usb1v5 ); di->usb1v5 = NULL; fail_regulator3: regulator_put( di->usb1v8 ); di->usb1v8 = NULL; fail_regulator2: regulator_put( di->usb3v1 ); di->usb3v1 = NULL; fail_regulator1: // USE_REGULATOR [-] kfree(di); return ret; }