removing outdated patches
This commit is contained in:
parent
d27b67bd4d
commit
9619f63485
|
@ -1,211 +0,0 @@
|
||||||
diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c
|
|
||||||
index 5a606ea..7b5eb33 100644
|
|
||||||
--- a/drivers/acpi/acpica/dbdisply.c
|
|
||||||
+++ b/drivers/acpi/acpica/dbdisply.c
|
|
||||||
@@ -642,9 +642,8 @@ void acpi_db_display_object_type(char *object_arg)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
|
|
||||||
- ACPI_FORMAT_UINT64(info->address),
|
|
||||||
- info->current_status, info->flags);
|
|
||||||
+ acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n",
|
|
||||||
+ ACPI_FORMAT_UINT64(info->address), info->flags);
|
|
||||||
|
|
||||||
acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
|
|
||||||
info->highest_dstates[0], info->highest_dstates[1],
|
|
||||||
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
|
|
||||||
index d3b6b31..37b0b4c 100644
|
|
||||||
--- a/drivers/acpi/acpica/evevent.c
|
|
||||||
+++ b/drivers/acpi/acpica/evevent.c
|
|
||||||
@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void)
|
|
||||||
u32 fixed_status;
|
|
||||||
u32 fixed_enable;
|
|
||||||
u32 i;
|
|
||||||
+ acpi_status status;
|
|
||||||
|
|
||||||
ACPI_FUNCTION_NAME(ev_fixed_event_detect);
|
|
||||||
|
|
||||||
@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void)
|
|
||||||
* Read the fixed feature status and enable registers, as all the cases
|
|
||||||
* depend on their values. Ignore errors here.
|
|
||||||
*/
|
|
||||||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
|
||||||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
|
||||||
+ status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
|
||||||
+ status |=
|
|
||||||
+ acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ return (int_status);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
|
||||||
"Fixed Event Block: Enable %08X Status %08X\n",
|
|
||||||
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c
|
|
||||||
index a8191d2..2ad13d8 100644
|
|
||||||
--- a/drivers/acpi/acpica/exdebug.c
|
|
||||||
+++ b/drivers/acpi/acpica/exdebug.c
|
|
||||||
@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|
||||||
return_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Null string or newline -- don't emit the line header */
|
|
||||||
+ /* Newline -- don't emit the line header */
|
|
||||||
|
|
||||||
if (source_desc &&
|
|
||||||
(ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
|
|
||||||
(source_desc->common.type == ACPI_TYPE_STRING)) {
|
|
||||||
- if ((source_desc->string.length == 0) ||
|
|
||||||
- ((source_desc->string.length == 1) &&
|
|
||||||
- (*source_desc->string.pointer == '\n'))) {
|
|
||||||
+ if ((source_desc->string.length == 1) &&
|
|
||||||
+ (*source_desc->string.pointer == '\n')) {
|
|
||||||
acpi_os_printf("\n");
|
|
||||||
return_VOID;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
index 5026594..573a5f3 100644
|
|
||||||
--- a/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
+++ b/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
@@ -88,10 +88,9 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
|
|
||||||
}
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
|
|
||||||
- " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
|
|
||||||
+ " HID: %s, ADR: %8.8X%8.8X\n",
|
|
||||||
info->hardware_id.value,
|
|
||||||
- ACPI_FORMAT_UINT64(info->address),
|
|
||||||
- info->current_status));
|
|
||||||
+ ACPI_FORMAT_UINT64(info->address));
|
|
||||||
ACPI_FREE(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
|
|
||||||
index 1069662..0a9c600 100644
|
|
||||||
--- a/drivers/acpi/acpica/nsxfname.c
|
|
||||||
+++ b/drivers/acpi/acpica/nsxfname.c
|
|
||||||
@@ -241,7 +241,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|
||||||
* namespace node and possibly by running several standard
|
|
||||||
* control methods (Such as in the case of a device.)
|
|
||||||
*
|
|
||||||
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
|
|
||||||
+ * For Device and Processor objects, run the Device _HID, _UID, _CID,
|
|
||||||
* _CLS, _ADR, _sx_w, and _sx_d methods.
|
|
||||||
*
|
|
||||||
* Note: Allocates the return buffer, must be freed by the caller.
|
|
||||||
@@ -250,8 +250,9 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|
||||||
* discovery namespace traversal. Therefore, no complex methods can be
|
|
||||||
* executed, especially those that access operation regions. Therefore, do
|
|
||||||
* not add any additional methods that could cause problems in this area.
|
|
||||||
- * this was the fate of the _SUB method which was found to cause such
|
|
||||||
- * problems and was removed (11/2015).
|
|
||||||
+ * Because of this reason support for the following methods has been removed:
|
|
||||||
+ * 1) _SUB method was removed (11/2015)
|
|
||||||
+ * 2) _STA method was removed (02/2018)
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle,
|
|
||||||
* Notes: none of these methods are required, so they may or may
|
|
||||||
* not be present for this device. The Info->Valid bitfield is used
|
|
||||||
* to indicate which methods were found and run successfully.
|
|
||||||
- *
|
|
||||||
- * For _STA, if the method does not exist, then (as per the ACPI
|
|
||||||
- * specification), the returned current_status flags will indicate
|
|
||||||
- * that the device is present/functional/enabled. Otherwise, the
|
|
||||||
- * current_status flags reflect the value returned from _STA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
- /* Execute the Device._STA method */
|
|
||||||
-
|
|
||||||
- status = acpi_ut_execute_STA(node, &info->current_status);
|
|
||||||
- if (ACPI_SUCCESS(status)) {
|
|
||||||
- valid |= ACPI_VALID_STA;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
/* Execute the Device._ADR method */
|
|
||||||
|
|
||||||
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node,
|
|
||||||
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c
|
|
||||||
index eb9dfac..11ce4e5 100644
|
|
||||||
--- a/drivers/acpi/acpica/psargs.c
|
|
||||||
+++ b/drivers/acpi/acpica/psargs.c
|
|
||||||
@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
|
||||||
ACPI_POSSIBLE_METHOD_CALL);
|
|
||||||
|
|
||||||
if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) {
|
|
||||||
+
|
|
||||||
+ /* Free method call op and corresponding namestring sub-ob */
|
|
||||||
+
|
|
||||||
+ acpi_ps_free_op(arg->common.value.arg);
|
|
||||||
acpi_ps_free_op(arg);
|
|
||||||
arg = NULL;
|
|
||||||
walk_state->arg_count = 1;
|
|
||||||
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
|
|
||||||
index b6d58cc..5c00e5e 100644
|
|
||||||
--- a/drivers/acpi/bus.c
|
|
||||||
+++ b/drivers/acpi/bus.c
|
|
||||||
@@ -135,6 +135,7 @@ acpi_status acpi_bus_get_status_handle(acpi_handle handle,
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
+EXPORT_SYMBOL_GPL(acpi_bus_get_status_handle);
|
|
||||||
|
|
||||||
int acpi_bus_get_status(struct acpi_device *device)
|
|
||||||
{
|
|
||||||
@@ -146,6 +147,12 @@ int acpi_bus_get_status(struct acpi_device *device)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Battery devices must have their deps met before calling _STA */
|
|
||||||
+ if (acpi_device_is_battery(device) && device->dep_unmet) {
|
|
||||||
+ acpi_set_device_status(device, 0);
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
status = acpi_bus_get_status_handle(device->handle, &sta);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return -ENODEV;
|
|
||||||
diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
|
|
||||||
index 984c7e8..8472c4a 100644
|
|
||||||
--- a/drivers/pci/hotplug/acpiphp_ibm.c
|
|
||||||
+++ b/drivers/pci/hotplug/acpiphp_ibm.c
|
|
||||||
@@ -399,6 +399,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
|
|
||||||
u32 lvl, void *context, void **rv)
|
|
||||||
{
|
|
||||||
acpi_handle *phandle = (acpi_handle *)context;
|
|
||||||
+ unsigned long long current_status = 0;
|
|
||||||
acpi_status status;
|
|
||||||
struct acpi_device_info *info;
|
|
||||||
int retval = 0;
|
|
||||||
@@ -410,7 +411,9 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (info->current_status && (info->valid & ACPI_VALID_HID) &&
|
|
||||||
+ acpi_bus_get_status_handle(handle, ¤t_status);
|
|
||||||
+
|
|
||||||
+ if (current_status && (info->valid & ACPI_VALID_HID) &&
|
|
||||||
(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
|
|
||||||
!strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
|
|
||||||
pr_debug("found hardware: %s, handle: %p\n",
|
|
||||||
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
|
|
||||||
index 4f077ed..220ef86 100644
|
|
||||||
--- a/include/acpi/actypes.h
|
|
||||||
+++ b/include/acpi/actypes.h
|
|
||||||
@@ -1191,7 +1191,6 @@ struct acpi_device_info {
|
|
||||||
u8 flags; /* Miscellaneous info */
|
|
||||||
u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
|
|
||||||
u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */
|
|
||||||
- u32 current_status; /* _STA value */
|
|
||||||
u64 address; /* _ADR value */
|
|
||||||
struct acpi_pnp_device_id hardware_id; /* _HID value */
|
|
||||||
struct acpi_pnp_device_id unique_id; /* _UID value */
|
|
||||||
@@ -1205,7 +1204,6 @@ struct acpi_device_info {
|
|
||||||
|
|
||||||
/* Flags for Valid field above (acpi_get_object_info) */
|
|
||||||
|
|
||||||
-#define ACPI_VALID_STA 0x0001
|
|
||||||
#define ACPI_VALID_ADR 0x0002
|
|
||||||
#define ACPI_VALID_HID 0x0004
|
|
||||||
#define ACPI_VALID_UID 0x0008
|
|
|
@ -1,151 +0,0 @@
|
||||||
From d4460b8c7124d6dd878acbd3207e2c41ceec5266 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Thu, 1 Feb 2018 19:25:08 -0500
|
|
||||||
Subject: initial support for surface cameras
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
index 6d22b22..b72b782 100644
|
|
||||||
--- a/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
@@ -2277,6 +2277,46 @@ MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
|
|
||||||
* though they are compliant.
|
|
||||||
*/
|
|
||||||
static const struct usb_device_id uvc_ids[] = {
|
|
||||||
+ /* Microsoft Surface Pro 3 Front */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07be,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 3 Rear */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07bf,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 4 Cam */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090c,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 1 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090b,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 2 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x091a,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
/* LogiLink Wireless Webcam */
|
|
||||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
index 9fb1bff..3954b8c 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
@@ -1,6 +1,6 @@
|
|
||||||
config VIDEO_OV5693
|
|
||||||
tristate "Omnivision ov5693 sensor support"
|
|
||||||
- depends on I2C && VIDEO_V4L2
|
|
||||||
+ depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
|
||||||
---help---
|
|
||||||
This is a Video4Linux2 sensor-level driver for the Micron
|
|
||||||
ov5693 5 Mpixel camera.
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.c b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.c
|
|
||||||
index 1236425..37986f5 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.c
|
|
||||||
@@ -1332,7 +1332,7 @@ static int power_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
|
|
||||||
static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
{
|
|
||||||
- int ret;
|
|
||||||
+ int ret = 0;
|
|
||||||
struct ov5693_device *dev = to_ov5693_sensor(sd);
|
|
||||||
|
|
||||||
if (!dev || !dev->platform_data)
|
|
||||||
@@ -1342,7 +1342,8 @@ static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
if (dev->platform_data->gpio_ctrl)
|
|
||||||
return dev->platform_data->gpio_ctrl(sd, flag);
|
|
||||||
|
|
||||||
- ret = dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+ if (dev->platform_data->gpio0_ctrl)
|
|
||||||
+ ret = dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
@@ -1709,7 +1710,7 @@ static int ov5693_detect(struct i2c_client *client)
|
|
||||||
OV5693_SC_CMMN_CHIP_ID_L, &low);
|
|
||||||
id = ((((u16) high) << 8) | (u16) low);
|
|
||||||
|
|
||||||
- if (id != OV5693_ID) {
|
|
||||||
+ if (id != OV5690_ID && id != OV5693_ID) {
|
|
||||||
dev_err(&client->dev, "sensor ID error 0x%x\n", id);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
index 8c2e679..a657f94 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
@@ -33,7 +33,7 @@
|
|
||||||
#include <linux/v4l2-mediabus.h>
|
|
||||||
#include <media/media-entity.h>
|
|
||||||
|
|
||||||
-#include "../../include/linux/atomisp_platform.h"
|
|
||||||
+#include "../../include/linux/atomisp_gmin_platform.h"
|
|
||||||
|
|
||||||
#define OV5693_NAME "ov5693"
|
|
||||||
|
|
||||||
@@ -78,7 +78,8 @@
|
|
||||||
* bits 7-0: min f-number denominator
|
|
||||||
*/
|
|
||||||
#define OV5693_F_NUMBER_RANGE 0x180a180a
|
|
||||||
-#define OV5693_ID 0x5690
|
|
||||||
+#define OV5690_ID 0x5690
|
|
||||||
+#define OV5693_ID 0x5693
|
|
||||||
|
|
||||||
#define OV5693_FINE_INTG_TIME_MIN 0
|
|
||||||
#define OV5693_FINE_INTG_TIME_MAX_MARGIN 0
|
|
||||||
diff --git a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
index edaae93..ca59c4f 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
@@ -296,11 +296,13 @@ static const struct gmin_cfg_var ecs7_vars[] = {
|
|
||||||
{"INT33BE:00_CsiFmt", "13"},
|
|
||||||
{"INT33BE:00_CsiBayer", "2"},
|
|
||||||
{"INT33BE:00_CamClk", "0"},
|
|
||||||
+ {"INT33BE:00_ClkSrc", "1"},
|
|
||||||
{"INT33F0:00_CsiPort", "0"},
|
|
||||||
{"INT33F0:00_CsiLanes", "1"},
|
|
||||||
{"INT33F0:00_CsiFmt", "13"},
|
|
||||||
{"INT33F0:00_CsiBayer", "0"},
|
|
||||||
{"INT33F0:00_CamClk", "1"},
|
|
||||||
+ {"INT33BE:00_I2CAddr", "-1"},
|
|
||||||
{"gmin_V2P8GPIO", "402"},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
@@ -325,6 +327,8 @@ static const struct {
|
|
||||||
{ "MRD7", mrd7_vars },
|
|
||||||
{ "ST70408", ecs7_vars },
|
|
||||||
{ "VTA0803", i8880_vars },
|
|
||||||
+ { "Surface Book" , ecs7_vars } ,
|
|
||||||
+ { "Surface Pro 4" , ecs7_vars } ,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,119 +0,0 @@
|
||||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
||||||
index ff539c0..d8cc7b2 100644
|
|
||||||
--- a/drivers/hid/hid-ids.h
|
|
||||||
+++ b/drivers/hid/hid-ids.h
|
|
||||||
@@ -760,11 +760,22 @@
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750
|
|
||||||
#define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c
|
|
||||||
-#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
-#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
-#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
-#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
-#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
+#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
+#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 0x07dc
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4 0x07e8
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1 0x07e4
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK_2 0x0922
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define HID_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
|
|
||||||
#define USB_VENDOR_ID_MOJO 0x8282
|
|
||||||
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
|
|
||||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
|
||||||
index 9e8c4d2..bd1b82e 100644
|
|
||||||
--- a/drivers/hid/hid-multitouch.c
|
|
||||||
+++ b/drivers/hid/hid-multitouch.c
|
|
||||||
@@ -1594,6 +1594,58 @@ static const struct hid_device_id mt_devices[] = {
|
|
||||||
HID_USB_DEVICE(USB_VENDOR_ID_LG,
|
|
||||||
USB_DEVICE_ID_LG_MELFAS_MT) },
|
|
||||||
|
|
||||||
+ /* Microsoft Touch Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TOUCH_COVER_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Type Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book 2 */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Laptop */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY,
|
|
||||||
+ USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ HID_DEVICE_ID_MS_SURFACE_LAPTOP) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Power Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_POWER_COVER) },
|
|
||||||
+
|
|
||||||
/* MosArt panels */
|
|
||||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
|
||||||
MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
|
|
||||||
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
|
|
||||||
index f489a5c..ff88ddc 100644
|
|
||||||
--- a/drivers/hid/usbhid/hid-quirks.c
|
|
||||||
+++ b/drivers/hid/usbhid/hid-quirks.c
|
|
||||||
@@ -108,8 +108,18 @@ static const struct hid_blacklist {
|
|
||||||
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A, HID_QUIRK_ALWAYS_POLL },
|
|
||||||
{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
|
|
||||||
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
- { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
|
|
|
@ -1,20 +0,0 @@
|
||||||
From a0d8418d70e4411b1dc7837f3368e9b7102703fa Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Thu, 1 Feb 2018 19:25:58 -0500
|
|
||||||
Subject: fix for surface sd card reader
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
||||||
index 8f7d942..3365703 100644
|
|
||||||
--- a/drivers/usb/core/hub.c
|
|
||||||
+++ b/drivers/usb/core/hub.c
|
|
||||||
@@ -4047,7 +4047,8 @@ void usb_enable_lpm(struct usb_device *udev)
|
|
||||||
if (!udev || !udev->parent ||
|
|
||||||
udev->speed < USB_SPEED_SUPER ||
|
|
||||||
!udev->lpm_capable ||
|
|
||||||
- udev->state < USB_STATE_DEFAULT)
|
|
||||||
+ udev->state < USB_STATE_DEFAULT ||
|
|
||||||
+ !udev->bos || !udev->bos->ss_cap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
udev->lpm_disable_count--;
|
|
|
@ -1,510 +0,0 @@
|
||||||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
|
|
||||||
index 51ebc5a..244fa92 100644
|
|
||||||
--- a/drivers/platform/x86/Kconfig
|
|
||||||
+++ b/drivers/platform/x86/Kconfig
|
|
||||||
@@ -1155,6 +1155,15 @@ config SURFACE_3_BUTTON
|
|
||||||
---help---
|
|
||||||
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
|
||||||
|
|
||||||
+config ACPI_SURFACE
|
|
||||||
+ tristate "Microsoft Surface Extras"
|
|
||||||
+ depends on ACPI
|
|
||||||
+ depends on ACPI_WMI
|
|
||||||
+ depends on INPUT
|
|
||||||
+ ---help---
|
|
||||||
+ This driver adds support for access to certain system events
|
|
||||||
+ on Microsoft Surface devices.
|
|
||||||
+
|
|
||||||
config INTEL_PUNIT_IPC
|
|
||||||
tristate "Intel P-Unit IPC Driver"
|
|
||||||
---help---
|
|
||||||
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
|
|
||||||
index 2ba6cb7..bcb0dd9 100644
|
|
||||||
--- a/drivers/platform/x86/Makefile
|
|
||||||
+++ b/drivers/platform/x86/Makefile
|
|
||||||
@@ -81,6 +81,7 @@ obj-$(CONFIG_INTEL_PMC_IPC) += intel_pmc_ipc.o
|
|
||||||
obj-$(CONFIG_SILEAD_DMI) += silead_dmi.o
|
|
||||||
obj-$(CONFIG_SURFACE_PRO3_BUTTON) += surfacepro3_button.o
|
|
||||||
obj-$(CONFIG_SURFACE_3_BUTTON) += surface3_button.o
|
|
||||||
+obj-$(CONFIG_ACPI_SURFACE) += surface_acpi.o
|
|
||||||
obj-$(CONFIG_INTEL_PUNIT_IPC) += intel_punit_ipc.o
|
|
||||||
obj-$(CONFIG_INTEL_BXTWC_PMIC_TMU) += intel_bxtwc_tmu.o
|
|
||||||
obj-$(CONFIG_INTEL_TELEMETRY) += intel_telemetry_core.o \
|
|
||||||
diff --git a/drivers/platform/x86/surface_acpi.c b/drivers/platform/x86/surface_acpi.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..bee15e7
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/platform/x86/surface_acpi.c
|
|
||||||
@@ -0,0 +1,472 @@
|
|
||||||
+/*
|
|
||||||
+ * surface_acpi.c - Microsoft Surface ACPI Notify
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify
|
|
||||||
+ * it under the terms of the GNU General Public License as published by
|
|
||||||
+ * the Free Software Foundation; either version 2 of the License, or
|
|
||||||
+ * (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope that it will be useful,
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+ * GNU General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * The full GNU General Public License is included in this distribution in
|
|
||||||
+ * the file called "COPYING".
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#define SURFACE_ACPI_VERSION "0.1"
|
|
||||||
+#define SURFACE_GEN_VERSION 0x08
|
|
||||||
+#define PROC_SURFACE "surface"
|
|
||||||
+
|
|
||||||
+#include <linux/kernel.h>
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/init.h>
|
|
||||||
+#include <linux/types.h>
|
|
||||||
+#include <linux/acpi.h>
|
|
||||||
+#include <linux/power_supply.h>
|
|
||||||
+#include <linux/thermal.h>
|
|
||||||
+#include <linux/dmi.h>
|
|
||||||
+#include <linux/seq_file.h>
|
|
||||||
+#include <acpi/acpi_bus.h>
|
|
||||||
+#include <acpi/acpi_drivers.h>
|
|
||||||
+
|
|
||||||
+MODULE_AUTHOR("Jake Day");
|
|
||||||
+MODULE_DESCRIPTION("Microsoft Surface ACPI Notify Driver");
|
|
||||||
+MODULE_LICENSE("GPL");
|
|
||||||
+
|
|
||||||
+#define SUR_METHOD_DSM "_DSM"
|
|
||||||
+#define SUR_METHOD_REG "_REG"
|
|
||||||
+#define SUR_METHOD_STA "_STA"
|
|
||||||
+#define SUR_METHOD_INI "_INI"
|
|
||||||
+#define SUR_METHOD_CRS "_CRS"
|
|
||||||
+
|
|
||||||
+#define SUR_QUERY_DEVICE 0x00
|
|
||||||
+#define SUR_SET_DVER 0x01
|
|
||||||
+#define SUR_GET_BOARD_REVID 0x02
|
|
||||||
+#define SUR_BAT1_STATE_CHANGE 0x03
|
|
||||||
+#define SUR_BAT1_INFO_CHANGE 0x04
|
|
||||||
+#define SUR_PSU_STATE_CHANGE 0x05
|
|
||||||
+#define SUR_PSU_INFO_CHANGE 0x06
|
|
||||||
+#define SUR_BAT2_STATE_CHANGE 0x07
|
|
||||||
+#define SUR_BAT2_INFO_CHANGE 0x08
|
|
||||||
+#define SUR_SENSOR_TRIP_POINT 0x09
|
|
||||||
+
|
|
||||||
+#define REG_AVAILABLE 0x01
|
|
||||||
+#define REG_INIT 0x09
|
|
||||||
+
|
|
||||||
+static char SURFACE_EVENT_GUID[] = "93b666c5-70c6-469f-a215-3d487c91ab3c";
|
|
||||||
+static char SUR_SAN_RQST[] = "\\_SB._SAN.RQST";
|
|
||||||
+static char SUR_SAN_RQSX[] = "\\_SB._SAN.RQSX";
|
|
||||||
+
|
|
||||||
+struct surface_acpi_dev {
|
|
||||||
+ acpi_handle handle;
|
|
||||||
+ acpi_handle rqst_handle;
|
|
||||||
+ acpi_handle rqsx_handle;
|
|
||||||
+
|
|
||||||
+ struct acpi_device *san_dev;
|
|
||||||
+ struct acpi_device *ssh_dev;
|
|
||||||
+ struct acpi_device *bat1_dev;
|
|
||||||
+ struct acpi_device *bat2_dev;
|
|
||||||
+ struct acpi_device *psu_dev;
|
|
||||||
+
|
|
||||||
+ unsigned int bat1_attached:1;
|
|
||||||
+ unsigned int bat2_attached:1;
|
|
||||||
+ unsigned int psu_registered:1;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static struct surface_acpi_dev *surface_acpi;
|
|
||||||
+
|
|
||||||
+static struct proc_dir_entry *surface_proc_dir;
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_check_status(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ unsigned long long value;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(dev->handle, SUR_METHOD_STA)) {
|
|
||||||
+ status = acpi_evaluate_integer(dev->handle,
|
|
||||||
+ SUR_METHOD_STA, NULL, &value);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_san_reg(void)
|
|
||||||
+{
|
|
||||||
+ union acpi_object in_objs[2], out_objs[1];
|
|
||||||
+ struct acpi_object_list params;
|
|
||||||
+ struct acpi_buffer results;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ params.count = ARRAY_SIZE(in_objs);
|
|
||||||
+ params.pointer = in_objs;
|
|
||||||
+ in_objs[0].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[0].integer.value = REG_INIT;
|
|
||||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[1].integer.value = REG_AVAILABLE;
|
|
||||||
+ results.length = sizeof(out_objs);
|
|
||||||
+ results.pointer = out_objs;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_REG)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
|
||||||
+ SUR_METHOD_REG, ¶ms, &results);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_event_handler(u32 event)
|
|
||||||
+{
|
|
||||||
+ union acpi_object in_objs[4], out_objs[5];
|
|
||||||
+ struct acpi_object_list params;
|
|
||||||
+ struct acpi_buffer results;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ params.count = ARRAY_SIZE(in_objs);
|
|
||||||
+ params.pointer = in_objs;
|
|
||||||
+ in_objs[0].type = ACPI_TYPE_BUFFER;
|
|
||||||
+ in_objs[0].buffer.length = sizeof(SURFACE_EVENT_GUID);
|
|
||||||
+ in_objs[0].buffer.pointer = SURFACE_EVENT_GUID;
|
|
||||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[1].integer.value = SUR_QUERY_DEVICE;
|
|
||||||
+ in_objs[2].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[2].integer.value = event;
|
|
||||||
+ in_objs[3].type = ACPI_TYPE_PACKAGE;
|
|
||||||
+ in_objs[3].package.count = 0;
|
|
||||||
+ in_objs[3].package.elements = SURFACE_GEN_VERSION;
|
|
||||||
+ results.length = sizeof(out_objs);
|
|
||||||
+ results.pointer = out_objs;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_DSM)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
|
||||||
+ SUR_METHOD_DSM, ¶ms, &results);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_san_load(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status ret;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_SET_DVER);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error setting Driver Version\n");
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_SENSOR_TRIP_POINT);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error setting Sensor Trip Point\n");
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_BAT1_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error attaching BAT1\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->bat1_attached = 1;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_BAT2_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error attaching BAT2\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->bat2_attached = 1;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_PSU_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error registering PSU\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->psu_registered = 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_ssh_initialize(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->ssh_dev->handle, SUR_METHOD_INI)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->ssh_dev->handle,
|
|
||||||
+ SUR_METHOD_INI, NULL, NULL);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat1_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat1_attached);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat1_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, bat1_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations bat1_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = bat1_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int bat2_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat2_attached);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat2_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, bat2_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations bat2_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = bat2_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int psu_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "registered: %d\n", surface_acpi->psu_registered);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int psu_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, psu_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations psu_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = psu_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int version_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "driver: %s\n", SURFACE_ACPI_VERSION);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int version_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, version_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations version_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = version_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void create_surface_proc_entries(void)
|
|
||||||
+{
|
|
||||||
+ proc_create_data("BAT1", 0, surface_proc_dir,
|
|
||||||
+ &bat1_proc_fops, surface_acpi->bat1_attached);
|
|
||||||
+ proc_create_data("BAT2", 0, surface_proc_dir,
|
|
||||||
+ &bat2_proc_fops, surface_acpi->bat2_attached);
|
|
||||||
+ proc_create_data("ADP1", 0, surface_proc_dir,
|
|
||||||
+ &psu_proc_fops, surface_acpi->psu_registered);
|
|
||||||
+ proc_create_data("version", 0, surface_proc_dir,
|
|
||||||
+ &version_proc_fops, SURFACE_ACPI_VERSION);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void remove_surface_proc_entries(void)
|
|
||||||
+{
|
|
||||||
+ remove_proc_entry("BAT1", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("BAT2", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("ADP1", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("version", surface_proc_dir);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_notify(struct acpi_device *dev, u32 event)
|
|
||||||
+{
|
|
||||||
+ pr_info("surface_acpi: Event received %x\n", event);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_register_rqst_handler(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQST, &surface_acpi->rqst_handle);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_register_rqsx_handler(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQSX, &surface_acpi->rqsx_handle);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_walk_callback(acpi_handle handle, u32 level,
|
|
||||||
+ void *context, void **return_value)
|
|
||||||
+{
|
|
||||||
+ struct acpi_device_info *info;
|
|
||||||
+
|
|
||||||
+ if (ACPI_SUCCESS(acpi_get_object_info(handle, &info))) {
|
|
||||||
+ pr_warn("method: name: %4.4s, args %X\n",
|
|
||||||
+ (char *)&info->name, info->param_count);
|
|
||||||
+
|
|
||||||
+ kfree(info);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_walk_namespace(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_walk_namespace(ACPI_TYPE_METHOD,
|
|
||||||
+ dev->handle, 1, surface_acpi_walk_callback,
|
|
||||||
+ NULL, NULL, NULL);
|
|
||||||
+ if (ACPI_FAILURE(status))
|
|
||||||
+ pr_warn("surface_acpi: Unable to walk acpi resources\n");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int surface_acpi_add(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ if (!surface_acpi)
|
|
||||||
+ {
|
|
||||||
+ surface_acpi = kzalloc(sizeof(*surface_acpi), GFP_KERNEL);
|
|
||||||
+ if (!surface_acpi)
|
|
||||||
+ return AE_NO_MEMORY;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(dev->handle, SUR_METHOD_DSM))
|
|
||||||
+ {
|
|
||||||
+ pr_info("surface_acpi: Attaching device MSHW0091\n");
|
|
||||||
+
|
|
||||||
+ surface_acpi->san_dev = dev;
|
|
||||||
+ surface_acpi->handle = dev->handle;
|
|
||||||
+
|
|
||||||
+ surface_acpi_walk_namespace(surface_acpi->san_dev);
|
|
||||||
+ surface_acpi_check_status(surface_acpi->san_dev);
|
|
||||||
+
|
|
||||||
+ surface_acpi_register_rqst_handler();
|
|
||||||
+ surface_acpi_register_rqsx_handler();
|
|
||||||
+
|
|
||||||
+ surface_acpi_san_reg();
|
|
||||||
+ surface_acpi_san_load();
|
|
||||||
+
|
|
||||||
+ create_surface_proc_entries();
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ pr_info("surface_acpi: Attaching device MSHW0084\n");
|
|
||||||
+
|
|
||||||
+ surface_acpi->ssh_dev = dev;
|
|
||||||
+
|
|
||||||
+ surface_acpi_walk_namespace(surface_acpi->ssh_dev);
|
|
||||||
+ surface_acpi_check_status(surface_acpi->ssh_dev);
|
|
||||||
+
|
|
||||||
+ surface_acpi_ssh_initialize();
|
|
||||||
+ //surface_acpi_ssh_load();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int surface_acpi_remove(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ remove_surface_proc_entries();
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct acpi_device_id surface_device_ids[] = {
|
|
||||||
+ {"MSHW0091", 0},
|
|
||||||
+ {"MSHW0084", 0},
|
|
||||||
+ {"", 0},
|
|
||||||
+};
|
|
||||||
+MODULE_DEVICE_TABLE(acpi, surface_device_ids);
|
|
||||||
+
|
|
||||||
+static struct acpi_driver surface_acpi_driver = {
|
|
||||||
+ .name = "surface_acpi",
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .ids = surface_device_ids,
|
|
||||||
+ .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
|
||||||
+ .ops = {
|
|
||||||
+ .add = surface_acpi_add,
|
|
||||||
+ .remove = surface_acpi_remove,
|
|
||||||
+ .notify = surface_acpi_notify,
|
|
||||||
+ },
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int __init surface_acpi_init(void)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ pr_info("surface_acpi: Microsoft Surface ACPI Notify version %s\n",
|
|
||||||
+ SURFACE_ACPI_VERSION);
|
|
||||||
+
|
|
||||||
+ surface_proc_dir = proc_mkdir(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+ if (!surface_proc_dir) {
|
|
||||||
+ pr_err("surface_acpi: Unable to create proc dir " PROC_SURFACE "\n");
|
|
||||||
+ return -ENODEV;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = acpi_bus_register_driver(&surface_acpi_driver);
|
|
||||||
+ if (ret) {
|
|
||||||
+ pr_err("surface_acpi: Failed to register ACPI driver: %d\n", ret);
|
|
||||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void __exit surface_acpi_exit(void)
|
|
||||||
+{
|
|
||||||
+ acpi_bus_unregister_driver(&surface_acpi_driver);
|
|
||||||
+ if (surface_proc_dir)
|
|
||||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+module_init(surface_acpi_init);
|
|
||||||
+module_exit(surface_acpi_exit);
|
|
|
@ -1,36 +0,0 @@
|
||||||
From 952348ceeaf9c900407762d97b2e024272f01191 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Thu, 1 Feb 2018 19:25:44 -0500
|
|
||||||
Subject: support for surface dock
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
|
|
||||||
index 05dca3e..59c2fcc 100644
|
|
||||||
--- a/drivers/net/usb/cdc_ether.c
|
|
||||||
+++ b/drivers/net/usb/cdc_ether.c
|
|
||||||
@@ -807,13 +807,6 @@ static const struct usb_device_id products[] = {
|
|
||||||
.driver_info = 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */
|
|
||||||
-{
|
|
||||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
|
||||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
||||||
- .driver_info = 0,
|
|
||||||
-},
|
|
||||||
-
|
|
||||||
/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
|
||||||
{
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
|
||||||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
|
|
||||||
index d51d9ab..b94ebe9 100644
|
|
||||||
--- a/drivers/net/usb/r8152.c
|
|
||||||
+++ b/drivers/net/usb/r8152.c
|
|
||||||
@@ -5310,7 +5310,6 @@ static const struct usb_device_id rtl8152_table[] = {
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)},
|
|
||||||
- {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)},
|
|
|
@ -1,281 +0,0 @@
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
|
||||||
index 042a1d0..fc9041f 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
|
||||||
@@ -200,8 +200,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
|
|
||||||
|
|
||||||
do {
|
|
||||||
/* Check if AMSDU can accommodate this MSDU */
|
|
||||||
- if ((skb_aggr->len + skb_src->len + LLC_SNAP_LEN) >
|
|
||||||
- adapter->tx_buf_size)
|
|
||||||
+ if (skb_tailroom(skb_aggr) < (skb_src->len + LLC_SNAP_LEN))
|
|
||||||
break;
|
|
||||||
|
|
||||||
skb_src = skb_dequeue(&pra_list->skb_head);
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
||||||
index 68aa0c7..1a883cb 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
||||||
@@ -416,6 +416,9 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
|
||||||
|
|
||||||
ps_mode = enabled;
|
|
||||||
|
|
||||||
+ mwifiex_dbg(priv->adapter, ERROR, "overriding ps_mode to false\n");
|
|
||||||
+ ps_mode = 0;
|
|
||||||
+
|
|
||||||
return mwifiex_drv_set_power(priv, &ps_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
|
||||||
index 0edc5d6..c0c9c70 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
|
||||||
@@ -998,6 +998,7 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
|
|
||||||
if (cmd_node->wait_q_enabled) {
|
|
||||||
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
|
||||||
mwifiex_cancel_pending_ioctl(adapter);
|
|
||||||
+ adapter->cmd_sent = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c
|
|
||||||
index e11919d..7f41cf8 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/init.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/init.c
|
|
||||||
@@ -60,7 +60,7 @@ static void wakeup_timer_fn(unsigned long data)
|
|
||||||
adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
|
|
||||||
mwifiex_cancel_all_pending_cmd(adapter);
|
|
||||||
|
|
||||||
- if (adapter->if_ops.card_reset && !adapter->hs_activated)
|
|
||||||
+ if (adapter->if_ops.card_reset)
|
|
||||||
adapter->if_ops.card_reset(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
|
|
||||||
index ee40b73..c7008bb 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/main.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
|
|
||||||
@@ -164,6 +164,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
|
|
||||||
spin_lock_irqsave(&adapter->main_proc_lock, flags);
|
|
||||||
if (adapter->mwifiex_processing) {
|
|
||||||
adapter->more_task_flag = true;
|
|
||||||
+ adapter->more_rx_task_flag = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
|
||||||
} else {
|
|
||||||
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
|
||||||
@@ -172,18 +173,20 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
|
|
||||||
|
|
||||||
-static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
|
|
||||||
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
|
||||||
if (adapter->rx_processing) {
|
|
||||||
+ adapter->more_rx_task_flag = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
} else {
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
queue_work(adapter->rx_workqueue, &adapter->rx_work);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work);
|
|
||||||
|
|
||||||
static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
|
||||||
{
|
|
||||||
@@ -193,13 +196,14 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
|
||||||
|
|
||||||
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
|
||||||
if (adapter->rx_processing || adapter->rx_locked) {
|
|
||||||
+ adapter->more_rx_task_flag = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
goto exit_rx_proc;
|
|
||||||
} else {
|
|
||||||
adapter->rx_processing = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+rx_process_start:
|
|
||||||
/* Check for Rx data */
|
|
||||||
while ((skb = skb_dequeue(&adapter->rx_data_q))) {
|
|
||||||
atomic_dec(&adapter->rx_pending);
|
|
||||||
@@ -221,6 +225,11 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
|
||||||
+ if (adapter->more_rx_task_flag) {
|
|
||||||
+ adapter->more_rx_task_flag = false;
|
|
||||||
+ spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
+ goto rx_process_start;
|
|
||||||
+ }
|
|
||||||
adapter->rx_processing = false;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
|
|
||||||
@@ -284,10 +293,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
|
|
||||||
mwifiex_process_hs_config(adapter);
|
|
||||||
if (adapter->if_ops.process_int_status)
|
|
||||||
adapter->if_ops.process_int_status(adapter);
|
|
||||||
+ if (adapter->rx_work_enabled && adapter->data_received)
|
|
||||||
+ mwifiex_queue_rx_work(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (adapter->rx_work_enabled && adapter->data_received)
|
|
||||||
- mwifiex_queue_rx_work(adapter);
|
|
||||||
|
|
||||||
/* Need to wake up the card ? */
|
|
||||||
if ((adapter->ps_state == PS_STATE_SLEEP) &&
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
|
|
||||||
index a76bd79..b3bfb7d 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/main.h
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
|
|
||||||
@@ -890,6 +890,7 @@ struct mwifiex_adapter {
|
|
||||||
spinlock_t main_proc_lock;
|
|
||||||
u32 mwifiex_processing;
|
|
||||||
u8 more_task_flag;
|
|
||||||
+ u8 more_rx_task_flag;
|
|
||||||
u16 tx_buf_size;
|
|
||||||
u16 curr_tx_buf_size;
|
|
||||||
/* sdio single port rx aggregation capability */
|
|
||||||
@@ -1662,6 +1663,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter, void *drv_info,
|
|
||||||
int drv_info_size);
|
|
||||||
void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
|
|
||||||
void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
|
|
||||||
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter);
|
|
||||||
int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
|
|
||||||
int cmd_type,
|
|
||||||
struct mwifiex_ds_wakeup_reason *wakeup_reason);
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
||||||
index 9511f5f..4a4737c 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
||||||
@@ -1729,6 +1729,16 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
|
|
||||||
}
|
|
||||||
|
|
||||||
rx_len = get_unaligned_le16(skb->data);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ if (rx_len == 0) {
|
|
||||||
+ mwifiex_dbg(adapter, ERROR,
|
|
||||||
+ "0 byte cmdrsp\n");
|
|
||||||
+ mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
|
|
||||||
+ PCI_DMA_FROMDEVICE);
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
|
|
||||||
skb_trim(skb, rx_len);
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
|
||||||
index fb09014..5b8329e 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
|
||||||
@@ -2313,7 +2313,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
|
||||||
if (ret)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
- if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
|
||||||
+ if (0 && priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
|
||||||
/* Enable IEEE PS by default */
|
|
||||||
priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
|
|
||||||
ret = mwifiex_send_cmd(priv,
|
|
||||||
@@ -2336,8 +2336,8 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG,
|
|
||||||
- HostCmd_ACT_GEN_GET, 0, NULL, true);
|
|
||||||
+ //mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG,
|
|
||||||
+ // HostCmd_ACT_GEN_GET, 0, NULL, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get tx rate */
|
|
||||||
@@ -2369,7 +2369,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
|
||||||
if (ret)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
- if (!disable_auto_ds && first_sta &&
|
|
||||||
+ if (0 && !disable_auto_ds && first_sta &&
|
|
||||||
priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
|
||||||
/* Enable auto deep sleep */
|
|
||||||
auto_ds.auto_ds = DEEP_SLEEP_ON;
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
|
||||||
index 0fba5b1..4e1687f 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
|
||||||
@@ -48,9 +48,14 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
|
|
||||||
struct host_cmd_ds_802_11_ps_mode_enh *pm;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
- mwifiex_dbg(adapter, ERROR,
|
|
||||||
- "CMD_RESP: cmd %#x error, result=%#x\n",
|
|
||||||
- resp->command, resp->result);
|
|
||||||
+ if (resp->command == 271 && resp->result == 2){
|
|
||||||
+ // ignore this command as the firmware does not support it
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ mwifiex_dbg(adapter, ERROR,
|
|
||||||
+ "CMD_RESP: cmd %#x error, result=%#x\n",
|
|
||||||
+ resp->command, resp->result);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (adapter->curr_cmd->wait_q_enabled)
|
|
||||||
adapter->cmd_wait_q.status = -1;
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
|
|
||||||
index f4f2b9b..bbfa9f3 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
|
|
||||||
@@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
|
|
||||||
skb_queue_tail(&adapter->rx_data_q, skb);
|
|
||||||
adapter->data_received = true;
|
|
||||||
atomic_inc(&adapter->rx_pending);
|
|
||||||
+ if (adapter->rx_work_enabled)
|
|
||||||
+ mwifiex_queue_rx_work(adapter);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mwifiex_dbg(adapter, ERROR,
|
|
||||||
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
|
|
||||||
index 68c389c..74efec3 100644
|
|
||||||
--- a/drivers/pci/pcie/portdrv_pci.c
|
|
||||||
+++ b/drivers/pci/pcie/portdrv_pci.c
|
|
||||||
@@ -150,6 +150,11 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
|
|
||||||
|
|
||||||
pci_save_state(dev);
|
|
||||||
|
|
||||||
+ /*
|
|
||||||
+ * D3cold disabled by default
|
|
||||||
+ */
|
|
||||||
+ dev->d3cold_allowed = false;
|
|
||||||
+
|
|
||||||
if (pci_bridge_d3_possible(dev)) {
|
|
||||||
/*
|
|
||||||
* Keep the port resumed 100ms to make sure things like
|
|
||||||
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
|
|
||||||
index 3dd05a0..ab32ef1 100644
|
|
||||||
--- a/net/wireless/sme.c
|
|
||||||
+++ b/net/wireless/sme.c
|
|
||||||
@@ -690,6 +690,11 @@ void __cfg80211_connect_result(struct net_device *dev,
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (WARN_ON(!wdev->ssid_len)) {
|
|
||||||
+ cfg80211_put_bss(wdev->wiphy, cr->bss);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, cr,
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
@@ -1062,7 +1067,7 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
|
|
||||||
/*
|
|
||||||
* If we have an ssid_len, we're trying to connect or are
|
|
||||||
* already connected, so reject a new SSID unless it's the
|
|
||||||
- * same (which is the case for re-association.)
|
|
||||||
+ * same (which is the case for Re-Association.
|
|
||||||
*/
|
|
||||||
if (wdev->ssid_len &&
|
|
||||||
(wdev->ssid_len != connect->ssid_len ||
|
|
||||||
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
|
|
||||||
old mode 100755
|
|
||||||
new mode 100644
|
|
|
@ -1,263 +0,0 @@
|
||||||
diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c
|
|
||||||
index 5a606ea..7b5eb33 100644
|
|
||||||
--- a/drivers/acpi/acpica/dbdisply.c
|
|
||||||
+++ b/drivers/acpi/acpica/dbdisply.c
|
|
||||||
@@ -642,9 +642,8 @@ void acpi_db_display_object_type(char *object_arg)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
|
|
||||||
- ACPI_FORMAT_UINT64(info->address),
|
|
||||||
- info->current_status, info->flags);
|
|
||||||
+ acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n",
|
|
||||||
+ ACPI_FORMAT_UINT64(info->address), info->flags);
|
|
||||||
|
|
||||||
acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
|
|
||||||
info->highest_dstates[0], info->highest_dstates[1],
|
|
||||||
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
|
|
||||||
index d3b6b31..37b0b4c 100644
|
|
||||||
--- a/drivers/acpi/acpica/evevent.c
|
|
||||||
+++ b/drivers/acpi/acpica/evevent.c
|
|
||||||
@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void)
|
|
||||||
u32 fixed_status;
|
|
||||||
u32 fixed_enable;
|
|
||||||
u32 i;
|
|
||||||
+ acpi_status status;
|
|
||||||
|
|
||||||
ACPI_FUNCTION_NAME(ev_fixed_event_detect);
|
|
||||||
|
|
||||||
@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void)
|
|
||||||
* Read the fixed feature status and enable registers, as all the cases
|
|
||||||
* depend on their values. Ignore errors here.
|
|
||||||
*/
|
|
||||||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
|
||||||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
|
||||||
+ status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
|
||||||
+ status |=
|
|
||||||
+ acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ return (int_status);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
|
||||||
"Fixed Event Block: Enable %08X Status %08X\n",
|
|
||||||
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c
|
|
||||||
index a8191d2..2ad13d8 100644
|
|
||||||
--- a/drivers/acpi/acpica/exdebug.c
|
|
||||||
+++ b/drivers/acpi/acpica/exdebug.c
|
|
||||||
@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|
||||||
return_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Null string or newline -- don't emit the line header */
|
|
||||||
+ /* Newline -- don't emit the line header */
|
|
||||||
|
|
||||||
if (source_desc &&
|
|
||||||
(ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
|
|
||||||
(source_desc->common.type == ACPI_TYPE_STRING)) {
|
|
||||||
- if ((source_desc->string.length == 0) ||
|
|
||||||
- ((source_desc->string.length == 1) &&
|
|
||||||
- (*source_desc->string.pointer == '\n'))) {
|
|
||||||
+ if ((source_desc->string.length == 1) &&
|
|
||||||
+ (*source_desc->string.pointer == '\n')) {
|
|
||||||
acpi_os_printf("\n");
|
|
||||||
return_VOID;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
index 5026594..573a5f3 100644
|
|
||||||
--- a/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
+++ b/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
@@ -88,10 +88,9 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
|
|
||||||
}
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
|
|
||||||
- " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
|
|
||||||
+ " HID: %s, ADR: %8.8X%8.8X\n",
|
|
||||||
info->hardware_id.value,
|
|
||||||
- ACPI_FORMAT_UINT64(info->address),
|
|
||||||
- info->current_status));
|
|
||||||
+ ACPI_FORMAT_UINT64(info->address));
|
|
||||||
ACPI_FREE(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
|
|
||||||
index 1069662..0a9c600 100644
|
|
||||||
--- a/drivers/acpi/acpica/nsxfname.c
|
|
||||||
+++ b/drivers/acpi/acpica/nsxfname.c
|
|
||||||
@@ -241,7 +241,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|
||||||
* namespace node and possibly by running several standard
|
|
||||||
* control methods (Such as in the case of a device.)
|
|
||||||
*
|
|
||||||
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
|
|
||||||
+ * For Device and Processor objects, run the Device _HID, _UID, _CID,
|
|
||||||
* _CLS, _ADR, _sx_w, and _sx_d methods.
|
|
||||||
*
|
|
||||||
* Note: Allocates the return buffer, must be freed by the caller.
|
|
||||||
@@ -250,8 +250,9 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|
||||||
* discovery namespace traversal. Therefore, no complex methods can be
|
|
||||||
* executed, especially those that access operation regions. Therefore, do
|
|
||||||
* not add any additional methods that could cause problems in this area.
|
|
||||||
- * this was the fate of the _SUB method which was found to cause such
|
|
||||||
- * problems and was removed (11/2015).
|
|
||||||
+ * Because of this reason support for the following methods has been removed:
|
|
||||||
+ * 1) _SUB method was removed (11/2015)
|
|
||||||
+ * 2) _STA method was removed (02/2018)
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle,
|
|
||||||
* Notes: none of these methods are required, so they may or may
|
|
||||||
* not be present for this device. The Info->Valid bitfield is used
|
|
||||||
* to indicate which methods were found and run successfully.
|
|
||||||
- *
|
|
||||||
- * For _STA, if the method does not exist, then (as per the ACPI
|
|
||||||
- * specification), the returned current_status flags will indicate
|
|
||||||
- * that the device is present/functional/enabled. Otherwise, the
|
|
||||||
- * current_status flags reflect the value returned from _STA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
- /* Execute the Device._STA method */
|
|
||||||
-
|
|
||||||
- status = acpi_ut_execute_STA(node, &info->current_status);
|
|
||||||
- if (ACPI_SUCCESS(status)) {
|
|
||||||
- valid |= ACPI_VALID_STA;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
/* Execute the Device._ADR method */
|
|
||||||
|
|
||||||
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node,
|
|
||||||
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c
|
|
||||||
index eb9dfac..11ce4e5 100644
|
|
||||||
--- a/drivers/acpi/acpica/psargs.c
|
|
||||||
+++ b/drivers/acpi/acpica/psargs.c
|
|
||||||
@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
|
||||||
ACPI_POSSIBLE_METHOD_CALL);
|
|
||||||
|
|
||||||
if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) {
|
|
||||||
+
|
|
||||||
+ /* Free method call op and corresponding namestring sub-ob */
|
|
||||||
+
|
|
||||||
+ acpi_ps_free_op(arg->common.value.arg);
|
|
||||||
acpi_ps_free_op(arg);
|
|
||||||
arg = NULL;
|
|
||||||
walk_state->arg_count = 1;
|
|
||||||
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
|
|
||||||
index b6d58cc..5c00e5e 100644
|
|
||||||
--- a/drivers/acpi/bus.c
|
|
||||||
+++ b/drivers/acpi/bus.c
|
|
||||||
@@ -135,6 +135,7 @@ acpi_status acpi_bus_get_status_handle(acpi_handle handle,
|
|
||||||
}
|
|
||||||
return status;
|
|
||||||
}
|
|
||||||
+EXPORT_SYMBOL_GPL(acpi_bus_get_status_handle);
|
|
||||||
|
|
||||||
int acpi_bus_get_status(struct acpi_device *device)
|
|
||||||
{
|
|
||||||
@@ -146,6 +147,12 @@ int acpi_bus_get_status(struct acpi_device *device)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ /* Battery devices must have their deps met before calling _STA */
|
|
||||||
+ if (acpi_device_is_battery(device) && device->dep_unmet) {
|
|
||||||
+ acpi_set_device_status(device, 0);
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
status = acpi_bus_get_status_handle(device->handle, &sta);
|
|
||||||
if (ACPI_FAILURE(status))
|
|
||||||
return -ENODEV;
|
|
||||||
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
|
|
||||||
index b0fe527..4c1b90e 100644
|
|
||||||
--- a/drivers/acpi/scan.c
|
|
||||||
+++ b/drivers/acpi/scan.c
|
|
||||||
@@ -1565,6 +1565,8 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
|
||||||
device_initialize(&device->dev);
|
|
||||||
dev_set_uevent_suppress(&device->dev, true);
|
|
||||||
acpi_init_coherency(device);
|
|
||||||
+ /* Assume there are unmet deps until acpi_device_dep_initialize runs */
|
|
||||||
+ device->dep_unmet = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void acpi_device_add_finalize(struct acpi_device *device)
|
|
||||||
@@ -1588,6 +1590,14 @@ static int acpi_add_single_object(struct acpi_device **child,
|
|
||||||
}
|
|
||||||
|
|
||||||
acpi_init_device_object(device, handle, type, sta);
|
|
||||||
+ /*
|
|
||||||
+ * For ACPI_BUS_TYPE_DEVICE getting the status is delayed till here so
|
|
||||||
+ * that we can call acpi_bus_get_status and use its quirk handling.
|
|
||||||
+ * Note this must be done before the get power-/wakeup_dev-flags calls.
|
|
||||||
+ */
|
|
||||||
+ if (type == ACPI_BUS_TYPE_DEVICE)
|
|
||||||
+ acpi_bus_get_status(device);
|
|
||||||
+
|
|
||||||
acpi_bus_get_power_flags(device);
|
|
||||||
acpi_bus_get_wakeup_device_flags(device);
|
|
||||||
|
|
||||||
@@ -1660,9 +1670,11 @@ static int acpi_bus_type_and_status(acpi_handle handle, int *type,
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
*type = ACPI_BUS_TYPE_DEVICE;
|
|
||||||
- status = acpi_bus_get_status_handle(handle, sta);
|
|
||||||
- if (ACPI_FAILURE(status))
|
|
||||||
- *sta = 0;
|
|
||||||
+ /*
|
|
||||||
+ * acpi_add_single_object updates this once we've an acpi_device
|
|
||||||
+ * so that acpi_bus_get_status' quirk handling can be used.
|
|
||||||
+ */
|
|
||||||
+ *sta = 0;
|
|
||||||
break;
|
|
||||||
case ACPI_TYPE_PROCESSOR:
|
|
||||||
*type = ACPI_BUS_TYPE_PROCESSOR;
|
|
||||||
@@ -1760,6 +1772,8 @@ static void acpi_device_dep_initialize(struct acpi_device *adev)
|
|
||||||
acpi_status status;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
+ adev->dep_unmet = 0;
|
|
||||||
+
|
|
||||||
if (!acpi_has_method(adev->handle, "_DEP"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
|
|
||||||
index 984c7e8..8472c4a 100644
|
|
||||||
--- a/drivers/pci/hotplug/acpiphp_ibm.c
|
|
||||||
+++ b/drivers/pci/hotplug/acpiphp_ibm.c
|
|
||||||
@@ -399,6 +399,7 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
|
|
||||||
u32 lvl, void *context, void **rv)
|
|
||||||
{
|
|
||||||
acpi_handle *phandle = (acpi_handle *)context;
|
|
||||||
+ unsigned long long current_status = 0;
|
|
||||||
acpi_status status;
|
|
||||||
struct acpi_device_info *info;
|
|
||||||
int retval = 0;
|
|
||||||
@@ -410,7 +411,9 @@ static acpi_status __init ibm_find_acpi_device(acpi_handle handle,
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (info->current_status && (info->valid & ACPI_VALID_HID) &&
|
|
||||||
+ acpi_bus_get_status_handle(handle, ¤t_status);
|
|
||||||
+
|
|
||||||
+ if (current_status && (info->valid & ACPI_VALID_HID) &&
|
|
||||||
(!strcmp(info->hardware_id.string, IBM_HARDWARE_ID1) ||
|
|
||||||
!strcmp(info->hardware_id.string, IBM_HARDWARE_ID2))) {
|
|
||||||
pr_debug("found hardware: %s, handle: %p\n",
|
|
||||||
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
|
|
||||||
index 4f077ed..220ef86 100644
|
|
||||||
--- a/include/acpi/actypes.h
|
|
||||||
+++ b/include/acpi/actypes.h
|
|
||||||
@@ -1191,7 +1191,6 @@ struct acpi_device_info {
|
|
||||||
u8 flags; /* Miscellaneous info */
|
|
||||||
u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
|
|
||||||
u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */
|
|
||||||
- u32 current_status; /* _STA value */
|
|
||||||
u64 address; /* _ADR value */
|
|
||||||
struct acpi_pnp_device_id hardware_id; /* _HID value */
|
|
||||||
struct acpi_pnp_device_id unique_id; /* _UID value */
|
|
||||||
@@ -1205,7 +1204,6 @@ struct acpi_device_info {
|
|
||||||
|
|
||||||
/* Flags for Valid field above (acpi_get_object_info) */
|
|
||||||
|
|
||||||
-#define ACPI_VALID_STA 0x0001
|
|
||||||
#define ACPI_VALID_ADR 0x0002
|
|
||||||
#define ACPI_VALID_HID 0x0004
|
|
||||||
#define ACPI_VALID_UID 0x0008
|
|
|
@ -1,150 +0,0 @@
|
||||||
From 5549632053d4ae06867f383694553f7af27e40c9 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Fri, 2 Feb 2018 11:07:32 -0500
|
|
||||||
Subject: initial support for surface cameras
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
index 28b91b7..0e5989c 100644
|
|
||||||
--- a/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
@@ -2277,6 +2277,46 @@ MODULE_PARM_DESC(timeout, "Streaming control requests timeout");
|
|
||||||
* though they are compliant.
|
|
||||||
*/
|
|
||||||
static const struct usb_device_id uvc_ids[] = {
|
|
||||||
+ /* Microsoft Surface Pro 3 Front */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07be,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 3 Rear */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07bf,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 4 Cam */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090c,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 1 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090b,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 2 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x091a,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
/* LogiLink Wireless Webcam */
|
|
||||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
index 3f527f2..b882948 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
config VIDEO_ATOMISP_OV5693
|
|
||||||
tristate "Omnivision ov5693 sensor support"
|
|
||||||
depends on ACPI
|
|
||||||
- depends on I2C && VIDEO_V4L2
|
|
||||||
+ depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
|
||||||
---help---
|
|
||||||
This is a Video4Linux2 sensor-level driver for the Micron
|
|
||||||
ov5693 5 Mpixel camera.
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
index 3e7c385..9b1fc1c 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
@@ -1320,11 +1320,15 @@ static int power_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
{
|
|
||||||
struct ov5693_device *dev = to_ov5693_sensor(sd);
|
|
||||||
+ int ret = 0;
|
|
||||||
|
|
||||||
if (!dev || !dev->platform_data)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
- return dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+ if (dev->platform_data->gpio0_ctrl)
|
|
||||||
+ ret = dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __power_up(struct v4l2_subdev *sd)
|
|
||||||
@@ -1689,7 +1693,7 @@ static int ov5693_detect(struct i2c_client *client)
|
|
||||||
OV5693_SC_CMMN_CHIP_ID_L, &low);
|
|
||||||
id = ((((u16) high) << 8) | (u16) low);
|
|
||||||
|
|
||||||
- if (id != OV5693_ID) {
|
|
||||||
+ if (id != OV5690_ID && id != OV5693_ID) {
|
|
||||||
dev_err(&client->dev, "sensor ID error 0x%x\n", id);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
index 2ea6380..2168daa 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
@@ -29,7 +29,7 @@
|
|
||||||
#include <linux/v4l2-mediabus.h>
|
|
||||||
#include <media/media-entity.h>
|
|
||||||
|
|
||||||
-#include "../../include/linux/atomisp_platform.h"
|
|
||||||
+#include "../../include/linux/atomisp_gmin_platform.h"
|
|
||||||
|
|
||||||
#define OV5693_POWER_UP_RETRY_NUM 5
|
|
||||||
|
|
||||||
@@ -72,7 +72,8 @@
|
|
||||||
* bits 7-0: min f-number denominator
|
|
||||||
*/
|
|
||||||
#define OV5693_F_NUMBER_RANGE 0x180a180a
|
|
||||||
-#define OV5693_ID 0x5690
|
|
||||||
+#define OV5690_ID 0x5690
|
|
||||||
+#define OV5693_ID 0x5693
|
|
||||||
|
|
||||||
#define OV5693_FINE_INTG_TIME_MIN 0
|
|
||||||
#define OV5693_FINE_INTG_TIME_MAX_MARGIN 0
|
|
||||||
diff --git a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
index bf9f34b..6797ba1 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
@@ -251,11 +251,13 @@ static const struct gmin_cfg_var ecs7_vars[] = {
|
|
||||||
{"INT33BE:00_CsiFmt", "13"},
|
|
||||||
{"INT33BE:00_CsiBayer", "2"},
|
|
||||||
{"INT33BE:00_CamClk", "0"},
|
|
||||||
+ {"INT33BE:00_ClkSrc", "1"},
|
|
||||||
{"INT33F0:00_CsiPort", "0"},
|
|
||||||
{"INT33F0:00_CsiLanes", "1"},
|
|
||||||
{"INT33F0:00_CsiFmt", "13"},
|
|
||||||
{"INT33F0:00_CsiBayer", "0"},
|
|
||||||
{"INT33F0:00_CamClk", "1"},
|
|
||||||
+ {"INT33BE:00_I2CAddr", "-1"},
|
|
||||||
{"gmin_V2P8GPIO", "402"},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
@@ -280,6 +282,8 @@ static const struct {
|
|
||||||
{ "MRD7", mrd7_vars },
|
|
||||||
{ "ST70408", ecs7_vars },
|
|
||||||
{ "VTA0803", i8880_vars },
|
|
||||||
+ { "Surface Book" , ecs7_vars } ,
|
|
||||||
+ { "Surface Pro 4" , ecs7_vars } ,
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,119 +0,0 @@
|
||||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
||||||
index a0baa5b..3e03ced8 100644
|
|
||||||
--- a/drivers/hid/hid-ids.h
|
|
||||||
+++ b/drivers/hid/hid-ids.h
|
|
||||||
@@ -770,11 +770,22 @@
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750
|
|
||||||
#define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c
|
|
||||||
-#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
-#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
-#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
-#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
-#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
+#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
+#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 0x07dc
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4 0x07e8
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1 0x07e4
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK_2 0x0922
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define HID_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
|
|
||||||
#define USB_VENDOR_ID_MOJO 0x8282
|
|
||||||
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
|
|
||||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
|
||||||
index 65ea23b..00ce3be 100644
|
|
||||||
--- a/drivers/hid/hid-multitouch.c
|
|
||||||
+++ b/drivers/hid/hid-multitouch.c
|
|
||||||
@@ -1638,6 +1638,58 @@ static const struct hid_device_id mt_devices[] = {
|
|
||||||
HID_USB_DEVICE(USB_VENDOR_ID_LG,
|
|
||||||
USB_DEVICE_ID_LG_MELFAS_MT) },
|
|
||||||
|
|
||||||
+ /* Microsoft Touch Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TOUCH_COVER_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Type Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book 2 */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Laptop */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY,
|
|
||||||
+ USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ HID_DEVICE_ID_MS_SURFACE_LAPTOP) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Power Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_POWER_COVER) },
|
|
||||||
+
|
|
||||||
/* MosArt panels */
|
|
||||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
|
||||||
MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
|
|
||||||
diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
|
|
||||||
index 331f7f3..6ff429f 100644
|
|
||||||
--- a/drivers/hid/usbhid/hid-quirks.c
|
|
||||||
+++ b/drivers/hid/usbhid/hid-quirks.c
|
|
||||||
@@ -108,8 +108,18 @@ static const struct hid_blacklist {
|
|
||||||
{ USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_MOUSE_C06A, HID_QUIRK_ALWAYS_POLL },
|
|
||||||
{ USB_VENDOR_ID_MGE, USB_DEVICE_ID_MGE_UPS, HID_QUIRK_NOGET },
|
|
||||||
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
- { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK_2, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS },
|
|
|
@ -1,20 +0,0 @@
|
||||||
From fbd83f772a3be3a00bae323f6d71a59b26352c57 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Fri, 2 Feb 2018 11:22:21 -0500
|
|
||||||
Subject: fix for surface sd card reader
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
||||||
index cf7bbcb..826fdb8 100644
|
|
||||||
--- a/drivers/usb/core/hub.c
|
|
||||||
+++ b/drivers/usb/core/hub.c
|
|
||||||
@@ -4047,7 +4047,8 @@ void usb_enable_lpm(struct usb_device *udev)
|
|
||||||
if (!udev || !udev->parent ||
|
|
||||||
udev->speed < USB_SPEED_SUPER ||
|
|
||||||
!udev->lpm_capable ||
|
|
||||||
- udev->state < USB_STATE_DEFAULT)
|
|
||||||
+ udev->state < USB_STATE_DEFAULT ||
|
|
||||||
+ !udev->bos || !udev->bos->ss_cap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
udev->lpm_disable_count--;
|
|
|
@ -1,510 +0,0 @@
|
||||||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
|
|
||||||
index 51ebc5a..244fa92 100644
|
|
||||||
--- a/drivers/platform/x86/Kconfig
|
|
||||||
+++ b/drivers/platform/x86/Kconfig
|
|
||||||
@@ -1155,6 +1155,15 @@ config SURFACE_3_BUTTON
|
|
||||||
---help---
|
|
||||||
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
|
||||||
|
|
||||||
+config ACPI_SURFACE
|
|
||||||
+ tristate "Microsoft Surface Extras"
|
|
||||||
+ depends on ACPI
|
|
||||||
+ depends on ACPI_WMI
|
|
||||||
+ depends on INPUT
|
|
||||||
+ ---help---
|
|
||||||
+ This driver adds support for access to certain system events
|
|
||||||
+ on Microsoft Surface devices.
|
|
||||||
+
|
|
||||||
config INTEL_PUNIT_IPC
|
|
||||||
tristate "Intel P-Unit IPC Driver"
|
|
||||||
---help---
|
|
||||||
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
|
|
||||||
index 2ba6cb7..bcb0dd9 100644
|
|
||||||
--- a/drivers/platform/x86/Makefile
|
|
||||||
+++ b/drivers/platform/x86/Makefile
|
|
||||||
@@ -81,6 +81,7 @@ obj-$(CONFIG_INTEL_PMC_IPC) += intel_pmc_ipc.o
|
|
||||||
obj-$(CONFIG_SILEAD_DMI) += silead_dmi.o
|
|
||||||
obj-$(CONFIG_SURFACE_PRO3_BUTTON) += surfacepro3_button.o
|
|
||||||
obj-$(CONFIG_SURFACE_3_BUTTON) += surface3_button.o
|
|
||||||
+obj-$(CONFIG_ACPI_SURFACE) += surface_acpi.o
|
|
||||||
obj-$(CONFIG_INTEL_PUNIT_IPC) += intel_punit_ipc.o
|
|
||||||
obj-$(CONFIG_INTEL_BXTWC_PMIC_TMU) += intel_bxtwc_tmu.o
|
|
||||||
obj-$(CONFIG_INTEL_TELEMETRY) += intel_telemetry_core.o \
|
|
||||||
diff --git a/drivers/platform/x86/surface_acpi.c b/drivers/platform/x86/surface_acpi.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..bee15e7
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/platform/x86/surface_acpi.c
|
|
||||||
@@ -0,0 +1,472 @@
|
|
||||||
+/*
|
|
||||||
+ * surface_acpi.c - Microsoft Surface ACPI Notify
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify
|
|
||||||
+ * it under the terms of the GNU General Public License as published by
|
|
||||||
+ * the Free Software Foundation; either version 2 of the License, or
|
|
||||||
+ * (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope that it will be useful,
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+ * GNU General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * The full GNU General Public License is included in this distribution in
|
|
||||||
+ * the file called "COPYING".
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#define SURFACE_ACPI_VERSION "0.1"
|
|
||||||
+#define SURFACE_GEN_VERSION 0x08
|
|
||||||
+#define PROC_SURFACE "surface"
|
|
||||||
+
|
|
||||||
+#include <linux/kernel.h>
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/init.h>
|
|
||||||
+#include <linux/types.h>
|
|
||||||
+#include <linux/acpi.h>
|
|
||||||
+#include <linux/power_supply.h>
|
|
||||||
+#include <linux/thermal.h>
|
|
||||||
+#include <linux/dmi.h>
|
|
||||||
+#include <linux/seq_file.h>
|
|
||||||
+#include <acpi/acpi_bus.h>
|
|
||||||
+#include <acpi/acpi_drivers.h>
|
|
||||||
+
|
|
||||||
+MODULE_AUTHOR("Jake Day");
|
|
||||||
+MODULE_DESCRIPTION("Microsoft Surface ACPI Notify Driver");
|
|
||||||
+MODULE_LICENSE("GPL");
|
|
||||||
+
|
|
||||||
+#define SUR_METHOD_DSM "_DSM"
|
|
||||||
+#define SUR_METHOD_REG "_REG"
|
|
||||||
+#define SUR_METHOD_STA "_STA"
|
|
||||||
+#define SUR_METHOD_INI "_INI"
|
|
||||||
+#define SUR_METHOD_CRS "_CRS"
|
|
||||||
+
|
|
||||||
+#define SUR_QUERY_DEVICE 0x00
|
|
||||||
+#define SUR_SET_DVER 0x01
|
|
||||||
+#define SUR_GET_BOARD_REVID 0x02
|
|
||||||
+#define SUR_BAT1_STATE_CHANGE 0x03
|
|
||||||
+#define SUR_BAT1_INFO_CHANGE 0x04
|
|
||||||
+#define SUR_PSU_STATE_CHANGE 0x05
|
|
||||||
+#define SUR_PSU_INFO_CHANGE 0x06
|
|
||||||
+#define SUR_BAT2_STATE_CHANGE 0x07
|
|
||||||
+#define SUR_BAT2_INFO_CHANGE 0x08
|
|
||||||
+#define SUR_SENSOR_TRIP_POINT 0x09
|
|
||||||
+
|
|
||||||
+#define REG_AVAILABLE 0x01
|
|
||||||
+#define REG_INIT 0x09
|
|
||||||
+
|
|
||||||
+static char SURFACE_EVENT_GUID[] = "93b666c5-70c6-469f-a215-3d487c91ab3c";
|
|
||||||
+static char SUR_SAN_RQST[] = "\\_SB._SAN.RQST";
|
|
||||||
+static char SUR_SAN_RQSX[] = "\\_SB._SAN.RQSX";
|
|
||||||
+
|
|
||||||
+struct surface_acpi_dev {
|
|
||||||
+ acpi_handle handle;
|
|
||||||
+ acpi_handle rqst_handle;
|
|
||||||
+ acpi_handle rqsx_handle;
|
|
||||||
+
|
|
||||||
+ struct acpi_device *san_dev;
|
|
||||||
+ struct acpi_device *ssh_dev;
|
|
||||||
+ struct acpi_device *bat1_dev;
|
|
||||||
+ struct acpi_device *bat2_dev;
|
|
||||||
+ struct acpi_device *psu_dev;
|
|
||||||
+
|
|
||||||
+ unsigned int bat1_attached:1;
|
|
||||||
+ unsigned int bat2_attached:1;
|
|
||||||
+ unsigned int psu_registered:1;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static struct surface_acpi_dev *surface_acpi;
|
|
||||||
+
|
|
||||||
+static struct proc_dir_entry *surface_proc_dir;
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_check_status(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ unsigned long long value;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(dev->handle, SUR_METHOD_STA)) {
|
|
||||||
+ status = acpi_evaluate_integer(dev->handle,
|
|
||||||
+ SUR_METHOD_STA, NULL, &value);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_san_reg(void)
|
|
||||||
+{
|
|
||||||
+ union acpi_object in_objs[2], out_objs[1];
|
|
||||||
+ struct acpi_object_list params;
|
|
||||||
+ struct acpi_buffer results;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ params.count = ARRAY_SIZE(in_objs);
|
|
||||||
+ params.pointer = in_objs;
|
|
||||||
+ in_objs[0].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[0].integer.value = REG_INIT;
|
|
||||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[1].integer.value = REG_AVAILABLE;
|
|
||||||
+ results.length = sizeof(out_objs);
|
|
||||||
+ results.pointer = out_objs;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_REG)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
|
||||||
+ SUR_METHOD_REG, ¶ms, &results);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_event_handler(u32 event)
|
|
||||||
+{
|
|
||||||
+ union acpi_object in_objs[4], out_objs[5];
|
|
||||||
+ struct acpi_object_list params;
|
|
||||||
+ struct acpi_buffer results;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ params.count = ARRAY_SIZE(in_objs);
|
|
||||||
+ params.pointer = in_objs;
|
|
||||||
+ in_objs[0].type = ACPI_TYPE_BUFFER;
|
|
||||||
+ in_objs[0].buffer.length = sizeof(SURFACE_EVENT_GUID);
|
|
||||||
+ in_objs[0].buffer.pointer = SURFACE_EVENT_GUID;
|
|
||||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[1].integer.value = SUR_QUERY_DEVICE;
|
|
||||||
+ in_objs[2].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[2].integer.value = event;
|
|
||||||
+ in_objs[3].type = ACPI_TYPE_PACKAGE;
|
|
||||||
+ in_objs[3].package.count = 0;
|
|
||||||
+ in_objs[3].package.elements = SURFACE_GEN_VERSION;
|
|
||||||
+ results.length = sizeof(out_objs);
|
|
||||||
+ results.pointer = out_objs;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_DSM)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
|
||||||
+ SUR_METHOD_DSM, ¶ms, &results);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_san_load(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status ret;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_SET_DVER);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error setting Driver Version\n");
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_SENSOR_TRIP_POINT);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error setting Sensor Trip Point\n");
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_BAT1_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error attaching BAT1\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->bat1_attached = 1;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_BAT2_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error attaching BAT2\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->bat2_attached = 1;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_PSU_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error registering PSU\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->psu_registered = 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_ssh_initialize(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->ssh_dev->handle, SUR_METHOD_INI)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->ssh_dev->handle,
|
|
||||||
+ SUR_METHOD_INI, NULL, NULL);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat1_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat1_attached);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat1_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, bat1_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations bat1_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = bat1_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int bat2_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat2_attached);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat2_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, bat2_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations bat2_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = bat2_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int psu_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "registered: %d\n", surface_acpi->psu_registered);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int psu_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, psu_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations psu_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = psu_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int version_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "driver: %s\n", SURFACE_ACPI_VERSION);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int version_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, version_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations version_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = version_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void create_surface_proc_entries(void)
|
|
||||||
+{
|
|
||||||
+ proc_create_data("BAT1", 0, surface_proc_dir,
|
|
||||||
+ &bat1_proc_fops, surface_acpi->bat1_attached);
|
|
||||||
+ proc_create_data("BAT2", 0, surface_proc_dir,
|
|
||||||
+ &bat2_proc_fops, surface_acpi->bat2_attached);
|
|
||||||
+ proc_create_data("ADP1", 0, surface_proc_dir,
|
|
||||||
+ &psu_proc_fops, surface_acpi->psu_registered);
|
|
||||||
+ proc_create_data("version", 0, surface_proc_dir,
|
|
||||||
+ &version_proc_fops, SURFACE_ACPI_VERSION);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void remove_surface_proc_entries(void)
|
|
||||||
+{
|
|
||||||
+ remove_proc_entry("BAT1", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("BAT2", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("ADP1", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("version", surface_proc_dir);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_notify(struct acpi_device *dev, u32 event)
|
|
||||||
+{
|
|
||||||
+ pr_info("surface_acpi: Event received %x\n", event);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_register_rqst_handler(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQST, &surface_acpi->rqst_handle);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_register_rqsx_handler(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQSX, &surface_acpi->rqsx_handle);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_walk_callback(acpi_handle handle, u32 level,
|
|
||||||
+ void *context, void **return_value)
|
|
||||||
+{
|
|
||||||
+ struct acpi_device_info *info;
|
|
||||||
+
|
|
||||||
+ if (ACPI_SUCCESS(acpi_get_object_info(handle, &info))) {
|
|
||||||
+ pr_warn("method: name: %4.4s, args %X\n",
|
|
||||||
+ (char *)&info->name, info->param_count);
|
|
||||||
+
|
|
||||||
+ kfree(info);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_walk_namespace(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_walk_namespace(ACPI_TYPE_METHOD,
|
|
||||||
+ dev->handle, 1, surface_acpi_walk_callback,
|
|
||||||
+ NULL, NULL, NULL);
|
|
||||||
+ if (ACPI_FAILURE(status))
|
|
||||||
+ pr_warn("surface_acpi: Unable to walk acpi resources\n");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int surface_acpi_add(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ if (!surface_acpi)
|
|
||||||
+ {
|
|
||||||
+ surface_acpi = kzalloc(sizeof(*surface_acpi), GFP_KERNEL);
|
|
||||||
+ if (!surface_acpi)
|
|
||||||
+ return AE_NO_MEMORY;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(dev->handle, SUR_METHOD_DSM))
|
|
||||||
+ {
|
|
||||||
+ pr_info("surface_acpi: Attaching device MSHW0091\n");
|
|
||||||
+
|
|
||||||
+ surface_acpi->san_dev = dev;
|
|
||||||
+ surface_acpi->handle = dev->handle;
|
|
||||||
+
|
|
||||||
+ surface_acpi_walk_namespace(surface_acpi->san_dev);
|
|
||||||
+ surface_acpi_check_status(surface_acpi->san_dev);
|
|
||||||
+
|
|
||||||
+ surface_acpi_register_rqst_handler();
|
|
||||||
+ surface_acpi_register_rqsx_handler();
|
|
||||||
+
|
|
||||||
+ surface_acpi_san_reg();
|
|
||||||
+ surface_acpi_san_load();
|
|
||||||
+
|
|
||||||
+ create_surface_proc_entries();
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ pr_info("surface_acpi: Attaching device MSHW0084\n");
|
|
||||||
+
|
|
||||||
+ surface_acpi->ssh_dev = dev;
|
|
||||||
+
|
|
||||||
+ surface_acpi_walk_namespace(surface_acpi->ssh_dev);
|
|
||||||
+ surface_acpi_check_status(surface_acpi->ssh_dev);
|
|
||||||
+
|
|
||||||
+ surface_acpi_ssh_initialize();
|
|
||||||
+ //surface_acpi_ssh_load();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int surface_acpi_remove(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ remove_surface_proc_entries();
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct acpi_device_id surface_device_ids[] = {
|
|
||||||
+ {"MSHW0091", 0},
|
|
||||||
+ {"MSHW0084", 0},
|
|
||||||
+ {"", 0},
|
|
||||||
+};
|
|
||||||
+MODULE_DEVICE_TABLE(acpi, surface_device_ids);
|
|
||||||
+
|
|
||||||
+static struct acpi_driver surface_acpi_driver = {
|
|
||||||
+ .name = "surface_acpi",
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .ids = surface_device_ids,
|
|
||||||
+ .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
|
||||||
+ .ops = {
|
|
||||||
+ .add = surface_acpi_add,
|
|
||||||
+ .remove = surface_acpi_remove,
|
|
||||||
+ .notify = surface_acpi_notify,
|
|
||||||
+ },
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int __init surface_acpi_init(void)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ pr_info("surface_acpi: Microsoft Surface ACPI Notify version %s\n",
|
|
||||||
+ SURFACE_ACPI_VERSION);
|
|
||||||
+
|
|
||||||
+ surface_proc_dir = proc_mkdir(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+ if (!surface_proc_dir) {
|
|
||||||
+ pr_err("surface_acpi: Unable to create proc dir " PROC_SURFACE "\n");
|
|
||||||
+ return -ENODEV;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = acpi_bus_register_driver(&surface_acpi_driver);
|
|
||||||
+ if (ret) {
|
|
||||||
+ pr_err("surface_acpi: Failed to register ACPI driver: %d\n", ret);
|
|
||||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void __exit surface_acpi_exit(void)
|
|
||||||
+{
|
|
||||||
+ acpi_bus_unregister_driver(&surface_acpi_driver);
|
|
||||||
+ if (surface_proc_dir)
|
|
||||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+module_init(surface_acpi_init);
|
|
||||||
+module_exit(surface_acpi_exit);
|
|
|
@ -1,36 +0,0 @@
|
||||||
From 3600aaa37a16777a07aa34672f12e30a1ae4d95b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Fri, 2 Feb 2018 11:21:06 -0500
|
|
||||||
Subject: support for surface dock
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
|
|
||||||
index 05dca3e..59c2fcc 100644
|
|
||||||
--- a/drivers/net/usb/cdc_ether.c
|
|
||||||
+++ b/drivers/net/usb/cdc_ether.c
|
|
||||||
@@ -807,13 +807,6 @@ static const struct usb_device_id products[] = {
|
|
||||||
.driver_info = 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */
|
|
||||||
-{
|
|
||||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
|
||||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
||||||
- .driver_info = 0,
|
|
||||||
-},
|
|
||||||
-
|
|
||||||
/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
|
||||||
{
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
|
||||||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
|
|
||||||
index 0657203..0a52ea0 100644
|
|
||||||
--- a/drivers/net/usb/r8152.c
|
|
||||||
+++ b/drivers/net/usb/r8152.c
|
|
||||||
@@ -5323,7 +5323,6 @@ static const struct usb_device_id rtl8152_table[] = {
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)},
|
|
||||||
- {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)},
|
|
|
@ -1,281 +0,0 @@
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
|
||||||
index 042a1d0..fc9041f 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
|
||||||
@@ -200,8 +200,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
|
|
||||||
|
|
||||||
do {
|
|
||||||
/* Check if AMSDU can accommodate this MSDU */
|
|
||||||
- if ((skb_aggr->len + skb_src->len + LLC_SNAP_LEN) >
|
|
||||||
- adapter->tx_buf_size)
|
|
||||||
+ if (skb_tailroom(skb_aggr) < (skb_src->len + LLC_SNAP_LEN))
|
|
||||||
break;
|
|
||||||
|
|
||||||
skb_src = skb_dequeue(&pra_list->skb_head);
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
||||||
index f324011..7f31e43 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
|
||||||
@@ -416,6 +416,9 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
|
||||||
|
|
||||||
ps_mode = enabled;
|
|
||||||
|
|
||||||
+ mwifiex_dbg(priv->adapter, ERROR, "overriding ps_mode to false\n");
|
|
||||||
+ ps_mode = 0;
|
|
||||||
+
|
|
||||||
return mwifiex_drv_set_power(priv, &ps_mode);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
|
||||||
index dcc529e..3998ffb 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
|
||||||
@@ -995,6 +995,7 @@ mwifiex_cmd_timeout_func(struct timer_list *t)
|
|
||||||
if (cmd_node->wait_q_enabled) {
|
|
||||||
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
|
||||||
mwifiex_cancel_pending_ioctl(adapter);
|
|
||||||
+ adapter->cmd_sent = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c
|
|
||||||
index e1aa860..328829b 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/init.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/init.c
|
|
||||||
@@ -60,7 +60,7 @@ static void wakeup_timer_fn(struct timer_list *t)
|
|
||||||
adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
|
|
||||||
mwifiex_cancel_all_pending_cmd(adapter);
|
|
||||||
|
|
||||||
- if (adapter->if_ops.card_reset && !adapter->hs_activated)
|
|
||||||
+ if (adapter->if_ops.card_reset)
|
|
||||||
adapter->if_ops.card_reset(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
|
|
||||||
index a96bd7e..79b026f 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/main.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
|
|
||||||
@@ -163,6 +163,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
|
|
||||||
spin_lock_irqsave(&adapter->main_proc_lock, flags);
|
|
||||||
if (adapter->mwifiex_processing) {
|
|
||||||
adapter->more_task_flag = true;
|
|
||||||
+ adapter->more_rx_task_flag = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
|
||||||
} else {
|
|
||||||
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
|
||||||
@@ -171,18 +172,20 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
|
|
||||||
|
|
||||||
-static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
|
|
||||||
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
|
||||||
if (adapter->rx_processing) {
|
|
||||||
+ adapter->more_rx_task_flag = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
} else {
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
queue_work(adapter->rx_workqueue, &adapter->rx_work);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work);
|
|
||||||
|
|
||||||
static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
|
||||||
{
|
|
||||||
@@ -192,13 +195,14 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
|
||||||
|
|
||||||
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
|
||||||
if (adapter->rx_processing || adapter->rx_locked) {
|
|
||||||
+ adapter->more_rx_task_flag = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
goto exit_rx_proc;
|
|
||||||
} else {
|
|
||||||
adapter->rx_processing = true;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
}
|
|
||||||
-
|
|
||||||
+rx_process_start:
|
|
||||||
/* Check for Rx data */
|
|
||||||
while ((skb = skb_dequeue(&adapter->rx_data_q))) {
|
|
||||||
atomic_dec(&adapter->rx_pending);
|
|
||||||
@@ -220,6 +224,11 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
|
||||||
+ if (adapter->more_rx_task_flag) {
|
|
||||||
+ adapter->more_rx_task_flag = false;
|
|
||||||
+ spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
+ goto rx_process_start;
|
|
||||||
+ }
|
|
||||||
adapter->rx_processing = false;
|
|
||||||
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
|
||||||
|
|
||||||
@@ -283,10 +292,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
|
|
||||||
mwifiex_process_hs_config(adapter);
|
|
||||||
if (adapter->if_ops.process_int_status)
|
|
||||||
adapter->if_ops.process_int_status(adapter);
|
|
||||||
+ if (adapter->rx_work_enabled && adapter->data_received)
|
|
||||||
+ mwifiex_queue_rx_work(adapter);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if (adapter->rx_work_enabled && adapter->data_received)
|
|
||||||
- mwifiex_queue_rx_work(adapter);
|
|
||||||
|
|
||||||
/* Need to wake up the card ? */
|
|
||||||
if ((adapter->ps_state == PS_STATE_SLEEP) &&
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
|
|
||||||
index 154c079..4205344 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/main.h
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
|
|
||||||
@@ -889,6 +889,7 @@ struct mwifiex_adapter {
|
|
||||||
spinlock_t main_proc_lock;
|
|
||||||
u32 mwifiex_processing;
|
|
||||||
u8 more_task_flag;
|
|
||||||
+ u8 more_rx_task_flag;
|
|
||||||
u16 tx_buf_size;
|
|
||||||
u16 curr_tx_buf_size;
|
|
||||||
/* sdio single port rx aggregation capability */
|
|
||||||
@@ -1661,6 +1662,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter, void *drv_info,
|
|
||||||
int drv_info_size);
|
|
||||||
void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
|
|
||||||
void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
|
|
||||||
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter);
|
|
||||||
int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
|
|
||||||
int cmd_type,
|
|
||||||
struct mwifiex_ds_wakeup_reason *wakeup_reason);
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
||||||
index 9511f5f..4a4737c 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
|
||||||
@@ -1729,6 +1729,16 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
|
|
||||||
}
|
|
||||||
|
|
||||||
rx_len = get_unaligned_le16(skb->data);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+ if (rx_len == 0) {
|
|
||||||
+ mwifiex_dbg(adapter, ERROR,
|
|
||||||
+ "0 byte cmdrsp\n");
|
|
||||||
+ mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
|
|
||||||
+ PCI_DMA_FROMDEVICE);
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
|
|
||||||
skb_trim(skb, rx_len);
|
|
||||||
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
|
||||||
index fb09014..5b8329e 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
|
||||||
@@ -2313,7 +2313,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
|
||||||
if (ret)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
- if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
|
||||||
+ if (0 && priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
|
||||||
/* Enable IEEE PS by default */
|
|
||||||
priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
|
|
||||||
ret = mwifiex_send_cmd(priv,
|
|
||||||
@@ -2336,8 +2336,8 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
- mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG,
|
|
||||||
- HostCmd_ACT_GEN_GET, 0, NULL, true);
|
|
||||||
+ //mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG,
|
|
||||||
+ // HostCmd_ACT_GEN_GET, 0, NULL, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* get tx rate */
|
|
||||||
@@ -2369,7 +2369,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
|
||||||
if (ret)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
- if (!disable_auto_ds && first_sta &&
|
|
||||||
+ if (0 && !disable_auto_ds && first_sta &&
|
|
||||||
priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
|
||||||
/* Enable auto deep sleep */
|
|
||||||
auto_ds.auto_ds = DEEP_SLEEP_ON;
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
|
||||||
index 1bd4e13..27d2bac 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
|
||||||
@@ -48,9 +48,14 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
|
|
||||||
struct host_cmd_ds_802_11_ps_mode_enh *pm;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
- mwifiex_dbg(adapter, ERROR,
|
|
||||||
- "CMD_RESP: cmd %#x error, result=%#x\n",
|
|
||||||
- resp->command, resp->result);
|
|
||||||
+ if (resp->command == 271 && resp->result == 2){
|
|
||||||
+ // ignore this command as the firmware does not support it
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ mwifiex_dbg(adapter, ERROR,
|
|
||||||
+ "CMD_RESP: cmd %#x error, result=%#x\n",
|
|
||||||
+ resp->command, resp->result);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
if (adapter->curr_cmd->wait_q_enabled)
|
|
||||||
adapter->cmd_wait_q.status = -1;
|
|
||||||
diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
|
|
||||||
index 4bc2448..d20fda1 100644
|
|
||||||
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
|
|
||||||
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
|
|
||||||
@@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
|
|
||||||
skb_queue_tail(&adapter->rx_data_q, skb);
|
|
||||||
adapter->data_received = true;
|
|
||||||
atomic_inc(&adapter->rx_pending);
|
|
||||||
+ if (adapter->rx_work_enabled)
|
|
||||||
+ mwifiex_queue_rx_work(adapter);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mwifiex_dbg(adapter, ERROR,
|
|
||||||
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
|
|
||||||
index ffbf4e7..3ad81e3 100644
|
|
||||||
--- a/drivers/pci/pcie/portdrv_pci.c
|
|
||||||
+++ b/drivers/pci/pcie/portdrv_pci.c
|
|
||||||
@@ -150,6 +150,11 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
|
|
||||||
|
|
||||||
pci_save_state(dev);
|
|
||||||
|
|
||||||
+ /*
|
|
||||||
+ * D3cold disabled by default
|
|
||||||
+ */
|
|
||||||
+ dev->d3cold_allowed = false;
|
|
||||||
+
|
|
||||||
if (pci_bridge_d3_possible(dev)) {
|
|
||||||
/*
|
|
||||||
* Keep the port resumed 100ms to make sure things like
|
|
||||||
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
|
|
||||||
index fdb3646..b44b23b 100644
|
|
||||||
--- a/net/wireless/sme.c
|
|
||||||
+++ b/net/wireless/sme.c
|
|
||||||
@@ -690,6 +690,11 @@ void __cfg80211_connect_result(struct net_device *dev,
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if (WARN_ON(!wdev->ssid_len)) {
|
|
||||||
+ cfg80211_put_bss(wdev->wiphy, cr->bss);
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, cr,
|
|
||||||
GFP_KERNEL);
|
|
||||||
|
|
||||||
@@ -1105,7 +1110,7 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
|
|
||||||
/*
|
|
||||||
* If we have an ssid_len, we're trying to connect or are
|
|
||||||
* already connected, so reject a new SSID unless it's the
|
|
||||||
- * same (which is the case for re-association.)
|
|
||||||
+ * same (which is the case for Re-Association.
|
|
||||||
*/
|
|
||||||
if (wdev->ssid_len &&
|
|
||||||
(wdev->ssid_len != connect->ssid_len ||
|
|
||||||
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
|
|
||||||
old mode 100755
|
|
||||||
new mode 100644
|
|
|
@ -1,163 +0,0 @@
|
||||||
diff --git a/drivers/acpi/acpica/dbdisply.c b/drivers/acpi/acpica/dbdisply.c
|
|
||||||
index 5a606ea..7b5eb33 100644
|
|
||||||
--- a/drivers/acpi/acpica/dbdisply.c
|
|
||||||
+++ b/drivers/acpi/acpica/dbdisply.c
|
|
||||||
@@ -642,9 +642,8 @@ void acpi_db_display_object_type(char *object_arg)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
- acpi_os_printf("ADR: %8.8X%8.8X, STA: %8.8X, Flags: %X\n",
|
|
||||||
- ACPI_FORMAT_UINT64(info->address),
|
|
||||||
- info->current_status, info->flags);
|
|
||||||
+ acpi_os_printf("ADR: %8.8X%8.8X, Flags: %X\n",
|
|
||||||
+ ACPI_FORMAT_UINT64(info->address), info->flags);
|
|
||||||
|
|
||||||
acpi_os_printf("S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X\n",
|
|
||||||
info->highest_dstates[0], info->highest_dstates[1],
|
|
||||||
diff --git a/drivers/acpi/acpica/evevent.c b/drivers/acpi/acpica/evevent.c
|
|
||||||
index d3b6b31..37b0b4c 100644
|
|
||||||
--- a/drivers/acpi/acpica/evevent.c
|
|
||||||
+++ b/drivers/acpi/acpica/evevent.c
|
|
||||||
@@ -204,6 +204,7 @@ u32 acpi_ev_fixed_event_detect(void)
|
|
||||||
u32 fixed_status;
|
|
||||||
u32 fixed_enable;
|
|
||||||
u32 i;
|
|
||||||
+ acpi_status status;
|
|
||||||
|
|
||||||
ACPI_FUNCTION_NAME(ev_fixed_event_detect);
|
|
||||||
|
|
||||||
@@ -211,8 +212,12 @@ u32 acpi_ev_fixed_event_detect(void)
|
|
||||||
* Read the fixed feature status and enable registers, as all the cases
|
|
||||||
* depend on their values. Ignore errors here.
|
|
||||||
*/
|
|
||||||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
|
||||||
- (void)acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
|
||||||
+ status = acpi_hw_register_read(ACPI_REGISTER_PM1_STATUS, &fixed_status);
|
|
||||||
+ status |=
|
|
||||||
+ acpi_hw_register_read(ACPI_REGISTER_PM1_ENABLE, &fixed_enable);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ return (int_status);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INTERRUPTS,
|
|
||||||
"Fixed Event Block: Enable %08X Status %08X\n",
|
|
||||||
diff --git a/drivers/acpi/acpica/exdebug.c b/drivers/acpi/acpica/exdebug.c
|
|
||||||
index a8191d2..2ad13d8 100644
|
|
||||||
--- a/drivers/acpi/acpica/exdebug.c
|
|
||||||
+++ b/drivers/acpi/acpica/exdebug.c
|
|
||||||
@@ -88,14 +88,13 @@ acpi_ex_do_debug_object(union acpi_operand_object *source_desc,
|
|
||||||
return_VOID;
|
|
||||||
}
|
|
||||||
|
|
||||||
- /* Null string or newline -- don't emit the line header */
|
|
||||||
+ /* Newline -- don't emit the line header */
|
|
||||||
|
|
||||||
if (source_desc &&
|
|
||||||
(ACPI_GET_DESCRIPTOR_TYPE(source_desc) == ACPI_DESC_TYPE_OPERAND) &&
|
|
||||||
(source_desc->common.type == ACPI_TYPE_STRING)) {
|
|
||||||
- if ((source_desc->string.length == 0) ||
|
|
||||||
- ((source_desc->string.length == 1) &&
|
|
||||||
- (*source_desc->string.pointer == '\n'))) {
|
|
||||||
+ if ((source_desc->string.length == 1) &&
|
|
||||||
+ (*source_desc->string.pointer == '\n')) {
|
|
||||||
acpi_os_printf("\n");
|
|
||||||
return_VOID;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/acpi/acpica/nsdumpdv.c b/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
index 5026594..573a5f3 100644
|
|
||||||
--- a/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
+++ b/drivers/acpi/acpica/nsdumpdv.c
|
|
||||||
@@ -88,10 +88,9 @@ acpi_ns_dump_one_device(acpi_handle obj_handle,
|
|
||||||
}
|
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT_RAW((ACPI_DB_TABLES,
|
|
||||||
- " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
|
|
||||||
+ " HID: %s, ADR: %8.8X%8.8X\n",
|
|
||||||
info->hardware_id.value,
|
|
||||||
- ACPI_FORMAT_UINT64(info->address),
|
|
||||||
- info->current_status));
|
|
||||||
+ ACPI_FORMAT_UINT64(info->address));
|
|
||||||
ACPI_FREE(info);
|
|
||||||
}
|
|
||||||
|
|
||||||
diff --git a/drivers/acpi/acpica/nsxfname.c b/drivers/acpi/acpica/nsxfname.c
|
|
||||||
index 1069662..0a9c600 100644
|
|
||||||
--- a/drivers/acpi/acpica/nsxfname.c
|
|
||||||
+++ b/drivers/acpi/acpica/nsxfname.c
|
|
||||||
@@ -241,7 +241,7 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|
||||||
* namespace node and possibly by running several standard
|
|
||||||
* control methods (Such as in the case of a device.)
|
|
||||||
*
|
|
||||||
- * For Device and Processor objects, run the Device _HID, _UID, _CID, _STA,
|
|
||||||
+ * For Device and Processor objects, run the Device _HID, _UID, _CID,
|
|
||||||
* _CLS, _ADR, _sx_w, and _sx_d methods.
|
|
||||||
*
|
|
||||||
* Note: Allocates the return buffer, must be freed by the caller.
|
|
||||||
@@ -250,8 +250,9 @@ static char *acpi_ns_copy_device_id(struct acpi_pnp_device_id *dest,
|
|
||||||
* discovery namespace traversal. Therefore, no complex methods can be
|
|
||||||
* executed, especially those that access operation regions. Therefore, do
|
|
||||||
* not add any additional methods that could cause problems in this area.
|
|
||||||
- * this was the fate of the _SUB method which was found to cause such
|
|
||||||
- * problems and was removed (11/2015).
|
|
||||||
+ * Because of this reason support for the following methods has been removed:
|
|
||||||
+ * 1) _SUB method was removed (11/2015)
|
|
||||||
+ * 2) _STA method was removed (02/2018)
|
|
||||||
*
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
@@ -374,20 +375,8 @@ acpi_get_object_info(acpi_handle handle,
|
|
||||||
* Notes: none of these methods are required, so they may or may
|
|
||||||
* not be present for this device. The Info->Valid bitfield is used
|
|
||||||
* to indicate which methods were found and run successfully.
|
|
||||||
- *
|
|
||||||
- * For _STA, if the method does not exist, then (as per the ACPI
|
|
||||||
- * specification), the returned current_status flags will indicate
|
|
||||||
- * that the device is present/functional/enabled. Otherwise, the
|
|
||||||
- * current_status flags reflect the value returned from _STA.
|
|
||||||
*/
|
|
||||||
|
|
||||||
- /* Execute the Device._STA method */
|
|
||||||
-
|
|
||||||
- status = acpi_ut_execute_STA(node, &info->current_status);
|
|
||||||
- if (ACPI_SUCCESS(status)) {
|
|
||||||
- valid |= ACPI_VALID_STA;
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
/* Execute the Device._ADR method */
|
|
||||||
|
|
||||||
status = acpi_ut_evaluate_numeric_object(METHOD_NAME__ADR, node,
|
|
||||||
diff --git a/drivers/acpi/acpica/psargs.c b/drivers/acpi/acpica/psargs.c
|
|
||||||
index eb9dfac..11ce4e5 100644
|
|
||||||
--- a/drivers/acpi/acpica/psargs.c
|
|
||||||
+++ b/drivers/acpi/acpica/psargs.c
|
|
||||||
@@ -890,6 +890,10 @@ acpi_ps_get_next_arg(struct acpi_walk_state *walk_state,
|
|
||||||
ACPI_POSSIBLE_METHOD_CALL);
|
|
||||||
|
|
||||||
if (arg->common.aml_opcode == AML_INT_METHODCALL_OP) {
|
|
||||||
+
|
|
||||||
+ /* Free method call op and corresponding namestring sub-ob */
|
|
||||||
+
|
|
||||||
+ acpi_ps_free_op(arg->common.value.arg);
|
|
||||||
acpi_ps_free_op(arg);
|
|
||||||
arg = NULL;
|
|
||||||
walk_state->arg_count = 1;
|
|
||||||
diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
|
|
||||||
index 4f077ed..220ef86 100644
|
|
||||||
--- a/include/acpi/actypes.h
|
|
||||||
+++ b/include/acpi/actypes.h
|
|
||||||
@@ -1191,7 +1191,6 @@ struct acpi_device_info {
|
|
||||||
u8 flags; /* Miscellaneous info */
|
|
||||||
u8 highest_dstates[4]; /* _sx_d values: 0xFF indicates not valid */
|
|
||||||
u8 lowest_dstates[5]; /* _sx_w values: 0xFF indicates not valid */
|
|
||||||
- u32 current_status; /* _STA value */
|
|
||||||
u64 address; /* _ADR value */
|
|
||||||
struct acpi_pnp_device_id hardware_id; /* _HID value */
|
|
||||||
struct acpi_pnp_device_id unique_id; /* _UID value */
|
|
||||||
@@ -1205,7 +1204,6 @@ struct acpi_device_info {
|
|
||||||
|
|
||||||
/* Flags for Valid field above (acpi_get_object_info) */
|
|
||||||
|
|
||||||
-#define ACPI_VALID_STA 0x0001
|
|
||||||
#define ACPI_VALID_ADR 0x0002
|
|
||||||
#define ACPI_VALID_HID 0x0004
|
|
||||||
#define ACPI_VALID_UID 0x0008
|
|
|
@ -1,156 +0,0 @@
|
||||||
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
index fd387bf..35ae5af 100644
|
|
||||||
--- a/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
@@ -2353,6 +2353,46 @@ static const struct uvc_device_info uvc_quirk_force_y8 = {
|
|
||||||
* though they are compliant.
|
|
||||||
*/
|
|
||||||
static const struct usb_device_id uvc_ids[] = {
|
|
||||||
+ /* Microsoft Surface Pro 3 Front */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07be,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 3 Rear */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07bf,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 4 Cam */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090c,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 1 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090b,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 2 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x091a,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
/* LogiLink Wireless Webcam */
|
|
||||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
index 3f527f2..b882948 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
config VIDEO_ATOMISP_OV5693
|
|
||||||
tristate "Omnivision ov5693 sensor support"
|
|
||||||
depends on ACPI
|
|
||||||
- depends on I2C && VIDEO_V4L2
|
|
||||||
+ depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
|
||||||
---help---
|
|
||||||
This is a Video4Linux2 sensor-level driver for the Micron
|
|
||||||
ov5693 5 Mpixel camera.
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
index 40d01bf..4f33294 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
@@ -1335,11 +1335,15 @@ static int power_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
{
|
|
||||||
struct ov5693_device *dev = to_ov5693_sensor(sd);
|
|
||||||
+ int ret = 0;
|
|
||||||
|
|
||||||
if (!dev || !dev->platform_data)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
- return dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+ if (dev->platform_data->gpio0_ctrl)
|
|
||||||
+ ret = dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __power_up(struct v4l2_subdev *sd)
|
|
||||||
@@ -1707,7 +1711,7 @@ static int ov5693_detect(struct i2c_client *client)
|
|
||||||
OV5693_SC_CMMN_CHIP_ID_L, &low);
|
|
||||||
id = ((((u16) high) << 8) | (u16) low);
|
|
||||||
|
|
||||||
- if (id != OV5693_ID) {
|
|
||||||
+ if (id != OV5690_ID && id != OV5693_ID) {
|
|
||||||
dev_err(&client->dev, "sensor ID error 0x%x\n", id);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
index 68cfcb4..b4616ac 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
@@ -29,7 +29,7 @@
|
|
||||||
#include <linux/v4l2-mediabus.h>
|
|
||||||
#include <media/media-entity.h>
|
|
||||||
|
|
||||||
-#include "../../include/linux/atomisp_platform.h"
|
|
||||||
+#include "../../include/linux/atomisp_gmin_platform.h"
|
|
||||||
|
|
||||||
#define OV5693_POWER_UP_RETRY_NUM 5
|
|
||||||
|
|
||||||
@@ -72,7 +72,8 @@
|
|
||||||
* bits 7-0: min f-number denominator
|
|
||||||
*/
|
|
||||||
#define OV5693_F_NUMBER_RANGE 0x180a180a
|
|
||||||
-#define OV5693_ID 0x5690
|
|
||||||
+#define OV5690_ID 0x5690
|
|
||||||
+#define OV5693_ID 0x5693
|
|
||||||
|
|
||||||
#define OV5693_FINE_INTG_TIME_MIN 0
|
|
||||||
#define OV5693_FINE_INTG_TIME_MAX_MARGIN 0
|
|
||||||
diff --git a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
index d8b7183..d9d8c48 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
@@ -249,11 +249,13 @@ static struct gmin_cfg_var ecs7_vars[] = {
|
|
||||||
{"INT33BE:00_CsiFmt", "13"},
|
|
||||||
{"INT33BE:00_CsiBayer", "2"},
|
|
||||||
{"INT33BE:00_CamClk", "0"},
|
|
||||||
+ {"INT33BE:00_ClkSrc", "1"},
|
|
||||||
{"INT33F0:00_CsiPort", "0"},
|
|
||||||
{"INT33F0:00_CsiLanes", "1"},
|
|
||||||
{"INT33F0:00_CsiFmt", "13"},
|
|
||||||
{"INT33F0:00_CsiBayer", "0"},
|
|
||||||
{"INT33F0:00_CamClk", "1"},
|
|
||||||
+ {"INT33BE:00_I2CAddr", "-1"},
|
|
||||||
{"gmin_V2P8GPIO", "402"},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
@@ -305,6 +307,20 @@ static const struct dmi_system_id gmin_vars[] = {
|
|
||||||
},
|
|
||||||
.driver_data = i8880_vars,
|
|
||||||
},
|
|
||||||
+ {
|
|
||||||
+ .ident = "Surface Book",
|
|
||||||
+ .matches = {
|
|
||||||
+ DMI_MATCH(DMI_BOARD_NAME, "Surface Book"),
|
|
||||||
+ },
|
|
||||||
+ .driver_data = ecs7_vars,
|
|
||||||
+ },
|
|
||||||
+ {
|
|
||||||
+ .ident = "Surface Pro 4",
|
|
||||||
+ .matches = {
|
|
||||||
+ DMI_MATCH(DMI_BOARD_NAME, "Surface Pro 4"),
|
|
||||||
+ },
|
|
||||||
+ .driver_data = ecs7_vars,
|
|
||||||
+ },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,116 +0,0 @@
|
||||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
||||||
index 9454ac1..ae2f26c 100644
|
|
||||||
--- a/drivers/hid/hid-ids.h
|
|
||||||
+++ b/drivers/hid/hid-ids.h
|
|
||||||
@@ -774,11 +774,22 @@
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750
|
|
||||||
#define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c
|
|
||||||
-#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
-#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
-#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
-#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
-#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
+#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
+#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 0x07dc
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4 0x07e8
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1 0x07e4
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK_2 0x0922
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define HID_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
|
|
||||||
#define USB_VENDOR_ID_MOJO 0x8282
|
|
||||||
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
|
|
||||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
|
||||||
index 3b4739bd..82cee6c 100644
|
|
||||||
--- a/drivers/hid/hid-multitouch.c
|
|
||||||
+++ b/drivers/hid/hid-multitouch.c
|
|
||||||
@@ -1743,6 +1743,58 @@ static const struct hid_device_id mt_devices[] = {
|
|
||||||
HID_USB_DEVICE(USB_VENDOR_ID_LG,
|
|
||||||
USB_DEVICE_ID_LG_MELFAS_MT) },
|
|
||||||
|
|
||||||
+ /* Microsoft Touch Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TOUCH_COVER_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Type Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book 2 */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Laptop */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY,
|
|
||||||
+ USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ HID_DEVICE_ID_MS_SURFACE_LAPTOP) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Power Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_POWER_COVER) },
|
|
||||||
+
|
|
||||||
/* MosArt panels */
|
|
||||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
|
||||||
MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
|
|
||||||
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
|
||||||
index e92b77f..3cfadf1 100644
|
|
||||||
--- a/drivers/hid/hid-quirks.c
|
|
||||||
+++ b/drivers/hid/hid-quirks.c
|
|
||||||
@@ -110,6 +110,16 @@ static const struct hid_device_id hid_quirks[] = {
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER), HID_QUIRK_MULTI_INPUT },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MULTIPLE_1781, USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD), HID_QUIRK_MULTI_INPUT },
|
|
|
@ -1,20 +0,0 @@
|
||||||
From fbd83f772a3be3a00bae323f6d71a59b26352c57 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Fri, 2 Feb 2018 11:22:21 -0500
|
|
||||||
Subject: fix for surface sd card reader
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
||||||
index cf7bbcb..826fdb8 100644
|
|
||||||
--- a/drivers/usb/core/hub.c
|
|
||||||
+++ b/drivers/usb/core/hub.c
|
|
||||||
@@ -4047,7 +4047,8 @@ void usb_enable_lpm(struct usb_device *udev)
|
|
||||||
if (!udev || !udev->parent ||
|
|
||||||
udev->speed < USB_SPEED_SUPER ||
|
|
||||||
!udev->lpm_capable ||
|
|
||||||
- udev->state < USB_STATE_DEFAULT)
|
|
||||||
+ udev->state < USB_STATE_DEFAULT ||
|
|
||||||
+ !udev->bos || !udev->bos->ss_cap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
udev->lpm_disable_count--;
|
|
|
@ -1,510 +0,0 @@
|
||||||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
|
|
||||||
index 51ebc5a..244fa92 100644
|
|
||||||
--- a/drivers/platform/x86/Kconfig
|
|
||||||
+++ b/drivers/platform/x86/Kconfig
|
|
||||||
@@ -1155,6 +1155,15 @@ config SURFACE_3_BUTTON
|
|
||||||
---help---
|
|
||||||
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
|
||||||
|
|
||||||
+config ACPI_SURFACE
|
|
||||||
+ tristate "Microsoft Surface Extras"
|
|
||||||
+ depends on ACPI
|
|
||||||
+ depends on ACPI_WMI
|
|
||||||
+ depends on INPUT
|
|
||||||
+ ---help---
|
|
||||||
+ This driver adds support for access to certain system events
|
|
||||||
+ on Microsoft Surface devices.
|
|
||||||
+
|
|
||||||
config INTEL_PUNIT_IPC
|
|
||||||
tristate "Intel P-Unit IPC Driver"
|
|
||||||
---help---
|
|
||||||
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
|
|
||||||
index 2ba6cb7..bcb0dd9 100644
|
|
||||||
--- a/drivers/platform/x86/Makefile
|
|
||||||
+++ b/drivers/platform/x86/Makefile
|
|
||||||
@@ -81,6 +81,7 @@ obj-$(CONFIG_INTEL_PMC_IPC) += intel_pmc_ipc.o
|
|
||||||
obj-$(CONFIG_SILEAD_DMI) += silead_dmi.o
|
|
||||||
obj-$(CONFIG_SURFACE_PRO3_BUTTON) += surfacepro3_button.o
|
|
||||||
obj-$(CONFIG_SURFACE_3_BUTTON) += surface3_button.o
|
|
||||||
+obj-$(CONFIG_ACPI_SURFACE) += surface_acpi.o
|
|
||||||
obj-$(CONFIG_INTEL_PUNIT_IPC) += intel_punit_ipc.o
|
|
||||||
obj-$(CONFIG_INTEL_BXTWC_PMIC_TMU) += intel_bxtwc_tmu.o
|
|
||||||
obj-$(CONFIG_INTEL_TELEMETRY) += intel_telemetry_core.o \
|
|
||||||
diff --git a/drivers/platform/x86/surface_acpi.c b/drivers/platform/x86/surface_acpi.c
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000..bee15e7
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/platform/x86/surface_acpi.c
|
|
||||||
@@ -0,0 +1,472 @@
|
|
||||||
+/*
|
|
||||||
+ * surface_acpi.c - Microsoft Surface ACPI Notify
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or modify
|
|
||||||
+ * it under the terms of the GNU General Public License as published by
|
|
||||||
+ * the Free Software Foundation; either version 2 of the License, or
|
|
||||||
+ * (at your option) any later version.
|
|
||||||
+ *
|
|
||||||
+ * This program is distributed in the hope that it will be useful,
|
|
||||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
+ * GNU General Public License for more details.
|
|
||||||
+ *
|
|
||||||
+ * The full GNU General Public License is included in this distribution in
|
|
||||||
+ * the file called "COPYING".
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#define SURFACE_ACPI_VERSION "0.1"
|
|
||||||
+#define SURFACE_GEN_VERSION 0x08
|
|
||||||
+#define PROC_SURFACE "surface"
|
|
||||||
+
|
|
||||||
+#include <linux/kernel.h>
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/init.h>
|
|
||||||
+#include <linux/types.h>
|
|
||||||
+#include <linux/acpi.h>
|
|
||||||
+#include <linux/power_supply.h>
|
|
||||||
+#include <linux/thermal.h>
|
|
||||||
+#include <linux/dmi.h>
|
|
||||||
+#include <linux/seq_file.h>
|
|
||||||
+#include <acpi/acpi_bus.h>
|
|
||||||
+#include <acpi/acpi_drivers.h>
|
|
||||||
+
|
|
||||||
+MODULE_AUTHOR("Jake Day");
|
|
||||||
+MODULE_DESCRIPTION("Microsoft Surface ACPI Notify Driver");
|
|
||||||
+MODULE_LICENSE("GPL");
|
|
||||||
+
|
|
||||||
+#define SUR_METHOD_DSM "_DSM"
|
|
||||||
+#define SUR_METHOD_REG "_REG"
|
|
||||||
+#define SUR_METHOD_STA "_STA"
|
|
||||||
+#define SUR_METHOD_INI "_INI"
|
|
||||||
+#define SUR_METHOD_CRS "_CRS"
|
|
||||||
+
|
|
||||||
+#define SUR_QUERY_DEVICE 0x00
|
|
||||||
+#define SUR_SET_DVER 0x01
|
|
||||||
+#define SUR_GET_BOARD_REVID 0x02
|
|
||||||
+#define SUR_BAT1_STATE_CHANGE 0x03
|
|
||||||
+#define SUR_BAT1_INFO_CHANGE 0x04
|
|
||||||
+#define SUR_PSU_STATE_CHANGE 0x05
|
|
||||||
+#define SUR_PSU_INFO_CHANGE 0x06
|
|
||||||
+#define SUR_BAT2_STATE_CHANGE 0x07
|
|
||||||
+#define SUR_BAT2_INFO_CHANGE 0x08
|
|
||||||
+#define SUR_SENSOR_TRIP_POINT 0x09
|
|
||||||
+
|
|
||||||
+#define REG_AVAILABLE 0x01
|
|
||||||
+#define REG_INIT 0x09
|
|
||||||
+
|
|
||||||
+static char SURFACE_EVENT_GUID[] = "93b666c5-70c6-469f-a215-3d487c91ab3c";
|
|
||||||
+static char SUR_SAN_RQST[] = "\\_SB._SAN.RQST";
|
|
||||||
+static char SUR_SAN_RQSX[] = "\\_SB._SAN.RQSX";
|
|
||||||
+
|
|
||||||
+struct surface_acpi_dev {
|
|
||||||
+ acpi_handle handle;
|
|
||||||
+ acpi_handle rqst_handle;
|
|
||||||
+ acpi_handle rqsx_handle;
|
|
||||||
+
|
|
||||||
+ struct acpi_device *san_dev;
|
|
||||||
+ struct acpi_device *ssh_dev;
|
|
||||||
+ struct acpi_device *bat1_dev;
|
|
||||||
+ struct acpi_device *bat2_dev;
|
|
||||||
+ struct acpi_device *psu_dev;
|
|
||||||
+
|
|
||||||
+ unsigned int bat1_attached:1;
|
|
||||||
+ unsigned int bat2_attached:1;
|
|
||||||
+ unsigned int psu_registered:1;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static struct surface_acpi_dev *surface_acpi;
|
|
||||||
+
|
|
||||||
+static struct proc_dir_entry *surface_proc_dir;
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_check_status(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ unsigned long long value;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(dev->handle, SUR_METHOD_STA)) {
|
|
||||||
+ status = acpi_evaluate_integer(dev->handle,
|
|
||||||
+ SUR_METHOD_STA, NULL, &value);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_san_reg(void)
|
|
||||||
+{
|
|
||||||
+ union acpi_object in_objs[2], out_objs[1];
|
|
||||||
+ struct acpi_object_list params;
|
|
||||||
+ struct acpi_buffer results;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ params.count = ARRAY_SIZE(in_objs);
|
|
||||||
+ params.pointer = in_objs;
|
|
||||||
+ in_objs[0].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[0].integer.value = REG_INIT;
|
|
||||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[1].integer.value = REG_AVAILABLE;
|
|
||||||
+ results.length = sizeof(out_objs);
|
|
||||||
+ results.pointer = out_objs;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_REG)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
|
||||||
+ SUR_METHOD_REG, ¶ms, &results);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_event_handler(u32 event)
|
|
||||||
+{
|
|
||||||
+ union acpi_object in_objs[4], out_objs[5];
|
|
||||||
+ struct acpi_object_list params;
|
|
||||||
+ struct acpi_buffer results;
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ params.count = ARRAY_SIZE(in_objs);
|
|
||||||
+ params.pointer = in_objs;
|
|
||||||
+ in_objs[0].type = ACPI_TYPE_BUFFER;
|
|
||||||
+ in_objs[0].buffer.length = sizeof(SURFACE_EVENT_GUID);
|
|
||||||
+ in_objs[0].buffer.pointer = SURFACE_EVENT_GUID;
|
|
||||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[1].integer.value = SUR_QUERY_DEVICE;
|
|
||||||
+ in_objs[2].type = ACPI_TYPE_INTEGER;
|
|
||||||
+ in_objs[2].integer.value = event;
|
|
||||||
+ in_objs[3].type = ACPI_TYPE_PACKAGE;
|
|
||||||
+ in_objs[3].package.count = 0;
|
|
||||||
+ in_objs[3].package.elements = SURFACE_GEN_VERSION;
|
|
||||||
+ results.length = sizeof(out_objs);
|
|
||||||
+ results.pointer = out_objs;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_DSM)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
|
||||||
+ SUR_METHOD_DSM, ¶ms, &results);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_san_load(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status ret;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_SET_DVER);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error setting Driver Version\n");
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_SENSOR_TRIP_POINT);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error setting Sensor Trip Point\n");
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_BAT1_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error attaching BAT1\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->bat1_attached = 1;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_BAT2_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error attaching BAT2\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->bat2_attached = 1;
|
|
||||||
+
|
|
||||||
+ ret = surface_acpi_event_handler(SUR_PSU_INFO_CHANGE);
|
|
||||||
+ if (ACPI_FAILURE(ret))
|
|
||||||
+ pr_err("surface_acpi: Error registering PSU\n");
|
|
||||||
+ else
|
|
||||||
+ surface_acpi->psu_registered = 1;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_ssh_initialize(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(surface_acpi->ssh_dev->handle, SUR_METHOD_INI)) {
|
|
||||||
+ status = acpi_evaluate_object(surface_acpi->ssh_dev->handle,
|
|
||||||
+ SUR_METHOD_INI, NULL, NULL);
|
|
||||||
+
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ return AE_ERROR;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ return AE_NOT_FOUND;
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat1_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat1_attached);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat1_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, bat1_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations bat1_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = bat1_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int bat2_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat2_attached);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int bat2_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, bat2_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations bat2_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = bat2_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int psu_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "registered: %d\n", surface_acpi->psu_registered);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int psu_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, psu_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations psu_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = psu_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int version_proc_show(struct seq_file *m, void *v)
|
|
||||||
+{
|
|
||||||
+ seq_printf(m, "driver: %s\n", SURFACE_ACPI_VERSION);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int version_proc_open(struct inode *inode, struct file *file)
|
|
||||||
+{
|
|
||||||
+ return single_open(file, version_proc_show, PDE_DATA(inode));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct file_operations version_proc_fops = {
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .open = version_proc_open,
|
|
||||||
+ .read = seq_read,
|
|
||||||
+ .llseek = seq_lseek,
|
|
||||||
+ .release = single_release,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static void create_surface_proc_entries(void)
|
|
||||||
+{
|
|
||||||
+ proc_create_data("BAT1", 0, surface_proc_dir,
|
|
||||||
+ &bat1_proc_fops, surface_acpi->bat1_attached);
|
|
||||||
+ proc_create_data("BAT2", 0, surface_proc_dir,
|
|
||||||
+ &bat2_proc_fops, surface_acpi->bat2_attached);
|
|
||||||
+ proc_create_data("ADP1", 0, surface_proc_dir,
|
|
||||||
+ &psu_proc_fops, surface_acpi->psu_registered);
|
|
||||||
+ proc_create_data("version", 0, surface_proc_dir,
|
|
||||||
+ &version_proc_fops, SURFACE_ACPI_VERSION);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void remove_surface_proc_entries(void)
|
|
||||||
+{
|
|
||||||
+ remove_proc_entry("BAT1", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("BAT2", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("ADP1", surface_proc_dir);
|
|
||||||
+ remove_proc_entry("version", surface_proc_dir);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_notify(struct acpi_device *dev, u32 event)
|
|
||||||
+{
|
|
||||||
+ pr_info("surface_acpi: Event received %x\n", event);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_register_rqst_handler(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQST, &surface_acpi->rqst_handle);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_register_rqsx_handler(void)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQSX, &surface_acpi->rqsx_handle);
|
|
||||||
+ if (ACPI_FAILURE(status)) {
|
|
||||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
|
||||||
+ acpi_format_exception(status));
|
|
||||||
+ }
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static acpi_status surface_acpi_walk_callback(acpi_handle handle, u32 level,
|
|
||||||
+ void *context, void **return_value)
|
|
||||||
+{
|
|
||||||
+ struct acpi_device_info *info;
|
|
||||||
+
|
|
||||||
+ if (ACPI_SUCCESS(acpi_get_object_info(handle, &info))) {
|
|
||||||
+ pr_warn("method: name: %4.4s, args %X\n",
|
|
||||||
+ (char *)&info->name, info->param_count);
|
|
||||||
+
|
|
||||||
+ kfree(info);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void surface_acpi_walk_namespace(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ acpi_status status;
|
|
||||||
+
|
|
||||||
+ status = acpi_walk_namespace(ACPI_TYPE_METHOD,
|
|
||||||
+ dev->handle, 1, surface_acpi_walk_callback,
|
|
||||||
+ NULL, NULL, NULL);
|
|
||||||
+ if (ACPI_FAILURE(status))
|
|
||||||
+ pr_warn("surface_acpi: Unable to walk acpi resources\n");
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int surface_acpi_add(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ if (!surface_acpi)
|
|
||||||
+ {
|
|
||||||
+ surface_acpi = kzalloc(sizeof(*surface_acpi), GFP_KERNEL);
|
|
||||||
+ if (!surface_acpi)
|
|
||||||
+ return AE_NO_MEMORY;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (acpi_has_method(dev->handle, SUR_METHOD_DSM))
|
|
||||||
+ {
|
|
||||||
+ pr_info("surface_acpi: Attaching device MSHW0091\n");
|
|
||||||
+
|
|
||||||
+ surface_acpi->san_dev = dev;
|
|
||||||
+ surface_acpi->handle = dev->handle;
|
|
||||||
+
|
|
||||||
+ surface_acpi_walk_namespace(surface_acpi->san_dev);
|
|
||||||
+ surface_acpi_check_status(surface_acpi->san_dev);
|
|
||||||
+
|
|
||||||
+ surface_acpi_register_rqst_handler();
|
|
||||||
+ surface_acpi_register_rqsx_handler();
|
|
||||||
+
|
|
||||||
+ surface_acpi_san_reg();
|
|
||||||
+ surface_acpi_san_load();
|
|
||||||
+
|
|
||||||
+ create_surface_proc_entries();
|
|
||||||
+ }
|
|
||||||
+ else
|
|
||||||
+ {
|
|
||||||
+ pr_info("surface_acpi: Attaching device MSHW0084\n");
|
|
||||||
+
|
|
||||||
+ surface_acpi->ssh_dev = dev;
|
|
||||||
+
|
|
||||||
+ surface_acpi_walk_namespace(surface_acpi->ssh_dev);
|
|
||||||
+ surface_acpi_check_status(surface_acpi->ssh_dev);
|
|
||||||
+
|
|
||||||
+ surface_acpi_ssh_initialize();
|
|
||||||
+ //surface_acpi_ssh_load();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int surface_acpi_remove(struct acpi_device *dev)
|
|
||||||
+{
|
|
||||||
+ remove_surface_proc_entries();
|
|
||||||
+
|
|
||||||
+ return AE_OK;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static const struct acpi_device_id surface_device_ids[] = {
|
|
||||||
+ {"MSHW0091", 0},
|
|
||||||
+ {"MSHW0084", 0},
|
|
||||||
+ {"", 0},
|
|
||||||
+};
|
|
||||||
+MODULE_DEVICE_TABLE(acpi, surface_device_ids);
|
|
||||||
+
|
|
||||||
+static struct acpi_driver surface_acpi_driver = {
|
|
||||||
+ .name = "surface_acpi",
|
|
||||||
+ .owner = THIS_MODULE,
|
|
||||||
+ .ids = surface_device_ids,
|
|
||||||
+ .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
|
||||||
+ .ops = {
|
|
||||||
+ .add = surface_acpi_add,
|
|
||||||
+ .remove = surface_acpi_remove,
|
|
||||||
+ .notify = surface_acpi_notify,
|
|
||||||
+ },
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static int __init surface_acpi_init(void)
|
|
||||||
+{
|
|
||||||
+ int ret;
|
|
||||||
+
|
|
||||||
+ pr_info("surface_acpi: Microsoft Surface ACPI Notify version %s\n",
|
|
||||||
+ SURFACE_ACPI_VERSION);
|
|
||||||
+
|
|
||||||
+ surface_proc_dir = proc_mkdir(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+ if (!surface_proc_dir) {
|
|
||||||
+ pr_err("surface_acpi: Unable to create proc dir " PROC_SURFACE "\n");
|
|
||||||
+ return -ENODEV;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ ret = acpi_bus_register_driver(&surface_acpi_driver);
|
|
||||||
+ if (ret) {
|
|
||||||
+ pr_err("surface_acpi: Failed to register ACPI driver: %d\n", ret);
|
|
||||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static void __exit surface_acpi_exit(void)
|
|
||||||
+{
|
|
||||||
+ acpi_bus_unregister_driver(&surface_acpi_driver);
|
|
||||||
+ if (surface_proc_dir)
|
|
||||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+module_init(surface_acpi_init);
|
|
||||||
+module_exit(surface_acpi_exit);
|
|
|
@ -1,36 +0,0 @@
|
||||||
From 3600aaa37a16777a07aa34672f12e30a1ae4d95b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jake Day <jake@ninebysix.com>
|
|
||||||
Date: Fri, 2 Feb 2018 11:21:06 -0500
|
|
||||||
Subject: support for surface dock
|
|
||||||
|
|
||||||
|
|
||||||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
|
|
||||||
index 05dca3e..59c2fcc 100644
|
|
||||||
--- a/drivers/net/usb/cdc_ether.c
|
|
||||||
+++ b/drivers/net/usb/cdc_ether.c
|
|
||||||
@@ -807,13 +807,6 @@ static const struct usb_device_id products[] = {
|
|
||||||
.driver_info = 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */
|
|
||||||
-{
|
|
||||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
|
||||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
||||||
- .driver_info = 0,
|
|
||||||
-},
|
|
||||||
-
|
|
||||||
/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
|
||||||
{
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
|
||||||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
|
|
||||||
index 0657203..0a52ea0 100644
|
|
||||||
--- a/drivers/net/usb/r8152.c
|
|
||||||
+++ b/drivers/net/usb/r8152.c
|
|
||||||
@@ -5323,7 +5323,6 @@ static const struct usb_device_id rtl8152_table[] = {
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)},
|
|
||||||
- {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)},
|
|
|
@ -1,3 +0,0 @@
|
||||||
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
|
|
||||||
old mode 100755
|
|
||||||
new mode 100644
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,299 +0,0 @@
|
||||||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
|
|
||||||
index 081105a9cfca..a4388b4da98f 100644
|
|
||||||
--- a/drivers/platform/x86/Kconfig
|
|
||||||
+++ b/drivers/platform/x86/Kconfig
|
|
||||||
@@ -1158,6 +1158,11 @@ config SURFACE_3_BUTTON
|
|
||||||
---help---
|
|
||||||
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
|
||||||
|
|
||||||
+config SURFACEBOOK2_BUTTON
|
|
||||||
+ tristate "Power/home/volume buttons driver for Microsoft Surface Book 2/ Surface Pro (2017) tablet"
|
|
||||||
+ ---help---
|
|
||||||
+ This driver handles the power and volume buttons on the Microsoft Surface Book 2/ Surface Pro (2017) tablet.
|
|
||||||
+
|
|
||||||
config ACPI_SURFACE
|
|
||||||
tristate "Microsoft Surface Extras"
|
|
||||||
depends on ACPI
|
|
||||||
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
|
|
||||||
index 8fd5b93bb20d..28c4cede2d91 100644
|
|
||||||
--- a/drivers/platform/x86/Makefile
|
|
||||||
+++ b/drivers/platform/x86/Makefile
|
|
||||||
@@ -81,6 +81,7 @@ obj-$(CONFIG_INTEL_PMC_IPC) += intel_pmc_ipc.o
|
|
||||||
obj-$(CONFIG_SILEAD_DMI) += silead_dmi.o
|
|
||||||
obj-$(CONFIG_SURFACE_PRO3_BUTTON) += surfacepro3_button.o
|
|
||||||
obj-$(CONFIG_SURFACE_3_BUTTON) += surface3_button.o
|
|
||||||
+obj-$(CONFIG_SURFACEBOOK2_BUTTON) += surfacebook2_button.o
|
|
||||||
obj-$(CONFIG_ACPI_SURFACE) += surface_acpi.o
|
|
||||||
obj-$(CONFIG_ACPI_SURFACE) += surface_i2c.o
|
|
||||||
obj-$(CONFIG_ACPI_SURFACE) += surface_platform.o
|
|
||||||
diff --git a/drivers/platform/x86/surfacebook2_button.c b/drivers/platform/x86/surfacebook2_button.c
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..9a23bfd32c97
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/drivers/platform/x86/surfacebook2_button.c
|
|
||||||
@@ -0,0 +1,242 @@
|
|
||||||
+/*
|
|
||||||
+ * Supports for Surface Book 2 and Surface Pro (2017) power and volume
|
|
||||||
+ * buttons.
|
|
||||||
+ *
|
|
||||||
+ * Based on soc_button_array.c:
|
|
||||||
+ *
|
|
||||||
+ * (C) Copyright 2014 Intel Corporation
|
|
||||||
+ *
|
|
||||||
+ * This program is free software; you can redistribute it and/or
|
|
||||||
+ * modify it under the terms of the GNU General Public License
|
|
||||||
+ * as published by the Free Software Foundation; version 2
|
|
||||||
+ * of the License.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+#include <linux/module.h>
|
|
||||||
+#include <linux/input.h>
|
|
||||||
+#include <linux/init.h>
|
|
||||||
+#include <linux/kernel.h>
|
|
||||||
+#include <linux/acpi.h>
|
|
||||||
+#include <linux/gpio/consumer.h>
|
|
||||||
+#include <linux/gpio_keys.h>
|
|
||||||
+#include <linux/gpio.h>
|
|
||||||
+#include <linux/platform_device.h>
|
|
||||||
+
|
|
||||||
+struct soc_button_info {
|
|
||||||
+ const char *name;
|
|
||||||
+ int acpi_index;
|
|
||||||
+ unsigned int event_type;
|
|
||||||
+ unsigned int event_code;
|
|
||||||
+ bool autorepeat;
|
|
||||||
+ bool wakeup;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Some of the buttons like volume up/down are auto repeat, while others
|
|
||||||
+ * are not. To support both, we register two platform devices, and put
|
|
||||||
+ * buttons into them based on whether the key should be auto repeat.
|
|
||||||
+ */
|
|
||||||
+#define BUTTON_TYPES 2
|
|
||||||
+#define SURFACE_METHOD_DSM "_DSM"
|
|
||||||
+
|
|
||||||
+struct soc_button_data {
|
|
||||||
+ struct platform_device *children[BUTTON_TYPES];
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Get the Nth GPIO number from the ACPI object.
|
|
||||||
+ */
|
|
||||||
+static int soc_button_lookup_gpio(struct device *dev, int acpi_index)
|
|
||||||
+{
|
|
||||||
+ struct gpio_desc *desc;
|
|
||||||
+ int gpio;
|
|
||||||
+
|
|
||||||
+ desc = gpiod_get_index(dev, NULL, acpi_index, GPIOD_ASIS);
|
|
||||||
+ if (IS_ERR(desc))
|
|
||||||
+ return PTR_ERR(desc);
|
|
||||||
+
|
|
||||||
+ gpio = desc_to_gpio(desc);
|
|
||||||
+
|
|
||||||
+ gpiod_put(desc);
|
|
||||||
+
|
|
||||||
+ return gpio;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static struct platform_device *
|
|
||||||
+soc_button_device_create(struct platform_device *pdev,
|
|
||||||
+ const struct soc_button_info *button_info,
|
|
||||||
+ bool autorepeat)
|
|
||||||
+{
|
|
||||||
+ const struct soc_button_info *info;
|
|
||||||
+ struct platform_device *pd;
|
|
||||||
+ struct gpio_keys_button *gpio_keys;
|
|
||||||
+ struct gpio_keys_platform_data *gpio_keys_pdata;
|
|
||||||
+ int n_buttons = 0;
|
|
||||||
+ int gpio;
|
|
||||||
+ int error;
|
|
||||||
+
|
|
||||||
+ for (info = button_info; info->name; info++)
|
|
||||||
+ if (info->autorepeat == autorepeat)
|
|
||||||
+ n_buttons++;
|
|
||||||
+
|
|
||||||
+ gpio_keys_pdata = devm_kzalloc(&pdev->dev,
|
|
||||||
+ sizeof(*gpio_keys_pdata) +
|
|
||||||
+ sizeof(*gpio_keys) * n_buttons,
|
|
||||||
+ GFP_KERNEL);
|
|
||||||
+ if (!gpio_keys_pdata)
|
|
||||||
+ return ERR_PTR(-ENOMEM);
|
|
||||||
+
|
|
||||||
+ gpio_keys = (void *)(gpio_keys_pdata + 1);
|
|
||||||
+ n_buttons = 0;
|
|
||||||
+
|
|
||||||
+ for (info = button_info; info->name; info++) {
|
|
||||||
+ if (info->autorepeat != autorepeat)
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ gpio = soc_button_lookup_gpio(&pdev->dev, info->acpi_index);
|
|
||||||
+ if (!gpio_is_valid(gpio))
|
|
||||||
+ continue;
|
|
||||||
+
|
|
||||||
+ gpio_keys[n_buttons].type = info->event_type;
|
|
||||||
+ gpio_keys[n_buttons].code = info->event_code;
|
|
||||||
+ gpio_keys[n_buttons].gpio = gpio;
|
|
||||||
+ gpio_keys[n_buttons].active_low = 1;
|
|
||||||
+ gpio_keys[n_buttons].desc = info->name;
|
|
||||||
+ gpio_keys[n_buttons].wakeup = info->wakeup;
|
|
||||||
+ /* These devices often use cheap buttons, use 50 ms debounce */
|
|
||||||
+ gpio_keys[n_buttons].debounce_interval = 50;
|
|
||||||
+ n_buttons++;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (n_buttons == 0) {
|
|
||||||
+ error = -ENODEV;
|
|
||||||
+ goto err_free_mem;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ gpio_keys_pdata->buttons = gpio_keys;
|
|
||||||
+ gpio_keys_pdata->nbuttons = n_buttons;
|
|
||||||
+ gpio_keys_pdata->rep = autorepeat;
|
|
||||||
+
|
|
||||||
+ pd = platform_device_alloc("gpio-keys", PLATFORM_DEVID_AUTO);
|
|
||||||
+ if (!pd) {
|
|
||||||
+ error = -ENOMEM;
|
|
||||||
+ goto err_free_mem;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ error = platform_device_add_data(pd, gpio_keys_pdata,
|
|
||||||
+ sizeof(*gpio_keys_pdata));
|
|
||||||
+ if (error)
|
|
||||||
+ goto err_free_pdev;
|
|
||||||
+
|
|
||||||
+ error = platform_device_add(pd);
|
|
||||||
+ if (error)
|
|
||||||
+ goto err_free_pdev;
|
|
||||||
+
|
|
||||||
+ return pd;
|
|
||||||
+
|
|
||||||
+err_free_pdev:
|
|
||||||
+ platform_device_put(pd);
|
|
||||||
+err_free_mem:
|
|
||||||
+ devm_kfree(&pdev->dev, gpio_keys_pdata);
|
|
||||||
+ return ERR_PTR(error);
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int soc_button_remove(struct platform_device *pdev)
|
|
||||||
+{
|
|
||||||
+ struct soc_button_data *priv = platform_get_drvdata(pdev);
|
|
||||||
+
|
|
||||||
+ int i;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < BUTTON_TYPES; i++)
|
|
||||||
+ if (priv->children[i])
|
|
||||||
+ platform_device_unregister(priv->children[i]);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int soc_button_probe(struct platform_device *pdev)
|
|
||||||
+{
|
|
||||||
+ struct device *dev = &pdev->dev;
|
|
||||||
+ const struct acpi_device_id *id;
|
|
||||||
+ struct soc_button_info *button_info;
|
|
||||||
+ struct soc_button_data *priv;
|
|
||||||
+ struct platform_device *pd;
|
|
||||||
+ int i;
|
|
||||||
+ int error;
|
|
||||||
+
|
|
||||||
+ id = acpi_match_device(dev->driver->acpi_match_table, dev);
|
|
||||||
+ if (!id)
|
|
||||||
+ return -ENODEV;
|
|
||||||
+
|
|
||||||
+ if (!acpi_has_method(ACPI_HANDLE(dev), SURFACE_METHOD_DSM))
|
|
||||||
+ return -ENODEV;
|
|
||||||
+
|
|
||||||
+ button_info = (struct soc_button_info *)id->driver_data;
|
|
||||||
+
|
|
||||||
+ error = gpiod_count(dev, NULL);
|
|
||||||
+ if (error < 0) {
|
|
||||||
+ dev_dbg(dev, "no GPIO attached, ignoring...\n");
|
|
||||||
+ return -ENODEV;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
|
||||||
+ if (!priv)
|
|
||||||
+ return -ENOMEM;
|
|
||||||
+
|
|
||||||
+ platform_set_drvdata(pdev, priv);
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < BUTTON_TYPES; i++) {
|
|
||||||
+ pd = soc_button_device_create(pdev, button_info, i == 0);
|
|
||||||
+ if (IS_ERR(pd)) {
|
|
||||||
+ error = PTR_ERR(pd);
|
|
||||||
+ if (error != -ENODEV) {
|
|
||||||
+ soc_button_remove(pdev);
|
|
||||||
+ return error;
|
|
||||||
+ }
|
|
||||||
+ continue;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ priv->children[i] = pd;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ if (!priv->children[0] && !priv->children[1])
|
|
||||||
+ return -ENODEV;
|
|
||||||
+
|
|
||||||
+ if (!id->driver_data)
|
|
||||||
+ devm_kfree(dev, button_info);
|
|
||||||
+
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * Definition of buttons on the tablet. The ACPI index of each button
|
|
||||||
+ * is defined in section 2.8.7.2 of "Windows ACPI Design Guide for SoC
|
|
||||||
+ * Platforms"
|
|
||||||
+ */
|
|
||||||
+static struct soc_button_info soc_button_MSHW0040[] = {
|
|
||||||
+ { "power", 0, EV_KEY, KEY_POWER, false, true },
|
|
||||||
+ { "volume_up", 2, EV_KEY, KEY_VOLUMEUP, true, false },
|
|
||||||
+ { "volume_down", 4, EV_KEY, KEY_VOLUMEDOWN, true, false },
|
|
||||||
+ { }
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+static const struct acpi_device_id soc_button_acpi_match[] = {
|
|
||||||
+ { "MSHW0040", (unsigned long)soc_button_MSHW0040 },
|
|
||||||
+ { }
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+MODULE_DEVICE_TABLE(acpi, soc_button_acpi_match);
|
|
||||||
+
|
|
||||||
+static struct platform_driver soc_button_driver_sb2 = {
|
|
||||||
+ .probe = soc_button_probe,
|
|
||||||
+ .remove = soc_button_remove,
|
|
||||||
+ .driver = {
|
|
||||||
+ .name = "surfacebook2_button",
|
|
||||||
+ .acpi_match_table = ACPI_PTR(soc_button_acpi_match),
|
|
||||||
+ },
|
|
||||||
+};
|
|
||||||
+module_platform_driver(soc_button_driver_sb2);
|
|
||||||
+
|
|
||||||
+MODULE_AUTHOR("Maximilian Luz");
|
|
||||||
+MODULE_DESCRIPTION("Surface Book 2/Surface Pro (2017) Button Driver");
|
|
||||||
+MODULE_LICENSE("GPL v2");
|
|
||||||
diff --git a/drivers/platform/x86/surfacepro3_button.c b/drivers/platform/x86/surfacepro3_button.c
|
|
||||||
index 1b491690ce07..9385262b65be 100644
|
|
||||||
--- a/drivers/platform/x86/surfacepro3_button.c
|
|
||||||
+++ b/drivers/platform/x86/surfacepro3_button.c
|
|
||||||
@@ -22,6 +22,7 @@
|
|
||||||
#define SURFACE_PRO3_BUTTON_HID "MSHW0028"
|
|
||||||
#define SURFACE_PRO4_BUTTON_HID "MSHW0040"
|
|
||||||
#define SURFACE_BUTTON_OBJ_NAME "VGBI"
|
|
||||||
+#define SURFACE_METHOD_DSM "_DSM"
|
|
||||||
#define SURFACE_BUTTON_DEVICE_NAME "Surface Pro 3/4 Buttons"
|
|
||||||
|
|
||||||
#define SURFACE_BUTTON_NOTIFY_TABLET_MODE 0xc8
|
|
||||||
@@ -158,6 +159,9 @@ static int surface_button_add(struct acpi_device *device)
|
|
||||||
strlen(SURFACE_BUTTON_OBJ_NAME)))
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
+ if (acpi_has_method(device->handle, SURFACE_METHOD_DSM))
|
|
||||||
+ return -ENODEV;
|
|
||||||
+
|
|
||||||
button = kzalloc(sizeof(struct surface_button), GFP_KERNEL);
|
|
||||||
if (!button)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
|
@ -1,156 +0,0 @@
|
||||||
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
index 2469b49b2b30..d2f77132efea 100644
|
|
||||||
--- a/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
|
||||||
@@ -2354,6 +2354,46 @@ static const struct uvc_device_info uvc_quirk_force_y8 = {
|
|
||||||
* though they are compliant.
|
|
||||||
*/
|
|
||||||
static const struct usb_device_id uvc_ids[] = {
|
|
||||||
+ /* Microsoft Surface Pro 3 Front */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07be,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 3 Rear */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x07bf,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Pro 4 Cam */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090c,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 1 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x090b,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
+ /* Microsoft Surface Book Cam 2 */
|
|
||||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
+ .idVendor = 0x045e,
|
|
||||||
+ .idProduct = 0x091a,
|
|
||||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
|
||||||
+ .bInterfaceSubClass = 1,
|
|
||||||
+ .bInterfaceProtocol = 1 },
|
|
||||||
/* LogiLink Wireless Webcam */
|
|
||||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
|
||||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
index 3f527f2047a7..b8829488ff7a 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
|
||||||
@@ -1,7 +1,7 @@
|
|
||||||
config VIDEO_ATOMISP_OV5693
|
|
||||||
tristate "Omnivision ov5693 sensor support"
|
|
||||||
depends on ACPI
|
|
||||||
- depends on I2C && VIDEO_V4L2
|
|
||||||
+ depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
|
||||||
---help---
|
|
||||||
This is a Video4Linux2 sensor-level driver for the Micron
|
|
||||||
ov5693 5 Mpixel camera.
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
index 714297c36b3e..7c1295bf2978 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
|
||||||
@@ -1339,11 +1339,15 @@ static int power_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
|
|
||||||
{
|
|
||||||
struct ov5693_device *dev = to_ov5693_sensor(sd);
|
|
||||||
+ int ret = 0;
|
|
||||||
|
|
||||||
if (!dev || !dev->platform_data)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
- return dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+ if (dev->platform_data->gpio0_ctrl)
|
|
||||||
+ ret = dev->platform_data->gpio0_ctrl(sd, flag);
|
|
||||||
+
|
|
||||||
+ return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int __power_up(struct v4l2_subdev *sd)
|
|
||||||
@@ -1711,7 +1715,7 @@ static int ov5693_detect(struct i2c_client *client)
|
|
||||||
OV5693_SC_CMMN_CHIP_ID_L, &low);
|
|
||||||
id = ((((u16) high) << 8) | (u16) low);
|
|
||||||
|
|
||||||
- if (id != OV5693_ID) {
|
|
||||||
+ if (id != OV5690_ID && id != OV5693_ID) {
|
|
||||||
dev_err(&client->dev, "sensor ID error 0x%x\n", id);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
index 9058a82455a6..84f8ef6146d6 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
|
||||||
@@ -29,7 +29,7 @@
|
|
||||||
#include <linux/v4l2-mediabus.h>
|
|
||||||
#include <media/media-entity.h>
|
|
||||||
|
|
||||||
-#include "../../include/linux/atomisp_platform.h"
|
|
||||||
+#include "../../include/linux/atomisp_gmin_platform.h"
|
|
||||||
|
|
||||||
#define OV5693_POWER_UP_RETRY_NUM 5
|
|
||||||
|
|
||||||
@@ -72,7 +72,8 @@
|
|
||||||
* bits 7-0: min f-number denominator
|
|
||||||
*/
|
|
||||||
#define OV5693_F_NUMBER_RANGE 0x180a180a
|
|
||||||
-#define OV5693_ID 0x5690
|
|
||||||
+#define OV5690_ID 0x5690
|
|
||||||
+#define OV5693_ID 0x5693
|
|
||||||
|
|
||||||
#define OV5693_FINE_INTG_TIME_MIN 0
|
|
||||||
#define OV5693_FINE_INTG_TIME_MAX_MARGIN 0
|
|
||||||
diff --git a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
index 3283c1b05d6a..00b85f54dcc0 100644
|
|
||||||
--- a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
+++ b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
|
||||||
@@ -249,11 +249,13 @@ static struct gmin_cfg_var ecs7_vars[] = {
|
|
||||||
{"INT33BE:00_CsiFmt", "13"},
|
|
||||||
{"INT33BE:00_CsiBayer", "2"},
|
|
||||||
{"INT33BE:00_CamClk", "0"},
|
|
||||||
+ {"INT33BE:00_ClkSrc", "1"},
|
|
||||||
{"INT33F0:00_CsiPort", "0"},
|
|
||||||
{"INT33F0:00_CsiLanes", "1"},
|
|
||||||
{"INT33F0:00_CsiFmt", "13"},
|
|
||||||
{"INT33F0:00_CsiBayer", "0"},
|
|
||||||
{"INT33F0:00_CamClk", "1"},
|
|
||||||
+ {"INT33BE:00_I2CAddr", "-1"},
|
|
||||||
{"gmin_V2P8GPIO", "402"},
|
|
||||||
{},
|
|
||||||
};
|
|
||||||
@@ -305,6 +307,20 @@ static const struct dmi_system_id gmin_vars[] = {
|
|
||||||
},
|
|
||||||
.driver_data = i8880_vars,
|
|
||||||
},
|
|
||||||
+ {
|
|
||||||
+ .ident = "Surface Book",
|
|
||||||
+ .matches = {
|
|
||||||
+ DMI_MATCH(DMI_BOARD_NAME, "Surface Book"),
|
|
||||||
+ },
|
|
||||||
+ .driver_data = ecs7_vars,
|
|
||||||
+ },
|
|
||||||
+ {
|
|
||||||
+ .ident = "Surface Pro 4",
|
|
||||||
+ .matches = {
|
|
||||||
+ DMI_MATCH(DMI_BOARD_NAME, "Surface Pro 4"),
|
|
||||||
+ },
|
|
||||||
+ .driver_data = ecs7_vars,
|
|
||||||
+ },
|
|
||||||
{}
|
|
||||||
};
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,129 +0,0 @@
|
||||||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
|
||||||
index 46f5ecd11bf7..cceb745d2805 100644
|
|
||||||
--- a/drivers/hid/hid-ids.h
|
|
||||||
+++ b/drivers/hid/hid-ids.h
|
|
||||||
@@ -791,11 +791,21 @@
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732
|
|
||||||
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750
|
|
||||||
#define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c
|
|
||||||
-#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
-#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
-#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
-#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
-#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
+#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
|
||||||
+#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 0x07dc
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1 0x07de
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4 0x07e8
|
|
||||||
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1 0x07e4
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_BOOK_2 0x0922
|
|
||||||
+#define USB_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
|
||||||
+#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
|
||||||
|
|
||||||
#define USB_VENDOR_ID_MOJO 0x8282
|
|
||||||
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
|
|
||||||
diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c
|
|
||||||
index 96e7d3231d2f..e55097221eec 100644
|
|
||||||
--- a/drivers/hid/hid-microsoft.c
|
|
||||||
+++ b/drivers/hid/hid-microsoft.c
|
|
||||||
@@ -278,7 +278,8 @@ static const struct hid_device_id ms_devices[] = {
|
|
||||||
.driver_data = MS_HIDINPUT },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_KEYBOARD),
|
|
||||||
.driver_data = MS_ERGONOMY},
|
|
||||||
-
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP),
|
|
||||||
+ .driver_data = MS_HIDINPUT},
|
|
||||||
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT),
|
|
||||||
.driver_data = MS_PRESENTER },
|
|
||||||
{ }
|
|
||||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
|
||||||
index 1e561872a17f..8b7509ed5775 100644
|
|
||||||
--- a/drivers/hid/hid-multitouch.c
|
|
||||||
+++ b/drivers/hid/hid-multitouch.c
|
|
||||||
@@ -1744,6 +1744,58 @@ static const struct hid_device_id mt_devices[] = {
|
|
||||||
HID_USB_DEVICE(USB_VENDOR_ID_LG,
|
|
||||||
USB_DEVICE_ID_LG_MELFAS_MT) },
|
|
||||||
|
|
||||||
+ /* Microsoft Touch Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TOUCH_COVER_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Type Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4) },
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Book 2 */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_BOOK_2) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Surface Laptop */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY,
|
|
||||||
+ USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_SURFACE_LAPTOP) },
|
|
||||||
+
|
|
||||||
+ /* Microsoft Power Cover */
|
|
||||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
|
||||||
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
|
||||||
+ USB_DEVICE_ID_MS_POWER_COVER) },
|
|
||||||
+
|
|
||||||
/* MosArt panels */
|
|
||||||
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
|
||||||
MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
|
|
||||||
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
|
||||||
index 587e2681a53f..4a5e335006d7 100644
|
|
||||||
--- a/drivers/hid/hid-quirks.c
|
|
||||||
+++ b/drivers/hid/hid-quirks.c
|
|
||||||
@@ -111,6 +111,16 @@ static const struct hid_device_id hid_quirks[] = {
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK_2), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_LAPTOP), HID_QUIRK_ALWAYS_POLL },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER), HID_QUIRK_MULTI_INPUT },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL), HID_QUIRK_NO_INIT_REPORTS },
|
|
||||||
{ HID_USB_DEVICE(USB_VENDOR_ID_MULTIPLE_1781, USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD), HID_QUIRK_MULTI_INPUT },
|
|
|
@ -1,14 +0,0 @@
|
||||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
|
||||||
index aa9968d90a48..64d620364093 100644
|
|
||||||
--- a/drivers/usb/core/hub.c
|
|
||||||
+++ b/drivers/usb/core/hub.c
|
|
||||||
@@ -4074,7 +4074,8 @@ void usb_enable_lpm(struct usb_device *udev)
|
|
||||||
if (!udev || !udev->parent ||
|
|
||||||
udev->speed < USB_SPEED_SUPER ||
|
|
||||||
!udev->lpm_capable ||
|
|
||||||
- udev->state < USB_STATE_DEFAULT)
|
|
||||||
+ udev->state < USB_STATE_DEFAULT ||
|
|
||||||
+ !udev->bos || !udev->bos->ss_cap)
|
|
||||||
return;
|
|
||||||
|
|
||||||
udev->lpm_disable_count--;
|
|
|
@ -1,30 +0,0 @@
|
||||||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
|
|
||||||
index 5c42cf81a08b..5eb92c3f3ea3 100644
|
|
||||||
--- a/drivers/net/usb/cdc_ether.c
|
|
||||||
+++ b/drivers/net/usb/cdc_ether.c
|
|
||||||
@@ -807,13 +807,6 @@ static const struct usb_device_id products[] = {
|
|
||||||
.driver_info = 0,
|
|
||||||
},
|
|
||||||
|
|
||||||
-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */
|
|
||||||
-{
|
|
||||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
|
||||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
|
||||||
- .driver_info = 0,
|
|
||||||
-},
|
|
||||||
-
|
|
||||||
/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
|
||||||
{
|
|
||||||
USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
|
||||||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
|
|
||||||
index 86f7196f9d91..b6434f476679 100644
|
|
||||||
--- a/drivers/net/usb/r8152.c
|
|
||||||
+++ b/drivers/net/usb/r8152.c
|
|
||||||
@@ -5322,7 +5322,6 @@ static const struct usb_device_id rtl8152_table[] = {
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)},
|
|
||||||
- {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)},
|
|
||||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)},
|
|
|
@ -1,3 +0,0 @@
|
||||||
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
|
|
||||||
old mode 100755
|
|
||||||
new mode 100644
|
|
Loading…
Reference in a new issue