Example #1
0
static void dockin_isr_work_function(struct work_struct *dat)
{
	struct i2c_client *client = charger->client;

	int dock_in = gpio_dock_in;
	int ac_ok = GPIO_AC_OK;

	wake_lock(&charger->wake_lock_dockin);
	mutex_lock(&charger->dockin_lock);

	if (gpio_get_value(dock_in)) {
		if (!gpio_get_value(ac_ok)) {
			SMB_NOTICE("dc_in=H & ac_ok=L\n");
			cable_type_detect();
		}
	} else {
		if (!gpio_get_value(ac_ok)) {
			SMB_NOTICE("dc_in=L & ac_ok=L\n");
			msleep(40);
			cable_type_detect();
		}
	}

	mutex_unlock(&charger->dockin_lock);
	wake_unlock(&charger->wake_lock_dockin);
}
Example #2
0
static int smb347_resume(struct i2c_client *client)
{
	charger->suspend_ongoing = 0;

	printk("smb347_resume+\n");
	cable_type_detect();
	printk("smb347_resume-\n");
	return 0;
}
Example #3
0
void usb_det_cable_callback(unsigned cable_type)
{
	usb_det_cable_type = cable_type;
	SMB_NOTICE("usb_det_cable_type=%d\n", usb_det_cable_type);

	if(unknow_cable == charger->cur_cable_type) {
		cable_type_detect();
	}
}
Example #4
0
static void inok_isr_work_function(struct work_struct *dat)
{
	struct i2c_client *client = charger->client;

	cancel_delayed_work(&charger->curr_limit_work);
	cancel_delayed_work(&charger->inok_isr_work);
	cable_type_detect();

	smb347_clear_interrupts(client);
}
Example #5
0
static int smb347_resume(struct i2c_client *client)
{
	charger->suspend_ongoing = 0;
	//cancel_delayed_work(&charger->regs_dump_work);
	//queue_delayed_work(smb347_wq, &charger->regs_dump_work, 15*HZ);

	printk("smb347_resume+\n");
	cable_type_detect();
	printk("smb347_resume-\n");
	return 0;
}
Example #6
0
static int __devinit smb347_probe(struct i2c_client *client,
			const struct i2c_device_id *id)
{
	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
	int ret, irq_num, i;
	uint8_t val, buf[15];

	if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE))
		return -EIO;

	charger = kzalloc(sizeof(*charger), GFP_KERNEL);
	if (!charger)
		return -ENOMEM;

	charger->client = client;
	charger->dev = &client->dev;
	i2c_set_clientdata(client, charger);

	/* Restore default setting: APSD Enable & 5/1/HC mode Pin control */
	smb347_default_setback();

	ret = sysfs_create_group(&client->dev.kobj, &smb347_group);
	if (ret) {
		dev_err(&client->dev, "smb347_probe: unable to create the sysfs\n");
	}

	mutex_init(&charger->cable_lock);

	smb347_wq = create_singlethread_workqueue("smb347_wq");
	INIT_DELAYED_WORK_DEFERRABLE(&charger->inok_isr_work, inok_isr_work_function);
	//INIT_DELAYED_WORK(&charger->regs_dump_work, regs_dump_work_func);

	ret = smb347_inok_irq(charger);
	if (ret) {
		dev_err(&client->dev, "%s(): Failed in requesting ACOK# pin isr\n",
				__func__);
		goto error;
	}

	//queue_delayed_work(smb347_wq, &charger->regs_dump_work, 30*HZ);

	cable_type_detect();

	ret = register_otg_callback( (callback_t)smb347_otg_status, charger);

	if (ret < 0)
		goto error;

	return 0;
error:
	kfree(charger);
	return ret;
}
Example #7
0
static void inok_isr_work_function(struct work_struct *dat)
{
	struct i2c_client *client = charger->client;

	int gpio = TEGRA_GPIO_PV1;
	int irq = gpio_to_irq(gpio);

	cancel_delayed_work(&charger->inok_isr_work);
	cable_type_detect();

	printk("inok_isr_work_function -\n");
	smb347_clear_interrupts(client);
	enable_irq(irq);
}
Example #8
0
int cable_detect_callback(unsigned cable_state)
{
	if(unknow_cable == charger->cur_cable_type)
	{
		int ret = 0;
		cable_state_detect = cable_state;
		ret = cable_type_detect();

		return ret;
	}
	else
	{
		return -1;
	}
}