mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
This is the 5.4.241 stable release
-----BEGIN PGP SIGNATURE-----
iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmRBDvQACgkQONu9yGCS
aT58+g/+PmTvsCcjSlTvpHw+kFsIu2F2pIjlJNlX+YHSzEYMG/G2mn7XD1rUE7JB
mQQ7hFXEeQZTuN4zsFnviotzn1xd6bV26Od598m+yFZ3Fty07NXy3OD1/08ZdP0G
k+U9u4TDr47BV3WdokGWIdXAjnlvC0kwjc+EWznOmXquhW8hSrGvz0IUJQWgDue1
IpOkuRs60T85dUHoPYEL8T23XRyhFhdeIrlx6Hqzlp1fGg7dSpfh0yYJmDLF6Y21
CXO2WcADhMMszk+CFEXgfWVem5mheUuVsfmBUg34ZGzzNos0rPyHG+VmwZxnsPYE
SVLVxLL649CzAuJdpXflTghdBUU/WKT/ZZ0aQddohPjij55My2oCV6/FpHXg7kuo
ZTXN0ByyeAbV4DlY2+ooY6Vhr5lzQG1l15Ap9xj4ioQO8U3jeCCQ5wT9L01ig6a9
/9U9wb6CYp3thrY94x1WapJF5utiIigbiS+rioRfAwHAzj5JiLfQvdH1nVgBNz+9
DWCEGIiUONmHMRrt+X6Nnu8KkHWOkDFF2lisphXUsaY140gFG0+d3xnRArsU4ZDi
j1zT0ErqigV6vzA39ic898EW8wkNqVCWPwYRLVRSBuPCDKK7SjnOuStGi7eIoYp2
zI2NV9UUMm5Qxub5zUNktpWDFFn9knN3E7Gc4wAKWkHkWc/DJ+U=
=ffeb
-----END PGP SIGNATURE-----
Merge 5.4.241 into android11-5.4-lts
Changes in 5.4.241
scsi: ses: Handle enclosure with just a primary component gracefully
x86/PCI: Add quirk for AMD XHCI controller that loses MSI-X state in D3hot
cgroup/cpuset: Wake up cpuset_attach_wq tasks in cpuset_cancel_attach()
Revert "treewide: Replace DECLARE_TASKLET() with DECLARE_TASKLET_OLD()"
treewide: Replace DECLARE_TASKLET() with DECLARE_TASKLET_OLD()
smb3: fix problem with null cifs super block with previous patch
pinctrl: amd: Use irqchip template
pinctrl: amd: disable and mask interrupts on probe
pinctrl: amd: Disable and mask interrupts on resume
pwm: cros-ec: Explicitly set .polarity in .get_state()
pwm: sprd: Explicitly set .polarity in .get_state()
wifi: mac80211: fix invalid drv_sta_pre_rcu_remove calls for non-uploaded sta
icmp: guard against too small mtu
net: don't let netpoll invoke NAPI if in xmit context
sctp: check send stream number after wait_for_sndbuf
ipv6: Fix an uninit variable access bug in __ip6_make_skb()
gpio: davinci: Add irq chip flag to skip set wake
sunrpc: only free unix grouplist after RCU settles
NFSD: callback request does not use correct credential for AUTH_SYS
xhci: also avoid the XHCI_ZERO_64B_REGS quirk with a passthrough iommu
USB: serial: cp210x: add Silicon Labs IFS-USB-DATACABLE IDs
usb: typec: altmodes/displayport: Fix configure initial pin assignment
USB: serial: option: add Telit FE990 compositions
USB: serial: option: add Quectel RM500U-CN modem
iio: adc: ti-ads7950: Set `can_sleep` flag for GPIO chip
iio: dac: cio-dac: Fix max DAC write value check for 12-bit
tty: serial: sh-sci: Fix transmit end interrupt handler
tty: serial: sh-sci: Fix Rx on RZ/G2L SCI
tty: serial: fsl_lpuart: avoid checking for transfer complete when UARTCTRL_SBK is asserted in lpuart32_tx_empty
nilfs2: fix potential UAF of struct nilfs_sc_info in nilfs_segctor_thread()
nilfs2: fix sysfs interface lifetime
ALSA: hda/realtek: Add quirk for Clevo X370SNW
perf/core: Fix the same task check in perf_event_set_output
ftrace: Mark get_lock_parent_ip() __always_inline
can: j1939: j1939_tp_tx_dat_new(): fix out-of-bounds memory access
tracing: Free error logs of tracing instances
net_sched: prevent NULL dereference if default qdisc setup failed
drm/panfrost: Fix the panfrost_mmu_map_fault_addr() error path
ring-buffer: Fix race while reader and writer are on the same page
mm/swap: fix swap_info_struct race between swapoff and get_swap_pages()
irqdomain: Look for existing mapping only once
irqdomain: Refactor __irq_domain_alloc_irqs()
irqdomain: Fix mapping-creation race
Revert "pinctrl: amd: Disable and mask interrupts on resume"
ALSA: emu10k1: fix capture interrupt handler unlinking
ALSA: hda/sigmatel: add pin overrides for Intel DP45SG motherboard
ALSA: i2c/cs8427: fix iec958 mixer control deactivation
ALSA: firewire-tascam: add missing unwind goto in snd_tscm_stream_start_duplex()
ALSA: hda/sigmatel: fix S/PDIF out on Intel D*45* motherboards
Bluetooth: L2CAP: Fix use-after-free in l2cap_disconnect_{req,rsp}
Bluetooth: Fix race condition in hidp_session_thread
btrfs: print checksum type and implementation at mount time
btrfs: fix fast csum implementation detection
mtdblock: tolerate corrected bit-flips
mtd: rawnand: meson: fix bitmask for length in command word
mtd: rawnand: stm32_fmc2: remove unsupported EDO mode
9p/xen : Fix use after free bug in xen_9pfs_front_remove due to race condition
niu: Fix missing unwind goto in niu_alloc_channels()
qlcnic: check pci_reset_function result
sctp: fix a potential overflow in sctp_ifwdtsn_skip
RDMA/core: Fix GID entry ref leak when create_ah fails
udp6: fix potential access to stale information
net: macb: fix a memory corruption in extended buffer descriptor mode
power: supply: cros_usbpd: reclassify "default case!" as debug
i2c: imx-lpi2c: clean rx/tx buffers upon new message
efi: sysfb_efi: Add quirk for Lenovo Yoga Book X91F/L
drm: panel-orientation-quirks: Add quirk for Lenovo Yoga Book X90F
verify_pefile: relax wrapper length check
asymmetric_keys: log on fatal failures in PE/pkcs7
ubi: Fix failure attaching when vid_hdr offset equals to (sub)page size
mtd: ubi: wl: Fix a couple of kernel-doc issues
ubi: Fix deadlock caused by recursively holding work_sem
i2c: ocores: generate stop condition after timeout in polling mode
watchdog: sbsa_wdog: Make sure the timeout programming is within the limits
coresight-etm4: Fix for() loop drvdata->nr_addr_cmp range bug
xfs: show the proper user quota options
xfs: merge the projid fields in struct xfs_icdinode
xfs: ensure that the inode uid/gid match values match the icdinode ones
xfs: remove the icdinode di_uid/di_gid members
xfs: remove the kuid/kgid conversion wrappers
xfs: add a new xfs_sb_version_has_v3inode helper
xfs: only check the superblock version for dinode size calculation
xfs: simplify di_flags2 inheritance in xfs_ialloc
xfs: simplify a check in xfs_ioctl_setattr_check_cowextsize
xfs: remove the di_version field from struct icdinode
xfs: fix up non-directory creation in SGID directories
xfs: set inode size after creating symlink
xfs: report corruption only as a regular error
xfs: shut down the filesystem if we screw up quota reservation
xfs: consider shutdown in bmapbt cursor delete assert
xfs: don't reuse busy extents on extent trim
xfs: force log and push AIL to clear pinned inodes when aborting mount
Linux 5.4.241
Change-Id: I428eec45c4ac9796104683d40b7cb0d38d4c8015
Signed-off-by: Greg Kroah-Hartman <[email protected]>
This commit is contained in:
commit
da8b283c08
102 changed files with 730 additions and 548 deletions
|
|
@ -25,6 +25,9 @@ static DEFINE_MUTEX(irq_domain_mutex);
|
|||
|
||||
static struct irq_domain *irq_default_domain;
|
||||
|
||||
static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
|
||||
unsigned int nr_irqs, int node, void *arg,
|
||||
bool realloc, const struct irq_affinity_desc *affinity);
|
||||
static void irq_domain_check_hierarchy(struct irq_domain *domain);
|
||||
|
||||
struct irqchip_fwid {
|
||||
|
|
@ -673,6 +676,34 @@ unsigned int irq_create_direct_mapping(struct irq_domain *domain)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(irq_create_direct_mapping);
|
||||
|
||||
static unsigned int irq_create_mapping_affinity_locked(struct irq_domain *domain,
|
||||
irq_hw_number_t hwirq,
|
||||
const struct irq_affinity_desc *affinity)
|
||||
{
|
||||
struct device_node *of_node = irq_domain_get_of_node(domain);
|
||||
int virq;
|
||||
|
||||
pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq);
|
||||
|
||||
/* Allocate a virtual interrupt number */
|
||||
virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node),
|
||||
affinity);
|
||||
if (virq <= 0) {
|
||||
pr_debug("-> virq allocation failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (irq_domain_associate_locked(domain, virq, hwirq)) {
|
||||
irq_free_desc(virq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pr_debug("irq %lu on domain %s mapped to virtual irq %u\n",
|
||||
hwirq, of_node_full_name(of_node), virq);
|
||||
|
||||
return virq;
|
||||
}
|
||||
|
||||
/**
|
||||
* irq_create_mapping_affinity() - Map a hardware interrupt into linux irq space
|
||||
* @domain: domain owning this hardware interrupt or NULL for default domain
|
||||
|
|
@ -685,47 +716,31 @@ EXPORT_SYMBOL_GPL(irq_create_direct_mapping);
|
|||
* on the number returned from that call.
|
||||
*/
|
||||
unsigned int irq_create_mapping_affinity(struct irq_domain *domain,
|
||||
irq_hw_number_t hwirq,
|
||||
const struct irq_affinity_desc *affinity)
|
||||
irq_hw_number_t hwirq,
|
||||
const struct irq_affinity_desc *affinity)
|
||||
{
|
||||
struct device_node *of_node;
|
||||
int virq;
|
||||
|
||||
pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq);
|
||||
|
||||
/* Look for default domain if nececssary */
|
||||
/* Look for default domain if necessary */
|
||||
if (domain == NULL)
|
||||
domain = irq_default_domain;
|
||||
if (domain == NULL) {
|
||||
WARN(1, "%s(, %lx) called with NULL domain\n", __func__, hwirq);
|
||||
return 0;
|
||||
}
|
||||
pr_debug("-> using domain @%p\n", domain);
|
||||
|
||||
of_node = irq_domain_get_of_node(domain);
|
||||
mutex_lock(&irq_domain_mutex);
|
||||
|
||||
/* Check if mapping already exists */
|
||||
virq = irq_find_mapping(domain, hwirq);
|
||||
if (virq) {
|
||||
pr_debug("-> existing mapping on virq %d\n", virq);
|
||||
return virq;
|
||||
pr_debug("existing mapping on virq %d\n", virq);
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Allocate a virtual interrupt number */
|
||||
virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node),
|
||||
affinity);
|
||||
if (virq <= 0) {
|
||||
pr_debug("-> virq allocation failed\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (irq_domain_associate(domain, virq, hwirq)) {
|
||||
irq_free_desc(virq);
|
||||
return 0;
|
||||
}
|
||||
|
||||
pr_debug("irq %lu on domain %s mapped to virtual irq %u\n",
|
||||
hwirq, of_node_full_name(of_node), virq);
|
||||
virq = irq_create_mapping_affinity_locked(domain, hwirq, affinity);
|
||||
out:
|
||||
mutex_unlock(&irq_domain_mutex);
|
||||
|
||||
return virq;
|
||||
}
|
||||
|
|
@ -835,6 +850,8 @@ unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec)
|
|||
if (WARN_ON(type & ~IRQ_TYPE_SENSE_MASK))
|
||||
type &= IRQ_TYPE_SENSE_MASK;
|
||||
|
||||
mutex_lock(&irq_domain_mutex);
|
||||
|
||||
/*
|
||||
* If we've already configured this interrupt,
|
||||
* don't do it again, or hell will break loose.
|
||||
|
|
@ -847,7 +864,7 @@ unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec)
|
|||
* interrupt number.
|
||||
*/
|
||||
if (type == IRQ_TYPE_NONE || type == irq_get_trigger_type(virq))
|
||||
return virq;
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* If the trigger type has not been set yet, then set
|
||||
|
|
@ -855,35 +872,45 @@ unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec)
|
|||
*/
|
||||
if (irq_get_trigger_type(virq) == IRQ_TYPE_NONE) {
|
||||
irq_data = irq_get_irq_data(virq);
|
||||
if (!irq_data)
|
||||
return 0;
|
||||
if (!irq_data) {
|
||||
virq = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
irqd_set_trigger_type(irq_data, type);
|
||||
return virq;
|
||||
goto out;
|
||||
}
|
||||
|
||||
pr_warn("type mismatch, failed to map hwirq-%lu for %s!\n",
|
||||
hwirq, of_node_full_name(to_of_node(fwspec->fwnode)));
|
||||
return 0;
|
||||
virq = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (irq_domain_is_hierarchy(domain)) {
|
||||
virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, fwspec);
|
||||
if (virq <= 0)
|
||||
return 0;
|
||||
virq = irq_domain_alloc_irqs_locked(domain, -1, 1, NUMA_NO_NODE,
|
||||
fwspec, false, NULL);
|
||||
if (virq <= 0) {
|
||||
virq = 0;
|
||||
goto out;
|
||||
}
|
||||
} else {
|
||||
/* Create mapping */
|
||||
virq = irq_create_mapping(domain, hwirq);
|
||||
virq = irq_create_mapping_affinity_locked(domain, hwirq, NULL);
|
||||
if (!virq)
|
||||
return virq;
|
||||
goto out;
|
||||
}
|
||||
|
||||
irq_data = irq_get_irq_data(virq);
|
||||
if (WARN_ON(!irq_data))
|
||||
return 0;
|
||||
if (WARN_ON(!irq_data)) {
|
||||
virq = 0;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Store trigger type */
|
||||
irqd_set_trigger_type(irq_data, type);
|
||||
out:
|
||||
mutex_unlock(&irq_domain_mutex);
|
||||
|
||||
return virq;
|
||||
}
|
||||
|
|
@ -1351,6 +1378,45 @@ int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
|
|||
return domain->ops->alloc(domain, irq_base, nr_irqs, arg);
|
||||
}
|
||||
|
||||
static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
|
||||
unsigned int nr_irqs, int node, void *arg,
|
||||
bool realloc, const struct irq_affinity_desc *affinity)
|
||||
{
|
||||
int i, ret, virq;
|
||||
|
||||
if (realloc && irq_base >= 0) {
|
||||
virq = irq_base;
|
||||
} else {
|
||||
virq = irq_domain_alloc_descs(irq_base, nr_irqs, 0, node,
|
||||
affinity);
|
||||
if (virq < 0) {
|
||||
pr_debug("cannot allocate IRQ(base %d, count %d)\n",
|
||||
irq_base, nr_irqs);
|
||||
return virq;
|
||||
}
|
||||
}
|
||||
|
||||
if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) {
|
||||
pr_debug("cannot allocate memory for IRQ%d\n", virq);
|
||||
ret = -ENOMEM;
|
||||
goto out_free_desc;
|
||||
}
|
||||
|
||||
ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg);
|
||||
if (ret < 0)
|
||||
goto out_free_irq_data;
|
||||
for (i = 0; i < nr_irqs; i++)
|
||||
irq_domain_insert_irq(virq + i);
|
||||
|
||||
return virq;
|
||||
|
||||
out_free_irq_data:
|
||||
irq_domain_free_irq_data(virq, nr_irqs);
|
||||
out_free_desc:
|
||||
irq_free_descs(virq, nr_irqs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* __irq_domain_alloc_irqs - Allocate IRQs from domain
|
||||
* @domain: domain to allocate from
|
||||
|
|
@ -1377,7 +1443,7 @@ int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
|
|||
unsigned int nr_irqs, int node, void *arg,
|
||||
bool realloc, const struct irq_affinity_desc *affinity)
|
||||
{
|
||||
int i, ret, virq;
|
||||
int ret;
|
||||
|
||||
if (domain == NULL) {
|
||||
domain = irq_default_domain;
|
||||
|
|
@ -1385,40 +1451,11 @@ int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (realloc && irq_base >= 0) {
|
||||
virq = irq_base;
|
||||
} else {
|
||||
virq = irq_domain_alloc_descs(irq_base, nr_irqs, 0, node,
|
||||
affinity);
|
||||
if (virq < 0) {
|
||||
pr_debug("cannot allocate IRQ(base %d, count %d)\n",
|
||||
irq_base, nr_irqs);
|
||||
return virq;
|
||||
}
|
||||
}
|
||||
|
||||
if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) {
|
||||
pr_debug("cannot allocate memory for IRQ%d\n", virq);
|
||||
ret = -ENOMEM;
|
||||
goto out_free_desc;
|
||||
}
|
||||
|
||||
mutex_lock(&irq_domain_mutex);
|
||||
ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg);
|
||||
if (ret < 0) {
|
||||
mutex_unlock(&irq_domain_mutex);
|
||||
goto out_free_irq_data;
|
||||
}
|
||||
for (i = 0; i < nr_irqs; i++)
|
||||
irq_domain_insert_irq(virq + i);
|
||||
ret = irq_domain_alloc_irqs_locked(domain, irq_base, nr_irqs, node, arg,
|
||||
realloc, affinity);
|
||||
mutex_unlock(&irq_domain_mutex);
|
||||
|
||||
return virq;
|
||||
|
||||
out_free_irq_data:
|
||||
irq_domain_free_irq_data(virq, nr_irqs);
|
||||
out_free_desc:
|
||||
irq_free_descs(virq, nr_irqs);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1779,6 +1816,13 @@ void irq_domain_set_info(struct irq_domain *domain, unsigned int virq,
|
|||
irq_set_handler_data(virq, handler_data);
|
||||
}
|
||||
|
||||
static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
|
||||
unsigned int nr_irqs, int node, void *arg,
|
||||
bool realloc, const struct irq_affinity_desc *affinity)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static void irq_domain_check_hierarchy(struct irq_domain *domain)
|
||||
{
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue