static irqreturn_t fsa9485_irq_thread(int irq, void *data) { struct fsa9485_usbsw *usbsw = data; struct i2c_client *client = usbsw->client; int intr, intr2, detect; /* FSA9480 : Read interrupt -> Read Device * FSA9485 : Read Device -> Read interrupt */ dev_info(&usbsw->client->dev, "%s\n", __func__); /* read and clear interrupt status bits */ intr = i2c_smbus_read_word_data(client, FSA9485_REG_INT1); intr2 = intr >> 8; dev_info(&client->dev, "%s: intr : 0x%02x intr2 : 0x%02x\n", __func__, intr & 0xff, intr2); /* device detection */ mutex_lock(&usbsw->mutex); #ifdef CONFIG_MUIC_FSA9485_SUPPORT_LANHUB if((intr&0xff) == 0x00 && intr2 == 0x04) detect = fsa9485_detect_lanhub(usbsw); else detect = fsa9485_detect_dev(usbsw); #else detect = fsa9485_detect_dev(usbsw); #endif mutex_unlock(&usbsw->mutex); pr_info("%s: detect dev_adc: 0x%02x\n", __func__, detect); if (intr < 0) { msleep(100); dev_err(&client->dev, "%s: err 0x%02x\n", __func__, intr); intr = i2c_smbus_read_word_data(client, FSA9485_REG_INT1); if (intr < 0) dev_err(&client->dev, "%s: err at read 0x%02x\n", __func__, intr); fsa9485_reg_init(usbsw); return IRQ_HANDLED; } else if (intr == 0) { /* interrupt was fired, but no status bits were set, so device was reset. In this case, the registers were reset to defaults so they need to be reinitialised. */ fsa9485_reg_init(usbsw); } return IRQ_HANDLED; }
static void fsa9485_delayed_audio(struct work_struct *work) { struct fsa9485_usbsw *usbsw = container_of(work, struct fsa9485_usbsw, audio_work.work); int device_type; unsigned int dev1; dev_info(&usbsw->client->dev, "%s\n", __func__); local_usbsw->dock_ready = 1; local_usbsw->mhl_ready = 1; device_type = i2c_smbus_read_word_data(usbsw->client, FSA9485_REG_DEV_T1); if (device_type < 0) { dev_err(&usbsw->client->dev, "%s: err %d\n", __func__, device_type); return; } dev1 = device_type & 0xff; if(dev1 & DEV_USB_OTG) return; mutex_lock(&usbsw->mutex); fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); }
static void fsa9485_init_detect(struct work_struct *work) { struct fsa9485_usbsw *usbsw = container_of(work, struct fsa9485_usbsw, init_work.work); int ret = 0; dev_info(&usbsw->client->dev, "%s\n", __func__); mutex_lock(&usbsw->mutex); fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); ret = fsa9485_irq_init(usbsw); if (ret) dev_info(&usbsw->client->dev, "failed to enable irq init %s\n", __func__); ret = i2c_smbus_read_byte_data(usbsw->client, FSA9485_REG_INT1); dev_info(&usbsw->client->dev, "%s: intr1 : 0x%x\n", __func__, ret & 0xff); local_usbsw->last_state.int1 = ret; ret = i2c_smbus_read_byte_data(usbsw->client, FSA9485_REG_INT2); dev_info(&usbsw->client->dev, "%s: intr2 : 0x%x\n", __func__, ret & 0xff); local_usbsw->last_state.int2 = ret; }
static void fsa9485_delayed_audio(struct work_struct *work) { struct fsa9485_usbsw *usbsw = container_of(work, struct fsa9485_usbsw, audio_work.work); dev_info(&usbsw->client->dev, "%s\n", __func__); local_usbsw->dock_ready = 1; mutex_lock(&usbsw->mutex); fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); }
static int fsa9485_resume(struct i2c_client *client) { struct fsa9485_usbsw *usbsw = i2c_get_clientdata(client); /* add for fsa9485_irq_thread i2c error during wakeup */ fsa9485_check_dev(usbsw); i2c_smbus_read_byte_data(client, FSA9485_REG_INT1); /* device detection */ mutex_lock(&usbsw->mutex); fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); return 0; }
static void fsa9485_init_detect(struct work_struct *work) { struct fsa9485_usbsw *usbsw = container_of(work, struct fsa9485_usbsw, init_work.work); int ret = 0; dev_info(&usbsw->client->dev, "%s\n", __func__); mutex_lock(&usbsw->mutex); fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); ret = fsa9485_irq_init(usbsw); if (ret) dev_info(&usbsw->client->dev, "failed to enable irq init %s\n", __func__); }
static irqreturn_t fsa9485_irq_thread(int irq, void *data) { struct fsa9485_usbsw *usbsw = data; struct i2c_client *client = usbsw->client; int intr, intr2, detect; DisableFSA9480Interrupts(); /* FSA9485 : Read interrupt -> Read Device FSA9485 : Read Device -> Read interrupt */ mutex_lock(&usbsw->mutex); if (is_ti_muic()) msleep(50); pr_info("fsa9485_irq_thread is called\n"); /* read and clear interrupt status bits */ intr = i2c_smbus_read_byte_data(client, FSA9485_REG_INT1); dev_info(&client->dev, "%s: intr : 0x%x", __func__, intr & 0xff); intr2 = i2c_smbus_read_byte_data(client, FSA9485_REG_INT2); dev_info(&client->dev, "%s: intr2 : 0x%x\n", __func__, intr2 & 0xff); local_usbsw->last_state.int1 = intr; local_usbsw->last_state.int2 = intr2; if (intr & INT_OVP_EN) usbsw->pdata->oxp_callback(ENABLE); else if (intr & INT_OXP_DISABLE) usbsw->pdata->oxp_callback(DISABLE); if (intr == (INT_ATTACH + INT_DETACH)) { fsa9485_detach_dev(usbsw); EnableFSA9480Interrupts(); return IRQ_HANDLED; } /* device detection */ detect = fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); pr_info("%s: detect dev_adc: %x\n", __func__, detect); EnableFSA9480Interrupts(); return IRQ_HANDLED; }
static ssize_t fsa9485_set_apo_factory(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct fsa9485_usbsw *usbsw = dev_get_drvdata(dev); pr_info("%s buf:%s\n", __func__, buf); /* "FACTORY_START": factory mode */ if (!strncmp(buf, "FACTORY_START", 13)) { usbsw->is_factory_start = true; pr_info("%s FACTORY_MODE\n", __func__); fsa9485_detect_dev(usbsw); } else { pr_warn("%s Wrong command\n", __func__); return count; } return count; }
static irqreturn_t fsa9485_irq_thread(int irq, void *data) { struct fsa9485_usbsw *usbsw = data; struct i2c_client *client = usbsw->client; int intr, intr2, detect; /* FSA9485 : Read interrupt -> Read Device FSA9485 : Read Device -> Read interrupt */ pr_info("fsa9485_irq_thread is called\n"); /* device detection */ mutex_lock(&usbsw->mutex); detect = fsa9485_detect_dev(usbsw); mutex_unlock(&usbsw->mutex); pr_info("%s: detect dev_adc: %x\n", __func__, detect); /* read and clear interrupt status bits */ intr = i2c_smbus_read_word_data(client, FSA9485_REG_INT1); dev_info(&client->dev, "%s: intr : 0x%x intr2 : 0x%x\n", __func__, intr & 0xff, intr >> 8); intr2 = intr >> 8; if (intr < 0) { msleep(100); dev_err(&client->dev, "%s: err %d\n", __func__, intr); intr = i2c_smbus_read_word_data(client, FSA9485_REG_INT1); if (intr < 0) dev_err(&client->dev, "%s: err at read %d\n", __func__, intr); fsa9485_reg_init(usbsw); return IRQ_HANDLED; } else if (intr == 0) { /* interrupt was fired, but no status bits were set, so device was reset. In this case, the registers were reset to defaults so they need to be reinitialised. */ fsa9485_reg_init(usbsw); } /* ADC_value(key pressed) changed at AV_Dock.*/ if (intr2) { if (intr2 & 0x4) { /* for adc change */ fsa9485_handle_dock_vol_key(usbsw, detect); dev_info(&client->dev, "intr2: 0x%x, adc_val: %x\n", intr2, detect); } else if (intr2 & 0x2) { /* for smart dock */ i2c_smbus_read_word_data(client, FSA9485_REG_INT1); } else if (intr2 & 0x1) { /* for av change (desk dock, hdmi) */ dev_info(&client->dev, "%s enter Av charing\n", __func__); fsa9485_detect_dev(usbsw); } else { dev_info(&client->dev, "%s intr2 but, nothing happend, intr2: 0x%x\n", __func__, intr2); } return IRQ_HANDLED; } return IRQ_HANDLED; }