mirror of
https://github.com/armbian/linux-cix.git
synced 2026-01-06 12:30:45 -08:00
Merge tag 'platform-drivers-x86-v5.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86
Pull x86 platform driver updates from Hans de Goede:
"Highlights:
- New think-lmi driver adding support for changing Lenovo Thinkpad
BIOS settings from within Linux using the standard firmware-
attributes class sysfs API
- MS Surface aggregator-cdev now also supports forwarding events to
user-space (for debugging / new driver development purposes only)
- New intel_skl_int3472 driver this provides the necessary glue to
translate ACPI table information to GPIOs, regulators, etc. for
camera sensors on Intel devices with IPU3 attached MIPI cameras
- A whole bunch of other fixes + device-specific quirk additions
- New devm_work_autocancel() devm-helpers.h function"
* tag 'platform-drivers-x86-v5.14-1' of git://git.kernel.org/pub/scm/linux/kernel/git/pdx86/platform-drivers-x86: (83 commits)
platform/x86: dell-wmi-sysman: Change user experience when Admin/System Password is modified
platform/x86: intel_skl_int3472: Uninitialized variable in skl_int3472_handle_gpio_resources()
platform/x86: think-lmi: Move kfree(setting->possible_values) to tlmi_attr_setting_release()
platform/x86: think-lmi: Split current_value to reflect only the value
platform/x86: think-lmi: Fix issues with duplicate attributes
platform/x86: think-lmi: Return EINVAL when kbdlang gets set to a 0 length string
platform/x86: intel_cht_int33fe: Move to its own subfolder
platform/x86: intel_skl_int3472: Move to intel/ subfolder
platform/x86: intel_skl_int3472: Provide skl_int3472_unregister_clock()
platform/x86: intel_skl_int3472: Provide skl_int3472_unregister_regulator()
platform/x86: intel_skl_int3472: Use ACPI GPIO resource directly
platform/x86: intel_skl_int3472: Fix dependencies (drop CLKDEV_LOOKUP)
platform/x86: intel_skl_int3472: Free ACPI device resources after use
platform/x86: Remove "default n" entries
platform/x86: ISST: Use numa node id for cpu pci dev mapping
platform/x86: ISST: Optimize CPU to PCI device mapping
tools/power/x86/intel-speed-select: v1.10 release
tools/power/x86/intel-speed-select: Fix uncore memory frequency display
extcon: extcon-max8997: Simplify driver using devm
extcon: extcon-max8997: Fix IRQ freeing at error path
...
This commit is contained in:
@@ -197,8 +197,24 @@ Description:
|
||||
Drivers may emit a CHANGE uevent when a password is set or unset
|
||||
userspace may check it again.
|
||||
|
||||
On Dell systems, if Admin password is set, then all BIOS attributes
|
||||
On Dell and Lenovo systems, if Admin password is set, then all BIOS attributes
|
||||
require password validation.
|
||||
On Lenovo systems if you change the Admin password the new password is not active until
|
||||
the next boot.
|
||||
|
||||
Lenovo specific class extensions
|
||||
------------------------------
|
||||
|
||||
On Lenovo systems the following additional settings are available:
|
||||
|
||||
lenovo_encoding:
|
||||
The encoding method that is used. This can be either "ascii"
|
||||
or "scancode". Default is set to "ascii"
|
||||
|
||||
lenovo_kbdlang:
|
||||
The keyboard language method that is used. This is generally a
|
||||
two char code (e.g. "us", "fr", "gr") and may vary per platform.
|
||||
Default is set to "us"
|
||||
|
||||
What: /sys/class/firmware-attributes/*/attributes/pending_reboot
|
||||
Date: February 2021
|
||||
|
||||
55
Documentation/ABI/testing/sysfs-platform-dell-privacy-wmi
Normal file
55
Documentation/ABI/testing/sysfs-platform-dell-privacy-wmi
Normal file
@@ -0,0 +1,55 @@
|
||||
What: /sys/bus/wmi/devices/6932965F-1671-4CEB-B988-D3AB0A901919/dell_privacy_supported_type
|
||||
Date: Apr 2021
|
||||
KernelVersion: 5.13
|
||||
Contact: "perry.yuan@dell.com>"
|
||||
Description:
|
||||
Display which dell hardware level privacy devices are supported
|
||||
“Dell Privacy” is a set of HW, FW, and SW features to enhance
|
||||
Dell’s commitment to platform privacy for MIC, Camera, and
|
||||
ePrivacy screens.
|
||||
The supported hardware privacy devices are:
|
||||
Attributes:
|
||||
Microphone Mute:
|
||||
Identifies the local microphone can be muted by hardware, no applications
|
||||
is available to capture system mic sound
|
||||
|
||||
Camera Shutter:
|
||||
Identifies camera shutter controlled by hardware, which is a micromechanical
|
||||
shutter assembly that is built onto the camera module to block capturing images
|
||||
from outside the laptop
|
||||
|
||||
supported:
|
||||
The privacy device is supported by this system
|
||||
|
||||
unsupported:
|
||||
The privacy device is not supported on this system
|
||||
|
||||
For example to check which privacy devices are supported:
|
||||
|
||||
# cat /sys/bus/wmi/drivers/dell-privacy/6932965F-1671-4CEB-B988-D3AB0A901919/dell_privacy_supported_type
|
||||
[Microphone Mute] [supported]
|
||||
[Camera Shutter] [supported]
|
||||
[ePrivacy Screen] [unsupported]
|
||||
|
||||
What: /sys/bus/wmi/devices/6932965F-1671-4CEB-B988-D3AB0A901919/dell_privacy_current_state
|
||||
Date: Apr 2021
|
||||
KernelVersion: 5.13
|
||||
Contact: "perry.yuan@dell.com>"
|
||||
Description:
|
||||
Allow user space to check current dell privacy device state.
|
||||
Describes the Device State class exposed by BIOS which can be
|
||||
consumed by various applications interested in knowing the Privacy
|
||||
feature capabilities
|
||||
Attributes:
|
||||
muted:
|
||||
Identifies the privacy device is turned off and cannot send stream to OS applications
|
||||
|
||||
unmuted:
|
||||
Identifies the privacy device is turned on ,audio or camera driver can get
|
||||
stream from mic and camera module to OS applications
|
||||
|
||||
For example to check all supported current privacy device states:
|
||||
|
||||
# cat /sys/bus/wmi/drivers/dell-privacy/6932965F-1671-4CEB-B988-D3AB0A901919/dell_privacy_current_state
|
||||
[Microphone] [unmuted]
|
||||
[Camera Shutter] [unmuted]
|
||||
@@ -1,9 +1,8 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
.. |u8| replace:: :c:type:`u8 <u8>`
|
||||
.. |u16| replace:: :c:type:`u16 <u16>`
|
||||
.. |ssam_cdev_request| replace:: :c:type:`struct ssam_cdev_request <ssam_cdev_request>`
|
||||
.. |ssam_cdev_request_flags| replace:: :c:type:`enum ssam_cdev_request_flags <ssam_cdev_request_flags>`
|
||||
.. |ssam_cdev_event| replace:: :c:type:`struct ssam_cdev_event <ssam_cdev_event>`
|
||||
|
||||
==============================
|
||||
User-Space EC Interface (cdev)
|
||||
@@ -23,6 +22,40 @@ These IOCTLs and their respective input/output parameter structs are defined in
|
||||
A small python library and scripts for accessing this interface can be found
|
||||
at https://github.com/linux-surface/surface-aggregator-module/tree/master/scripts/ssam.
|
||||
|
||||
.. contents::
|
||||
|
||||
|
||||
Receiving Events
|
||||
================
|
||||
|
||||
Events can be received by reading from the device-file. The are represented by
|
||||
the |ssam_cdev_event| datatype.
|
||||
|
||||
Before events are available to be read, however, the desired notifiers must be
|
||||
registered via the ``SSAM_CDEV_NOTIF_REGISTER`` IOCTL. Notifiers are, in
|
||||
essence, callbacks, called when the EC sends an event. They are, in this
|
||||
interface, associated with a specific target category and device-file-instance.
|
||||
They forward any event of this category to the buffer of the corresponding
|
||||
instance, from which it can then be read.
|
||||
|
||||
Notifiers themselves do not enable events on the EC. Thus, it may additionally
|
||||
be necessary to enable events via the ``SSAM_CDEV_EVENT_ENABLE`` IOCTL. While
|
||||
notifiers work per-client (i.e. per-device-file-instance), events are enabled
|
||||
globally, for the EC and all of its clients (regardless of userspace or
|
||||
non-userspace). The ``SSAM_CDEV_EVENT_ENABLE`` and ``SSAM_CDEV_EVENT_DISABLE``
|
||||
IOCTLs take care of reference counting the events, such that an event is
|
||||
enabled as long as there is a client that has requested it.
|
||||
|
||||
Note that enabled events are not automatically disabled once the client
|
||||
instance is closed. Therefore any client process (or group of processes) should
|
||||
balance their event enable calls with the corresponding event disable calls. It
|
||||
is, however, perfectly valid to enable and disable events on different client
|
||||
instances. For example, it is valid to set up notifiers and read events on
|
||||
client instance ``A``, enable those events on instance ``B`` (note that these
|
||||
will also be received by A since events are enabled/disabled globally), and
|
||||
after no more events are desired, disable the previously enabled events via
|
||||
instance ``C``.
|
||||
|
||||
|
||||
Controller IOCTLs
|
||||
=================
|
||||
@@ -45,9 +78,33 @@ The following IOCTLs are provided:
|
||||
- ``REQUEST``
|
||||
- Perform synchronous SAM request.
|
||||
|
||||
* - ``0xA5``
|
||||
- ``2``
|
||||
- ``W``
|
||||
- ``NOTIF_REGISTER``
|
||||
- Register event notifier.
|
||||
|
||||
``REQUEST``
|
||||
-----------
|
||||
* - ``0xA5``
|
||||
- ``3``
|
||||
- ``W``
|
||||
- ``NOTIF_UNREGISTER``
|
||||
- Unregister event notifier.
|
||||
|
||||
* - ``0xA5``
|
||||
- ``4``
|
||||
- ``W``
|
||||
- ``EVENT_ENABLE``
|
||||
- Enable event source.
|
||||
|
||||
* - ``0xA5``
|
||||
- ``5``
|
||||
- ``W``
|
||||
- ``EVENT_DISABLE``
|
||||
- Disable event source.
|
||||
|
||||
|
||||
``SSAM_CDEV_REQUEST``
|
||||
---------------------
|
||||
|
||||
Defined as ``_IOWR(0xA5, 1, struct ssam_cdev_request)``.
|
||||
|
||||
@@ -82,6 +139,66 @@ submitted, and completed (i.e. handed back to user-space) successfully from
|
||||
inside the IOCTL, but the request ``status`` member may still be negative in
|
||||
case the actual execution of the request failed after it has been submitted.
|
||||
|
||||
A full definition of the argument struct is provided below:
|
||||
A full definition of the argument struct is provided below.
|
||||
|
||||
``SSAM_CDEV_NOTIF_REGISTER``
|
||||
----------------------------
|
||||
|
||||
Defined as ``_IOW(0xA5, 2, struct ssam_cdev_notifier_desc)``.
|
||||
|
||||
Register a notifier for the event target category specified in the given
|
||||
notifier description with the specified priority. Notifiers registration is
|
||||
required to receive events, but does not enable events themselves. After a
|
||||
notifier for a specific target category has been registered, all events of that
|
||||
category will be forwarded to the userspace client and can then be read from
|
||||
the device file instance. Note that events may have to be enabled, e.g. via the
|
||||
``SSAM_CDEV_EVENT_ENABLE`` IOCTL, before the EC will send them.
|
||||
|
||||
Only one notifier can be registered per target category and client instance. If
|
||||
a notifier has already been registered, this IOCTL will fail with ``-EEXIST``.
|
||||
|
||||
Notifiers will automatically be removed when the device file instance is
|
||||
closed.
|
||||
|
||||
``SSAM_CDEV_NOTIF_UNREGISTER``
|
||||
------------------------------
|
||||
|
||||
Defined as ``_IOW(0xA5, 3, struct ssam_cdev_notifier_desc)``.
|
||||
|
||||
Unregisters the notifier associated with the specified target category. The
|
||||
priority field will be ignored by this IOCTL. If no notifier has been
|
||||
registered for this client instance and the given category, this IOCTL will
|
||||
fail with ``-ENOENT``.
|
||||
|
||||
``SSAM_CDEV_EVENT_ENABLE``
|
||||
--------------------------
|
||||
|
||||
Defined as ``_IOW(0xA5, 4, struct ssam_cdev_event_desc)``.
|
||||
|
||||
Enable the event associated with the given event descriptor.
|
||||
|
||||
Note that this call will not register a notifier itself, it will only enable
|
||||
events on the controller. If you want to receive events by reading from the
|
||||
device file, you will need to register the corresponding notifier(s) on that
|
||||
instance.
|
||||
|
||||
Events are not automatically disabled when the device file is closed. This must
|
||||
be done manually, via a call to the ``SSAM_CDEV_EVENT_DISABLE`` IOCTL.
|
||||
|
||||
``SSAM_CDEV_EVENT_DISABLE``
|
||||
---------------------------
|
||||
|
||||
Defined as ``_IOW(0xA5, 5, struct ssam_cdev_event_desc)``.
|
||||
|
||||
Disable the event associated with the given event descriptor.
|
||||
|
||||
Note that this will not unregister any notifiers. Events may still be received
|
||||
and forwarded to user-space after this call. The only safe way of stopping
|
||||
events from being received is unregistering all previously registered
|
||||
notifiers.
|
||||
|
||||
|
||||
Structures and Enums
|
||||
====================
|
||||
|
||||
.. kernel-doc:: include/uapi/linux/surface_aggregator/cdev.h
|
||||
|
||||
@@ -325,7 +325,7 @@ Code Seq# Include File Comments
|
||||
0xA3 90-9F linux/dtlk.h
|
||||
0xA4 00-1F uapi/linux/tee.h Generic TEE subsystem
|
||||
0xA4 00-1F uapi/asm/sgx.h <mailto:linux-sgx@vger.kernel.org>
|
||||
0xA5 01 linux/surface_aggregator/cdev.h Microsoft Surface Platform System Aggregator
|
||||
0xA5 01-05 linux/surface_aggregator/cdev.h Microsoft Surface Platform System Aggregator
|
||||
<mailto:luzmaximilian@gmail.com>
|
||||
0xA5 20-2F linux/surface_aggregator/dtx.h Microsoft Surface DTX driver
|
||||
<mailto:luzmaximilian@gmail.com>
|
||||
|
||||
25
MAINTAINERS
25
MAINTAINERS
@@ -5187,7 +5187,14 @@ DELL WMI NOTIFICATIONS DRIVER
|
||||
M: Matthew Garrett <mjg59@srcf.ucam.org>
|
||||
M: Pali Rohár <pali@kernel.org>
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell/dell-wmi.c
|
||||
F: drivers/platform/x86/dell/dell-wmi-base.c
|
||||
|
||||
DELL WMI HARDWARE PRIVACY SUPPORT
|
||||
M: Perry Yuan <Perry.Yuan@dell.com>
|
||||
L: Dell.Client.Kernel@dell.com
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/dell/dell-wmi-privacy.c
|
||||
|
||||
DELTA ST MEDIA DRIVER
|
||||
M: Hugues Fruchet <hugues.fruchet@foss.st.com>
|
||||
@@ -9397,6 +9404,11 @@ S: Maintained
|
||||
F: arch/x86/include/asm/intel_scu_ipc.h
|
||||
F: drivers/platform/x86/intel_scu_*
|
||||
|
||||
INTEL SKYLAKE INT3472 ACPI DEVICE DRIVER
|
||||
M: Daniel Scally <djrscally@gmail.com>
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/intel/int3472/
|
||||
|
||||
INTEL SPEED SELECT TECHNOLOGY
|
||||
M: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
@@ -9417,7 +9429,7 @@ F: include/linux/firmware/intel/stratix10-smc.h
|
||||
F: include/linux/firmware/intel/stratix10-svc-client.h
|
||||
|
||||
INTEL TELEMETRY DRIVER
|
||||
M: Rajneesh Bhardwaj <rajneesh.bhardwaj@linux.intel.com>
|
||||
M: Rajneesh Bhardwaj <irenic.rajneesh@gmail.com>
|
||||
M: "David E. Box" <david.e.box@linux.intel.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
@@ -12209,7 +12221,7 @@ M: Maximilian Luz <luzmaximilian@gmail.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
W: https://github.com/linux-surface/surface-aggregator-module
|
||||
C: irc://chat.freenode.net/##linux-surface
|
||||
C: irc://irc.libera.chat/linux-surface
|
||||
F: Documentation/driver-api/surface_aggregator/
|
||||
F: drivers/platform/surface/aggregator/
|
||||
F: drivers/platform/surface/surface_acpi_notify.c
|
||||
@@ -18215,6 +18227,13 @@ W: http://thinkwiki.org/wiki/Ibm-acpi
|
||||
T: git git://repo.or.cz/linux-2.6/linux-acpi-2.6/ibm-acpi-2.6.git
|
||||
F: drivers/platform/x86/thinkpad_acpi.c
|
||||
|
||||
THINKPAD LMI DRIVER
|
||||
M: Mark Pearson <markpearson@lenovo.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/ABI/testing/sysfs-class-firmware-attributes
|
||||
F: drivers/platform/x86/think-lmi.?
|
||||
|
||||
THUNDERBOLT DMA TRAFFIC TEST DRIVER
|
||||
M: Isaac Hazan <isaac.hazan@intel.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
|
||||
@@ -52,7 +52,7 @@ endif # PMIC_OPREGION
|
||||
|
||||
config TPS68470_PMIC_OPREGION
|
||||
bool "ACPI operation region support for TPS68470 PMIC"
|
||||
depends on MFD_TPS68470
|
||||
depends on INTEL_SKL_INT3472
|
||||
help
|
||||
This config adds ACPI operation region support for TI TPS68470 PMIC.
|
||||
TPS68470 device is an advanced power management unit that powers
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
// Chanwoo Choi <cw00.choi@samsung.com>
|
||||
// Krzysztof Kozlowski <krzk@kernel.org>
|
||||
|
||||
#include <linux/devm-helpers.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
@@ -673,7 +674,10 @@ static int max14577_muic_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, info);
|
||||
mutex_init(&info->mutex);
|
||||
|
||||
INIT_WORK(&info->irq_work, max14577_muic_irq_work);
|
||||
ret = devm_work_autocancel(&pdev->dev, &info->irq_work,
|
||||
max14577_muic_irq_work);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
switch (max14577->dev_type) {
|
||||
case MAXIM_DEVICE_TYPE_MAX77836:
|
||||
@@ -766,15 +770,6 @@ static int max14577_muic_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int max14577_muic_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct max14577_muic_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
cancel_work_sync(&info->irq_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct platform_device_id max14577_muic_id[] = {
|
||||
{ "max14577-muic", MAXIM_DEVICE_TYPE_MAX14577, },
|
||||
{ "max77836-muic", MAXIM_DEVICE_TYPE_MAX77836, },
|
||||
@@ -797,7 +792,6 @@ static struct platform_driver max14577_muic_driver = {
|
||||
.of_match_table = of_max14577_muic_dt_match,
|
||||
},
|
||||
.probe = max14577_muic_probe,
|
||||
.remove = max14577_muic_remove,
|
||||
.id_table = max14577_muic_id,
|
||||
};
|
||||
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
// Copyright (C) 2012 Samsung Electrnoics
|
||||
// Chanwoo Choi <cw00.choi@samsung.com>
|
||||
|
||||
#include <linux/devm-helpers.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
@@ -1127,7 +1128,10 @@ static int max77693_muic_probe(struct platform_device *pdev)
|
||||
platform_set_drvdata(pdev, info);
|
||||
mutex_init(&info->mutex);
|
||||
|
||||
INIT_WORK(&info->irq_work, max77693_muic_irq_work);
|
||||
ret = devm_work_autocancel(&pdev->dev, &info->irq_work,
|
||||
max77693_muic_irq_work);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Support irq domain for MAX77693 MUIC device */
|
||||
for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
|
||||
@@ -1254,22 +1258,11 @@ static int max77693_muic_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int max77693_muic_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct max77693_muic_info *info = platform_get_drvdata(pdev);
|
||||
|
||||
cancel_work_sync(&info->irq_work);
|
||||
input_unregister_device(info->dock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver max77693_muic_driver = {
|
||||
.driver = {
|
||||
.name = DEV_NAME,
|
||||
},
|
||||
.probe = max77693_muic_probe,
|
||||
.remove = max77693_muic_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(max77693_muic_driver);
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
// Copyright (C) 2012 Samsung Electronics
|
||||
// Donggeun Kim <dg77.kim@samsung.com>
|
||||
|
||||
#include <linux/devm-helpers.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/i2c.h>
|
||||
@@ -650,27 +651,30 @@ static int max8997_muic_probe(struct platform_device *pdev)
|
||||
mutex_init(&info->mutex);
|
||||
|
||||
INIT_WORK(&info->irq_work, max8997_muic_irq_work);
|
||||
ret = devm_work_autocancel(&pdev->dev, &info->irq_work,
|
||||
max8997_muic_irq_work);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(muic_irqs); i++) {
|
||||
struct max8997_muic_irq *muic_irq = &muic_irqs[i];
|
||||
unsigned int virq = 0;
|
||||
|
||||
virq = irq_create_mapping(max8997->irq_domain, muic_irq->irq);
|
||||
if (!virq) {
|
||||
ret = -EINVAL;
|
||||
goto err_irq;
|
||||
}
|
||||
if (!virq)
|
||||
return -EINVAL;
|
||||
|
||||
muic_irq->virq = virq;
|
||||
|
||||
ret = request_threaded_irq(virq, NULL,
|
||||
max8997_muic_irq_handler,
|
||||
IRQF_NO_SUSPEND,
|
||||
muic_irq->name, info);
|
||||
ret = devm_request_threaded_irq(&pdev->dev, virq, NULL,
|
||||
max8997_muic_irq_handler,
|
||||
IRQF_NO_SUSPEND,
|
||||
muic_irq->name, info);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev,
|
||||
"failed: irq request (IRQ: %d, error :%d)\n",
|
||||
muic_irq->irq, ret);
|
||||
goto err_irq;
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -678,14 +682,13 @@ static int max8997_muic_probe(struct platform_device *pdev)
|
||||
info->edev = devm_extcon_dev_allocate(&pdev->dev, max8997_extcon_cable);
|
||||
if (IS_ERR(info->edev)) {
|
||||
dev_err(&pdev->dev, "failed to allocate memory for extcon\n");
|
||||
ret = PTR_ERR(info->edev);
|
||||
goto err_irq;
|
||||
return PTR_ERR(info->edev);
|
||||
}
|
||||
|
||||
ret = devm_extcon_dev_register(&pdev->dev, info->edev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to register extcon device\n");
|
||||
goto err_irq;
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (pdata && pdata->muic_pdata) {
|
||||
@@ -756,23 +759,6 @@ static int max8997_muic_probe(struct platform_device *pdev)
|
||||
delay_jiffies);
|
||||
|
||||
return 0;
|
||||
|
||||
err_irq:
|
||||
while (--i >= 0)
|
||||
free_irq(muic_irqs[i].virq, info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int max8997_muic_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct max8997_muic_info *info = platform_get_drvdata(pdev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(muic_irqs); i++)
|
||||
free_irq(muic_irqs[i].virq, info);
|
||||
cancel_work_sync(&info->irq_work);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver max8997_muic_driver = {
|
||||
@@ -780,7 +766,6 @@ static struct platform_driver max8997_muic_driver = {
|
||||
.name = DEV_NAME,
|
||||
},
|
||||
.probe = max8997_muic_probe,
|
||||
.remove = max8997_muic_remove,
|
||||
};
|
||||
|
||||
module_platform_driver(max8997_muic_driver);
|
||||
|
||||
@@ -1367,7 +1367,7 @@ config GPIO_TPS65912
|
||||
|
||||
config GPIO_TPS68470
|
||||
bool "TPS68470 GPIO"
|
||||
depends on MFD_TPS68470
|
||||
depends on INTEL_SKL_INT3472
|
||||
help
|
||||
Select this option to enable GPIO driver for the TPS68470
|
||||
chip family.
|
||||
|
||||
@@ -339,8 +339,6 @@ static int crystalcove_gpio_probe(struct platform_device *pdev)
|
||||
if (!cg)
|
||||
return -ENOMEM;
|
||||
|
||||
platform_set_drvdata(pdev, cg);
|
||||
|
||||
mutex_init(&cg->buslock);
|
||||
cg->chip.label = KBUILD_MODNAME;
|
||||
cg->chip.direction_input = crystalcove_gpio_dir_in;
|
||||
@@ -372,13 +370,7 @@ static int crystalcove_gpio_probe(struct platform_device *pdev)
|
||||
return retval;
|
||||
}
|
||||
|
||||
retval = devm_gpiochip_add_data(&pdev->dev, &cg->chip, cg);
|
||||
if (retval) {
|
||||
dev_warn(&pdev->dev, "add gpio chip error: %d\n", retval);
|
||||
return retval;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return devm_gpiochip_add_data(&pdev->dev, &cg->chip, cg);
|
||||
}
|
||||
|
||||
static struct platform_driver crystalcove_gpio_driver = {
|
||||
|
||||
@@ -99,19 +99,14 @@ struct wcove_gpio {
|
||||
bool set_irq_mask;
|
||||
};
|
||||
|
||||
static inline int to_reg(int gpio, enum ctrl_register reg_type)
|
||||
static inline int to_reg(int gpio, enum ctrl_register type)
|
||||
{
|
||||
unsigned int reg;
|
||||
unsigned int reg = type == CTRL_IN ? GPIO_IN_CTRL_BASE : GPIO_OUT_CTRL_BASE;
|
||||
|
||||
if (gpio >= WCOVE_GPIO_NUM)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (reg_type == CTRL_IN)
|
||||
reg = GPIO_IN_CTRL_BASE + gpio;
|
||||
else
|
||||
reg = GPIO_OUT_CTRL_BASE + gpio;
|
||||
|
||||
return reg;
|
||||
return reg + gpio;
|
||||
}
|
||||
|
||||
static inline int to_ireg(int gpio, enum ctrl_register type, unsigned int *mask)
|
||||
@@ -129,7 +124,7 @@ static inline int to_ireg(int gpio, enum ctrl_register type, unsigned int *mask)
|
||||
return reg;
|
||||
}
|
||||
|
||||
static void wcove_update_irq_mask(struct wcove_gpio *wg, int gpio)
|
||||
static void wcove_update_irq_mask(struct wcove_gpio *wg, irq_hw_number_t gpio)
|
||||
{
|
||||
unsigned int mask, reg = to_ireg(gpio, IRQ_MASK, &mask);
|
||||
|
||||
@@ -139,13 +134,10 @@ static void wcove_update_irq_mask(struct wcove_gpio *wg, int gpio)
|
||||
regmap_clear_bits(wg->regmap, reg, mask);
|
||||
}
|
||||
|
||||
static void wcove_update_irq_ctrl(struct wcove_gpio *wg, int gpio)
|
||||
static void wcove_update_irq_ctrl(struct wcove_gpio *wg, irq_hw_number_t gpio)
|
||||
{
|
||||
int reg = to_reg(gpio, CTRL_IN);
|
||||
|
||||
if (reg < 0)
|
||||
return;
|
||||
|
||||
regmap_update_bits(wg->regmap, reg, CTLI_INTCNT_BE, wg->intcnt);
|
||||
}
|
||||
|
||||
@@ -248,8 +240,9 @@ static int wcove_irq_type(struct irq_data *data, unsigned int type)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
|
||||
struct wcove_gpio *wg = gpiochip_get_data(chip);
|
||||
irq_hw_number_t gpio = irqd_to_hwirq(data);
|
||||
|
||||
if (data->hwirq >= WCOVE_GPIO_NUM)
|
||||
if (gpio >= WCOVE_GPIO_NUM)
|
||||
return 0;
|
||||
|
||||
switch (type) {
|
||||
@@ -286,7 +279,7 @@ static void wcove_bus_sync_unlock(struct irq_data *data)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
|
||||
struct wcove_gpio *wg = gpiochip_get_data(chip);
|
||||
int gpio = data->hwirq;
|
||||
irq_hw_number_t gpio = irqd_to_hwirq(data);
|
||||
|
||||
if (wg->update & UPDATE_IRQ_TYPE)
|
||||
wcove_update_irq_ctrl(wg, gpio);
|
||||
@@ -301,8 +294,9 @@ static void wcove_irq_unmask(struct irq_data *data)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
|
||||
struct wcove_gpio *wg = gpiochip_get_data(chip);
|
||||
irq_hw_number_t gpio = irqd_to_hwirq(data);
|
||||
|
||||
if (data->hwirq >= WCOVE_GPIO_NUM)
|
||||
if (gpio >= WCOVE_GPIO_NUM)
|
||||
return;
|
||||
|
||||
wg->set_irq_mask = false;
|
||||
@@ -313,8 +307,9 @@ static void wcove_irq_mask(struct irq_data *data)
|
||||
{
|
||||
struct gpio_chip *chip = irq_data_get_irq_chip_data(data);
|
||||
struct wcove_gpio *wg = gpiochip_get_data(chip);
|
||||
irq_hw_number_t gpio = irqd_to_hwirq(data);
|
||||
|
||||
if (data->hwirq >= WCOVE_GPIO_NUM)
|
||||
if (gpio >= WCOVE_GPIO_NUM)
|
||||
return;
|
||||
|
||||
wg->set_irq_mask = true;
|
||||
@@ -369,8 +364,7 @@ static irqreturn_t wcove_gpio_irq_handler(int irq, void *data)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void wcove_gpio_dbg_show(struct seq_file *s,
|
||||
struct gpio_chip *chip)
|
||||
static void wcove_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
||||
{
|
||||
unsigned int ctlo, ctli, irq_mask, irq_status;
|
||||
struct wcove_gpio *wg = gpiochip_get_data(chip);
|
||||
@@ -379,10 +373,15 @@ static void wcove_gpio_dbg_show(struct seq_file *s,
|
||||
for (gpio = 0; gpio < WCOVE_GPIO_NUM; gpio++) {
|
||||
ret += regmap_read(wg->regmap, to_reg(gpio, CTRL_OUT), &ctlo);
|
||||
ret += regmap_read(wg->regmap, to_reg(gpio, CTRL_IN), &ctli);
|
||||
if (ret) {
|
||||
dev_err(wg->dev, "Failed to read registers: CTRL out/in\n");
|
||||
break;
|
||||
}
|
||||
|
||||
ret += regmap_read(wg->regmap, to_ireg(gpio, IRQ_MASK, &mask), &irq_mask);
|
||||
ret += regmap_read(wg->regmap, to_ireg(gpio, IRQ_STATUS, &mask), &irq_status);
|
||||
if (ret) {
|
||||
pr_err("Failed to read registers: ctrl out/in or irq status/mask\n");
|
||||
dev_err(wg->dev, "Failed to read registers: IRQ status/mask\n");
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -128,6 +128,34 @@ static struct gpio_desc *acpi_get_gpiod(char *path, int pin)
|
||||
return gpiochip_get_desc(chip, pin);
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_get_and_request_gpiod - Translate ACPI GPIO pin to GPIO descriptor and
|
||||
* hold a refcount to the GPIO device.
|
||||
* @path: ACPI GPIO controller full path name, (e.g. "\\_SB.GPO1")
|
||||
* @pin: ACPI GPIO pin number (0-based, controller-relative)
|
||||
* @label: Label to pass to gpiod_request()
|
||||
*
|
||||
* This function is a simple pass-through to acpi_get_gpiod(), except that
|
||||
* as it is intended for use outside of the GPIO layer (in a similar fashion to
|
||||
* gpiod_get_index() for example) it also holds a reference to the GPIO device.
|
||||
*/
|
||||
struct gpio_desc *acpi_get_and_request_gpiod(char *path, int pin, char *label)
|
||||
{
|
||||
struct gpio_desc *gpio;
|
||||
int ret;
|
||||
|
||||
gpio = acpi_get_gpiod(path, pin);
|
||||
if (IS_ERR(gpio))
|
||||
return gpio;
|
||||
|
||||
ret = gpiod_request(gpio, label);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return gpio;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_get_and_request_gpiod);
|
||||
|
||||
static irqreturn_t acpi_gpio_irq_handler(int irq, void *data)
|
||||
{
|
||||
struct acpi_gpio_event *event = data;
|
||||
@@ -168,6 +196,29 @@ bool acpi_gpio_get_irq_resource(struct acpi_resource *ares,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_gpio_get_irq_resource);
|
||||
|
||||
/**
|
||||
* acpi_gpio_get_io_resource - Fetch details of an ACPI resource if it is a GPIO
|
||||
* I/O resource or return False if not.
|
||||
* @ares: Pointer to the ACPI resource to fetch
|
||||
* @agpio: Pointer to a &struct acpi_resource_gpio to store the output pointer
|
||||
*/
|
||||
bool acpi_gpio_get_io_resource(struct acpi_resource *ares,
|
||||
struct acpi_resource_gpio **agpio)
|
||||
{
|
||||
struct acpi_resource_gpio *gpio;
|
||||
|
||||
if (ares->type != ACPI_RESOURCE_TYPE_GPIO)
|
||||
return false;
|
||||
|
||||
gpio = &ares->data.gpio;
|
||||
if (gpio->connection_type != ACPI_RESOURCE_GPIO_TYPE_IO)
|
||||
return false;
|
||||
|
||||
*agpio = gpio;
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_gpio_get_io_resource);
|
||||
|
||||
static void acpi_gpiochip_request_irq(struct acpi_gpio_chip *acpi_gpio,
|
||||
struct acpi_gpio_event *event)
|
||||
{
|
||||
|
||||
@@ -178,51 +178,6 @@ static const unsigned long goodix_irq_flags[] = {
|
||||
IRQ_TYPE_LEVEL_HIGH,
|
||||
};
|
||||
|
||||
/*
|
||||
* Those tablets have their coordinates origin at the bottom right
|
||||
* of the tablet, as if rotated 180 degrees
|
||||
*/
|
||||
static const struct dmi_system_id rotated_screen[] = {
|
||||
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
|
||||
{
|
||||
.ident = "Teclast X89",
|
||||
.matches = {
|
||||
/* tPAD is too generic, also match on bios date */
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "tPAD"),
|
||||
DMI_MATCH(DMI_BIOS_DATE, "12/19/2014"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Teclast X98 Pro",
|
||||
.matches = {
|
||||
/*
|
||||
* Only match BIOS date, because the manufacturers
|
||||
* BIOS does not report the board name at all
|
||||
* (sometimes)...
|
||||
*/
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "TECLAST"),
|
||||
DMI_MATCH(DMI_BIOS_DATE, "10/28/2015"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "WinBook TW100",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "WinBook"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TW100")
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "WinBook TW700",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "WinBook"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "TW700")
|
||||
},
|
||||
},
|
||||
#endif
|
||||
{}
|
||||
};
|
||||
|
||||
static const struct dmi_system_id nine_bytes_report[] = {
|
||||
#if defined(CONFIG_DMI) && defined(CONFIG_X86)
|
||||
{
|
||||
@@ -1123,13 +1078,6 @@ static int goodix_configure_dev(struct goodix_ts_data *ts)
|
||||
ABS_MT_POSITION_Y, ts->prop.max_y);
|
||||
}
|
||||
|
||||
if (dmi_check_system(rotated_screen)) {
|
||||
ts->prop.invert_x = true;
|
||||
ts->prop.invert_y = true;
|
||||
dev_dbg(&ts->client->dev,
|
||||
"Applying '180 degrees rotated screen' quirk\n");
|
||||
}
|
||||
|
||||
if (dmi_check_system(nine_bytes_report)) {
|
||||
ts->contact_size = 9;
|
||||
|
||||
|
||||
@@ -1499,24 +1499,6 @@ config MFD_TPS65217
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called tps65217.
|
||||
|
||||
config MFD_TPS68470
|
||||
bool "TI TPS68470 Power Management / LED chips"
|
||||
depends on ACPI && PCI && I2C=y
|
||||
depends on I2C_DESIGNWARE_PLATFORM=y
|
||||
select MFD_CORE
|
||||
select REGMAP_I2C
|
||||
help
|
||||
If you say yes here you get support for the TPS68470 series of
|
||||
Power Management / LED chips.
|
||||
|
||||
These include voltage regulators, LEDs and other features
|
||||
that are often used in portable devices.
|
||||
|
||||
This option is a bool as it provides an ACPI operation
|
||||
region, which must be available before any of the devices
|
||||
using this are probed. This option also configures the
|
||||
designware-i2c driver to be built-in, for the same reason.
|
||||
|
||||
config MFD_TI_LP873X
|
||||
tristate "TI LP873X Power Management IC"
|
||||
depends on I2C
|
||||
|
||||
@@ -105,7 +105,6 @@ obj-$(CONFIG_MFD_TPS65910) += tps65910.o
|
||||
obj-$(CONFIG_MFD_TPS65912) += tps65912-core.o
|
||||
obj-$(CONFIG_MFD_TPS65912_I2C) += tps65912-i2c.o
|
||||
obj-$(CONFIG_MFD_TPS65912_SPI) += tps65912-spi.o
|
||||
obj-$(CONFIG_MFD_TPS68470) += tps68470.o
|
||||
obj-$(CONFIG_MFD_TPS80031) += tps80031.o
|
||||
obj-$(CONFIG_MENELAUS) += menelaus.o
|
||||
|
||||
|
||||
@@ -1,97 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* TPS68470 chip Parent driver
|
||||
*
|
||||
* Copyright (C) 2017 Intel Corporation
|
||||
*
|
||||
* Authors:
|
||||
* Rajmohan Mani <rajmohan.mani@intel.com>
|
||||
* Tianshu Qiu <tian.shu.qiu@intel.com>
|
||||
* Jian Xu Zheng <jian.xu.zheng@intel.com>
|
||||
* Yuning Pu <yuning.pu@intel.com>
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/mfd/core.h>
|
||||
#include <linux/mfd/tps68470.h>
|
||||
#include <linux/regmap.h>
|
||||
|
||||
static const struct mfd_cell tps68470s[] = {
|
||||
{ .name = "tps68470-gpio" },
|
||||
{ .name = "tps68470_pmic_opregion" },
|
||||
};
|
||||
|
||||
static const struct regmap_config tps68470_regmap_config = {
|
||||
.reg_bits = 8,
|
||||
.val_bits = 8,
|
||||
.max_register = TPS68470_REG_MAX,
|
||||
};
|
||||
|
||||
static int tps68470_chip_init(struct device *dev, struct regmap *regmap)
|
||||
{
|
||||
unsigned int version;
|
||||
int ret;
|
||||
|
||||
/* Force software reset */
|
||||
ret = regmap_write(regmap, TPS68470_REG_RESET, TPS68470_REG_RESET_MASK);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_read(regmap, TPS68470_REG_REVID, &version);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to read revision register: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
dev_info(dev, "TPS68470 REVID: 0x%x\n", version);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tps68470_probe(struct i2c_client *client)
|
||||
{
|
||||
struct device *dev = &client->dev;
|
||||
struct regmap *regmap;
|
||||
int ret;
|
||||
|
||||
regmap = devm_regmap_init_i2c(client, &tps68470_regmap_config);
|
||||
if (IS_ERR(regmap)) {
|
||||
dev_err(dev, "devm_regmap_init_i2c Error %ld\n",
|
||||
PTR_ERR(regmap));
|
||||
return PTR_ERR(regmap);
|
||||
}
|
||||
|
||||
i2c_set_clientdata(client, regmap);
|
||||
|
||||
ret = tps68470_chip_init(dev, regmap);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "TPS68470 Init Error %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = devm_mfd_add_devices(dev, PLATFORM_DEVID_NONE, tps68470s,
|
||||
ARRAY_SIZE(tps68470s), NULL, 0, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "devm_mfd_add_devices failed: %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id tps68470_acpi_ids[] = {
|
||||
{"INT3472"},
|
||||
{},
|
||||
};
|
||||
|
||||
static struct i2c_driver tps68470_driver = {
|
||||
.driver = {
|
||||
.name = "tps68470",
|
||||
.acpi_match_table = tps68470_acpi_ids,
|
||||
},
|
||||
.probe_new = tps68470_probe,
|
||||
};
|
||||
builtin_i2c_driver(tps68470_driver);
|
||||
@@ -1,5 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
# Copyright (C) 2019-2020 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
# Copyright (C) 2019-2021 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
|
||||
menuconfig SURFACE_AGGREGATOR
|
||||
tristate "Microsoft Surface System Aggregator Module Subsystem and Drivers"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
# Copyright (C) 2019-2020 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
# Copyright (C) 2019-2021 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
|
||||
# For include/trace/define_trace.h to include trace.h
|
||||
CFLAGS_core.o = -I$(src)
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
/*
|
||||
* Surface System Aggregator Module bus and device integration.
|
||||
*
|
||||
* Copyright (C) 2019-2020 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
* Copyright (C) 2019-2021 Maximilian Luz <luzmaximilian@gmail.com>
|
||||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user