Пример #1
0
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;
}
Пример #2
0
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;
}
Пример #3
0
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;
}
Пример #4
0
// ------------------------------------------------------------------------- // 
//                           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;
}