mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-12 05:48:40 +00:00
![Linus Torvalds](/assets/img/avatar_default.png)
Here is the big set of char / misc and other driver subsystem updates for 5.14-rc1. Included in here are: - habanna driver updates - fsl-mc driver updates - comedi driver updates - fpga driver updates - extcon driver updates - interconnect driver updates - mei driver updates - nvmem driver updates - phy driver updates - pnp driver updates - soundwire driver updates - lots of other tiny driver updates for char and misc drivers This is looking more and more like the "various driver subsystems mushed together" tree... All of these have been in linux-next for a while with no reported issues. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCYOM8jQ8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymECgCg0yL+8WxDKO5Gg5llM5PshvLB1rQAn0y5pDgg nw78LV3HQ0U7qaZBtI91 =x+AR -----END PGP SIGNATURE----- Merge tag 'char-misc-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc Pull char / misc driver updates from Greg KH: "Here is the big set of char / misc and other driver subsystem updates for 5.14-rc1. Included in here are: - habanalabs driver updates - fsl-mc driver updates - comedi driver updates - fpga driver updates - extcon driver updates - interconnect driver updates - mei driver updates - nvmem driver updates - phy driver updates - pnp driver updates - soundwire driver updates - lots of other tiny driver updates for char and misc drivers This is looking more and more like the "various driver subsystems mushed together" tree... All of these have been in linux-next for a while with no reported issues" * tag 'char-misc-5.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (292 commits) mcb: Use DEFINE_RES_MEM() helper macro and fix the end address PNP: moved EXPORT_SYMBOL so that it immediately followed its function/variable bus: mhi: pci-generic: Add missing 'pci_disable_pcie_error_reporting()' calls bus: mhi: Wait for M2 state during system resume bus: mhi: core: Fix power down latency intel_th: Wait until port is in reset before programming it intel_th: msu: Make contiguous buffers uncached intel_th: Remove an unused exit point from intel_th_remove() stm class: Spelling fix nitro_enclaves: Set Bus Master for the NE PCI device misc: ibmasm: Modify matricies to matrices misc: vmw_vmci: return the correct errno code siox: Simplify error handling via dev_err_probe() fpga: machxo2-spi: Address warning about unused variable lkdtm/heap: Add init_on_alloc tests selftests/lkdtm: Enable various testable CONFIGs lkdtm: Add CONFIG hints in errors where possible lkdtm: Enable DOUBLE_FAULT on all architectures lkdtm/heap: Add vmalloc linear overflow test lkdtm/bugs: XFAIL UNALIGNED_LOAD_STORE_WRITE ...
111 lines
2.3 KiB
C
111 lines
2.3 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Pvpanic Device Support
|
|
*
|
|
* Copyright (C) 2013 Fujitsu.
|
|
* Copyright (C) 2018 ZTE.
|
|
* Copyright (C) 2021 Oracle.
|
|
*/
|
|
|
|
#include <linux/io.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/kexec.h>
|
|
#include <linux/mod_devicetable.h>
|
|
#include <linux/module.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/panic_notifier.h>
|
|
#include <linux/types.h>
|
|
#include <linux/cdev.h>
|
|
#include <linux/list.h>
|
|
|
|
#include <uapi/misc/pvpanic.h>
|
|
|
|
#include "pvpanic.h"
|
|
|
|
MODULE_AUTHOR("Mihai Carabas <mihai.carabas@oracle.com>");
|
|
MODULE_DESCRIPTION("pvpanic device driver ");
|
|
MODULE_LICENSE("GPL");
|
|
|
|
static struct list_head pvpanic_list;
|
|
static spinlock_t pvpanic_lock;
|
|
|
|
static void
|
|
pvpanic_send_event(unsigned int event)
|
|
{
|
|
struct pvpanic_instance *pi_cur;
|
|
|
|
spin_lock(&pvpanic_lock);
|
|
list_for_each_entry(pi_cur, &pvpanic_list, list) {
|
|
if (event & pi_cur->capability & pi_cur->events)
|
|
iowrite8(event, pi_cur->base);
|
|
}
|
|
spin_unlock(&pvpanic_lock);
|
|
}
|
|
|
|
static int
|
|
pvpanic_panic_notify(struct notifier_block *nb, unsigned long code,
|
|
void *unused)
|
|
{
|
|
unsigned int event = PVPANIC_PANICKED;
|
|
|
|
if (kexec_crash_loaded())
|
|
event = PVPANIC_CRASH_LOADED;
|
|
|
|
pvpanic_send_event(event);
|
|
|
|
return NOTIFY_DONE;
|
|
}
|
|
|
|
static struct notifier_block pvpanic_panic_nb = {
|
|
.notifier_call = pvpanic_panic_notify,
|
|
.priority = 1, /* let this called before broken drm_fb_helper */
|
|
};
|
|
|
|
static void pvpanic_remove(void *param)
|
|
{
|
|
struct pvpanic_instance *pi_cur, *pi_next;
|
|
struct pvpanic_instance *pi = param;
|
|
|
|
spin_lock(&pvpanic_lock);
|
|
list_for_each_entry_safe(pi_cur, pi_next, &pvpanic_list, list) {
|
|
if (pi_cur == pi) {
|
|
list_del(&pi_cur->list);
|
|
break;
|
|
}
|
|
}
|
|
spin_unlock(&pvpanic_lock);
|
|
}
|
|
|
|
int devm_pvpanic_probe(struct device *dev, struct pvpanic_instance *pi)
|
|
{
|
|
if (!pi || !pi->base)
|
|
return -EINVAL;
|
|
|
|
spin_lock(&pvpanic_lock);
|
|
list_add(&pi->list, &pvpanic_list);
|
|
spin_unlock(&pvpanic_lock);
|
|
|
|
return devm_add_action_or_reset(dev, pvpanic_remove, pi);
|
|
}
|
|
EXPORT_SYMBOL_GPL(devm_pvpanic_probe);
|
|
|
|
static int pvpanic_init(void)
|
|
{
|
|
INIT_LIST_HEAD(&pvpanic_list);
|
|
spin_lock_init(&pvpanic_lock);
|
|
|
|
atomic_notifier_chain_register(&panic_notifier_list,
|
|
&pvpanic_panic_nb);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void pvpanic_exit(void)
|
|
{
|
|
atomic_notifier_chain_unregister(&panic_notifier_list,
|
|
&pvpanic_panic_nb);
|
|
|
|
}
|
|
|
|
module_init(pvpanic_init);
|
|
module_exit(pvpanic_exit);
|