mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-13 20:14:37 -04:00
Merge tag 'char-misc-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc and other driver subsystem updates from Greg KH:
"Here is the big set of char/misc and a number of other driver
subsystem updates for 6.9-rc1. Included in here are:
- IIO driver updates, loads of new ones and evolution of existing ones
- coresight driver updates
- const cleanups for many driver subsystems
- speakup driver additions
- platform remove callback void cleanups
- mei driver updates
- mhi driver updates
- cdx driver updates for MSI interrupt handling
- nvmem driver updates
- other smaller driver updates and cleanups, full details in the
shortlog
All of these have been in linux-next for a long time with no reported
issue, other than a build warning for the speakup driver"
The build warning hits clang and is a gcc (and C23) extension, and is
fixed up in the merge.
Link: https://lore.kernel.org/all/20240321134831.GA2762840@dev-arch.thelio-3990X/
* tag 'char-misc-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (279 commits)
binder: remove redundant variable page_addr
uio_dmem_genirq: UIO_MEM_DMA_COHERENT conversion
uio_pruss: UIO_MEM_DMA_COHERENT conversion
cnic,bnx2,bnx2x: use UIO_MEM_DMA_COHERENT
uio: introduce UIO_MEM_DMA_COHERENT type
cdx: add MSI support for CDX bus
pps: use cflags-y instead of EXTRA_CFLAGS
speakup: Add /dev/synthu device
speakup: Fix 8bit characters from direct synth
parport: sunbpp: Convert to platform remove callback returning void
parport: amiga: Convert to platform remove callback returning void
char: xillybus: Convert to platform remove callback returning void
vmw_balloon: change maintainership
MAINTAINERS: change the maintainer for hpilo driver
char: xilinx_hwicap: Fix NULL vs IS_ERR() bug
hpet: remove hpets::hp_clocksource
platform: goldfish: move the separate 'default' propery for CONFIG_GOLDFISH
char: xilinx_hwicap: drop casting to void in dev_set_drvdata
greybus: move is_gb_* functions out of greybus.h
greybus: Remove usage of the deprecated ida_simple_xx() API
...
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
#include <linux/msi.h>
|
||||
|
||||
#define MAX_CDX_DEV_RESOURCES 4
|
||||
#define CDX_CONTROLLER_ID_SHIFT 4
|
||||
@@ -21,13 +22,25 @@
|
||||
struct cdx_controller;
|
||||
|
||||
enum {
|
||||
CDX_DEV_MSI_CONF,
|
||||
CDX_DEV_BUS_MASTER_CONF,
|
||||
CDX_DEV_RESET_CONF,
|
||||
CDX_DEV_MSI_ENABLE,
|
||||
};
|
||||
|
||||
struct cdx_msi_config {
|
||||
u64 addr;
|
||||
u32 data;
|
||||
u16 msi_index;
|
||||
};
|
||||
|
||||
struct cdx_device_config {
|
||||
u8 type;
|
||||
bool bus_master_enable;
|
||||
union {
|
||||
struct cdx_msi_config msi;
|
||||
bool bus_master_enable;
|
||||
bool msi_enable;
|
||||
};
|
||||
};
|
||||
|
||||
typedef int (*cdx_bus_enable_cb)(struct cdx_controller *cdx, u8 bus_num);
|
||||
@@ -87,6 +100,7 @@ struct cdx_ops {
|
||||
* struct cdx_controller: CDX controller object
|
||||
* @dev: Linux device associated with the CDX controller.
|
||||
* @priv: private data
|
||||
* @msi_domain: MSI domain
|
||||
* @id: Controller ID
|
||||
* @controller_registered: controller registered with bus
|
||||
* @ops: CDX controller ops
|
||||
@@ -94,6 +108,7 @@ struct cdx_ops {
|
||||
struct cdx_controller {
|
||||
struct device *dev;
|
||||
void *priv;
|
||||
struct irq_domain *msi_domain;
|
||||
u32 id;
|
||||
bool controller_registered;
|
||||
struct cdx_ops *ops;
|
||||
@@ -120,9 +135,13 @@ struct cdx_controller {
|
||||
* @req_id: Requestor ID associated with CDX device
|
||||
* @is_bus: Is this bus device
|
||||
* @enabled: is this bus enabled
|
||||
* @msi_dev_id: MSI Device ID associated with CDX device
|
||||
* @num_msi: Number of MSI's supported by the device
|
||||
* @driver_override: driver name to force a match; do not set directly,
|
||||
* because core frees it; use driver_set_override() to
|
||||
* set or clear it.
|
||||
* @irqchip_lock: lock to synchronize irq/msi configuration
|
||||
* @msi_write_pending: MSI write pending for this device
|
||||
*/
|
||||
struct cdx_device {
|
||||
struct device dev;
|
||||
@@ -144,7 +163,11 @@ struct cdx_device {
|
||||
u32 req_id;
|
||||
bool is_bus;
|
||||
bool enabled;
|
||||
u32 msi_dev_id;
|
||||
u32 num_msi;
|
||||
const char *driver_override;
|
||||
struct mutex irqchip_lock;
|
||||
bool msi_write_pending;
|
||||
};
|
||||
|
||||
#define to_cdx_device(_dev) \
|
||||
@@ -237,4 +260,32 @@ int cdx_set_master(struct cdx_device *cdx_dev);
|
||||
*/
|
||||
int cdx_clear_master(struct cdx_device *cdx_dev);
|
||||
|
||||
#ifdef CONFIG_GENERIC_MSI_IRQ
|
||||
/**
|
||||
* cdx_enable_msi - Enable MSI for the CDX device.
|
||||
* @cdx_dev: device pointer
|
||||
*
|
||||
* Return: 0 for success, -errno on failure
|
||||
*/
|
||||
int cdx_enable_msi(struct cdx_device *cdx_dev);
|
||||
|
||||
/**
|
||||
* cdx_disable_msi - Disable MSI for the CDX device.
|
||||
* @cdx_dev: device pointer
|
||||
*/
|
||||
void cdx_disable_msi(struct cdx_device *cdx_dev);
|
||||
|
||||
#else /* CONFIG_GENERIC_MSI_IRQ */
|
||||
|
||||
static inline int cdx_enable_msi(struct cdx_device *cdx_dev)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline void cdx_disable_msi(struct cdx_device *cdx_dev)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_GENERIC_MSI_IRQ */
|
||||
|
||||
#endif /* _CDX_BUS_H_ */
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
#define CORESIGHT_UNLOCK 0xc5acce55
|
||||
|
||||
extern struct bus_type coresight_bustype;
|
||||
extern const struct bus_type coresight_bustype;
|
||||
|
||||
enum coresight_dev_type {
|
||||
CORESIGHT_DEV_TYPE_SINK,
|
||||
@@ -226,13 +226,26 @@ struct coresight_sysfs_link {
|
||||
* by @coresight_ops.
|
||||
* @access: Device i/o access abstraction for this device.
|
||||
* @dev: The device entity associated to this component.
|
||||
* @refcnt: keep track of what is in use.
|
||||
* @mode: This tracer's mode, i.e sysFS, Perf or disabled. This is
|
||||
* actually an 'enum cs_mode', but is stored in an atomic type.
|
||||
* This is always accessed through local_read() and local_set(),
|
||||
* but wherever it's done from within the Coresight device's lock,
|
||||
* a non-atomic read would also work. This is the main point of
|
||||
* synchronisation between code happening inside the sysfs mode's
|
||||
* coresight_mutex and outside when running in Perf mode. A compare
|
||||
* and exchange swap is done to atomically claim one mode or the
|
||||
* other.
|
||||
* @refcnt: keep track of what is in use. Only access this outside of the
|
||||
* device's spinlock when the coresight_mutex held and mode ==
|
||||
* CS_MODE_SYSFS. Otherwise it must be accessed from inside the
|
||||
* spinlock.
|
||||
* @orphan: true if the component has connections that haven't been linked.
|
||||
* @enable: 'true' if component is currently part of an active path.
|
||||
* @activated: 'true' only if a _sink_ has been activated. A sink can be
|
||||
* activated but not yet enabled. Enabling for a _sink_
|
||||
* happens when a source has been selected and a path is enabled
|
||||
* from source to that sink.
|
||||
* @sysfs_sink_activated: 'true' when a sink has been selected for use via sysfs
|
||||
* by writing a 1 to the 'enable_sink' file. A sink can be
|
||||
* activated but not yet enabled. Enabling for a _sink_ happens
|
||||
* when a source has been selected and a path is enabled from
|
||||
* source to that sink. A sink can also become enabled but not
|
||||
* activated if it's used via Perf.
|
||||
* @ea: Device attribute for sink representation under PMU directory.
|
||||
* @def_sink: cached reference to default sink found for this device.
|
||||
* @nr_links: number of sysfs links created to other components from this
|
||||
@@ -250,11 +263,11 @@ struct coresight_device {
|
||||
const struct coresight_ops *ops;
|
||||
struct csdev_access access;
|
||||
struct device dev;
|
||||
atomic_t refcnt;
|
||||
local_t mode;
|
||||
int refcnt;
|
||||
bool orphan;
|
||||
bool enable; /* true only if configured as part of a path */
|
||||
/* sink specific fields */
|
||||
bool activated; /* true only if a sink is part of a path */
|
||||
bool sysfs_sink_activated;
|
||||
struct dev_ext_attribute *ea;
|
||||
struct coresight_device *def_sink;
|
||||
/* sysfs links between components */
|
||||
@@ -378,8 +391,6 @@ struct coresight_ops {
|
||||
const struct coresight_ops_helper *helper_ops;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_CORESIGHT)
|
||||
|
||||
static inline u32 csdev_access_relaxed_read32(struct csdev_access *csa,
|
||||
u32 offset)
|
||||
{
|
||||
@@ -569,11 +580,43 @@ static inline bool coresight_is_percpu_sink(struct coresight_device *csdev)
|
||||
(csdev->subtype.sink_subtype == CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM);
|
||||
}
|
||||
|
||||
/*
|
||||
* Atomically try to take the device and set a new mode. Returns true on
|
||||
* success, false if the device is already taken by someone else.
|
||||
*/
|
||||
static inline bool coresight_take_mode(struct coresight_device *csdev,
|
||||
enum cs_mode new_mode)
|
||||
{
|
||||
return local_cmpxchg(&csdev->mode, CS_MODE_DISABLED, new_mode) ==
|
||||
CS_MODE_DISABLED;
|
||||
}
|
||||
|
||||
static inline enum cs_mode coresight_get_mode(struct coresight_device *csdev)
|
||||
{
|
||||
return local_read(&csdev->mode);
|
||||
}
|
||||
|
||||
static inline void coresight_set_mode(struct coresight_device *csdev,
|
||||
enum cs_mode new_mode)
|
||||
{
|
||||
enum cs_mode current_mode = coresight_get_mode(csdev);
|
||||
|
||||
/*
|
||||
* Changing to a new mode must be done from an already disabled state
|
||||
* unless it's synchronized with coresight_take_mode(). Otherwise the
|
||||
* device is already in use and signifies a locking issue.
|
||||
*/
|
||||
WARN(new_mode != CS_MODE_DISABLED && current_mode != CS_MODE_DISABLED &&
|
||||
current_mode != new_mode, "Device already in use\n");
|
||||
|
||||
local_set(&csdev->mode, new_mode);
|
||||
}
|
||||
|
||||
extern struct coresight_device *
|
||||
coresight_register(struct coresight_desc *desc);
|
||||
extern void coresight_unregister(struct coresight_device *csdev);
|
||||
extern int coresight_enable(struct coresight_device *csdev);
|
||||
extern void coresight_disable(struct coresight_device *csdev);
|
||||
extern int coresight_enable_sysfs(struct coresight_device *csdev);
|
||||
extern void coresight_disable_sysfs(struct coresight_device *csdev);
|
||||
extern int coresight_timeout(struct csdev_access *csa, u32 offset,
|
||||
int position, int value);
|
||||
|
||||
@@ -598,83 +641,6 @@ void coresight_relaxed_write64(struct coresight_device *csdev,
|
||||
u64 val, u32 offset);
|
||||
void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset);
|
||||
|
||||
#else
|
||||
static inline struct coresight_device *
|
||||
coresight_register(struct coresight_desc *desc) { return NULL; }
|
||||
static inline void coresight_unregister(struct coresight_device *csdev) {}
|
||||
static inline int
|
||||
coresight_enable(struct coresight_device *csdev) { return -ENOSYS; }
|
||||
static inline void coresight_disable(struct coresight_device *csdev) {}
|
||||
|
||||
static inline int coresight_timeout(struct csdev_access *csa, u32 offset,
|
||||
int position, int value)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline int coresight_claim_device_unlocked(struct coresight_device *csdev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int coresight_claim_device(struct coresight_device *csdev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void coresight_disclaim_device(struct coresight_device *csdev) {}
|
||||
static inline void coresight_disclaim_device_unlocked(struct coresight_device *csdev) {}
|
||||
|
||||
static inline bool coresight_loses_context_with_cpu(struct device *dev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline u32 coresight_relaxed_read32(struct coresight_device *csdev, u32 offset)
|
||||
{
|
||||
WARN_ON_ONCE(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u32 coresight_read32(struct coresight_device *csdev, u32 offset)
|
||||
{
|
||||
WARN_ON_ONCE(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void coresight_write32(struct coresight_device *csdev, u32 val, u32 offset)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void coresight_relaxed_write32(struct coresight_device *csdev,
|
||||
u32 val, u32 offset)
|
||||
{
|
||||
}
|
||||
|
||||
static inline u64 coresight_relaxed_read64(struct coresight_device *csdev,
|
||||
u32 offset)
|
||||
{
|
||||
WARN_ON_ONCE(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline u64 coresight_read64(struct coresight_device *csdev, u32 offset)
|
||||
{
|
||||
WARN_ON_ONCE(1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void coresight_relaxed_write64(struct coresight_device *csdev,
|
||||
u64 val, u32 offset)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void coresight_write64(struct coresight_device *csdev, u64 val, u32 offset)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* IS_ENABLED(CONFIG_CORESIGHT) */
|
||||
|
||||
extern int coresight_get_cpu(struct device *dev);
|
||||
|
||||
struct coresight_platform_data *coresight_get_platform_data(struct device *dev);
|
||||
|
||||
@@ -68,7 +68,7 @@ struct dio_bus {
|
||||
};
|
||||
|
||||
extern struct dio_bus dio_bus; /* Single DIO bus */
|
||||
extern struct bus_type dio_bus_type;
|
||||
extern const struct bus_type dio_bus_type;
|
||||
|
||||
/*
|
||||
* DIO device IDs
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
* Xilinx Zynq MPSoC Firmware layer
|
||||
*
|
||||
* Copyright (C) 2014-2021 Xilinx
|
||||
* Copyright (C) 2022 - 2023, Advanced Micro Devices, Inc.
|
||||
*
|
||||
* Michal Simek <michal.simek@amd.com>
|
||||
* Davorin Mista <davorin.mista@aggios.com>
|
||||
@@ -171,6 +172,7 @@ enum pm_api_id {
|
||||
PM_CLOCK_GETPARENT = 44,
|
||||
PM_FPGA_READ = 46,
|
||||
PM_SECURE_AES = 47,
|
||||
PM_EFUSE_ACCESS = 53,
|
||||
PM_FEATURE_CHECK = 63,
|
||||
};
|
||||
|
||||
@@ -562,6 +564,7 @@ int zynqmp_pm_set_requirement(const u32 node, const u32 capabilities,
|
||||
const u32 qos,
|
||||
const enum zynqmp_pm_request_ack ack);
|
||||
int zynqmp_pm_aes_engine(const u64 address, u32 *out);
|
||||
int zynqmp_pm_efuse_access(const u64 address, u32 *out);
|
||||
int zynqmp_pm_sha_hash(const u64 address, const u32 size, const u32 flags);
|
||||
int zynqmp_pm_fpga_load(const u64 address, const u32 size, const u32 flags);
|
||||
int zynqmp_pm_fpga_get_status(u32 *value);
|
||||
@@ -749,6 +752,11 @@ static inline int zynqmp_pm_aes_engine(const u64 address, u32 *out)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_efuse_access(const u64 address, u32 *out)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline int zynqmp_pm_sha_hash(const u64 address, const u32 size,
|
||||
const u32 flags)
|
||||
{
|
||||
|
||||
@@ -104,44 +104,14 @@ void gb_debugfs_init(void);
|
||||
void gb_debugfs_cleanup(void);
|
||||
struct dentry *gb_debugfs_get(void);
|
||||
|
||||
extern struct bus_type greybus_bus_type;
|
||||
extern const struct bus_type greybus_bus_type;
|
||||
|
||||
extern struct device_type greybus_hd_type;
|
||||
extern struct device_type greybus_module_type;
|
||||
extern struct device_type greybus_interface_type;
|
||||
extern struct device_type greybus_control_type;
|
||||
extern struct device_type greybus_bundle_type;
|
||||
extern struct device_type greybus_svc_type;
|
||||
|
||||
static inline int is_gb_host_device(const struct device *dev)
|
||||
{
|
||||
return dev->type == &greybus_hd_type;
|
||||
}
|
||||
|
||||
static inline int is_gb_module(const struct device *dev)
|
||||
{
|
||||
return dev->type == &greybus_module_type;
|
||||
}
|
||||
|
||||
static inline int is_gb_interface(const struct device *dev)
|
||||
{
|
||||
return dev->type == &greybus_interface_type;
|
||||
}
|
||||
|
||||
static inline int is_gb_control(const struct device *dev)
|
||||
{
|
||||
return dev->type == &greybus_control_type;
|
||||
}
|
||||
|
||||
static inline int is_gb_bundle(const struct device *dev)
|
||||
{
|
||||
return dev->type == &greybus_bundle_type;
|
||||
}
|
||||
|
||||
static inline int is_gb_svc(const struct device *dev)
|
||||
{
|
||||
return dev->type == &greybus_svc_type;
|
||||
}
|
||||
extern const struct device_type greybus_hd_type;
|
||||
extern const struct device_type greybus_module_type;
|
||||
extern const struct device_type greybus_interface_type;
|
||||
extern const struct device_type greybus_control_type;
|
||||
extern const struct device_type greybus_bundle_type;
|
||||
extern const struct device_type greybus_svc_type;
|
||||
|
||||
static inline bool cport_id_valid(struct gb_host_device *hd, u16 cport_id)
|
||||
{
|
||||
|
||||
@@ -21,6 +21,10 @@
|
||||
#define HID_USAGE_SENSOR_ALS 0x200041
|
||||
#define HID_USAGE_SENSOR_DATA_LIGHT 0x2004d0
|
||||
#define HID_USAGE_SENSOR_LIGHT_ILLUM 0x2004d1
|
||||
#define HID_USAGE_SENSOR_LIGHT_COLOR_TEMPERATURE 0x2004d2
|
||||
#define HID_USAGE_SENSOR_LIGHT_CHROMATICITY 0x2004d3
|
||||
#define HID_USAGE_SENSOR_LIGHT_CHROMATICITY_X 0x2004d4
|
||||
#define HID_USAGE_SENSOR_LIGHT_CHROMATICITY_Y 0x2004d5
|
||||
|
||||
/* PROX (200011) */
|
||||
#define HID_USAGE_SENSOR_PROX 0x200011
|
||||
|
||||
@@ -1,68 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Analog Devices Generic AXI ADC IP core driver/library
|
||||
* Link: https://wiki.analog.com/resources/fpga/docs/axi_adc_ip
|
||||
*
|
||||
* Copyright 2012-2020 Analog Devices Inc.
|
||||
*/
|
||||
#ifndef __ADI_AXI_ADC_H__
|
||||
#define __ADI_AXI_ADC_H__
|
||||
|
||||
struct device;
|
||||
struct iio_chan_spec;
|
||||
|
||||
/**
|
||||
* struct adi_axi_adc_chip_info - Chip specific information
|
||||
* @name Chip name
|
||||
* @id Chip ID (usually product ID)
|
||||
* @channels Channel specifications of type @struct iio_chan_spec
|
||||
* @num_channels Number of @channels
|
||||
* @scale_table Supported scales by the chip; tuples of 2 ints
|
||||
* @num_scales Number of scales in the table
|
||||
* @max_rate Maximum sampling rate supported by the device
|
||||
*/
|
||||
struct adi_axi_adc_chip_info {
|
||||
const char *name;
|
||||
unsigned int id;
|
||||
|
||||
const struct iio_chan_spec *channels;
|
||||
unsigned int num_channels;
|
||||
|
||||
const unsigned int (*scale_table)[2];
|
||||
int num_scales;
|
||||
|
||||
unsigned long max_rate;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct adi_axi_adc_conv - data of the ADC attached to the AXI ADC
|
||||
* @chip_info chip info details for the client ADC
|
||||
* @preenable_setup op to run in the client before enabling the AXI ADC
|
||||
* @reg_access IIO debugfs_reg_access hook for the client ADC
|
||||
* @read_raw IIO read_raw hook for the client ADC
|
||||
* @write_raw IIO write_raw hook for the client ADC
|
||||
* @read_avail IIO read_avail hook for the client ADC
|
||||
*/
|
||||
struct adi_axi_adc_conv {
|
||||
const struct adi_axi_adc_chip_info *chip_info;
|
||||
|
||||
int (*preenable_setup)(struct adi_axi_adc_conv *conv);
|
||||
int (*reg_access)(struct adi_axi_adc_conv *conv, unsigned int reg,
|
||||
unsigned int writeval, unsigned int *readval);
|
||||
int (*read_raw)(struct adi_axi_adc_conv *conv,
|
||||
struct iio_chan_spec const *chan,
|
||||
int *val, int *val2, long mask);
|
||||
int (*write_raw)(struct adi_axi_adc_conv *conv,
|
||||
struct iio_chan_spec const *chan,
|
||||
int val, int val2, long mask);
|
||||
int (*read_avail)(struct adi_axi_adc_conv *conv,
|
||||
struct iio_chan_spec const *chan,
|
||||
const int **val, int *type, int *length, long mask);
|
||||
};
|
||||
|
||||
struct adi_axi_adc_conv *devm_adi_axi_adc_conv_register(struct device *dev,
|
||||
size_t sizeof_priv);
|
||||
|
||||
void *adi_axi_adc_conv_priv(struct adi_axi_adc_conv *conv);
|
||||
|
||||
#endif
|
||||
72
include/linux/iio/backend.h
Normal file
72
include/linux/iio/backend.h
Normal file
@@ -0,0 +1,72 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
||||
#ifndef _IIO_BACKEND_H_
|
||||
#define _IIO_BACKEND_H_
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct fwnode_handle;
|
||||
struct iio_backend;
|
||||
struct device;
|
||||
struct iio_dev;
|
||||
|
||||
enum iio_backend_data_type {
|
||||
IIO_BACKEND_TWOS_COMPLEMENT,
|
||||
IIO_BACKEND_OFFSET_BINARY,
|
||||
IIO_BACKEND_DATA_TYPE_MAX
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iio_backend_data_fmt - Backend data format
|
||||
* @type: Data type.
|
||||
* @sign_extend: Bool to tell if the data is sign extended.
|
||||
* @enable: Enable/Disable the data format module. If disabled,
|
||||
* not formatting will happen.
|
||||
*/
|
||||
struct iio_backend_data_fmt {
|
||||
enum iio_backend_data_type type;
|
||||
bool sign_extend;
|
||||
bool enable;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iio_backend_ops - operations structure for an iio_backend
|
||||
* @enable: Enable backend.
|
||||
* @disable: Disable backend.
|
||||
* @chan_enable: Enable one channel.
|
||||
* @chan_disable: Disable one channel.
|
||||
* @data_format_set: Configure the data format for a specific channel.
|
||||
* @request_buffer: Request an IIO buffer.
|
||||
* @free_buffer: Free an IIO buffer.
|
||||
**/
|
||||
struct iio_backend_ops {
|
||||
int (*enable)(struct iio_backend *back);
|
||||
void (*disable)(struct iio_backend *back);
|
||||
int (*chan_enable)(struct iio_backend *back, unsigned int chan);
|
||||
int (*chan_disable)(struct iio_backend *back, unsigned int chan);
|
||||
int (*data_format_set)(struct iio_backend *back, unsigned int chan,
|
||||
const struct iio_backend_data_fmt *data);
|
||||
struct iio_buffer *(*request_buffer)(struct iio_backend *back,
|
||||
struct iio_dev *indio_dev);
|
||||
void (*free_buffer)(struct iio_backend *back,
|
||||
struct iio_buffer *buffer);
|
||||
};
|
||||
|
||||
int iio_backend_chan_enable(struct iio_backend *back, unsigned int chan);
|
||||
int iio_backend_chan_disable(struct iio_backend *back, unsigned int chan);
|
||||
int devm_iio_backend_enable(struct device *dev, struct iio_backend *back);
|
||||
int iio_backend_data_format_set(struct iio_backend *back, unsigned int chan,
|
||||
const struct iio_backend_data_fmt *data);
|
||||
int devm_iio_backend_request_buffer(struct device *dev,
|
||||
struct iio_backend *back,
|
||||
struct iio_dev *indio_dev);
|
||||
|
||||
void *iio_backend_get_priv(const struct iio_backend *conv);
|
||||
struct iio_backend *devm_iio_backend_get(struct device *dev, const char *name);
|
||||
struct iio_backend *
|
||||
__devm_iio_backend_get_from_fwnode_lookup(struct device *dev,
|
||||
struct fwnode_handle *fwnode);
|
||||
|
||||
int devm_iio_backend_register(struct device *dev,
|
||||
const struct iio_backend_ops *ops, void *priv);
|
||||
|
||||
#endif
|
||||
@@ -10,6 +10,9 @@
|
||||
struct iio_dev;
|
||||
struct device;
|
||||
|
||||
struct iio_buffer *iio_dmaengine_buffer_alloc(struct device *dev,
|
||||
const char *channel);
|
||||
void iio_dmaengine_buffer_free(struct iio_buffer *buffer);
|
||||
int devm_iio_dmaengine_buffer_setup(struct device *dev,
|
||||
struct iio_dev *indio_dev,
|
||||
const char *channel);
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/cdev.h>
|
||||
#include <linux/cleanup.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/iio/types.h>
|
||||
/* IIO TODO LIST */
|
||||
@@ -638,10 +639,37 @@ int __devm_iio_device_register(struct device *dev, struct iio_dev *indio_dev,
|
||||
int iio_push_event(struct iio_dev *indio_dev, u64 ev_code, s64 timestamp);
|
||||
int iio_device_claim_direct_mode(struct iio_dev *indio_dev);
|
||||
void iio_device_release_direct_mode(struct iio_dev *indio_dev);
|
||||
|
||||
/*
|
||||
* This autocleanup logic is normally used via
|
||||
* iio_device_claim_direct_scoped().
|
||||
*/
|
||||
DEFINE_GUARD(iio_claim_direct, struct iio_dev *, iio_device_claim_direct_mode(_T),
|
||||
iio_device_release_direct_mode(_T))
|
||||
|
||||
DEFINE_GUARD_COND(iio_claim_direct, _try, ({
|
||||
struct iio_dev *dev;
|
||||
int d = iio_device_claim_direct_mode(_T);
|
||||
|
||||
if (d < 0)
|
||||
dev = NULL;
|
||||
else
|
||||
dev = _T;
|
||||
dev;
|
||||
}))
|
||||
|
||||
/**
|
||||
* iio_device_claim_direct_scoped() - Scoped call to iio_device_claim_direct.
|
||||
* @fail: What to do on failure to claim device.
|
||||
* @iio_dev: Pointer to the IIO devices structure
|
||||
*/
|
||||
#define iio_device_claim_direct_scoped(fail, iio_dev) \
|
||||
scoped_cond_guard(iio_claim_direct_try, fail, iio_dev)
|
||||
|
||||
int iio_device_claim_buffer_mode(struct iio_dev *indio_dev);
|
||||
void iio_device_release_buffer_mode(struct iio_dev *indio_dev);
|
||||
|
||||
extern struct bus_type iio_bus_type;
|
||||
extern const struct bus_type iio_bus_type;
|
||||
|
||||
/**
|
||||
* iio_device_put() - reference counted deallocation of struct device
|
||||
|
||||
@@ -36,7 +36,7 @@ struct icc_onecell_data {
|
||||
struct icc_node *nodes[] __counted_by(num_nodes);
|
||||
};
|
||||
|
||||
struct icc_node *of_icc_xlate_onecell(struct of_phandle_args *spec,
|
||||
struct icc_node *of_icc_xlate_onecell(const struct of_phandle_args *spec,
|
||||
void *data);
|
||||
|
||||
/**
|
||||
@@ -65,8 +65,9 @@ struct icc_provider {
|
||||
u32 peak_bw, u32 *agg_avg, u32 *agg_peak);
|
||||
void (*pre_aggregate)(struct icc_node *node);
|
||||
int (*get_bw)(struct icc_node *node, u32 *avg, u32 *peak);
|
||||
struct icc_node* (*xlate)(struct of_phandle_args *spec, void *data);
|
||||
struct icc_node_data* (*xlate_extended)(struct of_phandle_args *spec, void *data);
|
||||
struct icc_node* (*xlate)(const struct of_phandle_args *spec, void *data);
|
||||
struct icc_node_data* (*xlate_extended)(const struct of_phandle_args *spec,
|
||||
void *data);
|
||||
struct device *dev;
|
||||
int users;
|
||||
bool inter_set;
|
||||
@@ -124,7 +125,7 @@ int icc_nodes_remove(struct icc_provider *provider);
|
||||
void icc_provider_init(struct icc_provider *provider);
|
||||
int icc_provider_register(struct icc_provider *provider);
|
||||
void icc_provider_deregister(struct icc_provider *provider);
|
||||
struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec);
|
||||
struct icc_node_data *of_icc_get_from_provider(const struct of_phandle_args *spec);
|
||||
void icc_sync_state(struct device *dev);
|
||||
|
||||
#else
|
||||
@@ -171,7 +172,7 @@ static inline int icc_provider_register(struct icc_provider *provider)
|
||||
|
||||
static inline void icc_provider_deregister(struct icc_provider *provider) { }
|
||||
|
||||
static inline struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec)
|
||||
static inline struct icc_node_data *of_icc_get_from_provider(const struct of_phandle_args *spec)
|
||||
{
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
}
|
||||
|
||||
@@ -320,12 +320,7 @@ struct mhi_controller_config {
|
||||
* @hw_ev_rings: Number of hardware event rings
|
||||
* @sw_ev_rings: Number of software event rings
|
||||
* @nr_irqs: Number of IRQ allocated by bus master (required)
|
||||
* @family_number: MHI controller family number
|
||||
* @device_number: MHI controller device number
|
||||
* @major_version: MHI controller major revision number
|
||||
* @minor_version: MHI controller minor revision number
|
||||
* @serial_number: MHI controller serial number obtained from BHI
|
||||
* @oem_pk_hash: MHI controller OEM PK Hash obtained from BHI
|
||||
* @mhi_event: MHI event ring configurations table
|
||||
* @mhi_cmd: MHI command ring configurations table
|
||||
* @mhi_ctxt: MHI device context, shared memory between host and device
|
||||
@@ -369,15 +364,6 @@ struct mhi_controller_config {
|
||||
* Fields marked as (required) need to be populated by the controller driver
|
||||
* before calling mhi_register_controller(). For the fields marked as (optional)
|
||||
* they can be populated depending on the usecase.
|
||||
*
|
||||
* The following fields are present for the purpose of implementing any device
|
||||
* specific quirks or customizations for specific MHI revisions used in device
|
||||
* by the controller drivers. The MHI stack will just populate these fields
|
||||
* during mhi_register_controller():
|
||||
* family_number
|
||||
* device_number
|
||||
* major_version
|
||||
* minor_version
|
||||
*/
|
||||
struct mhi_controller {
|
||||
struct device *cntrl_dev;
|
||||
@@ -408,12 +394,7 @@ struct mhi_controller {
|
||||
u32 hw_ev_rings;
|
||||
u32 sw_ev_rings;
|
||||
u32 nr_irqs;
|
||||
u32 family_number;
|
||||
u32 device_number;
|
||||
u32 major_version;
|
||||
u32 minor_version;
|
||||
u32 serial_number;
|
||||
u32 oem_pk_hash[MHI_MAX_OEM_PK_HASH_SEGMENTS];
|
||||
|
||||
struct mhi_event *mhi_event;
|
||||
struct mhi_cmd *mhi_cmd;
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#include <linux/completion.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
|
||||
extern struct bus_type slimbus_bus;
|
||||
extern const struct bus_type slimbus_bus;
|
||||
|
||||
/**
|
||||
* struct slim_eaddr - Enumeration address for a SLIMbus device
|
||||
|
||||
@@ -28,19 +28,26 @@ struct uio_map;
|
||||
* logical, virtual, or physical & phys_addr_t
|
||||
* should always be large enough to handle any of
|
||||
* the address types)
|
||||
* @dma_addr: DMA handle set by dma_alloc_coherent, used with
|
||||
* UIO_MEM_DMA_COHERENT only (@addr should be the
|
||||
* void * returned from the same dma_alloc_coherent call)
|
||||
* @offs: offset of device memory within the page
|
||||
* @size: size of IO (multiple of page size)
|
||||
* @memtype: type of memory addr points to
|
||||
* @internal_addr: ioremap-ped version of addr, for driver internal use
|
||||
* @dma_device: device struct that was passed to dma_alloc_coherent,
|
||||
* used with UIO_MEM_DMA_COHERENT only
|
||||
* @map: for use by the UIO core only.
|
||||
*/
|
||||
struct uio_mem {
|
||||
const char *name;
|
||||
phys_addr_t addr;
|
||||
dma_addr_t dma_addr;
|
||||
unsigned long offs;
|
||||
resource_size_t size;
|
||||
int memtype;
|
||||
void __iomem *internal_addr;
|
||||
struct device *dma_device;
|
||||
struct uio_map *map;
|
||||
};
|
||||
|
||||
@@ -158,6 +165,12 @@ extern int __must_check
|
||||
#define UIO_MEM_LOGICAL 2
|
||||
#define UIO_MEM_VIRTUAL 3
|
||||
#define UIO_MEM_IOVA 4
|
||||
/*
|
||||
* UIO_MEM_DMA_COHERENT exists for legacy drivers that had been getting by with
|
||||
* improperly mapping DMA coherent allocations through the other modes.
|
||||
* Do not use in new drivers.
|
||||
*/
|
||||
#define UIO_MEM_DMA_COHERENT 5
|
||||
|
||||
/* defines for uio_port->porttype */
|
||||
#define UIO_PORT_NONE 0
|
||||
|
||||
Reference in New Issue
Block a user