drivers/hid/intel-thc-hid/intel-quickspi/quickspi-protocol.c

Source file repositories/reference/linux-study-clean/drivers/hid/intel-thc-hid/intel-quickspi/quickspi-protocol.c

File Facts

System
Linux kernel
Corpus path
drivers/hid/intel-thc-hid/intel-quickspi/quickspi-protocol.c
Extension
.c
Size
11479 bytes
Lines
414
Domain
Driver Families
Bucket
drivers/hid
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (input_len != le16_to_cpu(qsdev->dev_desc.rep_desc_len)) {
			dev_err_once(qsdev->dev, "Unexpected report descriptor length: %u\n",
				     input_len);
			return;
		}

		memcpy(qsdev->report_descriptor, input_body->content, input_len);

		qsdev->report_desc_got = true;
		wake_up_interruptible(&qsdev->report_desc_got_wq);

		break;

	case COMMAND_RESPONSE:
		if (body_hdr->content_id == HIDSPI_SET_POWER_CMD_ID) {
			dev_dbg(qsdev->dev, "Receive set power on response\n");
		} else {
			dev_err_once(qsdev->dev, "Unknown command response type: %u\n",
				     body_hdr->content_id);
		}

		break;

	case RESET_RESPONSE:
		if (qsdev->state == QUICKSPI_RESETING) {
			qsdev->reset_ack = true;
			wake_up_interruptible(&qsdev->reset_ack_wq);
			dev_dbg(qsdev->dev, "Receive HIR reset response\n");
		} else {
			dev_info(qsdev->dev, "Receive DIR\n");
		}
		break;

	case GET_FEATURE_RESPONSE:
	case GET_INPUT_REPORT_RESPONSE:
		qsdev->report_len = sizeof(body_hdr->content_id) + input_len;
		input_report = input_body->content - sizeof(body_hdr->content_id);

		memcpy(qsdev->report_buf, input_report, qsdev->report_len);

		qsdev->get_report_cmpl = true;
		wake_up_interruptible(&qsdev->get_report_cmpl_wq);

		break;

	case SET_FEATURE_RESPONSE:
	case OUTPUT_REPORT_RESPONSE:
		qsdev->set_report_cmpl = true;
		wake_up_interruptible(&qsdev->set_report_cmpl_wq);

		break;

	case DATA:
		if (qsdev->state != QUICKSPI_ENABLED)
			return;

		if (input_len > le16_to_cpu(qsdev->dev_desc.max_input_len)) {
			dev_err_once(qsdev->dev, "Unexpected too large input report length: %u\n",
				     input_len);
			return;
		}

		input_len = sizeof(body_hdr->content_id) + input_len;
		input_report = input_body->content - sizeof(body_hdr->content_id);

		ret = quickspi_hid_send_report(qsdev, input_report, input_len);
		if (ret)
			dev_err_once(qsdev->dev, "Failed to send HID input report: %d\n", ret);

		break;

	default:
		dev_err_once(qsdev->dev, "Unsupported input report type: %u\n",
			     body_hdr->input_report_type);
		break;
	}
}

static int acpi_tic_reset(struct quickspi_device *qsdev)
{
	acpi_status status = 0;
	acpi_handle handle;

	if (!qsdev->acpi_dev)
		return -ENODEV;

	handle = acpi_device_handle(qsdev->acpi_dev);
	status = acpi_execute_simple_method(handle, "_RST", 0);
	if (ACPI_FAILURE(status)) {
		dev_err_once(qsdev->dev,

Annotation

Implementation Notes