Linux v4.16.2
This commit is contained in:
parent
2637ac8e11
commit
37d0749d46
@ -1,90 +0,0 @@
|
||||
From 20eeb02a0a489e35de0830b2d61f09d43763c982 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 13 Nov 2017 09:23:19 +0100
|
||||
Subject: [PATCH] Bluetooth: btusb: Add a Kconfig option to enable USB
|
||||
autosuspend by default
|
||||
|
||||
On many laptops the btusb device is the only USB device not having USB
|
||||
autosuspend enabled, this causes not only the HCI but also the USB
|
||||
controller to stay awake, together using aprox. 0.4W of power.
|
||||
|
||||
Modern ultrabooks idle around 6W (at 50% screen brightness), 3.5W for
|
||||
Apollo Lake devices. 0.4W is a significant chunk of this (7 / 11%).
|
||||
|
||||
The btusb driver already contains code to allow enabling USB autosuspend,
|
||||
but currently leaves it up to the user / userspace to enable it. This
|
||||
means that for most people it will not be enabled, leading to an
|
||||
unnecessarily high power consumption.
|
||||
|
||||
Since enabling it is not entirely without risk of regressions, this
|
||||
commit adds a Kconfig option so that Linux distributions can choose to
|
||||
enable it by default. This commit also adds a module option so that when
|
||||
distros receive bugs they can easily ask the user to disable it again
|
||||
for easy debugging.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
Changes in v2:
|
||||
-s/BT_USB_AUTOSUSPEND/BT_HCIBTUSB_AUTOSUSPEND/
|
||||
-s/enable_usb_autosuspend/enable_autosuspend/
|
||||
---
|
||||
drivers/bluetooth/Kconfig | 10 ++++++++++
|
||||
drivers/bluetooth/btusb.c | 7 +++++++
|
||||
2 files changed, 17 insertions(+)
|
||||
|
||||
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
|
||||
index 6475f8c0d3b2..20940417d937 100644
|
||||
--- a/drivers/bluetooth/Kconfig
|
||||
+++ b/drivers/bluetooth/Kconfig
|
||||
@@ -30,6 +30,16 @@ config BT_HCIBTUSB
|
||||
Say Y here to compile support for Bluetooth USB devices into the
|
||||
kernel or say M to compile it as module (btusb).
|
||||
|
||||
+config BT_HCIBTUSB_AUTOSUSPEND
|
||||
+ bool "Enable USB autosuspend for Bluetooth USB devices by default"
|
||||
+ depends on BT_HCIBTUSB
|
||||
+ help
|
||||
+ Say Y here to enable USB autosuspend for Bluetooth USB devices by
|
||||
+ default.
|
||||
+
|
||||
+ This can be overridden by passing btusb.enable_autosuspend=[y|n]
|
||||
+ on the kernel commandline.
|
||||
+
|
||||
config BT_HCIBTUSB_BCM
|
||||
bool "Broadcom protocol support"
|
||||
depends on BT_HCIBTUSB
|
||||
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
|
||||
index c054d7bce490..3386034a44aa 100644
|
||||
--- a/drivers/bluetooth/btusb.c
|
||||
+++ b/drivers/bluetooth/btusb.c
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
static bool disable_scofix;
|
||||
static bool force_scofix;
|
||||
+static bool enable_autosuspend = IS_ENABLED(CONFIG_BT_HCIBTUSB_AUTOSUSPEND);
|
||||
|
||||
static bool reset = true;
|
||||
|
||||
@@ -3175,6 +3176,9 @@ static int btusb_probe(struct usb_interface *intf,
|
||||
}
|
||||
#endif
|
||||
|
||||
+ if (enable_autosuspend)
|
||||
+ usb_enable_autosuspend(data->udev);
|
||||
+
|
||||
err = hci_register_dev(hdev);
|
||||
if (err < 0)
|
||||
goto out_free_dev;
|
||||
@@ -3387,6 +3391,9 @@ MODULE_PARM_DESC(disable_scofix, "Disable fixup of wrong SCO buffer size");
|
||||
module_param(force_scofix, bool, 0644);
|
||||
MODULE_PARM_DESC(force_scofix, "Force fixup of wrong SCO buffers size");
|
||||
|
||||
+module_param(enable_autosuspend, bool, 0644);
|
||||
+MODULE_PARM_DESC(enable_autosuspend, "Enable USB autosuspend by default");
|
||||
+
|
||||
module_param(reset, bool, 0644);
|
||||
MODULE_PARM_DESC(reset, "Send HCI reset command on initialization");
|
||||
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,107 +0,0 @@
|
||||
From 8c6b638bb620eef53cb83ffe88d7b528f666af10 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 22 Nov 2017 12:57:08 +0100
|
||||
Subject: [PATCH] HID: multitouch: Properly deal with Win8 PTP reports with 0
|
||||
touches
|
||||
|
||||
The Windows Precision Touchpad spec "Figure 4 Button Only Down and Up"
|
||||
and "Table 9 Report Sequence for Button Only Down and Up" indicate
|
||||
that the first packet of a (possibly hybrid mode multi-packet) frame
|
||||
may contain a contact-count of 0 if only a button is pressed and no
|
||||
fingers are detected.
|
||||
|
||||
This means that a value of 0 for contact-count is a valid value and
|
||||
should be used as expected contact count when it is the first packet
|
||||
(num_received == 0), as extra check to make sure that this is the first
|
||||
packet of a buttons only frame, we also check that the timestamp is
|
||||
different.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-multitouch.c | 32 ++++++++++++++++++++++++++++++--
|
||||
1 file changed, 30 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
||||
index 397592959238..0a42e19d914a 100644
|
||||
--- a/drivers/hid/hid-multitouch.c
|
||||
+++ b/drivers/hid/hid-multitouch.c
|
||||
@@ -119,6 +119,9 @@ struct mt_device {
|
||||
unsigned long mt_io_flags; /* mt flags (MT_IO_FLAGS_*) */
|
||||
int cc_index; /* contact count field index in the report */
|
||||
int cc_value_index; /* contact count value index in the field */
|
||||
+ int scantime_index; /* scantime field index in the report */
|
||||
+ int scantime_val_index; /* scantime value index in the field */
|
||||
+ int prev_scantime; /* scantime reported in the previous packet */
|
||||
unsigned last_slot_field; /* the last field of a slot */
|
||||
unsigned mt_report_id; /* the report ID of the multitouch device */
|
||||
unsigned long initial_quirks; /* initial quirks state */
|
||||
@@ -599,6 +602,12 @@ static int mt_touch_input_mapping(struct hid_device *hdev, struct hid_input *hi,
|
||||
EV_MSC, MSC_TIMESTAMP);
|
||||
input_set_capability(hi->input, EV_MSC, MSC_TIMESTAMP);
|
||||
mt_store_field(usage, td, hi);
|
||||
+ /* Ignore if indexes are out of bounds. */
|
||||
+ if (field->index >= field->report->maxfield ||
|
||||
+ usage->usage_index >= field->report_count)
|
||||
+ return 1;
|
||||
+ td->scantime_index = field->index;
|
||||
+ td->scantime_val_index = usage->usage_index;
|
||||
return 1;
|
||||
case HID_DG_CONTACTCOUNT:
|
||||
/* Ignore if indexes are out of bounds. */
|
||||
@@ -866,10 +875,11 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
|
||||
static void mt_touch_report(struct hid_device *hid, struct hid_report *report)
|
||||
{
|
||||
struct mt_device *td = hid_get_drvdata(hid);
|
||||
+ __s32 cls = td->mtclass.name;
|
||||
struct hid_field *field;
|
||||
bool first_packet;
|
||||
unsigned count;
|
||||
- int r, n;
|
||||
+ int r, n, scantime = 0;
|
||||
|
||||
/* sticky fingers release in progress, abort */
|
||||
if (test_and_set_bit(MT_IO_FLAGS_RUNNING, &td->mt_io_flags))
|
||||
@@ -879,12 +889,29 @@ static void mt_touch_report(struct hid_device *hid, struct hid_report *report)
|
||||
* Includes multi-packet support where subsequent
|
||||
* packets are sent with zero contactcount.
|
||||
*/
|
||||
+ if (td->scantime_index >= 0) {
|
||||
+ field = report->field[td->scantime_index];
|
||||
+ scantime = field->value[td->scantime_val_index];
|
||||
+ }
|
||||
if (td->cc_index >= 0) {
|
||||
struct hid_field *field = report->field[td->cc_index];
|
||||
int value = field->value[td->cc_value_index];
|
||||
- if (value)
|
||||
+
|
||||
+ /*
|
||||
+ * For Win8 PTPs the first packet (td->num_received == 0) may
|
||||
+ * have a contactcount of 0 if there only is a button event.
|
||||
+ * We double check that this is not a continuation packet
|
||||
+ * of a possible multi-packet frame be checking that the
|
||||
+ * timestamp has changed.
|
||||
+ */
|
||||
+ if ((cls == MT_CLS_WIN_8 || cls == MT_CLS_WIN_8_DUAL) &&
|
||||
+ td->num_received == 0 && td->prev_scantime != scantime)
|
||||
+ td->num_expected = value;
|
||||
+ /* A non 0 contact count always indicates a first packet */
|
||||
+ else if (value)
|
||||
td->num_expected = value;
|
||||
}
|
||||
+ td->prev_scantime = scantime;
|
||||
|
||||
first_packet = td->num_received == 0;
|
||||
for (r = 0; r < report->maxfield; r++) {
|
||||
@@ -1342,6 +1369,7 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
td->maxcontact_report_id = -1;
|
||||
td->inputmode_value = MT_INPUTMODE_TOUCHSCREEN;
|
||||
td->cc_index = -1;
|
||||
+ td->scantime_index = -1;
|
||||
td->mt_report_id = -1;
|
||||
hid_set_drvdata(hdev, td);
|
||||
|
||||
--
|
||||
2.14.3
|
||||
|
@ -0,0 +1,27 @@
|
||||
From 991b5e95d4fe7778c8f5e7d7f478d01134d51ca7 Mon Sep 17 00:00:00 2001
|
||||
From: Laura Abbott <labbott@redhat.com>
|
||||
Date: Wed, 14 Mar 2018 14:20:02 -0700
|
||||
Subject: [PATCH] Temporarily work around gcc aliasing warning/error
|
||||
|
||||
Signed-off-by: Laura Abbott <labbott@redhat.com>
|
||||
---
|
||||
tools/lib/str_error_r.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tools/lib/str_error_r.c b/tools/lib/str_error_r.c
|
||||
index d6d65537b0d9..c0ede4f6adae 100644
|
||||
--- a/tools/lib/str_error_r.c
|
||||
+++ b/tools/lib/str_error_r.c
|
||||
@@ -21,7 +21,8 @@
|
||||
char *str_error_r(int errnum, char *buf, size_t buflen)
|
||||
{
|
||||
int err = strerror_r(errnum, buf, buflen);
|
||||
+ void *temp = buf;
|
||||
if (err)
|
||||
- snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, buf, buflen, err);
|
||||
+ snprintf(buf, buflen, "INTERNAL ERROR: strerror_r(%d, %p, %zd)=%d", errnum, temp, buflen, err);
|
||||
return buf;
|
||||
}
|
||||
--
|
||||
2.16.2
|
||||
|
@ -1,181 +0,0 @@
|
||||
From 400e22499dd92613821374c8c6c88c7225359980 Mon Sep 17 00:00:00 2001
|
||||
From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Date: Wed, 15 Nov 2017 17:38:37 -0800
|
||||
Subject: [PATCH] mm: don't warn about allocations which stall for too long
|
||||
|
||||
Commit 63f53dea0c98 ("mm: warn about allocations which stall for too
|
||||
long") was a great step for reducing possibility of silent hang up
|
||||
problem caused by memory allocation stalls. But this commit reverts it,
|
||||
for it is possible to trigger OOM lockup and/or soft lockups when many
|
||||
threads concurrently called warn_alloc() (in order to warn about memory
|
||||
allocation stalls) due to current implementation of printk(), and it is
|
||||
difficult to obtain useful information due to limitation of synchronous
|
||||
warning approach.
|
||||
|
||||
Current printk() implementation flushes all pending logs using the
|
||||
context of a thread which called console_unlock(). printk() should be
|
||||
able to flush all pending logs eventually unless somebody continues
|
||||
appending to printk() buffer.
|
||||
|
||||
Since warn_alloc() started appending to printk() buffer while waiting
|
||||
for oom_kill_process() to make forward progress when oom_kill_process()
|
||||
is processing pending logs, it became possible for warn_alloc() to force
|
||||
oom_kill_process() loop inside printk(). As a result, warn_alloc()
|
||||
significantly increased possibility of preventing oom_kill_process()
|
||||
from making forward progress.
|
||||
|
||||
---------- Pseudo code start ----------
|
||||
Before warn_alloc() was introduced:
|
||||
|
||||
retry:
|
||||
if (mutex_trylock(&oom_lock)) {
|
||||
while (atomic_read(&printk_pending_logs) > 0) {
|
||||
atomic_dec(&printk_pending_logs);
|
||||
print_one_log();
|
||||
}
|
||||
// Send SIGKILL here.
|
||||
mutex_unlock(&oom_lock)
|
||||
}
|
||||
goto retry;
|
||||
|
||||
After warn_alloc() was introduced:
|
||||
|
||||
retry:
|
||||
if (mutex_trylock(&oom_lock)) {
|
||||
while (atomic_read(&printk_pending_logs) > 0) {
|
||||
atomic_dec(&printk_pending_logs);
|
||||
print_one_log();
|
||||
}
|
||||
// Send SIGKILL here.
|
||||
mutex_unlock(&oom_lock)
|
||||
} else if (waited_for_10seconds()) {
|
||||
atomic_inc(&printk_pending_logs);
|
||||
}
|
||||
goto retry;
|
||||
---------- Pseudo code end ----------
|
||||
|
||||
Although waited_for_10seconds() becomes true once per 10 seconds,
|
||||
unbounded number of threads can call waited_for_10seconds() at the same
|
||||
time. Also, since threads doing waited_for_10seconds() keep doing
|
||||
almost busy loop, the thread doing print_one_log() can use little CPU
|
||||
resource. Therefore, this situation can be simplified like
|
||||
|
||||
---------- Pseudo code start ----------
|
||||
retry:
|
||||
if (mutex_trylock(&oom_lock)) {
|
||||
while (atomic_read(&printk_pending_logs) > 0) {
|
||||
atomic_dec(&printk_pending_logs);
|
||||
print_one_log();
|
||||
}
|
||||
// Send SIGKILL here.
|
||||
mutex_unlock(&oom_lock)
|
||||
} else {
|
||||
atomic_inc(&printk_pending_logs);
|
||||
}
|
||||
goto retry;
|
||||
---------- Pseudo code end ----------
|
||||
|
||||
when printk() is called faster than print_one_log() can process a log.
|
||||
|
||||
One of possible mitigation would be to introduce a new lock in order to
|
||||
make sure that no other series of printk() (either oom_kill_process() or
|
||||
warn_alloc()) can append to printk() buffer when one series of printk()
|
||||
(either oom_kill_process() or warn_alloc()) is already in progress.
|
||||
|
||||
Such serialization will also help obtaining kernel messages in readable
|
||||
form.
|
||||
|
||||
---------- Pseudo code start ----------
|
||||
retry:
|
||||
if (mutex_trylock(&oom_lock)) {
|
||||
mutex_lock(&oom_printk_lock);
|
||||
while (atomic_read(&printk_pending_logs) > 0) {
|
||||
atomic_dec(&printk_pending_logs);
|
||||
print_one_log();
|
||||
}
|
||||
// Send SIGKILL here.
|
||||
mutex_unlock(&oom_printk_lock);
|
||||
mutex_unlock(&oom_lock)
|
||||
} else {
|
||||
if (mutex_trylock(&oom_printk_lock)) {
|
||||
atomic_inc(&printk_pending_logs);
|
||||
mutex_unlock(&oom_printk_lock);
|
||||
}
|
||||
}
|
||||
goto retry;
|
||||
---------- Pseudo code end ----------
|
||||
|
||||
But this commit does not go that direction, for we don't want to
|
||||
introduce a new lock dependency, and we unlikely be able to obtain
|
||||
useful information even if we serialized oom_kill_process() and
|
||||
warn_alloc().
|
||||
|
||||
Synchronous approach is prone to unexpected results (e.g. too late [1],
|
||||
too frequent [2], overlooked [3]). As far as I know, warn_alloc() never
|
||||
helped with providing information other than "something is going wrong".
|
||||
I want to consider asynchronous approach which can obtain information
|
||||
during stalls with possibly relevant threads (e.g. the owner of
|
||||
oom_lock and kswapd-like threads) and serve as a trigger for actions
|
||||
(e.g. turn on/off tracepoints, ask libvirt daemon to take a memory dump
|
||||
of stalling KVM guest for diagnostic purpose).
|
||||
|
||||
This commit temporarily loses ability to report e.g. OOM lockup due to
|
||||
unable to invoke the OOM killer due to !__GFP_FS allocation request.
|
||||
But asynchronous approach will be able to detect such situation and emit
|
||||
warning. Thus, let's remove warn_alloc().
|
||||
|
||||
[1] https://bugzilla.kernel.org/show_bug.cgi?id=192981
|
||||
[2] http://lkml.kernel.org/r/CAM_iQpWuPVGc2ky8M-9yukECtS+zKjiDasNymX7rMcBjBFyM_A@mail.gmail.com
|
||||
[3] commit db73ee0d46379922 ("mm, vmscan: do not loop on too_many_isolated for ever"))
|
||||
|
||||
Link: http://lkml.kernel.org/r/1509017339-4802-1-git-send-email-penguin-kernel@I-love.SAKURA.ne.jp
|
||||
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
|
||||
Reported-by: Cong Wang <xiyou.wangcong@gmail.com>
|
||||
Reported-by: yuwang.yuwang <yuwang.yuwang@alibaba-inc.com>
|
||||
Reported-by: Johannes Weiner <hannes@cmpxchg.org>
|
||||
Acked-by: Michal Hocko <mhocko@suse.com>
|
||||
Acked-by: Johannes Weiner <hannes@cmpxchg.org>
|
||||
Cc: Vlastimil Babka <vbabka@suse.cz>
|
||||
Cc: Mel Gorman <mgorman@suse.de>
|
||||
Cc: Dave Hansen <dave.hansen@intel.com>
|
||||
Cc: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
|
||||
Cc: Petr Mladek <pmladek@suse.com>
|
||||
Cc: Steven Rostedt <rostedt@goodmis.org>
|
||||
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
|
||||
|
||||
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
||||
---
|
||||
mm/page_alloc.c | 10 ----------
|
||||
1 file changed, 10 deletions(-)
|
||||
|
||||
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
|
||||
index 04bf1ad50144..bd1a686e40fe 100644
|
||||
--- a/mm/page_alloc.c
|
||||
+++ b/mm/page_alloc.c
|
||||
@@ -3903,8 +3903,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
|
||||
enum compact_result compact_result;
|
||||
int compaction_retries;
|
||||
int no_progress_loops;
|
||||
- unsigned long alloc_start = jiffies;
|
||||
- unsigned int stall_timeout = 10 * HZ;
|
||||
unsigned int cpuset_mems_cookie;
|
||||
int reserve_flags;
|
||||
|
||||
@@ -4036,14 +4034,6 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,
|
||||
if (!can_direct_reclaim)
|
||||
goto nopage;
|
||||
|
||||
- /* Make sure we know about allocations which stall for too long */
|
||||
- if (time_after(jiffies, alloc_start + stall_timeout)) {
|
||||
- warn_alloc(gfp_mask & ~__GFP_NOWARN, ac->nodemask,
|
||||
- "page allocation stalls for %ums, order:%u",
|
||||
- jiffies_to_msecs(jiffies-alloc_start), order);
|
||||
- stall_timeout += 10 * HZ;
|
||||
- }
|
||||
-
|
||||
/* Avoid recursion of direct reclaim */
|
||||
if (current->flags & PF_MEMALLOC)
|
||||
goto nopage;
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,44 +0,0 @@
|
||||
From 297a6961ffb8ff4dc66c9fbf53b924bd1dda05d5 Mon Sep 17 00:00:00 2001
|
||||
From: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Date: Thu, 11 Jan 2018 11:21:51 +0000
|
||||
Subject: [PATCH] net: phy: mdio-bcm-unimac: fix potential NULL dereference in
|
||||
unimac_mdio_probe()
|
||||
|
||||
platform_get_resource() may fail and return NULL, so we should
|
||||
better check it's return value to avoid a NULL pointer dereference
|
||||
a bit later in the code.
|
||||
|
||||
This is detected by Coccinelle semantic patch.
|
||||
|
||||
@@
|
||||
expression pdev, res, n, t, e, e1, e2;
|
||||
@@
|
||||
|
||||
res = platform_get_resource(pdev, t, n);
|
||||
+ if (!res)
|
||||
+ return -EINVAL;
|
||||
... when != res == NULL
|
||||
e = devm_ioremap(e1, res->start, e2);
|
||||
|
||||
Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/phy/mdio-bcm-unimac.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/phy/mdio-bcm-unimac.c b/drivers/net/phy/mdio-bcm-unimac.c
|
||||
index 08e0647b85e2..8d370667fa1b 100644
|
||||
--- a/drivers/net/phy/mdio-bcm-unimac.c
|
||||
+++ b/drivers/net/phy/mdio-bcm-unimac.c
|
||||
@@ -205,6 +205,8 @@ static int unimac_mdio_probe(struct platform_device *pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
+ if (!r)
|
||||
+ return -EINVAL;
|
||||
|
||||
/* Just ioremap, as this MDIO block is usually integrated into an
|
||||
* Ethernet MAC controller register range
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,99 +0,0 @@
|
||||
From 714fe15daa07e7691c9731c88de71aa57f84b6c2 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 3 Jan 2018 11:13:54 +0100
|
||||
Subject: [PATCH] platform/x86: dell-laptop: Filter out spurious keyboard
|
||||
backlight change events
|
||||
|
||||
On some Dell XPS models WMI events of type 0x0000 reporting a keycode of
|
||||
0xe00c get reported when the brightness of the LCD panel changes.
|
||||
|
||||
This leads to us reporting false-positive kbd_led change events to
|
||||
userspace which in turn leads to the kbd backlight OSD showing when it
|
||||
should not.
|
||||
|
||||
We already read the current keyboard backlight brightness value when
|
||||
reporting events because the led_classdev_notify_brightness_hw_changed
|
||||
API requires this. Compare this value to the last known value and filter
|
||||
out duplicate events, fixing this.
|
||||
|
||||
Note the fixed issue is esp. a problem on XPS models with an ambient light
|
||||
sensor and automatic brightness adjustments turned on, this causes the kbd
|
||||
backlight OSD to show all the time there.
|
||||
|
||||
BugLink: https://bugzilla.redhat.com/show_bug.cgi?id=1514969
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/platform/x86/dell-laptop.c | 24 ++++++++++++++++++++++--
|
||||
1 file changed, 22 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/platform/x86/dell-laptop.c b/drivers/platform/x86/dell-laptop.c
|
||||
index cd4725e7e0b5..2ef3297a9efc 100644
|
||||
--- a/drivers/platform/x86/dell-laptop.c
|
||||
+++ b/drivers/platform/x86/dell-laptop.c
|
||||
@@ -1133,6 +1133,7 @@ static u8 kbd_previous_mode_bit;
|
||||
|
||||
static bool kbd_led_present;
|
||||
static DEFINE_MUTEX(kbd_led_mutex);
|
||||
+static enum led_brightness kbd_led_level;
|
||||
|
||||
/*
|
||||
* NOTE: there are three ways to set the keyboard backlight level.
|
||||
@@ -1947,6 +1948,7 @@ static enum led_brightness kbd_led_level_get(struct led_classdev *led_cdev)
|
||||
static int kbd_led_level_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness value)
|
||||
{
|
||||
+ enum led_brightness new_value = value;
|
||||
struct kbd_state state;
|
||||
struct kbd_state new_state;
|
||||
u16 num;
|
||||
@@ -1976,6 +1978,9 @@ static int kbd_led_level_set(struct led_classdev *led_cdev,
|
||||
}
|
||||
|
||||
out:
|
||||
+ if (ret == 0)
|
||||
+ kbd_led_level = new_value;
|
||||
+
|
||||
mutex_unlock(&kbd_led_mutex);
|
||||
return ret;
|
||||
}
|
||||
@@ -2003,6 +2008,9 @@ static int __init kbd_led_init(struct device *dev)
|
||||
if (kbd_led.max_brightness)
|
||||
kbd_led.max_brightness--;
|
||||
}
|
||||
+
|
||||
+ kbd_led_level = kbd_led_level_get(NULL);
|
||||
+
|
||||
ret = led_classdev_register(dev, &kbd_led);
|
||||
if (ret)
|
||||
kbd_led_present = false;
|
||||
@@ -2027,13 +2035,25 @@ static void kbd_led_exit(void)
|
||||
static int dell_laptop_notifier_call(struct notifier_block *nb,
|
||||
unsigned long action, void *data)
|
||||
{
|
||||
+ bool changed = false;
|
||||
+ enum led_brightness new_kbd_led_level;
|
||||
+
|
||||
switch (action) {
|
||||
case DELL_LAPTOP_KBD_BACKLIGHT_BRIGHTNESS_CHANGED:
|
||||
if (!kbd_led_present)
|
||||
break;
|
||||
|
||||
- led_classdev_notify_brightness_hw_changed(&kbd_led,
|
||||
- kbd_led_level_get(&kbd_led));
|
||||
+ mutex_lock(&kbd_led_mutex);
|
||||
+ new_kbd_led_level = kbd_led_level_get(&kbd_led);
|
||||
+ if (kbd_led_level != new_kbd_led_level) {
|
||||
+ kbd_led_level = new_kbd_led_level;
|
||||
+ changed = true;
|
||||
+ }
|
||||
+ mutex_unlock(&kbd_led_mutex);
|
||||
+
|
||||
+ if (changed)
|
||||
+ led_classdev_notify_brightness_hw_changed(&kbd_led,
|
||||
+ kbd_led_level);
|
||||
break;
|
||||
}
|
||||
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,130 +0,0 @@
|
||||
From 318aaf34f1179b39fa9c30fa0f3288b645beee39 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Yan <yanaijie@huawei.com>
|
||||
Date: Thu, 8 Mar 2018 10:34:53 +0800
|
||||
Subject: [PATCH] scsi: libsas: defer ata device eh commands to libata
|
||||
|
||||
When ata device doing EH, some commands still attached with tasks are
|
||||
not passed to libata when abort failed or recover failed, so libata did
|
||||
not handle these commands. After these commands done, sas task is freed,
|
||||
but ata qc is not freed. This will cause ata qc leak and trigger a
|
||||
warning like below:
|
||||
|
||||
WARNING: CPU: 0 PID: 28512 at drivers/ata/libata-eh.c:4037
|
||||
ata_eh_finish+0xb4/0xcc
|
||||
CPU: 0 PID: 28512 Comm: kworker/u32:2 Tainted: G W OE 4.14.0#1
|
||||
......
|
||||
Call trace:
|
||||
[<ffff0000088b7bd0>] ata_eh_finish+0xb4/0xcc
|
||||
[<ffff0000088b8420>] ata_do_eh+0xc4/0xd8
|
||||
[<ffff0000088b8478>] ata_std_error_handler+0x44/0x8c
|
||||
[<ffff0000088b8068>] ata_scsi_port_error_handler+0x480/0x694
|
||||
[<ffff000008875fc4>] async_sas_ata_eh+0x4c/0x80
|
||||
[<ffff0000080f6be8>] async_run_entry_fn+0x4c/0x170
|
||||
[<ffff0000080ebd70>] process_one_work+0x144/0x390
|
||||
[<ffff0000080ec100>] worker_thread+0x144/0x418
|
||||
[<ffff0000080f2c98>] kthread+0x10c/0x138
|
||||
[<ffff0000080855dc>] ret_from_fork+0x10/0x18
|
||||
|
||||
If ata qc leaked too many, ata tag allocation will fail and io blocked
|
||||
for ever.
|
||||
|
||||
As suggested by Dan Williams, defer ata device commands to libata and
|
||||
merge sas_eh_finish_cmd() with sas_eh_defer_cmd(). libata will handle
|
||||
ata qcs correctly after this.
|
||||
|
||||
Signed-off-by: Jason Yan <yanaijie@huawei.com>
|
||||
CC: Xiaofei Tan <tanxiaofei@huawei.com>
|
||||
CC: John Garry <john.garry@huawei.com>
|
||||
CC: Dan Williams <dan.j.williams@intel.com>
|
||||
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
|
||||
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
---
|
||||
drivers/scsi/libsas/sas_scsi_host.c | 33 +++++++++++++--------------------
|
||||
1 file changed, 13 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/scsi/libsas/sas_scsi_host.c b/drivers/scsi/libsas/sas_scsi_host.c
|
||||
index 626727207889..a372af68d9a9 100644
|
||||
--- a/drivers/scsi/libsas/sas_scsi_host.c
|
||||
+++ b/drivers/scsi/libsas/sas_scsi_host.c
|
||||
@@ -223,6 +223,7 @@ int sas_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
|
||||
static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
|
||||
{
|
||||
struct sas_ha_struct *sas_ha = SHOST_TO_SAS_HA(cmd->device->host);
|
||||
+ struct domain_device *dev = cmd_to_domain_dev(cmd);
|
||||
struct sas_task *task = TO_SAS_TASK(cmd);
|
||||
|
||||
/* At this point, we only get called following an actual abort
|
||||
@@ -231,6 +232,14 @@ static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
|
||||
*/
|
||||
sas_end_task(cmd, task);
|
||||
|
||||
+ if (dev_is_sata(dev)) {
|
||||
+ /* defer commands to libata so that libata EH can
|
||||
+ * handle ata qcs correctly
|
||||
+ */
|
||||
+ list_move_tail(&cmd->eh_entry, &sas_ha->eh_ata_q);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
/* now finish the command and move it on to the error
|
||||
* handler done list, this also takes it off the
|
||||
* error handler pending list.
|
||||
@@ -238,22 +247,6 @@ static void sas_eh_finish_cmd(struct scsi_cmnd *cmd)
|
||||
scsi_eh_finish_cmd(cmd, &sas_ha->eh_done_q);
|
||||
}
|
||||
|
||||
-static void sas_eh_defer_cmd(struct scsi_cmnd *cmd)
|
||||
-{
|
||||
- struct domain_device *dev = cmd_to_domain_dev(cmd);
|
||||
- struct sas_ha_struct *ha = dev->port->ha;
|
||||
- struct sas_task *task = TO_SAS_TASK(cmd);
|
||||
-
|
||||
- if (!dev_is_sata(dev)) {
|
||||
- sas_eh_finish_cmd(cmd);
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- /* report the timeout to libata */
|
||||
- sas_end_task(cmd, task);
|
||||
- list_move_tail(&cmd->eh_entry, &ha->eh_ata_q);
|
||||
-}
|
||||
-
|
||||
static void sas_scsi_clear_queue_lu(struct list_head *error_q, struct scsi_cmnd *my_cmd)
|
||||
{
|
||||
struct scsi_cmnd *cmd, *n;
|
||||
@@ -261,7 +254,7 @@ static void sas_scsi_clear_queue_lu(struct list_head *error_q, struct scsi_cmnd
|
||||
list_for_each_entry_safe(cmd, n, error_q, eh_entry) {
|
||||
if (cmd->device->sdev_target == my_cmd->device->sdev_target &&
|
||||
cmd->device->lun == my_cmd->device->lun)
|
||||
- sas_eh_defer_cmd(cmd);
|
||||
+ sas_eh_finish_cmd(cmd);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -618,12 +611,12 @@ static void sas_eh_handle_sas_errors(struct Scsi_Host *shost, struct list_head *
|
||||
case TASK_IS_DONE:
|
||||
SAS_DPRINTK("%s: task 0x%p is done\n", __func__,
|
||||
task);
|
||||
- sas_eh_defer_cmd(cmd);
|
||||
+ sas_eh_finish_cmd(cmd);
|
||||
continue;
|
||||
case TASK_IS_ABORTED:
|
||||
SAS_DPRINTK("%s: task 0x%p is aborted\n",
|
||||
__func__, task);
|
||||
- sas_eh_defer_cmd(cmd);
|
||||
+ sas_eh_finish_cmd(cmd);
|
||||
continue;
|
||||
case TASK_IS_AT_LU:
|
||||
SAS_DPRINTK("task 0x%p is at LU: lu recover\n", task);
|
||||
@@ -634,7 +627,7 @@ static void sas_eh_handle_sas_errors(struct Scsi_Host *shost, struct list_head *
|
||||
"recovered\n",
|
||||
SAS_ADDR(task->dev),
|
||||
cmd->device->lun);
|
||||
- sas_eh_defer_cmd(cmd);
|
||||
+ sas_eh_finish_cmd(cmd);
|
||||
sas_scsi_clear_queue_lu(work_q, cmd);
|
||||
goto Again;
|
||||
}
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,299 +0,0 @@
|
||||
From f66d69bd8357b59268f2adfd1c0c53b6d1dab453 Mon Sep 17 00:00:00 2001
|
||||
From: Jason Yan <yanaijie@huawei.com>
|
||||
Date: Fri, 8 Dec 2017 17:42:09 +0800
|
||||
Subject: [PATCH] scsi: libsas: direct call probe and destruct
|
||||
|
||||
In commit 87c8331fcf72 ("[SCSI] libsas: prevent domain rediscovery
|
||||
competing with ata error handling") introduced disco mutex to prevent
|
||||
rediscovery competing with ata error handling and put the whole
|
||||
revalidation in the mutex. But the rphy add/remove needs to wait for the
|
||||
error handling which also grabs the disco mutex. This may leads to dead
|
||||
lock.So the probe and destruct event were introduce to do the rphy
|
||||
add/remove asynchronously and out of the lock.
|
||||
|
||||
The asynchronously processed workers makes the whole discovery process
|
||||
not atomic, the other events may interrupt the process. For example,
|
||||
if a loss of signal event inserted before the probe event, the
|
||||
sas_deform_port() is called and the port will be deleted.
|
||||
|
||||
And sas_port_delete() may run before the destruct event, but the
|
||||
port-x:x is the top parent of end device or expander. This leads to
|
||||
a kernel WARNING such as:
|
||||
|
||||
[ 82.042979] sysfs group 'power' not found for kobject 'phy-1:0:22'
|
||||
[ 82.042983] ------------[ cut here ]------------
|
||||
[ 82.042986] WARNING: CPU: 54 PID: 1714 at fs/sysfs/group.c:237
|
||||
sysfs_remove_group+0x94/0xa0
|
||||
[ 82.043059] Call trace:
|
||||
[ 82.043082] [<ffff0000082e7624>] sysfs_remove_group+0x94/0xa0
|
||||
[ 82.043085] [<ffff00000864e320>] dpm_sysfs_remove+0x60/0x70
|
||||
[ 82.043086] [<ffff00000863ee10>] device_del+0x138/0x308
|
||||
[ 82.043089] [<ffff00000869a2d0>] sas_phy_delete+0x38/0x60
|
||||
[ 82.043091] [<ffff00000869a86c>] do_sas_phy_delete+0x6c/0x80
|
||||
[ 82.043093] [<ffff00000863dc20>] device_for_each_child+0x58/0xa0
|
||||
[ 82.043095] [<ffff000008696f80>] sas_remove_children+0x40/0x50
|
||||
[ 82.043100] [<ffff00000869d1bc>] sas_destruct_devices+0x64/0xa0
|
||||
[ 82.043102] [<ffff0000080e93bc>] process_one_work+0x1fc/0x4b0
|
||||
[ 82.043104] [<ffff0000080e96c0>] worker_thread+0x50/0x490
|
||||
[ 82.043105] [<ffff0000080f0364>] kthread+0xfc/0x128
|
||||
[ 82.043107] [<ffff0000080836c0>] ret_from_fork+0x10/0x50
|
||||
|
||||
Make probe and destruct a direct call in the disco and revalidate function,
|
||||
but put them outside the lock. The whole discovery or revalidate won't
|
||||
be interrupted by other events. And the DISCE_PROBE and DISCE_DESTRUCT
|
||||
event are deleted as a result of the direct call.
|
||||
|
||||
Introduce a new list to destruct the sas_port and put the port delete after
|
||||
the destruct. This makes sure the right order of destroying the sysfs
|
||||
kobject and fix the warning above.
|
||||
|
||||
In sas_ex_revalidate_domain() have a loop to find all broadcasted
|
||||
device, and sometimes we have a chance to find the same expander twice.
|
||||
Because the sas_port will be deleted at the end of the whole revalidate
|
||||
process, sas_port with the same name cannot be added before this.
|
||||
Otherwise the sysfs will complain of creating duplicate filename. Since
|
||||
the LLDD will send broadcast for every device change, we can only
|
||||
process one expander's revalidation.
|
||||
|
||||
[mkp: kbuild test robot warning]
|
||||
|
||||
Signed-off-by: Jason Yan <yanaijie@huawei.com>
|
||||
CC: John Garry <john.garry@huawei.com>
|
||||
CC: Johannes Thumshirn <jthumshirn@suse.de>
|
||||
CC: Ewan Milne <emilne@redhat.com>
|
||||
CC: Christoph Hellwig <hch@lst.de>
|
||||
CC: Tomas Henzl <thenzl@redhat.com>
|
||||
CC: Dan Williams <dan.j.williams@intel.com>
|
||||
Reviewed-by: Hannes Reinecke <hare@suse.com>
|
||||
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
|
||||
---
|
||||
drivers/scsi/libsas/sas_ata.c | 1 -
|
||||
drivers/scsi/libsas/sas_discover.c | 32 ++++++++++++++++++--------------
|
||||
drivers/scsi/libsas/sas_expander.c | 8 +++-----
|
||||
drivers/scsi/libsas/sas_internal.h | 1 +
|
||||
drivers/scsi/libsas/sas_port.c | 3 +++
|
||||
include/scsi/libsas.h | 3 +--
|
||||
include/scsi/scsi_transport_sas.h | 1 +
|
||||
7 files changed, 27 insertions(+), 22 deletions(-)
|
||||
|
||||
diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
|
||||
index 70be4425ae0b..2b3637b40dde 100644
|
||||
--- a/drivers/scsi/libsas/sas_ata.c
|
||||
+++ b/drivers/scsi/libsas/sas_ata.c
|
||||
@@ -730,7 +730,6 @@ int sas_discover_sata(struct domain_device *dev)
|
||||
if (res)
|
||||
return res;
|
||||
|
||||
- sas_discover_event(dev->port, DISCE_PROBE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/drivers/scsi/libsas/sas_discover.c b/drivers/scsi/libsas/sas_discover.c
|
||||
index 60de66252fa2..487d7345f515 100644
|
||||
--- a/drivers/scsi/libsas/sas_discover.c
|
||||
+++ b/drivers/scsi/libsas/sas_discover.c
|
||||
@@ -212,13 +212,9 @@ void sas_notify_lldd_dev_gone(struct domain_device *dev)
|
||||
}
|
||||
}
|
||||
|
||||
-static void sas_probe_devices(struct work_struct *work)
|
||||
+static void sas_probe_devices(struct asd_sas_port *port)
|
||||
{
|
||||
struct domain_device *dev, *n;
|
||||
- struct sas_discovery_event *ev = to_sas_discovery_event(work);
|
||||
- struct asd_sas_port *port = ev->port;
|
||||
-
|
||||
- clear_bit(DISCE_PROBE, &port->disc.pending);
|
||||
|
||||
/* devices must be domain members before link recovery and probe */
|
||||
list_for_each_entry(dev, &port->disco_list, disco_list_node) {
|
||||
@@ -294,7 +290,6 @@ int sas_discover_end_dev(struct domain_device *dev)
|
||||
res = sas_notify_lldd_dev_found(dev);
|
||||
if (res)
|
||||
return res;
|
||||
- sas_discover_event(dev->port, DISCE_PROBE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -353,13 +348,9 @@ static void sas_unregister_common_dev(struct asd_sas_port *port, struct domain_d
|
||||
sas_put_device(dev);
|
||||
}
|
||||
|
||||
-static void sas_destruct_devices(struct work_struct *work)
|
||||
+void sas_destruct_devices(struct asd_sas_port *port)
|
||||
{
|
||||
struct domain_device *dev, *n;
|
||||
- struct sas_discovery_event *ev = to_sas_discovery_event(work);
|
||||
- struct asd_sas_port *port = ev->port;
|
||||
-
|
||||
- clear_bit(DISCE_DESTRUCT, &port->disc.pending);
|
||||
|
||||
list_for_each_entry_safe(dev, n, &port->destroy_list, disco_list_node) {
|
||||
list_del_init(&dev->disco_list_node);
|
||||
@@ -370,6 +361,16 @@ static void sas_destruct_devices(struct work_struct *work)
|
||||
}
|
||||
}
|
||||
|
||||
+static void sas_destruct_ports(struct asd_sas_port *port)
|
||||
+{
|
||||
+ struct sas_port *sas_port, *p;
|
||||
+
|
||||
+ list_for_each_entry_safe(sas_port, p, &port->sas_port_del_list, del_list) {
|
||||
+ list_del_init(&sas_port->del_list);
|
||||
+ sas_port_delete(sas_port);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
|
||||
{
|
||||
if (!test_bit(SAS_DEV_DESTROY, &dev->state) &&
|
||||
@@ -384,7 +385,6 @@ void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *dev)
|
||||
if (!test_and_set_bit(SAS_DEV_DESTROY, &dev->state)) {
|
||||
sas_rphy_unlink(dev->rphy);
|
||||
list_move_tail(&dev->disco_list_node, &port->destroy_list);
|
||||
- sas_discover_event(dev->port, DISCE_DESTRUCT);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -490,6 +490,8 @@ static void sas_discover_domain(struct work_struct *work)
|
||||
port->port_dev = NULL;
|
||||
}
|
||||
|
||||
+ sas_probe_devices(port);
|
||||
+
|
||||
SAS_DPRINTK("DONE DISCOVERY on port %d, pid:%d, result:%d\n", port->id,
|
||||
task_pid_nr(current), error);
|
||||
}
|
||||
@@ -523,6 +525,10 @@ static void sas_revalidate_domain(struct work_struct *work)
|
||||
port->id, task_pid_nr(current), res);
|
||||
out:
|
||||
mutex_unlock(&ha->disco_mutex);
|
||||
+
|
||||
+ sas_destruct_devices(port);
|
||||
+ sas_destruct_ports(port);
|
||||
+ sas_probe_devices(port);
|
||||
}
|
||||
|
||||
/* ---------- Events ---------- */
|
||||
@@ -578,10 +584,8 @@ void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *port)
|
||||
static const work_func_t sas_event_fns[DISC_NUM_EVENTS] = {
|
||||
[DISCE_DISCOVER_DOMAIN] = sas_discover_domain,
|
||||
[DISCE_REVALIDATE_DOMAIN] = sas_revalidate_domain,
|
||||
- [DISCE_PROBE] = sas_probe_devices,
|
||||
[DISCE_SUSPEND] = sas_suspend_devices,
|
||||
[DISCE_RESUME] = sas_resume_devices,
|
||||
- [DISCE_DESTRUCT] = sas_destruct_devices,
|
||||
};
|
||||
|
||||
disc->pending = 0;
|
||||
diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c
|
||||
index 39e42744aa33..6a4f8198b78e 100644
|
||||
--- a/drivers/scsi/libsas/sas_expander.c
|
||||
+++ b/drivers/scsi/libsas/sas_expander.c
|
||||
@@ -1916,7 +1916,8 @@ static void sas_unregister_devs_sas_addr(struct domain_device *parent,
|
||||
sas_port_delete_phy(phy->port, phy->phy);
|
||||
sas_device_set_phy(found, phy->port);
|
||||
if (phy->port->num_phys == 0)
|
||||
- sas_port_delete(phy->port);
|
||||
+ list_add_tail(&phy->port->del_list,
|
||||
+ &parent->port->sas_port_del_list);
|
||||
phy->port = NULL;
|
||||
}
|
||||
}
|
||||
@@ -2124,7 +2125,7 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev)
|
||||
struct domain_device *dev = NULL;
|
||||
|
||||
res = sas_find_bcast_dev(port_dev, &dev);
|
||||
- while (res == 0 && dev) {
|
||||
+ if (res == 0 && dev) {
|
||||
struct expander_device *ex = &dev->ex_dev;
|
||||
int i = 0, phy_id;
|
||||
|
||||
@@ -2136,9 +2137,6 @@ int sas_ex_revalidate_domain(struct domain_device *port_dev)
|
||||
res = sas_rediscover(dev, phy_id);
|
||||
i = phy_id + 1;
|
||||
} while (i < ex->num_phys);
|
||||
-
|
||||
- dev = NULL;
|
||||
- res = sas_find_bcast_dev(port_dev, &dev);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
diff --git a/drivers/scsi/libsas/sas_internal.h b/drivers/scsi/libsas/sas_internal.h
|
||||
index d8826a747690..50e12d662ffe 100644
|
||||
--- a/drivers/scsi/libsas/sas_internal.h
|
||||
+++ b/drivers/scsi/libsas/sas_internal.h
|
||||
@@ -101,6 +101,7 @@ int sas_try_ata_reset(struct asd_sas_phy *phy);
|
||||
void sas_hae_reset(struct work_struct *work);
|
||||
|
||||
void sas_free_device(struct kref *kref);
|
||||
+void sas_destruct_devices(struct asd_sas_port *port);
|
||||
|
||||
extern const work_func_t sas_phy_event_fns[PHY_NUM_EVENTS];
|
||||
extern const work_func_t sas_port_event_fns[PORT_NUM_EVENTS];
|
||||
diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
|
||||
index 93266283f51f..170f5043e1df 100644
|
||||
--- a/drivers/scsi/libsas/sas_port.c
|
||||
+++ b/drivers/scsi/libsas/sas_port.c
|
||||
@@ -66,6 +66,7 @@ static void sas_resume_port(struct asd_sas_phy *phy)
|
||||
rc = sas_notify_lldd_dev_found(dev);
|
||||
if (rc) {
|
||||
sas_unregister_dev(port, dev);
|
||||
+ sas_destruct_devices(port);
|
||||
continue;
|
||||
}
|
||||
|
||||
@@ -219,6 +220,7 @@ void sas_deform_port(struct asd_sas_phy *phy, int gone)
|
||||
|
||||
if (port->num_phys == 1) {
|
||||
sas_unregister_domain_devices(port, gone);
|
||||
+ sas_destruct_devices(port);
|
||||
sas_port_delete(port->port);
|
||||
port->port = NULL;
|
||||
} else {
|
||||
@@ -313,6 +315,7 @@ static void sas_init_port(struct asd_sas_port *port,
|
||||
INIT_LIST_HEAD(&port->dev_list);
|
||||
INIT_LIST_HEAD(&port->disco_list);
|
||||
INIT_LIST_HEAD(&port->destroy_list);
|
||||
+ INIT_LIST_HEAD(&port->sas_port_del_list);
|
||||
spin_lock_init(&port->phy_list_lock);
|
||||
INIT_LIST_HEAD(&port->phy_list);
|
||||
port->ha = sas_ha;
|
||||
diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h
|
||||
index 61c84d536a7e..38fa2f677cf2 100644
|
||||
--- a/include/scsi/libsas.h
|
||||
+++ b/include/scsi/libsas.h
|
||||
@@ -81,10 +81,8 @@ enum phy_event {
|
||||
enum discover_event {
|
||||
DISCE_DISCOVER_DOMAIN = 0U,
|
||||
DISCE_REVALIDATE_DOMAIN,
|
||||
- DISCE_PROBE,
|
||||
DISCE_SUSPEND,
|
||||
DISCE_RESUME,
|
||||
- DISCE_DESTRUCT,
|
||||
DISC_NUM_EVENTS,
|
||||
};
|
||||
|
||||
@@ -261,6 +259,7 @@ struct asd_sas_port {
|
||||
struct list_head dev_list;
|
||||
struct list_head disco_list;
|
||||
struct list_head destroy_list;
|
||||
+ struct list_head sas_port_del_list;
|
||||
enum sas_linkrate linkrate;
|
||||
|
||||
struct sas_work work;
|
||||
diff --git a/include/scsi/scsi_transport_sas.h b/include/scsi/scsi_transport_sas.h
|
||||
index 62895b405933..05ec927a3c72 100644
|
||||
--- a/include/scsi/scsi_transport_sas.h
|
||||
+++ b/include/scsi/scsi_transport_sas.h
|
||||
@@ -156,6 +156,7 @@ struct sas_port {
|
||||
|
||||
struct mutex phy_list_mutex;
|
||||
struct list_head phy_list;
|
||||
+ struct list_head del_list; /* libsas only */
|
||||
};
|
||||
|
||||
#define dev_to_sas_port(d) \
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,41 +0,0 @@
|
||||
From 7c80f9e4a588f1925b07134bb2e3689335f6c6d8 Mon Sep 17 00:00:00 2001
|
||||
From: Alan Stern <stern@rowland.harvard.edu>
|
||||
Date: Fri, 29 Sep 2017 10:54:24 -0400
|
||||
Subject: [PATCH] usb: usbtest: fix NULL pointer dereference
|
||||
|
||||
If the usbtest driver encounters a device with an IN bulk endpoint but
|
||||
no OUT bulk endpoint, it will try to dereference a NULL pointer
|
||||
(out->desc.bEndpointAddress). The problem can be solved by adding a
|
||||
missing test.
|
||||
|
||||
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
|
||||
Reported-by: Andrey Konovalov <andreyknvl@google.com>
|
||||
Tested-by: Andrey Konovalov <andreyknvl@google.com>
|
||||
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
||||
---
|
||||
drivers/usb/misc/usbtest.c | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c
|
||||
index 113e38bfe0ef..b3fc602b2e24 100644
|
||||
--- a/drivers/usb/misc/usbtest.c
|
||||
+++ b/drivers/usb/misc/usbtest.c
|
||||
@@ -202,12 +202,13 @@ get_endpoints(struct usbtest_dev *dev, struct usb_interface *intf)
|
||||
return tmp;
|
||||
}
|
||||
|
||||
- if (in) {
|
||||
+ if (in)
|
||||
dev->in_pipe = usb_rcvbulkpipe(udev,
|
||||
in->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
|
||||
+ if (out)
|
||||
dev->out_pipe = usb_sndbulkpipe(udev,
|
||||
out->desc.bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
|
||||
- }
|
||||
+
|
||||
if (iso_in) {
|
||||
dev->iso_in = &iso_in->desc;
|
||||
dev->in_iso_pipe = usb_rcvisocpipe(udev,
|
||||
--
|
||||
2.13.6
|
||||
|
@ -1,78 +0,0 @@
|
||||
From 1719566899e5a69b4ba767beb07dab7ceb9ae5a8 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Wed, 22 Nov 2017 12:57:10 +0100
|
||||
Subject: [PATCH v2 3/3] HID: multitouch: Combine all left-button events in a
|
||||
frame
|
||||
|
||||
According to the Win8 Precision Touchpad spec, inside the HID_UP_BUTTON
|
||||
usage-page usage 1 is for a clickpad getting clicked, 2 for an external
|
||||
left button and 3 for an external right button. Since Linux uses
|
||||
BTN_LEFT for a clickpad being clicked we end up mapping both usage 1
|
||||
and 2 to BTN_LEFT and if a single report contains both then we ended
|
||||
up always reporting the value of both in a single SYN, e.g. :
|
||||
BTN_LEFT 1, BTN_LEFT 0, SYN. This happens for example with Hantick
|
||||
HTT5288 i2c mt touchpads.
|
||||
|
||||
This commit fixes this by not immediately reporting left button when we
|
||||
parse the report, but instead storing or-ing together the values and
|
||||
reporting the result from mt_sync_frame() when we've a complete frame.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-multitouch.c | 20 ++++++++++++++++++++
|
||||
1 file changed, 20 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
||||
index 760c4a042e6a..76088f2cf598 100644
|
||||
--- a/drivers/hid/hid-multitouch.c
|
||||
+++ b/drivers/hid/hid-multitouch.c
|
||||
@@ -122,6 +122,7 @@ struct mt_device {
|
||||
int scantime_index; /* scantime field index in the report */
|
||||
int scantime_val_index; /* scantime value index in the field */
|
||||
int prev_scantime; /* scantime reported in the previous packet */
|
||||
+ int left_button_state; /* left button state */
|
||||
unsigned last_slot_field; /* the last field of a slot */
|
||||
unsigned mt_report_id; /* the report ID of the multitouch device */
|
||||
unsigned long initial_quirks; /* initial quirks state */
|
||||
@@ -743,10 +744,16 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input)
|
||||
*/
|
||||
static void mt_sync_frame(struct mt_device *td, struct input_dev *input)
|
||||
{
|
||||
+ __s32 cls = td->mtclass.name;
|
||||
+
|
||||
+ if (cls == MT_CLS_WIN_8 || cls == MT_CLS_WIN_8_DUAL)
|
||||
+ input_event(input, EV_KEY, BTN_LEFT, td->left_button_state);
|
||||
+
|
||||
input_mt_sync_frame(input);
|
||||
input_event(input, EV_MSC, MSC_TIMESTAMP, td->timestamp);
|
||||
input_sync(input);
|
||||
td->num_received = 0;
|
||||
+ td->left_button_state = 0;
|
||||
if (test_bit(MT_IO_FLAGS_ACTIVE_SLOTS, &td->mt_io_flags))
|
||||
set_bit(MT_IO_FLAGS_PENDING_SLOTS, &td->mt_io_flags);
|
||||
else
|
||||
@@ -857,6 +864,19 @@ static void mt_process_mt_event(struct hid_device *hid, struct hid_field *field,
|
||||
!first_packet)
|
||||
return;
|
||||
|
||||
+ /*
|
||||
+ * For Win8 PTP touchpads we map both the clickpad click
|
||||
+ * and any "external" left buttons to BTN_LEFT if a
|
||||
+ * device claims to have both we need to report 1 for
|
||||
+ * BTN_LEFT if either is pressed, so we or all values
|
||||
+ * together and report the result in mt_sync_frame().
|
||||
+ */
|
||||
+ if ((cls == MT_CLS_WIN_8 || cls == MT_CLS_WIN_8_DUAL) &&
|
||||
+ usage->type == EV_KEY && usage->code == BTN_LEFT) {
|
||||
+ td->left_button_state |= value;
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
if (usage->type)
|
||||
input_event(input, usage->type, usage->code,
|
||||
value);
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,270 +0,0 @@
|
||||
From 65cca10ce92fb738b183152f1c1096b82e47923d Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Mon, 27 Nov 2017 15:32:01 +0100
|
||||
Subject: [PATCH] ahci: Allow setting a default LPM policy for mobile chipsets
|
||||
|
||||
On many laptops setting a different LPM policy then unknown /
|
||||
max_performance can lead to power-savings of 1.0 - 1.5 Watts (when idle).
|
||||
|
||||
Modern ultrabooks idle around 6W (at 50% screen brightness), 1.0 - 1.5W
|
||||
is a significant chunk of this.
|
||||
|
||||
There are some performance / latency costs to enabling LPM by default,
|
||||
so it is desirable to make it possible to set a different LPM policy
|
||||
for mobile / laptop variants of chipsets / "South Bridges" vs their
|
||||
desktop / server counterparts. Also enabling LPM by default is not
|
||||
entirely without risk of regressions. At least min_power is known to
|
||||
cause issues with some disks, including some reports of data corruption.
|
||||
|
||||
This commits adds a new ahci.mobile_lpm_policy kernel cmdline option,
|
||||
which defaults to a new SATA_MOBILE_LPM_POLICY Kconfig option so that
|
||||
Linux distributions can choose to set a LPM policy for mobile chipsets
|
||||
by default.
|
||||
|
||||
The reason to have both a kernel cmdline option and a Kconfig default
|
||||
value for it, is to allow easy overriding of the default to allow
|
||||
trouble-shooting without needing to rebuild the kernel.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/ata/Kconfig | 19 +++++++++++
|
||||
drivers/ata/ahci.c | 97 +++++++++++++++++++++++++++++++----------------------
|
||||
drivers/ata/ahci.h | 3 ++
|
||||
3 files changed, 78 insertions(+), 41 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/Kconfig b/drivers/ata/Kconfig
|
||||
index cb5339166563..b3fad5663aeb 100644
|
||||
--- a/drivers/ata/Kconfig
|
||||
+++ b/drivers/ata/Kconfig
|
||||
@@ -92,6 +92,25 @@ config SATA_AHCI
|
||||
|
||||
If unsure, say N.
|
||||
|
||||
+config SATA_MOBILE_LPM_POLICY
|
||||
+ int "Default SATA Link Power Management policy for mobile chipsets"
|
||||
+ range 0 4
|
||||
+ default 0
|
||||
+ depends on SATA_AHCI
|
||||
+ help
|
||||
+ Select the Default SATA Link Power Management (LPM) policy to use
|
||||
+ for mobile / laptop variants of chipsets / "South Bridges".
|
||||
+
|
||||
+ The value set has the following meanings:
|
||||
+ 0 => Keep firmware settings
|
||||
+ 1 => Maximum performance
|
||||
+ 2 => Medium power
|
||||
+ 3 => Medium power with Device Initiated PM enabled
|
||||
+ 4 => Minimum power
|
||||
+
|
||||
+ Note "Minimum power" is known to cause issues, including disk
|
||||
+ corruption, with some disks and should not be used.
|
||||
+
|
||||
config SATA_AHCI_PLATFORM
|
||||
tristate "Platform AHCI SATA support"
|
||||
help
|
||||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||
index 44a9d630b7ac..355a95a83a34 100644
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -65,6 +65,7 @@ enum board_ids {
|
||||
/* board IDs by feature in alphabetical order */
|
||||
board_ahci,
|
||||
board_ahci_ign_iferr,
|
||||
+ board_ahci_mobile,
|
||||
board_ahci_nomsi,
|
||||
board_ahci_noncq,
|
||||
board_ahci_nosntf,
|
||||
@@ -140,6 +141,13 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
+ [board_ahci_mobile] = {
|
||||
+ AHCI_HFLAGS (AHCI_HFLAG_IS_MOBILE),
|
||||
+ .flags = AHCI_FLAG_COMMON,
|
||||
+ .pio_mask = ATA_PIO4,
|
||||
+ .udma_mask = ATA_UDMA6,
|
||||
+ .port_ops = &ahci_ops,
|
||||
+ },
|
||||
[board_ahci_nomsi] = {
|
||||
AHCI_HFLAGS (AHCI_HFLAG_NO_MSI),
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
@@ -252,13 +260,13 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x2924), board_ahci }, /* ICH9 */
|
||||
{ PCI_VDEVICE(INTEL, 0x2925), board_ahci }, /* ICH9 */
|
||||
{ PCI_VDEVICE(INTEL, 0x2927), board_ahci }, /* ICH9 */
|
||||
- { PCI_VDEVICE(INTEL, 0x2929), board_ahci }, /* ICH9M */
|
||||
- { PCI_VDEVICE(INTEL, 0x292a), board_ahci }, /* ICH9M */
|
||||
- { PCI_VDEVICE(INTEL, 0x292b), board_ahci }, /* ICH9M */
|
||||
- { PCI_VDEVICE(INTEL, 0x292c), board_ahci }, /* ICH9M */
|
||||
- { PCI_VDEVICE(INTEL, 0x292f), board_ahci }, /* ICH9M */
|
||||
+ { PCI_VDEVICE(INTEL, 0x2929), board_ahci_mobile }, /* ICH9M */
|
||||
+ { PCI_VDEVICE(INTEL, 0x292a), board_ahci_mobile }, /* ICH9M */
|
||||
+ { PCI_VDEVICE(INTEL, 0x292b), board_ahci_mobile }, /* ICH9M */
|
||||
+ { PCI_VDEVICE(INTEL, 0x292c), board_ahci_mobile }, /* ICH9M */
|
||||
+ { PCI_VDEVICE(INTEL, 0x292f), board_ahci_mobile }, /* ICH9M */
|
||||
{ PCI_VDEVICE(INTEL, 0x294d), board_ahci }, /* ICH9 */
|
||||
- { PCI_VDEVICE(INTEL, 0x294e), board_ahci }, /* ICH9M */
|
||||
+ { PCI_VDEVICE(INTEL, 0x294e), board_ahci_mobile }, /* ICH9M */
|
||||
{ PCI_VDEVICE(INTEL, 0x502a), board_ahci }, /* Tolapai */
|
||||
{ PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */
|
||||
{ PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
|
||||
@@ -268,9 +276,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x3b23), board_ahci }, /* PCH AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x3b25), board_ahci }, /* PCH RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x3b29), board_ahci }, /* PCH M AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x3b29), board_ahci_mobile }, /* PCH M AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci }, /* PCH M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_mobile }, /* PCH M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x19b0), board_ahci }, /* DNV AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x19b1), board_ahci }, /* DNV AHCI */
|
||||
@@ -293,9 +301,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x19cE), board_ahci }, /* DNV AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x19cF), board_ahci }, /* DNV AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1c02), board_ahci }, /* CPT AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x1c03), board_ahci }, /* CPT M AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_mobile }, /* CPT M AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1c04), board_ahci }, /* CPT RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x1c05), board_ahci }, /* CPT M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x1c05), board_ahci_mobile }, /* CPT M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1c06), board_ahci }, /* CPT RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1c07), board_ahci }, /* CPT RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1d02), board_ahci }, /* PBG AHCI */
|
||||
@@ -304,28 +312,28 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x2826), board_ahci }, /* PBG RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2323), board_ahci }, /* DH89xxCC AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1e02), board_ahci }, /* Panther Point AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x1e03), board_ahci }, /* Panther Point M AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x1e03), board_ahci_mobile }, /* Panther M AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1e04), board_ahci }, /* Panther Point RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1e05), board_ahci }, /* Panther Point RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1e06), board_ahci }, /* Panther Point RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x1e07), board_ahci }, /* Panther Point M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x1e07), board_ahci_mobile }, /* Panther M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1e0e), board_ahci }, /* Panther Point RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c02), board_ahci }, /* Lynx Point AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c03), board_ahci }, /* Lynx Point M AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c03), board_ahci_mobile }, /* Lynx M AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c04), board_ahci }, /* Lynx Point RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c05), board_ahci }, /* Lynx Point M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c05), board_ahci_mobile }, /* Lynx M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c06), board_ahci }, /* Lynx Point RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c07), board_ahci }, /* Lynx Point M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c07), board_ahci_mobile }, /* Lynx M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c0e), board_ahci }, /* Lynx Point RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci }, /* Lynx Point M RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c02), board_ahci }, /* Lynx Point-LP AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c03), board_ahci }, /* Lynx Point-LP AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c04), board_ahci }, /* Lynx Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c05), board_ahci }, /* Lynx Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c06), board_ahci }, /* Lynx Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c07), board_ahci }, /* Lynx Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci }, /* Lynx Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci }, /* Lynx Point-LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c0f), board_ahci_mobile }, /* Lynx M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c02), board_ahci_mobile }, /* Lynx LP AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c03), board_ahci_mobile }, /* Lynx LP AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c04), board_ahci_mobile }, /* Lynx LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c05), board_ahci_mobile }, /* Lynx LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c06), board_ahci_mobile }, /* Lynx LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c07), board_ahci_mobile }, /* Lynx LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c0e), board_ahci_mobile }, /* Lynx LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c0f), board_ahci_mobile }, /* Lynx LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x1f22), board_ahci }, /* Avoton AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1f23), board_ahci }, /* Avoton AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x1f24), board_ahci }, /* Avoton RAID */
|
||||
@@ -353,26 +361,26 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x8d66), board_ahci }, /* Wellsburg RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8d6e), board_ahci }, /* Wellsburg RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x23a3), board_ahci }, /* Coleto Creek AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c83), board_ahci }, /* Wildcat Point-LP AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c85), board_ahci }, /* Wildcat Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c87), board_ahci }, /* Wildcat Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci }, /* Wildcat Point-LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c83), board_ahci_mobile }, /* Wildcat LP AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c85), board_ahci_mobile }, /* Wildcat LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c87), board_ahci_mobile }, /* Wildcat LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9c8f), board_ahci_mobile }, /* Wildcat LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c82), board_ahci }, /* 9 Series AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c83), board_ahci }, /* 9 Series M AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c83), board_ahci_mobile }, /* 9 Series M AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c84), board_ahci }, /* 9 Series RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c85), board_ahci }, /* 9 Series M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c85), board_ahci_mobile }, /* 9 Series M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c86), board_ahci }, /* 9 Series RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c87), board_ahci }, /* 9 Series M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c87), board_ahci_mobile }, /* 9 Series M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x8c8e), board_ahci }, /* 9 Series RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci }, /* 9 Series M RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9d03), board_ahci }, /* Sunrise Point-LP AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x9d05), board_ahci }, /* Sunrise Point-LP RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x9d07), board_ahci }, /* Sunrise Point-LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x8c8f), board_ahci_mobile }, /* 9 Series M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9d03), board_ahci_mobile }, /* Sunrise LP AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9d05), board_ahci_mobile }, /* Sunrise LP RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0x9d07), board_ahci_mobile }, /* Sunrise LP RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa102), board_ahci }, /* Sunrise Point-H AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0xa103), board_ahci }, /* Sunrise Point-H M AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0xa103), board_ahci_mobile }, /* Sunrise M AHCI */
|
||||
{ PCI_VDEVICE(INTEL, 0xa105), board_ahci }, /* Sunrise Point-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa106), board_ahci }, /* Sunrise Point-H RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0xa107), board_ahci }, /* Sunrise Point-H M RAID */
|
||||
+ { PCI_VDEVICE(INTEL, 0xa107), board_ahci_mobile }, /* Sunrise M RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0xa10f), board_ahci }, /* Sunrise Point-H RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x2822), board_ahci }, /* Lewisburg RAID*/
|
||||
{ PCI_VDEVICE(INTEL, 0x2823), board_ahci }, /* Lewisburg AHCI*/
|
||||
@@ -387,10 +395,10 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0xa252), board_ahci }, /* Lewisburg RAID*/
|
||||
{ PCI_VDEVICE(INTEL, 0xa256), board_ahci }, /* Lewisburg RAID*/
|
||||
{ PCI_VDEVICE(INTEL, 0xa356), board_ahci }, /* Cannon Lake PCH-H RAID */
|
||||
- { PCI_VDEVICE(INTEL, 0x0f22), board_ahci }, /* Bay Trail AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x0f23), board_ahci }, /* Bay Trail AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x22a3), board_ahci }, /* Cherry Trail AHCI */
|
||||
- { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci }, /* Apollo Lake AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x0f22), board_ahci_mobile }, /* Bay Trail AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x0f23), board_ahci_mobile }, /* Bay Trail AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x22a3), board_ahci_mobile }, /* Cherry Tr. AHCI */
|
||||
+ { PCI_VDEVICE(INTEL, 0x5ae3), board_ahci_mobile }, /* ApolloLake AHCI */
|
||||
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
@@ -598,6 +606,9 @@ static int marvell_enable = 1;
|
||||
module_param(marvell_enable, int, 0644);
|
||||
MODULE_PARM_DESC(marvell_enable, "Marvell SATA via AHCI (1 = enabled)");
|
||||
|
||||
+static int mobile_lpm_policy = CONFIG_SATA_MOBILE_LPM_POLICY;
|
||||
+module_param(mobile_lpm_policy, int, 0644);
|
||||
+MODULE_PARM_DESC(mobile_lpm_policy, "Default LPM policy for mobile chipsets");
|
||||
|
||||
static void ahci_pci_save_initial_config(struct pci_dev *pdev,
|
||||
struct ahci_host_priv *hpriv)
|
||||
@@ -1733,6 +1744,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (ap->flags & ATA_FLAG_EM)
|
||||
ap->em_message_type = hpriv->em_msg_type;
|
||||
|
||||
+ if ((hpriv->flags & AHCI_HFLAG_IS_MOBILE) &&
|
||||
+ mobile_lpm_policy >= ATA_LPM_UNKNOWN &&
|
||||
+ mobile_lpm_policy <= ATA_LPM_MIN_POWER)
|
||||
+ ap->target_lpm_policy = mobile_lpm_policy;
|
||||
|
||||
/* disabled/not-implemented port */
|
||||
if (!(hpriv->port_map & (1 << i)))
|
||||
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
|
||||
index 749fd94441b0..a9d996e17d75 100644
|
||||
--- a/drivers/ata/ahci.h
|
||||
+++ b/drivers/ata/ahci.h
|
||||
@@ -251,6 +251,9 @@ enum {
|
||||
AHCI_HFLAG_YES_ALPM = (1 << 23), /* force ALPM cap on */
|
||||
AHCI_HFLAG_NO_WRITE_TO_RO = (1 << 24), /* don't write to read
|
||||
only registers */
|
||||
+ AHCI_HFLAG_IS_MOBILE = (1 << 25), /* mobile chipset, use
|
||||
+ SATA_MOBILE_LPM_POLICY
|
||||
+ as default lpm_policy */
|
||||
|
||||
/* ap->flags bits */
|
||||
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,114 +0,0 @@
|
||||
From 33fc16fd8aa3684e19b1d1f0a712593e2e570ab1 Mon Sep 17 00:00:00 2001
|
||||
From: Hans de Goede <hdegoede@redhat.com>
|
||||
Date: Sun, 11 Jun 2017 21:24:50 +0200
|
||||
Subject: [PATCH 10/16] Input: silead: Add support for capactive home button
|
||||
found on some x86 tablets
|
||||
|
||||
On some x86 tablets with a silead touchscreen the windows logo on the
|
||||
front is a capacitive home button. Touching this button results in a touch
|
||||
with bits 12-15 of the Y coordinates set, while normally only the lower 12
|
||||
are used.
|
||||
|
||||
Detect this and report a KEY_LEFTMETA press when this happens. Note for
|
||||
now we only respond to the Y coordinate bits 12-15 containing 0x01, on some
|
||||
tablets *without* a capacative button I've noticed these bits containing
|
||||
0x04 when crossing the edges of the screen.
|
||||
|
||||
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
|
||||
---
|
||||
drivers/input/touchscreen/silead.c | 45 ++++++++++++++++++++++++++++----------
|
||||
1 file changed, 34 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/input/touchscreen/silead.c b/drivers/input/touchscreen/silead.c
|
||||
index 0dbcf105f7db..c0ba40c09699 100644
|
||||
--- a/drivers/input/touchscreen/silead.c
|
||||
+++ b/drivers/input/touchscreen/silead.c
|
||||
@@ -56,7 +56,7 @@
|
||||
#define SILEAD_POINT_Y_MSB_OFF 0x01
|
||||
#define SILEAD_POINT_X_OFF 0x02
|
||||
#define SILEAD_POINT_X_MSB_OFF 0x03
|
||||
-#define SILEAD_TOUCH_ID_MASK 0xF0
|
||||
+#define SILEAD_EXTRA_DATA_MASK 0xF0
|
||||
|
||||
#define SILEAD_CMD_SLEEP_MIN 10000
|
||||
#define SILEAD_CMD_SLEEP_MAX 20000
|
||||
@@ -109,6 +109,8 @@ static int silead_ts_request_input_dev(struct silead_ts_data *data)
|
||||
INPUT_MT_DIRECT | INPUT_MT_DROP_UNUSED |
|
||||
INPUT_MT_TRACK);
|
||||
|
||||
+ input_set_capability(data->input, EV_KEY, KEY_LEFTMETA);
|
||||
+
|
||||
data->input->name = SILEAD_TS_NAME;
|
||||
data->input->phys = "input/ts";
|
||||
data->input->id.bustype = BUS_I2C;
|
||||
@@ -139,7 +141,8 @@ static void silead_ts_read_data(struct i2c_client *client)
|
||||
struct input_dev *input = data->input;
|
||||
struct device *dev = &client->dev;
|
||||
u8 *bufp, buf[SILEAD_TS_DATA_LEN];
|
||||
- int touch_nr, error, i;
|
||||
+ int touch_nr, softbutton, error, i;
|
||||
+ bool softbutton_pressed = false;
|
||||
|
||||
error = i2c_smbus_read_i2c_block_data(client, SILEAD_REG_DATA,
|
||||
SILEAD_TS_DATA_LEN, buf);
|
||||
@@ -148,21 +151,40 @@ static void silead_ts_read_data(struct i2c_client *client)
|
||||
return;
|
||||
}
|
||||
|
||||
- touch_nr = buf[0];
|
||||
- if (touch_nr > data->max_fingers) {
|
||||
+ if (buf[0] > data->max_fingers) {
|
||||
dev_warn(dev, "More touches reported then supported %d > %d\n",
|
||||
- touch_nr, data->max_fingers);
|
||||
- touch_nr = data->max_fingers;
|
||||
+ buf[0], data->max_fingers);
|
||||
+ buf[0] = data->max_fingers;
|
||||
}
|
||||
|
||||
+ touch_nr = 0;
|
||||
bufp = buf + SILEAD_POINT_DATA_LEN;
|
||||
- for (i = 0; i < touch_nr; i++, bufp += SILEAD_POINT_DATA_LEN) {
|
||||
- /* Bits 4-7 are the touch id */
|
||||
- data->id[i] = (bufp[SILEAD_POINT_X_MSB_OFF] &
|
||||
- SILEAD_TOUCH_ID_MASK) >> 4;
|
||||
- touchscreen_set_mt_pos(&data->pos[i], &data->prop,
|
||||
+ for (i = 0; i < buf[0]; i++, bufp += SILEAD_POINT_DATA_LEN) {
|
||||
+ softbutton = (bufp[SILEAD_POINT_Y_MSB_OFF] &
|
||||
+ SILEAD_EXTRA_DATA_MASK) >> 4;
|
||||
+
|
||||
+ if (softbutton) {
|
||||
+ /*
|
||||
+ * For now only respond to softbutton == 0x01, some
|
||||
+ * tablets *without* a capacative button send 0x04
|
||||
+ * when crossing the edges of the screen.
|
||||
+ */
|
||||
+ if (softbutton == 0x01)
|
||||
+ softbutton_pressed = true;
|
||||
+
|
||||
+ continue;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Bits 4-7 are the touch id, note not all models have
|
||||
+ * hardware touch ids so atm we don't use these.
|
||||
+ */
|
||||
+ data->id[touch_nr] = (bufp[SILEAD_POINT_X_MSB_OFF] &
|
||||
+ SILEAD_EXTRA_DATA_MASK) >> 4;
|
||||
+ touchscreen_set_mt_pos(&data->pos[touch_nr], &data->prop,
|
||||
get_unaligned_le16(&bufp[SILEAD_POINT_X_OFF]) & 0xfff,
|
||||
get_unaligned_le16(&bufp[SILEAD_POINT_Y_OFF]) & 0xfff);
|
||||
+ touch_nr++;
|
||||
}
|
||||
|
||||
input_mt_assign_slots(input, data->slots, data->pos, touch_nr, 0);
|
||||
@@ -178,6 +200,7 @@ static void silead_ts_read_data(struct i2c_client *client)
|
||||
}
|
||||
|
||||
input_mt_sync_frame(input);
|
||||
+ input_report_key(input, KEY_LEFTMETA, softbutton_pressed);
|
||||
input_sync(input);
|
||||
}
|
||||
|
||||
--
|
||||
2.13.0
|
||||
|
@ -1,41 +0,0 @@
|
||||
From patchwork Fri Jan 19 09:06:03 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: ACPI: sbshc: remove raw pointer from printk message
|
||||
From: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>
|
||||
X-Patchwork-Id: 10174835
|
||||
Message-Id: <20180119090603.GA7775@kroah.com>
|
||||
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>, Len Brown <lenb@kernel.org>
|
||||
Cc: linux-acpi@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
Wang Qize <wang_qize@venustech.com.cn>
|
||||
Date: Fri, 19 Jan 2018 10:06:03 +0100
|
||||
|
||||
There's no need to be printing a raw kernel pointer to the kernel log at
|
||||
every boot. So just remove it, and change the whole message to use the
|
||||
correct dev_info() call at the same time.
|
||||
|
||||
Reported-by: Wang Qize <wang_qize@venustech.com.cn>
|
||||
Cc: stable <stable@vger.kernel.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
Acked-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
---
|
||||
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
|
||||
the body of a message to majordomo@vger.kernel.org
|
||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
||||
|
||||
diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c
|
||||
index 2fa8304171e0..217e1caf58d6 100644
|
||||
--- a/drivers/acpi/sbshc.c
|
||||
+++ b/drivers/acpi/sbshc.c
|
||||
@@ -275,8 +275,8 @@ static int acpi_smbus_hc_add(struct acpi_device *device)
|
||||
device->driver_data = hc;
|
||||
|
||||
acpi_ec_add_query_handler(hc->ec, hc->query_bit, NULL, smbus_alarm, hc);
|
||||
- printk(KERN_INFO PREFIX "SBS HC: EC = 0x%p, offset = 0x%0x, query_bit = 0x%0x\n",
|
||||
- hc->ec, hc->offset, hc->query_bit);
|
||||
+ dev_info(&device->dev, "SBS HC: offset = 0x%0x, query_bit = 0x%0x\n",
|
||||
+ hc->offset, hc->query_bit);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,51 +0,0 @@
|
||||
From patchwork Tue Dec 26 23:50:18 2017
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: Add support for One by Wacom (CTL-472 / CTL-672)
|
||||
From: Jason Gerecke <killertofu@gmail.com>
|
||||
X-Patchwork-Id: 10133291
|
||||
Message-Id: <20171226235018.5522-1-killertofu@gmail.com>
|
||||
To: linux-input@vger.kernel.org, Jiri Kosina <jkosina@suse.cz>,
|
||||
Mx Jing <jingmingxuan@outlook.com>
|
||||
Cc: Ping Cheng <pinglinux@gmail.com>, Aaron Skomra <skomra@gmail.com>,
|
||||
Jason Gerecke <killertofu@gmail.com>,
|
||||
Jason Gerecke <jason.gerecke@wacom.com>
|
||||
Date: Tue, 26 Dec 2017 15:50:18 -0800
|
||||
|
||||
Adds support for the second-generation "One by Wacom" tablets. These
|
||||
devices are similar to the last generation, but a slightly different size
|
||||
and reporting a higher number of pressure levels.
|
||||
|
||||
Signed-off-by: Mx Jing <jingmingxuan@outlook.com>
|
||||
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
|
||||
---
|
||||
drivers/hid/wacom_wac.c | 8 ++++++++
|
||||
1 file changed, 8 insertions(+)
|
||||
|
||||
diff --git a/drivers/hid/wacom_wac.c b/drivers/hid/wacom_wac.c
|
||||
index aa692e28b2cd..5f932ddcdc49 100644
|
||||
--- a/drivers/hid/wacom_wac.c
|
||||
+++ b/drivers/hid/wacom_wac.c
|
||||
@@ -4376,6 +4376,12 @@ static const struct wacom_features wacom_features_0x360 =
|
||||
static const struct wacom_features wacom_features_0x361 =
|
||||
{ "Wacom Intuos Pro L", 62200, 43200, 8191, 63,
|
||||
INTUOSP2_BT, WACOM_INTUOS3_RES, WACOM_INTUOS3_RES, 9, .touch_max = 10 };
|
||||
+static const struct wacom_features wacom_features_0x37A =
|
||||
+ { "Wacom One by Wacom S", 15200, 9500, 2047, 63,
|
||||
+ BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
+static const struct wacom_features wacom_features_0x37B =
|
||||
+ { "Wacom One by Wacom M", 21600, 13500, 2047, 63,
|
||||
+ BAMBOO_PEN, WACOM_INTUOS_RES, WACOM_INTUOS_RES };
|
||||
|
||||
static const struct wacom_features wacom_features_HID_ANY_ID =
|
||||
{ "Wacom HID", .type = HID_GENERIC, .oVid = HID_ANY_ID, .oPid = HID_ANY_ID };
|
||||
@@ -4544,6 +4550,8 @@ const struct hid_device_id wacom_ids[] = {
|
||||
{ USB_DEVICE_WACOM(0x343) },
|
||||
{ BT_DEVICE_WACOM(0x360) },
|
||||
{ BT_DEVICE_WACOM(0x361) },
|
||||
+ { USB_DEVICE_WACOM(0x37A) },
|
||||
+ { USB_DEVICE_WACOM(0x37B) },
|
||||
{ USB_DEVICE_WACOM(0x4001) },
|
||||
{ USB_DEVICE_WACOM(0x4004) },
|
||||
{ USB_DEVICE_WACOM(0x5000) },
|
@ -1,180 +0,0 @@
|
||||
From: "J. Bruce Fields" <bfields@redhat.com>
|
||||
Date: 2017-04-14 15:04:40
|
||||
Subject: [PATCH] nfsd: check for oversized NFSv2/v3 arguments
|
||||
|
||||
A client can append random data to the end of an NFSv2 or NFSv3 RPC call
|
||||
without our complaining; we'll just stop parsing at the end of the
|
||||
expected data and ignore the rest.
|
||||
|
||||
Encoded arguments and replies are stored together in an array of pages,
|
||||
and if a call is too large it could leave inadequate space for the
|
||||
reply. This is normally OK because NFS RPC's typically have either
|
||||
short arguments and long replies (like READ) or long arguments and short
|
||||
replies (like WRITE). But a client that sends an incorrectly long reply
|
||||
can violate those assumptions. This was observed to cause crashes.
|
||||
|
||||
So, insist that the argument not be any longer than we expect.
|
||||
|
||||
Also, several operations increment rq_next_page in the decode routine
|
||||
before checking the argument size, which can leave rq_next_page pointing
|
||||
well past the end of the page array, causing trouble later in
|
||||
svc_free_pages.
|
||||
|
||||
As followup we may also want to rewrite the encoding routines to check
|
||||
more carefully that they aren't running off the end of the page array.
|
||||
|
||||
Reported-by: Tuomas Haanpää <thaan@synopsys.com>
|
||||
Reported-by: Ari Kauppi <ari@synopsys.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
|
||||
---
|
||||
fs/nfsd/nfs3xdr.c | 23 +++++++++++++++++------
|
||||
fs/nfsd/nfsxdr.c | 13 ++++++++++---
|
||||
include/linux/sunrpc/svc.h | 3 +--
|
||||
3 files changed, 28 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c
|
||||
index dba2ff8eaa68..be66bcadfaea 100644
|
||||
--- a/fs/nfsd/nfs3xdr.c
|
||||
+++ b/fs/nfsd/nfs3xdr.c
|
||||
@@ -334,8 +334,11 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
if (!p)
|
||||
return 0;
|
||||
p = xdr_decode_hyper(p, &args->offset);
|
||||
-
|
||||
args->count = ntohl(*p++);
|
||||
+
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
+
|
||||
len = min(args->count, max_blocksize);
|
||||
|
||||
/* set up the kvec */
|
||||
@@ -349,7 +352,7 @@ nfs3svc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
v++;
|
||||
}
|
||||
args->vlen = v;
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -536,9 +539,11 @@ nfs3svc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
p = decode_fh(p, &args->fh);
|
||||
if (!p)
|
||||
return 0;
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
args->buffer = page_address(*(rqstp->rq_next_page++));
|
||||
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -564,10 +569,14 @@ nfs3svc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
args->verf = p; p += 2;
|
||||
args->dircount = ~0;
|
||||
args->count = ntohl(*p++);
|
||||
+
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
+
|
||||
args->count = min_t(u32, args->count, PAGE_SIZE);
|
||||
args->buffer = page_address(*(rqstp->rq_next_page++));
|
||||
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -585,6 +594,9 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
args->dircount = ntohl(*p++);
|
||||
args->count = ntohl(*p++);
|
||||
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
+
|
||||
len = args->count = min(args->count, max_blocksize);
|
||||
while (len > 0) {
|
||||
struct page *p = *(rqstp->rq_next_page++);
|
||||
@@ -592,8 +604,7 @@ nfs3svc_decode_readdirplusargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
args->buffer = page_address(p);
|
||||
len -= PAGE_SIZE;
|
||||
}
|
||||
-
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int
|
||||
diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c
|
||||
index 41b468a6a90f..79268369f7b3 100644
|
||||
--- a/fs/nfsd/nfsxdr.c
|
||||
+++ b/fs/nfsd/nfsxdr.c
|
||||
@@ -257,6 +257,9 @@ nfssvc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
len = args->count = ntohl(*p++);
|
||||
p++; /* totalcount - unused */
|
||||
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
+
|
||||
len = min_t(unsigned int, len, NFSSVC_MAXBLKSIZE_V2);
|
||||
|
||||
/* set up somewhere to store response.
|
||||
@@ -272,7 +275,7 @@ nfssvc_decode_readargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
v++;
|
||||
}
|
||||
args->vlen = v;
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -360,9 +363,11 @@ nfssvc_decode_readlinkargs(struct svc_rqst *rqstp, __be32 *p, struct nfsd_readli
|
||||
p = decode_fh(p, &args->fh);
|
||||
if (!p)
|
||||
return 0;
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
args->buffer = page_address(*(rqstp->rq_next_page++));
|
||||
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
int
|
||||
@@ -400,9 +405,11 @@ nfssvc_decode_readdirargs(struct svc_rqst *rqstp, __be32 *p,
|
||||
args->cookie = ntohl(*p++);
|
||||
args->count = ntohl(*p++);
|
||||
args->count = min_t(u32, args->count, PAGE_SIZE);
|
||||
+ if (!xdr_argsize_check(rqstp, p))
|
||||
+ return 0;
|
||||
args->buffer = page_address(*(rqstp->rq_next_page++));
|
||||
|
||||
- return xdr_argsize_check(rqstp, p);
|
||||
+ return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
diff --git a/include/linux/sunrpc/svc.h b/include/linux/sunrpc/svc.h
|
||||
index e770abeed32d..6ef19cf658b4 100644
|
||||
--- a/include/linux/sunrpc/svc.h
|
||||
+++ b/include/linux/sunrpc/svc.h
|
||||
@@ -336,8 +336,7 @@ xdr_argsize_check(struct svc_rqst *rqstp, __be32 *p)
|
||||
{
|
||||
char *cp = (char *)p;
|
||||
struct kvec *vec = &rqstp->rq_arg.head[0];
|
||||
- return cp >= (char*)vec->iov_base
|
||||
- && cp <= (char*)vec->iov_base + vec->iov_len;
|
||||
+ return cp == (char *)vec->iov_base + vec->iov_len;
|
||||
}
|
||||
|
||||
static inline int
|
||||
--
|
||||
2.9.3
|
||||
|
||||
--
|
||||
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
|
||||
the body of a message to majordomo@vger.kernel.org
|
||||
More majordomo info at http://vger.kernel.org/majordomo-info.html
|
@ -1,228 +0,0 @@
|
||||
From 2b16f048729bf35e6c28a40cbfad07239f9dcd90 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Wed, 31 Jan 2018 14:15:33 +1100
|
||||
Subject: [PATCH] net: create skb_gso_validate_mac_len()
|
||||
|
||||
If you take a GSO skb, and split it into packets, will the MAC
|
||||
length (L2 + L3 + L4 headers + payload) of those packets be small
|
||||
enough to fit within a given length?
|
||||
|
||||
Move skb_gso_mac_seglen() to skbuff.h with other related functions
|
||||
like skb_gso_network_seglen() so we can use it, and then create
|
||||
skb_gso_validate_mac_len to do the full calculation.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
include/linux/skbuff.h | 16 +++++++++++++
|
||||
net/core/skbuff.c | 63 +++++++++++++++++++++++++++++++++++++++-----------
|
||||
net/sched/sch_tbf.c | 10 --------
|
||||
3 files changed, 66 insertions(+), 23 deletions(-)
|
||||
|
||||
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
|
||||
index ac89a93b7c83..5ebc0f869720 100644
|
||||
--- a/include/linux/skbuff.h
|
||||
+++ b/include/linux/skbuff.h
|
||||
@@ -3287,6 +3287,7 @@ int skb_shift(struct sk_buff *tgt, struct sk_buff *skb, int shiftlen);
|
||||
void skb_scrub_packet(struct sk_buff *skb, bool xnet);
|
||||
unsigned int skb_gso_transport_seglen(const struct sk_buff *skb);
|
||||
bool skb_gso_validate_mtu(const struct sk_buff *skb, unsigned int mtu);
|
||||
+bool skb_gso_validate_mac_len(const struct sk_buff *skb, unsigned int len);
|
||||
struct sk_buff *skb_segment(struct sk_buff *skb, netdev_features_t features);
|
||||
struct sk_buff *skb_vlan_untag(struct sk_buff *skb);
|
||||
int skb_ensure_writable(struct sk_buff *skb, int write_len);
|
||||
@@ -4120,6 +4121,21 @@ static inline unsigned int skb_gso_network_seglen(const struct sk_buff *skb)
|
||||
return hdr_len + skb_gso_transport_seglen(skb);
|
||||
}
|
||||
|
||||
+/**
|
||||
+ * skb_gso_mac_seglen - Return length of individual segments of a gso packet
|
||||
+ *
|
||||
+ * @skb: GSO skb
|
||||
+ *
|
||||
+ * skb_gso_mac_seglen is used to determine the real size of the
|
||||
+ * individual segments, including MAC/L2, Layer3 (IP, IPv6) and L4
|
||||
+ * headers (TCP/UDP).
|
||||
+ */
|
||||
+static inline unsigned int skb_gso_mac_seglen(const struct sk_buff *skb)
|
||||
+{
|
||||
+ unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
|
||||
+ return hdr_len + skb_gso_transport_seglen(skb);
|
||||
+}
|
||||
+
|
||||
/* Local Checksum Offload.
|
||||
* Compute outer checksum based on the assumption that the
|
||||
* inner checksum will be offloaded later.
|
||||
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
|
||||
index 01e8285aea73..8c61c27c1b28 100644
|
||||
--- a/net/core/skbuff.c
|
||||
+++ b/net/core/skbuff.c
|
||||
@@ -4914,37 +4914,74 @@ unsigned int skb_gso_transport_seglen(const struct sk_buff *skb)
|
||||
EXPORT_SYMBOL_GPL(skb_gso_transport_seglen);
|
||||
|
||||
/**
|
||||
- * skb_gso_validate_mtu - Return in case such skb fits a given MTU
|
||||
+ * skb_gso_size_check - check the skb size, considering GSO_BY_FRAGS
|
||||
*
|
||||
- * @skb: GSO skb
|
||||
- * @mtu: MTU to validate against
|
||||
+ * There are a couple of instances where we have a GSO skb, and we
|
||||
+ * want to determine what size it would be after it is segmented.
|
||||
*
|
||||
- * skb_gso_validate_mtu validates if a given skb will fit a wanted MTU
|
||||
- * once split.
|
||||
+ * We might want to check:
|
||||
+ * - L3+L4+payload size (e.g. IP forwarding)
|
||||
+ * - L2+L3+L4+payload size (e.g. sanity check before passing to driver)
|
||||
+ *
|
||||
+ * This is a helper to do that correctly considering GSO_BY_FRAGS.
|
||||
+ *
|
||||
+ * @seg_len: The segmented length (from skb_gso_*_seglen). In the
|
||||
+ * GSO_BY_FRAGS case this will be [header sizes + GSO_BY_FRAGS].
|
||||
+ *
|
||||
+ * @max_len: The maximum permissible length.
|
||||
+ *
|
||||
+ * Returns true if the segmented length <= max length.
|
||||
*/
|
||||
-bool skb_gso_validate_mtu(const struct sk_buff *skb, unsigned int mtu)
|
||||
-{
|
||||
+static inline bool skb_gso_size_check(const struct sk_buff *skb,
|
||||
+ unsigned int seg_len,
|
||||
+ unsigned int max_len) {
|
||||
const struct skb_shared_info *shinfo = skb_shinfo(skb);
|
||||
const struct sk_buff *iter;
|
||||
- unsigned int hlen;
|
||||
-
|
||||
- hlen = skb_gso_network_seglen(skb);
|
||||
|
||||
if (shinfo->gso_size != GSO_BY_FRAGS)
|
||||
- return hlen <= mtu;
|
||||
+ return seg_len <= max_len;
|
||||
|
||||
/* Undo this so we can re-use header sizes */
|
||||
- hlen -= GSO_BY_FRAGS;
|
||||
+ seg_len -= GSO_BY_FRAGS;
|
||||
|
||||
skb_walk_frags(skb, iter) {
|
||||
- if (hlen + skb_headlen(iter) > mtu)
|
||||
+ if (seg_len + skb_headlen(iter) > max_len)
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
+
|
||||
+/**
|
||||
+ * skb_gso_validate_mtu - Return in case such skb fits a given MTU
|
||||
+ *
|
||||
+ * @skb: GSO skb
|
||||
+ * @mtu: MTU to validate against
|
||||
+ *
|
||||
+ * skb_gso_validate_mtu validates if a given skb will fit a wanted MTU
|
||||
+ * once split.
|
||||
+ */
|
||||
+bool skb_gso_validate_mtu(const struct sk_buff *skb, unsigned int mtu)
|
||||
+{
|
||||
+ return skb_gso_size_check(skb, skb_gso_network_seglen(skb), mtu);
|
||||
+}
|
||||
EXPORT_SYMBOL_GPL(skb_gso_validate_mtu);
|
||||
|
||||
+/**
|
||||
+ * skb_gso_validate_mac_len - Will a split GSO skb fit in a given length?
|
||||
+ *
|
||||
+ * @skb: GSO skb
|
||||
+ * @len: length to validate against
|
||||
+ *
|
||||
+ * skb_gso_validate_mac_len validates if a given skb will fit a wanted
|
||||
+ * length once split, including L2, L3 and L4 headers and the payload.
|
||||
+ */
|
||||
+bool skb_gso_validate_mac_len(const struct sk_buff *skb, unsigned int len)
|
||||
+{
|
||||
+ return skb_gso_size_check(skb, skb_gso_mac_seglen(skb), len);
|
||||
+}
|
||||
+EXPORT_SYMBOL_GPL(skb_gso_validate_mac_len);
|
||||
+
|
||||
static struct sk_buff *skb_reorder_vlan_header(struct sk_buff *skb)
|
||||
{
|
||||
if (skb_cow(skb, skb_headroom(skb)) < 0) {
|
||||
diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c
|
||||
index 83e76d046993..229172d509cc 100644
|
||||
--- a/net/sched/sch_tbf.c
|
||||
+++ b/net/sched/sch_tbf.c
|
||||
@@ -142,16 +142,6 @@ static u64 psched_ns_t2l(const struct psched_ratecfg *r,
|
||||
return len;
|
||||
}
|
||||
|
||||
-/*
|
||||
- * Return length of individual segments of a gso packet,
|
||||
- * including all headers (MAC, IP, TCP/UDP)
|
||||
- */
|
||||
-static unsigned int skb_gso_mac_seglen(const struct sk_buff *skb)
|
||||
-{
|
||||
- unsigned int hdr_len = skb_transport_header(skb) - skb_mac_header(skb);
|
||||
- return hdr_len + skb_gso_transport_seglen(skb);
|
||||
-}
|
||||
-
|
||||
/* GSO packet is too big, segment it so that tbf can transmit
|
||||
* each segment in time
|
||||
*/
|
||||
--
|
||||
2.14.3
|
||||
|
||||
From 8914a595110a6eca69a5e275b323f5d09e18f4f9 Mon Sep 17 00:00:00 2001
|
||||
From: Daniel Axtens <dja@axtens.net>
|
||||
Date: Wed, 31 Jan 2018 14:15:34 +1100
|
||||
Subject: [PATCH] bnx2x: disable GSO where gso_size is too big for hardware
|
||||
|
||||
If a bnx2x card is passed a GSO packet with a gso_size larger than
|
||||
~9700 bytes, it will cause a firmware error that will bring the card
|
||||
down:
|
||||
|
||||
bnx2x: [bnx2x_attn_int_deasserted3:4323(enP24p1s0f0)]MC assert!
|
||||
bnx2x: [bnx2x_mc_assert:720(enP24p1s0f0)]XSTORM_ASSERT_LIST_INDEX 0x2
|
||||
bnx2x: [bnx2x_mc_assert:736(enP24p1s0f0)]XSTORM_ASSERT_INDEX 0x0 = 0x00000000 0x25e43e47 0x00463e01 0x00010052
|
||||
bnx2x: [bnx2x_mc_assert:750(enP24p1s0f0)]Chip Revision: everest3, FW Version: 7_13_1
|
||||
... (dump of values continues) ...
|
||||
|
||||
Detect when the mac length of a GSO packet is greater than the maximum
|
||||
packet size (9700 bytes) and disable GSO.
|
||||
|
||||
Signed-off-by: Daniel Axtens <dja@axtens.net>
|
||||
Reviewed-by: Eric Dumazet <edumazet@google.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
|
||||
index 7b08323e3f3d..74fc9af4aadb 100644
|
||||
--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
|
||||
+++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
|
||||
@@ -12934,6 +12934,24 @@ static netdev_features_t bnx2x_features_check(struct sk_buff *skb,
|
||||
struct net_device *dev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
+ /*
|
||||
+ * A skb with gso_size + header length > 9700 will cause a
|
||||
+ * firmware panic. Drop GSO support.
|
||||
+ *
|
||||
+ * Eventually the upper layer should not pass these packets down.
|
||||
+ *
|
||||
+ * For speed, if the gso_size is <= 9000, assume there will
|
||||
+ * not be 700 bytes of headers and pass it through. Only do a
|
||||
+ * full (slow) validation if the gso_size is > 9000.
|
||||
+ *
|
||||
+ * (Due to the way SKB_BY_FRAGS works this will also do a full
|
||||
+ * validation in that case.)
|
||||
+ */
|
||||
+ if (unlikely(skb_is_gso(skb) &&
|
||||
+ (skb_shinfo(skb)->gso_size > 9000) &&
|
||||
+ !skb_gso_validate_mac_len(skb, 9700)))
|
||||
+ features &= ~NETIF_F_GSO_MASK;
|
||||
+
|
||||
features = vlan_features_check(skb, features);
|
||||
return vxlan_features_check(skb, features);
|
||||
}
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,54 +0,0 @@
|
||||
From ef14a4bf0910d06c7e202552914028d4956809cb Mon Sep 17 00:00:00 2001
|
||||
From: Andrew Duggan <aduggan@synaptics.com>
|
||||
Date: Tue, 17 Oct 2017 18:37:36 -0700
|
||||
Subject: [PATCH] HID: rmi: Check that a device is a RMI device before calling
|
||||
RMI functions
|
||||
|
||||
The hid-rmi driver may handle non rmi devices on composite USB devices.
|
||||
Callbacks need to make sure that the current device is a RMI device before
|
||||
calling RMI specific functions. Most callbacks already have this check, but
|
||||
this patch adds checks to the remaining callbacks.
|
||||
|
||||
Reported-by: Hendrik Langer <hendrik.langer@gmx.de>
|
||||
Tested-by: Hendrik Langer <hendrik.langer@gmx.de>
|
||||
Reviewed-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
Signed-off-by: Andrew Duggan <aduggan@synaptics.com>
|
||||
Signed-off-by: Jiri Kosina <jkosina@suse.cz>
|
||||
---
|
||||
drivers/hid/hid-rmi.c | 13 ++++++++++---
|
||||
1 file changed, 10 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/hid/hid-rmi.c b/drivers/hid/hid-rmi.c
|
||||
index ef241d66562e..0f43c4292685 100644
|
||||
--- a/drivers/hid/hid-rmi.c
|
||||
+++ b/drivers/hid/hid-rmi.c
|
||||
@@ -368,6 +368,11 @@ static int rmi_check_sanity(struct hid_device *hdev, u8 *data, int size)
|
||||
static int rmi_raw_event(struct hid_device *hdev,
|
||||
struct hid_report *report, u8 *data, int size)
|
||||
{
|
||||
+ struct rmi_data *hdata = hid_get_drvdata(hdev);
|
||||
+
|
||||
+ if (!(hdata->device_flags & RMI_DEVICE))
|
||||
+ return 0;
|
||||
+
|
||||
size = rmi_check_sanity(hdev, data, size);
|
||||
if (size < 2)
|
||||
return 0;
|
||||
@@ -713,9 +718,11 @@ static void rmi_remove(struct hid_device *hdev)
|
||||
{
|
||||
struct rmi_data *hdata = hid_get_drvdata(hdev);
|
||||
|
||||
- clear_bit(RMI_STARTED, &hdata->flags);
|
||||
- cancel_work_sync(&hdata->reset_work);
|
||||
- rmi_unregister_transport_device(&hdata->xport);
|
||||
+ if (hdata->device_flags & RMI_DEVICE) {
|
||||
+ clear_bit(RMI_STARTED, &hdata->flags);
|
||||
+ cancel_work_sync(&hdata->reset_work);
|
||||
+ rmi_unregister_transport_device(&hdata->xport);
|
||||
+ }
|
||||
|
||||
hid_hw_stop(hdev);
|
||||
}
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,56 +0,0 @@
|
||||
From patchwork Thu Feb 8 13:43:37 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [3/4] clk: bcm2835: De-assert/assert PLL reset signal when appropriate
|
||||
From: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
X-Patchwork-Id: 10207157
|
||||
Message-Id: <20180208134338.24590-3-boris.brezillon@bootlin.com>
|
||||
To: Florian Fainelli <f.fainelli@gmail.com>, Ray Jui <rjui@broadcom.com>,
|
||||
Scott Branden <sbranden@broadcom.com>,
|
||||
bcm-kernel-feedback-list@broadcom.com,
|
||||
Stephen Warren <swarren@wwwdotorg.org>,
|
||||
Lee Jones <lee@kernel.org>, Eric Anholt <eric@anholt.net>,
|
||||
linux-rpi-kernel@lists.infradead.org,
|
||||
Mike Turquette <mturquette@baylibre.com>,
|
||||
Stephen Boyd <sboyd@codeaurora.org>, linux-clk@vger.kernel.org
|
||||
Cc: Boris Brezillon <boris.brezillon@bootlin.com>, stable@vger.kernel.org
|
||||
Date: Thu, 8 Feb 2018 14:43:37 +0100
|
||||
|
||||
In order to enable a PLL, not only the PLL has to be powered up and
|
||||
locked, but you also have to de-assert the reset signal. The last part
|
||||
was missing. Add it so PLLs that were not enabled by the FW/bootloader
|
||||
can be enabled from Linux.
|
||||
|
||||
Fixes: 41691b8862e2 ("clk: bcm2835: Add support for programming the audio domain clocks")
|
||||
Cc: <stable@vger.kernel.org>
|
||||
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
|
||||
---
|
||||
drivers/clk/bcm/clk-bcm2835.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c
|
||||
index a07f6451694a..6c5d4a8e426c 100644
|
||||
--- a/drivers/clk/bcm/clk-bcm2835.c
|
||||
+++ b/drivers/clk/bcm/clk-bcm2835.c
|
||||
@@ -602,6 +602,9 @@ static void bcm2835_pll_off(struct clk_hw *hw)
|
||||
const struct bcm2835_pll_data *data = pll->data;
|
||||
|
||||
spin_lock(&cprman->regs_lock);
|
||||
+ cprman_write(cprman, data->a2w_ctrl_reg,
|
||||
+ cprman_read(cprman, data->a2w_ctrl_reg) &
|
||||
+ ~A2W_PLL_CTRL_PRST_DISABLE);
|
||||
cprman_write(cprman, data->cm_ctrl_reg,
|
||||
cprman_read(cprman, data->cm_ctrl_reg) |
|
||||
CM_PLL_ANARST);
|
||||
@@ -640,6 +643,10 @@ static int bcm2835_pll_on(struct clk_hw *hw)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
+ cprman_write(cprman, data->a2w_ctrl_reg,
|
||||
+ cprman_read(cprman, data->a2w_ctrl_reg) |
|
||||
+ A2W_PLL_CTRL_PRST_DISABLE);
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,283 +0,0 @@
|
||||
From d8c80bb3b55b0821e1cf6a4814262c152ae5bc4b Mon Sep 17 00:00:00 2001
|
||||
From: Vivek Gautam <gautam.vivek@samsung.com>
|
||||
Date: Mon, 9 Oct 2017 14:00:51 +0200
|
||||
Subject: phy: exynos5-usbdrd: Calibrate LOS levels for exynos5420/5800
|
||||
|
||||
Adding phy calibration sequence for USB 3.0 DRD PHY present on
|
||||
Exynos5420/5800 systems.
|
||||
This calibration facilitates setting certain PHY parameters viz.
|
||||
the Loss-of-Signal (LOS) Detector Threshold Level, as well as
|
||||
Tx-Vboost-Level for Super-Speed operations.
|
||||
Additionally we also set proper time to wait for RxDetect measurement,
|
||||
for desired PHY reference clock, so as to solve issue with enumeration
|
||||
of few USB 3.0 devices, like Samsung SUM-TSB16S 3.0 USB drive
|
||||
on the controller.
|
||||
|
||||
We are using CR_port for this purpose to send required data
|
||||
to override the LOS values.
|
||||
|
||||
On testing with USB 3.0 devices on USB 3.0 port present on
|
||||
SMDK5420, and peach-pit boards should see following message:
|
||||
usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd
|
||||
|
||||
and without this patch, should see below shown message:
|
||||
usb 1-1: new high-speed USB device number 2 using xhci-hcd
|
||||
|
||||
[Also removed unnecessary extra lines in the register macro definitions]
|
||||
|
||||
Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com>
|
||||
[adapted to use phy_calibrate as entry point]
|
||||
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
|
||||
Acked-by: Felipe Balbi <felipe.balbi@linux.intel.com>
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
|
||||
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
|
||||
---
|
||||
drivers/phy/samsung/phy-exynos5-usbdrd.c | 183 +++++++++++++++++++++++++++++++
|
||||
drivers/usb/dwc3/core.c | 2 +
|
||||
2 files changed, 185 insertions(+)
|
||||
|
||||
diff --git a/drivers/phy/samsung/phy-exynos5-usbdrd.c b/drivers/phy/samsung/phy-exynos5-usbdrd.c
|
||||
index 22c68f5..b8b226a 100644
|
||||
--- a/drivers/phy/samsung/phy-exynos5-usbdrd.c
|
||||
+++ b/drivers/phy/samsung/phy-exynos5-usbdrd.c
|
||||
@@ -90,7 +90,17 @@
|
||||
#define PHYCLKRST_COMMONONN BIT(0)
|
||||
|
||||
#define EXYNOS5_DRD_PHYREG0 0x14
|
||||
+#define PHYREG0_SSC_REF_CLK_SEL BIT(21)
|
||||
+#define PHYREG0_SSC_RANGE BIT(20)
|
||||
+#define PHYREG0_CR_WRITE BIT(19)
|
||||
+#define PHYREG0_CR_READ BIT(18)
|
||||
+#define PHYREG0_CR_DATA_IN(_x) ((_x) << 2)
|
||||
+#define PHYREG0_CR_CAP_DATA BIT(1)
|
||||
+#define PHYREG0_CR_CAP_ADDR BIT(0)
|
||||
+
|
||||
#define EXYNOS5_DRD_PHYREG1 0x18
|
||||
+#define PHYREG1_CR_DATA_OUT(_x) ((_x) << 1)
|
||||
+#define PHYREG1_CR_ACK BIT(0)
|
||||
|
||||
#define EXYNOS5_DRD_PHYPARAM0 0x1c
|
||||
|
||||
@@ -119,6 +129,25 @@
|
||||
#define EXYNOS5_DRD_PHYRESUME 0x34
|
||||
#define EXYNOS5_DRD_LINKPORT 0x44
|
||||
|
||||
+/* USB 3.0 DRD PHY SS Function Control Reg; accessed by CR_PORT */
|
||||
+#define EXYNOS5_DRD_PHYSS_LOSLEVEL_OVRD_IN (0x15)
|
||||
+#define LOSLEVEL_OVRD_IN_LOS_BIAS_5420 (0x5 << 13)
|
||||
+#define LOSLEVEL_OVRD_IN_LOS_BIAS_DEFAULT (0x0 << 13)
|
||||
+#define LOSLEVEL_OVRD_IN_EN (0x1 << 10)
|
||||
+#define LOSLEVEL_OVRD_IN_LOS_LEVEL_DEFAULT (0x9 << 0)
|
||||
+
|
||||
+#define EXYNOS5_DRD_PHYSS_TX_VBOOSTLEVEL_OVRD_IN (0x12)
|
||||
+#define TX_VBOOSTLEVEL_OVRD_IN_VBOOST_5420 (0x5 << 13)
|
||||
+#define TX_VBOOSTLEVEL_OVRD_IN_VBOOST_DEFAULT (0x4 << 13)
|
||||
+
|
||||
+#define EXYNOS5_DRD_PHYSS_LANE0_TX_DEBUG (0x1010)
|
||||
+#define LANE0_TX_DEBUG_RXDET_MEAS_TIME_19M2_20M (0x4 << 4)
|
||||
+#define LANE0_TX_DEBUG_RXDET_MEAS_TIME_24M (0x8 << 4)
|
||||
+#define LANE0_TX_DEBUG_RXDET_MEAS_TIME_25M_26M (0x8 << 4)
|
||||
+#define LANE0_TX_DEBUG_RXDET_MEAS_TIME_48M_50M_52M (0x20 << 4)
|
||||
+#define LANE0_TX_DEBUG_RXDET_MEAS_TIME_62M5 (0x20 << 4)
|
||||
+#define LANE0_TX_DEBUG_RXDET_MEAS_TIME_96M_100M (0x40 << 4)
|
||||
+
|
||||
#define KHZ 1000
|
||||
#define MHZ (KHZ * KHZ)
|
||||
|
||||
@@ -527,6 +556,151 @@ static int exynos5_usbdrd_phy_power_off(struct phy *phy)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+static int crport_handshake(struct exynos5_usbdrd_phy *phy_drd,
|
||||
+ u32 val, u32 cmd)
|
||||
+{
|
||||
+ u32 usec = 100;
|
||||
+ unsigned int result;
|
||||
+
|
||||
+ writel(val | cmd, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
|
||||
+
|
||||
+ do {
|
||||
+ result = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1);
|
||||
+ if (result & PHYREG1_CR_ACK)
|
||||
+ break;
|
||||
+
|
||||
+ udelay(1);
|
||||
+ } while (usec-- > 0);
|
||||
+
|
||||
+ if (!usec) {
|
||||
+ dev_err(phy_drd->dev,
|
||||
+ "CRPORT handshake timeout1 (0x%08x)\n", val);
|
||||
+ return -ETIME;
|
||||
+ }
|
||||
+
|
||||
+ usec = 100;
|
||||
+
|
||||
+ writel(val, phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
|
||||
+
|
||||
+ do {
|
||||
+ result = readl(phy_drd->reg_phy + EXYNOS5_DRD_PHYREG1);
|
||||
+ if (!(result & PHYREG1_CR_ACK))
|
||||
+ break;
|
||||
+
|
||||
+ udelay(1);
|
||||
+ } while (usec-- > 0);
|
||||
+
|
||||
+ if (!usec) {
|
||||
+ dev_err(phy_drd->dev,
|
||||
+ "CRPORT handshake timeout2 (0x%08x)\n", val);
|
||||
+ return -ETIME;
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int crport_ctrl_write(struct exynos5_usbdrd_phy *phy_drd,
|
||||
+ u32 addr, u32 data)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ /* Write Address */
|
||||
+ writel(PHYREG0_CR_DATA_IN(addr),
|
||||
+ phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
|
||||
+ ret = crport_handshake(phy_drd, PHYREG0_CR_DATA_IN(addr),
|
||||
+ PHYREG0_CR_CAP_ADDR);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ /* Write Data */
|
||||
+ writel(PHYREG0_CR_DATA_IN(data),
|
||||
+ phy_drd->reg_phy + EXYNOS5_DRD_PHYREG0);
|
||||
+ ret = crport_handshake(phy_drd, PHYREG0_CR_DATA_IN(data),
|
||||
+ PHYREG0_CR_CAP_DATA);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ ret = crport_handshake(phy_drd, PHYREG0_CR_DATA_IN(data),
|
||||
+ PHYREG0_CR_WRITE);
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * Calibrate few PHY parameters using CR_PORT register to meet
|
||||
+ * SuperSpeed requirements on Exynos5420 and Exynos5800 systems,
|
||||
+ * which have 28nm USB 3.0 DRD PHY.
|
||||
+ */
|
||||
+static int exynos5420_usbdrd_phy_calibrate(struct exynos5_usbdrd_phy *phy_drd)
|
||||
+{
|
||||
+ unsigned int temp;
|
||||
+ int ret = 0;
|
||||
+
|
||||
+ /*
|
||||
+ * Change los_bias to (0x5) for 28nm PHY from a
|
||||
+ * default value (0x0); los_level is set as default
|
||||
+ * (0x9) as also reflected in los_level[30:26] bits
|
||||
+ * of PHYPARAM0 register.
|
||||
+ */
|
||||
+ temp = LOSLEVEL_OVRD_IN_LOS_BIAS_5420 |
|
||||
+ LOSLEVEL_OVRD_IN_EN |
|
||||
+ LOSLEVEL_OVRD_IN_LOS_LEVEL_DEFAULT;
|
||||
+ ret = crport_ctrl_write(phy_drd,
|
||||
+ EXYNOS5_DRD_PHYSS_LOSLEVEL_OVRD_IN,
|
||||
+ temp);
|
||||
+ if (ret) {
|
||||
+ dev_err(phy_drd->dev,
|
||||
+ "Failed setting Loss-of-Signal level for SuperSpeed\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Set tx_vboost_lvl to (0x5) for 28nm PHY Tuning,
|
||||
+ * to raise Tx signal level from its default value of (0x4)
|
||||
+ */
|
||||
+ temp = TX_VBOOSTLEVEL_OVRD_IN_VBOOST_5420;
|
||||
+ ret = crport_ctrl_write(phy_drd,
|
||||
+ EXYNOS5_DRD_PHYSS_TX_VBOOSTLEVEL_OVRD_IN,
|
||||
+ temp);
|
||||
+ if (ret) {
|
||||
+ dev_err(phy_drd->dev,
|
||||
+ "Failed setting Tx-Vboost-Level for SuperSpeed\n");
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
+ /*
|
||||
+ * Set proper time to wait for RxDetect measurement, for
|
||||
+ * desired reference clock of PHY, by tuning the CR_PORT
|
||||
+ * register LANE0.TX_DEBUG which is internal to PHY.
|
||||
+ * This fixes issue with few USB 3.0 devices, which are
|
||||
+ * not detected (not even generate interrupts on the bus
|
||||
+ * on insertion) without this change.
|
||||
+ * e.g. Samsung SUM-TSB16S 3.0 USB drive.
|
||||
+ */
|
||||
+ switch (phy_drd->extrefclk) {
|
||||
+ case EXYNOS5_FSEL_50MHZ:
|
||||
+ temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_48M_50M_52M;
|
||||
+ break;
|
||||
+ case EXYNOS5_FSEL_20MHZ:
|
||||
+ case EXYNOS5_FSEL_19MHZ2:
|
||||
+ temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_19M2_20M;
|
||||
+ break;
|
||||
+ case EXYNOS5_FSEL_24MHZ:
|
||||
+ default:
|
||||
+ temp = LANE0_TX_DEBUG_RXDET_MEAS_TIME_24M;
|
||||
+ break;
|
||||
+ }
|
||||
+
|
||||
+ ret = crport_ctrl_write(phy_drd,
|
||||
+ EXYNOS5_DRD_PHYSS_LANE0_TX_DEBUG,
|
||||
+ temp);
|
||||
+ if (ret)
|
||||
+ dev_err(phy_drd->dev,
|
||||
+ "Fail to set RxDet measurement time for SuperSpeed\n");
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
static struct phy *exynos5_usbdrd_phy_xlate(struct device *dev,
|
||||
struct of_phandle_args *args)
|
||||
{
|
||||
@@ -538,11 +712,20 @@ static struct phy *exynos5_usbdrd_phy_xlate(struct device *dev,
|
||||
return phy_drd->phys[args->args[0]].phy;
|
||||
}
|
||||
|
||||
+static int exynos5_usbdrd_phy_calibrate(struct phy *phy)
|
||||
+{
|
||||
+ struct phy_usb_instance *inst = phy_get_drvdata(phy);
|
||||
+ struct exynos5_usbdrd_phy *phy_drd = to_usbdrd_phy(inst);
|
||||
+
|
||||
+ return exynos5420_usbdrd_phy_calibrate(phy_drd);
|
||||
+}
|
||||
+
|
||||
static const struct phy_ops exynos5_usbdrd_phy_ops = {
|
||||
.init = exynos5_usbdrd_phy_init,
|
||||
.exit = exynos5_usbdrd_phy_exit,
|
||||
.power_on = exynos5_usbdrd_phy_power_on,
|
||||
.power_off = exynos5_usbdrd_phy_power_off,
|
||||
+ .calibrate = exynos5_usbdrd_phy_calibrate,
|
||||
.owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
|
||||
index 0783250..71707a3 100644
|
||||
--- a/drivers/usb/dwc3/core.c
|
||||
+++ b/drivers/usb/dwc3/core.c
|
||||
@@ -147,6 +147,7 @@ static void __dwc3_set_mode(struct work_struct *work)
|
||||
otg_set_vbus(dwc->usb2_phy->otg, true);
|
||||
phy_set_mode(dwc->usb2_generic_phy, PHY_MODE_USB_HOST);
|
||||
phy_set_mode(dwc->usb3_generic_phy, PHY_MODE_USB_HOST);
|
||||
+ phy_calibrate(dwc->usb2_generic_phy);
|
||||
}
|
||||
break;
|
||||
case DWC3_GCTL_PRTCAP_DEVICE:
|
||||
@@ -945,6 +946,7 @@ static int dwc3_core_init_mode(struct dwc3 *dwc)
|
||||
dev_err(dev, "failed to initialize host\n");
|
||||
return ret;
|
||||
}
|
||||
+ phy_calibrate(dwc->usb2_generic_phy);
|
||||
break;
|
||||
case USB_DR_MODE_OTG:
|
||||
INIT_WORK(&dwc->drd_work, __dwc3_set_mode);
|
||||
--
|
||||
cgit v1.1
|
||||
|
@ -1,32 +0,0 @@
|
||||
From d0404738c687c0ecaa7d6b7c5c39e4c0dac791e6 Mon Sep 17 00:00:00 2001
|
||||
From: Nicolas Chauvet <kwizart@gmail.com>
|
||||
Date: Tue, 30 Jan 2018 10:55:26 +0100
|
||||
Subject: arm: imx: Add MODULE_ALIAS for cpufreq
|
||||
|
||||
Without this, the imx6q-cpufreq driver isn't loaded
|
||||
automatically when built as a module
|
||||
|
||||
Tested on wandboard quad with a fedora 27 kernel rpm
|
||||
|
||||
Signed-off-by: Nicolas Chauvet <kwizart@gmail.com>
|
||||
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
|
||||
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||
---
|
||||
drivers/cpufreq/imx6q-cpufreq.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/cpufreq/imx6q-cpufreq.c b/drivers/cpufreq/imx6q-cpufreq.c
|
||||
index 741f22e..ff67859 100644
|
||||
--- a/drivers/cpufreq/imx6q-cpufreq.c
|
||||
+++ b/drivers/cpufreq/imx6q-cpufreq.c
|
||||
@@ -504,6 +504,7 @@ static struct platform_driver imx6q_cpufreq_platdrv = {
|
||||
};
|
||||
module_platform_driver(imx6q_cpufreq_platdrv);
|
||||
|
||||
+MODULE_ALIAS("platform:imx6q-cpufreq");
|
||||
MODULE_AUTHOR("Shawn Guo <shawn.guo@linaro.org>");
|
||||
MODULE_DESCRIPTION("Freescale i.MX6Q cpufreq driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
--
|
||||
cgit v1.1
|
||||
|
@ -1,902 +0,0 @@
|
||||
From e9e601215d294d473a593641b1ecfd1fa4586a90 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Thu, 6 Apr 2017 13:52:54 +0100
|
||||
Subject: [PATCH 1/4] [RFC,v2,1/4] ARM: dts: imx6qdl: add HummingBoard2 boards
|
||||
|
||||
From: Jon Nettleton <jon@solid-run.com>
|
||||
|
||||
This adds support for the Hummingboard Gate and Edge devices from
|
||||
SolidRun.
|
||||
|
||||
Signed-off-by: Jon Nettleton <jon@solid-run.com>
|
||||
Signed-off-by: Rabeeh Khoury <rabeeh@solid-run.com>
|
||||
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
---
|
||||
arch/arm/boot/dts/Makefile | 2 +
|
||||
arch/arm/boot/dts/imx6dl-hummingboard2.dts | 52 +++
|
||||
arch/arm/boot/dts/imx6q-hummingboard2.dts | 60 +++
|
||||
arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi | 543 +++++++++++++++++++++++++++
|
||||
4 files changed, 657 insertions(+)
|
||||
create mode 100644 arch/arm/boot/dts/imx6dl-hummingboard2.dts
|
||||
create mode 100644 arch/arm/boot/dts/imx6q-hummingboard2.dts
|
||||
create mode 100644 arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
|
||||
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile
|
||||
index 011808490fed..ccdff6650541 100644
|
||||
--- a/arch/arm/boot/dts/Makefile
|
||||
+++ b/arch/arm/boot/dts/Makefile
|
||||
@@ -353,6 +353,7 @@ dtb-$(CONFIG_SOC_IMX6Q) += \
|
||||
imx6dl-gw5903.dtb \
|
||||
imx6dl-gw5904.dtb \
|
||||
imx6dl-hummingboard.dtb \
|
||||
+ imx6dl-hummingboard2.dtb \
|
||||
imx6dl-icore.dtb \
|
||||
imx6dl-icore-rqs.dtb \
|
||||
imx6dl-nit6xlite.dtb \
|
||||
@@ -397,6 +398,7 @@ dtb-$(CONFIG_SOC_IMX6Q) += \
|
||||
imx6q-gw5904.dtb \
|
||||
imx6q-h100.dtb \
|
||||
imx6q-hummingboard.dtb \
|
||||
+ imx6q-hummingboard2.dtb \
|
||||
imx6q-icore.dtb \
|
||||
imx6q-icore-ofcap10.dtb \
|
||||
imx6q-icore-ofcap12.dtb \
|
||||
diff --git a/arch/arm/boot/dts/imx6dl-hummingboard2.dts b/arch/arm/boot/dts/imx6dl-hummingboard2.dts
|
||||
new file mode 100644
|
||||
index 000000000000..990b5050de5b
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/imx6dl-hummingboard2.dts
|
||||
@@ -0,0 +1,52 @@
|
||||
+/*
|
||||
+ * Device Tree file for SolidRun HummingBoard2
|
||||
+ * Copyright (C) 2015 Rabeeh Khoury <rabeeh@solid-run.com>
|
||||
+ * Based on work by Russell King
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This file is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License.
|
||||
+ *
|
||||
+ * This file is distributed in the hope that it will be useful
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * Or, alternatively
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "imx6dl.dtsi"
|
||||
+#include "imx6qdl-hummingboard2.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "SolidRun HummingBoard2 Solo/DualLite";
|
||||
+ compatible = "solidrun,hummingboard2/dl", "fsl,imx6dl";
|
||||
+};
|
||||
diff --git a/arch/arm/boot/dts/imx6q-hummingboard2.dts b/arch/arm/boot/dts/imx6q-hummingboard2.dts
|
||||
new file mode 100644
|
||||
index 000000000000..f5eec9163bb8
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/imx6q-hummingboard2.dts
|
||||
@@ -0,0 +1,60 @@
|
||||
+/*
|
||||
+ * Device Tree file for SolidRun HummingBoard2
|
||||
+ * Copyright (C) 2015 Rabeeh Khoury <rabeeh@solid-run.com>
|
||||
+ * Based on work by Russell King
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This file is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License.
|
||||
+ *
|
||||
+ * This file is distributed in the hope that it will be useful
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * Or, alternatively
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED , WITHOUT WARRANTY OF ANY KIND
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+/dts-v1/;
|
||||
+
|
||||
+#include "imx6q.dtsi"
|
||||
+#include "imx6qdl-hummingboard2.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ model = "SolidRun HummingBoard2 Dual/Quad";
|
||||
+ compatible = "solidrun,hummingboard2/q", "fsl,imx6q";
|
||||
+};
|
||||
+
|
||||
+&sata {
|
||||
+ status = "okay";
|
||||
+ fsl,transmit-level-mV = <1104>;
|
||||
+ fsl,transmit-boost-mdB = <0>;
|
||||
+ fsl,transmit-atten-16ths = <9>;
|
||||
+ fsl,no-spread-spectrum;
|
||||
+};
|
||||
diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
new file mode 100644
|
||||
index 000000000000..11b63f6f2b89
|
||||
--- /dev/null
|
||||
+++ b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
@@ -0,0 +1,543 @@
|
||||
+/*
|
||||
+ * Device Tree file for SolidRun HummingBoard2
|
||||
+ * Copyright (C) 2015 Rabeeh Khoury <rabeeh@solid-run.com>
|
||||
+ *
|
||||
+ * This file is dual-licensed: you can use it either under the terms
|
||||
+ * of the GPL or the X11 license, at your option. Note that this dual
|
||||
+ * licensing only applies to this file, and not this project as a
|
||||
+ * whole.
|
||||
+ *
|
||||
+ * a) This file is free software; you can redistribute it and/or
|
||||
+ * modify it under the terms of the GNU General Public License as
|
||||
+ * published by the Free Software Foundation; either version 2 of the
|
||||
+ * License.
|
||||
+ *
|
||||
+ * This file is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * Or, alternatively,
|
||||
+ *
|
||||
+ * b) Permission is hereby granted, free of charge, to any person
|
||||
+ * obtaining a copy of this software and associated documentation
|
||||
+ * files (the "Software"), to deal in the Software without
|
||||
+ * restriction, including without limitation the rights to use
|
||||
+ * copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
+ * sell copies of the Software, and to permit persons to whom the
|
||||
+ * Software is furnished to do so, subject to the following
|
||||
+ * conditions:
|
||||
+ *
|
||||
+ * The above copyright notice and this permission notice shall be
|
||||
+ * included in all copies or substantial portions of the Software.
|
||||
+ *
|
||||
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
+ * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
+ * OTHER DEALINGS IN THE SOFTWARE.
|
||||
+ */
|
||||
+#include "imx6qdl-microsom.dtsi"
|
||||
+#include "imx6qdl-microsom-ar8035.dtsi"
|
||||
+
|
||||
+/ {
|
||||
+ chosen {
|
||||
+ stdout-path = &uart1;
|
||||
+ };
|
||||
+
|
||||
+ ir_recv: ir-receiver {
|
||||
+ compatible = "gpio-ir-receiver";
|
||||
+ gpios = <&gpio7 9 1>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_gpio7_9>;
|
||||
+ linux,rc-map-name = "rc-rc6-mce";
|
||||
+ };
|
||||
+
|
||||
+ usdhc2_pwrseq: usdhc2-pwrseq {
|
||||
+ compatible = "mmc-pwrseq-simple";
|
||||
+ reset-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
|
||||
+ };
|
||||
+
|
||||
+ reg_3p3v: regulator-3p3v {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "3P3V";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ reg_1p8v: regulator-1p8v {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "1P8V";
|
||||
+ regulator-min-microvolt = <1800000>;
|
||||
+ regulator-max-microvolt = <1800000>;
|
||||
+ regulator-always-on;
|
||||
+ };
|
||||
+
|
||||
+ reg_usbh1_vbus: regulator-usb-h1-vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ enable-active-high;
|
||||
+ gpio = <&gpio1 0 0>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_usbh1_vbus>;
|
||||
+ regulator-name = "usb_h1_vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ };
|
||||
+
|
||||
+ reg_usbotg_vbus: regulator-usb-otg-vbus {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ enable-active-high;
|
||||
+ gpio = <&gpio3 22 0>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_usbotg_vbus>;
|
||||
+ regulator-name = "usb_otg_vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ };
|
||||
+
|
||||
+ reg_usbh2_vbus: regulator-usb-h2-vbus {
|
||||
+ compatible = "regulator-gpio";
|
||||
+ enable-active-high;
|
||||
+ enable-gpio = <&gpio2 13 0>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_usbh2_vbus>;
|
||||
+ regulator-name = "usb_h2_vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ reg_usbh3_vbus: regulator-usb-h3-vbus {
|
||||
+ compatible = "regulator-gpio";
|
||||
+ enable-active-high;
|
||||
+ enable-gpio = <&gpio7 10 0>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_usbh3_vbus>;
|
||||
+ regulator-name = "usb_h3_vbus";
|
||||
+ regulator-min-microvolt = <5000000>;
|
||||
+ regulator-max-microvolt = <5000000>;
|
||||
+ regulator-boot-on;
|
||||
+ };
|
||||
+
|
||||
+ sound-sgtl5000 {
|
||||
+ audio-codec = <&sgtl5000>;
|
||||
+ audio-routing =
|
||||
+ "MIC_IN", "Mic Jack",
|
||||
+ "Mic Jack", "Mic Bias",
|
||||
+ "Headphone Jack", "HP_OUT";
|
||||
+ compatible = "fsl,imx-audio-sgtl5000";
|
||||
+ model = "On-board Codec";
|
||||
+ mux-ext-port = <5>;
|
||||
+ mux-int-port = <1>;
|
||||
+ ssi-controller = <&ssi1>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&audmux {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&ecspi2 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_ecspi2>;
|
||||
+ cs-gpios = <&gpio2 26 0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&hdmi {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_hdmi>;
|
||||
+ ddc-i2c-bus = <&i2c2>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c1 {
|
||||
+ clock-frequency = <100000>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_i2c1>;
|
||||
+ status = "okay";
|
||||
+
|
||||
+ pcf8523: rtc@68 {
|
||||
+ compatible = "nxp,pcf8523";
|
||||
+ reg = <0x68>;
|
||||
+ nxp,12p5_pf;
|
||||
+ };
|
||||
+
|
||||
+ sgtl5000: codec@0a {
|
||||
+ clocks = <&clks IMX6QDL_CLK_CKO>;
|
||||
+ compatible = "fsl,sgtl5000";
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_sgtl5000>;
|
||||
+ reg = <0x0a>;
|
||||
+ VDDA-supply = <®_3p3v>;
|
||||
+ VDDIO-supply = <®_3p3v>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&i2c2 {
|
||||
+ clock-frequency = <100000>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_i2c2>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&i2c3 {
|
||||
+ clock-frequency = <100000>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_i2c3>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&iomuxc {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hog>;
|
||||
+
|
||||
+ hummingboard2 {
|
||||
+ pinctrl_hog: hoggrp {
|
||||
+ fsl,pins = <
|
||||
+ /*
|
||||
+ * 36 pin headers GPIO description. The pins
|
||||
+ * numbering as following -
|
||||
+ *
|
||||
+ * 3.2v 5v 74 75
|
||||
+ * 73 72 71 70
|
||||
+ * 69 68 67 66
|
||||
+ *
|
||||
+ * 77 78 79 76
|
||||
+ * 65 64 61 60
|
||||
+ * 53 52 51 50
|
||||
+ * 49 48 166 132
|
||||
+ * 95 94 90 91
|
||||
+ * GND 54 24 204
|
||||
+ *
|
||||
+ * The GPIO numbers can be extracted using
|
||||
+ * signal name from below.
|
||||
+ * Example -
|
||||
+ * MX6QDL_PAD_EIM_DA10__GPIO3_IO10 is
|
||||
+ * GPIO(3,10) which is (3-1)*32+10 = gpio 74
|
||||
+ *
|
||||
+ * i.e. The mapping of GPIO(X,Y) to Linux gpio
|
||||
+ * number is : gpio number = (X-1) * 32 + Y
|
||||
+ */
|
||||
+ /* DI1_PIN15 */
|
||||
+ MX6QDL_PAD_EIM_DA10__GPIO3_IO10 0x400130b1
|
||||
+ /* DI1_PIN02 */
|
||||
+ MX6QDL_PAD_EIM_DA11__GPIO3_IO11 0x400130b1
|
||||
+ /* DISP1_DATA00 */
|
||||
+ MX6QDL_PAD_EIM_DA9__GPIO3_IO09 0x400130b1
|
||||
+ /* DISP1_DATA01 */
|
||||
+ MX6QDL_PAD_EIM_DA8__GPIO3_IO08 0x400130b1
|
||||
+ /* DISP1_DATA02 */
|
||||
+ MX6QDL_PAD_EIM_DA7__GPIO3_IO07 0x400130b1
|
||||
+ /* DISP1_DATA03 */
|
||||
+ MX6QDL_PAD_EIM_DA6__GPIO3_IO06 0x400130b1
|
||||
+ /* DISP1_DATA04 */
|
||||
+ MX6QDL_PAD_EIM_DA5__GPIO3_IO05 0x400130b1
|
||||
+ /* DISP1_DATA05 */
|
||||
+ MX6QDL_PAD_EIM_DA4__GPIO3_IO04 0x400130b1
|
||||
+ /* DISP1_DATA06 */
|
||||
+ MX6QDL_PAD_EIM_DA3__GPIO3_IO03 0x400130b1
|
||||
+ /* DISP1_DATA07 */
|
||||
+ MX6QDL_PAD_EIM_DA2__GPIO3_IO02 0x400130b1
|
||||
+ /* DI1_D0_CS */
|
||||
+ MX6QDL_PAD_EIM_DA13__GPIO3_IO13 0x400130b1
|
||||
+ /* DI1_D1_CS */
|
||||
+ MX6QDL_PAD_EIM_DA14__GPIO3_IO14 0x400130b1
|
||||
+ /* DI1_PIN01 */
|
||||
+ MX6QDL_PAD_EIM_DA15__GPIO3_IO15 0x400130b1
|
||||
+ /* DI1_PIN03 */
|
||||
+ MX6QDL_PAD_EIM_DA12__GPIO3_IO12 0x400130b1
|
||||
+ /* DISP1_DATA08 */
|
||||
+ MX6QDL_PAD_EIM_DA1__GPIO3_IO01 0x400130b1
|
||||
+ /* DISP1_DATA09 */
|
||||
+ MX6QDL_PAD_EIM_DA0__GPIO3_IO00 0x400130b1
|
||||
+ /* DISP1_DATA10 */
|
||||
+ MX6QDL_PAD_EIM_EB1__GPIO2_IO29 0x400130b1
|
||||
+ /* DISP1_DATA11 */
|
||||
+ MX6QDL_PAD_EIM_EB0__GPIO2_IO28 0x400130b1
|
||||
+ /* DISP1_DATA12 */
|
||||
+ MX6QDL_PAD_EIM_A17__GPIO2_IO21 0x400130b1
|
||||
+ /* DISP1_DATA13 */
|
||||
+ MX6QDL_PAD_EIM_A18__GPIO2_IO20 0x400130b1
|
||||
+ /* DISP1_DATA14 */
|
||||
+ MX6QDL_PAD_EIM_A19__GPIO2_IO19 0x400130b1
|
||||
+ /* DISP1_DATA15 */
|
||||
+ MX6QDL_PAD_EIM_A20__GPIO2_IO18 0x400130b1
|
||||
+ /* DISP1_DATA16 */
|
||||
+ MX6QDL_PAD_EIM_A21__GPIO2_IO17 0x400130b1
|
||||
+ /* DISP1_DATA17 */
|
||||
+ MX6QDL_PAD_EIM_A22__GPIO2_IO16 0x400130b1
|
||||
+ /* DISP1_DATA18 */
|
||||
+ MX6QDL_PAD_EIM_A23__GPIO6_IO06 0x400130b1
|
||||
+ /* DISP1_DATA19 */
|
||||
+ MX6QDL_PAD_EIM_A24__GPIO5_IO04 0x400130b1
|
||||
+ /* DISP1_DATA20 */
|
||||
+ MX6QDL_PAD_EIM_D31__GPIO3_IO31 0x400130b1
|
||||
+ /* DISP1_DATA21 */
|
||||
+ MX6QDL_PAD_EIM_D30__GPIO3_IO30 0x400130b1
|
||||
+ /* DISP1_DATA22 */
|
||||
+ MX6QDL_PAD_EIM_D26__GPIO3_IO26 0x400130b1
|
||||
+ /* DISP1_DATA23 */
|
||||
+ MX6QDL_PAD_EIM_D27__GPIO3_IO27 0x400130b1
|
||||
+ /* DI1_DISP_CLK */
|
||||
+ MX6QDL_PAD_EIM_A16__GPIO2_IO22 0x400130b1
|
||||
+ /* SPDIF_IN */
|
||||
+ MX6QDL_PAD_ENET_RX_ER__GPIO1_IO24 0x400130b1
|
||||
+ /* SPDIF_OUT */
|
||||
+ MX6QDL_PAD_GPIO_17__GPIO7_IO12 0x400130b1
|
||||
+
|
||||
+ /* MikroBUS GPIO pin number 10 */
|
||||
+ MX6QDL_PAD_EIM_LBA__GPIO2_IO27 0x400130b1
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_ecspi2: hummingboard2-ecspi2grp {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_EIM_OE__ECSPI2_MISO 0x100b1
|
||||
+ MX6QDL_PAD_EIM_CS1__ECSPI2_MOSI 0x100b1
|
||||
+ MX6QDL_PAD_EIM_CS0__ECSPI2_SCLK 0x100b1
|
||||
+ MX6QDL_PAD_EIM_RW__GPIO2_IO26 0x000b1 /* CS */
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_gpio7_9: hummingboard2-gpio7_9 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD4_CMD__GPIO7_IO09 0x80000000
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_hdmi: hummingboard2-hdmi {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_KEY_ROW2__HDMI_TX_CEC_LINE 0x1f8b0
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_i2c1: hummingboard2-i2c1 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_EIM_D21__I2C1_SCL 0x4001b8b1
|
||||
+ MX6QDL_PAD_EIM_D28__I2C1_SDA 0x4001b8b1
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_i2c2: hummingboard2-i2c2 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_KEY_COL3__I2C2_SCL 0x4001b8b1
|
||||
+ MX6QDL_PAD_KEY_ROW3__I2C2_SDA 0x4001b8b1
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_i2c3: hummingboard2-i2c3 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_EIM_D17__I2C3_SCL 0x4001b8b1
|
||||
+ MX6QDL_PAD_EIM_D18__I2C3_SDA 0x4001b8b1
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_mipi: hummingboard2_mipi {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD4_DAT2__GPIO2_IO10 0x4001b8b1
|
||||
+ MX6QDL_PAD_KEY_COL4__GPIO4_IO14 0x4001b8b1
|
||||
+ MX6QDL_PAD_NANDF_CS2__CCM_CLKO2 0x130b0
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_pcie_reset: hummingboard2-pcie-reset {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD4_DAT3__GPIO2_IO11 0x1b0b1
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_pwm1: pwm1grp {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_DISP0_DAT8__PWM1_OUT 0x1b0b1
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_sgtl5000: hummingboard2-sgtl5000 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_DISP0_DAT19__AUD5_RXD 0x130b0
|
||||
+ MX6QDL_PAD_KEY_COL0__AUD5_TXC 0x130b0
|
||||
+ MX6QDL_PAD_KEY_ROW0__AUD5_TXD 0x110b0
|
||||
+ MX6QDL_PAD_KEY_COL1__AUD5_TXFS 0x130b0
|
||||
+ MX6QDL_PAD_GPIO_5__CCM_CLKO1 0x130b0
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usbh1_vbus: hummingboard2-usbh1-vbus {
|
||||
+ fsl,pins = <MX6QDL_PAD_GPIO_0__GPIO1_IO00 0x1b0b0>;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usbh2_vbus: hummingboard2-usbh2-vbus {
|
||||
+ fsl,pins = <MX6QDL_PAD_SD4_DAT5__GPIO2_IO13 0x1b0b0>;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usbh3_vbus: hummingboard2-usbh3-vbus {
|
||||
+ fsl,pins = <MX6QDL_PAD_SD4_CLK__GPIO7_IO10 0x1b0b0>;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usbotg_id: hummingboard2-usbotg-id {
|
||||
+ /*
|
||||
+ * Similar to pinctrl_usbotg_2, but we want it
|
||||
+ * pulled down for a fixed host connection.
|
||||
+ */
|
||||
+ fsl,pins = <MX6QDL_PAD_GPIO_1__USB_OTG_ID 0x13059>;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usbotg_vbus: hummingboard2-usbotg-vbus {
|
||||
+ fsl,pins = <MX6QDL_PAD_EIM_D22__GPIO3_IO22 0x1b0b0>;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usdhc2_aux: hummingboard2-usdhc2-aux {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x13071
|
||||
+ MX6QDL_PAD_KEY_ROW1__SD2_VSELECT 0x1b071
|
||||
+ MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30 0x1b0b0
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usdhc2: hummingboard2-usdhc2 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD2_CMD__SD2_CMD 0x17059
|
||||
+ MX6QDL_PAD_SD2_CLK__SD2_CLK 0x10059
|
||||
+ MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x17059
|
||||
+ MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059
|
||||
+ MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059
|
||||
+ MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x13059
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usdhc2_100mhz: hummingboard2-usdhc2-100mhz {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD2_CMD__SD2_CMD 0x170b9
|
||||
+ MX6QDL_PAD_SD2_CLK__SD2_CLK 0x100b9
|
||||
+ MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x170b9
|
||||
+ MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x170b9
|
||||
+ MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x170b9
|
||||
+ MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x130b9
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usdhc2_200mhz: hummingboard2-usdhc2-200mhz {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD2_CMD__SD2_CMD 0x170f9
|
||||
+ MX6QDL_PAD_SD2_CLK__SD2_CLK 0x100f9
|
||||
+ MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x170f9
|
||||
+ MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x170f9
|
||||
+ MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x170f9
|
||||
+ MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x130f9
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_usdhc3: hummingboard2-usdhc3 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_SD3_CMD__SD3_CMD 0x17059
|
||||
+ MX6QDL_PAD_SD3_CLK__SD3_CLK 0x10059
|
||||
+ MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT4__SD3_DATA4 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT5__SD3_DATA5 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT6__SD3_DATA6 0x17059
|
||||
+ MX6QDL_PAD_SD3_DAT7__SD3_DATA7 0x17059
|
||||
+ MX6QDL_PAD_SD3_RST__SD3_RESET 0x17059
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
+ pinctrl_hummingboard2_uart3: hummingboard2-uart3 {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_EIM_D25__UART3_TX_DATA 0x1b0b1
|
||||
+ MX6QDL_PAD_EIM_D24__UART3_RX_DATA 0x40013000
|
||||
+ >;
|
||||
+ };
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&ldb {
|
||||
+ status = "disabled";
|
||||
+
|
||||
+ lvds-channel@0 {
|
||||
+ fsl,data-mapping = "spwg";
|
||||
+ fsl,data-width = <18>;
|
||||
+ };
|
||||
+};
|
||||
+
|
||||
+&pcie {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_pcie_reset>;
|
||||
+ reset-gpio = <&gpio2 11 0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm1 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_pwm1>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&pwm3 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&pwm4 {
|
||||
+ status = "disabled";
|
||||
+};
|
||||
+
|
||||
+&ssi1 {
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbh1 {
|
||||
+ disable-over-current;
|
||||
+ vbus-supply = <®_usbh1_vbus>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usbotg {
|
||||
+ disable-over-current;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_usbotg_id>;
|
||||
+ vbus-supply = <®_usbotg_vbus>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usdhc2 {
|
||||
+ pinctrl-names = "default", "state_100mhz", "state_200mhz";
|
||||
+ pinctrl-0 = <
|
||||
+ &pinctrl_hummingboard2_usdhc2_aux
|
||||
+ &pinctrl_hummingboard2_usdhc2
|
||||
+ >;
|
||||
+ pinctrl-1 = <
|
||||
+ &pinctrl_hummingboard2_usdhc2_aux
|
||||
+ &pinctrl_hummingboard2_usdhc2_100mhz
|
||||
+ >;
|
||||
+ pinctrl-2 = <
|
||||
+ &pinctrl_hummingboard2_usdhc2_aux
|
||||
+ &pinctrl_hummingboard2_usdhc2_200mhz
|
||||
+ >;
|
||||
+ mmc-pwrseq = <&usdhc2_pwrseq>;
|
||||
+ cd-gpios = <&gpio1 4 0>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&usdhc3 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <
|
||||
+ &pinctrl_hummingboard2_usdhc3
|
||||
+ >;
|
||||
+ vmmc-supply = <®_3p3v>;
|
||||
+ vqmmc-supply = <®_3p3v>;
|
||||
+ bus-width = <8>;
|
||||
+ non-removable;
|
||||
+ status = "okay";
|
||||
+};
|
||||
+
|
||||
+&uart3 {
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_uart3>;
|
||||
+ status = "okay";
|
||||
+};
|
||||
--
|
||||
2.12.2
|
||||
|
||||
From 3da2a99c4a8f19e846b19071441d2c6b88e00c06 Mon Sep 17 00:00:00 2001
|
||||
From: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
Date: Fri, 13 Jan 2017 14:45:30 +0000
|
||||
Subject: [PATCH 2/4] ARM: dts: imx6*-hummingboard2: fix SD card detect
|
||||
|
||||
Fix the SD card detect signal, which was missing the polarity
|
||||
specification, and the pull-up necessary for proper signalling.
|
||||
|
||||
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
---
|
||||
arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi | 4 ++--
|
||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
index 11b63f6f2b89..734487edf200 100644
|
||||
--- a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
+++ b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
@@ -393,7 +393,7 @@
|
||||
|
||||
pinctrl_hummingboard2_usdhc2_aux: hummingboard2-usdhc2-aux {
|
||||
fsl,pins = <
|
||||
- MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x13071
|
||||
+ MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x1f071
|
||||
MX6QDL_PAD_KEY_ROW1__SD2_VSELECT 0x1b071
|
||||
MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30 0x1b0b0
|
||||
>;
|
||||
@@ -520,7 +520,7 @@
|
||||
&pinctrl_hummingboard2_usdhc2_200mhz
|
||||
>;
|
||||
mmc-pwrseq = <&usdhc2_pwrseq>;
|
||||
- cd-gpios = <&gpio1 4 0>;
|
||||
+ cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
--
|
||||
2.12.2
|
||||
|
||||
From 57b0103b600a535a35e5ff9714649519a0b3a77a Mon Sep 17 00:00:00 2001
|
||||
From: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
Date: Fri, 13 Jan 2017 14:45:35 +0000
|
||||
Subject: [PATCH 3/4] ARM: dts: imx6*-hummingboard2: use proper gpio flags
|
||||
definitions
|
||||
|
||||
Use proper gpio flag definitions for GPIOs rather than using opaque
|
||||
uninformative numbers.
|
||||
|
||||
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
|
||||
---
|
||||
arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi | 10 +++++-----
|
||||
1 file changed, 5 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
index 734487edf200..88aaed26dd77 100644
|
||||
--- a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
+++ b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
ir_recv: ir-receiver {
|
||||
compatible = "gpio-ir-receiver";
|
||||
- gpios = <&gpio7 9 1>;
|
||||
+ gpios = <&gpio7 9 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hummingboard2_gpio7_9>;
|
||||
linux,rc-map-name = "rc-rc6-mce";
|
||||
@@ -80,7 +80,7 @@
|
||||
reg_usbh1_vbus: regulator-usb-h1-vbus {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
- gpio = <&gpio1 0 0>;
|
||||
+ gpio = <&gpio1 0 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hummingboard2_usbh1_vbus>;
|
||||
regulator-name = "usb_h1_vbus";
|
||||
@@ -91,7 +91,7 @@
|
||||
reg_usbotg_vbus: regulator-usb-otg-vbus {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
- gpio = <&gpio3 22 0>;
|
||||
+ gpio = <&gpio3 22 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hummingboard2_usbotg_vbus>;
|
||||
regulator-name = "usb_otg_vbus";
|
||||
@@ -102,7 +102,7 @@
|
||||
reg_usbh2_vbus: regulator-usb-h2-vbus {
|
||||
compatible = "regulator-gpio";
|
||||
enable-active-high;
|
||||
- enable-gpio = <&gpio2 13 0>;
|
||||
+ enable-gpio = <&gpio2 13 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hummingboard2_usbh2_vbus>;
|
||||
regulator-name = "usb_h2_vbus";
|
||||
@@ -114,7 +114,7 @@
|
||||
reg_usbh3_vbus: regulator-usb-h3-vbus {
|
||||
compatible = "regulator-gpio";
|
||||
enable-active-high;
|
||||
- enable-gpio = <&gpio7 10 0>;
|
||||
+ enable-gpio = <&gpio7 10 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_hummingboard2_usbh3_vbus>;
|
||||
regulator-name = "usb_h3_vbus";
|
||||
--
|
||||
2.12.2
|
||||
|
||||
From f931de70370ff576f381cb9745bc54225a1a8056 Mon Sep 17 00:00:00 2001
|
||||
From: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
Date: Fri, 13 Jan 2017 14:45:40 +0000
|
||||
Subject: [PATCH 4/4] ARM: dts: imx6*-hummingboard2: convert to more
|
||||
conventional vmmc-supply
|
||||
|
||||
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
|
||||
---
|
||||
arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi | 26 +++++++++++++++++++-------
|
||||
1 file changed, 19 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
index 88aaed26dd77..f19d30b34ac4 100644
|
||||
--- a/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
+++ b/arch/arm/boot/dts/imx6qdl-hummingboard2.dtsi
|
||||
@@ -56,11 +56,6 @@
|
||||
linux,rc-map-name = "rc-rc6-mce";
|
||||
};
|
||||
|
||||
- usdhc2_pwrseq: usdhc2-pwrseq {
|
||||
- compatible = "mmc-pwrseq-simple";
|
||||
- reset-gpios = <&gpio4 30 GPIO_ACTIVE_HIGH>;
|
||||
- };
|
||||
-
|
||||
reg_3p3v: regulator-3p3v {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "3P3V";
|
||||
@@ -123,6 +118,18 @@
|
||||
regulator-boot-on;
|
||||
};
|
||||
|
||||
+ reg_usdhc2_vmmc: reg-usdhc2-vmmc {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ gpio = <&gpio4 30 GPIO_ACTIVE_HIGH>;
|
||||
+ pinctrl-names = "default";
|
||||
+ pinctrl-0 = <&pinctrl_hummingboard2_vmmc>;
|
||||
+ regulator-boot-on;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-name = "usdhc2_vmmc";
|
||||
+ startup-delay-us = <1000>;
|
||||
+ };
|
||||
+
|
||||
sound-sgtl5000 {
|
||||
audio-codec = <&sgtl5000>;
|
||||
audio-routing =
|
||||
@@ -393,7 +400,6 @@
|
||||
|
||||
pinctrl_hummingboard2_usdhc2_aux: hummingboard2-usdhc2-aux {
|
||||
fsl,pins = <
|
||||
- MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x1f071
|
||||
MX6QDL_PAD_KEY_ROW1__SD2_VSELECT 0x1b071
|
||||
MX6QDL_PAD_DISP0_DAT9__GPIO4_IO30 0x1b0b0
|
||||
>;
|
||||
@@ -432,6 +438,12 @@
|
||||
>;
|
||||
};
|
||||
|
||||
+ pinctrl_hummingboard2_vmmc: hummingboard2-vmmc {
|
||||
+ fsl,pins = <
|
||||
+ MX6QDL_PAD_GPIO_4__GPIO1_IO04 0x1f071
|
||||
+ >;
|
||||
+ };
|
||||
+
|
||||
pinctrl_hummingboard2_usdhc3: hummingboard2-usdhc3 {
|
||||
fsl,pins = <
|
||||
MX6QDL_PAD_SD3_CMD__SD3_CMD 0x17059
|
||||
@@ -519,7 +531,7 @@
|
||||
&pinctrl_hummingboard2_usdhc2_aux
|
||||
&pinctrl_hummingboard2_usdhc2_200mhz
|
||||
>;
|
||||
- mmc-pwrseq = <&usdhc2_pwrseq>;
|
||||
+ vmmc-supply = <®_usdhc2_vmmc>;
|
||||
cd-gpios = <&gpio1 4 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
};
|
||||
--
|
||||
2.12.2
|
||||
|
@ -1,100 +0,0 @@
|
||||
From bb3e08008c0e48fd4f51a0f0957eecae61a24d69 Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Tue, 1 Nov 2016 09:35:30 +0000
|
||||
Subject: [PATCH] Revert "mmc: omap_hsmmc: Use dma_request_chan() for
|
||||
requesting DMA channel"
|
||||
|
||||
This reverts commit 81eef6ca92014845d40e3f1310e42b7010303acc.
|
||||
---
|
||||
drivers/mmc/host/omap_hsmmc.c | 50 ++++++++++++++++++++++++++++++++++---------
|
||||
1 file changed, 40 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
|
||||
index 24ebc9a..3563321 100644
|
||||
--- a/drivers/mmc/host/omap_hsmmc.c
|
||||
+++ b/drivers/mmc/host/omap_hsmmc.c
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_gpio.h>
|
||||
#include <linux/of_device.h>
|
||||
+#include <linux/omap-dmaengine.h>
|
||||
#include <linux/mmc/host.h>
|
||||
#include <linux/mmc/core.h>
|
||||
#include <linux/mmc/mmc.h>
|
||||
@@ -1992,6 +1993,8 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
|
||||
struct resource *res;
|
||||
int ret, irq;
|
||||
const struct of_device_id *match;
|
||||
+ dma_cap_mask_t mask;
|
||||
+ unsigned tx_req, rx_req;
|
||||
const struct omap_mmc_of_data *data;
|
||||
void __iomem *base;
|
||||
|
||||
@@ -2121,17 +2124,44 @@ static int omap_hsmmc_probe(struct platform_device *pdev)
|
||||
|
||||
omap_hsmmc_conf_bus_power(host);
|
||||
|
||||
- host->rx_chan = dma_request_chan(&pdev->dev, "rx");
|
||||
- if (IS_ERR(host->rx_chan)) {
|
||||
- dev_err(mmc_dev(host->mmc), "RX DMA channel request failed\n");
|
||||
- ret = PTR_ERR(host->rx_chan);
|
||||
+ if (!pdev->dev.of_node) {
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "tx");
|
||||
+ if (!res) {
|
||||
+ dev_err(mmc_dev(host->mmc), "cannot get DMA TX channel\n");
|
||||
+ ret = -ENXIO;
|
||||
+ goto err_irq;
|
||||
+ }
|
||||
+ tx_req = res->start;
|
||||
+
|
||||
+ res = platform_get_resource_byname(pdev, IORESOURCE_DMA, "rx");
|
||||
+ if (!res) {
|
||||
+ dev_err(mmc_dev(host->mmc), "cannot get DMA RX channel\n");
|
||||
+ ret = -ENXIO;
|
||||
+ goto err_irq;
|
||||
+ }
|
||||
+ rx_req = res->start;
|
||||
+ }
|
||||
+
|
||||
+ dma_cap_zero(mask);
|
||||
+ dma_cap_set(DMA_SLAVE, mask);
|
||||
+
|
||||
+ host->rx_chan =
|
||||
+ dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
|
||||
+ &rx_req, &pdev->dev, "rx");
|
||||
+
|
||||
+ if (!host->rx_chan) {
|
||||
+ dev_err(mmc_dev(host->mmc), "unable to obtain RX DMA engine channel\n");
|
||||
+ ret = -ENXIO;
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
- host->tx_chan = dma_request_chan(&pdev->dev, "tx");
|
||||
- if (IS_ERR(host->tx_chan)) {
|
||||
- dev_err(mmc_dev(host->mmc), "TX DMA channel request failed\n");
|
||||
- ret = PTR_ERR(host->tx_chan);
|
||||
+ host->tx_chan =
|
||||
+ dma_request_slave_channel_compat(mask, omap_dma_filter_fn,
|
||||
+ &tx_req, &pdev->dev, "tx");
|
||||
+
|
||||
+ if (!host->tx_chan) {
|
||||
+ dev_err(mmc_dev(host->mmc), "unable to obtain TX DMA engine channel\n");
|
||||
+ ret = -ENXIO;
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
@@ -2189,9 +2219,9 @@ err_slot_name:
|
||||
mmc_remove_host(mmc);
|
||||
err_irq:
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
- if (!IS_ERR_OR_NULL(host->tx_chan))
|
||||
+ if (host->tx_chan)
|
||||
dma_release_channel(host->tx_chan);
|
||||
- if (!IS_ERR_OR_NULL(host->rx_chan))
|
||||
+ if (host->rx_chan)
|
||||
dma_release_channel(host->rx_chan);
|
||||
pm_runtime_dont_use_autosuspend(host->dev);
|
||||
pm_runtime_put_sync(host->dev);
|
||||
--
|
||||
2.9.3
|
||||
|
131
arm-sunxi-nvmem-fixH3.patch
Normal file
131
arm-sunxi-nvmem-fixH3.patch
Normal file
@ -0,0 +1,131 @@
|
||||
From 0ab09d651b5858f9bc7d5f74e725334a661828e0 Mon Sep 17 00:00:00 2001
|
||||
From: Icenowy Zheng <icenowy@aosc.io>
|
||||
Date: Fri, 9 Mar 2018 14:47:17 +0000
|
||||
Subject: nvmem: sunxi-sid: fix H3 SID controller support
|
||||
|
||||
It seems that doing some operation will make the value pre-read on H3
|
||||
SID controller wrong again, so all operation should be performed by
|
||||
register.
|
||||
|
||||
Change the SID reading to use register only.
|
||||
|
||||
Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
|
||||
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
|
||||
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||||
---
|
||||
drivers/nvmem/sunxi_sid.c | 71 +++++++++++++++++++++++++++++++++--------------
|
||||
1 file changed, 50 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/drivers/nvmem/sunxi_sid.c b/drivers/nvmem/sunxi_sid.c
|
||||
index 99bd54d..26bb637 100644
|
||||
--- a/drivers/nvmem/sunxi_sid.c
|
||||
+++ b/drivers/nvmem/sunxi_sid.c
|
||||
@@ -85,13 +85,14 @@ static int sunxi_sid_read(void *context, unsigned int offset,
|
||||
}
|
||||
|
||||
static int sun8i_sid_register_readout(const struct sunxi_sid *sid,
|
||||
- const unsigned int word)
|
||||
+ const unsigned int offset,
|
||||
+ u32 *out)
|
||||
{
|
||||
u32 reg_val;
|
||||
int ret;
|
||||
|
||||
/* Set word, lock access, and set read command */
|
||||
- reg_val = (word & SUN8I_SID_OFFSET_MASK)
|
||||
+ reg_val = (offset & SUN8I_SID_OFFSET_MASK)
|
||||
<< SUN8I_SID_OFFSET_SHIFT;
|
||||
reg_val |= SUN8I_SID_OP_LOCK | SUN8I_SID_READ;
|
||||
writel(reg_val, sid->base + SUN8I_SID_PRCTL);
|
||||
@@ -101,7 +102,49 @@ static int sun8i_sid_register_readout(const struct sunxi_sid *sid,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
+ if (out)
|
||||
+ *out = readl(sid->base + SUN8I_SID_RDKEY);
|
||||
+
|
||||
writel(0, sid->base + SUN8I_SID_PRCTL);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/*
|
||||
+ * On Allwinner H3, the value on the 0x200 offset of the SID controller seems
|
||||
+ * to be not reliable at all.
|
||||
+ * Read by the registers instead.
|
||||
+ */
|
||||
+static int sun8i_sid_read_byte_by_reg(const struct sunxi_sid *sid,
|
||||
+ const unsigned int offset,
|
||||
+ u8 *out)
|
||||
+{
|
||||
+ u32 word;
|
||||
+ int ret;
|
||||
+
|
||||
+ ret = sun8i_sid_register_readout(sid, offset & ~0x03, &word);
|
||||
+
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+
|
||||
+ *out = (word >> ((offset & 0x3) * 8)) & 0xff;
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int sun8i_sid_read_by_reg(void *context, unsigned int offset,
|
||||
+ void *val, size_t bytes)
|
||||
+{
|
||||
+ struct sunxi_sid *sid = context;
|
||||
+ u8 *buf = val;
|
||||
+ int ret;
|
||||
+
|
||||
+ while (bytes--) {
|
||||
+ ret = sun8i_sid_read_byte_by_reg(sid, offset++, buf++);
|
||||
+ if (ret)
|
||||
+ return ret;
|
||||
+ }
|
||||
+
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -131,26 +174,12 @@ static int sunxi_sid_probe(struct platform_device *pdev)
|
||||
|
||||
size = cfg->size;
|
||||
|
||||
- if (cfg->need_register_readout) {
|
||||
- /*
|
||||
- * H3's SID controller have a bug that the value at 0x200
|
||||
- * offset is not the correct value when the hardware is reseted.
|
||||
- * However, after doing a register-based read operation, the
|
||||
- * value become right.
|
||||
- * Do a full read operation here, but ignore its value
|
||||
- * (as it's more fast to read by direct MMIO value than
|
||||
- * with registers)
|
||||
- */
|
||||
- for (i = 0; i < (size >> 2); i++) {
|
||||
- ret = sun8i_sid_register_readout(sid, i);
|
||||
- if (ret)
|
||||
- return ret;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
econfig.size = size;
|
||||
econfig.dev = dev;
|
||||
- econfig.reg_read = sunxi_sid_read;
|
||||
+ if (cfg->need_register_readout)
|
||||
+ econfig.reg_read = sun8i_sid_read_by_reg;
|
||||
+ else
|
||||
+ econfig.reg_read = sunxi_sid_read;
|
||||
econfig.priv = sid;
|
||||
nvmem = nvmem_register(&econfig);
|
||||
if (IS_ERR(nvmem))
|
||||
@@ -163,7 +192,7 @@ static int sunxi_sid_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
for (i = 0; i < size; i++)
|
||||
- randomness[i] = sunxi_sid_read_byte(sid, i);
|
||||
+ econfig.reg_read(sid, i, &randomness[i], 1);
|
||||
|
||||
add_device_randomness(randomness, size);
|
||||
kfree(randomness);
|
||||
--
|
||||
cgit v1.1
|
64
arm-tegra-fix-nouveau-crash.patch
Normal file
64
arm-tegra-fix-nouveau-crash.patch
Normal file
@ -0,0 +1,64 @@
|
||||
From 369971aa0101c4cfb84dacaaaa1b5cc5790c14ff Mon Sep 17 00:00:00 2001
|
||||
From: Thierry Reding <treding@nvidia.com>
|
||||
Date: Wed, 11 Apr 2018 10:34:17 +0200
|
||||
Subject: [PATCH] drm/nouveau: tegra: Detach from ARM DMA/IOMMU mapping
|
||||
|
||||
Depending on the kernel configuration, early ARM architecture setup code
|
||||
may have attached the GPU to a DMA/IOMMU mapping that transparently uses
|
||||
the IOMMU to back the DMA API. Tegra requires special handling for IOMMU
|
||||
backed buffers (a special bit in the GPU's MMU page tables indicates the
|
||||
memory path to take: via the SMMU or directly to the memory controller).
|
||||
Transparently backing DMA memory with an IOMMU prevents Nouveau from
|
||||
properly handling such memory accesses and causes memory access faults.
|
||||
|
||||
As a side-note: buffers other than those allocated in instance memory
|
||||
don't need to be physically contiguous from the GPU's perspective since
|
||||
the GPU can map them into contiguous buffers using its own MMU. Mapping
|
||||
these buffers through the IOMMU is unnecessary and will even lead to
|
||||
performance degradation because of the additional translation.
|
||||
|
||||
Signed-off-by: Thierry Reding <treding@nvidia.com>
|
||||
---
|
||||
drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c | 19 +++++++++++++++++++
|
||||
1 file changed, 19 insertions(+)
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
|
||||
index 1f07999aea1d..ac7706f56f6f 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
|
||||
@@ -19,6 +19,11 @@
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
+
|
||||
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
|
||||
+#include <asm/dma-iommu.h>
|
||||
+#endif
|
||||
+
|
||||
#include <core/tegra.h>
|
||||
#ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
|
||||
#include "priv.h"
|
||||
@@ -105,6 +110,20 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev)
|
||||
unsigned long pgsize_bitmap;
|
||||
int ret;
|
||||
|
||||
+#if IS_ENABLED(CONFIG_ARM_DMA_USE_IOMMU)
|
||||
+ if (dev->archdata.mapping) {
|
||||
+ struct dma_iommu_mapping *mapping = to_dma_iommu_mapping(dev);
|
||||
+
|
||||
+ arm_iommu_release_mapping(mapping);
|
||||
+ arm_iommu_detach_device(dev);
|
||||
+
|
||||
+ if (dev->archdata.dma_coherent)
|
||||
+ set_dma_ops(dev, &arm_coherent_dma_ops);
|
||||
+ else
|
||||
+ set_dma_ops(dev, &arm_dma_ops);
|
||||
+ }
|
||||
+#endif
|
||||
+
|
||||
if (!tdev->func->iommu_bit)
|
||||
return;
|
||||
|
||||
--
|
||||
2.16.3
|
||||
|
@ -1,41 +0,0 @@
|
||||
From 90e388ca5d8bbee022f9ed5fc24137b31579fa6e Mon Sep 17 00:00:00 2001
|
||||
From: Peter Robinson <pbrobinson@gmail.com>
|
||||
Date: Wed, 22 Nov 2017 15:52:36 +0000
|
||||
Subject: [PATCH] Revert "arm64: allwinner: a64: pine64: Use dcdc1 regulator
|
||||
for mmc0"
|
||||
|
||||
This reverts commit 3f241bfa60bdc9c4fde63fa6664a8ce00fd668c6.
|
||||
---
|
||||
arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts | 9 ++++++++-
|
||||
1 file changed, 8 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
|
||||
index d06e34b5d192..caf8b6fbe5e3 100644
|
||||
--- a/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
|
||||
+++ b/arch/arm64/boot/dts/allwinner/sun50i-a64-pine64.dts
|
||||
@@ -61,6 +61,13 @@
|
||||
chosen {
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
+
|
||||
+ reg_vcc3v3: vcc3v3 {
|
||||
+ compatible = "regulator-fixed";
|
||||
+ regulator-name = "vcc3v3";
|
||||
+ regulator-min-microvolt = <3300000>;
|
||||
+ regulator-max-microvolt = <3300000>;
|
||||
+ };
|
||||
};
|
||||
|
||||
&ehci0 {
|
||||
@@ -84,7 +91,7 @@
|
||||
&mmc0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&mmc0_pins>;
|
||||
- vmmc-supply = <®_dcdc1>;
|
||||
+ vmmc-supply = <®_vcc3v3>;
|
||||
cd-gpios = <&pio 5 6 GPIO_ACTIVE_HIGH>;
|
||||
cd-inverted;
|
||||
disable-wp;
|
||||
--
|
||||
2.14.3
|
||||
|
@ -1,146 +0,0 @@
|
||||
From patchwork Mon Jan 8 15:44:19 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2] mmc: sdhci_f_sdh30: add ACPI support
|
||||
From: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
X-Patchwork-Id: 10149775
|
||||
Message-Id: <20180108154419.2821-1-ard.biesheuvel@linaro.org>
|
||||
To: linux-mmc@vger.kernel.org
|
||||
Cc: adrian.hunter@intel.com, ulf.hansson@linaro.org,
|
||||
Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
Date: Mon, 8 Jan 2018 15:44:19 +0000
|
||||
|
||||
The Fujitsu SDH30 SDHCI controller may be described as a SCX0002 ACPI
|
||||
device on ACPI platforms incorporating the Socionext SynQuacer SoC.
|
||||
|
||||
Given that mmc_of_parse() has already been made ACPI/DT agnostic,
|
||||
making the SDH30 driver ACPI capable is actually rather simple:
|
||||
all we need to do is make the call to sdhci_get_of_property() [which
|
||||
does not set any properties we care about] and the clock handling
|
||||
dependent on whether we are dealing with a DT device, and exposing
|
||||
the ACPI id via the platform_driver struct and the module metadata.
|
||||
|
||||
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
|
||||
Acked-by: Adrian Hunter <adrian.hunter@intel.com>
|
||||
---
|
||||
v2: make OF optional now that ACPI is supported
|
||||
drop dev_of_node() check when disabling the clocks - those routines
|
||||
tolerate NULL pointers so there's no need
|
||||
|
||||
drivers/mmc/host/Kconfig | 2 +-
|
||||
drivers/mmc/host/sdhci_f_sdh30.c | 52 +++++++++++++-------
|
||||
2 files changed, 35 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/drivers/mmc/host/Kconfig b/drivers/mmc/host/Kconfig
|
||||
index 567028c9219a..07ed947ed10b 100644
|
||||
--- a/drivers/mmc/host/Kconfig
|
||||
+++ b/drivers/mmc/host/Kconfig
|
||||
@@ -320,7 +320,7 @@ config MMC_SDHCI_BCM_KONA
|
||||
config MMC_SDHCI_F_SDH30
|
||||
tristate "SDHCI support for Fujitsu Semiconductor F_SDH30"
|
||||
depends on MMC_SDHCI_PLTFM
|
||||
- depends on OF
|
||||
+ depends on OF || ACPI
|
||||
help
|
||||
This selects the Secure Digital Host Controller Interface (SDHCI)
|
||||
Needed by some Fujitsu SoC for MMC / SD / SDIO support.
|
||||
diff --git a/drivers/mmc/host/sdhci_f_sdh30.c b/drivers/mmc/host/sdhci_f_sdh30.c
|
||||
index 04ca0d33a521..485f7591fae4 100644
|
||||
--- a/drivers/mmc/host/sdhci_f_sdh30.c
|
||||
+++ b/drivers/mmc/host/sdhci_f_sdh30.c
|
||||
@@ -10,9 +10,11 @@
|
||||
* the Free Software Foundation, version 2 of the License.
|
||||
*/
|
||||
|
||||
+#include <linux/acpi.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/module.h>
|
||||
+#include <linux/of.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/clk.h>
|
||||
|
||||
@@ -146,7 +148,6 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
|
||||
|
||||
platform_set_drvdata(pdev, host);
|
||||
|
||||
- sdhci_get_of_property(pdev);
|
||||
host->hw_name = "f_sdh30";
|
||||
host->ops = &sdhci_f_sdh30_ops;
|
||||
host->irq = irq;
|
||||
@@ -158,25 +159,29 @@ static int sdhci_f_sdh30_probe(struct platform_device *pdev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
- priv->clk_iface = devm_clk_get(&pdev->dev, "iface");
|
||||
- if (IS_ERR(priv->clk_iface)) {
|
||||
- ret = PTR_ERR(priv->clk_iface);
|
||||
- goto err;
|
||||
- }
|
||||
+ if (dev_of_node(dev)) {
|
||||
+ sdhci_get_of_property(pdev);
|
||||
|
||||
- ret = clk_prepare_enable(priv->clk_iface);
|
||||
- if (ret)
|
||||
- goto err;
|
||||
+ priv->clk_iface = devm_clk_get(&pdev->dev, "iface");
|
||||
+ if (IS_ERR(priv->clk_iface)) {
|
||||
+ ret = PTR_ERR(priv->clk_iface);
|
||||
+ goto err;
|
||||
+ }
|
||||
|
||||
- priv->clk = devm_clk_get(&pdev->dev, "core");
|
||||
- if (IS_ERR(priv->clk)) {
|
||||
- ret = PTR_ERR(priv->clk);
|
||||
- goto err_clk;
|
||||
- }
|
||||
+ ret = clk_prepare_enable(priv->clk_iface);
|
||||
+ if (ret)
|
||||
+ goto err;
|
||||
|
||||
- ret = clk_prepare_enable(priv->clk);
|
||||
- if (ret)
|
||||
- goto err_clk;
|
||||
+ priv->clk = devm_clk_get(&pdev->dev, "core");
|
||||
+ if (IS_ERR(priv->clk)) {
|
||||
+ ret = PTR_ERR(priv->clk);
|
||||
+ goto err_clk;
|
||||
+ }
|
||||
+
|
||||
+ ret = clk_prepare_enable(priv->clk);
|
||||
+ if (ret)
|
||||
+ goto err_clk;
|
||||
+ }
|
||||
|
||||
/* init vendor specific regs */
|
||||
ctrl = sdhci_readw(host, F_SDH30_AHB_CONFIG);
|
||||
@@ -226,16 +231,27 @@ static int sdhci_f_sdh30_remove(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+#ifdef CONFIG_OF
|
||||
static const struct of_device_id f_sdh30_dt_ids[] = {
|
||||
{ .compatible = "fujitsu,mb86s70-sdhci-3.0" },
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, f_sdh30_dt_ids);
|
||||
+#endif
|
||||
+
|
||||
+#ifdef CONFIG_ACPI
|
||||
+static const struct acpi_device_id f_sdh30_acpi_ids[] = {
|
||||
+ { "SCX0002" },
|
||||
+ { /* sentinel */ }
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(acpi, f_sdh30_acpi_ids);
|
||||
+#endif
|
||||
|
||||
static struct platform_driver sdhci_f_sdh30_driver = {
|
||||
.driver = {
|
||||
.name = "f_sdh30",
|
||||
- .of_match_table = f_sdh30_dt_ids,
|
||||
+ .of_match_table = of_match_ptr(f_sdh30_dt_ids),
|
||||
+ .acpi_match_table = ACPI_PTR(f_sdh30_acpi_ids),
|
||||
.pm = &sdhci_pltfm_pmops,
|
||||
},
|
||||
.probe = sdhci_f_sdh30_probe,
|
File diff suppressed because it is too large
Load Diff
403
arm64-thunderx-crypto-zip-fixes.patch
Normal file
403
arm64-thunderx-crypto-zip-fixes.patch
Normal file
@ -0,0 +1,403 @@
|
||||
From patchwork Mon Apr 9 15:45:50 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2,1/5] crypto: thunderx_zip: Fix fallout from CONFIG_VMAP_STACK
|
||||
From: Jan Glauber <jglauber@cavium.com>
|
||||
X-Patchwork-Id: 10331719
|
||||
Message-Id: <20180409154554.7578-2-jglauber@cavium.com>
|
||||
To: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "David S . Miller" <davem@davemloft.net>,
|
||||
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
Mahipal Challa <Mahipal.Challa@cavium.com>,
|
||||
Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>,
|
||||
stable <stable@vger.kernel.org>
|
||||
Date: Mon, 9 Apr 2018 17:45:50 +0200
|
||||
|
||||
Enabling virtual mapped kernel stacks breaks the thunderx_zip
|
||||
driver. On compression or decompression the executing CPU hangs
|
||||
in an endless loop. The reason for this is the usage of __pa
|
||||
by the driver which does no longer work for an address that is
|
||||
not part of the 1:1 mapping.
|
||||
|
||||
The zip driver allocates a result struct on the stack and needs
|
||||
to tell the hardware the physical address within this struct
|
||||
that is used to signal the completion of the request.
|
||||
|
||||
As the hardware gets the wrong address after the broken __pa
|
||||
conversion it writes to an arbitrary address. The zip driver then
|
||||
waits forever for the completion byte to contain a non-zero value.
|
||||
|
||||
Allocating the result struct from 1:1 mapped memory resolves this
|
||||
bug.
|
||||
|
||||
Signed-off-by: Jan Glauber <jglauber@cavium.com>
|
||||
Reviewed-by: Robert Richter <rrichter@cavium.com>
|
||||
Cc: stable <stable@vger.kernel.org> # 4.14
|
||||
---
|
||||
drivers/crypto/cavium/zip/zip_crypto.c | 22 ++++++++++++++--------
|
||||
1 file changed, 14 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_crypto.c b/drivers/crypto/cavium/zip/zip_crypto.c
|
||||
index 8df4d26cf9d4..b92b6e7e100f 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_crypto.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_crypto.c
|
||||
@@ -124,7 +124,7 @@ int zip_compress(const u8 *src, unsigned int slen,
|
||||
struct zip_kernel_ctx *zip_ctx)
|
||||
{
|
||||
struct zip_operation *zip_ops = NULL;
|
||||
- struct zip_state zip_state;
|
||||
+ struct zip_state *zip_state;
|
||||
struct zip_device *zip = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -135,20 +135,23 @@ int zip_compress(const u8 *src, unsigned int slen,
|
||||
if (!zip)
|
||||
return -ENODEV;
|
||||
|
||||
- memset(&zip_state, 0, sizeof(struct zip_state));
|
||||
+ zip_state = kzalloc(sizeof(*zip_state), GFP_ATOMIC);
|
||||
+ if (!zip_state)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
zip_ops = &zip_ctx->zip_comp;
|
||||
|
||||
zip_ops->input_len = slen;
|
||||
zip_ops->output_len = *dlen;
|
||||
memcpy(zip_ops->input, src, slen);
|
||||
|
||||
- ret = zip_deflate(zip_ops, &zip_state, zip);
|
||||
+ ret = zip_deflate(zip_ops, zip_state, zip);
|
||||
|
||||
if (!ret) {
|
||||
*dlen = zip_ops->output_len;
|
||||
memcpy(dst, zip_ops->output, *dlen);
|
||||
}
|
||||
-
|
||||
+ kfree(zip_state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -157,7 +160,7 @@ int zip_decompress(const u8 *src, unsigned int slen,
|
||||
struct zip_kernel_ctx *zip_ctx)
|
||||
{
|
||||
struct zip_operation *zip_ops = NULL;
|
||||
- struct zip_state zip_state;
|
||||
+ struct zip_state *zip_state;
|
||||
struct zip_device *zip = NULL;
|
||||
int ret;
|
||||
|
||||
@@ -168,7 +171,10 @@ int zip_decompress(const u8 *src, unsigned int slen,
|
||||
if (!zip)
|
||||
return -ENODEV;
|
||||
|
||||
- memset(&zip_state, 0, sizeof(struct zip_state));
|
||||
+ zip_state = kzalloc(sizeof(*zip_state), GFP_ATOMIC);
|
||||
+ if (!zip_state)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
zip_ops = &zip_ctx->zip_decomp;
|
||||
memcpy(zip_ops->input, src, slen);
|
||||
|
||||
@@ -179,13 +185,13 @@ int zip_decompress(const u8 *src, unsigned int slen,
|
||||
zip_ops->input_len = slen;
|
||||
zip_ops->output_len = *dlen;
|
||||
|
||||
- ret = zip_inflate(zip_ops, &zip_state, zip);
|
||||
+ ret = zip_inflate(zip_ops, zip_state, zip);
|
||||
|
||||
if (!ret) {
|
||||
*dlen = zip_ops->output_len;
|
||||
memcpy(dst, zip_ops->output, *dlen);
|
||||
}
|
||||
-
|
||||
+ kfree(zip_state);
|
||||
return ret;
|
||||
}
|
||||
|
||||
From patchwork Mon Apr 9 15:45:51 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2,2/5] crypto: thunderx_zip: Limit result reading attempts
|
||||
From: Jan Glauber <jglauber@cavium.com>
|
||||
X-Patchwork-Id: 10331705
|
||||
Message-Id: <20180409154554.7578-3-jglauber@cavium.com>
|
||||
To: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "David S . Miller" <davem@davemloft.net>,
|
||||
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
Mahipal Challa <Mahipal.Challa@cavium.com>,
|
||||
Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>,
|
||||
stable <stable@vger.kernel.org>
|
||||
Date: Mon, 9 Apr 2018 17:45:51 +0200
|
||||
|
||||
After issuing a request an endless loop was used to read the
|
||||
completion state from memory which is asynchronously updated
|
||||
by the ZIP coprocessor.
|
||||
|
||||
Add an upper bound to the retry attempts to prevent a CPU getting stuck
|
||||
forever in case of an error. Additionally, add a read memory barrier
|
||||
and a small delay between the reading attempts.
|
||||
|
||||
Signed-off-by: Jan Glauber <jglauber@cavium.com>
|
||||
Reviewed-by: Robert Richter <rrichter@cavium.com>
|
||||
Cc: stable <stable@vger.kernel.org> # 4.14
|
||||
---
|
||||
drivers/crypto/cavium/zip/common.h | 21 +++++++++++++++++++++
|
||||
drivers/crypto/cavium/zip/zip_deflate.c | 4 ++--
|
||||
drivers/crypto/cavium/zip/zip_inflate.c | 4 ++--
|
||||
3 files changed, 25 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/crypto/cavium/zip/common.h b/drivers/crypto/cavium/zip/common.h
|
||||
index dc451e0a43c5..58fb3ed6e644 100644
|
||||
--- a/drivers/crypto/cavium/zip/common.h
|
||||
+++ b/drivers/crypto/cavium/zip/common.h
|
||||
@@ -46,8 +46,10 @@
|
||||
#ifndef __COMMON_H__
|
||||
#define __COMMON_H__
|
||||
|
||||
+#include <linux/delay.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
+#include <linux/io.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pci.h>
|
||||
@@ -149,6 +151,25 @@ struct zip_operation {
|
||||
u32 sizeofzops;
|
||||
};
|
||||
|
||||
+static inline int zip_poll_result(union zip_zres_s *result)
|
||||
+{
|
||||
+ int retries = 1000;
|
||||
+
|
||||
+ while (!result->s.compcode) {
|
||||
+ if (!--retries) {
|
||||
+ pr_err("ZIP ERR: request timed out");
|
||||
+ return -ETIMEDOUT;
|
||||
+ }
|
||||
+ udelay(10);
|
||||
+ /*
|
||||
+ * Force re-reading of compcode which is updated
|
||||
+ * by the ZIP coprocessor.
|
||||
+ */
|
||||
+ rmb();
|
||||
+ }
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
/* error messages */
|
||||
#define zip_err(fmt, args...) pr_err("ZIP ERR:%s():%d: " \
|
||||
fmt "\n", __func__, __LINE__, ## args)
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_deflate.c b/drivers/crypto/cavium/zip/zip_deflate.c
|
||||
index 9a944b8c1e29..d7133f857d67 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_deflate.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_deflate.c
|
||||
@@ -129,8 +129,8 @@ int zip_deflate(struct zip_operation *zip_ops, struct zip_state *s,
|
||||
/* Stats update for compression requests submitted */
|
||||
atomic64_inc(&zip_dev->stats.comp_req_submit);
|
||||
|
||||
- while (!result_ptr->s.compcode)
|
||||
- continue;
|
||||
+ /* Wait for completion or error */
|
||||
+ zip_poll_result(result_ptr);
|
||||
|
||||
/* Stats update for compression requests completed */
|
||||
atomic64_inc(&zip_dev->stats.comp_req_complete);
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_inflate.c b/drivers/crypto/cavium/zip/zip_inflate.c
|
||||
index 50cbdd83dbf2..7e0d73e2f89e 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_inflate.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_inflate.c
|
||||
@@ -143,8 +143,8 @@ int zip_inflate(struct zip_operation *zip_ops, struct zip_state *s,
|
||||
/* Decompression requests submitted stats update */
|
||||
atomic64_inc(&zip_dev->stats.decomp_req_submit);
|
||||
|
||||
- while (!result_ptr->s.compcode)
|
||||
- continue;
|
||||
+ /* Wait for completion or error */
|
||||
+ zip_poll_result(result_ptr);
|
||||
|
||||
/* Decompression requests completed stats update */
|
||||
atomic64_inc(&zip_dev->stats.decomp_req_complete);
|
||||
From patchwork Mon Apr 9 15:45:52 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2,3/5] crypto: thunderx_zip: Prevent division by zero
|
||||
From: Jan Glauber <jglauber@cavium.com>
|
||||
X-Patchwork-Id: 10331709
|
||||
Message-Id: <20180409154554.7578-4-jglauber@cavium.com>
|
||||
To: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "David S . Miller" <davem@davemloft.net>,
|
||||
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
Mahipal Challa <Mahipal.Challa@cavium.com>,
|
||||
Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>
|
||||
Date: Mon, 9 Apr 2018 17:45:52 +0200
|
||||
|
||||
Avoid two potential divisions by zero when calculating average
|
||||
values for the zip statistics.
|
||||
|
||||
Signed-off-by: Jan Glauber <jglauber@cavium.com>
|
||||
Reviewed-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/crypto/cavium/zip/zip_main.c | 9 +++++----
|
||||
1 file changed, 5 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c
|
||||
index 1cd8aa488185..79b449e0f955 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_main.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_main.c
|
||||
@@ -482,10 +482,11 @@ static int zip_show_stats(struct seq_file *s, void *unused)
|
||||
atomic64_add(val, &st->pending_req);
|
||||
}
|
||||
|
||||
- avg_chunk = (atomic64_read(&st->comp_in_bytes) /
|
||||
- atomic64_read(&st->comp_req_complete));
|
||||
- avg_cr = (atomic64_read(&st->comp_in_bytes) /
|
||||
- atomic64_read(&st->comp_out_bytes));
|
||||
+ val = atomic64_read(&st->comp_req_complete);
|
||||
+ avg_chunk = (val) ? atomic64_read(&st->comp_in_bytes) / val : 0;
|
||||
+
|
||||
+ val = atomic64_read(&st->comp_out_bytes);
|
||||
+ avg_cr = (val) ? atomic64_read(&st->comp_in_bytes) / val : 0;
|
||||
seq_printf(s, " ZIP Device %d Stats\n"
|
||||
"-----------------------------------\n"
|
||||
"Comp Req Submitted : \t%lld\n"
|
||||
From patchwork Mon Apr 9 15:45:53 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2,4/5] crypto: thunderx_zip: Fix statistics pending request value
|
||||
From: Jan Glauber <jglauber@cavium.com>
|
||||
X-Patchwork-Id: 10331711
|
||||
Message-Id: <20180409154554.7578-5-jglauber@cavium.com>
|
||||
To: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "David S . Miller" <davem@davemloft.net>,
|
||||
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
Mahipal Challa <Mahipal.Challa@cavium.com>,
|
||||
Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>
|
||||
Date: Mon, 9 Apr 2018 17:45:53 +0200
|
||||
|
||||
The pending request counter was read from the wrong register. While
|
||||
at it, there is no need to use an atomic for it as it is only read
|
||||
localy in a loop.
|
||||
|
||||
Signed-off-by: Jan Glauber <jglauber@cavium.com>
|
||||
Reviewed-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/crypto/cavium/zip/zip_main.c | 13 +++++--------
|
||||
drivers/crypto/cavium/zip/zip_main.h | 1 -
|
||||
2 files changed, 5 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c
|
||||
index 79b449e0f955..ae5b20c695ca 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_main.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_main.c
|
||||
@@ -469,6 +469,8 @@ static int zip_show_stats(struct seq_file *s, void *unused)
|
||||
struct zip_stats *st;
|
||||
|
||||
for (index = 0; index < MAX_ZIP_DEVICES; index++) {
|
||||
+ u64 pending = 0;
|
||||
+
|
||||
if (zip_dev[index]) {
|
||||
zip = zip_dev[index];
|
||||
st = &zip->stats;
|
||||
@@ -476,10 +478,8 @@ static int zip_show_stats(struct seq_file *s, void *unused)
|
||||
/* Get all the pending requests */
|
||||
for (q = 0; q < ZIP_NUM_QUEUES; q++) {
|
||||
val = zip_reg_read((zip->reg_base +
|
||||
- ZIP_DBG_COREX_STA(q)));
|
||||
- val = (val >> 32);
|
||||
- val = val & 0xffffff;
|
||||
- atomic64_add(val, &st->pending_req);
|
||||
+ ZIP_DBG_QUEX_STA(q)));
|
||||
+ pending += val >> 32 & 0xffffff;
|
||||
}
|
||||
|
||||
val = atomic64_read(&st->comp_req_complete);
|
||||
@@ -514,10 +514,7 @@ static int zip_show_stats(struct seq_file *s, void *unused)
|
||||
(u64)atomic64_read(&st->decomp_in_bytes),
|
||||
(u64)atomic64_read(&st->decomp_out_bytes),
|
||||
(u64)atomic64_read(&st->decomp_bad_reqs),
|
||||
- (u64)atomic64_read(&st->pending_req));
|
||||
-
|
||||
- /* Reset pending requests count */
|
||||
- atomic64_set(&st->pending_req, 0);
|
||||
+ pending);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_main.h b/drivers/crypto/cavium/zip/zip_main.h
|
||||
index 64e051f60784..e1e4fa92ce80 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_main.h
|
||||
+++ b/drivers/crypto/cavium/zip/zip_main.h
|
||||
@@ -74,7 +74,6 @@ struct zip_stats {
|
||||
atomic64_t comp_req_complete;
|
||||
atomic64_t decomp_req_submit;
|
||||
atomic64_t decomp_req_complete;
|
||||
- atomic64_t pending_req;
|
||||
atomic64_t comp_in_bytes;
|
||||
atomic64_t comp_out_bytes;
|
||||
atomic64_t decomp_in_bytes;
|
||||
From patchwork Mon Apr 9 15:45:54 2018
|
||||
Content-Type: text/plain; charset="utf-8"
|
||||
MIME-Version: 1.0
|
||||
Content-Transfer-Encoding: 7bit
|
||||
Subject: [v2,5/5] crypto: thunderx_zip: Fix smp_processor_id() warnings
|
||||
From: Jan Glauber <jglauber@cavium.com>
|
||||
X-Patchwork-Id: 10331715
|
||||
Message-Id: <20180409154554.7578-6-jglauber@cavium.com>
|
||||
To: Herbert Xu <herbert@gondor.apana.org.au>
|
||||
Cc: "David S . Miller" <davem@davemloft.net>,
|
||||
linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org,
|
||||
Mahipal Challa <Mahipal.Challa@cavium.com>,
|
||||
Robert Richter <rrichter@cavium.com>, Jan Glauber <jglauber@cavium.com>
|
||||
Date: Mon, 9 Apr 2018 17:45:54 +0200
|
||||
|
||||
Switch to raw_smp_processor_id() to prevent a number of
|
||||
warnings from kernel debugging. We do not care about
|
||||
preemption here, as the CPU number is only used as a
|
||||
poor mans load balancing or device selection. If preemption
|
||||
happens during a compress/decompress operation a small performance
|
||||
hit will occur but everything will continue to work, so just
|
||||
ignore it.
|
||||
|
||||
Signed-off-by: Jan Glauber <jglauber@cavium.com>
|
||||
Reviewed-by: Robert Richter <rrichter@cavium.com>
|
||||
---
|
||||
drivers/crypto/cavium/zip/zip_device.c | 4 ++--
|
||||
drivers/crypto/cavium/zip/zip_main.c | 2 +-
|
||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_device.c b/drivers/crypto/cavium/zip/zip_device.c
|
||||
index ccf21fb91513..f174ec29ed69 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_device.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_device.c
|
||||
@@ -87,12 +87,12 @@ u32 zip_load_instr(union zip_inst_s *instr,
|
||||
* Distribute the instructions between the enabled queues based on
|
||||
* the CPU id.
|
||||
*/
|
||||
- if (smp_processor_id() % 2 == 0)
|
||||
+ if (raw_smp_processor_id() % 2 == 0)
|
||||
queue = 0;
|
||||
else
|
||||
queue = 1;
|
||||
|
||||
- zip_dbg("CPU Core: %d Queue number:%d", smp_processor_id(), queue);
|
||||
+ zip_dbg("CPU Core: %d Queue number:%d", raw_smp_processor_id(), queue);
|
||||
|
||||
/* Take cmd buffer lock */
|
||||
spin_lock(&zip_dev->iq[queue].lock);
|
||||
diff --git a/drivers/crypto/cavium/zip/zip_main.c b/drivers/crypto/cavium/zip/zip_main.c
|
||||
index ae5b20c695ca..be055b9547f6 100644
|
||||
--- a/drivers/crypto/cavium/zip/zip_main.c
|
||||
+++ b/drivers/crypto/cavium/zip/zip_main.c
|
||||
@@ -113,7 +113,7 @@ struct zip_device *zip_get_device(int node)
|
||||
*/
|
||||
int zip_get_node_id(void)
|
||||
{
|
||||
- return cpu_to_node(smp_processor_id());
|
||||
+ return cpu_to_node(raw_smp_processor_id());
|
||||
}
|
||||
|
||||
/* Initializes the ZIP h/w sub-system */
|
1
baseconfig/CONFIG_ACPI_SPCR_TABLE
Normal file
1
baseconfig/CONFIG_ACPI_SPCR_TABLE
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ACPI_SPCR_TABLE=y
|
1
baseconfig/CONFIG_ATH10K_SPECTRAL
Normal file
1
baseconfig/CONFIG_ATH10K_SPECTRAL
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_ATH10K_SPECTRAL is not set
|
1
baseconfig/CONFIG_ATH9K_COMMON_SPECTRAL
Normal file
1
baseconfig/CONFIG_ATH9K_COMMON_SPECTRAL
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_ATH9K_COMMON_SPECTRAL is not set
|
1
baseconfig/CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
Normal file
1
baseconfig/CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION is not set
|
1
baseconfig/CONFIG_BPF_KPROBE_OVERRIDE
Normal file
1
baseconfig/CONFIG_BPF_KPROBE_OVERRIDE
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_BPF_KPROBE_OVERRIDE is not set
|
1
baseconfig/CONFIG_CHELSIO_IPSEC_INLINE
Normal file
1
baseconfig/CONFIG_CHELSIO_IPSEC_INLINE
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_CHELSIO_IPSEC_INLINE=y
|
1
baseconfig/CONFIG_CIFS_SMB_DIRECT
Normal file
1
baseconfig/CONFIG_CIFS_SMB_DIRECT
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_CIFS_SMB_DIRECT is not set
|
1
baseconfig/CONFIG_DM_UNSTRIPED
Normal file
1
baseconfig/CONFIG_DM_UNSTRIPED
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_DM_UNSTRIPED=m
|
1
baseconfig/CONFIG_DRM_PANEL_ILITEK_IL9322
Normal file
1
baseconfig/CONFIG_DRM_PANEL_ILITEK_IL9322
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set
|
1
baseconfig/CONFIG_DVB_MMAP
Normal file
1
baseconfig/CONFIG_DVB_MMAP
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_DVB_MMAP is not set
|
1
baseconfig/CONFIG_DVB_ULE_DEBUG
Normal file
1
baseconfig/CONFIG_DVB_ULE_DEBUG
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_DVB_ULE_DEBUG is not set
|
1
baseconfig/CONFIG_FIND_BIT_BENCHMARK
Normal file
1
baseconfig/CONFIG_FIND_BIT_BENCHMARK
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_FIND_BIT_BENCHMARK is not set
|
1
baseconfig/CONFIG_GPIO_PCIE_IDIO_24
Normal file
1
baseconfig/CONFIG_GPIO_PCIE_IDIO_24
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_GPIO_PCIE_IDIO_24 is not set
|
1
baseconfig/CONFIG_HARDENED_USERCOPY_FALLBACK
Normal file
1
baseconfig/CONFIG_HARDENED_USERCOPY_FALLBACK
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_HARDENED_USERCOPY_FALLBACK=y
|
1
baseconfig/CONFIG_HID_JABRA
Normal file
1
baseconfig/CONFIG_HID_JABRA
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_HID_JABRA=m
|
@ -1 +1 @@
|
||||
CONFIG_HW_RANDOM_TPM=m
|
||||
CONFIG_HW_RANDOM_TPM=y
|
||||
|
1
baseconfig/CONFIG_IIO_BUFFER_HW_CONSUMER
Normal file
1
baseconfig/CONFIG_IIO_BUFFER_HW_CONSUMER
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_IIO_BUFFER_HW_CONSUMER=m
|
1
baseconfig/CONFIG_IP6_NF_MATCH_SRH
Normal file
1
baseconfig/CONFIG_IP6_NF_MATCH_SRH
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_IP6_NF_MATCH_SRH=m
|
@ -1 +0,0 @@
|
||||
# CONFIG_IPX_INTERN is not set
|
1
baseconfig/CONFIG_LEDS_LM3692X
Normal file
1
baseconfig/CONFIG_LEDS_LM3692X
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_LEDS_LM3692X=m
|
1
baseconfig/CONFIG_LEDS_TRIGGER_NETDEV
Normal file
1
baseconfig/CONFIG_LEDS_TRIGGER_NETDEV
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_LEDS_TRIGGER_NETDEV=m
|
@ -1 +1 @@
|
||||
CONFIG_LIRC=m
|
||||
CONFIG_LIRC=y
|
||||
|
1
baseconfig/CONFIG_MELLANOX_PLATFORM
Normal file
1
baseconfig/CONFIG_MELLANOX_PLATFORM
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_MELLANOX_PLATFORM=y
|
@ -1 +0,0 @@
|
||||
CONFIG_MFD_RTSX_PCI=m
|
@ -1 +0,0 @@
|
||||
CONFIG_MFD_RTSX_USB=m
|
1
baseconfig/CONFIG_MISC_RTSX_PCI
Normal file
1
baseconfig/CONFIG_MISC_RTSX_PCI
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_MISC_RTSX_PCI=m
|
1
baseconfig/CONFIG_MISC_RTSX_USB
Normal file
1
baseconfig/CONFIG_MISC_RTSX_USB
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_MISC_RTSX_USB=m
|
1
baseconfig/CONFIG_MLXREG_HOTPLUG
Normal file
1
baseconfig/CONFIG_MLXREG_HOTPLUG
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_MLXREG_HOTPLUG=m
|
1
baseconfig/CONFIG_MMC_CQHCI
Normal file
1
baseconfig/CONFIG_MMC_CQHCI
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_MMC_CQHCI=m
|
1
baseconfig/CONFIG_MT76x2E
Normal file
1
baseconfig/CONFIG_MT76x2E
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_MT76x2E=m
|
1
baseconfig/CONFIG_NETDEVSIM
Normal file
1
baseconfig/CONFIG_NETDEVSIM
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_NETDEVSIM is not set
|
1
baseconfig/CONFIG_NET_DSA_LEGACY
Normal file
1
baseconfig/CONFIG_NET_DSA_LEGACY
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_NET_DSA_LEGACY is not set
|
1
baseconfig/CONFIG_NET_VENDOR_CORTINA
Normal file
1
baseconfig/CONFIG_NET_VENDOR_CORTINA
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_NET_VENDOR_CORTINA is not set
|
1
baseconfig/CONFIG_NET_VENDOR_SOCIONEXT
Normal file
1
baseconfig/CONFIG_NET_VENDOR_SOCIONEXT
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_NET_VENDOR_SOCIONEXT is not set
|
1
baseconfig/CONFIG_NFT_FLOW_OFFLOAD
Normal file
1
baseconfig/CONFIG_NFT_FLOW_OFFLOAD
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_NFT_FLOW_OFFLOAD=m
|
1
baseconfig/CONFIG_NF_FLOW_TABLE
Normal file
1
baseconfig/CONFIG_NF_FLOW_TABLE
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_NF_FLOW_TABLE=m
|
1
baseconfig/CONFIG_NF_FLOW_TABLE_INET
Normal file
1
baseconfig/CONFIG_NF_FLOW_TABLE_INET
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_NF_FLOW_TABLE_INET=m
|
1
baseconfig/CONFIG_NF_FLOW_TABLE_IPV4
Normal file
1
baseconfig/CONFIG_NF_FLOW_TABLE_IPV4
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_NF_FLOW_TABLE_IPV4=m
|
1
baseconfig/CONFIG_NF_FLOW_TABLE_IPV6
Normal file
1
baseconfig/CONFIG_NF_FLOW_TABLE_IPV6
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_NF_FLOW_TABLE_IPV6=m
|
1
baseconfig/CONFIG_PCIE_CADENCE_HOST
Normal file
1
baseconfig/CONFIG_PCIE_CADENCE_HOST
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_PCIE_CADENCE_HOST=y
|
1
baseconfig/CONFIG_PINCTRL_AXP209
Normal file
1
baseconfig/CONFIG_PINCTRL_AXP209
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_PINCTRL_AXP209 is not set
|
1
baseconfig/CONFIG_RAVE_SP_CORE
Normal file
1
baseconfig/CONFIG_RAVE_SP_CORE
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_RAVE_SP_CORE is not set
|
1
baseconfig/CONFIG_RUNTIME_TESTING_MENU
Normal file
1
baseconfig/CONFIG_RUNTIME_TESTING_MENU
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_RUNTIME_TESTING_MENU=y
|
1
baseconfig/CONFIG_SD_ADC_MODULATOR
Normal file
1
baseconfig/CONFIG_SD_ADC_MODULATOR
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_SD_ADC_MODULATOR is not set
|
1
baseconfig/CONFIG_SENSORS_W83773G
Normal file
1
baseconfig/CONFIG_SENSORS_W83773G
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SENSORS_W83773G=m
|
1
baseconfig/CONFIG_SIOX
Normal file
1
baseconfig/CONFIG_SIOX
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_SIOX is not set
|
1
baseconfig/CONFIG_SLIMBUS
Normal file
1
baseconfig/CONFIG_SLIMBUS
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_SLIMBUS is not set
|
1
baseconfig/CONFIG_SND_SOC_MAX98373
Normal file
1
baseconfig/CONFIG_SND_SOC_MAX98373
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_MAX98373=m
|
1
baseconfig/CONFIG_SND_SOC_PCM186X_I2C
Normal file
1
baseconfig/CONFIG_SND_SOC_PCM186X_I2C
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_PCM186X_I2C=m
|
1
baseconfig/CONFIG_SND_SOC_PCM186X_SPI
Normal file
1
baseconfig/CONFIG_SND_SOC_PCM186X_SPI
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_PCM186X_SPI=m
|
1
baseconfig/CONFIG_SND_SOC_TAS6424
Normal file
1
baseconfig/CONFIG_SND_SOC_TAS6424
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_TAS6424=m
|
1
baseconfig/CONFIG_SND_SOC_TLV320AIC32X4_I2C
Normal file
1
baseconfig/CONFIG_SND_SOC_TLV320AIC32X4_I2C
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_TLV320AIC32X4_I2C=m
|
1
baseconfig/CONFIG_SND_SOC_TLV320AIC32X4_SPI
Normal file
1
baseconfig/CONFIG_SND_SOC_TLV320AIC32X4_SPI
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_TLV320AIC32X4_SPI=m
|
1
baseconfig/CONFIG_SND_SOC_TSCS42XX
Normal file
1
baseconfig/CONFIG_SND_SOC_TSCS42XX
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SND_SOC_TSCS42XX=m
|
1
baseconfig/CONFIG_SOUNDWIRE
Normal file
1
baseconfig/CONFIG_SOUNDWIRE
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SOUNDWIRE=y
|
1
baseconfig/CONFIG_SOUNDWIRE_BUS
Normal file
1
baseconfig/CONFIG_SOUNDWIRE_BUS
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SOUNDWIRE_BUS=m
|
1
baseconfig/CONFIG_SOUNDWIRE_CADENCE
Normal file
1
baseconfig/CONFIG_SOUNDWIRE_CADENCE
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_SOUNDWIRE_CADENCE=m
|
1
baseconfig/CONFIG_ST_UVIS25
Normal file
1
baseconfig/CONFIG_ST_UVIS25
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ST_UVIS25=m
|
1
baseconfig/CONFIG_ST_UVIS25_I2C
Normal file
1
baseconfig/CONFIG_ST_UVIS25_I2C
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ST_UVIS25_I2C=m
|
1
baseconfig/CONFIG_ST_UVIS25_SPI
Normal file
1
baseconfig/CONFIG_ST_UVIS25_SPI
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ST_UVIS25_SPI=m
|
@ -1 +0,0 @@
|
||||
# CONFIG_TIMER_STATS is not set
|
1
baseconfig/CONFIG_UNISYS_VISORBUS
Normal file
1
baseconfig/CONFIG_UNISYS_VISORBUS
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_UNISYS_VISORBUS is not set
|
1
baseconfig/CONFIG_USB_XHCI_DBGCAP
Normal file
1
baseconfig/CONFIG_USB_XHCI_DBGCAP
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_USB_XHCI_DBGCAP=y
|
1
baseconfig/CONFIG_VIRTIO_MENU
Normal file
1
baseconfig/CONFIG_VIRTIO_MENU
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_VIRTIO_MENU=y
|
1
baseconfig/CONFIG_XILINX_VCU
Normal file
1
baseconfig/CONFIG_XILINX_VCU
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_XILINX_VCU=m
|
1
baseconfig/CONFIG_ZOPT2201
Normal file
1
baseconfig/CONFIG_ZOPT2201
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ZOPT2201=m
|
1
baseconfig/arm/CONFIG_ARM_ARMADA_37XX_CPUFREQ
Normal file
1
baseconfig/arm/CONFIG_ARM_ARMADA_37XX_CPUFREQ
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_ARM_ARMADA_37XX_CPUFREQ=m
|
@ -1 +1 @@
|
||||
# CONFIG_ARM_BIG_LITTLE_CPUFREQ is not set
|
||||
CONFIG_ARM_BIG_LITTLE_CPUFREQ=m
|
||||
|
1
baseconfig/arm/CONFIG_ARM_PTDUMP_DEBUGFS
Normal file
1
baseconfig/arm/CONFIG_ARM_PTDUMP_DEBUGFS
Normal file
@ -0,0 +1 @@
|
||||
# CONFIG_ARM_PTDUMP_DEBUGFS is not set
|
1
baseconfig/arm/CONFIG_DEBUG_WX
Normal file
1
baseconfig/arm/CONFIG_DEBUG_WX
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_DEBUG_WX=y
|
1
baseconfig/arm/CONFIG_DRM_I2C_ADV7511
Normal file
1
baseconfig/arm/CONFIG_DRM_I2C_ADV7511
Normal file
@ -0,0 +1 @@
|
||||
CONFIG_DRM_I2C_ADV7511=m
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user