platform-drivers-x86 for 3.20
toshiba_acpi: Add support for missing features from the Windows driver, bump the sysfs version, and clean up the driver. thinkpad_acpi: BIOS string versions, unhandled hkey events. samsung-laptop: Add native backlight quirk, enable better lid handling. intel_scu_ipc: Read resources from PCI configuration other: Fix sparse warnings, general cleanups. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJU5Xg2AAoJEKbMaAwKp364WaUH/Akf1jrGGaC8czGVsvAz4syV jV+4yHA1z/E1sy1LjS7gKxpaYO5j5a6Nv0488kaM/RPZoVPSXgGsrCS/HPjpRJIR 90PGQuZ3gUWpqt6ICqjs22fHVQ/k0NF7uiLgqOsACnLWAN7ts3GXNs6CLpzlwhQY +YXzw3ac1QeB3lSKYxTmRKRZ9qCoHBmONSG/DzyHw8cmXI9LuSd7LCs8BHsg3M1v /WYJlLTJRgS5POfPenWoW1GQ0tN9OgC19Hk4dtFMv0U1s6au7z0a8rFqHc0qR18b tMkf9/8kaatTrKLlWhxX2/Wyenu8wpVjSYvRrRHsMCJRaWHyQQStd3Lhvw0Kzyg= =W5L5 -----END PGP SIGNATURE----- Merge tag 'platform-drivers-x86-v3.20-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86 Pull platform driver update from Darren Hart: "This includes a significant update to the toshiba_acpi driver, bringing it to feature parity with the Windows driver, followed by some needed cleanups. The other changes are mostly minor updates, quirks, sparse fixes, or cleanups. Details: - toshiba_acpi: Add support for missing features from the Windows driver, bump the sysfs version, and clean up the driver. - thinkpad_acpi: BIOS string versions, unhandled hkey events. - msamsung-laptop: Add native backlight quirk, enable better lid handling. - intel_scu_ipc: Read resources from PCI configuration - other: Fix sparse warnings, general cleanups" * tag 'platform-drivers-x86-v3.20-1' of git://git.infradead.org/users/dvhart/linux-platform-drivers-x86: (34 commits) toshiba_acpi: Cleanup GPL header toshiba_acpi: Cleanup comment blocks and capitalization toshiba_acpi: Make use of DEVICE_ATTR_{RO, RW} macros toshiba_acpi: Drop the toshiba_ prefix from sysfs function names toshiba_acpi: Move sysfs function and struct declarations further down Documentation/ABI: Add file describing the sysfs entries for toshiba_acpi toshiba_acpi: Clean file according to coding style toshiba_acpi: Bump version number to 0.21 toshiba_acpi: Add support to enable/disable USB 3 toshiba_acpi: Add support for Panel Power ON toshiba_acpi: Add support for Keyboard functions mode toshiba_acpi: Add fan entry to sysfs toshiba_acpi: Add version entry to sysfs thinkpad_acpi: support new BIOS version string pattern thinkpad_acpi: unhandled hkey event toshiba_acpi: Make toshiba_eco_mode_available more robust classmate-laptop: Fix sparse warning (0 as NULL) Sony-laptop: Fix sparse warning (make undeclared var static) thinkpad_acpi.c: Fix sparse warning (make undeclared var static) samsung-laptop.c: Prefer kstrtoint over single variable sscanf ...
This commit is contained in:
commit
6ed3e57fd2
10 changed files with 1262 additions and 246 deletions
|
@ -35,3 +35,11 @@ Contact: Corentin Chary <corentin.chary@gmail.com>
|
|||
Description: Use your USB ports to charge devices, even
|
||||
when your laptop is powered off.
|
||||
1 means enabled, 0 means disabled.
|
||||
|
||||
What: /sys/devices/platform/samsung/lid_handling
|
||||
Date: December 11, 2014
|
||||
KernelVersion: 3.19
|
||||
Contact: Julijonas Kikutis <julijonas.kikutis@gmail.com>
|
||||
Description: Some Samsung laptops handle lid closing quicker and
|
||||
only handle lid opening with this mode enabled.
|
||||
1 means enabled, 0 means disabled.
|
||||
|
|
114
Documentation/ABI/testing/sysfs-driver-toshiba_acpi
Normal file
114
Documentation/ABI/testing/sysfs-driver-toshiba_acpi
Normal file
|
@ -0,0 +1,114 @@
|
|||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/kbd_backlight_mode
|
||||
Date: June 8, 2014
|
||||
KernelVersion: 3.15
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the keyboard backlight operation mode, valid
|
||||
values are:
|
||||
* 0x1 -> FN-Z
|
||||
* 0x2 -> AUTO (also called TIMER)
|
||||
* 0x8 -> ON
|
||||
* 0x10 -> OFF
|
||||
Note that the kernel 3.16 onwards this file accepts all listed
|
||||
parameters, kernel 3.15 only accepts the first two (FN-Z and
|
||||
AUTO).
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/kbd_backlight_timeout
|
||||
Date: June 8, 2014
|
||||
KernelVersion: 3.15
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the timeout of the keyboard backlight
|
||||
whenever the operation mode is set to AUTO (or TIMER),
|
||||
valid values range from 0-60.
|
||||
Note that the kernel 3.15 only had support for the first
|
||||
keyboard type, the kernel 3.16 added support for the second
|
||||
type and the range accepted for type 2 is 1-60.
|
||||
See the entry named "kbd_type"
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/position
|
||||
Date: June 8, 2014
|
||||
KernelVersion: 3.15
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file shows the absolute position of the built-in
|
||||
accelereometer.
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/touchpad
|
||||
Date: June 8, 2014
|
||||
KernelVersion: 3.15
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This files controls the status of the touchpad and pointing
|
||||
stick (if available), valid values are:
|
||||
* 0 -> OFF
|
||||
* 1 -> ON
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/available_kbd_modes
|
||||
Date: August 3, 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file shows the supported keyboard backlight modes
|
||||
the system supports, which can be:
|
||||
* 0x1 -> FN-Z
|
||||
* 0x2 -> AUTO (also called TIMER)
|
||||
* 0x8 -> ON
|
||||
* 0x10 -> OFF
|
||||
Note that not all keyboard types support the listed modes.
|
||||
See the entry named "available_kbd_modes"
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/kbd_type
|
||||
Date: August 3, 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file shows the current keyboard backlight type,
|
||||
which can be:
|
||||
* 1 -> Type 1, supporting modes FN-Z and AUTO
|
||||
* 2 -> Type 2, supporting modes TIMER, ON and OFF
|
||||
Users: KToshiba
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/version
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file shows the current version of the driver
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/fan
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the state of the internal fan, valid
|
||||
values are:
|
||||
* 0 -> OFF
|
||||
* 1 -> ON
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/kbd_function_keys
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls the Special Functions (hotkeys) operation
|
||||
mode, valid values are:
|
||||
* 0 -> Normal Operation
|
||||
* 1 -> Special Functions
|
||||
In the "Normal Operation" mode, the F{1-12} keys are as usual
|
||||
and the hotkeys are accessed via FN-F{1-12}.
|
||||
In the "Special Functions" mode, the F{1-12} keys trigger the
|
||||
hotkey and the F{1-12} keys are accessed via FN-F{1-12}.
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/panel_power_on
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls whether the laptop should turn ON whenever
|
||||
the LID is opened, valid values are:
|
||||
* 0 -> Disabled
|
||||
* 1 -> Enabled
|
||||
|
||||
What: /sys/devices/LNXSYSTM:00/LNXSYBUS:00/TOS{1900,620{0,7,8}}:00/usb_three
|
||||
Date: February, 2015
|
||||
KernelVersion: 3.20
|
||||
Contact: Azael Avalos <coproscefalo@gmail.com>
|
||||
Description: This file controls whether the USB 3 functionality, valid
|
||||
values are:
|
||||
* 0 -> Disabled (Acts as a regular USB 2)
|
||||
* 1 -> Enabled (Full USB 3 functionality)
|
|
@ -856,8 +856,8 @@ static void asus_backlight_exit(struct asus_laptop *asus)
|
|||
* than count bytes. We set eof to 1 if we handle those 2 values. We return the
|
||||
* number of bytes written in page
|
||||
*/
|
||||
static ssize_t show_infos(struct device *dev,
|
||||
struct device_attribute *attr, char *page)
|
||||
static ssize_t infos_show(struct device *dev, struct device_attribute *attr,
|
||||
char *page)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
int len = 0;
|
||||
|
@ -926,6 +926,7 @@ static ssize_t show_infos(struct device *dev,
|
|||
|
||||
return len;
|
||||
}
|
||||
static DEVICE_ATTR_RO(infos);
|
||||
|
||||
static int parse_arg(const char *buf, unsigned long count, int *val)
|
||||
{
|
||||
|
@ -957,15 +958,15 @@ static ssize_t sysfs_acpi_set(struct asus_laptop *asus,
|
|||
/*
|
||||
* LEDD display
|
||||
*/
|
||||
static ssize_t show_ledd(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t ledd_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "0x%08x\n", asus->ledd_status);
|
||||
}
|
||||
|
||||
static ssize_t store_ledd(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t ledd_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
@ -981,6 +982,7 @@ static ssize_t store_ledd(struct device *dev, struct device_attribute *attr,
|
|||
}
|
||||
return rv;
|
||||
}
|
||||
static DEVICE_ATTR_RW(ledd);
|
||||
|
||||
/*
|
||||
* Wireless
|
||||
|
@ -1014,21 +1016,22 @@ static int asus_wlan_set(struct asus_laptop *asus, int status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_wlan(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t wlan_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_wireless_status(asus, WL_RSTS));
|
||||
}
|
||||
|
||||
static ssize_t store_wlan(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t wlan_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sysfs_acpi_set(asus, buf, count, METHOD_WLAN);
|
||||
}
|
||||
static DEVICE_ATTR_RW(wlan);
|
||||
|
||||
/*e
|
||||
* Bluetooth
|
||||
|
@ -1042,15 +1045,15 @@ static int asus_bluetooth_set(struct asus_laptop *asus, int status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_bluetooth(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t bluetooth_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_wireless_status(asus, BT_RSTS));
|
||||
}
|
||||
|
||||
static ssize_t store_bluetooth(struct device *dev,
|
||||
static ssize_t bluetooth_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
|
@ -1058,6 +1061,7 @@ static ssize_t store_bluetooth(struct device *dev,
|
|||
|
||||
return sysfs_acpi_set(asus, buf, count, METHOD_BLUETOOTH);
|
||||
}
|
||||
static DEVICE_ATTR_RW(bluetooth);
|
||||
|
||||
/*
|
||||
* Wimax
|
||||
|
@ -1071,22 +1075,22 @@ static int asus_wimax_set(struct asus_laptop *asus, int status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_wimax(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t wimax_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_wireless_status(asus, WM_RSTS));
|
||||
}
|
||||
|
||||
static ssize_t store_wimax(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t wimax_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sysfs_acpi_set(asus, buf, count, METHOD_WIMAX);
|
||||
}
|
||||
static DEVICE_ATTR_RW(wimax);
|
||||
|
||||
/*
|
||||
* Wwan
|
||||
|
@ -1100,22 +1104,22 @@ static int asus_wwan_set(struct asus_laptop *asus, int status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_wwan(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t wwan_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_wireless_status(asus, WW_RSTS));
|
||||
}
|
||||
|
||||
static ssize_t store_wwan(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
static ssize_t wwan_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sysfs_acpi_set(asus, buf, count, METHOD_WWAN);
|
||||
}
|
||||
static DEVICE_ATTR_RW(wwan);
|
||||
|
||||
/*
|
||||
* Display
|
||||
|
@ -1135,8 +1139,8 @@ static void asus_set_display(struct asus_laptop *asus, int value)
|
|||
* displays hooked up simultaneously, so be warned. See the acpi4asus README
|
||||
* for more info.
|
||||
*/
|
||||
static ssize_t store_disp(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t display_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
int rv, value;
|
||||
|
@ -1146,6 +1150,7 @@ static ssize_t store_disp(struct device *dev, struct device_attribute *attr,
|
|||
asus_set_display(asus, value);
|
||||
return rv;
|
||||
}
|
||||
static DEVICE_ATTR_WO(display);
|
||||
|
||||
/*
|
||||
* Light Sens
|
||||
|
@ -1167,16 +1172,17 @@ static void asus_als_switch(struct asus_laptop *asus, int value)
|
|||
asus->light_switch = value;
|
||||
}
|
||||
|
||||
static ssize_t show_lssw(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t ls_switch_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus->light_switch);
|
||||
}
|
||||
|
||||
static ssize_t store_lssw(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t ls_switch_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf,
|
||||
size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
int rv, value;
|
||||
|
@ -1187,6 +1193,7 @@ static ssize_t store_lssw(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
return rv;
|
||||
}
|
||||
static DEVICE_ATTR_RW(ls_switch);
|
||||
|
||||
static void asus_als_level(struct asus_laptop *asus, int value)
|
||||
{
|
||||
|
@ -1195,16 +1202,16 @@ static void asus_als_level(struct asus_laptop *asus, int value)
|
|||
asus->light_level = value;
|
||||
}
|
||||
|
||||
static ssize_t show_lslvl(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t ls_level_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus->light_level);
|
||||
}
|
||||
|
||||
static ssize_t store_lslvl(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t ls_level_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
int rv, value;
|
||||
|
@ -1218,6 +1225,7 @@ static ssize_t store_lslvl(struct device *dev, struct device_attribute *attr,
|
|||
|
||||
return rv;
|
||||
}
|
||||
static DEVICE_ATTR_RW(ls_level);
|
||||
|
||||
static int pega_int_read(struct asus_laptop *asus, int arg, int *result)
|
||||
{
|
||||
|
@ -1234,8 +1242,8 @@ static int pega_int_read(struct asus_laptop *asus, int arg, int *result)
|
|||
return err;
|
||||
}
|
||||
|
||||
static ssize_t show_lsvalue(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t ls_value_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
int err, hi, lo;
|
||||
|
@ -1247,6 +1255,7 @@ static ssize_t show_lsvalue(struct device *dev,
|
|||
return sprintf(buf, "%d\n", 10 * hi + lo);
|
||||
return err;
|
||||
}
|
||||
static DEVICE_ATTR_RO(ls_value);
|
||||
|
||||
/*
|
||||
* GPS
|
||||
|
@ -1274,15 +1283,15 @@ static int asus_gps_switch(struct asus_laptop *asus, int status)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t show_gps(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
static ssize_t gps_show(struct device *dev, struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
||||
return sprintf(buf, "%d\n", asus_gps_status(asus));
|
||||
}
|
||||
|
||||
static ssize_t store_gps(struct device *dev, struct device_attribute *attr,
|
||||
static ssize_t gps_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct asus_laptop *asus = dev_get_drvdata(dev);
|
||||
|
@ -1298,6 +1307,7 @@ static ssize_t store_gps(struct device *dev, struct device_attribute *attr,
|
|||
rfkill_set_sw_state(asus->gps.rfkill, !value);
|
||||
return rv;
|
||||
}
|
||||
static DEVICE_ATTR_RW(gps);
|
||||
|
||||
/*
|
||||
* rfkill
|
||||
|
@ -1569,19 +1579,6 @@ static void asus_acpi_notify(struct acpi_device *device, u32 event)
|
|||
asus_input_notify(asus, event);
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(infos, S_IRUGO, show_infos, NULL);
|
||||
static DEVICE_ATTR(wlan, S_IRUGO | S_IWUSR, show_wlan, store_wlan);
|
||||
static DEVICE_ATTR(bluetooth, S_IRUGO | S_IWUSR,
|
||||
show_bluetooth, store_bluetooth);
|
||||
static DEVICE_ATTR(wimax, S_IRUGO | S_IWUSR, show_wimax, store_wimax);
|
||||
static DEVICE_ATTR(wwan, S_IRUGO | S_IWUSR, show_wwan, store_wwan);
|
||||
static DEVICE_ATTR(display, S_IWUSR, NULL, store_disp);
|
||||
static DEVICE_ATTR(ledd, S_IRUGO | S_IWUSR, show_ledd, store_ledd);
|
||||
static DEVICE_ATTR(ls_value, S_IRUGO, show_lsvalue, NULL);
|
||||
static DEVICE_ATTR(ls_level, S_IRUGO | S_IWUSR, show_lslvl, store_lslvl);
|
||||
static DEVICE_ATTR(ls_switch, S_IRUGO | S_IWUSR, show_lssw, store_lssw);
|
||||
static DEVICE_ATTR(gps, S_IRUGO | S_IWUSR, show_gps, store_gps);
|
||||
|
||||
static struct attribute *asus_attributes[] = {
|
||||
&dev_attr_infos.attr,
|
||||
&dev_attr_wlan.attr,
|
||||
|
@ -1616,7 +1613,7 @@ static umode_t asus_sysfs_is_visible(struct kobject *kobj,
|
|||
else
|
||||
goto normal;
|
||||
|
||||
return supported;
|
||||
return supported ? attr->mode : 0;
|
||||
}
|
||||
|
||||
normal:
|
||||
|
|
|
@ -520,7 +520,7 @@ static acpi_status cmpc_get_accel(acpi_handle handle,
|
|||
{
|
||||
union acpi_object param[2];
|
||||
struct acpi_object_list input;
|
||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, 0 };
|
||||
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
unsigned char *locs;
|
||||
acpi_status status;
|
||||
|
||||
|
|
|
@ -64,6 +64,7 @@
|
|||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/backlight.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/kfifo.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -398,7 +399,7 @@ static int bl_get_brightness(struct backlight_device *b)
|
|||
static int bl_update_status(struct backlight_device *b)
|
||||
{
|
||||
int ret;
|
||||
if (b->props.power == 4)
|
||||
if (b->props.power == FB_BLANK_POWERDOWN)
|
||||
ret = call_fext_func(FUNC_BACKLIGHT, 0x1, 0x4, 0x3);
|
||||
else
|
||||
ret = call_fext_func(FUNC_BACKLIGHT, 0x1, 0x4, 0x0);
|
||||
|
@ -1139,9 +1140,9 @@ static int __init fujitsu_init(void)
|
|||
|
||||
if (!acpi_video_backlight_support()) {
|
||||
if (call_fext_func(FUNC_BACKLIGHT, 0x2, 0x4, 0x0) == 3)
|
||||
fujitsu->bl_device->props.power = 4;
|
||||
fujitsu->bl_device->props.power = FB_BLANK_POWERDOWN;
|
||||
else
|
||||
fujitsu->bl_device->props.power = 0;
|
||||
fujitsu->bl_device->props.power = FB_BLANK_UNBLANK;
|
||||
}
|
||||
|
||||
pr_info("driver " FUJITSU_DRIVER_VERSION " successfully loaded\n");
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* intel_scu_ipc.c: Driver for the Intel SCU IPC mechanism
|
||||
*
|
||||
* (C) Copyright 2008-2010 Intel Corporation
|
||||
* (C) Copyright 2008-2010,2015 Intel Corporation
|
||||
* Author: Sreedhara DS (sreedhara.ds@intel.com)
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
|
@ -43,10 +43,9 @@
|
|||
/*
|
||||
* IPC register summary
|
||||
*
|
||||
* IPC register blocks are memory mapped at fixed address of 0xFF11C000
|
||||
* IPC register blocks are memory mapped at fixed address of PCI BAR 0.
|
||||
* To read or write information to the SCU, driver writes to IPC-1 memory
|
||||
* mapped registers (base address 0xFF11C000). The following is the IPC
|
||||
* mechanism
|
||||
* mapped registers. The following is the IPC mechanism
|
||||
*
|
||||
* 1. IA core cDMI interface claims this transaction and converts it to a
|
||||
* Transaction Layer Packet (TLP) message which is sent across the cDMI.
|
||||
|
@ -67,36 +66,28 @@
|
|||
#define PCI_DEVICE_ID_CLOVERVIEW 0x08ea
|
||||
#define PCI_DEVICE_ID_TANGIER 0x11a0
|
||||
|
||||
/* intel scu ipc driver data*/
|
||||
/* intel scu ipc driver data */
|
||||
struct intel_scu_ipc_pdata_t {
|
||||
u32 ipc_base;
|
||||
u32 i2c_base;
|
||||
u32 ipc_len;
|
||||
u32 i2c_len;
|
||||
u8 irq_mode;
|
||||
};
|
||||
|
||||
static struct intel_scu_ipc_pdata_t intel_scu_ipc_lincroft_pdata = {
|
||||
.ipc_base = 0xff11c000,
|
||||
.i2c_base = 0xff12b000,
|
||||
.ipc_len = 0x100,
|
||||
.i2c_len = 0x10,
|
||||
.irq_mode = 0,
|
||||
};
|
||||
|
||||
/* Penwell and Cloverview */
|
||||
static struct intel_scu_ipc_pdata_t intel_scu_ipc_penwell_pdata = {
|
||||
.ipc_base = 0xff11c000,
|
||||
.i2c_base = 0xff12b000,
|
||||
.ipc_len = 0x100,
|
||||
.i2c_len = 0x10,
|
||||
.irq_mode = 1,
|
||||
};
|
||||
|
||||
static struct intel_scu_ipc_pdata_t intel_scu_ipc_tangier_pdata = {
|
||||
.ipc_base = 0xff009000,
|
||||
.i2c_base = 0xff00d000,
|
||||
.ipc_len = 0x100,
|
||||
.i2c_len = 0x10,
|
||||
.irq_mode = 0,
|
||||
};
|
||||
|
@ -114,8 +105,6 @@ struct intel_scu_ipc_dev {
|
|||
|
||||
static struct intel_scu_ipc_dev ipcdev; /* Only one for now */
|
||||
|
||||
static int platform; /* Platform type */
|
||||
|
||||
/*
|
||||
* IPC Read Buffer (Read Only):
|
||||
* 16 byte buffer for receiving data from SCU, if IPC command
|
||||
|
@ -160,7 +149,6 @@ static inline void ipc_data_writel(u32 data, u32 offset) /* Write ipc data */
|
|||
* Format:
|
||||
* |rfu3(8)|error code(8)|initiator id(8)|cmd id(4)|rfu1(2)|error(1)|busy(1)|
|
||||
*/
|
||||
|
||||
static inline u8 ipc_read_status(void)
|
||||
{
|
||||
return __raw_readl(ipcdev.ipc_base + 0x04);
|
||||
|
@ -176,23 +164,24 @@ static inline u32 ipc_data_readl(u32 offset) /* Read ipc u32 data */
|
|||
return readl(ipcdev.ipc_base + IPC_READ_BUFFER + offset);
|
||||
}
|
||||
|
||||
static inline int busy_loop(void) /* Wait till scu status is busy */
|
||||
/* Wait till scu status is busy */
|
||||
static inline int busy_loop(void)
|
||||
{
|
||||
u32 status = 0;
|
||||
u32 loop_count = 0;
|
||||
u32 status = ipc_read_status();
|
||||
u32 loop_count = 100000;
|
||||
|
||||
status = ipc_read_status();
|
||||
while (status & 1) {
|
||||
/* break if scu doesn't reset busy bit after huge retry */
|
||||
while ((status & BIT(0)) && --loop_count) {
|
||||
udelay(1); /* scu processing time is in few u secods */
|
||||
status = ipc_read_status();
|
||||
loop_count++;
|
||||
/* break if scu doesn't reset busy bit after huge retry */
|
||||
if (loop_count > 100000) {
|
||||
dev_err(&ipcdev.pdev->dev, "IPC timed out");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
}
|
||||
if ((status >> 1) & 1)
|
||||
|
||||
if (status & BIT(0)) {
|
||||
dev_err(&ipcdev.pdev->dev, "IPC timed out");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (status & BIT(1))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
|
@ -210,14 +199,13 @@ static inline int ipc_wait_for_interrupt(void)
|
|||
}
|
||||
|
||||
status = ipc_read_status();
|
||||
|
||||
if ((status >> 1) & 1)
|
||||
if (status & BIT(1))
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int intel_scu_ipc_check_status(void)
|
||||
static int intel_scu_ipc_check_status(void)
|
||||
{
|
||||
return ipcdev.irq_mode ? ipc_wait_for_interrupt() : busy_loop();
|
||||
}
|
||||
|
@ -248,18 +236,18 @@ static int pwr_reg_rdwr(u16 *addr, u8 *data, u32 count, u32 op, u32 id)
|
|||
if (id == IPC_CMD_PCNTRL_R) {
|
||||
for (nc = 0, offset = 0; nc < count; nc++, offset += 4)
|
||||
ipc_data_writel(wbuf[nc], offset);
|
||||
ipc_command((count*2) << 16 | id << 12 | 0 << 8 | op);
|
||||
ipc_command((count * 2) << 16 | id << 12 | 0 << 8 | op);
|
||||
} else if (id == IPC_CMD_PCNTRL_W) {
|
||||
for (nc = 0; nc < count; nc++, offset += 1)
|
||||
cbuf[offset] = data[nc];
|
||||
for (nc = 0, offset = 0; nc < count; nc++, offset += 4)
|
||||
ipc_data_writel(wbuf[nc], offset);
|
||||
ipc_command((count*3) << 16 | id << 12 | 0 << 8 | op);
|
||||
ipc_command((count * 3) << 16 | id << 12 | 0 << 8 | op);
|
||||
} else if (id == IPC_CMD_PCNTRL_M) {
|
||||
cbuf[offset] = data[0];
|
||||
cbuf[offset + 1] = data[1];
|
||||
ipc_data_writel(wbuf[0], 0); /* Write wbuff */
|
||||
ipc_command(4 << 16 | id << 12 | 0 << 8 | op);
|
||||
ipc_command(4 << 16 | id << 12 | 0 << 8 | op);
|
||||
}
|
||||
|
||||
err = intel_scu_ipc_check_status();
|
||||
|
@ -301,7 +289,7 @@ EXPORT_SYMBOL(intel_scu_ipc_ioread8);
|
|||
*/
|
||||
int intel_scu_ipc_ioread16(u16 addr, u16 *data)
|
||||
{
|
||||
u16 x[2] = {addr, addr + 1 };
|
||||
u16 x[2] = {addr, addr + 1};
|
||||
return pwr_reg_rdwr(x, (u8 *)data, 2, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_R);
|
||||
}
|
||||
EXPORT_SYMBOL(intel_scu_ipc_ioread16);
|
||||
|
@ -351,7 +339,7 @@ EXPORT_SYMBOL(intel_scu_ipc_iowrite8);
|
|||
*/
|
||||
int intel_scu_ipc_iowrite16(u16 addr, u16 data)
|
||||
{
|
||||
u16 x[2] = {addr, addr + 1 };
|
||||
u16 x[2] = {addr, addr + 1};
|
||||
return pwr_reg_rdwr(x, (u8 *)&data, 2, IPCMSG_PCNTRL, IPC_CMD_PCNTRL_W);
|
||||
}
|
||||
EXPORT_SYMBOL(intel_scu_ipc_iowrite16);
|
||||
|
@ -412,7 +400,6 @@ int intel_scu_ipc_writev(u16 *addr, u8 *data, int len)
|
|||
}
|
||||
EXPORT_SYMBOL(intel_scu_ipc_writev);
|
||||
|
||||
|
||||
/**
|
||||
* intel_scu_ipc_update_register - r/m/w a register
|
||||
* @addr: register address
|
||||
|
@ -475,9 +462,8 @@ EXPORT_SYMBOL(intel_scu_ipc_simple_command);
|
|||
* Issue a command to the SCU which involves data transfers. Do the
|
||||
* data copies under the lock but leave it for the caller to interpret
|
||||
*/
|
||||
|
||||
int intel_scu_ipc_command(int cmd, int sub, u32 *in, int inlen,
|
||||
u32 *out, int outlen)
|
||||
u32 *out, int outlen)
|
||||
{
|
||||
int i, err;
|
||||
|
||||
|
@ -503,7 +489,7 @@ int intel_scu_ipc_command(int cmd, int sub, u32 *in, int inlen,
|
|||
}
|
||||
EXPORT_SYMBOL(intel_scu_ipc_command);
|
||||
|
||||
/*I2C commands */
|
||||
/* I2C commands */
|
||||
#define IPC_I2C_WRITE 1 /* I2C Write command */
|
||||
#define IPC_I2C_READ 2 /* I2C Read command */
|
||||
|
||||
|
@ -577,7 +563,7 @@ static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
{
|
||||
int err;
|
||||
struct intel_scu_ipc_pdata_t *pdata;
|
||||
resource_size_t pci_resource;
|
||||
resource_size_t base;
|
||||
|
||||
if (ipcdev.pdev) /* We support only one SCU */
|
||||
return -EBUSY;
|
||||
|
@ -595,8 +581,8 @@ static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
pci_resource = pci_resource_start(dev, 0);
|
||||
if (!pci_resource)
|
||||
base = pci_resource_start(dev, 0);
|
||||
if (!base)
|
||||
return -ENOMEM;
|
||||
|
||||
init_completion(&ipcdev.cmd_complete);
|
||||
|
@ -604,7 +590,7 @@ static int ipc_probe(struct pci_dev *dev, const struct pci_device_id *id)
|
|||
if (request_irq(dev->irq, ioc, 0, "intel_scu_ipc", &ipcdev))
|
||||
return -EBUSY;
|
||||
|
||||
ipcdev.ipc_base = ioremap_nocache(pdata->ipc_base, pdata->ipc_len);
|
||||
ipcdev.ipc_base = ioremap_nocache(base, pci_resource_len(dev, 0));
|
||||
if (!ipcdev.ipc_base)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -666,9 +652,10 @@ static struct pci_driver ipc_driver = {
|
|||
.remove = ipc_remove,
|
||||
};
|
||||
|
||||
|
||||
static int __init intel_scu_ipc_init(void)
|
||||
{
|
||||
int platform; /* Platform type */
|
||||
|
||||
platform = intel_mid_identify_cpu();
|
||||
if (platform == 0)
|
||||
return -ENODEV;
|
||||
|
|
|
@ -124,6 +124,10 @@ struct sabi_commands {
|
|||
u16 get_wireless_status;
|
||||
u16 set_wireless_status;
|
||||
|
||||
/* 0x80 is off, 0x81 is on */
|
||||
u16 get_lid_handling;
|
||||
u16 set_lid_handling;
|
||||
|
||||
/* 0x81 to read, (0x82 | level << 8) to set, 0xaabb to enable */
|
||||
u16 kbd_backlight;
|
||||
|
||||
|
@ -194,6 +198,9 @@ static const struct sabi_config sabi_configs[] = {
|
|||
.get_wireless_status = 0xFFFF,
|
||||
.set_wireless_status = 0xFFFF,
|
||||
|
||||
.get_lid_handling = 0xFFFF,
|
||||
.set_lid_handling = 0xFFFF,
|
||||
|
||||
.kbd_backlight = 0xFFFF,
|
||||
|
||||
.set_linux = 0x0a,
|
||||
|
@ -254,6 +261,9 @@ static const struct sabi_config sabi_configs[] = {
|
|||
.get_wireless_status = 0x69,
|
||||
.set_wireless_status = 0x6a,
|
||||
|
||||
.get_lid_handling = 0x6d,
|
||||
.set_lid_handling = 0x6e,
|
||||
|
||||
.kbd_backlight = 0x78,
|
||||
|
||||
.set_linux = 0xff,
|
||||
|
@ -353,6 +363,8 @@ struct samsung_quirks {
|
|||
bool broken_acpi_video;
|
||||
bool four_kbd_backlight_levels;
|
||||
bool enable_kbd_backlight;
|
||||
bool use_native_backlight;
|
||||
bool lid_handling;
|
||||
};
|
||||
|
||||
static struct samsung_quirks samsung_unknown = {};
|
||||
|
@ -361,11 +373,19 @@ static struct samsung_quirks samsung_broken_acpi_video = {
|
|||
.broken_acpi_video = true,
|
||||
};
|
||||
|
||||
static struct samsung_quirks samsung_use_native_backlight = {
|
||||
.use_native_backlight = true,
|
||||
};
|
||||
|
||||
static struct samsung_quirks samsung_np740u3e = {
|
||||
.four_kbd_backlight_levels = true,
|
||||
.enable_kbd_backlight = true,
|
||||
};
|
||||
|
||||
static struct samsung_quirks samsung_lid_handling = {
|
||||
.lid_handling = true,
|
||||
};
|
||||
|
||||
static bool force;
|
||||
module_param(force, bool, 0);
|
||||
MODULE_PARM_DESC(force,
|
||||
|
@ -748,7 +768,7 @@ static ssize_t set_battery_life_extender(struct device *dev,
|
|||
struct samsung_laptop *samsung = dev_get_drvdata(dev);
|
||||
int ret, value;
|
||||
|
||||
if (!count || sscanf(buf, "%i", &value) != 1)
|
||||
if (!count || kstrtoint(buf, 0, &value) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
ret = write_battery_life_extender(samsung, !!value);
|
||||
|
@ -817,7 +837,7 @@ static ssize_t set_usb_charge(struct device *dev,
|
|||
struct samsung_laptop *samsung = dev_get_drvdata(dev);
|
||||
int ret, value;
|
||||
|
||||
if (!count || sscanf(buf, "%i", &value) != 1)
|
||||
if (!count || kstrtoint(buf, 0, &value) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
ret = write_usb_charge(samsung, !!value);
|
||||
|
@ -830,10 +850,76 @@ static ssize_t set_usb_charge(struct device *dev,
|
|||
static DEVICE_ATTR(usb_charge, S_IWUSR | S_IRUGO,
|
||||
get_usb_charge, set_usb_charge);
|
||||
|
||||
static int read_lid_handling(struct samsung_laptop *samsung)
|
||||
{
|
||||
const struct sabi_commands *commands = &samsung->config->commands;
|
||||
struct sabi_data data;
|
||||
int retval;
|
||||
|
||||
if (commands->get_lid_handling == 0xFFFF)
|
||||
return -ENODEV;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
retval = sabi_command(samsung, commands->get_lid_handling,
|
||||
&data, &data);
|
||||
|
||||
if (retval)
|
||||
return retval;
|
||||
|
||||
return data.data[0] & 0x1;
|
||||
}
|
||||
|
||||
static int write_lid_handling(struct samsung_laptop *samsung,
|
||||
int enabled)
|
||||
{
|
||||
const struct sabi_commands *commands = &samsung->config->commands;
|
||||
struct sabi_data data;
|
||||
|
||||
memset(&data, 0, sizeof(data));
|
||||
data.data[0] = 0x80 | enabled;
|
||||
return sabi_command(samsung, commands->set_lid_handling,
|
||||
&data, NULL);
|
||||
}
|
||||
|
||||
static ssize_t get_lid_handling(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
struct samsung_laptop *samsung = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
ret = read_lid_handling(samsung);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return sprintf(buf, "%d\n", ret);
|
||||
}
|
||||
|
||||
static ssize_t set_lid_handling(struct device *dev,
|
||||
struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct samsung_laptop *samsung = dev_get_drvdata(dev);
|
||||
int ret, value;
|
||||
|
||||
if (!count || kstrtoint(buf, 0, &value) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
ret = write_lid_handling(samsung, !!value);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static DEVICE_ATTR(lid_handling, S_IWUSR | S_IRUGO,
|
||||
get_lid_handling, set_lid_handling);
|
||||
|
||||
static struct attribute *platform_attributes[] = {
|
||||
&dev_attr_performance_level.attr,
|
||||
&dev_attr_battery_life_extender.attr,
|
||||
&dev_attr_usb_charge.attr,
|
||||
&dev_attr_lid_handling.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
|
@ -956,6 +1042,22 @@ static int __init samsung_rfkill_init(struct samsung_laptop *samsung)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void samsung_lid_handling_exit(struct samsung_laptop *samsung)
|
||||
{
|
||||
if (samsung->quirks->lid_handling)
|
||||
write_lid_handling(samsung, 0);
|
||||
}
|
||||
|
||||
static int __init samsung_lid_handling_init(struct samsung_laptop *samsung)
|
||||
{
|
||||
int retval = 0;
|
||||
|
||||
if (samsung->quirks->lid_handling)
|
||||
retval = write_lid_handling(samsung, 1);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int kbd_backlight_enable(struct samsung_laptop *samsung)
|
||||
{
|
||||
const struct sabi_commands *commands = &samsung->config->commands;
|
||||
|
@ -1111,7 +1213,7 @@ static int __init samsung_backlight_init(struct samsung_laptop *samsung)
|
|||
}
|
||||
|
||||
static umode_t samsung_sysfs_is_visible(struct kobject *kobj,
|
||||
struct attribute *attr, int idx)
|
||||
struct attribute *attr, int idx)
|
||||
{
|
||||
struct device *dev = container_of(kobj, struct device, kobj);
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
@ -1124,6 +1226,8 @@ static umode_t samsung_sysfs_is_visible(struct kobject *kobj,
|
|||
ok = !!(read_battery_life_extender(samsung) >= 0);
|
||||
if (attr == &dev_attr_usb_charge.attr)
|
||||
ok = !!(read_usb_charge(samsung) >= 0);
|
||||
if (attr == &dev_attr_lid_handling.attr)
|
||||
ok = !!(read_lid_handling(samsung) >= 0);
|
||||
|
||||
return ok ? attr->mode : 0;
|
||||
}
|
||||
|
@ -1357,7 +1461,7 @@ static int __init samsung_sabi_init(struct samsung_laptop *samsung)
|
|||
samsung_sabi_diag(samsung);
|
||||
|
||||
/* Try to find one of the signatures in memory to find the header */
|
||||
for (i = 0; sabi_configs[i].test_string != 0; ++i) {
|
||||
for (i = 0; sabi_configs[i].test_string != NULL; ++i) {
|
||||
samsung->config = &sabi_configs[i];
|
||||
loca = find_signature(samsung->f0000_segment,
|
||||
samsung->config->test_string);
|
||||
|
@ -1436,6 +1540,9 @@ static int samsung_pm_notification(struct notifier_block *nb,
|
|||
samsung->quirks->enable_kbd_backlight)
|
||||
kbd_backlight_enable(samsung);
|
||||
|
||||
if (val == PM_POST_HIBERNATION && samsung->quirks->lid_handling)
|
||||
write_lid_handling(samsung, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -1507,7 +1614,7 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "N150P"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N150P"),
|
||||
},
|
||||
.driver_data = &samsung_broken_acpi_video,
|
||||
.driver_data = &samsung_use_native_backlight,
|
||||
},
|
||||
{
|
||||
.callback = samsung_dmi_matched,
|
||||
|
@ -1517,7 +1624,7 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "N145P/N250P/N260P"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N145P/N250P/N260P"),
|
||||
},
|
||||
.driver_data = &samsung_broken_acpi_video,
|
||||
.driver_data = &samsung_use_native_backlight,
|
||||
},
|
||||
{
|
||||
.callback = samsung_dmi_matched,
|
||||
|
@ -1557,7 +1664,7 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
|
|||
DMI_MATCH(DMI_PRODUCT_NAME, "N250P"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "N250P"),
|
||||
},
|
||||
.driver_data = &samsung_broken_acpi_video,
|
||||
.driver_data = &samsung_use_native_backlight,
|
||||
},
|
||||
{
|
||||
.callback = samsung_dmi_matched,
|
||||
|
@ -1578,6 +1685,15 @@ static struct dmi_system_id __initdata samsung_dmi_table[] = {
|
|||
},
|
||||
.driver_data = &samsung_np740u3e,
|
||||
},
|
||||
{
|
||||
.callback = samsung_dmi_matched,
|
||||
.ident = "300V3Z/300V4Z/300V5Z",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "300V3Z/300V4Z/300V5Z"),
|
||||
},
|
||||
.driver_data = &samsung_lid_handling,
|
||||
},
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(dmi, samsung_dmi_table);
|
||||
|
@ -1616,6 +1732,15 @@ static int __init samsung_init(void)
|
|||
pr_info("Disabling ACPI video driver\n");
|
||||
acpi_video_unregister();
|
||||
}
|
||||
|
||||
if (samsung->quirks->use_native_backlight) {
|
||||
pr_info("Using native backlight driver\n");
|
||||
/* Tell acpi-video to not handle the backlight */
|
||||
acpi_video_dmi_promote_vendor();
|
||||
acpi_video_unregister();
|
||||
/* And also do not handle it ourselves */
|
||||
samsung->handle_backlight = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
ret = samsung_platform_init(samsung);
|
||||
|
@ -1648,6 +1773,10 @@ static int __init samsung_init(void)
|
|||
if (ret)
|
||||
goto error_leds;
|
||||
|
||||
ret = samsung_lid_handling_init(samsung);
|
||||
if (ret)
|
||||
goto error_lid_handling;
|
||||
|
||||
ret = samsung_debugfs_init(samsung);
|
||||
if (ret)
|
||||
goto error_debugfs;
|
||||
|
@ -1659,6 +1788,8 @@ static int __init samsung_init(void)
|
|||
return ret;
|
||||
|
||||
error_debugfs:
|
||||
samsung_lid_handling_exit(samsung);
|
||||
error_lid_handling:
|
||||
samsung_leds_exit(samsung);
|
||||
error_leds:
|
||||
samsung_rfkill_exit(samsung);
|
||||
|
@ -1683,6 +1814,7 @@ static void __exit samsung_exit(void)
|
|||
unregister_pm_notifier(&samsung->pm_nb);
|
||||
|
||||
samsung_debugfs_exit(samsung);
|
||||
samsung_lid_handling_exit(samsung);
|
||||
samsung_leds_exit(samsung);
|
||||
samsung_rfkill_exit(samsung);
|
||||
samsung_backlight_exit(samsung);
|
||||
|
|
|
@ -1032,7 +1032,7 @@ struct sony_backlight_props {
|
|||
u8 offset;
|
||||
u8 maxlvl;
|
||||
};
|
||||
struct sony_backlight_props sony_bl_props;
|
||||
static struct sony_backlight_props sony_bl_props;
|
||||
|
||||
static int sony_backlight_update_status(struct backlight_device *bd)
|
||||
{
|
||||
|
|
|
@ -196,6 +196,7 @@ enum tpacpi_hkey_event_t {
|
|||
/* Key-related user-interface events */
|
||||
TP_HKEY_EV_KEY_NUMLOCK = 0x6000, /* NumLock key pressed */
|
||||
TP_HKEY_EV_KEY_FN = 0x6005, /* Fn key pressed? E420 */
|
||||
TP_HKEY_EV_KEY_FN_ESC = 0x6060, /* Fn+Esc key pressed X240 */
|
||||
|
||||
/* Thermal events */
|
||||
TP_HKEY_EV_ALARM_BAT_HOT = 0x6011, /* battery too hot */
|
||||
|
@ -3456,7 +3457,7 @@ enum ADAPTIVE_KEY_MODE {
|
|||
LAYFLAT_MODE
|
||||
};
|
||||
|
||||
const int adaptive_keyboard_modes[] = {
|
||||
static const int adaptive_keyboard_modes[] = {
|
||||
HOME_MODE,
|
||||
/* WEB_BROWSER_MODE = 2,
|
||||
WEB_CONFERENCE_MODE = 3, */
|
||||
|
@ -3712,6 +3713,7 @@ static bool hotkey_notify_6xxx(const u32 hkey,
|
|||
|
||||
case TP_HKEY_EV_KEY_NUMLOCK:
|
||||
case TP_HKEY_EV_KEY_FN:
|
||||
case TP_HKEY_EV_KEY_FN_ESC:
|
||||
/* key press events, we just ignore them as long as the EC
|
||||
* is still reporting them in the normal keyboard stream */
|
||||
*send_acpi_ev = false;
|
||||
|
@ -8883,17 +8885,31 @@ static bool __pure __init tpacpi_is_fw_digit(const char c)
|
|||
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z');
|
||||
}
|
||||
|
||||
/* Most models: xxyTkkWW (#.##c); Ancient 570/600 and -SL lacks (#.##c) */
|
||||
static bool __pure __init tpacpi_is_valid_fw_id(const char * const s,
|
||||
const char t)
|
||||
{
|
||||
return s && strlen(s) >= 8 &&
|
||||
/*
|
||||
* Most models: xxyTkkWW (#.##c)
|
||||
* Ancient 570/600 and -SL lacks (#.##c)
|
||||
*/
|
||||
if (s && strlen(s) >= 8 &&
|
||||
tpacpi_is_fw_digit(s[0]) &&
|
||||
tpacpi_is_fw_digit(s[1]) &&
|
||||
s[2] == t &&
|
||||
(s[3] == 'T' || s[3] == 'N') &&
|
||||
tpacpi_is_fw_digit(s[4]) &&
|
||||
tpacpi_is_fw_digit(s[5]);
|
||||
tpacpi_is_fw_digit(s[5]))
|
||||
return true;
|
||||
|
||||
/* New models: xxxyTkkW (#.##c); T550 and some others */
|
||||
return s && strlen(s) >= 8 &&
|
||||
tpacpi_is_fw_digit(s[0]) &&
|
||||
tpacpi_is_fw_digit(s[1]) &&
|
||||
tpacpi_is_fw_digit(s[2]) &&
|
||||
s[3] == t &&
|
||||
(s[4] == 'T' || s[4] == 'N') &&
|
||||
tpacpi_is_fw_digit(s[5]) &&
|
||||
tpacpi_is_fw_digit(s[6]);
|
||||
}
|
||||
|
||||
/* returns 0 - probe ok, or < 0 - probe error.
|
||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue