예제 #1
0
static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
    int ret;
    unsigned long quirks = id->driver_data;
    struct sony_sc *sc;
    unsigned int connect_mask = HID_CONNECT_DEFAULT;

    sc = kzalloc(sizeof(*sc), GFP_KERNEL);
    if (sc == NULL) {
        hid_err(hdev, "can't alloc sony descriptor\n");
        return -ENOMEM;
    }

    sc->quirks = quirks;
    hid_set_drvdata(hdev, sc);

    ret = hid_parse(hdev);
    if (ret) {
        hid_err(hdev, "parse failed\n");
        goto err_free;
    }

    if (sc->quirks & VAIO_RDESC_CONSTANT)
        connect_mask |= HID_CONNECT_HIDDEV_FORCE;
    else if (sc->quirks & SIXAXIS_CONTROLLER_USB)
        connect_mask |= HID_CONNECT_HIDDEV_FORCE;
    else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
        connect_mask |= HID_CONNECT_HIDDEV_FORCE;

    ret = hid_hw_start(hdev, connect_mask);
    if (ret) {
        hid_err(hdev, "hw start failed\n");
        goto err_free;
    }

    if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
        hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
        ret = sixaxis_set_operational_usb(hdev);
    }
    else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
        ret = sixaxis_set_operational_bt(hdev);
    else if (sc->quirks & BUZZ_CONTROLLER)
        ret = buzz_init(hdev);
    else
        ret = 0;

    if (ret < 0)
        goto err_stop;

    return 0;
err_stop:
    hid_hw_stop(hdev);
err_free:
    kfree(sc);
    return ret;
}
예제 #2
0
static int sony_probe(struct hid_device *hdev, const struct hid_device_id *id)
{
	int ret;
	unsigned long quirks = id->driver_data;
	struct sony_sc *sc;

	sc = kzalloc(sizeof(*sc), GFP_KERNEL);
	if (sc == NULL) {
		hid_err(hdev, "can't alloc sony descriptor\n");
		return -ENOMEM;
	}

	sc->quirks = quirks;
	hid_set_drvdata(hdev, sc);

	ret = hid_parse(hdev);
	if (ret) {
		hid_err(hdev, "parse failed\n");
		goto err_free;
	}

	ret = hid_hw_start(hdev, HID_CONNECT_DEFAULT |
			HID_CONNECT_HIDDEV_FORCE);
	if (ret) {
		hid_err(hdev, "hw start failed\n");
		goto err_free;
	}

	if (sc->quirks & SIXAXIS_CONTROLLER_USB) {
#ifndef CONFIG_HID_SONY_PS3_CTRL_BT
		hdev->hid_output_raw_report = sixaxis_usb_output_raw_report;
#endif
		ret = sixaxis_set_operational_usb(hdev);
	}
	else if (sc->quirks & SIXAXIS_CONTROLLER_BT)
		ret = sixaxis_set_operational_bt(hdev);
	else
		ret = 0;

	if (ret < 0)
		goto err_stop;

	return 0;
err_stop:
	hid_hw_stop(hdev);
err_free:
	kfree(sc);
	return ret;
}