static int __devinit max14577_muic_probe(struct platform_device *pdev) { struct max14577_dev *max14577 = dev_get_drvdata(pdev->dev.parent); struct max14577_platform_data *mfd_pdata = dev_get_platdata(max14577->dev); struct max14577_muic_data *muic_data; int ret = 0; pr_info("%s:%s\n", MUIC_DEV_NAME, __func__); muic_data = kzalloc(sizeof(struct max14577_muic_data), GFP_KERNEL); if (!muic_data) { pr_err("%s: failed to allocate driver data\n", __func__); ret = -ENOMEM; goto err_return; } if (!mfd_pdata) { pr_err("%s: failed to get max14577 mfd platform data\n", __func__); ret = -ENOMEM; goto err_kfree; } muic_data->dev = &pdev->dev; mutex_init(&muic_data->muic_mutex); muic_data->i2c = max14577->i2c; muic_data->mfd_pdata = mfd_pdata; muic_data->irq_adcerr = mfd_pdata->irq_base + MAX14577_IRQ_INT1_ADCERR; muic_data->irq_adc = mfd_pdata->irq_base + MAX14577_IRQ_INT1_ADC; muic_data->irq_chgtyp = mfd_pdata->irq_base + MAX14577_IRQ_INT2_CHGTYP; muic_data->irq_vbvolt = mfd_pdata->irq_base + MAX14577_IRQ_INT2_VBVOLT; muic_data->switch_data = &sec_switch_data; muic_data->pdata = mfd_pdata->muic_pdata; muic_data->attached_dev = ATTACHED_DEV_UNKNOWN_MUIC; muic_data->is_usb_ready = false; muic_data->is_muic_ready = false; pr_info("%s:%s adcerr(%d), adc(%d), chgtyp(%d), vbvolt(%d)\n", MUIC_DEV_NAME, __func__, muic_data->irq_adcerr, muic_data->irq_adc, muic_data->irq_chgtyp, muic_data->irq_vbvolt); platform_set_drvdata(pdev, muic_data); if (muic_data->pdata->init_gpio_cb) { ret = muic_data->pdata->init_gpio_cb(get_switch_sel()); if (ret) { pr_err("%s: failed to init gpio(%d)\n", __func__, ret); goto fail; } } /* Set ADC debounce time: 25ms */ max14577_muic_set_adcdbset(muic_data, 2); /* Set Charger-Detection Check Time: 625ms */ max14577_muic_set_dchktm(muic_data, 1); /* create sysfs group */ ret = sysfs_create_group(&switch_device->kobj, &max14577_muic_group); if (ret) { pr_err("%s: failed to create max14577 muic attribute group\n", __func__); goto fail; } dev_set_drvdata(switch_device, muic_data); if (muic_data->switch_data->init_cb) muic_data->switch_data->init_cb(); ret = max14577_muic_irq_init(muic_data); if (ret < 0) { dev_err(&pdev->dev, "Failed to initialize MUIC irq:%d\n", ret); goto fail_init_irq; } /* initial cable detection */ INIT_DELAYED_WORK(&muic_data->init_work, max14577_muic_init_detect); schedule_delayed_work(&muic_data->init_work, msecs_to_jiffies(CONFIG_MUIC_INIT_DETECT_DELAY)); INIT_DELAYED_WORK(&muic_data->usb_work, max14577_muic_usb_detect); schedule_delayed_work(&muic_data->usb_work, msecs_to_jiffies(17000)); return 0; fail_init_irq: if (muic_data->irq_adcerr) free_irq(muic_data->irq_adcerr, NULL); if (muic_data->irq_adc) free_irq(muic_data->irq_adc, NULL); if (muic_data->irq_chgtyp) free_irq(muic_data->irq_chgtyp, NULL); if (muic_data->irq_vbvolt) free_irq(muic_data->irq_vbvolt, NULL); fail: platform_set_drvdata(pdev, NULL); mutex_destroy(&muic_data->muic_mutex); err_kfree: kfree(muic_data); err_return: return ret; }
static int tsu6721_muic_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(i2c->dev.parent); /* struct muic_platform_data *pdata = i2c->dev.platform_data; */ struct tsu6721_muic_data *muic_data; int ret = 0; pr_info("%s:%s\n", MUIC_DEV_NAME, __func__); if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) { pr_err("%s: i2c functionality check error\n", __func__); ret = -EIO; goto err_return; } muic_data = kzalloc(sizeof(struct tsu6721_muic_data), GFP_KERNEL); if (!muic_data) { pr_err("%s: failed to allocate driver data\n", __func__); ret = -ENOMEM; goto err_return; } /* if (!pdata) { pr_err("%s: failed to get i2c platform data\n", __func__); ret = -ENODEV; goto err_io; } */ /* save platfom data for gpio control functions */ muic_data->pdata = &muic_pdata; muic_data->dev = &i2c->dev; muic_data->i2c = i2c; #if defined(CONFIG_OF) ret = of_tsu6721_muic_dt(&i2c->dev, muic_data); if (ret < 0) { pr_err("%s:%s not found muic dt! ret[%d]\n", MUIC_DEV_NAME, __func__, ret); } #endif /* CONFIG_OF */ i2c_set_clientdata(i2c, muic_data); /* muic_data->switch_data = &sec_switch_data; */ if (muic_pdata.gpio_uart_sel) muic_pdata.set_gpio_uart_sel = tsu6721_set_gpio_uart_sel; /* * If muic path is set in bootargs by pmic_info in dts file, * switch_sel value is delivered from bootargs in dts file. * If not, MUIC path to AP USB & AP UART is set as default here */ #if 0 muic_pdata.switch_sel = SWITCH_SEL_USB_MASK | SWITCH_SEL_UART_MASK; #endif if (muic_data->pdata->init_gpio_cb) ret = muic_data->pdata->init_gpio_cb(get_switch_sel()); if (ret) { pr_err("%s: failed to init gpio(%d)\n", __func__, ret); goto fail_init_gpio; } mutex_init(&muic_data->muic_mutex); muic_data->is_factory_start = false; #if 0 wake_lock_init(&muic_data->muic_wake_lock, WAKE_LOCK_SUSPEND, "muic wake lock"); #endif muic_data->attached_dev = ATTACHED_DEV_UNKNOWN_MUIC; muic_data->is_usb_ready = false; #ifdef CONFIG_SEC_SYSFS /* create sysfs group */ ret = sysfs_create_group(&switch_device->kobj, &tsu6721_muic_group); if (ret) { pr_err("%s: failed to create tsu6721 muic attribute group\n", __func__); goto fail; } /* set switch device's driver_data */ dev_set_drvdata(switch_device, muic_data); #endif #ifdef TSU6721_DEBUG tsu6721_read_reg_info(muic_data); #endif ret = tsu6721_init_rev_info(muic_data); if (ret) { pr_err("%s: failed to init muic rev register(%d)\n", __func__, ret); goto fail; } ret = tsu6721_muic_reg_init(muic_data); if (ret) { pr_err("%s: failed to init muic register(%d)\n", __func__, ret); goto fail; } /* if (muic_data->switch_data->init_cb) muic_data->switch_data->init_cb(); */ ret = tsu6721_muic_irq_init(muic_data); if (ret) { pr_err("%s: failed to init muic irq(%d)\n", __func__, ret); // goto fail_init_irq; } /* initial cable detection */ INIT_DELAYED_WORK(&muic_data->init_work, tsu6721_muic_init_detect); schedule_delayed_work(&muic_data->init_work, msecs_to_jiffies(3000)); /* INIT_DELAYED_WORK(&muic_data->usb_work, tsu6721_muic_usb_detect); schedule_delayed_work(&muic_data->usb_work, msecs_to_jiffies(17000)); */ return 0; //fail_init_irq: // if (i2c->irq) // free_irq(i2c->irq, muic_data); fail: #if 0 wake_lock_destroy(&info->muic_wake_lock); #endif #ifdef CONFIG_SEC_SYSFS sysfs_remove_group(&switch_device->kobj, &tsu6721_muic_group); #endif mutex_destroy(&muic_data->muic_mutex); fail_init_gpio: i2c_set_clientdata(i2c, NULL); kfree(muic_data); err_return: return ret; }