Re: [PATCH 10/25] sony-laptop: keyboard backlight support extended to newer Vaios

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

 



On Fri, Jun 03, 2011 at 05:41:01PM +0200, Marco Chiappero wrote:
> Added support for handle 0x0143 (Vaio SA/SB/SC, CA/CB). Minor
> corrections included.
> 
> Signed-off-by: Marco Chiappero <marco@xxxxxxxxxx>
> ---
> 
> --- a/drivers/platform/x86/sony-laptop.c
> +++ b/drivers/platform/x86/sony-laptop.c
> @@ -127,7 +127,7 @@ MODULE_PARM_DESC(minor,
>  		 "default is -1 (automatic)");
>  #endif
> 
> -static int kbd_backlight;	/* = 1 */
> +static int kbd_backlight;	/* = 0 */
>  module_param(kbd_backlight, int, 0444);
>  MODULE_PARM_DESC(kbd_backlight,
>  		 "set this to 0 to disable keyboard backlight, "
> @@ -140,15 +140,6 @@ MODULE_PARM_DESC(kbd_backlight_timeout,
>  		 "1 for 30 seconds, 2 for 60 seconds and 3 to disable timeout "
>  		 "(default: 0)");
> 
> -static void sony_nc_kbd_backlight_resume(void);
> -
> -enum sony_nc_rfkill {
> -	SONY_WIFI,
> -	SONY_BLUETOOTH,
> -	SONY_WWAN,
> -	SONY_WIMAX,
> -	N_SONY_RFKILL,
> -};

removing this enum seems superfluous (it's re-added some patches later)
and breaks compilation at this point.

>  static int sony_rfkill_handle;
>  static struct rfkill *sony_rfkill_devices[N_SONY_RFKILL];
> @@ -1356,38 +1347,33 @@ static int sony_nc_rfkill_setup(struct a
>  }
> 
>  /* Keyboard backlight feature */
> -#define KBDBL_HANDLER	0x137
> -#define KBDBL_PRESENT	0xB00
> -#define	SET_MODE	0xC00
> -#define SET_STATE	0xD00
> -#define SET_TIMEOUT	0xE00
> -
>  struct kbd_backlight {
> -	int mode;
> -	int timeout;
> +	unsigned int base;
> +	unsigned int mode;
> +	unsigned int timeout;
>  	struct device_attribute mode_attr;
>  	struct device_attribute timeout_attr;
>  };
> -
>  static struct kbd_backlight *kbdbl_handle;
> +static int sony_kbd_handle = -1;

there seems to be no real point initializing this to -1. Also, can it be
made part of the struct above?

> -static ssize_t __sony_nc_kbd_backlight_mode_set(u8 value)
> +static int __sony_nc_kbd_backlight_mode_set(u8 value)
>  {
>  	unsigned int result;
> 
>  	if (value > 1)
>  		return -EINVAL;
> 
> -	if (sony_call_snc_handle(KBDBL_HANDLER,
> -				(value << 0x10) | SET_MODE, &result))
> +	if (sony_call_snc_handle(sony_kbd_handle, (value << 0x10) |
> +				(kbdbl_handle->base), &result))
>  		return -EIO;
> 
> -	/* Try to turn the light on/off immediately */
> -	sony_call_snc_handle(KBDBL_HANDLER, (value << 0x10) | SET_STATE,
> -			&result);
> -
>  	kbdbl_handle->mode = value;
> 
> +	/* Try to turn the light on/off immediately */
> +	sony_call_snc_handle(sony_kbd_handle, (value << 0x10) |
> +				(kbdbl_handle->base + 0x100), &result);
> +
>  	return 0;
>  }
> 
> @@ -1415,7 +1401,9 @@ static ssize_t sony_nc_kbd_backlight_mod
>  		struct device_attribute *attr, char *buffer)
>  {
>  	ssize_t count = 0;
> +
>  	count = snprintf(buffer, PAGE_SIZE, "%d\n", kbdbl_handle->mode);
> +
>  	return count;
>  }
> 
> @@ -1426,8 +1414,8 @@ static int __sony_nc_kbd_backlight_timeo
>  	if (value > 3)
>  		return -EINVAL;
> 
> -	if (sony_call_snc_handle(KBDBL_HANDLER,
> -				(value << 0x10) | SET_TIMEOUT, &result))
> +	if (sony_call_snc_handle(sony_kbd_handle, (value << 0x10) |
> +				(kbdbl_handle->base + 0x200), &result))
>  		return -EIO;
> 
>  	kbdbl_handle->timeout = value;
> @@ -1459,18 +1447,36 @@ static ssize_t sony_nc_kbd_backlight_tim
>  		struct device_attribute *attr, char *buffer)
>  {
>  	ssize_t count = 0;
> +
>  	count = snprintf(buffer, PAGE_SIZE, "%d\n", kbdbl_handle->timeout);
> +
>  	return count;
>  }
> 
>  static int sony_nc_kbd_backlight_setup(struct platform_device *pd)
>  {
> -	unsigned int result;
> +	unsigned int result, base_cmd;
> +	bool found = false;
> 
> -	if (sony_call_snc_handle(KBDBL_HANDLER, KBDBL_PRESENT, &result))
> -		return 0;
> -	if (!(result & 0x02))
> +	/* verify the kbd backlight presence, some models do not have it */
> +	if (sony_kbd_handle == 0x0137) {
> +		if (sony_call_snc_handle(sony_kbd_handle, 0x0B00, &result))
> +			return -EIO;
> +
> +		found = !!(result & 0x02);
> +		base_cmd = 0x0C00;
> +	} else {
> +		if (sony_call_snc_handle(sony_kbd_handle, 0x0100, &result))
> +			return -EIO;
> +
> +		found = result & 0x01;
> +		base_cmd = 0x4000;
> +	}
> +
> +	if (!found) {
> +		dprintk("no backlight keyboard found\n");
>  		return 0;
> +	}
> 
>  	kbdbl_handle = kzalloc(sizeof(*kbdbl_handle), GFP_KERNEL);
>  	if (!kbdbl_handle)
> @@ -1494,6 +1500,8 @@ static int sony_nc_kbd_backlight_setup(s
>  	if (device_create_file(&pd->dev, &kbdbl_handle->timeout_attr))
>  		goto outmode;
> 
> +	kbdbl_handle->base = base_cmd;
> +
>  	__sony_nc_kbd_backlight_mode_set(kbd_backlight);
>  	__sony_nc_kbd_backlight_timeout_set(kbd_backlight_timeout);
> 
> @@ -1516,28 +1524,32 @@ static int sony_nc_kbd_backlight_cleanup
>  		device_remove_file(&pd->dev, &kbdbl_handle->timeout_attr);
> 
>  		/* restore the default hw behaviour */
> -		sony_call_snc_handle(KBDBL_HANDLER, 0x1000 | SET_MODE, &result);
> -		sony_call_snc_handle(KBDBL_HANDLER, SET_TIMEOUT, &result);
> +		sony_call_snc_handle(sony_kbd_handle,
> +				kbdbl_handle->base | 0x10000, &result);
> +		sony_call_snc_handle(sony_kbd_handle,
> +				kbdbl_handle->base + 0x200, &result);
> 
>  		kfree(kbdbl_handle);
> +		kbdbl_handle = NULL;
>  	}
>  	return 0;
>  }
> 
>  static void sony_nc_kbd_backlight_resume(void)
>  {
> -	unsigned int ignore = 0;
> +	unsigned int result;
> 
>  	if (!kbdbl_handle)
>  		return;
> 
>  	if (kbdbl_handle->mode == 0)
> -		sony_call_snc_handle(KBDBL_HANDLER, SET_MODE, &ignore);
> +		sony_call_snc_handle(sony_kbd_handle,
> +				kbdbl_handle->base, &result);
> 
>  	if (kbdbl_handle->timeout != 0)
> -		sony_call_snc_handle(KBDBL_HANDLER,
> -				(kbdbl_handle->timeout << 0x10) | SET_TIMEOUT,
> -				&ignore);
> +		sony_call_snc_handle(sony_kbd_handle,
> +				(kbdbl_handle->base + 0x200) |
> +				(kbdbl_handle->timeout << 0x10), &result);
>  }
> 
>  static void sony_nc_backlight_ng_read_limits(int handle,
> @@ -1676,6 +1688,8 @@ static void sony_nc_snc_setup_handles(st
>  			ret = sony_nc_function_setup(handle);
>  			break;
>  		case 0x0137:
> +		case 0x0143:
> +			sony_kbd_handle = handle;
>  			ret = sony_nc_kbd_backlight_setup(pd);
>  			break;
>  		case 0x0124:
> @@ -1710,6 +1724,7 @@ static void sony_nc_snc_cleanup_handles(
> 
>  		switch (handle) {
>  		case 0x0137:
> +		case 0x0143:
>  			sony_nc_kbd_backlight_cleanup(pd);
>  			break;
>  		case 0x0124:
> @@ -1814,6 +1829,7 @@ static int sony_nc_snc_resume(void)
>  			sony_nc_rfkill_update();
>  			break;
>  		case 0x0137: /* kbd + als */
> +		case 0x0143:
>  			sony_nc_kbd_backlight_resume();
>  			break;
>  		default:
-- 
mattia
:wq!
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux