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;
}
예제 #2
0
파일: switch_usb.c 프로젝트: NXij/cm11-p6
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;
}
예제 #4
0
파일: switch_usb.c 프로젝트: NXij/cm11-p6
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;
}