mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	HID: make .raw_request mandatory
SET_REPORT and GET_REPORT are mandatory in the HID specification. Make the corresponding API in hid-core mandatory too, which removes the need to test against it in some various places. Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com> Reviewed-by: David Herrmann <dh.herrmann@gmail.com> Signed-off-by: Jiri Kosina <jkosina@suse.cz>
This commit is contained in:
		
							parent
							
								
									2ebaebcf31
								
							
						
					
					
						commit
						3c86726cfe
					
				
					 4 changed files with 12 additions and 11 deletions
				
			
		| 
						 | 
				
			
			@ -283,7 +283,8 @@ The available HID callbacks are:
 | 
			
		|||
                       int reqtype)
 | 
			
		||||
   Same as ->request() but provides the report as raw buffer. This request shall
 | 
			
		||||
   be synchronous. A transport driver must not use ->wait() to complete such
 | 
			
		||||
   requests.
 | 
			
		||||
   requests. This request is mandatory and hid core will reject the device if
 | 
			
		||||
   it is missing.
 | 
			
		||||
 | 
			
		||||
 - int (*output_report) (struct hid_device *hdev, __u8 *buf, size_t len)
 | 
			
		||||
   Send raw output report via intr channel. Used by some HID device drivers
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1330,9 +1330,6 @@ void __hid_request(struct hid_device *hid, struct hid_report *report,
 | 
			
		|||
	int ret;
 | 
			
		||||
	int len;
 | 
			
		||||
 | 
			
		||||
	if (!hid->ll_driver->raw_request)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	buf = hid_alloc_report_buf(report, GFP_KERNEL);
 | 
			
		||||
	if (!buf)
 | 
			
		||||
		return;
 | 
			
		||||
| 
						 | 
				
			
			@ -2471,6 +2468,14 @@ int hid_add_device(struct hid_device *hdev)
 | 
			
		|||
	if (hid_ignore(hdev))
 | 
			
		||||
		return -ENODEV;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Check for the mandatory transport channel.
 | 
			
		||||
	 */
 | 
			
		||||
	 if (!hdev->ll_driver->raw_request) {
 | 
			
		||||
		hid_err(hdev, "transport driver missing .raw_request()\n");
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
	 }
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Read the device report descriptor once and use as template
 | 
			
		||||
	 * for the driver-specific modifications.
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1266,9 +1266,7 @@ static struct hid_input *hidinput_allocate(struct hid_device *hid)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	input_set_drvdata(input_dev, hid);
 | 
			
		||||
	if (hid->ll_driver->request || hid->ll_driver->output_report ||
 | 
			
		||||
	    hid->ll_driver->raw_request)
 | 
			
		||||
		input_dev->event = hidinput_input_event;
 | 
			
		||||
	input_dev->event = hidinput_input_event;
 | 
			
		||||
	input_dev->open = hidinput_open;
 | 
			
		||||
	input_dev->close = hidinput_close;
 | 
			
		||||
	input_dev->setkeycode = hidinput_setkeycode;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -992,11 +992,8 @@ static inline int hid_hw_raw_request(struct hid_device *hdev,
 | 
			
		|||
	if (len < 1 || len > HID_MAX_BUFFER_SIZE || !buf)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (hdev->ll_driver->raw_request)
 | 
			
		||||
		return hdev->ll_driver->raw_request(hdev, reportnum, buf, len,
 | 
			
		||||
	return hdev->ll_driver->raw_request(hdev, reportnum, buf, len,
 | 
			
		||||
						    rtype, reqtype);
 | 
			
		||||
 | 
			
		||||
	return -ENOSYS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue