static void max8997_muic_detect_cable_wq(struct work_struct *work) { struct max8997_muic_info *info = container_of(to_delayed_work(work), struct max8997_muic_info, wq_detcable); int ret; ret = max8997_muic_detect_dev(info); if (ret < 0) dev_err(info->dev, "failed to detect cable type\n"); }
static void max8997_muic_init_detect(struct work_struct *work) { struct max8997_muic_info *info = container_of(work, struct max8997_muic_info, init_work.work); dev_info(info->dev, "%s\n", __func__); mutex_lock(&info->mutex); max8997_muic_detect_dev(info); mutex_unlock(&info->mutex); }
static irqreturn_t max8997_muic_irq(int irq, void *data) { struct max8997_muic_info *info = data; dev_info(info->dev, "%s: irq:%d\n", __func__, irq); mutex_lock(&info->mutex); max8997_muic_detect_dev(info, irq); mutex_unlock(&info->mutex); return IRQ_HANDLED; }
static int max8997_muic_restore(struct device *dev) { struct platform_device *pdev = to_platform_device(dev); struct max8997_muic_info *info; int i; info = platform_get_drvdata(pdev); for (i = 0; i < ARRAY_SIZE(max8997_dumpaddr_muic); i++) max8997_write_reg(info->max8997->muic, max8997_dumpaddr_muic[i], info->max8997->reg_dump[i + MAX8997_REG_PMIC_END]); mutex_lock(&info->mutex); max8997_muic_detect_dev(info, -1); mutex_unlock(&info->mutex); return 0; }
static int __devinit max8997_muic_probe(struct platform_device *pdev) { struct max8997_dev *iodev = dev_get_drvdata(pdev->dev.parent); struct max8997_platform_data *pdata = dev_get_platdata(iodev->dev); struct max8997_muic_info *info; int ret, i; info = kzalloc(sizeof(struct max8997_muic_info), GFP_KERNEL); if (!info) { dev_err(&pdev->dev, "failed to allocate memory\n"); ret = -ENOMEM; goto err_kfree; } if (!pdata->muic_pdata) { dev_err(&pdev->dev, "failed to get platform_data\n"); ret = -EINVAL; goto err_pdata; } info->muic_pdata = pdata->muic_pdata; info->dev = &pdev->dev; info->iodev = iodev; info->muic = iodev->muic; platform_set_drvdata(pdev, info); mutex_init(&info->mutex); INIT_WORK(&info->irq_work, max8997_muic_irq_work); for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) { struct max8997_muic_irq *muic_irq = &muic_irqs[i]; ret = request_threaded_irq(pdata->irq_base + muic_irq->irq, NULL, max8997_muic_irq_handler, 0, muic_irq->name, info); if (ret) { dev_err(&pdev->dev, "failed: irq request (IRQ: %d," " error :%d)\n", muic_irq->irq, ret); for (i = i - 1; i >= 0; i--) free_irq(muic_irq->irq, info); goto err_irq; } } max8997_initialize_device(info); max8997_muic_detect_dev(info); return ret; err_irq: err_pdata: kfree(info); err_kfree: return ret; }