Re: [PATCHv3 1/3] HID: hid-lg: Allow for custom device properties to be stored in private driver data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 14 Mar 2012, Michal Malý wrote:

> For some reason the Makefile got modified along with the driver and I didn't
> catch it. This is the updated version of the first part of the patch that leaves
> the Makefile alone.

Please resend the patch with proper changelog, I can't apply it this way 
:) Thanks.

> 
> Signed-off-by: Michal Malý <madcatxster@xxxxxxxxx>
> 
> ---
>  drivers/hid/hid-lg.c |   55 +++++++++++++++++++++++++++++---------------------
>  drivers/hid/hid-lg.h |    7 +++++++
>  2 files changed, 39 insertions(+), 23 deletions(-)
> 
> diff --git a/drivers/hid/hid-lg.c b/drivers/hid/hid-lg.c
> index e7a7bd1..fc37ed6 100644
> --- a/drivers/hid/hid-lg.c
> +++ b/drivers/hid/hid-lg.c
> @@ -109,23 +109,23 @@ static __u8 dfp_rdesc_fixed[] = {
>  static __u8 *lg_report_fixup(struct hid_device *hdev, __u8 *rdesc,
>  		unsigned int *rsize)
>  {
> -	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
> +	struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
>  
> -	if ((quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 &&
> +	if ((drv_data->quirks & LG_RDESC) && *rsize >= 90 && rdesc[83] == 0x26 &&
>  			rdesc[84] == 0x8c && rdesc[85] == 0x02) {
>  		hid_info(hdev,
>  			 "fixing up Logitech keyboard report descriptor\n");
>  		rdesc[84] = rdesc[89] = 0x4d;
>  		rdesc[85] = rdesc[90] = 0x10;
>  	}
> -	if ((quirks & LG_RDESC_REL_ABS) && *rsize >= 50 &&
> +	if ((drv_data->quirks & LG_RDESC_REL_ABS) && *rsize >= 50 &&
>  			rdesc[32] == 0x81 && rdesc[33] == 0x06 &&
>  			rdesc[49] == 0x81 && rdesc[50] == 0x06) {
>  		hid_info(hdev,
>  			 "fixing up rel/abs in Logitech report descriptor\n");
>  		rdesc[33] = rdesc[50] = 0x02;
>  	}
> -	if ((quirks & LG_FF4) && *rsize >= 101 &&
> +	if ((drv_data->quirks & LG_FF4) && *rsize >= 101 &&
>  			rdesc[41] == 0x95 && rdesc[42] == 0x0B &&
>  			rdesc[47] == 0x05 && rdesc[48] == 0x09) {
>  		hid_info(hdev, "fixing up Logitech Speed Force Wireless button descriptor\n");
> @@ -278,7 +278,7 @@ static int lg_input_mapping(struct hid_device *hdev, struct hid_input *hi,
>  		  0,  0,  0,  0,  0,183,184,185,186,187,
>  		188,189,190,191,192,193,194,  0,  0,  0
>  	};
> -	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
> +	struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
>  	unsigned int hid = usage->hid;
>  
>  	if (hdev->product == USB_DEVICE_ID_LOGITECH_RECEIVER &&
> @@ -289,7 +289,7 @@ static int lg_input_mapping(struct hid_device *hdev, struct hid_input *hi,
>  			lg_dinovo_mapping(hi, usage, bit, max))
>  		return 1;
>  
> -	if ((quirks & LG_WIRELESS) && lg_wireless_mapping(hi, usage, bit, max))
> +	if ((drv_data->quirks & LG_WIRELESS) && lg_wireless_mapping(hi, usage, bit, max))
>  		return 1;
>  
>  	if ((hid & HID_USAGE_PAGE) != HID_UP_BUTTON)
> @@ -299,11 +299,11 @@ static int lg_input_mapping(struct hid_device *hdev, struct hid_input *hi,
>  
>  	/* Special handling for Logitech Cordless Desktop */
>  	if (field->application == HID_GD_MOUSE) {
> -		if ((quirks & LG_IGNORE_DOUBLED_WHEEL) &&
> +		if ((drv_data->quirks & LG_IGNORE_DOUBLED_WHEEL) &&
>  				(hid == 7 || hid == 8))
>  			return -1;
>  	} else {
> -		if ((quirks & LG_EXPANDED_KEYMAP) &&
> +		if ((drv_data->quirks & LG_EXPANDED_KEYMAP) &&
>  				hid < ARRAY_SIZE(e_keymap) &&
>  				e_keymap[hid] != 0) {
>  			hid_map_usage(hi, usage, bit, max, EV_KEY,
> @@ -319,13 +319,13 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
>  		struct hid_field *field, struct hid_usage *usage,
>  		unsigned long **bit, int *max)
>  {
> -	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
> +	struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
>  
> -	if ((quirks & LG_BAD_RELATIVE_KEYS) && usage->type == EV_KEY &&
> +	if ((drv_data->quirks & LG_BAD_RELATIVE_KEYS) && usage->type == EV_KEY &&
>  			(field->flags & HID_MAIN_ITEM_RELATIVE))
>  		field->flags &= ~HID_MAIN_ITEM_RELATIVE;
>  
> -	if ((quirks & LG_DUPLICATE_USAGES) && (usage->type == EV_KEY ||
> +	if ((drv_data->quirks & LG_DUPLICATE_USAGES) && (usage->type == EV_KEY ||
>  			 usage->type == EV_REL || usage->type == EV_ABS))
>  		clear_bit(usage->code, *bit);
>  
> @@ -335,9 +335,9 @@ static int lg_input_mapped(struct hid_device *hdev, struct hid_input *hi,
>  static int lg_event(struct hid_device *hdev, struct hid_field *field,
>  		struct hid_usage *usage, __s32 value)
>  {
> -	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
> +	struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
>  
> -	if ((quirks & LG_INVERT_HWHEEL) && usage->code == REL_HWHEEL) {
> +	if ((drv_data->quirks & LG_INVERT_HWHEEL) && usage->code == REL_HWHEEL) {
>  		input_event(field->hidinput->input, usage->type, usage->code,
>  				-value);
>  		return 1;
> @@ -348,13 +348,20 @@ static int lg_event(struct hid_device *hdev, struct hid_field *field,
>  
>  static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
>  {
> -	unsigned long quirks = id->driver_data;
>  	unsigned int connect_mask = HID_CONNECT_DEFAULT;
> +	struct lg_drv_data *drv_data;
>  	int ret;
>  
> -	hid_set_drvdata(hdev, (void *)quirks);
> +	drv_data = kzalloc(sizeof(struct lg_drv_data), GFP_KERNEL);
> +	if (!drv_data) {
> +		hid_err(hdev, "Insufficient memory, cannot allocate driver data\n");
> +		return -ENOMEM;
> +	}
> +	drv_data->quirks = id->driver_data;
> +	
> +	hid_set_drvdata(hdev, (void *)drv_data);
>  
> -	if (quirks & LG_NOGET)
> +	if (drv_data->quirks & LG_NOGET)
>  		hdev->quirks |= HID_QUIRK_NOGET;
>  
>  	ret = hid_parse(hdev);
> @@ -363,7 +370,7 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
>  		goto err_free;
>  	}
>  
> -	if (quirks & (LG_FF | LG_FF2 | LG_FF3 | LG_FF4))
> +	if (drv_data->quirks & (LG_FF | LG_FF2 | LG_FF3 | LG_FF4))
>  		connect_mask &= ~HID_CONNECT_FF;
>  
>  	ret = hid_hw_start(hdev, connect_mask);
> @@ -392,27 +399,29 @@ static int lg_probe(struct hid_device *hdev, const struct hid_device_id *id)
>  		}
>  	}
>  
> -	if (quirks & LG_FF)
> +	if (drv_data->quirks & LG_FF)
>  		lgff_init(hdev);
> -	if (quirks & LG_FF2)
> +	if (drv_data->quirks & LG_FF2)
>  		lg2ff_init(hdev);
> -	if (quirks & LG_FF3)
> +	if (drv_data->quirks & LG_FF3)
>  		lg3ff_init(hdev);
> -	if (quirks & LG_FF4)
> +	if (drv_data->quirks & LG_FF4)
>  		lg4ff_init(hdev);
>  
>  	return 0;
>  err_free:
> +	kfree(drv_data);
>  	return ret;
>  }
>  
>  static void lg_remove(struct hid_device *hdev)
>  {
> -	unsigned long quirks = (unsigned long)hid_get_drvdata(hdev);
> -	if(quirks & LG_FF4)
> +	struct lg_drv_data *drv_data = (struct lg_drv_data *)hid_get_drvdata(hdev);
> +	if (drv_data->quirks & LG_FF4)
>  		lg4ff_deinit(hdev);
>  
>  	hid_hw_stop(hdev);
> +	kfree(drv_data);
>  }
>  
>  static const struct hid_device_id lg_devices[] = {
> diff --git a/drivers/hid/hid-lg.h b/drivers/hid/hid-lg.h
> index 4b09728..500457b 100644
> --- a/drivers/hid/hid-lg.h
> +++ b/drivers/hid/hid-lg.h
> @@ -1,6 +1,13 @@
>  #ifndef __HID_LG_H
>  #define __HID_LG_H
>  
> +#include <linux/spinlock.h>
> +
> +struct lg_drv_data {
> +	unsigned long quirks;
> +	void *device_props;	/* Device specific properties */
> +};
> +
>  #ifdef CONFIG_LOGITECH_FF
>  int lgff_init(struct hid_device *hdev);
>  #else
> -- 
> 1.7.9.4
> 
> 

-- 
Jiri Kosina
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux