
Changes in 5.10.200 selftests/ftrace: Add new test case which checks non unique symbol mcb: Return actual parsed size when reading chameleon table mcb-lpc: Reallocate memory region to avoid memory overlapping virtio_balloon: Fix endless deflation and inflation on arm64 virtio-mmio: fix memory leak of vm_dev mm/page_alloc: correct start page when guard page debug is enabled mmc: renesas_sdhi: use custom mask for TMIO_MASK_ALL drm/dp_mst: Fix NULL deref in get_mst_branch_device_by_guid_helper() r8169: fix the KCSAN reported data-race in rtl_tx while reading TxDescArray[entry].opts1 r8169: fix the KCSAN reported data race in rtl_rx while reading desc->opts1 treewide: Spelling fix in comment igb: Fix potential memory leak in igb_add_ethtool_nfc_entry neighbour: fix various data-races igc: Fix ambiguity in the ethtool advertising net: ieee802154: adf7242: Fix some potential buffer overflow in adf7242_stats_show() net: usb: smsc95xx: Fix uninit-value access in smsc95xx_read_reg r8152: Increase USB control msg timeout to 5000ms as per spec r8152: Run the unload routine if we have errors during probe r8152: Cancel hw_phy_work if we have an error in probe r8152: Release firmware if we have an error in probe tcp: fix wrong RTO timeout when received SACK reneging gtp: uapi: fix GTPA_MAX gtp: fix fragmentation needed check with gso i40e: Fix wrong check for I40E_TXR_FLAGS_WB_ON_ITR kasan: print the original fault addr when access invalid shadow iio: exynos-adc: request second interupt only when touchscreen mode is used i2c: muxes: i2c-mux-pinctrl: Use of_get_i2c_adapter_by_node() i2c: muxes: i2c-mux-gpmux: Use of_get_i2c_adapter_by_node() i2c: muxes: i2c-demux-pinctrl: Use of_get_i2c_adapter_by_node() i2c: stm32f7: Fix PEC handling in case of SMBUS transfers i2c: aspeed: Fix i2c bus hang in slave read tracing/kprobes: Fix the description of variable length arguments misc: fastrpc: Clean buffers on remote invocation failures nvmem: imx: correct nregs for i.MX6ULL nvmem: imx: correct nregs for i.MX6SLL nvmem: imx: correct nregs for i.MX6UL perf/core: Fix potential NULL deref sparc32: fix a braino in fault handling in csum_and_copy_..._user() clk: Sanitize possible_parent_show to Handle Return Value of of_clk_get_parent_name iio: adc: xilinx: use helper variable for &pdev->dev iio: adc: xilinx: use devm_krealloc() instead of kfree() + kcalloc() iio: adc: xilinx: use more devres helpers and remove remove() iio: adc: xilinx-xadc: Don't clobber preset voltage/temperature thresholds x86/i8259: Skip probing when ACPI/MADT advertises PCAT compatibility kobject: Fix slab-out-of-bounds in fill_kobj_path() smbdirect: missing rc checks while waiting for rdma events f2fs: fix to do sanity check on inode type during garbage collection x86/mm: Simplify RESERVE_BRK() x86/mm: Fix RESERVE_BRK() for older binutils ext4: add two helper functions extent_logical_end() and pa_logical_end() ext4: fix BUG in ext4_mb_new_inode_pa() due to overflow ext4: avoid overlapping preallocations due to overflow objtool/x86: add missing embedded_insn check driver: platform: Add helper for safer setting of driver_override rpmsg: Constify local variable in field store macro rpmsg: Fix kfree() of static memory on setting driver_override rpmsg: Fix calling device_lock() on non-initialized device rpmsg: glink: Release driver_override rpmsg: Fix possible refcount leak in rpmsg_register_device_override() x86: Fix .brk attribute in linker script net: sched: cls_u32: Fix allocation size in u32_init() irqchip/stm32-exti: add missing DT IRQ flag translation dmaengine: ste_dma40: Fix PM disable depth imbalance in d40_probe Input: synaptics-rmi4 - handle reset delay when using SMBus trsnsport fbdev: atyfb: only use ioremap_uc() on i386 and ia64 spi: npcm-fiu: Fix UMA reads when dummy.nbytes == 0 netfilter: nfnetlink_log: silence bogus compiler warning ASoC: rt5650: fix the wrong result of key button fbdev: uvesafb: Call cn_del_callback() at the end of uvesafb_exit() scsi: mpt3sas: Fix in error path platform/mellanox: mlxbf-tmfifo: Fix a warning message net: chelsio: cxgb4: add an error code check in t4_load_phy_fw powerpc/mm: Fix boot crash with FLATMEM can: isotp: change error format from decimal to symbolic error names can: isotp: add symbolic error message to isotp_module_init() can: isotp: Add error message if txqueuelen is too small can: isotp: set max PDU size to 64 kByte can: isotp: isotp_bind(): return -EINVAL on incorrect CAN ID formatting can: isotp: check CAN address family in isotp_bind() can: isotp: handle wait_event_interruptible() return values can: isotp: add local echo tx processing and tx without FC can: isotp: isotp_bind(): do not validate unused address information can: isotp: isotp_sendmsg(): fix TX state detection and wait behavior PCI: Prevent xHCI driver from claiming AMD VanGogh USB3 DRD device usb: storage: set 1.50 as the lower bcdDevice for older "Super Top" compatibility usb: raw-gadget: properly handle interrupted requests tty: 8250: Remove UC-257 and UC-431 tty: 8250: Add support for additional Brainboxes UC cards tty: 8250: Add support for Brainboxes UP cards tty: 8250: Add support for Intashield IS-100 ALSA: hda: intel-dsp-config: Fix JSL Chromebook quirk detection Linux 5.10.200 Change-Id: I064cfd04d19db1e81d073b02c00258d3ebac2aa3 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
369 lines
12 KiB
C
369 lines
12 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
/*
|
|
* platform_device.h - generic, centralized driver model
|
|
*
|
|
* Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org>
|
|
*
|
|
* See Documentation/driver-api/driver-model/ for more information.
|
|
*/
|
|
|
|
#ifndef _PLATFORM_DEVICE_H_
|
|
#define _PLATFORM_DEVICE_H_
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/android_kabi.h>
|
|
|
|
#define PLATFORM_DEVID_NONE (-1)
|
|
#define PLATFORM_DEVID_AUTO (-2)
|
|
|
|
struct mfd_cell;
|
|
struct property_entry;
|
|
struct platform_device_id;
|
|
|
|
struct platform_device {
|
|
const char *name;
|
|
int id;
|
|
bool id_auto;
|
|
struct device dev;
|
|
u64 platform_dma_mask;
|
|
struct device_dma_parameters dma_parms;
|
|
u32 num_resources;
|
|
struct resource *resource;
|
|
|
|
const struct platform_device_id *id_entry;
|
|
/*
|
|
* Driver name to force a match. Do not set directly, because core
|
|
* frees it. Use driver_set_override() to set or clear it.
|
|
*/
|
|
const char *driver_override;
|
|
|
|
/* MFD cell pointer */
|
|
struct mfd_cell *mfd_cell;
|
|
|
|
/* arch specific additions */
|
|
struct pdev_archdata archdata;
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
ANDROID_KABI_RESERVE(2);
|
|
};
|
|
|
|
#define platform_get_device_id(pdev) ((pdev)->id_entry)
|
|
|
|
#define dev_is_platform(dev) ((dev)->bus == &platform_bus_type)
|
|
#define to_platform_device(x) container_of((x), struct platform_device, dev)
|
|
|
|
extern int platform_device_register(struct platform_device *);
|
|
extern void platform_device_unregister(struct platform_device *);
|
|
|
|
extern struct bus_type platform_bus_type;
|
|
extern struct device platform_bus;
|
|
|
|
extern struct resource *platform_get_resource(struct platform_device *,
|
|
unsigned int, unsigned int);
|
|
extern struct device *
|
|
platform_find_device_by_driver(struct device *start,
|
|
const struct device_driver *drv);
|
|
extern void __iomem *
|
|
devm_platform_get_and_ioremap_resource(struct platform_device *pdev,
|
|
unsigned int index, struct resource **res);
|
|
extern void __iomem *
|
|
devm_platform_ioremap_resource(struct platform_device *pdev,
|
|
unsigned int index);
|
|
extern void __iomem *
|
|
devm_platform_ioremap_resource_wc(struct platform_device *pdev,
|
|
unsigned int index);
|
|
extern void __iomem *
|
|
devm_platform_ioremap_resource_byname(struct platform_device *pdev,
|
|
const char *name);
|
|
extern int platform_get_irq(struct platform_device *, unsigned int);
|
|
extern int platform_get_irq_optional(struct platform_device *, unsigned int);
|
|
extern int platform_irq_count(struct platform_device *);
|
|
extern struct resource *platform_get_resource_byname(struct platform_device *,
|
|
unsigned int,
|
|
const char *);
|
|
extern int platform_get_irq_byname(struct platform_device *, const char *);
|
|
extern int platform_get_irq_byname_optional(struct platform_device *dev,
|
|
const char *name);
|
|
extern int platform_add_devices(struct platform_device **, int);
|
|
|
|
struct platform_device_info {
|
|
struct device *parent;
|
|
struct fwnode_handle *fwnode;
|
|
bool of_node_reused;
|
|
|
|
const char *name;
|
|
int id;
|
|
|
|
const struct resource *res;
|
|
unsigned int num_res;
|
|
|
|
const void *data;
|
|
size_t size_data;
|
|
u64 dma_mask;
|
|
|
|
const struct property_entry *properties;
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
};
|
|
extern struct platform_device *platform_device_register_full(
|
|
const struct platform_device_info *pdevinfo);
|
|
|
|
/**
|
|
* platform_device_register_resndata - add a platform-level device with
|
|
* resources and platform-specific data
|
|
*
|
|
* @parent: parent device for the device we're adding
|
|
* @name: base name of the device we're adding
|
|
* @id: instance id
|
|
* @res: set of resources that needs to be allocated for the device
|
|
* @num: number of resources
|
|
* @data: platform specific data for this platform device
|
|
* @size: size of platform specific data
|
|
*
|
|
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
|
*/
|
|
static inline struct platform_device *platform_device_register_resndata(
|
|
struct device *parent, const char *name, int id,
|
|
const struct resource *res, unsigned int num,
|
|
const void *data, size_t size) {
|
|
|
|
struct platform_device_info pdevinfo = {
|
|
.parent = parent,
|
|
.name = name,
|
|
.id = id,
|
|
.res = res,
|
|
.num_res = num,
|
|
.data = data,
|
|
.size_data = size,
|
|
.dma_mask = 0,
|
|
};
|
|
|
|
return platform_device_register_full(&pdevinfo);
|
|
}
|
|
|
|
/**
|
|
* platform_device_register_simple - add a platform-level device and its resources
|
|
* @name: base name of the device we're adding
|
|
* @id: instance id
|
|
* @res: set of resources that needs to be allocated for the device
|
|
* @num: number of resources
|
|
*
|
|
* This function creates a simple platform device that requires minimal
|
|
* resource and memory management. Canned release function freeing memory
|
|
* allocated for the device allows drivers using such devices to be
|
|
* unloaded without waiting for the last reference to the device to be
|
|
* dropped.
|
|
*
|
|
* This interface is primarily intended for use with legacy drivers which
|
|
* probe hardware directly. Because such drivers create sysfs device nodes
|
|
* themselves, rather than letting system infrastructure handle such device
|
|
* enumeration tasks, they don't fully conform to the Linux driver model.
|
|
* In particular, when such drivers are built as modules, they can't be
|
|
* "hotplugged".
|
|
*
|
|
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
|
*/
|
|
static inline struct platform_device *platform_device_register_simple(
|
|
const char *name, int id,
|
|
const struct resource *res, unsigned int num)
|
|
{
|
|
return platform_device_register_resndata(NULL, name, id,
|
|
res, num, NULL, 0);
|
|
}
|
|
|
|
/**
|
|
* platform_device_register_data - add a platform-level device with platform-specific data
|
|
* @parent: parent device for the device we're adding
|
|
* @name: base name of the device we're adding
|
|
* @id: instance id
|
|
* @data: platform specific data for this platform device
|
|
* @size: size of platform specific data
|
|
*
|
|
* This function creates a simple platform device that requires minimal
|
|
* resource and memory management. Canned release function freeing memory
|
|
* allocated for the device allows drivers using such devices to be
|
|
* unloaded without waiting for the last reference to the device to be
|
|
* dropped.
|
|
*
|
|
* Returns &struct platform_device pointer on success, or ERR_PTR() on error.
|
|
*/
|
|
static inline struct platform_device *platform_device_register_data(
|
|
struct device *parent, const char *name, int id,
|
|
const void *data, size_t size)
|
|
{
|
|
return platform_device_register_resndata(parent, name, id,
|
|
NULL, 0, data, size);
|
|
}
|
|
|
|
extern struct platform_device *platform_device_alloc(const char *name, int id);
|
|
extern int platform_device_add_resources(struct platform_device *pdev,
|
|
const struct resource *res,
|
|
unsigned int num);
|
|
extern int platform_device_add_data(struct platform_device *pdev,
|
|
const void *data, size_t size);
|
|
extern int platform_device_add_properties(struct platform_device *pdev,
|
|
const struct property_entry *properties);
|
|
extern int platform_device_add(struct platform_device *pdev);
|
|
extern void platform_device_del(struct platform_device *pdev);
|
|
extern void platform_device_put(struct platform_device *pdev);
|
|
|
|
struct platform_driver {
|
|
int (*probe)(struct platform_device *);
|
|
int (*remove)(struct platform_device *);
|
|
void (*shutdown)(struct platform_device *);
|
|
int (*suspend)(struct platform_device *, pm_message_t state);
|
|
int (*resume)(struct platform_device *);
|
|
struct device_driver driver;
|
|
const struct platform_device_id *id_table;
|
|
bool prevent_deferred_probe;
|
|
|
|
ANDROID_KABI_RESERVE(1);
|
|
};
|
|
|
|
#define to_platform_driver(drv) (container_of((drv), struct platform_driver, \
|
|
driver))
|
|
|
|
/*
|
|
* use a macro to avoid include chaining to get THIS_MODULE
|
|
*/
|
|
#define platform_driver_register(drv) \
|
|
__platform_driver_register(drv, THIS_MODULE)
|
|
extern int __platform_driver_register(struct platform_driver *,
|
|
struct module *);
|
|
extern void platform_driver_unregister(struct platform_driver *);
|
|
|
|
/* non-hotpluggable platform devices may use this so that probe() and
|
|
* its support may live in __init sections, conserving runtime memory.
|
|
*/
|
|
#define platform_driver_probe(drv, probe) \
|
|
__platform_driver_probe(drv, probe, THIS_MODULE)
|
|
extern int __platform_driver_probe(struct platform_driver *driver,
|
|
int (*probe)(struct platform_device *), struct module *module);
|
|
|
|
static inline void *platform_get_drvdata(const struct platform_device *pdev)
|
|
{
|
|
return dev_get_drvdata(&pdev->dev);
|
|
}
|
|
|
|
static inline void platform_set_drvdata(struct platform_device *pdev,
|
|
void *data)
|
|
{
|
|
dev_set_drvdata(&pdev->dev, data);
|
|
}
|
|
|
|
/* module_platform_driver() - Helper macro for drivers that don't do
|
|
* anything special in module init/exit. This eliminates a lot of
|
|
* boilerplate. Each module may only use this macro once, and
|
|
* calling it replaces module_init() and module_exit()
|
|
*/
|
|
#define module_platform_driver(__platform_driver) \
|
|
module_driver(__platform_driver, platform_driver_register, \
|
|
platform_driver_unregister)
|
|
|
|
/* builtin_platform_driver() - Helper macro for builtin drivers that
|
|
* don't do anything special in driver init. This eliminates some
|
|
* boilerplate. Each driver may only use this macro once, and
|
|
* calling it replaces device_initcall(). Note this is meant to be
|
|
* a parallel of module_platform_driver() above, but w/o _exit stuff.
|
|
*/
|
|
#define builtin_platform_driver(__platform_driver) \
|
|
builtin_driver(__platform_driver, platform_driver_register)
|
|
|
|
/* module_platform_driver_probe() - Helper macro for drivers that don't do
|
|
* anything special in module init/exit. This eliminates a lot of
|
|
* boilerplate. Each module may only use this macro once, and
|
|
* calling it replaces module_init() and module_exit()
|
|
*/
|
|
#define module_platform_driver_probe(__platform_driver, __platform_probe) \
|
|
static int __init __platform_driver##_init(void) \
|
|
{ \
|
|
return platform_driver_probe(&(__platform_driver), \
|
|
__platform_probe); \
|
|
} \
|
|
module_init(__platform_driver##_init); \
|
|
static void __exit __platform_driver##_exit(void) \
|
|
{ \
|
|
platform_driver_unregister(&(__platform_driver)); \
|
|
} \
|
|
module_exit(__platform_driver##_exit);
|
|
|
|
/* builtin_platform_driver_probe() - Helper macro for drivers that don't do
|
|
* anything special in device init. This eliminates some boilerplate. Each
|
|
* driver may only use this macro once, and using it replaces device_initcall.
|
|
* This is meant to be a parallel of module_platform_driver_probe above, but
|
|
* without the __exit parts.
|
|
*/
|
|
#define builtin_platform_driver_probe(__platform_driver, __platform_probe) \
|
|
static int __init __platform_driver##_init(void) \
|
|
{ \
|
|
return platform_driver_probe(&(__platform_driver), \
|
|
__platform_probe); \
|
|
} \
|
|
device_initcall(__platform_driver##_init); \
|
|
|
|
#define platform_create_bundle(driver, probe, res, n_res, data, size) \
|
|
__platform_create_bundle(driver, probe, res, n_res, data, size, THIS_MODULE)
|
|
extern struct platform_device *__platform_create_bundle(
|
|
struct platform_driver *driver, int (*probe)(struct platform_device *),
|
|
struct resource *res, unsigned int n_res,
|
|
const void *data, size_t size, struct module *module);
|
|
|
|
int __platform_register_drivers(struct platform_driver * const *drivers,
|
|
unsigned int count, struct module *owner);
|
|
void platform_unregister_drivers(struct platform_driver * const *drivers,
|
|
unsigned int count);
|
|
|
|
#define platform_register_drivers(drivers, count) \
|
|
__platform_register_drivers(drivers, count, THIS_MODULE)
|
|
|
|
#ifdef CONFIG_SUSPEND
|
|
extern int platform_pm_suspend(struct device *dev);
|
|
extern int platform_pm_resume(struct device *dev);
|
|
#else
|
|
#define platform_pm_suspend NULL
|
|
#define platform_pm_resume NULL
|
|
#endif
|
|
|
|
#ifdef CONFIG_HIBERNATE_CALLBACKS
|
|
extern int platform_pm_freeze(struct device *dev);
|
|
extern int platform_pm_thaw(struct device *dev);
|
|
extern int platform_pm_poweroff(struct device *dev);
|
|
extern int platform_pm_restore(struct device *dev);
|
|
#else
|
|
#define platform_pm_freeze NULL
|
|
#define platform_pm_thaw NULL
|
|
#define platform_pm_poweroff NULL
|
|
#define platform_pm_restore NULL
|
|
#endif
|
|
|
|
extern int platform_dma_configure(struct device *dev);
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
#define USE_PLATFORM_PM_SLEEP_OPS \
|
|
.suspend = platform_pm_suspend, \
|
|
.resume = platform_pm_resume, \
|
|
.freeze = platform_pm_freeze, \
|
|
.thaw = platform_pm_thaw, \
|
|
.poweroff = platform_pm_poweroff, \
|
|
.restore = platform_pm_restore,
|
|
#else
|
|
#define USE_PLATFORM_PM_SLEEP_OPS
|
|
#endif
|
|
|
|
#ifndef CONFIG_SUPERH
|
|
/*
|
|
* REVISIT: This stub is needed for all non-SuperH users of early platform
|
|
* drivers. It should go away once we introduce the new platform_device-based
|
|
* early driver framework.
|
|
*/
|
|
static inline int is_sh_early_platform_device(struct platform_device *pdev)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif /* CONFIG_SUPERH */
|
|
|
|
/* For now only SuperH uses it */
|
|
void early_platform_cleanup(void);
|
|
|
|
#endif /* _PLATFORM_DEVICE_H_ */
|