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); }
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; }
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(); } }
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); }
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; }
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; }
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); }
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; } }