static int usb_switch_remove(struct platform_device *pdev) { cancel_work_sync(&sdev.work); switch_usb_dev_unregister(&sdev); device_remove_file(sdev.dev, &dev_attr_swstate); dev_set_drvdata(sdev.dev, NULL); class_destroy(switch_usb_class); gpio_free(gpio_switch_back); free_irq(sdev.irq1, &sdev); gpio_switch_back = -1; return 0; }
static int __devexit usb_switch_remove(struct platform_device *pdev) { struct usb_switch_platform_data *pdata = pdev->dev.platform_data; if (!pdata) { return -EINVAL; } cancel_work_sync(&sdev.work); smart_gpio_free(pdata->modem_int_gpio1); smart_gpio_free(pdata->modem_int_gpio2); switch_usb_dev_unregister(&sdev); free_irq(sdev.irq1, &sdev); free_irq(sdev.irq2, &sdev); return 0; }
static int usb_switch_probe(struct platform_device *pdev) { struct device_node *node = pdev->dev.of_node; int ret = 0; hwlog_info("%s: ------entry.\n", __func__); sdev.name = pdev->name; //pdev->name; "usbsw" INIT_WORK(&sdev.work, usb_switch_work); ret = switch_usb_dev_register(&sdev); if (ret < 0){ hwlog_err("%s: switch_usb_dev_register error!!!\n", __func__); goto err_switch_usb_dev_register; } ret = device_create_file(sdev.dev, &dev_attr_swstate); if (ret < 0){ hwlog_err("%s: device_create_file error!!!\n", __func__); goto err_switch_usb_dev_register; } dev_set_drvdata(sdev.dev, &sdev); sdev.state = USB_TO_AP; gpio_switch_back = of_get_named_gpio(node, "gpio_switch_back", 0); hwlog_info("%s: gpio_switch_back=%d\n", __func__, gpio_switch_back); if (gpio_switch_back < 0){ hwlog_err("%s: of_get_named_gpio error!!! gpio_switch_back=%d", __func__, gpio_switch_back); sdev.irq1 = -1; //invalid value } else { sdev.irq1 = gpio_to_irq(gpio_switch_back); if (sdev.irq1 < 0) { ret = sdev.irq1; hwlog_err("%s: gpio_to_irq error!!! gpio_switch_back=%d\n", __func__, gpio_switch_back); goto err_detect_irq_num_failed1; } ret = gpio_request(gpio_switch_back, "usb_sw_interrupt1"); if (ret < 0){ hwlog_err("%s: gpio_request error!!! gpio_switch_back=%d\n", __func__, gpio_switch_back); goto err_request_int_gpio1; } ret = gpio_direction_input(gpio_switch_back); if (ret < 0){ hwlog_err("%s: gpio_direction_input error!!! gpio_switch_back=%d\n", __func__, gpio_switch_back); goto err_set_gpio_input1; } ret = request_irq(sdev.irq1, int_gpio_irq_handler, IRQ_TYPE_EDGE_RISING, "usb_sw_interrupt1", &sdev); if (ret < 0){ hwlog_err("%s: request_irq error!!! sdev.irq1=%d\n", __func__, sdev.irq1); goto err_request_irq1; } disable_irq(sdev.irq1); } hwlog_info("%s: ------OK.\n", __func__); return 0; err_request_irq1: err_request_int_gpio1: err_set_gpio_input1: gpio_free(gpio_switch_back); err_detect_irq_num_failed1: switch_usb_dev_unregister(&sdev); err_switch_usb_dev_register: hwlog_err("%s: ------FAIL!!! ret=%d\n", __func__, ret); return ret; }
static int usb_switch_probe(struct platform_device *pdev) { struct usb_switch_platform_data *pdata = pdev->dev.platform_data; int ret = 0; printk(KERN_INFO "usb_switch_probe entry.\n"); if (!pdata) return -EBUSY; sdev.pdata = pdata; sdev.name = pdata->name; INIT_WORK(&sdev.work, usb_switch_work); ret = switch_usb_dev_register(&sdev); if (ret < 0) goto err_switch_usb_dev_register; if (pdata->modem1_supported) { ret = gpio_request(pdata->modem_int_gpio1, "usb_sw_interrupt1"); if (ret < 0) goto err_request_int_gpio1; ret = gpio_direction_input(pdata->modem_int_gpio1); if (ret < 0) goto err_set_gpio_input1; sdev.irq1 = gpio_to_irq(pdata->modem_int_gpio1); if (sdev.irq1 < 0) { ret = sdev.irq1; goto err_detect_irq_num_failed1; } ret = request_irq(sdev.irq1, int_gpio_irq_handler, pdata->irq_flags, "usb_sw_interrupt1", &sdev); if (ret < 0) goto err_request_irq1; /* disable irq interrupt */ disable_irq(sdev.irq1); } if (pdata->modem2_supported) { ret = gpio_request(pdata->modem_int_gpio2, "usb_sw_interrupt2"); if (ret < 0) goto err_request_int_gpio2; ret = gpio_direction_input(pdata->modem_int_gpio2); if (ret < 0) goto err_set_gpio_input2; sdev.irq2 = gpio_to_irq(pdata->modem_int_gpio2); if (sdev.irq2 < 0) { ret = sdev.irq2; goto err_detect_irq_num_failed2; } ret = request_irq(sdev.irq2, int_gpio_irq_handler, pdata->irq_flags, "usb_sw_interrupt2", &sdev); if (ret < 0) goto err_request_irq2; /* disable irq interrupt */ disable_irq(sdev.irq2); } return 0; err_request_irq2: err_detect_irq_num_failed2: err_set_gpio_input2: smart_gpio_free(pdata->modem_int_gpio2); err_request_int_gpio2: err_request_irq1: err_detect_irq_num_failed1: err_set_gpio_input1: smart_gpio_free(pdata->modem_int_gpio1); err_request_int_gpio1: switch_usb_dev_unregister(&sdev); err_switch_usb_dev_register: return ret; }