static int __exit cpcap_3mm5_remove(struct platform_device *pdev) { struct cpcap_3mm5_data *data = platform_get_drvdata(pdev); cancel_delayed_work_sync(&data->work); cpcap_irq_free(data->cpcap, CPCAP_IRQ_MB2); cpcap_irq_free(data->cpcap, CPCAP_IRQ_HS); cpcap_irq_free(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_5); cpcap_irq_free(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_13); switch_dev_unregister(&data->sdev); regulator_put(data->regulator); kfree(data); return 0; }
static int __exit cpcap_usb_det_remove(struct platform_device *pdev) { struct cpcap_usb_det_data *data = platform_get_drvdata(pdev); cpcap_irq_free(data->cpcap, CPCAP_IRQ_CHRG_DET); cpcap_irq_free(data->cpcap, CPCAP_IRQ_CHRG_CURR1); cpcap_irq_free(data->cpcap, CPCAP_IRQ_SE1); cpcap_irq_free(data->cpcap, CPCAP_IRQ_IDGND); cpcap_irq_free(data->cpcap, CPCAP_IRQ_VBUSVLD); #ifdef CONFIG_TTA_CHARGER cpcap_irq_free(data->cpcap, CPCAP_IRQ_DMI); free_irq(OMAP_GPIO_IRQ(TTU_TTA_CHRG_DET_N_GPIO), 0); gpio_free(TTU_TTA_CHRG_DET_N_GPIO); #endif configure_hardware(data, CPCAP_ACCY_NONE); cancel_delayed_work_sync(&data->work); if ((data->usb_accy != CPCAP_ACCY_NONE) && (data->usb_dev != NULL)) platform_device_del(data->usb_dev); vusb_disable(data); regulator_put(data->regulator); wake_lock_destroy(&data->wake_lock); kfree(data); return 0; }
static int __init cpcap_usb_det_probe(struct platform_device *pdev) { int retval; struct cpcap_usb_det_data *data; if (pdev->dev.platform_data == NULL) { dev_err(&pdev->dev, "no platform_data\n"); return -EINVAL; } data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->cpcap = pdev->dev.platform_data; data->state = CONFIG; platform_set_drvdata(pdev, data); INIT_DELAYED_WORK(&data->work, detection_work); data->usb_accy = CPCAP_ACCY_NONE; wake_lock_init(&data->wake_lock, WAKE_LOCK_SUSPEND, "usb"); data->regulator = regulator_get(NULL, "vusb"); if (IS_ERR(data->regulator)) { dev_err(&pdev->dev, "Could not get regulator for cpcap_usb\n"); retval = PTR_ERR(data->regulator); goto free_mem; } regulator_set_voltage(data->regulator, 3300000, 3300000); retval = cpcap_irq_register(data->cpcap, CPCAP_IRQ_CHRG_DET, int_handler, data); retval |= cpcap_irq_register(data->cpcap, CPCAP_IRQ_CHRG_CURR1, int_handler, data); retval |= cpcap_irq_register(data->cpcap, CPCAP_IRQ_SE1, int_handler, data); retval |= cpcap_irq_register(data->cpcap, CPCAP_IRQ_IDGND, int_handler, data); retval |= cpcap_irq_register(data->cpcap, CPCAP_IRQ_VBUSVLD, int_handler, data); retval |= cpcap_irq_register(data->cpcap, CPCAP_IRQ_DPI, int_handler, data); retval |= cpcap_irq_register(data->cpcap, CPCAP_IRQ_DMI, int_handler, data); #ifdef CONFIG_TTA_CHARGER if (gpio_request(TTU_TTA_CHRG_DET_N_GPIO, "tta_chrg_cntr") < 0) return -EBUSY; set_irq_type(OMAP_GPIO_IRQ(TTU_TTA_CHRG_DET_N_GPIO), IRQ_TYPE_EDGE_FALLING); retval |= request_irq( OMAP_GPIO_IRQ(TTU_TTA_CHRG_DET_N_GPIO), (void *)isr_handler, IRQF_DISABLED, TTA_IRQ_NAME, data); #endif /* Now that HW initialization is done, give USB control via ULPI. */ retval |= cpcap_regacc_write(data->cpcap, CPCAP_REG_USBC3, 0, CPCAP_BIT_ULPI_SPI_SEL); if (retval != 0) { dev_err(&pdev->dev, "Initialization Error\n"); retval = -ENODEV; goto free_irqs; } dev_info(&pdev->dev, "CPCAP USB detection device probed\n"); /* Perform initial detection */ detection_work(&(data->work.work)); return 0; free_irqs: cpcap_irq_free(data->cpcap, CPCAP_IRQ_VBUSVLD); cpcap_irq_free(data->cpcap, CPCAP_IRQ_IDGND); cpcap_irq_free(data->cpcap, CPCAP_IRQ_SE1); cpcap_irq_free(data->cpcap, CPCAP_IRQ_CHRG_CURR1); cpcap_irq_free(data->cpcap, CPCAP_IRQ_CHRG_DET); cpcap_irq_free(data->cpcap, CPCAP_IRQ_DPI); cpcap_irq_free(data->cpcap, CPCAP_IRQ_DMI); #ifdef CONFIG_TTA_CHARGER free_irq(OMAP_GPIO_IRQ(TTU_TTA_CHRG_DET_N_GPIO), 0); gpio_free(TTU_TTA_CHRG_DET_N_GPIO); #endif regulator_put(data->regulator); free_mem: wake_lock_destroy(&data->wake_lock); kfree(data); return retval; }
static int __init cpcap_3mm5_probe(struct platform_device *pdev) { int retval = 0; struct cpcap_3mm5_data *data; if (pdev->dev.platform_data == NULL) { dev_err(&pdev->dev, "no platform_data\n"); return -EINVAL; } data = kzalloc(sizeof(*data), GFP_KERNEL); if (!data) return -ENOMEM; data->cpcap = pdev->dev.platform_data; data->audio_low_pwr_det = 1; data->audio_low_pwr_mac13 = 1; data->sdev.name = "h2w"; data->sdev.print_name = print_name; switch_dev_register(&data->sdev); INIT_DELAYED_WORK(&data->work, mac13_work); platform_set_drvdata(pdev, data); data->regulator = regulator_get(NULL, "vaudio"); if (IS_ERR(data->regulator)) { dev_err(&pdev->dev, "Could not get regulator for cpcap_3mm5\n"); retval = PTR_ERR(data->regulator); goto free_mem; } regulator_set_voltage(data->regulator, 2775000, 2775000); /* configure GPIO2=high and GPIO4=low. */ cpcap_regacc_write(data->cpcap, CPCAP_REG_GPIO2, 0, CPCAP_BIT_GPIO2DRV); cpcap_regacc_write(data->cpcap, CPCAP_REG_GPIO4, 0, CPCAP_BIT_GPIO4DRV); retval = cpcap_irq_clear(data->cpcap, CPCAP_IRQ_HS); retval |= cpcap_irq_clear(data->cpcap, CPCAP_IRQ_MB2); retval |= cpcap_irq_clear(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_5); retval |= cpcap_irq_clear(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_13); if (retval) goto reg_put; retval = cpcap_irq_register(data->cpcap, CPCAP_IRQ_HS, hs_handler, data); if (retval) goto reg_put; retval = cpcap_irq_register(data->cpcap, CPCAP_IRQ_MB2, key_handler, data); if (retval) goto free_hs; retval = cpcap_irq_register(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_5, key_handler, data); if (retval) goto free_mb2; if (data->cpcap->vendor == CPCAP_VENDOR_ST) { retval = cpcap_irq_register(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_13, mac13_handler, data); if (retval) goto free_mac5; cpcap_uc_start(data->cpcap, CPCAP_MACRO_13); } hs_handler(CPCAP_IRQ_HS, data); return 0; free_mac5: cpcap_irq_free(data->cpcap, CPCAP_IRQ_UC_PRIMACRO_5); free_mb2: cpcap_irq_free(data->cpcap, CPCAP_IRQ_MB2); free_hs: cpcap_irq_free(data->cpcap, CPCAP_IRQ_HS); reg_put: regulator_put(data->regulator); free_mem: kfree(data); return retval; }