Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
@@ -67,6 +67,17 @@
|
||||
#define CNTL_LDMAFIFOTIME (1 << 15)
|
||||
#define CNTL_WATERMARK (1 << 16)
|
||||
|
||||
/* ST Microelectronics variant bits */
|
||||
#define CNTL_ST_1XBPP_444 0x0
|
||||
#define CNTL_ST_1XBPP_5551 (1 << 17)
|
||||
#define CNTL_ST_1XBPP_565 (1 << 18)
|
||||
#define CNTL_ST_CDWID_12 0x0
|
||||
#define CNTL_ST_CDWID_16 (1 << 19)
|
||||
#define CNTL_ST_CDWID_18 (1 << 20)
|
||||
#define CNTL_ST_CDWID_24 ((1 << 19)|(1 << 20))
|
||||
#define CNTL_ST_CEAEN (1 << 21)
|
||||
#define CNTL_ST_LCDBPP24_PACKED (6 << 1)
|
||||
|
||||
enum {
|
||||
/* individual formats */
|
||||
CLCD_CAP_RGB444 = (1 << 0),
|
||||
@@ -93,6 +104,8 @@ enum {
|
||||
CLCD_CAP_ALL = CLCD_CAP_BGR | CLCD_CAP_RGB,
|
||||
};
|
||||
|
||||
struct backlight_device;
|
||||
|
||||
struct clcd_panel {
|
||||
struct fb_videomode mode;
|
||||
signed short width; /* width in mm */
|
||||
@@ -105,6 +118,13 @@ struct clcd_panel {
|
||||
fixedtimings:1,
|
||||
grayscale:1;
|
||||
unsigned int connector;
|
||||
struct backlight_device *backlight;
|
||||
/*
|
||||
* If the B/R lines are switched between the CLCD
|
||||
* and the panel we need to know this and not try to
|
||||
* compensate with the BGR bit in the control register.
|
||||
*/
|
||||
bool bgr_connection;
|
||||
};
|
||||
|
||||
struct clcd_regs {
|
||||
@@ -170,11 +190,38 @@ struct clcd_board {
|
||||
struct amba_device;
|
||||
struct clk;
|
||||
|
||||
/**
|
||||
* struct clcd_vendor_data - holds hardware (IP-block) vendor-specific
|
||||
* variant information
|
||||
*
|
||||
* @clock_timregs: the CLCD needs to be clocked when accessing the
|
||||
* timer registers, or the hardware will hang.
|
||||
* @packed_24_bit_pixels: this variant supports 24bit packed pixel data,
|
||||
* so that RGB accesses 3 bytes at a time, not just on even 32bit
|
||||
* boundaries, packing the pixel data in memory. ST Microelectronics
|
||||
* have this.
|
||||
* @st_bitmux_control: ST Microelectronics have implemented output
|
||||
* bit line multiplexing into the CLCD control register. This indicates
|
||||
* that we need to use this.
|
||||
* @init_board: custom board init function for this variant
|
||||
* @init_panel: custom panel init function for this variant
|
||||
*/
|
||||
struct clcd_vendor_data {
|
||||
bool clock_timregs;
|
||||
bool packed_24_bit_pixels;
|
||||
bool st_bitmux_control;
|
||||
int (*init_board)(struct amba_device *adev,
|
||||
struct clcd_board *board);
|
||||
int (*init_panel)(struct clcd_fb *fb,
|
||||
struct device_node *panel);
|
||||
};
|
||||
|
||||
/* this data structure describes each frame buffer device we find */
|
||||
struct clcd_fb {
|
||||
struct fb_info fb;
|
||||
struct amba_device *dev;
|
||||
struct clk *clk;
|
||||
struct clcd_vendor_data *vendor;
|
||||
struct clcd_panel *panel;
|
||||
struct clcd_board *board;
|
||||
void *board_data;
|
||||
@@ -231,16 +278,22 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
|
||||
if (var->grayscale)
|
||||
val |= CNTL_LCDBW;
|
||||
|
||||
if (fb->panel->caps && fb->board->caps &&
|
||||
var->bits_per_pixel >= 16) {
|
||||
if (fb->panel->caps && fb->board->caps && var->bits_per_pixel >= 16) {
|
||||
/*
|
||||
* if board and panel supply capabilities, we can support
|
||||
* changing BGR/RGB depending on supplied parameters
|
||||
* changing BGR/RGB depending on supplied parameters. Here
|
||||
* we switch to what the framebuffer is providing if need
|
||||
* be, so if the framebuffer is BGR but the display connection
|
||||
* is RGB (first case) we switch it around. Vice versa mutatis
|
||||
* mutandis if the framebuffer is RGB but the display connection
|
||||
* is BGR, we flip it around.
|
||||
*/
|
||||
if (var->red.offset == 0)
|
||||
val &= ~CNTL_BGR;
|
||||
else
|
||||
val |= CNTL_BGR;
|
||||
if (fb->panel->bgr_connection)
|
||||
val ^= CNTL_BGR;
|
||||
}
|
||||
|
||||
switch (var->bits_per_pixel) {
|
||||
@@ -270,6 +323,10 @@ static inline void clcdfb_decode(struct clcd_fb *fb, struct clcd_regs *regs)
|
||||
else
|
||||
val |= CNTL_LCDBPP16_444;
|
||||
break;
|
||||
case 24:
|
||||
/* Modified variant supporting 24 bit packed pixels */
|
||||
val |= CNTL_ST_LCDBPP24_PACKED;
|
||||
break;
|
||||
case 32:
|
||||
val |= CNTL_LCDBPP24;
|
||||
break;
|
||||
|
@@ -157,12 +157,13 @@ struct fid {
|
||||
* @fh_to_dentry is given a &struct super_block (@sb) and a file handle
|
||||
* fragment (@fh, @fh_len). It should return a &struct dentry which refers
|
||||
* to the same file that the file handle fragment refers to. If it cannot,
|
||||
* it should return a %NULL pointer if the file was found but no acceptable
|
||||
* &dentries were available, or an %ERR_PTR error code indicating why it
|
||||
* couldn't be found (e.g. %ENOENT or %ENOMEM). Any suitable dentry can be
|
||||
* returned including, if necessary, a new dentry created with d_alloc_root.
|
||||
* The caller can then find any other extant dentries by following the
|
||||
* d_alias links.
|
||||
* it should return a %NULL pointer if the file cannot be found, or an
|
||||
* %ERR_PTR error code of %ENOMEM if a memory allocation failure occurred.
|
||||
* Any other error code is treated like %NULL, and will cause an %ESTALE error
|
||||
* for callers of exportfs_decode_fh().
|
||||
* Any suitable dentry can be returned including, if necessary, a new dentry
|
||||
* created with d_alloc_root. The caller can then find any other extant
|
||||
* dentries by following the d_alias links.
|
||||
*
|
||||
* fh_to_parent:
|
||||
* Same as @fh_to_dentry, except that it returns a pointer to the parent
|
||||
|
@@ -25,6 +25,7 @@ struct space_resv {
|
||||
FALLOC_FL_PUNCH_HOLE | \
|
||||
FALLOC_FL_COLLAPSE_RANGE | \
|
||||
FALLOC_FL_ZERO_RANGE | \
|
||||
FALLOC_FL_INSERT_RANGE)
|
||||
FALLOC_FL_INSERT_RANGE | \
|
||||
FALLOC_FL_UNSHARE_RANGE)
|
||||
|
||||
#endif /* _FALLOC_H_ */
|
||||
|
@@ -92,12 +92,21 @@ __mlx5_mask(typ, fld))
|
||||
___t; \
|
||||
})
|
||||
|
||||
#define MLX5_SET64(typ, p, fld, v) do { \
|
||||
#define __MLX5_SET64(typ, p, fld, v) do { \
|
||||
BUILD_BUG_ON(__mlx5_bit_sz(typ, fld) != 64); \
|
||||
BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \
|
||||
*((__be64 *)(p) + __mlx5_64_off(typ, fld)) = cpu_to_be64(v); \
|
||||
} while (0)
|
||||
|
||||
#define MLX5_SET64(typ, p, fld, v) do { \
|
||||
BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \
|
||||
__MLX5_SET64(typ, p, fld, v); \
|
||||
} while (0)
|
||||
|
||||
#define MLX5_ARRAY_SET64(typ, p, fld, idx, v) do { \
|
||||
BUILD_BUG_ON(__mlx5_bit_off(typ, fld) % 64); \
|
||||
__MLX5_SET64(typ, p, fld[idx], v); \
|
||||
} while (0)
|
||||
|
||||
#define MLX5_GET64(typ, p, fld) be64_to_cpu(*((__be64 *)(p) + __mlx5_64_off(typ, fld)))
|
||||
|
||||
#define MLX5_GET64_PR(typ, p, fld) ({ \
|
||||
|
@@ -67,6 +67,7 @@ struct nfs4_stateid_struct {
|
||||
NFS4_DELEGATION_STATEID_TYPE,
|
||||
NFS4_LAYOUT_STATEID_TYPE,
|
||||
NFS4_PNFS_DS_STATEID_TYPE,
|
||||
NFS4_REVOKED_STATEID_TYPE,
|
||||
} type;
|
||||
};
|
||||
|
||||
|
@@ -103,6 +103,9 @@ struct nfs_client {
|
||||
#define NFS_SP4_MACH_CRED_WRITE 5 /* WRITE */
|
||||
#define NFS_SP4_MACH_CRED_COMMIT 6 /* COMMIT */
|
||||
#define NFS_SP4_MACH_CRED_PNFS_CLEANUP 7 /* LAYOUTRETURN */
|
||||
#if IS_ENABLED(CONFIG_NFS_V4_1)
|
||||
wait_queue_head_t cl_lock_waitq;
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
#endif /* CONFIG_NFS_V4 */
|
||||
|
||||
/* Our own IP address, as a null-terminated string.
|
||||
|
@@ -124,6 +124,11 @@ struct nfs_fattr {
|
||||
| NFS_ATTR_FATTR_SPACE_USED \
|
||||
| NFS_ATTR_FATTR_V4_SECURITY_LABEL)
|
||||
|
||||
/*
|
||||
* Maximal number of supported layout drivers.
|
||||
*/
|
||||
#define NFS_MAX_LAYOUT_TYPES 8
|
||||
|
||||
/*
|
||||
* Info on the file system
|
||||
*/
|
||||
@@ -139,7 +144,8 @@ struct nfs_fsinfo {
|
||||
__u64 maxfilesize;
|
||||
struct timespec time_delta; /* server time granularity */
|
||||
__u32 lease_time; /* in seconds */
|
||||
__u32 layouttype; /* supported pnfs layout driver */
|
||||
__u32 nlayouttypes; /* number of layouttypes */
|
||||
__u32 layouttype[NFS_MAX_LAYOUT_TYPES]; /* supported pnfs layout driver */
|
||||
__u32 blksize; /* preferred pnfs io block size */
|
||||
__u32 clone_blksize; /* granularity of a CLONE operation */
|
||||
};
|
||||
|
@@ -641,6 +641,7 @@ static inline void pwm_remove_table(struct pwm_lookup *table, size_t num)
|
||||
#ifdef CONFIG_PWM_SYSFS
|
||||
void pwmchip_sysfs_export(struct pwm_chip *chip);
|
||||
void pwmchip_sysfs_unexport(struct pwm_chip *chip);
|
||||
void pwmchip_sysfs_unexport_children(struct pwm_chip *chip);
|
||||
#else
|
||||
static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
|
||||
{
|
||||
@@ -649,6 +650,10 @@ static inline void pwmchip_sysfs_export(struct pwm_chip *chip)
|
||||
static inline void pwmchip_sysfs_unexport(struct pwm_chip *chip)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void pwmchip_sysfs_unexport_children(struct pwm_chip *chip)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PWM_SYSFS */
|
||||
|
||||
#endif /* __LINUX_PWM_H */
|
||||
|
@@ -131,6 +131,7 @@ struct rpc_authops {
|
||||
struct rpc_auth * (*create)(struct rpc_auth_create_args *, struct rpc_clnt *);
|
||||
void (*destroy)(struct rpc_auth *);
|
||||
|
||||
int (*hash_cred)(struct auth_cred *, unsigned int);
|
||||
struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int);
|
||||
struct rpc_cred * (*crcreate)(struct rpc_auth*, struct auth_cred *, int, gfp_t);
|
||||
int (*list_pseudoflavors)(rpc_authflavor_t *, int);
|
||||
|
@@ -125,6 +125,13 @@ struct rpc_create_args {
|
||||
struct svc_xprt *bc_xprt; /* NFSv4.1 backchannel */
|
||||
};
|
||||
|
||||
struct rpc_add_xprt_test {
|
||||
int (*add_xprt_test)(struct rpc_clnt *,
|
||||
struct rpc_xprt *,
|
||||
void *calldata);
|
||||
void *data;
|
||||
};
|
||||
|
||||
/* Values for "flags" field */
|
||||
#define RPC_CLNT_CREATE_HARDRTRY (1UL << 0)
|
||||
#define RPC_CLNT_CREATE_AUTOBIND (1UL << 2)
|
||||
@@ -198,6 +205,16 @@ int rpc_clnt_add_xprt(struct rpc_clnt *, struct xprt_create *,
|
||||
void rpc_cap_max_reconnect_timeout(struct rpc_clnt *clnt,
|
||||
unsigned long timeo);
|
||||
|
||||
int rpc_clnt_setup_test_and_add_xprt(struct rpc_clnt *,
|
||||
struct rpc_xprt_switch *,
|
||||
struct rpc_xprt *,
|
||||
void *);
|
||||
|
||||
const char *rpc_proc_name(const struct rpc_task *task);
|
||||
|
||||
void rpc_clnt_xprt_switch_put(struct rpc_clnt *);
|
||||
void rpc_clnt_xprt_switch_add_xprt(struct rpc_clnt *, struct rpc_xprt *);
|
||||
bool rpc_clnt_xprt_switch_has_addr(struct rpc_clnt *clnt,
|
||||
const struct sockaddr *sap);
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* _LINUX_SUNRPC_CLNT_H */
|
||||
|
@@ -41,10 +41,15 @@
|
||||
#define _LINUX_SUNRPC_RPC_RDMA_H
|
||||
|
||||
#include <linux/types.h>
|
||||
#include <linux/bitops.h>
|
||||
|
||||
#define RPCRDMA_VERSION 1
|
||||
#define rpcrdma_version cpu_to_be32(RPCRDMA_VERSION)
|
||||
|
||||
enum {
|
||||
RPCRDMA_V1_DEF_INLINE_SIZE = 1024,
|
||||
};
|
||||
|
||||
struct rpcrdma_segment {
|
||||
__be32 rs_handle; /* Registered memory handle */
|
||||
__be32 rs_length; /* Length of the chunk in bytes */
|
||||
@@ -129,4 +134,38 @@ enum rpcrdma_proc {
|
||||
#define rdma_done cpu_to_be32(RDMA_DONE)
|
||||
#define rdma_error cpu_to_be32(RDMA_ERROR)
|
||||
|
||||
/*
|
||||
* Private extension to RPC-over-RDMA Version One.
|
||||
* Message passed during RDMA-CM connection set-up.
|
||||
*
|
||||
* Add new fields at the end, and don't permute existing
|
||||
* fields.
|
||||
*/
|
||||
struct rpcrdma_connect_private {
|
||||
__be32 cp_magic;
|
||||
u8 cp_version;
|
||||
u8 cp_flags;
|
||||
u8 cp_send_size;
|
||||
u8 cp_recv_size;
|
||||
} __packed;
|
||||
|
||||
#define rpcrdma_cmp_magic __cpu_to_be32(0xf6ab0e18)
|
||||
|
||||
enum {
|
||||
RPCRDMA_CMP_VERSION = 1,
|
||||
RPCRDMA_CMP_F_SND_W_INV_OK = BIT(0),
|
||||
};
|
||||
|
||||
static inline u8
|
||||
rpcrdma_encode_buffer_size(unsigned int size)
|
||||
{
|
||||
return (size >> 10) - 1;
|
||||
}
|
||||
|
||||
static inline unsigned int
|
||||
rpcrdma_decode_buffer_size(u8 val)
|
||||
{
|
||||
return ((unsigned int)val + 1) << 10;
|
||||
}
|
||||
|
||||
#endif /* _LINUX_SUNRPC_RPC_RDMA_H */
|
||||
|
@@ -239,8 +239,8 @@ struct rpc_task *rpc_wake_up_first(struct rpc_wait_queue *,
|
||||
void *);
|
||||
void rpc_wake_up_status(struct rpc_wait_queue *, int);
|
||||
void rpc_delay(struct rpc_task *, unsigned long);
|
||||
void * rpc_malloc(struct rpc_task *, size_t);
|
||||
void rpc_free(void *);
|
||||
int rpc_malloc(struct rpc_task *);
|
||||
void rpc_free(struct rpc_task *);
|
||||
int rpciod_up(void);
|
||||
void rpciod_down(void);
|
||||
int __rpc_wait_for_completion_task(struct rpc_task *task, wait_bit_action_f *);
|
||||
|
@@ -86,6 +86,7 @@ struct svc_rdma_op_ctxt {
|
||||
unsigned long flags;
|
||||
enum dma_data_direction direction;
|
||||
int count;
|
||||
unsigned int mapped_sges;
|
||||
struct ib_sge sge[RPCSVC_MAXPAGES];
|
||||
struct page *pages[RPCSVC_MAXPAGES];
|
||||
};
|
||||
@@ -136,6 +137,7 @@ struct svcxprt_rdma {
|
||||
int sc_ord; /* RDMA read limit */
|
||||
int sc_max_sge;
|
||||
int sc_max_sge_rd; /* max sge for read target */
|
||||
bool sc_snd_w_inv; /* OK to use Send With Invalidate */
|
||||
|
||||
atomic_t sc_sq_count; /* Number of SQ WR on queue */
|
||||
unsigned int sc_sq_depth; /* Depth of SQ */
|
||||
@@ -193,6 +195,14 @@ struct svcxprt_rdma {
|
||||
|
||||
#define RPCSVC_MAXPAYLOAD_RDMA RPCSVC_MAXPAYLOAD
|
||||
|
||||
/* Track DMA maps for this transport and context */
|
||||
static inline void svc_rdma_count_mappings(struct svcxprt_rdma *rdma,
|
||||
struct svc_rdma_op_ctxt *ctxt)
|
||||
{
|
||||
ctxt->mapped_sges++;
|
||||
atomic_inc(&rdma->sc_dma_used);
|
||||
}
|
||||
|
||||
/* svc_rdma_backchannel.c */
|
||||
extern int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt,
|
||||
struct rpcrdma_msg *rmsgp,
|
||||
|
@@ -67,6 +67,18 @@ struct xdr_buf {
|
||||
len; /* Length of XDR encoded message */
|
||||
};
|
||||
|
||||
static inline void
|
||||
xdr_buf_init(struct xdr_buf *buf, void *start, size_t len)
|
||||
{
|
||||
buf->head[0].iov_base = start;
|
||||
buf->head[0].iov_len = len;
|
||||
buf->tail[0].iov_len = 0;
|
||||
buf->page_len = 0;
|
||||
buf->flags = 0;
|
||||
buf->len = 0;
|
||||
buf->buflen = len;
|
||||
}
|
||||
|
||||
/*
|
||||
* pre-xdr'ed macros.
|
||||
*/
|
||||
|
@@ -83,9 +83,11 @@ struct rpc_rqst {
|
||||
void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
|
||||
struct list_head rq_list;
|
||||
|
||||
__u32 * rq_buffer; /* XDR encode buffer */
|
||||
size_t rq_callsize,
|
||||
rq_rcvsize;
|
||||
void *rq_xprtdata; /* Per-xprt private data */
|
||||
void *rq_buffer; /* Call XDR encode buffer */
|
||||
size_t rq_callsize;
|
||||
void *rq_rbuffer; /* Reply XDR decode buffer */
|
||||
size_t rq_rcvsize;
|
||||
size_t rq_xmit_bytes_sent; /* total bytes sent */
|
||||
size_t rq_reply_bytes_recvd; /* total reply bytes */
|
||||
/* received */
|
||||
@@ -127,8 +129,8 @@ struct rpc_xprt_ops {
|
||||
void (*rpcbind)(struct rpc_task *task);
|
||||
void (*set_port)(struct rpc_xprt *xprt, unsigned short port);
|
||||
void (*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
void * (*buf_alloc)(struct rpc_task *task, size_t size);
|
||||
void (*buf_free)(void *buffer);
|
||||
int (*buf_alloc)(struct rpc_task *task);
|
||||
void (*buf_free)(struct rpc_task *task);
|
||||
int (*send_request)(struct rpc_task *task);
|
||||
void (*set_retrans_timeout)(struct rpc_task *task);
|
||||
void (*timer)(struct rpc_xprt *xprt, struct rpc_task *task);
|
||||
|
@@ -66,4 +66,6 @@ extern struct rpc_xprt *xprt_iter_xprt(struct rpc_xprt_iter *xpi);
|
||||
extern struct rpc_xprt *xprt_iter_get_xprt(struct rpc_xprt_iter *xpi);
|
||||
extern struct rpc_xprt *xprt_iter_get_next(struct rpc_xprt_iter *xpi);
|
||||
|
||||
extern bool rpc_xprt_switch_has_addr(struct rpc_xprt_switch *xps,
|
||||
const struct sockaddr *sap);
|
||||
#endif
|
||||
|
@@ -53,8 +53,8 @@
|
||||
#define RPCRDMA_MAX_SLOT_TABLE (256U)
|
||||
|
||||
#define RPCRDMA_MIN_INLINE (1024) /* min inline thresh */
|
||||
#define RPCRDMA_DEF_INLINE (1024) /* default inline thresh */
|
||||
#define RPCRDMA_MAX_INLINE (3068) /* max inline thresh */
|
||||
#define RPCRDMA_DEF_INLINE (4096) /* default inline thresh */
|
||||
#define RPCRDMA_MAX_INLINE (65536) /* max inline thresh */
|
||||
|
||||
/* Memory registration strategies, by number.
|
||||
* This is part of a kernel / user space API. Do not remove. */
|
||||
|
@@ -92,12 +92,24 @@ enum thermal_trend {
|
||||
THERMAL_TREND_DROP_FULL, /* apply lowest cooling action */
|
||||
};
|
||||
|
||||
/* Thermal notification reason */
|
||||
enum thermal_notify_event {
|
||||
THERMAL_EVENT_UNSPECIFIED, /* Unspecified event */
|
||||
THERMAL_EVENT_TEMP_SAMPLE, /* New Temperature sample */
|
||||
THERMAL_TRIP_VIOLATED, /* TRIP Point violation */
|
||||
THERMAL_TRIP_CHANGED, /* TRIP Point temperature changed */
|
||||
THERMAL_DEVICE_DOWN, /* Thermal device is down */
|
||||
THERMAL_DEVICE_UP, /* Thermal device is up after a down event */
|
||||
THERMAL_DEVICE_POWER_CAPABILITY_CHANGED, /* power capability changed */
|
||||
};
|
||||
|
||||
struct thermal_zone_device_ops {
|
||||
int (*bind) (struct thermal_zone_device *,
|
||||
struct thermal_cooling_device *);
|
||||
int (*unbind) (struct thermal_zone_device *,
|
||||
struct thermal_cooling_device *);
|
||||
int (*get_temp) (struct thermal_zone_device *, int *);
|
||||
int (*set_trips) (struct thermal_zone_device *, int, int);
|
||||
int (*get_mode) (struct thermal_zone_device *,
|
||||
enum thermal_device_mode *);
|
||||
int (*set_mode) (struct thermal_zone_device *,
|
||||
@@ -168,6 +180,10 @@ struct thermal_attr {
|
||||
* @last_temperature: previous temperature read
|
||||
* @emul_temperature: emulated temperature when using CONFIG_THERMAL_EMULATION
|
||||
* @passive: 1 if you've crossed a passive trip point, 0 otherwise.
|
||||
* @prev_low_trip: the low current temperature if you've crossed a passive
|
||||
trip point.
|
||||
* @prev_high_trip: the above current temperature if you've crossed a
|
||||
passive trip point.
|
||||
* @forced_passive: If > 0, temperature at which to switch on all ACPI
|
||||
* processor cooling devices. Currently only used by the
|
||||
* step-wise governor.
|
||||
@@ -182,6 +198,7 @@ struct thermal_attr {
|
||||
* @lock: lock to protect thermal_instances list
|
||||
* @node: node in thermal_tz_list (in thermal_core.c)
|
||||
* @poll_queue: delayed work for polling
|
||||
* @notify_event: Last notification event
|
||||
*/
|
||||
struct thermal_zone_device {
|
||||
int id;
|
||||
@@ -199,6 +216,8 @@ struct thermal_zone_device {
|
||||
int last_temperature;
|
||||
int emul_temperature;
|
||||
int passive;
|
||||
int prev_low_trip;
|
||||
int prev_high_trip;
|
||||
unsigned int forced_passive;
|
||||
atomic_t need_update;
|
||||
struct thermal_zone_device_ops *ops;
|
||||
@@ -210,6 +229,7 @@ struct thermal_zone_device {
|
||||
struct mutex lock;
|
||||
struct list_head node;
|
||||
struct delayed_work poll_queue;
|
||||
enum thermal_notify_event notify_event;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -333,6 +353,9 @@ struct thermal_genl_event {
|
||||
*
|
||||
* Optional:
|
||||
* @get_trend: a pointer to a function that reads the sensor temperature trend.
|
||||
* @set_trips: a pointer to a function that sets a temperature window. When
|
||||
* this window is left the driver must inform the thermal core via
|
||||
* thermal_zone_device_update.
|
||||
* @set_emul_temp: a pointer to a function that sets sensor emulated
|
||||
* temperature.
|
||||
* @set_trip_temp: a pointer to a function that sets the trip temperature on
|
||||
@@ -340,7 +363,8 @@ struct thermal_genl_event {
|
||||
*/
|
||||
struct thermal_zone_of_device_ops {
|
||||
int (*get_temp)(void *, int *);
|
||||
int (*get_trend)(void *, long *);
|
||||
int (*get_trend)(void *, int, enum thermal_trend *);
|
||||
int (*set_trips)(void *, int, int);
|
||||
int (*set_emul_temp)(void *, int);
|
||||
int (*set_trip_temp)(void *, int, int);
|
||||
};
|
||||
@@ -425,7 +449,9 @@ int thermal_zone_bind_cooling_device(struct thermal_zone_device *, int,
|
||||
unsigned int);
|
||||
int thermal_zone_unbind_cooling_device(struct thermal_zone_device *, int,
|
||||
struct thermal_cooling_device *);
|
||||
void thermal_zone_device_update(struct thermal_zone_device *);
|
||||
void thermal_zone_device_update(struct thermal_zone_device *,
|
||||
enum thermal_notify_event);
|
||||
void thermal_zone_set_trips(struct thermal_zone_device *);
|
||||
|
||||
struct thermal_cooling_device *thermal_cooling_device_register(char *, void *,
|
||||
const struct thermal_cooling_device_ops *);
|
||||
@@ -435,6 +461,8 @@ thermal_of_cooling_device_register(struct device_node *np, char *, void *,
|
||||
void thermal_cooling_device_unregister(struct thermal_cooling_device *);
|
||||
struct thermal_zone_device *thermal_zone_get_zone_by_name(const char *name);
|
||||
int thermal_zone_get_temp(struct thermal_zone_device *tz, int *temp);
|
||||
int thermal_zone_get_slope(struct thermal_zone_device *tz);
|
||||
int thermal_zone_get_offset(struct thermal_zone_device *tz);
|
||||
|
||||
int get_tz_trend(struct thermal_zone_device *, int);
|
||||
struct thermal_instance *get_thermal_instance(struct thermal_zone_device *,
|
||||
@@ -473,7 +501,10 @@ static inline int thermal_zone_unbind_cooling_device(
|
||||
struct thermal_zone_device *tz, int trip,
|
||||
struct thermal_cooling_device *cdev)
|
||||
{ return -ENODEV; }
|
||||
static inline void thermal_zone_device_update(struct thermal_zone_device *tz)
|
||||
static inline void thermal_zone_device_update(struct thermal_zone_device *tz,
|
||||
enum thermal_notify_event event)
|
||||
{ }
|
||||
static inline void thermal_zone_set_trips(struct thermal_zone_device *tz)
|
||||
{ }
|
||||
static inline struct thermal_cooling_device *
|
||||
thermal_cooling_device_register(char *type, void *devdata,
|
||||
@@ -492,6 +523,12 @@ static inline struct thermal_zone_device *thermal_zone_get_zone_by_name(
|
||||
static inline int thermal_zone_get_temp(
|
||||
struct thermal_zone_device *tz, int *temp)
|
||||
{ return -ENODEV; }
|
||||
static inline int thermal_zone_get_slope(
|
||||
struct thermal_zone_device *tz)
|
||||
{ return -ENODEV; }
|
||||
static inline int thermal_zone_get_offset(
|
||||
struct thermal_zone_device *tz)
|
||||
{ return -ENODEV; }
|
||||
static inline int get_tz_trend(struct thermal_zone_device *tz, int trip)
|
||||
{ return -ENODEV; }
|
||||
static inline struct thermal_instance *
|
||||
|
@@ -19,6 +19,7 @@
|
||||
struct watchdog_ops;
|
||||
struct watchdog_device;
|
||||
struct watchdog_core_data;
|
||||
struct watchdog_governor;
|
||||
|
||||
/** struct watchdog_ops - The watchdog-devices operations
|
||||
*
|
||||
@@ -28,6 +29,7 @@ struct watchdog_core_data;
|
||||
* @ping: The routine that sends a keepalive ping to the watchdog device.
|
||||
* @status: The routine that shows the status of the watchdog device.
|
||||
* @set_timeout:The routine for setting the watchdog devices timeout value (in seconds).
|
||||
* @set_pretimeout:The routine for setting the watchdog devices pretimeout.
|
||||
* @get_timeleft:The routine that gets the time left before a reset (in seconds).
|
||||
* @restart: The routine for restarting the machine.
|
||||
* @ioctl: The routines that handles extra ioctl calls.
|
||||
@@ -46,6 +48,7 @@ struct watchdog_ops {
|
||||
int (*ping)(struct watchdog_device *);
|
||||
unsigned int (*status)(struct watchdog_device *);
|
||||
int (*set_timeout)(struct watchdog_device *, unsigned int);
|
||||
int (*set_pretimeout)(struct watchdog_device *, unsigned int);
|
||||
unsigned int (*get_timeleft)(struct watchdog_device *);
|
||||
int (*restart)(struct watchdog_device *, unsigned long, void *);
|
||||
long (*ioctl)(struct watchdog_device *, unsigned int, unsigned long);
|
||||
@@ -59,8 +62,10 @@ struct watchdog_ops {
|
||||
* watchdog device.
|
||||
* @info: Pointer to a watchdog_info structure.
|
||||
* @ops: Pointer to the list of watchdog operations.
|
||||
* @gov: Pointer to watchdog pretimeout governor.
|
||||
* @bootstatus: Status of the watchdog device at boot.
|
||||
* @timeout: The watchdog devices timeout value (in seconds).
|
||||
* @pretimeout: The watchdog devices pre_timeout value.
|
||||
* @min_timeout:The watchdog devices minimum timeout value (in seconds).
|
||||
* @max_timeout:The watchdog devices maximum timeout value (in seconds)
|
||||
* as configurable from user space. Only relevant if
|
||||
@@ -94,8 +99,10 @@ struct watchdog_device {
|
||||
const struct attribute_group **groups;
|
||||
const struct watchdog_info *info;
|
||||
const struct watchdog_ops *ops;
|
||||
const struct watchdog_governor *gov;
|
||||
unsigned int bootstatus;
|
||||
unsigned int timeout;
|
||||
unsigned int pretimeout;
|
||||
unsigned int min_timeout;
|
||||
unsigned int max_timeout;
|
||||
unsigned int min_hw_heartbeat_ms;
|
||||
@@ -163,6 +170,13 @@ static inline bool watchdog_timeout_invalid(struct watchdog_device *wdd, unsigne
|
||||
t > wdd->max_timeout);
|
||||
}
|
||||
|
||||
/* Use the following function to check if a pretimeout value is invalid */
|
||||
static inline bool watchdog_pretimeout_invalid(struct watchdog_device *wdd,
|
||||
unsigned int t)
|
||||
{
|
||||
return t && wdd->timeout && t >= wdd->timeout;
|
||||
}
|
||||
|
||||
/* Use the following functions to manipulate watchdog driver specific data */
|
||||
static inline void watchdog_set_drvdata(struct watchdog_device *wdd, void *data)
|
||||
{
|
||||
@@ -174,6 +188,16 @@ static inline void *watchdog_get_drvdata(struct watchdog_device *wdd)
|
||||
return wdd->driver_data;
|
||||
}
|
||||
|
||||
/* Use the following functions to report watchdog pretimeout event */
|
||||
#if IS_ENABLED(CONFIG_WATCHDOG_PRETIMEOUT_GOV)
|
||||
void watchdog_notify_pretimeout(struct watchdog_device *wdd);
|
||||
#else
|
||||
static inline void watchdog_notify_pretimeout(struct watchdog_device *wdd)
|
||||
{
|
||||
pr_alert("watchdog%d: pretimeout event\n", wdd->id);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* drivers/watchdog/watchdog_core.c */
|
||||
void watchdog_set_restart_priority(struct watchdog_device *wdd, int priority);
|
||||
extern int watchdog_init_timeout(struct watchdog_device *wdd,
|
||||
|
Reference in New Issue
Block a user