Merge branch 'fixes' into for-next
Merge fixes back into for-next to be able to take dell_rbu change that is build on top of fixes material, and to bring lenovo related changes in sync after the move under lenovo/ subdir in the for-next branch and diverging changes in the fixes branch.
This commit is contained in:
1
.mailmap
1
.mailmap
@@ -282,6 +282,7 @@ Gustavo Padovan <gustavo@las.ic.unicamp.br>
|
||||
Gustavo Padovan <padovan@profusion.mobi>
|
||||
Hamza Mahfooz <hamzamahfooz@linux.microsoft.com> <hamza.mahfooz@amd.com>
|
||||
Hanjun Guo <guohanjun@huawei.com> <hanjun.guo@linaro.org>
|
||||
Hans de Goede <hansg@kernel.org> <hdegoede@redhat.com>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hansverk@cisco.com>
|
||||
Hans Verkuil <hverkuil@xs4all.nl> <hverkuil-cisco@xs4all.nl>
|
||||
Harry Yoo <harry.yoo@oracle.com> <42.hyeyoo@gmail.com>
|
||||
|
||||
@@ -36,7 +36,7 @@ Offset Size (in bytes) Content
|
||||
|
||||
The WMI object flags control whether the method or notification ID is used:
|
||||
|
||||
- 0x1: Data block usage is expensive and must be explicitly enabled/disabled.
|
||||
- 0x1: Data block is expensive to collect.
|
||||
- 0x2: Data block contains WMI methods.
|
||||
- 0x4: Data block contains ASCIZ string.
|
||||
- 0x8: Data block describes a WMI event, use notification ID instead
|
||||
@@ -83,14 +83,18 @@ event as hexadecimal value. Their first parameter is an integer with a value
|
||||
of 0 if the WMI event should be disabled, other values will enable
|
||||
the WMI event.
|
||||
|
||||
Those ACPI methods are always called even for WMI events not registered as
|
||||
being expensive to collect to match the behavior of the Windows driver.
|
||||
|
||||
WCxx ACPI methods
|
||||
-----------------
|
||||
Similar to the ``WExx`` ACPI methods, except that it controls data collection
|
||||
instead of events and thus the last two characters of the ACPI method name are
|
||||
the method ID of the data block to enable/disable.
|
||||
Similar to the ``WExx`` ACPI methods, except that instead of WMI events it controls
|
||||
data collection of data blocks registered as being expensive to collect. Thus the
|
||||
last two characters of the ACPI method name are the method ID of the data block
|
||||
to enable/disable.
|
||||
|
||||
Those ACPI methods are also called before setting data blocks to match the
|
||||
behaviour of the Windows driver.
|
||||
behavior of the Windows driver.
|
||||
|
||||
_WED ACPI method
|
||||
----------------
|
||||
|
||||
72
MAINTAINERS
72
MAINTAINERS
@@ -207,7 +207,7 @@ X: arch/*/include/uapi/
|
||||
X: include/uapi/
|
||||
|
||||
ABIT UGURU 1,2 HARDWARE MONITOR DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-hwmon@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/hwmon/abituguru.c
|
||||
@@ -371,7 +371,7 @@ S: Maintained
|
||||
F: drivers/platform/x86/quickstart.c
|
||||
|
||||
ACPI SERIAL MULTI INSTANTIATE DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/serial-multi-instantiate.c
|
||||
@@ -3551,7 +3551,7 @@ F: arch/arm64/boot/Makefile
|
||||
F: scripts/make_fit.py
|
||||
|
||||
ARM64 PLATFORM DRIVERS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
R: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
@@ -3712,7 +3712,7 @@ F: drivers/platform/x86/asus*.c
|
||||
F: drivers/platform/x86/eeepc*.c
|
||||
|
||||
ASUS TF103C DOCK DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
|
||||
@@ -5613,14 +5613,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/peter.chen/usb.git
|
||||
F: drivers/usb/chipidea/
|
||||
|
||||
CHIPONE ICN8318 I2C TOUCHSCREEN DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/input/touchscreen/chipone,icn8318.yaml
|
||||
F: drivers/input/touchscreen/chipone_icn8318.c
|
||||
|
||||
CHIPONE ICN8505 I2C TOUCHSCREEN DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/input/touchscreen/chipone_icn8505.c
|
||||
@@ -6917,7 +6917,7 @@ F: include/dt-bindings/pmu/exynos_ppmu.h
|
||||
F: include/linux/devfreq-event.h
|
||||
|
||||
DEVICE RESOURCE MANAGEMENT HELPERS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
R: Matti Vaittinen <mazziesaccount@gmail.com>
|
||||
S: Maintained
|
||||
F: include/linux/devm-helpers.h
|
||||
@@ -7516,7 +7516,7 @@ F: drivers/gpu/drm/gud/
|
||||
F: include/drm/gud.h
|
||||
|
||||
DRM DRIVER FOR GRAIN MEDIA GM12U320 PROJECTORS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
F: drivers/gpu/drm/tiny/gm12u320.c
|
||||
@@ -7916,7 +7916,7 @@ F: drivers/gpu/drm/ci/xfails/vkms*
|
||||
F: drivers/gpu/drm/vkms/
|
||||
|
||||
DRM DRIVER FOR VIRTUALBOX VIRTUAL GPU
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
@@ -8317,7 +8317,7 @@ F: drivers/gpu/drm/panel/
|
||||
F: include/drm/drm_panel.h
|
||||
|
||||
DRM PRIVACY-SCREEN CLASS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: dri-devel@lists.freedesktop.org
|
||||
S: Maintained
|
||||
T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
|
||||
@@ -10221,7 +10221,7 @@ S: Maintained
|
||||
F: Documentation/devicetree/bindings/connector/gocontroll,moduline-module-slot.yaml
|
||||
|
||||
GOODIX TOUCHSCREEN
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/input/touchscreen/goodix*
|
||||
@@ -10260,7 +10260,7 @@ F: include/dt-bindings/clock/google,gs101.h
|
||||
K: [gG]oogle.?[tT]ensor
|
||||
|
||||
GPD POCKET FAN DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/gpd-pocket-fan.c
|
||||
@@ -11421,7 +11421,7 @@ F: drivers/i2c/busses/i2c-via.c
|
||||
F: drivers/i2c/busses/i2c-viapro.c
|
||||
|
||||
I2C/SMBUS INTEL CHT WHISKEY COVE PMIC DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/busses/i2c-cht-wc.c
|
||||
@@ -12011,13 +12011,13 @@ S: Supported
|
||||
F: sound/soc/intel/
|
||||
|
||||
INTEL ATOMISP2 DUMMY / POWER-MANAGEMENT DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/intel/atomisp2/pm.c
|
||||
|
||||
INTEL ATOMISP2 LED DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/intel/atomisp2/led.c
|
||||
@@ -13684,7 +13684,7 @@ S: Maintained
|
||||
F: drivers/platform/x86/lenovo/wmi-hotkey-utilities.c
|
||||
|
||||
LETSKETCH HID TABLET DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
|
||||
@@ -13734,7 +13734,7 @@ F: drivers/ata/sata_gemini.c
|
||||
F: drivers/ata/sata_gemini.h
|
||||
|
||||
LIBATA SATA AHCI PLATFORM devices support
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-ide@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/ata/ahci_platform.c
|
||||
@@ -14104,7 +14104,7 @@ F: Documentation/admin-guide/ldm.rst
|
||||
F: block/partitions/ldm.*
|
||||
|
||||
LOGITECH HID GAMING KEYBOARDS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
|
||||
@@ -14786,7 +14786,7 @@ F: Documentation/devicetree/bindings/power/supply/maxim,max17040.yaml
|
||||
F: drivers/power/supply/max17040_battery.c
|
||||
|
||||
MAXIM MAX17042 FAMILY FUEL GAUGE DRIVERS
|
||||
R: Hans de Goede <hdegoede@redhat.com>
|
||||
R: Hans de Goede <hansg@kernel.org>
|
||||
R: Krzysztof Kozlowski <krzk@kernel.org>
|
||||
R: Marek Szyprowski <m.szyprowski@samsung.com>
|
||||
R: Sebastian Krzyszkowiak <sebastian.krzyszkowiak@puri.sm>
|
||||
@@ -15588,7 +15588,7 @@ Q: https://patchwork.kernel.org/project/netdevbpf/list/
|
||||
F: drivers/net/ethernet/mellanox/mlxfw/
|
||||
|
||||
MELLANOX HARDWARE PLATFORM SUPPORT
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
M: Vadim Pasternak <vadimp@nvidia.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
@@ -16544,7 +16544,7 @@ S: Maintained
|
||||
F: drivers/platform/surface/surface_gpe.c
|
||||
|
||||
MICROSOFT SURFACE HARDWARE PLATFORM SUPPORT
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
M: Maximilian Luz <luzmaximilian@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
@@ -17712,7 +17712,7 @@ F: tools/include/nolibc/
|
||||
F: tools/testing/selftests/nolibc/
|
||||
|
||||
NOVATEK NVT-TS I2C TOUCHSCREEN DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/input/touchscreen/novatek,nvt-ts.yaml
|
||||
@@ -22714,7 +22714,7 @@ K: fu[57]40
|
||||
K: [^@]sifive
|
||||
|
||||
SILEAD TOUCHSCREEN DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -22747,7 +22747,7 @@ F: Documentation/devicetree/bindings/i3c/silvaco,i3c-master.yaml
|
||||
F: drivers/i3c/master/svc-i3c-master.c
|
||||
|
||||
SIMPLEFB FB DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-fbdev@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/display/simple-framebuffer.yaml
|
||||
@@ -22876,7 +22876,7 @@ F: Documentation/hwmon/emc2103.rst
|
||||
F: drivers/hwmon/emc2103.c
|
||||
|
||||
SMSC SCH5627 HARDWARE MONITOR DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-hwmon@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/hwmon/sch5627.rst
|
||||
@@ -23531,7 +23531,7 @@ S: Supported
|
||||
F: Documentation/process/stable-kernel-rules.rst
|
||||
|
||||
STAGING - ATOMISP DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||
R: Sakari Ailus <sakari.ailus@linux.intel.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@@ -23828,7 +23828,7 @@ F: arch/m68k/sun3*/
|
||||
F: drivers/net/ethernet/i825xx/sun3*
|
||||
|
||||
SUN4I LOW RES ADC ATTACHED TABLET KEYS DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/input/allwinner,sun4i-a10-lradc-keys.yaml
|
||||
@@ -25596,7 +25596,7 @@ F: Documentation/hid/hiddev.rst
|
||||
F: drivers/hid/usbhid/
|
||||
|
||||
USB INTEL XHCI ROLE MUX DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/usb/roles/intel-xhci-usb-role-switch.c
|
||||
@@ -25787,7 +25787,7 @@ F: Documentation/firmware-guide/acpi/intel-pmc-mux.rst
|
||||
F: drivers/usb/typec/mux/intel_pmc_mux.c
|
||||
|
||||
USB TYPEC PI3USB30532 MUX DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/usb/typec/mux/pi3usb30532.c
|
||||
@@ -25816,7 +25816,7 @@ F: drivers/usb/host/uhci*
|
||||
|
||||
USB VIDEO CLASS
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-media@vger.kernel.org
|
||||
S: Maintained
|
||||
W: http://www.ideasonboard.org/uvc/
|
||||
@@ -26347,7 +26347,7 @@ F: include/uapi/linux/virtio_snd.h
|
||||
F: sound/virtio/*
|
||||
|
||||
VIRTUAL BOX GUEST DEVICE DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Arnd Bergmann <arnd@arndb.de>
|
||||
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
S: Maintained
|
||||
@@ -26356,7 +26356,7 @@ F: include/linux/vbox_utils.h
|
||||
F: include/uapi/linux/vbox*.h
|
||||
|
||||
VIRTUAL BOX SHARED FOLDER VFS DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: fs/vboxsf/*
|
||||
@@ -26610,7 +26610,7 @@ F: drivers/mmc/host/wbsd.*
|
||||
|
||||
WACOM PROTOCOL 4 SERIAL TABLETS
|
||||
M: Julian Squires <julian@cipht.net>
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: linux-input@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/input/tablet/wacom_serial4.c
|
||||
@@ -26777,7 +26777,7 @@ F: include/linux/wwan.h
|
||||
F: include/uapi/linux/wwan.h
|
||||
|
||||
X-POWERS AXP288 PMIC DRIVERS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
S: Maintained
|
||||
F: drivers/acpi/pmic/intel_pmic_xpower.c
|
||||
N: axp288
|
||||
@@ -26869,14 +26869,14 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86/mm
|
||||
F: arch/x86/mm/
|
||||
|
||||
X86 PLATFORM ANDROID TABLETS DSDT FIXUP DRIVER
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86.git
|
||||
F: drivers/platform/x86/x86-android-tablets/
|
||||
|
||||
X86 PLATFORM DRIVERS
|
||||
M: Hans de Goede <hdegoede@redhat.com>
|
||||
M: Hans de Goede <hansg@kernel.org>
|
||||
M: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
#include <linux/sched/clock.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/topology.h>
|
||||
#include <asm/amd/fch.h>
|
||||
#include <linux/platform_data/x86/amd-fch.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/apic.h>
|
||||
#include <asm/cacheinfo.h>
|
||||
|
||||
@@ -200,7 +200,7 @@ config I2C_ISMT
|
||||
|
||||
config I2C_PIIX4
|
||||
tristate "Intel PIIX4 and compatible (ATI/AMD/Serverworks/Broadcom/SMSC)"
|
||||
depends on PCI && HAS_IOPORT && X86
|
||||
depends on PCI && HAS_IOPORT
|
||||
select I2C_SMBUS
|
||||
help
|
||||
If you say yes to this option, support will be included for the Intel
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/amd/fch.h>
|
||||
#include <linux/platform_data/x86/amd-fch.h>
|
||||
|
||||
#include "i2c-piix4.h"
|
||||
|
||||
|
||||
@@ -715,7 +715,7 @@ static const struct mlxbf_pmc_events mlxbf_pmc_llt_events[] = {
|
||||
{101, "GDC_BANK0_HIT_DCL_PARTIAL"},
|
||||
{102, "GDC_BANK0_EVICT_DCL"},
|
||||
{103, "GDC_BANK0_G_RSE_PIPE_CACHE_DATA0"},
|
||||
{103, "GDC_BANK0_G_RSE_PIPE_CACHE_DATA1"},
|
||||
{104, "GDC_BANK0_G_RSE_PIPE_CACHE_DATA1"},
|
||||
{105, "GDC_BANK0_ARB_STRB"},
|
||||
{106, "GDC_BANK0_ARB_WAIT"},
|
||||
{107, "GDC_BANK0_GGA_STRB"},
|
||||
|
||||
@@ -281,7 +281,8 @@ static int mlxbf_tmfifo_alloc_vrings(struct mlxbf_tmfifo *fifo,
|
||||
vring->align = SMP_CACHE_BYTES;
|
||||
vring->index = i;
|
||||
vring->vdev_id = tm_vdev->vdev.id.device;
|
||||
vring->drop_desc.len = VRING_DROP_DESC_MAX_LEN;
|
||||
vring->drop_desc.len = cpu_to_virtio32(&tm_vdev->vdev,
|
||||
VRING_DROP_DESC_MAX_LEN);
|
||||
dev = &tm_vdev->vdev.dev;
|
||||
|
||||
size = vring_size(vring->num, vring->align);
|
||||
@@ -1287,7 +1288,7 @@ static void mlxbf_tmfifo_get_cfg_mac(u8 *mac)
|
||||
ether_addr_copy(mac, mlxbf_tmfifo_net_default_mac);
|
||||
}
|
||||
|
||||
/* Set TmFifo thresolds which is used to trigger interrupts. */
|
||||
/* Set TmFifo thresholds which is used to trigger interrupts. */
|
||||
static void mlxbf_tmfifo_set_threshold(struct mlxbf_tmfifo *fifo)
|
||||
{
|
||||
u64 ctl;
|
||||
|
||||
@@ -483,7 +483,7 @@ static int mlxreg_dpu_config_init(struct mlxreg_dpu *mlxreg_dpu, void *regmap,
|
||||
mlxreg_dpu->io_data,
|
||||
sizeof(*mlxreg_dpu->io_data));
|
||||
if (IS_ERR(mlxreg_dpu->io_regs)) {
|
||||
dev_err(dev, "Failed to create regio for client %s at bus %d at addr 0x%02x\n",
|
||||
dev_err(dev, "Failed to create region for client %s at bus %d at addr 0x%02x\n",
|
||||
data->hpdev.brdinfo->type, data->hpdev.nr,
|
||||
data->hpdev.brdinfo->addr);
|
||||
return PTR_ERR(mlxreg_dpu->io_regs);
|
||||
|
||||
@@ -57,9 +57,9 @@ enum mlxreg_lc_state {
|
||||
* @dev: platform device;
|
||||
* @lock: line card lock;
|
||||
* @par_regmap: parent device regmap handle;
|
||||
* @data: pltaform core data;
|
||||
* @data: platform core data;
|
||||
* @io_data: register access platform data;
|
||||
* @led_data: LED platform data ;
|
||||
* @led_data: LED platform data;
|
||||
* @mux_data: MUX platform data;
|
||||
* @led: LED device;
|
||||
* @io_regs: register access device;
|
||||
@@ -171,7 +171,7 @@ static int mlxreg_lc_chan[] = {
|
||||
0x4e, 0x4f
|
||||
};
|
||||
|
||||
/* Defaul mux configuration. */
|
||||
/* Default mux configuration. */
|
||||
static struct mlxcpld_mux_plat_data mlxreg_lc_mux_data[] = {
|
||||
{
|
||||
.chan_ids = mlxreg_lc_chan,
|
||||
@@ -181,7 +181,7 @@ static struct mlxcpld_mux_plat_data mlxreg_lc_mux_data[] = {
|
||||
},
|
||||
};
|
||||
|
||||
/* Defaul mux board info. */
|
||||
/* Default mux board info. */
|
||||
static struct i2c_board_info mlxreg_lc_mux_brdinfo = {
|
||||
I2C_BOARD_INFO("i2c-mux-mlxcpld", 0x32),
|
||||
};
|
||||
@@ -688,7 +688,7 @@ static int mlxreg_lc_completion_notify(void *handle, struct i2c_adapter *parent,
|
||||
if (regval & mlxreg_lc->data->mask) {
|
||||
mlxreg_lc->state |= MLXREG_LC_SYNCED;
|
||||
mlxreg_lc_state_update_locked(mlxreg_lc, MLXREG_LC_SYNCED, 1);
|
||||
if (mlxreg_lc->state & ~MLXREG_LC_POWERED) {
|
||||
if (!(mlxreg_lc->state & MLXREG_LC_POWERED)) {
|
||||
err = mlxreg_lc_power_on_off(mlxreg_lc, 1);
|
||||
if (err)
|
||||
goto mlxreg_lc_regmap_power_on_off_fail;
|
||||
@@ -758,7 +758,7 @@ mlxreg_lc_config_init(struct mlxreg_lc *mlxreg_lc, void *regmap,
|
||||
platform_device_register_resndata(dev, "mlxreg-io", data->hpdev.nr, NULL, 0,
|
||||
mlxreg_lc->io_data, sizeof(*mlxreg_lc->io_data));
|
||||
if (IS_ERR(mlxreg_lc->io_regs)) {
|
||||
dev_err(dev, "Failed to create regio for client %s at bus %d at addr 0x%02x\n",
|
||||
dev_err(dev, "Failed to create region for client %s at bus %d at addr 0x%02x\n",
|
||||
data->hpdev.brdinfo->type, data->hpdev.nr,
|
||||
data->hpdev.brdinfo->addr);
|
||||
err = PTR_ERR(mlxreg_lc->io_regs);
|
||||
|
||||
@@ -1181,7 +1181,7 @@ static int nvsw_sn2201_i2c_completion_notify(void *handle, int id)
|
||||
if (!nvsw_sn2201->main_mux_devs->adapter) {
|
||||
err = -ENODEV;
|
||||
dev_err(nvsw_sn2201->dev, "Failed to get adapter for bus %d\n",
|
||||
nvsw_sn2201->cpld_devs->nr);
|
||||
nvsw_sn2201->main_mux_devs->nr);
|
||||
goto i2c_get_adapter_main_fail;
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@
|
||||
#define AMDISP_OV05C10_REMOTE_EP_NAME "ov05c10_isp_4_1_1"
|
||||
#define AMD_ISP_PLAT_DRV_NAME "amd-isp4"
|
||||
|
||||
static const struct software_node isp4_mipi1_endpoint_node;
|
||||
static const struct software_node ov05c10_endpoint_node;
|
||||
|
||||
/*
|
||||
* AMD ISP platform info definition to initialize sensor
|
||||
* specific platform configuration to prepare the amdisp
|
||||
@@ -42,55 +45,116 @@ struct amdisp_platform {
|
||||
struct mutex lock; /* protects i2c client creation */
|
||||
};
|
||||
|
||||
/* Top-level OV05C10 camera node property table */
|
||||
/* Root AMD CAMERA SWNODE */
|
||||
|
||||
/* Root amd camera node definition */
|
||||
static const struct software_node amd_camera_node = {
|
||||
.name = "amd_camera",
|
||||
};
|
||||
|
||||
/* ISP4 SWNODE */
|
||||
|
||||
/* ISP4 OV05C10 camera node definition */
|
||||
static const struct software_node isp4_node = {
|
||||
.name = "isp4",
|
||||
.parent = &amd_camera_node,
|
||||
};
|
||||
|
||||
/*
|
||||
* ISP4 Ports node definition. No properties defined for
|
||||
* ports node.
|
||||
*/
|
||||
static const struct software_node isp4_ports = {
|
||||
.name = "ports",
|
||||
.parent = &isp4_node,
|
||||
};
|
||||
|
||||
/*
|
||||
* ISP4 Port node definition. No properties defined for
|
||||
* port node.
|
||||
*/
|
||||
static const struct software_node isp4_port_node = {
|
||||
.name = "port@0",
|
||||
.parent = &isp4_ports,
|
||||
};
|
||||
|
||||
/*
|
||||
* ISP4 MIPI1 remote endpoint points to OV05C10 endpoint
|
||||
* node.
|
||||
*/
|
||||
static const struct software_node_ref_args isp4_refs[] = {
|
||||
SOFTWARE_NODE_REFERENCE(&ov05c10_endpoint_node),
|
||||
};
|
||||
|
||||
/* ISP4 MIPI1 endpoint node properties table */
|
||||
static const struct property_entry isp4_mipi1_endpoint_props[] = {
|
||||
PROPERTY_ENTRY_REF_ARRAY("remote-endpoint", isp4_refs),
|
||||
{ }
|
||||
};
|
||||
|
||||
/* ISP4 MIPI1 endpoint node definition */
|
||||
static const struct software_node isp4_mipi1_endpoint_node = {
|
||||
.name = "endpoint",
|
||||
.parent = &isp4_port_node,
|
||||
.properties = isp4_mipi1_endpoint_props,
|
||||
};
|
||||
|
||||
/* I2C1 SWNODE */
|
||||
|
||||
/* I2C1 camera node property table */
|
||||
static const struct property_entry i2c1_camera_props[] = {
|
||||
PROPERTY_ENTRY_U32("clock-frequency", 1 * HZ_PER_MHZ),
|
||||
{ }
|
||||
};
|
||||
|
||||
/* I2C1 camera node definition */
|
||||
static const struct software_node i2c1_node = {
|
||||
.name = "i2c1",
|
||||
.parent = &amd_camera_node,
|
||||
.properties = i2c1_camera_props,
|
||||
};
|
||||
|
||||
/* I2C1 camera node property table */
|
||||
static const struct property_entry ov05c10_camera_props[] = {
|
||||
PROPERTY_ENTRY_U32("clock-frequency", 24 * HZ_PER_MHZ),
|
||||
{ }
|
||||
};
|
||||
|
||||
/* Root AMD ISP OV05C10 camera node definition */
|
||||
static const struct software_node camera_node = {
|
||||
/* OV05C10 camera node definition */
|
||||
static const struct software_node ov05c10_camera_node = {
|
||||
.name = AMDISP_OV05C10_HID,
|
||||
.parent = &i2c1_node,
|
||||
.properties = ov05c10_camera_props,
|
||||
};
|
||||
|
||||
/*
|
||||
* AMD ISP OV05C10 Ports node definition. No properties defined for
|
||||
* OV05C10 Ports node definition. No properties defined for
|
||||
* ports node for OV05C10.
|
||||
*/
|
||||
static const struct software_node ports = {
|
||||
static const struct software_node ov05c10_ports = {
|
||||
.name = "ports",
|
||||
.parent = &camera_node,
|
||||
.parent = &ov05c10_camera_node,
|
||||
};
|
||||
|
||||
/*
|
||||
* AMD ISP OV05C10 Port node definition. No properties defined for
|
||||
* port node for OV05C10.
|
||||
* OV05C10 Port node definition.
|
||||
*/
|
||||
static const struct software_node port_node = {
|
||||
.name = "port@",
|
||||
.parent = &ports,
|
||||
static const struct software_node ov05c10_port_node = {
|
||||
.name = "port@0",
|
||||
.parent = &ov05c10_ports,
|
||||
};
|
||||
|
||||
/*
|
||||
* Remote endpoint AMD ISP node definition. No properties defined for
|
||||
* remote endpoint node for OV05C10.
|
||||
*/
|
||||
static const struct software_node remote_ep_isp_node = {
|
||||
.name = AMDISP_OV05C10_REMOTE_EP_NAME,
|
||||
};
|
||||
|
||||
/*
|
||||
* Remote endpoint reference for isp node included in the
|
||||
* OV05C10 endpoint.
|
||||
* OV05C10 remote endpoint points to ISP4 MIPI1 endpoint
|
||||
* node.
|
||||
*/
|
||||
static const struct software_node_ref_args ov05c10_refs[] = {
|
||||
SOFTWARE_NODE_REFERENCE(&remote_ep_isp_node),
|
||||
SOFTWARE_NODE_REFERENCE(&isp4_mipi1_endpoint_node),
|
||||
};
|
||||
|
||||
/* OV05C10 supports one single link frequency */
|
||||
static const u64 ov05c10_link_freqs[] = {
|
||||
925 * HZ_PER_MHZ,
|
||||
900 * HZ_PER_MHZ,
|
||||
};
|
||||
|
||||
/* OV05C10 supports only 2-lane configuration */
|
||||
@@ -110,27 +174,64 @@ static const struct property_entry ov05c10_endpoint_props[] = {
|
||||
{ }
|
||||
};
|
||||
|
||||
/* AMD ISP endpoint node definition */
|
||||
static const struct software_node endpoint_node = {
|
||||
/* OV05C10 endpoint node definition */
|
||||
static const struct software_node ov05c10_endpoint_node = {
|
||||
.name = "endpoint",
|
||||
.parent = &port_node,
|
||||
.parent = &ov05c10_port_node,
|
||||
.properties = ov05c10_endpoint_props,
|
||||
};
|
||||
|
||||
/*
|
||||
* AMD ISP swnode graph uses 5 nodes and also its relationship is
|
||||
* fixed to align with the structure that v4l2 expects for successful
|
||||
* endpoint fwnode parsing.
|
||||
* AMD Camera swnode graph uses 10 nodes and also its relationship is
|
||||
* fixed to align with the structure that v4l2 and i2c frameworks expects
|
||||
* for successful parsing of fwnodes and its properties with standard names.
|
||||
*
|
||||
* It is only the node property_entries that will vary for each platform
|
||||
* supporting different sensor modules.
|
||||
*
|
||||
* AMD ISP4 SWNODE GRAPH Structure
|
||||
*
|
||||
* amd_camera {
|
||||
* isp4 {
|
||||
* ports {
|
||||
* port@0 {
|
||||
* isp4_mipi1_ep: endpoint {
|
||||
* remote-endpoint = &OMNI5C10_ep;
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
*
|
||||
* i2c1 {
|
||||
* clock-frequency = 1 MHz;
|
||||
* OMNI5C10 {
|
||||
* clock-frequency = 24MHz;
|
||||
* ports {
|
||||
* port@0 {
|
||||
* OMNI5C10_ep: endpoint {
|
||||
* bus-type = 4;
|
||||
* data-lanes = <1 2>;
|
||||
* link-frequencies = 900MHz;
|
||||
* remote-endpoint = &isp4_mipi1;
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
* };
|
||||
*
|
||||
*/
|
||||
static const struct software_node *ov05c10_nodes[] = {
|
||||
&camera_node,
|
||||
&ports,
|
||||
&port_node,
|
||||
&endpoint_node,
|
||||
&remote_ep_isp_node,
|
||||
static const struct software_node *amd_isp4_nodes[] = {
|
||||
&amd_camera_node,
|
||||
&isp4_node,
|
||||
&isp4_ports,
|
||||
&isp4_port_node,
|
||||
&isp4_mipi1_endpoint_node,
|
||||
&i2c1_node,
|
||||
&ov05c10_camera_node,
|
||||
&ov05c10_ports,
|
||||
&ov05c10_port_node,
|
||||
&ov05c10_endpoint_node,
|
||||
NULL
|
||||
};
|
||||
|
||||
@@ -140,7 +241,7 @@ static const struct amdisp_platform_info ov05c10_platform_config = {
|
||||
.dev_name = "ov05c10",
|
||||
I2C_BOARD_INFO("ov05c10", AMDISP_OV05C10_I2C_ADDR),
|
||||
},
|
||||
.swnodes = ov05c10_nodes,
|
||||
.swnodes = amd_isp4_nodes,
|
||||
};
|
||||
|
||||
static const struct acpi_device_id amdisp_sensor_ids[] = {
|
||||
@@ -232,7 +333,8 @@ static struct amdisp_platform *prepare_amdisp_platform(struct device *dev,
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
isp4_platform->board_info.swnode = src->swnodes[0];
|
||||
/* initialize ov05c10_camera_node */
|
||||
isp4_platform->board_info.swnode = src->swnodes[6];
|
||||
|
||||
return isp4_platform;
|
||||
}
|
||||
@@ -257,6 +359,7 @@ static int amd_isp_probe(struct platform_device *pdev)
|
||||
{
|
||||
const struct amdisp_platform_info *pinfo;
|
||||
struct amdisp_platform *isp4_platform;
|
||||
struct acpi_device *adev;
|
||||
int ret;
|
||||
|
||||
pinfo = device_get_match_data(&pdev->dev);
|
||||
@@ -274,6 +377,10 @@ static int amd_isp_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto error_unregister_sw_node;
|
||||
|
||||
adev = ACPI_COMPANION(&pdev->dev);
|
||||
/* initialize root amd_camera_node */
|
||||
adev->driver_data = (void *)pinfo->swnodes[0];
|
||||
|
||||
/* check if adapter is already registered and create i2c client instance */
|
||||
i2c_for_each_dev(isp4_platform, try_to_instantiate_i2c_client);
|
||||
|
||||
|
||||
@@ -97,7 +97,7 @@ static int __hsmp_send_message(struct hsmp_socket *sock, struct hsmp_message *ms
|
||||
short_sleep = jiffies + msecs_to_jiffies(HSMP_SHORT_SLEEP);
|
||||
timeout = jiffies + msecs_to_jiffies(HSMP_MSG_TIMEOUT);
|
||||
|
||||
while (time_before(jiffies, timeout)) {
|
||||
while (true) {
|
||||
ret = sock->amd_hsmp_rdwr(sock, mbinfo->msg_resp_off, &mbox_status, HSMP_RD);
|
||||
if (ret) {
|
||||
dev_err(sock->dev, "Error %d reading mailbox status\n", ret);
|
||||
@@ -106,6 +106,10 @@ static int __hsmp_send_message(struct hsmp_socket *sock, struct hsmp_message *ms
|
||||
|
||||
if (mbox_status != HSMP_STATUS_NOT_READY)
|
||||
break;
|
||||
|
||||
if (!time_before(jiffies, timeout))
|
||||
break;
|
||||
|
||||
if (time_before(jiffies, short_sleep))
|
||||
usleep_range(50, 100);
|
||||
else
|
||||
@@ -210,13 +214,7 @@ int hsmp_send_message(struct hsmp_message *msg)
|
||||
return -ENODEV;
|
||||
sock = &hsmp_pdev.sock[msg->sock_ind];
|
||||
|
||||
/*
|
||||
* The time taken by smu operation to complete is between
|
||||
* 10us to 1ms. Sometime it may take more time.
|
||||
* In SMP system timeout of 100 millisecs should
|
||||
* be enough for the previous thread to finish the operation
|
||||
*/
|
||||
ret = down_timeout(&sock->hsmp_sem, msecs_to_jiffies(HSMP_MSG_TIMEOUT));
|
||||
ret = down_interruptible(&sock->hsmp_sem);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <asm/amd/fch.h>
|
||||
#include <linux/platform_data/x86/amd-fch.h>
|
||||
|
||||
#include "pmc.h"
|
||||
|
||||
@@ -225,6 +225,15 @@ static const struct dmi_system_id fwbug_list[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "WUJIE14-GX4HRXL"),
|
||||
}
|
||||
},
|
||||
/* https://bugzilla.kernel.org/show_bug.cgi?id=220116 */
|
||||
{
|
||||
.ident = "PCSpecialist Lafite Pro V 14M",
|
||||
.driver_data = &quirk_spurious_8042,
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "PCSpecialist"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Lafite Pro V 14M"),
|
||||
}
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
||||
@@ -157,6 +157,8 @@ static int amd_pmc_setup_smu_logging(struct amd_pmc_dev *dev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset_io(dev->smu_virt_addr, 0, sizeof(struct smu_metrics));
|
||||
|
||||
/* Start the logging */
|
||||
amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_RESET, false);
|
||||
amd_pmc_send_cmd(dev, 0, NULL, SMU_MSG_LOG_START, false);
|
||||
|
||||
@@ -280,7 +280,7 @@ int amd_pmf_set_dram_addr(struct amd_pmf_dev *dev, bool alloc_buffer)
|
||||
dev_err(dev->dev, "Invalid CPU id: 0x%x", dev->cpu_id);
|
||||
}
|
||||
|
||||
dev->buf = kzalloc(dev->mtable_size, GFP_KERNEL);
|
||||
dev->buf = devm_kzalloc(dev->dev, dev->mtable_size, GFP_KERNEL);
|
||||
if (!dev->buf)
|
||||
return -ENOMEM;
|
||||
}
|
||||
@@ -493,7 +493,6 @@ static void amd_pmf_remove(struct platform_device *pdev)
|
||||
mutex_destroy(&dev->lock);
|
||||
mutex_destroy(&dev->update_mutex);
|
||||
mutex_destroy(&dev->cb_mutex);
|
||||
kfree(dev->buf);
|
||||
}
|
||||
|
||||
static const struct attribute_group *amd_pmf_driver_groups[] = {
|
||||
|
||||
@@ -358,30 +358,28 @@ static ssize_t amd_pmf_get_pb_data(struct file *filp, const char __user *buf,
|
||||
return -EINVAL;
|
||||
|
||||
/* re-alloc to the new buffer length of the policy binary */
|
||||
new_policy_buf = memdup_user(buf, length);
|
||||
if (IS_ERR(new_policy_buf))
|
||||
return PTR_ERR(new_policy_buf);
|
||||
new_policy_buf = devm_kzalloc(dev->dev, length, GFP_KERNEL);
|
||||
if (!new_policy_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
kfree(dev->policy_buf);
|
||||
if (copy_from_user(new_policy_buf, buf, length)) {
|
||||
devm_kfree(dev->dev, new_policy_buf);
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
devm_kfree(dev->dev, dev->policy_buf);
|
||||
dev->policy_buf = new_policy_buf;
|
||||
dev->policy_sz = length;
|
||||
|
||||
if (!amd_pmf_pb_valid(dev)) {
|
||||
ret = -EINVAL;
|
||||
goto cleanup;
|
||||
}
|
||||
if (!amd_pmf_pb_valid(dev))
|
||||
return -EINVAL;
|
||||
|
||||
amd_pmf_hex_dump_pb(dev);
|
||||
ret = amd_pmf_start_policy_engine(dev);
|
||||
if (ret < 0)
|
||||
goto cleanup;
|
||||
return ret;
|
||||
|
||||
return length;
|
||||
|
||||
cleanup:
|
||||
kfree(dev->policy_buf);
|
||||
dev->policy_buf = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct file_operations pb_fops = {
|
||||
@@ -422,12 +420,12 @@ static int amd_pmf_ta_open_session(struct tee_context *ctx, u32 *id, const uuid_
|
||||
rc = tee_client_open_session(ctx, &sess_arg, NULL);
|
||||
if (rc < 0 || sess_arg.ret != 0) {
|
||||
pr_err("Failed to open TEE session err:%#x, rc:%d\n", sess_arg.ret, rc);
|
||||
return rc;
|
||||
return rc ?: -EINVAL;
|
||||
}
|
||||
|
||||
*id = sess_arg.session;
|
||||
|
||||
return rc;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int amd_pmf_register_input_device(struct amd_pmf_dev *dev)
|
||||
@@ -462,7 +460,9 @@ static int amd_pmf_tee_init(struct amd_pmf_dev *dev, const uuid_t *uuid)
|
||||
dev->tee_ctx = tee_client_open_context(NULL, amd_pmf_amdtee_ta_match, NULL, NULL);
|
||||
if (IS_ERR(dev->tee_ctx)) {
|
||||
dev_err(dev->dev, "Failed to open TEE context\n");
|
||||
return PTR_ERR(dev->tee_ctx);
|
||||
ret = PTR_ERR(dev->tee_ctx);
|
||||
dev->tee_ctx = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = amd_pmf_ta_open_session(dev->tee_ctx, &dev->session_id, uuid);
|
||||
@@ -502,9 +502,12 @@ out_ctx:
|
||||
|
||||
static void amd_pmf_tee_deinit(struct amd_pmf_dev *dev)
|
||||
{
|
||||
if (!dev->tee_ctx)
|
||||
return;
|
||||
tee_shm_free(dev->fw_shm_pool);
|
||||
tee_client_close_session(dev->tee_ctx, dev->session_id);
|
||||
tee_client_close_context(dev->tee_ctx);
|
||||
dev->tee_ctx = NULL;
|
||||
}
|
||||
|
||||
int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)
|
||||
@@ -527,64 +530,45 @@ int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)
|
||||
|
||||
ret = amd_pmf_set_dram_addr(dev, true);
|
||||
if (ret)
|
||||
goto err_cancel_work;
|
||||
return ret;
|
||||
|
||||
dev->policy_base = devm_ioremap_resource(dev->dev, dev->res);
|
||||
if (IS_ERR(dev->policy_base)) {
|
||||
ret = PTR_ERR(dev->policy_base);
|
||||
goto err_free_dram_buf;
|
||||
}
|
||||
if (IS_ERR(dev->policy_base))
|
||||
return PTR_ERR(dev->policy_base);
|
||||
|
||||
dev->policy_buf = kzalloc(dev->policy_sz, GFP_KERNEL);
|
||||
if (!dev->policy_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_dram_buf;
|
||||
}
|
||||
dev->policy_buf = devm_kzalloc(dev->dev, dev->policy_sz, GFP_KERNEL);
|
||||
if (!dev->policy_buf)
|
||||
return -ENOMEM;
|
||||
|
||||
memcpy_fromio(dev->policy_buf, dev->policy_base, dev->policy_sz);
|
||||
|
||||
if (!amd_pmf_pb_valid(dev)) {
|
||||
dev_info(dev->dev, "No Smart PC policy present\n");
|
||||
ret = -EINVAL;
|
||||
goto err_free_policy;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
amd_pmf_hex_dump_pb(dev);
|
||||
|
||||
dev->prev_data = kzalloc(sizeof(*dev->prev_data), GFP_KERNEL);
|
||||
if (!dev->prev_data) {
|
||||
ret = -ENOMEM;
|
||||
goto err_free_policy;
|
||||
}
|
||||
dev->prev_data = devm_kzalloc(dev->dev, sizeof(*dev->prev_data), GFP_KERNEL);
|
||||
if (!dev->prev_data)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(amd_pmf_ta_uuid); i++) {
|
||||
ret = amd_pmf_tee_init(dev, &amd_pmf_ta_uuid[i]);
|
||||
if (ret)
|
||||
goto err_free_prev_data;
|
||||
return ret;
|
||||
|
||||
ret = amd_pmf_start_policy_engine(dev);
|
||||
switch (ret) {
|
||||
case TA_PMF_TYPE_SUCCESS:
|
||||
status = true;
|
||||
break;
|
||||
case TA_ERROR_CRYPTO_INVALID_PARAM:
|
||||
case TA_ERROR_CRYPTO_BIN_TOO_LARGE:
|
||||
amd_pmf_tee_deinit(dev);
|
||||
status = false;
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
amd_pmf_tee_deinit(dev);
|
||||
goto err_free_prev_data;
|
||||
}
|
||||
|
||||
dev_dbg(dev->dev, "start policy engine ret: %d\n", ret);
|
||||
status = ret == TA_PMF_TYPE_SUCCESS;
|
||||
if (status)
|
||||
break;
|
||||
amd_pmf_tee_deinit(dev);
|
||||
}
|
||||
|
||||
if (!status && !pb_side_load) {
|
||||
ret = -EINVAL;
|
||||
goto err_free_prev_data;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pb_side_load)
|
||||
@@ -592,22 +576,12 @@ int amd_pmf_init_smart_pc(struct amd_pmf_dev *dev)
|
||||
|
||||
ret = amd_pmf_register_input_device(dev);
|
||||
if (ret)
|
||||
goto err_pmf_remove_pb;
|
||||
goto err;
|
||||
|
||||
return 0;
|
||||
|
||||
err_pmf_remove_pb:
|
||||
if (pb_side_load && dev->esbin)
|
||||
amd_pmf_remove_pb(dev);
|
||||
amd_pmf_tee_deinit(dev);
|
||||
err_free_prev_data:
|
||||
kfree(dev->prev_data);
|
||||
err_free_policy:
|
||||
kfree(dev->policy_buf);
|
||||
err_free_dram_buf:
|
||||
kfree(dev->buf);
|
||||
err_cancel_work:
|
||||
cancel_delayed_work_sync(&dev->pb_work);
|
||||
err:
|
||||
amd_pmf_deinit_smart_pc(dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -621,11 +595,5 @@ void amd_pmf_deinit_smart_pc(struct amd_pmf_dev *dev)
|
||||
amd_pmf_remove_pb(dev);
|
||||
|
||||
cancel_delayed_work_sync(&dev->pb_work);
|
||||
kfree(dev->prev_data);
|
||||
dev->prev_data = NULL;
|
||||
kfree(dev->policy_buf);
|
||||
dev->policy_buf = NULL;
|
||||
kfree(dev->buf);
|
||||
dev->buf = NULL;
|
||||
amd_pmf_tee_deinit(dev);
|
||||
}
|
||||
|
||||
@@ -530,6 +530,15 @@ static const struct dmi_system_id asus_quirks[] = {
|
||||
},
|
||||
.driver_data = &quirk_asus_zenbook_duo_kbd,
|
||||
},
|
||||
{
|
||||
.callback = dmi_matched,
|
||||
.ident = "ASUS Zenbook Duo UX8406CA",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "UX8406CA"),
|
||||
},
|
||||
.driver_data = &quirk_asus_zenbook_duo_kbd,
|
||||
},
|
||||
{},
|
||||
};
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ static const struct dmi_system_id awcc_dmi_table[] __initconst = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Alienware"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Alienware m16 R1 AMD"),
|
||||
},
|
||||
.driver_data = &g_series_quirks,
|
||||
.driver_data = &generic_quirks,
|
||||
},
|
||||
{
|
||||
.ident = "Alienware m16 R2",
|
||||
|
||||
@@ -45,6 +45,7 @@ static const struct dmi_system_id lis3lv02d_devices[] __initconst = {
|
||||
* Additional individual entries were added after verification.
|
||||
*/
|
||||
DELL_LIS3LV02D_DMI_ENTRY("Latitude 5480", 0x29),
|
||||
DELL_LIS3LV02D_DMI_ENTRY("Latitude 5500", 0x29),
|
||||
DELL_LIS3LV02D_DMI_ENTRY("Latitude E6330", 0x29),
|
||||
DELL_LIS3LV02D_DMI_ENTRY("Latitude E6430", 0x29),
|
||||
DELL_LIS3LV02D_DMI_ENTRY("Precision 3540", 0x29),
|
||||
|
||||
@@ -89,6 +89,11 @@ extern struct wmi_sysman_priv wmi_priv;
|
||||
|
||||
enum { ENUM, INT, STR, PO };
|
||||
|
||||
#define ENUM_MIN_ELEMENTS 8
|
||||
#define INT_MIN_ELEMENTS 9
|
||||
#define STR_MIN_ELEMENTS 8
|
||||
#define PO_MIN_ELEMENTS 4
|
||||
|
||||
enum {
|
||||
ATTR_NAME,
|
||||
DISPL_NAME_LANG_CODE,
|
||||
|
||||
@@ -23,9 +23,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a
|
||||
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_ENUMERATION_ATTRIBUTE_GUID);
|
||||
if (!obj)
|
||||
return -EIO;
|
||||
if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
|
||||
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < ENUM_MIN_ELEMENTS ||
|
||||
obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
|
||||
kfree(obj);
|
||||
return -EINVAL;
|
||||
return -EIO;
|
||||
}
|
||||
ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer);
|
||||
kfree(obj);
|
||||
|
||||
@@ -25,9 +25,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a
|
||||
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_INTEGER_ATTRIBUTE_GUID);
|
||||
if (!obj)
|
||||
return -EIO;
|
||||
if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) {
|
||||
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < INT_MIN_ELEMENTS ||
|
||||
obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_INTEGER) {
|
||||
kfree(obj);
|
||||
return -EINVAL;
|
||||
return -EIO;
|
||||
}
|
||||
ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[CURRENT_VAL].integer.value);
|
||||
kfree(obj);
|
||||
|
||||
@@ -26,9 +26,10 @@ static ssize_t is_enabled_show(struct kobject *kobj, struct kobj_attribute *attr
|
||||
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_PASSOBJ_ATTRIBUTE_GUID);
|
||||
if (!obj)
|
||||
return -EIO;
|
||||
if (obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) {
|
||||
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < PO_MIN_ELEMENTS ||
|
||||
obj->package.elements[IS_PASS_SET].type != ACPI_TYPE_INTEGER) {
|
||||
kfree(obj);
|
||||
return -EINVAL;
|
||||
return -EIO;
|
||||
}
|
||||
ret = snprintf(buf, PAGE_SIZE, "%lld\n", obj->package.elements[IS_PASS_SET].integer.value);
|
||||
kfree(obj);
|
||||
|
||||
@@ -25,9 +25,10 @@ static ssize_t current_value_show(struct kobject *kobj, struct kobj_attribute *a
|
||||
obj = get_wmiobj_pointer(instance_id, DELL_WMI_BIOS_STRING_ATTRIBUTE_GUID);
|
||||
if (!obj)
|
||||
return -EIO;
|
||||
if (obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
|
||||
if (obj->type != ACPI_TYPE_PACKAGE || obj->package.count < STR_MIN_ELEMENTS ||
|
||||
obj->package.elements[CURRENT_VAL].type != ACPI_TYPE_STRING) {
|
||||
kfree(obj);
|
||||
return -EINVAL;
|
||||
return -EIO;
|
||||
}
|
||||
ret = snprintf(buf, PAGE_SIZE, "%s\n", obj->package.elements[CURRENT_VAL].string.pointer);
|
||||
kfree(obj);
|
||||
|
||||
@@ -407,10 +407,10 @@ static int init_bios_attributes(int attr_type, const char *guid)
|
||||
return retval;
|
||||
|
||||
switch (attr_type) {
|
||||
case ENUM: min_elements = 8; break;
|
||||
case INT: min_elements = 9; break;
|
||||
case STR: min_elements = 8; break;
|
||||
case PO: min_elements = 4; break;
|
||||
case ENUM: min_elements = ENUM_MIN_ELEMENTS; break;
|
||||
case INT: min_elements = INT_MIN_ELEMENTS; break;
|
||||
case STR: min_elements = STR_MIN_ELEMENTS; break;
|
||||
case PO: min_elements = PO_MIN_ELEMENTS; break;
|
||||
default:
|
||||
pr_err("Error: Unknown attr_type: %d\n", attr_type);
|
||||
return -EINVAL;
|
||||
@@ -597,7 +597,7 @@ err_release_attributes_data:
|
||||
release_attributes_data();
|
||||
|
||||
err_destroy_classdev:
|
||||
device_destroy(&firmware_attributes_class, MKDEV(0, 0));
|
||||
device_unregister(wmi_priv.class_dev);
|
||||
|
||||
err_exit_bios_attr_pass_interface:
|
||||
exit_bios_attr_pass_interface();
|
||||
@@ -611,7 +611,7 @@ err_exit_bios_attr_set_interface:
|
||||
static void __exit sysman_exit(void)
|
||||
{
|
||||
release_attributes_data();
|
||||
device_destroy(&firmware_attributes_class, MKDEV(0, 0));
|
||||
device_unregister(wmi_priv.class_dev);
|
||||
exit_bios_attr_set_interface();
|
||||
exit_bios_attr_pass_interface();
|
||||
}
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
MODULE_AUTHOR("Abhay Salunke <abhay_salunke@dell.com>");
|
||||
MODULE_DESCRIPTION("Driver for updating BIOS image on DELL systems");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_VERSION("3.2");
|
||||
MODULE_VERSION("3.3");
|
||||
|
||||
#define BIOS_SCAN_LIMIT 0xffffffff
|
||||
#define MAX_IMAGE_LENGTH 16
|
||||
@@ -91,7 +91,7 @@ static void init_packet_head(void)
|
||||
rbu_data.imagesize = 0;
|
||||
}
|
||||
|
||||
static int create_packet(void *data, size_t length)
|
||||
static int create_packet(void *data, size_t length) __must_hold(&rbu_data.lock)
|
||||
{
|
||||
struct packet_data *newpacket;
|
||||
int ordernum = 0;
|
||||
@@ -292,7 +292,7 @@ static int packet_read_list(char *data, size_t * pread_length)
|
||||
remaining_bytes = *pread_length;
|
||||
bytes_read = rbu_data.packet_read_count;
|
||||
|
||||
list_for_each_entry(newpacket, (&packet_data_head.list)->next, list) {
|
||||
list_for_each_entry(newpacket, &packet_data_head.list, list) {
|
||||
bytes_copied = do_packet_read(pdest, newpacket,
|
||||
remaining_bytes, bytes_read, &temp_count);
|
||||
remaining_bytes -= bytes_copied;
|
||||
@@ -315,14 +315,14 @@ static void packet_empty_list(void)
|
||||
{
|
||||
struct packet_data *newpacket, *tmp;
|
||||
|
||||
list_for_each_entry_safe(newpacket, tmp, (&packet_data_head.list)->next, list) {
|
||||
list_for_each_entry_safe(newpacket, tmp, &packet_data_head.list, list) {
|
||||
list_del(&newpacket->list);
|
||||
|
||||
/*
|
||||
* zero out the RBU packet memory before freeing
|
||||
* to make sure there are no stale RBU packets left in memory
|
||||
*/
|
||||
memset(newpacket->data, 0, rbu_data.packetsize);
|
||||
memset(newpacket->data, 0, newpacket->length);
|
||||
set_memory_wb((unsigned long)newpacket->data,
|
||||
1 << newpacket->ordernum);
|
||||
free_pages((unsigned long) newpacket->data,
|
||||
|
||||
@@ -1034,7 +1034,7 @@ err_release_attributes_data:
|
||||
release_attributes_data();
|
||||
|
||||
err_destroy_classdev:
|
||||
device_destroy(&firmware_attributes_class, MKDEV(0, 0));
|
||||
device_unregister(bioscfg_drv.class_dev);
|
||||
|
||||
err_unregister_class:
|
||||
hp_exit_attr_set_interface();
|
||||
@@ -1045,7 +1045,7 @@ err_unregister_class:
|
||||
static void __exit hp_exit(void)
|
||||
{
|
||||
release_attributes_data();
|
||||
device_destroy(&firmware_attributes_class, MKDEV(0, 0));
|
||||
device_unregister(bioscfg_drv.class_dev);
|
||||
|
||||
hp_exit_attr_set_interface();
|
||||
}
|
||||
|
||||
@@ -54,6 +54,7 @@ static const struct acpi_device_id intel_hid_ids[] = {
|
||||
{ "INTC107B" },
|
||||
{ "INTC10CB" },
|
||||
{ "INTC10CC" },
|
||||
{ "INTC10F1" },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, intel_hid_ids);
|
||||
|
||||
@@ -299,6 +299,13 @@ enum ppfear_regs {
|
||||
#define PTL_PCD_PMC_MMIO_REG_LEN 0x31A8
|
||||
|
||||
/* SSRAM PMC Device ID */
|
||||
/* LNL */
|
||||
#define PMC_DEVID_LNL_SOCM 0xa87f
|
||||
|
||||
/* PTL */
|
||||
#define PMC_DEVID_PTL_PCDH 0xe37f
|
||||
#define PMC_DEVID_PTL_PCDP 0xe47f
|
||||
|
||||
/* ARL */
|
||||
#define PMC_DEVID_ARL_SOCM 0x777f
|
||||
#define PMC_DEVID_ARL_SOCS 0xae7f
|
||||
|
||||
@@ -187,6 +187,9 @@ static const struct pci_device_id intel_pmc_ssram_telemetry_pci_ids[] = {
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PMC_DEVID_MTL_SOCM) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PMC_DEVID_ARL_SOCS) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PMC_DEVID_ARL_SOCM) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PMC_DEVID_LNL_SOCM) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PMC_DEVID_PTL_PCDH) },
|
||||
{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PMC_DEVID_PTL_PCDP) },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, intel_pmc_ssram_telemetry_pci_ids);
|
||||
|
||||
@@ -228,8 +228,10 @@ static int __init tpmi_init(void)
|
||||
|
||||
domain_die_map = kcalloc(size_mul(topology_max_packages(), MAX_POWER_DOMAINS),
|
||||
sizeof(*domain_die_map), GFP_KERNEL);
|
||||
if (!domain_die_map)
|
||||
if (!domain_die_map) {
|
||||
ret = -ENOMEM;
|
||||
goto free_domain_mask;
|
||||
}
|
||||
|
||||
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN,
|
||||
"platform/x86/tpmi_power_domains:online",
|
||||
|
||||
@@ -58,7 +58,7 @@ static ssize_t show_agent_types(struct kobject *kobj, struct kobj_attribute *att
|
||||
if (length)
|
||||
length += sysfs_emit_at(buf, length, " ");
|
||||
|
||||
length += sysfs_emit_at(buf, length, agent_name[agent]);
|
||||
length += sysfs_emit_at(buf, length, "%s", agent_name[agent]);
|
||||
}
|
||||
|
||||
length += sysfs_emit_at(buf, length, "\n");
|
||||
|
||||
@@ -511,10 +511,13 @@ static int uncore_probe(struct auxiliary_device *auxdev, const struct auxiliary_
|
||||
|
||||
/* Get the package ID from the TPMI core */
|
||||
plat_info = tpmi_get_platform_data(auxdev);
|
||||
if (plat_info)
|
||||
pkg = plat_info->package_id;
|
||||
else
|
||||
if (unlikely(!plat_info)) {
|
||||
dev_info(&auxdev->dev, "Platform information is NULL\n");
|
||||
ret = -ENODEV;
|
||||
goto err_rem_common;
|
||||
}
|
||||
|
||||
pkg = plat_info->package_id;
|
||||
|
||||
for (i = 0; i < num_resources; ++i) {
|
||||
struct tpmi_uncore_power_domain_info *pd_info;
|
||||
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <linux/bug.h>
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/i8042.h>
|
||||
@@ -270,6 +271,20 @@ static void ideapad_shared_exit(struct ideapad_private *priv)
|
||||
*/
|
||||
#define IDEAPAD_EC_TIMEOUT 200 /* in ms */
|
||||
|
||||
/*
|
||||
* Some models (e.g., ThinkBook since 2024) have a low tolerance for being
|
||||
* polled too frequently. Doing so may break the state machine in the EC,
|
||||
* resulting in a hard shutdown.
|
||||
*
|
||||
* It is also observed that frequent polls may disturb the ongoing operation
|
||||
* and notably delay the availability of EC response.
|
||||
*
|
||||
* These values are used as the delay before the first poll and the interval
|
||||
* between subsequent polls to solve the above issues.
|
||||
*/
|
||||
#define IDEAPAD_EC_POLL_MIN_US 150
|
||||
#define IDEAPAD_EC_POLL_MAX_US 300
|
||||
|
||||
static int eval_int(acpi_handle handle, const char *name, unsigned long *res)
|
||||
{
|
||||
unsigned long long result;
|
||||
@@ -386,7 +401,7 @@ static int read_ec_data(acpi_handle handle, unsigned long cmd, unsigned long *da
|
||||
end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1;
|
||||
|
||||
while (time_before(jiffies, end_jiffies)) {
|
||||
schedule();
|
||||
usleep_range(IDEAPAD_EC_POLL_MIN_US, IDEAPAD_EC_POLL_MAX_US);
|
||||
|
||||
err = eval_vpcr(handle, 1, &val);
|
||||
if (err)
|
||||
@@ -417,7 +432,7 @@ static int write_ec_cmd(acpi_handle handle, unsigned long cmd, unsigned long dat
|
||||
end_jiffies = jiffies + msecs_to_jiffies(IDEAPAD_EC_TIMEOUT) + 1;
|
||||
|
||||
while (time_before(jiffies, end_jiffies)) {
|
||||
schedule();
|
||||
usleep_range(IDEAPAD_EC_POLL_MIN_US, IDEAPAD_EC_POLL_MAX_US);
|
||||
|
||||
err = eval_vpcr(handle, 1, &val);
|
||||
if (err)
|
||||
|
||||
@@ -975,6 +975,7 @@ static const struct attribute_group auth_attr_group = {
|
||||
.is_visible = auth_attr_is_visible,
|
||||
.attrs = auth_attrs,
|
||||
};
|
||||
__ATTRIBUTE_GROUPS(auth_attr);
|
||||
|
||||
/* ---- Attributes sysfs --------------------------------------------------------- */
|
||||
static ssize_t display_name_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
@@ -1190,6 +1191,7 @@ static const struct attribute_group tlmi_attr_group = {
|
||||
.is_visible = attr_is_visible,
|
||||
.attrs = tlmi_attrs,
|
||||
};
|
||||
__ATTRIBUTE_GROUPS(tlmi_attr);
|
||||
|
||||
static void tlmi_attr_setting_release(struct kobject *kobj)
|
||||
{
|
||||
@@ -1209,11 +1211,13 @@ static void tlmi_pwd_setting_release(struct kobject *kobj)
|
||||
static const struct kobj_type tlmi_attr_setting_ktype = {
|
||||
.release = &tlmi_attr_setting_release,
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.default_groups = tlmi_attr_groups,
|
||||
};
|
||||
|
||||
static const struct kobj_type tlmi_pwd_setting_ktype = {
|
||||
.release = &tlmi_pwd_setting_release,
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.default_groups = auth_attr_groups,
|
||||
};
|
||||
|
||||
static ssize_t pending_reboot_show(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
@@ -1382,21 +1386,18 @@ static struct kobj_attribute debug_cmd = __ATTR_WO(debug_cmd);
|
||||
/* ---- Initialisation --------------------------------------------------------- */
|
||||
static void tlmi_release_attr(void)
|
||||
{
|
||||
int i;
|
||||
struct kobject *pos, *n;
|
||||
|
||||
/* Attribute structures */
|
||||
for (i = 0; i < TLMI_SETTINGS_COUNT; i++) {
|
||||
if (tlmi_priv.setting[i]) {
|
||||
sysfs_remove_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group);
|
||||
kobject_put(&tlmi_priv.setting[i]->kobj);
|
||||
}
|
||||
}
|
||||
sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &pending_reboot.attr);
|
||||
sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &save_settings.attr);
|
||||
|
||||
if (tlmi_priv.can_debug_cmd && debug_support)
|
||||
sysfs_remove_file(&tlmi_priv.attribute_kset->kobj, &debug_cmd.attr);
|
||||
|
||||
list_for_each_entry_safe(pos, n, &tlmi_priv.attribute_kset->list, entry)
|
||||
kobject_put(pos);
|
||||
|
||||
kset_unregister(tlmi_priv.attribute_kset);
|
||||
|
||||
/* Free up any saved signatures */
|
||||
@@ -1404,19 +1405,8 @@ static void tlmi_release_attr(void)
|
||||
kfree(tlmi_priv.pwd_admin->save_signature);
|
||||
|
||||
/* Authentication structures */
|
||||
sysfs_remove_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group);
|
||||
kobject_put(&tlmi_priv.pwd_admin->kobj);
|
||||
sysfs_remove_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group);
|
||||
kobject_put(&tlmi_priv.pwd_power->kobj);
|
||||
|
||||
if (tlmi_priv.opcode_support) {
|
||||
sysfs_remove_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group);
|
||||
kobject_put(&tlmi_priv.pwd_system->kobj);
|
||||
sysfs_remove_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group);
|
||||
kobject_put(&tlmi_priv.pwd_hdd->kobj);
|
||||
sysfs_remove_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group);
|
||||
kobject_put(&tlmi_priv.pwd_nvme->kobj);
|
||||
}
|
||||
list_for_each_entry_safe(pos, n, &tlmi_priv.authentication_kset->list, entry)
|
||||
kobject_put(pos);
|
||||
|
||||
kset_unregister(tlmi_priv.authentication_kset);
|
||||
}
|
||||
@@ -1457,6 +1447,14 @@ static int tlmi_sysfs_init(void)
|
||||
goto fail_device_created;
|
||||
}
|
||||
|
||||
tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL,
|
||||
&tlmi_priv.class_dev->kobj);
|
||||
if (!tlmi_priv.authentication_kset) {
|
||||
kset_unregister(tlmi_priv.attribute_kset);
|
||||
ret = -ENOMEM;
|
||||
goto fail_device_created;
|
||||
}
|
||||
|
||||
for (i = 0; i < TLMI_SETTINGS_COUNT; i++) {
|
||||
/* Check if index is a valid setting - skip if it isn't */
|
||||
if (!tlmi_priv.setting[i])
|
||||
@@ -1473,12 +1471,8 @@ static int tlmi_sysfs_init(void)
|
||||
|
||||
/* Build attribute */
|
||||
tlmi_priv.setting[i]->kobj.kset = tlmi_priv.attribute_kset;
|
||||
ret = kobject_add(&tlmi_priv.setting[i]->kobj, NULL,
|
||||
"%s", tlmi_priv.setting[i]->display_name);
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
ret = sysfs_create_group(&tlmi_priv.setting[i]->kobj, &tlmi_attr_group);
|
||||
ret = kobject_init_and_add(&tlmi_priv.setting[i]->kobj, &tlmi_attr_setting_ktype,
|
||||
NULL, "%s", tlmi_priv.setting[i]->display_name);
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
}
|
||||
@@ -1498,55 +1492,34 @@ static int tlmi_sysfs_init(void)
|
||||
}
|
||||
|
||||
/* Create authentication entries */
|
||||
tlmi_priv.authentication_kset = kset_create_and_add("authentication", NULL,
|
||||
&tlmi_priv.class_dev->kobj);
|
||||
if (!tlmi_priv.authentication_kset) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_create_attr;
|
||||
}
|
||||
tlmi_priv.pwd_admin->kobj.kset = tlmi_priv.authentication_kset;
|
||||
ret = kobject_add(&tlmi_priv.pwd_admin->kobj, NULL, "%s", "Admin");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
ret = sysfs_create_group(&tlmi_priv.pwd_admin->kobj, &auth_attr_group);
|
||||
ret = kobject_init_and_add(&tlmi_priv.pwd_admin->kobj, &tlmi_pwd_setting_ktype,
|
||||
NULL, "%s", "Admin");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
tlmi_priv.pwd_power->kobj.kset = tlmi_priv.authentication_kset;
|
||||
ret = kobject_add(&tlmi_priv.pwd_power->kobj, NULL, "%s", "Power-on");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
ret = sysfs_create_group(&tlmi_priv.pwd_power->kobj, &auth_attr_group);
|
||||
ret = kobject_init_and_add(&tlmi_priv.pwd_power->kobj, &tlmi_pwd_setting_ktype,
|
||||
NULL, "%s", "Power-on");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
if (tlmi_priv.opcode_support) {
|
||||
tlmi_priv.pwd_system->kobj.kset = tlmi_priv.authentication_kset;
|
||||
ret = kobject_add(&tlmi_priv.pwd_system->kobj, NULL, "%s", "System");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
ret = sysfs_create_group(&tlmi_priv.pwd_system->kobj, &auth_attr_group);
|
||||
ret = kobject_init_and_add(&tlmi_priv.pwd_system->kobj, &tlmi_pwd_setting_ktype,
|
||||
NULL, "%s", "System");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
tlmi_priv.pwd_hdd->kobj.kset = tlmi_priv.authentication_kset;
|
||||
ret = kobject_add(&tlmi_priv.pwd_hdd->kobj, NULL, "%s", "HDD");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
ret = sysfs_create_group(&tlmi_priv.pwd_hdd->kobj, &auth_attr_group);
|
||||
ret = kobject_init_and_add(&tlmi_priv.pwd_hdd->kobj, &tlmi_pwd_setting_ktype,
|
||||
NULL, "%s", "HDD");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
tlmi_priv.pwd_nvme->kobj.kset = tlmi_priv.authentication_kset;
|
||||
ret = kobject_add(&tlmi_priv.pwd_nvme->kobj, NULL, "%s", "NVMe");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
|
||||
ret = sysfs_create_group(&tlmi_priv.pwd_nvme->kobj, &auth_attr_group);
|
||||
ret = kobject_init_and_add(&tlmi_priv.pwd_nvme->kobj, &tlmi_pwd_setting_ktype,
|
||||
NULL, "%s", "NVMe");
|
||||
if (ret)
|
||||
goto fail_create_attr;
|
||||
}
|
||||
@@ -1556,7 +1529,7 @@ static int tlmi_sysfs_init(void)
|
||||
fail_create_attr:
|
||||
tlmi_release_attr();
|
||||
fail_device_created:
|
||||
device_destroy(&firmware_attributes_class, MKDEV(0, 0));
|
||||
device_unregister(tlmi_priv.class_dev);
|
||||
fail_class_created:
|
||||
return ret;
|
||||
}
|
||||
@@ -1579,8 +1552,6 @@ static struct tlmi_pwd_setting *tlmi_create_auth(const char *pwd_type,
|
||||
new_pwd->maxlen = tlmi_priv.pwdcfg.core.max_length;
|
||||
new_pwd->index = 0;
|
||||
|
||||
kobject_init(&new_pwd->kobj, &tlmi_pwd_setting_ktype);
|
||||
|
||||
return new_pwd;
|
||||
}
|
||||
|
||||
@@ -1685,7 +1656,6 @@ static int tlmi_analyze(struct wmi_device *wdev)
|
||||
if (setting->possible_values)
|
||||
strreplace(setting->possible_values, ',', ';');
|
||||
|
||||
kobject_init(&setting->kobj, &tlmi_attr_setting_ktype);
|
||||
tlmi_priv.setting[i] = setting;
|
||||
kfree(item);
|
||||
}
|
||||
@@ -1783,7 +1753,7 @@ fail_clear_attr:
|
||||
static void tlmi_remove(struct wmi_device *wdev)
|
||||
{
|
||||
tlmi_release_attr();
|
||||
device_destroy(&firmware_attributes_class, MKDEV(0, 0));
|
||||
device_unregister(tlmi_priv.class_dev);
|
||||
}
|
||||
|
||||
static int tlmi_probe(struct wmi_device *wdev, const void *context)
|
||||
|
||||
@@ -3295,6 +3295,7 @@ static const struct key_entry keymap_lenovo[] __initconst = {
|
||||
*/
|
||||
{ KE_KEY, 0x131d, { KEY_VENDOR } }, /* System debug info, similar to old ThinkPad key */
|
||||
{ KE_KEY, 0x1320, { KEY_LINK_PHONE } },
|
||||
{ KE_KEY, 0x1402, { KEY_LINK_PHONE } },
|
||||
{ KE_KEY, TP_HKEY_EV_TRACK_DOUBLETAP /* 0x8036 */, { KEY_PROG4 } },
|
||||
{ KE_END }
|
||||
};
|
||||
|
||||
@@ -236,6 +236,7 @@ static int pwec_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ec_wdt_dev.parent = &pdev->dev;
|
||||
ret = devm_watchdog_register_device(&pdev->dev, &ec_wdt_dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "failed to register Portwell EC Watchdog\n");
|
||||
|
||||
@@ -1403,6 +1403,7 @@ static int galaxybook_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
static const struct acpi_device_id galaxybook_device_ids[] = {
|
||||
{ "SAM0426" },
|
||||
{ "SAM0427" },
|
||||
{ "SAM0428" },
|
||||
{ "SAM0429" },
|
||||
|
||||
@@ -180,16 +180,22 @@ static int wmi_device_enable(struct wmi_device *wdev, bool enable)
|
||||
acpi_handle handle;
|
||||
acpi_status status;
|
||||
|
||||
if (!(wblock->gblock.flags & ACPI_WMI_EXPENSIVE))
|
||||
return 0;
|
||||
|
||||
if (wblock->dev.dev.type == &wmi_type_method)
|
||||
return 0;
|
||||
|
||||
if (wblock->dev.dev.type == &wmi_type_event)
|
||||
if (wblock->dev.dev.type == &wmi_type_event) {
|
||||
/*
|
||||
* Windows always enables/disables WMI events, even when they are
|
||||
* not marked as being expensive. We follow this behavior for
|
||||
* compatibility reasons.
|
||||
*/
|
||||
snprintf(method, sizeof(method), "WE%02X", wblock->gblock.notify_id);
|
||||
else
|
||||
} else {
|
||||
if (!(wblock->gblock.flags & ACPI_WMI_EXPENSIVE))
|
||||
return 0;
|
||||
|
||||
get_acpi_method_name(wblock, 'C', method);
|
||||
}
|
||||
|
||||
/*
|
||||
* Not all WMI devices marked as expensive actually implement the
|
||||
|
||||
Reference in New Issue
Block a user