KVM: s390: Fix for 5.7 and maintainer update
- Silence false positive lockdep warning - add Claudio as reviewer -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJenY6AAAoJEBF7vIC1phx8bykQAK+QZyD+H/zGNuqeUVn0sh8e yKUVMR+kuE+l57q77nt2AYVxqpCD9xSKRR+SOSLzhVH/HJf625nm+Ny/WOWMebwJ EA/KK+v15T5rga8gFza+4cPg4v/pHwjHhSbjTb1JWg+8cJR1BTj6OxRuTtWr5+25 GF4RhkJOit/VhNbCo1aIgs7/7F1pPALstdPAUsHYe1PeULdRMVqSVluXT2KTPhpi /kzDw8sKKcYgv/eaVdcNoHv+VX1AWIRDAKEttCywyocfbu0ESwadmR7C0qlm1446 HqowP6F0xCF0Whi/65aN4ZOv7wjO/qrV08DZ7JLA3/oKlXtZ1ieyiE2q/P1frSo1 gvmuHiH5/UI6t6a/BSCpJwqcilxKYArqAAYBKoGiJhTbsJStqw0wl41klWTKXlTq VrCvjoUxQ9JMjFCQ1GXOU+ODNyX2IwZYptJ5vF24HYzBJwUBe3HPG9/BA8YcodzG qGQ5IKv0Q1IFTwOqnt557H0MjcBtNIEx54aLJrPy3wldsiNSj39Ft0cuvnbR+Q4F QhKk88dHtd7NW1IirfgYmLGe0rB1ANKM7wUGEdM5w2y5Eg8wCs8/P4KeGh0YyFI9 xPqZDfwof6KkDjOGFXr/CeD/thi+km0/FpePb7cL5Ow4a+JmrCvqQiXrf0TbnFpv t5ZlHnGzoSHsEaRgmJ+X =d46L -----END PGP SIGNATURE----- Merge tag 'kvm-s390-master-5.7-2' of git://git.kernel.org/pub/scm/linux/kernel/git/kvms390/linux into kvm-master KVM: s390: Fix for 5.7 and maintainer update - Silence false positive lockdep warning - add Claudio as reviewer
This commit is contained in:
commit
3bda03865f
4691 changed files with 184496 additions and 69619 deletions
|
|
@ -416,9 +416,30 @@ extern void acpi_osi_setup(char *str);
|
|||
extern bool acpi_osi_is_win8(void);
|
||||
|
||||
#ifdef CONFIG_ACPI_NUMA
|
||||
int acpi_map_pxm_to_online_node(int pxm);
|
||||
int acpi_map_pxm_to_node(int pxm);
|
||||
int acpi_get_node(acpi_handle handle);
|
||||
|
||||
/**
|
||||
* acpi_map_pxm_to_online_node - Map proximity ID to online node
|
||||
* @pxm: ACPI proximity ID
|
||||
*
|
||||
* This is similar to acpi_map_pxm_to_node(), but always returns an online
|
||||
* node. When the mapped node from a given proximity ID is offline, it
|
||||
* looks up the node distance table and returns the nearest online node.
|
||||
*
|
||||
* ACPI device drivers, which are called after the NUMA initialization has
|
||||
* completed in the kernel, can call this interface to obtain their device
|
||||
* NUMA topology from ACPI tables. Such drivers do not have to deal with
|
||||
* offline nodes. A node may be offline when a device proximity ID is
|
||||
* unique, SRAT memory entry does not exist, or NUMA is disabled, ex.
|
||||
* "numa=off" on x86.
|
||||
*/
|
||||
static inline int acpi_map_pxm_to_online_node(int pxm)
|
||||
{
|
||||
int node = acpi_map_pxm_to_node(pxm);
|
||||
|
||||
return numa_map_to_online_node(node);
|
||||
}
|
||||
#else
|
||||
static inline int acpi_map_pxm_to_online_node(int pxm)
|
||||
{
|
||||
|
|
@ -488,6 +509,11 @@ void __init acpi_nvs_nosave_s3(void);
|
|||
void __init acpi_sleep_no_blacklist(void);
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
int acpi_register_wakeup_handler(
|
||||
int wake_irq, bool (*wakeup)(void *context), void *context);
|
||||
void acpi_unregister_wakeup_handler(
|
||||
bool (*wakeup)(void *context), void *context);
|
||||
|
||||
struct acpi_osc_context {
|
||||
char *uuid_str; /* UUID string */
|
||||
int rev;
|
||||
|
|
@ -530,8 +556,9 @@ extern bool osc_pc_lpi_support_confirmed;
|
|||
#define OSC_PCI_CLOCK_PM_SUPPORT 0x00000004
|
||||
#define OSC_PCI_SEGMENT_GROUPS_SUPPORT 0x00000008
|
||||
#define OSC_PCI_MSI_SUPPORT 0x00000010
|
||||
#define OSC_PCI_EDR_SUPPORT 0x00000080
|
||||
#define OSC_PCI_HPX_TYPE_3_SUPPORT 0x00000100
|
||||
#define OSC_PCI_SUPPORT_MASKS 0x0000011f
|
||||
#define OSC_PCI_SUPPORT_MASKS 0x0000019f
|
||||
|
||||
/* PCI Host Bridge _OSC: Capabilities DWORD 3: Control Field */
|
||||
#define OSC_PCI_EXPRESS_NATIVE_HP_CONTROL 0x00000001
|
||||
|
|
@ -540,7 +567,8 @@ extern bool osc_pc_lpi_support_confirmed;
|
|||
#define OSC_PCI_EXPRESS_AER_CONTROL 0x00000008
|
||||
#define OSC_PCI_EXPRESS_CAPABILITY_CONTROL 0x00000010
|
||||
#define OSC_PCI_EXPRESS_LTR_CONTROL 0x00000020
|
||||
#define OSC_PCI_CONTROL_MASKS 0x0000003f
|
||||
#define OSC_PCI_EXPRESS_DPC_CONTROL 0x00000080
|
||||
#define OSC_PCI_CONTROL_MASKS 0x000000bf
|
||||
|
||||
#define ACPI_GSB_ACCESS_ATTRIB_QUICK 0x00000002
|
||||
#define ACPI_GSB_ACCESS_ATTRIB_SEND_RCV 0x00000004
|
||||
|
|
|
|||
|
|
@ -44,8 +44,7 @@ struct aer_capability_regs {
|
|||
/* PCIe port driver needs this function to enable AER */
|
||||
int pci_enable_pcie_error_reporting(struct pci_dev *dev);
|
||||
int pci_disable_pcie_error_reporting(struct pci_dev *dev);
|
||||
int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev);
|
||||
int pci_cleanup_aer_error_status_regs(struct pci_dev *dev);
|
||||
int pci_aer_clear_nonfatal_status(struct pci_dev *dev);
|
||||
void pci_save_aer_state(struct pci_dev *dev);
|
||||
void pci_restore_aer_state(struct pci_dev *dev);
|
||||
#else
|
||||
|
|
@ -57,11 +56,7 @@ static inline int pci_disable_pcie_error_reporting(struct pci_dev *dev)
|
|||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int pci_cleanup_aer_uncorrect_error_status(struct pci_dev *dev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
static inline int pci_cleanup_aer_error_status_regs(struct pci_dev *dev)
|
||||
static inline int pci_aer_clear_nonfatal_status(struct pci_dev *dev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -319,7 +319,7 @@ struct bio_integrity_payload {
|
|||
struct work_struct bip_work; /* I/O completion */
|
||||
|
||||
struct bio_vec *bip_vec;
|
||||
struct bio_vec bip_inline_vecs[0];/* embedded bvec array */
|
||||
struct bio_vec bip_inline_vecs[];/* embedded bvec array */
|
||||
};
|
||||
|
||||
#if defined(CONFIG_BLK_DEV_INTEGRITY)
|
||||
|
|
|
|||
|
|
@ -50,7 +50,13 @@
|
|||
* bitmap_set(dst, pos, nbits) Set specified bit area
|
||||
* bitmap_clear(dst, pos, nbits) Clear specified bit area
|
||||
* bitmap_find_next_zero_area(buf, len, pos, n, mask) Find bit free area
|
||||
* bitmap_find_next_zero_area_off(buf, len, pos, n, mask) as above
|
||||
* bitmap_find_next_zero_area_off(buf, len, pos, n, mask, mask_off) as above
|
||||
* bitmap_next_clear_region(map, &start, &end, nbits) Find next clear region
|
||||
* bitmap_next_set_region(map, &start, &end, nbits) Find next set region
|
||||
* bitmap_for_each_clear_region(map, rs, re, start, end)
|
||||
* Iterate over all clear regions
|
||||
* bitmap_for_each_set_region(map, rs, re, start, end)
|
||||
* Iterate over all set regions
|
||||
* bitmap_shift_right(dst, src, n, nbits) *dst = *src >> n
|
||||
* bitmap_shift_left(dst, src, n, nbits) *dst = *src << n
|
||||
* bitmap_cut(dst, src, first, n, nbits) Cut n bits from first, copy rest
|
||||
|
|
|
|||
|
|
@ -162,7 +162,7 @@ static inline __u8 ror8(__u8 word, unsigned int shift)
|
|||
*
|
||||
* This is safe to use for 16- and 8-bit types as well.
|
||||
*/
|
||||
static inline __s32 sign_extend32(__u32 value, int index)
|
||||
static __always_inline __s32 sign_extend32(__u32 value, int index)
|
||||
{
|
||||
__u8 shift = 31 - index;
|
||||
return (__s32)(value << shift) >> shift;
|
||||
|
|
@ -173,7 +173,7 @@ static inline __s32 sign_extend32(__u32 value, int index)
|
|||
* @value: value to sign extend
|
||||
* @index: 0 based bit index (0<=index<64) to sign bit
|
||||
*/
|
||||
static inline __s64 sign_extend64(__u64 value, int index)
|
||||
static __always_inline __s64 sign_extend64(__u64 value, int index)
|
||||
{
|
||||
__u8 shift = 63 - index;
|
||||
return (__s64)(value << shift) >> shift;
|
||||
|
|
|
|||
|
|
@ -18,12 +18,30 @@
|
|||
* position @h. For example
|
||||
* GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
|
||||
*/
|
||||
#define GENMASK(h, l) \
|
||||
#if !defined(__ASSEMBLY__) && \
|
||||
(!defined(CONFIG_CC_IS_GCC) || CONFIG_GCC_VERSION >= 49000)
|
||||
#include <linux/build_bug.h>
|
||||
#define GENMASK_INPUT_CHECK(h, l) \
|
||||
(BUILD_BUG_ON_ZERO(__builtin_choose_expr( \
|
||||
__builtin_constant_p((l) > (h)), (l) > (h), 0)))
|
||||
#else
|
||||
/*
|
||||
* BUILD_BUG_ON_ZERO is not available in h files included from asm files,
|
||||
* disable the input check if that is the case.
|
||||
*/
|
||||
#define GENMASK_INPUT_CHECK(h, l) 0
|
||||
#endif
|
||||
|
||||
#define __GENMASK(h, l) \
|
||||
(((~UL(0)) - (UL(1) << (l)) + 1) & \
|
||||
(~UL(0) >> (BITS_PER_LONG - 1 - (h))))
|
||||
#define GENMASK(h, l) \
|
||||
(GENMASK_INPUT_CHECK(h, l) + __GENMASK(h, l))
|
||||
|
||||
#define GENMASK_ULL(h, l) \
|
||||
#define __GENMASK_ULL(h, l) \
|
||||
(((~ULL(0)) - (ULL(1) << (l)) + 1) & \
|
||||
(~ULL(0) >> (BITS_PER_LONG_LONG - 1 - (h))))
|
||||
#define GENMASK_ULL(h, l) \
|
||||
(GENMASK_INPUT_CHECK(h, l) + __GENMASK_ULL(h, l))
|
||||
|
||||
#endif /* __LINUX_BITS_H */
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ struct blkcg_gq;
|
|||
struct blkcg {
|
||||
struct cgroup_subsys_state css;
|
||||
spinlock_t lock;
|
||||
refcount_t online_pin;
|
||||
|
||||
struct radix_tree_root blkg_tree;
|
||||
struct blkcg_gq __rcu *blkg_hint;
|
||||
|
|
@ -56,7 +57,6 @@ struct blkcg {
|
|||
struct list_head all_blkcgs_node;
|
||||
#ifdef CONFIG_CGROUP_WRITEBACK
|
||||
struct list_head cgwb_list;
|
||||
refcount_t cgwb_refcnt;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -412,47 +412,38 @@ static inline struct blkcg *cpd_to_blkcg(struct blkcg_policy_data *cpd)
|
|||
|
||||
extern void blkcg_destroy_blkgs(struct blkcg *blkcg);
|
||||
|
||||
#ifdef CONFIG_CGROUP_WRITEBACK
|
||||
|
||||
/**
|
||||
* blkcg_cgwb_get - get a reference for blkcg->cgwb_list
|
||||
* blkcg_pin_online - pin online state
|
||||
* @blkcg: blkcg of interest
|
||||
*
|
||||
* This is used to track the number of active wb's related to a blkcg.
|
||||
* While pinned, a blkcg is kept online. This is primarily used to
|
||||
* impedance-match blkg and cgwb lifetimes so that blkg doesn't go offline
|
||||
* while an associated cgwb is still active.
|
||||
*/
|
||||
static inline void blkcg_cgwb_get(struct blkcg *blkcg)
|
||||
static inline void blkcg_pin_online(struct blkcg *blkcg)
|
||||
{
|
||||
refcount_inc(&blkcg->cgwb_refcnt);
|
||||
refcount_inc(&blkcg->online_pin);
|
||||
}
|
||||
|
||||
/**
|
||||
* blkcg_cgwb_put - put a reference for @blkcg->cgwb_list
|
||||
* blkcg_unpin_online - unpin online state
|
||||
* @blkcg: blkcg of interest
|
||||
*
|
||||
* This is used to track the number of active wb's related to a blkcg.
|
||||
* When this count goes to zero, all active wb has finished so the
|
||||
* This is primarily used to impedance-match blkg and cgwb lifetimes so
|
||||
* that blkg doesn't go offline while an associated cgwb is still active.
|
||||
* When this count goes to zero, all active cgwbs have finished so the
|
||||
* blkcg can continue destruction by calling blkcg_destroy_blkgs().
|
||||
* This work may occur in cgwb_release_workfn() on the cgwb_release
|
||||
* workqueue.
|
||||
*/
|
||||
static inline void blkcg_cgwb_put(struct blkcg *blkcg)
|
||||
static inline void blkcg_unpin_online(struct blkcg *blkcg)
|
||||
{
|
||||
if (refcount_dec_and_test(&blkcg->cgwb_refcnt))
|
||||
do {
|
||||
if (!refcount_dec_and_test(&blkcg->online_pin))
|
||||
break;
|
||||
blkcg_destroy_blkgs(blkcg);
|
||||
blkcg = blkcg_parent(blkcg);
|
||||
} while (blkcg);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void blkcg_cgwb_get(struct blkcg *blkcg) { }
|
||||
|
||||
static inline void blkcg_cgwb_put(struct blkcg *blkcg)
|
||||
{
|
||||
/* wb isn't being accounted, so trigger destruction right away */
|
||||
blkcg_destroy_blkgs(blkcg);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/**
|
||||
* blkg_path - format cgroup path of blkg
|
||||
* @blkg: blkg of interest
|
||||
|
|
|
|||
|
|
@ -173,7 +173,7 @@ struct blk_mq_hw_ctx {
|
|||
* blocking (BLK_MQ_F_BLOCKING). Must be the last member - see also
|
||||
* blk_mq_hw_ctx_size().
|
||||
*/
|
||||
struct srcu_struct srcu[0];
|
||||
struct srcu_struct srcu[];
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ struct bio {
|
|||
* double allocations for a small number of bio_vecs. This member
|
||||
* MUST obviously be kept at the very end of the bio.
|
||||
*/
|
||||
struct bio_vec bi_inline_vecs[0];
|
||||
struct bio_vec bi_inline_vecs[];
|
||||
};
|
||||
|
||||
#define BIO_RESET_BYTES offsetof(struct bio, bi_max_vecs)
|
||||
|
|
|
|||
|
|
@ -216,7 +216,8 @@ static inline int __init xbc_node_compose_key(struct xbc_node *node,
|
|||
}
|
||||
|
||||
/* XBC node initializer */
|
||||
int __init xbc_init(char *buf);
|
||||
int __init xbc_init(char *buf, const char **emsg, int *epos);
|
||||
|
||||
|
||||
/* XBC cleanup data structures */
|
||||
void __init xbc_destroy_all(void);
|
||||
|
|
|
|||
|
|
@ -189,6 +189,8 @@ struct buffer_head *__getblk_gfp(struct block_device *bdev, sector_t block,
|
|||
void __brelse(struct buffer_head *);
|
||||
void __bforget(struct buffer_head *);
|
||||
void __breadahead(struct block_device *, sector_t block, unsigned int size);
|
||||
void __breadahead_gfp(struct block_device *, sector_t block, unsigned int size,
|
||||
gfp_t gfp);
|
||||
struct buffer_head *__bread_gfp(struct block_device *,
|
||||
sector_t block, unsigned size, gfp_t gfp);
|
||||
void invalidate_bh_lrus(void);
|
||||
|
|
@ -319,6 +321,12 @@ sb_breadahead(struct super_block *sb, sector_t block)
|
|||
__breadahead(sb->s_bdev, block, sb->s_blocksize);
|
||||
}
|
||||
|
||||
static inline void
|
||||
sb_breadahead_unmovable(struct super_block *sb, sector_t block)
|
||||
{
|
||||
__breadahead_gfp(sb->s_bdev, block, sb->s_blocksize, 0);
|
||||
}
|
||||
|
||||
static inline struct buffer_head *
|
||||
sb_getblk(struct super_block *sb, sector_t block)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -189,7 +189,7 @@ struct __packed pucan_rx_msg {
|
|||
u8 client;
|
||||
__le16 flags;
|
||||
__le32 can_id;
|
||||
u8 d[0];
|
||||
u8 d[];
|
||||
};
|
||||
|
||||
/* uCAN error types */
|
||||
|
|
@ -266,7 +266,7 @@ struct __packed pucan_tx_msg {
|
|||
u8 client;
|
||||
__le16 flags;
|
||||
__le32 can_id;
|
||||
u8 d[0];
|
||||
u8 d[];
|
||||
};
|
||||
|
||||
/* build the cmd opcode_channel field with respect to the correct endianness */
|
||||
|
|
|
|||
|
|
@ -444,8 +444,9 @@ union ceph_mds_request_args {
|
|||
} __attribute__ ((packed)) lookupino;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */
|
||||
#define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */
|
||||
#define CEPH_MDS_FLAG_REPLAY 1 /* this is a replayed op */
|
||||
#define CEPH_MDS_FLAG_WANT_DENTRY 2 /* want dentry in reply */
|
||||
#define CEPH_MDS_FLAG_ASYNC 4 /* request is asynchronous */
|
||||
|
||||
struct ceph_mds_request_head {
|
||||
__le64 oldest_client_tid;
|
||||
|
|
@ -530,6 +531,9 @@ struct ceph_mds_reply_lease {
|
|||
__le32 seq;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
#define CEPH_LEASE_VALID (1 | 2) /* old and new bit values */
|
||||
#define CEPH_LEASE_PRIMARY_LINK 4 /* primary linkage */
|
||||
|
||||
struct ceph_mds_reply_dirfrag {
|
||||
__le32 frag; /* fragment */
|
||||
__le32 auth; /* auth mds, if this is a delegation point */
|
||||
|
|
@ -564,6 +568,7 @@ struct ceph_filelock {
|
|||
#define CEPH_FILE_MODE_RDWR 3 /* RD | WR */
|
||||
#define CEPH_FILE_MODE_LAZY 4 /* lazy io */
|
||||
#define CEPH_FILE_MODE_BITS 4
|
||||
#define CEPH_FILE_MODE_MASK ((1 << CEPH_FILE_MODE_BITS) - 1)
|
||||
|
||||
int ceph_flags_to_mode(int flags);
|
||||
|
||||
|
|
@ -655,10 +660,19 @@ int ceph_flags_to_mode(int flags);
|
|||
#define CEPH_CAP_ANY (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \
|
||||
CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \
|
||||
CEPH_CAP_PIN)
|
||||
#define CEPH_CAP_ALL_FILE (CEPH_CAP_PIN | CEPH_CAP_ANY_SHARED | \
|
||||
CEPH_CAP_AUTH_EXCL | CEPH_CAP_XATTR_EXCL | \
|
||||
CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)
|
||||
|
||||
#define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \
|
||||
CEPH_LOCK_IXATTR)
|
||||
|
||||
/* cap masks async dir operations */
|
||||
#define CEPH_CAP_DIR_CREATE CEPH_CAP_FILE_CACHE
|
||||
#define CEPH_CAP_DIR_UNLINK CEPH_CAP_FILE_RD
|
||||
#define CEPH_CAP_ANY_DIR_OPS (CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_RD | \
|
||||
CEPH_CAP_FILE_WREXTEND | CEPH_CAP_FILE_LAZYIO)
|
||||
|
||||
int ceph_caps_for_mode(int mode);
|
||||
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -2,22 +2,8 @@
|
|||
#ifndef _FS_CEPH_DEBUGFS_H
|
||||
#define _FS_CEPH_DEBUGFS_H
|
||||
|
||||
#include <linux/ceph/ceph_debug.h>
|
||||
#include <linux/ceph/types.h>
|
||||
|
||||
#define CEPH_DEFINE_SHOW_FUNC(name) \
|
||||
static int name##_open(struct inode *inode, struct file *file) \
|
||||
{ \
|
||||
return single_open(file, name, inode->i_private); \
|
||||
} \
|
||||
\
|
||||
static const struct file_operations name##_fops = { \
|
||||
.open = name##_open, \
|
||||
.read = seq_read, \
|
||||
.llseek = seq_lseek, \
|
||||
.release = single_release, \
|
||||
};
|
||||
|
||||
/* debugfs.c */
|
||||
extern void ceph_debugfs_init(void);
|
||||
extern void ceph_debugfs_cleanup(void);
|
||||
|
|
|
|||
|
|
@ -272,6 +272,7 @@ extern struct kmem_cache *ceph_cap_flush_cachep;
|
|||
extern struct kmem_cache *ceph_dentry_cachep;
|
||||
extern struct kmem_cache *ceph_file_cachep;
|
||||
extern struct kmem_cache *ceph_dir_file_cachep;
|
||||
extern struct kmem_cache *ceph_mds_request_cachep;
|
||||
|
||||
/* ceph_common.c */
|
||||
extern bool libceph_compatible(void *data);
|
||||
|
|
|
|||
|
|
@ -509,23 +509,6 @@ int ceph_osdc_call(struct ceph_osd_client *osdc,
|
|||
struct page *req_page, size_t req_len,
|
||||
struct page **resp_pages, size_t *resp_len);
|
||||
|
||||
extern int ceph_osdc_readpages(struct ceph_osd_client *osdc,
|
||||
struct ceph_vino vino,
|
||||
struct ceph_file_layout *layout,
|
||||
u64 off, u64 *plen,
|
||||
u32 truncate_seq, u64 truncate_size,
|
||||
struct page **pages, int nr_pages,
|
||||
int page_align);
|
||||
|
||||
extern int ceph_osdc_writepages(struct ceph_osd_client *osdc,
|
||||
struct ceph_vino vino,
|
||||
struct ceph_file_layout *layout,
|
||||
struct ceph_snap_context *sc,
|
||||
u64 off, u64 len,
|
||||
u32 truncate_seq, u64 truncate_size,
|
||||
struct timespec64 *mtime,
|
||||
struct page **pages, int nr_pages);
|
||||
|
||||
int ceph_osdc_copy_from(struct ceph_osd_client *osdc,
|
||||
u64 src_snapid, u64 src_version,
|
||||
struct ceph_object_id *src_oid,
|
||||
|
|
|
|||
|
|
@ -633,8 +633,9 @@ struct cgroup_subsys {
|
|||
void (*cancel_attach)(struct cgroup_taskset *tset);
|
||||
void (*attach)(struct cgroup_taskset *tset);
|
||||
void (*post_attach)(void);
|
||||
int (*can_fork)(struct task_struct *task);
|
||||
void (*cancel_fork)(struct task_struct *task);
|
||||
int (*can_fork)(struct task_struct *task,
|
||||
struct css_set *cset);
|
||||
void (*cancel_fork)(struct task_struct *task, struct css_set *cset);
|
||||
void (*fork)(struct task_struct *task);
|
||||
void (*exit)(struct task_struct *task);
|
||||
void (*release)(struct task_struct *task);
|
||||
|
|
|
|||
|
|
@ -27,6 +27,8 @@
|
|||
|
||||
#include <linux/cgroup-defs.h>
|
||||
|
||||
struct kernel_clone_args;
|
||||
|
||||
#ifdef CONFIG_CGROUPS
|
||||
|
||||
/*
|
||||
|
|
@ -58,9 +60,6 @@ struct css_task_iter {
|
|||
struct list_head *tcset_head;
|
||||
|
||||
struct list_head *task_pos;
|
||||
struct list_head *tasks_head;
|
||||
struct list_head *mg_tasks_head;
|
||||
struct list_head *dying_tasks_head;
|
||||
|
||||
struct list_head *cur_tasks_head;
|
||||
struct css_set *cur_cset;
|
||||
|
|
@ -122,9 +121,12 @@ int proc_cgroup_show(struct seq_file *m, struct pid_namespace *ns,
|
|||
struct pid *pid, struct task_struct *tsk);
|
||||
|
||||
void cgroup_fork(struct task_struct *p);
|
||||
extern int cgroup_can_fork(struct task_struct *p);
|
||||
extern void cgroup_cancel_fork(struct task_struct *p);
|
||||
extern void cgroup_post_fork(struct task_struct *p);
|
||||
extern int cgroup_can_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs);
|
||||
extern void cgroup_cancel_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs);
|
||||
extern void cgroup_post_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs);
|
||||
void cgroup_exit(struct task_struct *p);
|
||||
void cgroup_release(struct task_struct *p);
|
||||
void cgroup_free(struct task_struct *p);
|
||||
|
|
@ -708,9 +710,12 @@ static inline int cgroupstats_build(struct cgroupstats *stats,
|
|||
struct dentry *dentry) { return -EINVAL; }
|
||||
|
||||
static inline void cgroup_fork(struct task_struct *p) {}
|
||||
static inline int cgroup_can_fork(struct task_struct *p) { return 0; }
|
||||
static inline void cgroup_cancel_fork(struct task_struct *p) {}
|
||||
static inline void cgroup_post_fork(struct task_struct *p) {}
|
||||
static inline int cgroup_can_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs) { return 0; }
|
||||
static inline void cgroup_cancel_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs) {}
|
||||
static inline void cgroup_post_fork(struct task_struct *p,
|
||||
struct kernel_clone_args *kargs) {}
|
||||
static inline void cgroup_exit(struct task_struct *p) {}
|
||||
static inline void cgroup_release(struct task_struct *p) {}
|
||||
static inline void cgroup_free(struct task_struct *p) {}
|
||||
|
|
|
|||
|
|
@ -12,6 +12,9 @@
|
|||
#ifndef AT91_PMC_H
|
||||
#define AT91_PMC_H
|
||||
|
||||
#define AT91_PMC_V1 (1) /* PMC version 1 */
|
||||
#define AT91_PMC_V2 (2) /* PMC version 2 [SAM9X60] */
|
||||
|
||||
#define AT91_PMC_SCER 0x00 /* System Clock Enable Register */
|
||||
#define AT91_PMC_SCDR 0x04 /* System Clock Disable Register */
|
||||
|
||||
|
|
@ -30,16 +33,34 @@
|
|||
#define AT91_PMC_HCK0 (1 << 16) /* AHB Clock (USB host) [AT91SAM9261 only] */
|
||||
#define AT91_PMC_HCK1 (1 << 17) /* AHB Clock (LCD) [AT91SAM9261 only] */
|
||||
|
||||
#define AT91_PMC_PLL_CTRL0 0x0C /* PLL Control Register 0 [for SAM9X60] */
|
||||
#define AT91_PMC_PLL_CTRL0_ENPLL (1 << 28) /* Enable PLL */
|
||||
#define AT91_PMC_PLL_CTRL0_ENPLLCK (1 << 29) /* Enable PLL clock for PMC */
|
||||
#define AT91_PMC_PLL_CTRL0_ENLOCK (1 << 31) /* Enable PLL lock */
|
||||
|
||||
#define AT91_PMC_PLL_CTRL1 0x10 /* PLL Control Register 1 [for SAM9X60] */
|
||||
|
||||
#define AT91_PMC_PCER 0x10 /* Peripheral Clock Enable Register */
|
||||
#define AT91_PMC_PCDR 0x14 /* Peripheral Clock Disable Register */
|
||||
#define AT91_PMC_PCSR 0x18 /* Peripheral Clock Status Register */
|
||||
|
||||
#define AT91_PMC_PLL_ACR 0x18 /* PLL Analog Control Register [for SAM9X60] */
|
||||
#define AT91_PMC_PLL_ACR_DEFAULT_UPLL 0x12020010UL /* Default PLL ACR value for UPLL */
|
||||
#define AT91_PMC_PLL_ACR_DEFAULT_PLLA 0x00020010UL /* Default PLL ACR value for PLLA */
|
||||
#define AT91_PMC_PLL_ACR_UTMIVR (1 << 12) /* UPLL Voltage regulator Control */
|
||||
#define AT91_PMC_PLL_ACR_UTMIBG (1 << 13) /* UPLL Bandgap Control */
|
||||
|
||||
#define AT91_CKGR_UCKR 0x1C /* UTMI Clock Register [some SAM9] */
|
||||
#define AT91_PMC_UPLLEN (1 << 16) /* UTMI PLL Enable */
|
||||
#define AT91_PMC_UPLLCOUNT (0xf << 20) /* UTMI PLL Start-up Time */
|
||||
#define AT91_PMC_BIASEN (1 << 24) /* UTMI BIAS Enable */
|
||||
#define AT91_PMC_BIASCOUNT (0xf << 28) /* UTMI BIAS Start-up Time */
|
||||
|
||||
#define AT91_PMC_PLL_UPDT 0x1C /* PMC PLL update register [for SAM9X60] */
|
||||
#define AT91_PMC_PLL_UPDT_UPDATE (1 << 8) /* Update PLL settings */
|
||||
#define AT91_PMC_PLL_UPDT_ID (1 << 0) /* PLL ID */
|
||||
#define AT91_PMC_PLL_UPDT_STUPTIM (0xff << 16) /* Startup time */
|
||||
|
||||
#define AT91_CKGR_MOR 0x20 /* Main Oscillator Register [not on SAM9RL] */
|
||||
#define AT91_PMC_MOSCEN (1 << 0) /* Main Oscillator Enable */
|
||||
#define AT91_PMC_OSCBYPASS (1 << 1) /* Oscillator Bypass */
|
||||
|
|
@ -180,6 +201,8 @@
|
|||
#define AT91_PMC_WPVS (0x1 << 0) /* Write Protect Violation Status */
|
||||
#define AT91_PMC_WPVSRC (0xffff << 8) /* Write Protect Violation Source */
|
||||
|
||||
#define AT91_PMC_PLL_ISR0 0xEC /* PLL Interrupt Status Register 0 [SAM9X60 only] */
|
||||
|
||||
#define AT91_PMC_PCER1 0x100 /* Peripheral Clock Enable Register 1 [SAMA5 only]*/
|
||||
#define AT91_PMC_PCDR1 0x104 /* Peripheral Clock Enable Register 1 */
|
||||
#define AT91_PMC_PCSR1 0x108 /* Peripheral Clock Enable Register 1 */
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/numa.h>
|
||||
|
||||
/*
|
||||
* There is always at least global CMA area and a few optional
|
||||
|
|
@ -24,10 +25,19 @@ extern phys_addr_t cma_get_base(const struct cma *cma);
|
|||
extern unsigned long cma_get_size(const struct cma *cma);
|
||||
extern const char *cma_get_name(const struct cma *cma);
|
||||
|
||||
extern int __init cma_declare_contiguous(phys_addr_t base,
|
||||
extern int __init cma_declare_contiguous_nid(phys_addr_t base,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, const char *name, struct cma **res_cma);
|
||||
bool fixed, const char *name, struct cma **res_cma,
|
||||
int nid);
|
||||
static inline int __init cma_declare_contiguous(phys_addr_t base,
|
||||
phys_addr_t size, phys_addr_t limit,
|
||||
phys_addr_t alignment, unsigned int order_per_bit,
|
||||
bool fixed, const char *name, struct cma **res_cma)
|
||||
{
|
||||
return cma_declare_contiguous_nid(base, size, limit, alignment,
|
||||
order_per_bit, fixed, name, res_cma, NUMA_NO_NODE);
|
||||
}
|
||||
extern int cma_init_reserved_mem(phys_addr_t base, phys_addr_t size,
|
||||
unsigned int order_per_bit,
|
||||
const char *name,
|
||||
|
|
|
|||
|
|
@ -347,7 +347,7 @@ static inline void *offset_to_ptr(const int *off)
|
|||
* compiler has support to do so.
|
||||
*/
|
||||
#define compiletime_assert(condition, msg) \
|
||||
_compiletime_assert(condition, msg, __compiletime_assert_, __LINE__)
|
||||
_compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
|
||||
|
||||
#define compiletime_assert_atomic_type(t) \
|
||||
compiletime_assert(__native_word(t), \
|
||||
|
|
|
|||
|
|
@ -129,22 +129,13 @@ struct ftrace_likely_data {
|
|||
#define __compiler_offsetof(a, b) __builtin_offsetof(a, b)
|
||||
|
||||
/*
|
||||
* Force always-inline if the user requests it so via the .config.
|
||||
* Prefer gnu_inline, so that extern inline functions do not emit an
|
||||
* externally visible function. This makes extern inline behave as per gnu89
|
||||
* semantics rather than c99. This prevents multiple symbol definition errors
|
||||
* of extern inline functions at link time.
|
||||
* A lot of inline functions can cause havoc with function tracing.
|
||||
* Do not use __always_inline here, since currently it expands to inline again
|
||||
* (which would break users of __always_inline).
|
||||
*/
|
||||
#if !defined(CONFIG_OPTIMIZE_INLINING)
|
||||
#define inline inline __attribute__((__always_inline__)) __gnu_inline \
|
||||
__inline_maybe_unused notrace
|
||||
#else
|
||||
#define inline inline __gnu_inline \
|
||||
__inline_maybe_unused notrace
|
||||
#endif
|
||||
#define inline inline __gnu_inline __inline_maybe_unused notrace
|
||||
|
||||
/*
|
||||
* gcc provides both __inline__ and __inline as alternate spellings of
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ enum coresight_dev_type {
|
|||
CORESIGHT_DEV_TYPE_LINKSINK,
|
||||
CORESIGHT_DEV_TYPE_SOURCE,
|
||||
CORESIGHT_DEV_TYPE_HELPER,
|
||||
CORESIGHT_DEV_TYPE_ECT,
|
||||
};
|
||||
|
||||
enum coresight_dev_subtype_sink {
|
||||
|
|
@ -68,6 +69,12 @@ enum coresight_dev_subtype_helper {
|
|||
CORESIGHT_DEV_SUBTYPE_HELPER_CATU,
|
||||
};
|
||||
|
||||
/* Embedded Cross Trigger (ECT) sub-types */
|
||||
enum coresight_dev_subtype_ect {
|
||||
CORESIGHT_DEV_SUBTYPE_ECT_NONE,
|
||||
CORESIGHT_DEV_SUBTYPE_ECT_CTI,
|
||||
};
|
||||
|
||||
/**
|
||||
* union coresight_dev_subtype - further characterisation of a type
|
||||
* @sink_subtype: type of sink this component is, as defined
|
||||
|
|
@ -78,6 +85,8 @@ enum coresight_dev_subtype_helper {
|
|||
* by @coresight_dev_subtype_source.
|
||||
* @helper_subtype: type of helper this component is, as defined
|
||||
* by @coresight_dev_subtype_helper.
|
||||
* @ect_subtype: type of cross trigger this component is, as
|
||||
* defined by @coresight_dev_subtype_ect
|
||||
*/
|
||||
union coresight_dev_subtype {
|
||||
/* We have some devices which acts as LINK and SINK */
|
||||
|
|
@ -87,6 +96,7 @@ union coresight_dev_subtype {
|
|||
};
|
||||
enum coresight_dev_subtype_source source_subtype;
|
||||
enum coresight_dev_subtype_helper helper_subtype;
|
||||
enum coresight_dev_subtype_ect ect_subtype;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -153,6 +163,8 @@ struct coresight_connection {
|
|||
* activated but not yet enabled. Enabling for a _sink_
|
||||
* appens when a source has been selected for that it.
|
||||
* @ea: Device attribute for sink representation under PMU directory.
|
||||
* @ect_dev: Associated cross trigger device. Not part of the trace data
|
||||
* path or connections.
|
||||
*/
|
||||
struct coresight_device {
|
||||
struct coresight_platform_data *pdata;
|
||||
|
|
@ -166,6 +178,8 @@ struct coresight_device {
|
|||
/* sink specific fields */
|
||||
bool activated; /* true only if a sink is part of a path */
|
||||
struct dev_ext_attribute *ea;
|
||||
/* cross trigger handling */
|
||||
struct coresight_device *ect_dev;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -196,6 +210,7 @@ static struct coresight_dev_list (var) = { \
|
|||
#define sink_ops(csdev) csdev->ops->sink_ops
|
||||
#define link_ops(csdev) csdev->ops->link_ops
|
||||
#define helper_ops(csdev) csdev->ops->helper_ops
|
||||
#define ect_ops(csdev) csdev->ops->ect_ops
|
||||
|
||||
/**
|
||||
* struct coresight_ops_sink - basic operations for a sink
|
||||
|
|
@ -262,11 +277,23 @@ struct coresight_ops_helper {
|
|||
int (*disable)(struct coresight_device *csdev, void *data);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct coresight_ops_ect - Ops for an embedded cross trigger device
|
||||
*
|
||||
* @enable : Enable the device
|
||||
* @disable : Disable the device
|
||||
*/
|
||||
struct coresight_ops_ect {
|
||||
int (*enable)(struct coresight_device *csdev);
|
||||
int (*disable)(struct coresight_device *csdev);
|
||||
};
|
||||
|
||||
struct coresight_ops {
|
||||
const struct coresight_ops_sink *sink_ops;
|
||||
const struct coresight_ops_link *link_ops;
|
||||
const struct coresight_ops_source *source_ops;
|
||||
const struct coresight_ops_helper *helper_ops;
|
||||
const struct coresight_ops_ect *ect_ops;
|
||||
};
|
||||
|
||||
#ifdef CONFIG_CORESIGHT
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ struct cpu_rmap {
|
|||
struct {
|
||||
u16 index;
|
||||
u16 dist;
|
||||
} near[0];
|
||||
} near[];
|
||||
};
|
||||
#define CPU_RMAP_DIST_INF 0xffff
|
||||
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@
|
|||
typedef unsigned long dax_entry_t;
|
||||
|
||||
struct iomap_ops;
|
||||
struct iomap;
|
||||
struct dax_device;
|
||||
struct dax_operations {
|
||||
/*
|
||||
|
|
@ -34,6 +35,8 @@ struct dax_operations {
|
|||
/* copy_to_iter: required operation for fs-dax direct-i/o */
|
||||
size_t (*copy_to_iter)(struct dax_device *, pgoff_t, void *, size_t,
|
||||
struct iov_iter *);
|
||||
/* zero_page_range: required operation. Zero page range */
|
||||
int (*zero_page_range)(struct dax_device *, pgoff_t, size_t);
|
||||
};
|
||||
|
||||
extern struct attribute_group dax_attribute_group;
|
||||
|
|
@ -199,6 +202,8 @@ size_t dax_copy_from_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
|
|||
size_t bytes, struct iov_iter *i);
|
||||
size_t dax_copy_to_iter(struct dax_device *dax_dev, pgoff_t pgoff, void *addr,
|
||||
size_t bytes, struct iov_iter *i);
|
||||
int dax_zero_page_range(struct dax_device *dax_dev, pgoff_t pgoff,
|
||||
size_t nr_pages);
|
||||
void dax_flush(struct dax_device *dax_dev, void *addr, size_t size);
|
||||
|
||||
ssize_t dax_iomap_rw(struct kiocb *iocb, struct iov_iter *iter,
|
||||
|
|
@ -210,20 +215,8 @@ vm_fault_t dax_finish_sync_fault(struct vm_fault *vmf,
|
|||
int dax_delete_mapping_entry(struct address_space *mapping, pgoff_t index);
|
||||
int dax_invalidate_mapping_entry_sync(struct address_space *mapping,
|
||||
pgoff_t index);
|
||||
|
||||
#ifdef CONFIG_FS_DAX
|
||||
int __dax_zero_page_range(struct block_device *bdev,
|
||||
struct dax_device *dax_dev, sector_t sector,
|
||||
unsigned int offset, unsigned int length);
|
||||
#else
|
||||
static inline int __dax_zero_page_range(struct block_device *bdev,
|
||||
struct dax_device *dax_dev, sector_t sector,
|
||||
unsigned int offset, unsigned int length)
|
||||
{
|
||||
return -ENXIO;
|
||||
}
|
||||
#endif
|
||||
|
||||
int dax_iomap_zero(loff_t pos, unsigned offset, unsigned size,
|
||||
struct iomap *iomap);
|
||||
static inline bool dax_mapping(struct address_space *mapping)
|
||||
{
|
||||
return mapping->host && IS_DAX(mapping->host);
|
||||
|
|
|
|||
|
|
@ -75,7 +75,7 @@ void devfreq_cooling_unregister(struct thermal_cooling_device *dfc);
|
|||
|
||||
#else /* !CONFIG_DEVFREQ_THERMAL */
|
||||
|
||||
struct thermal_cooling_device *
|
||||
static inline struct thermal_cooling_device *
|
||||
of_devfreq_cooling_register_power(struct device_node *np, struct devfreq *df,
|
||||
struct devfreq_cooling_power *dfc_power)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ typedef long (*dm_dax_direct_access_fn) (struct dm_target *ti, pgoff_t pgoff,
|
|||
long nr_pages, void **kaddr, pfn_t *pfn);
|
||||
typedef size_t (*dm_dax_copy_iter_fn)(struct dm_target *ti, pgoff_t pgoff,
|
||||
void *addr, size_t bytes, struct iov_iter *i);
|
||||
typedef int (*dm_dax_zero_page_range_fn)(struct dm_target *ti, pgoff_t pgoff,
|
||||
size_t nr_pages);
|
||||
#define PAGE_SECTORS (PAGE_SIZE / 512)
|
||||
|
||||
void dm_error(const char *message);
|
||||
|
|
@ -195,6 +197,7 @@ struct target_type {
|
|||
dm_dax_direct_access_fn direct_access;
|
||||
dm_dax_copy_iter_fn dax_copy_from_iter;
|
||||
dm_dax_copy_iter_fn dax_copy_to_iter;
|
||||
dm_dax_zero_page_range_fn dax_zero_page_range;
|
||||
|
||||
/* For internal device-mapper use. */
|
||||
struct list_head list;
|
||||
|
|
|
|||
|
|
@ -42,9 +42,8 @@ struct device_node;
|
|||
struct fwnode_handle;
|
||||
struct iommu_ops;
|
||||
struct iommu_group;
|
||||
struct iommu_fwspec;
|
||||
struct dev_pin_info;
|
||||
struct iommu_param;
|
||||
struct dev_iommu;
|
||||
|
||||
/**
|
||||
* struct subsys_interface - interfaces to device functions
|
||||
|
|
@ -513,8 +512,7 @@ struct dev_links_info {
|
|||
* gone away. This should be set by the allocator of the
|
||||
* device (i.e. the bus driver that discovered the device).
|
||||
* @iommu_group: IOMMU group the device belongs to.
|
||||
* @iommu_fwspec: IOMMU-specific properties supplied by firmware.
|
||||
* @iommu_param: Per device generic IOMMU runtime data
|
||||
* @iommu: Per device generic IOMMU runtime data
|
||||
*
|
||||
* @offline_disabled: If set, the device is permanently online.
|
||||
* @offline: Set after successful invocation of bus type's .offline().
|
||||
|
|
@ -613,8 +611,7 @@ struct device {
|
|||
|
||||
void (*release)(struct device *dev);
|
||||
struct iommu_group *iommu_group;
|
||||
struct iommu_fwspec *iommu_fwspec;
|
||||
struct iommu_param *iommu_param;
|
||||
struct dev_iommu *iommu;
|
||||
|
||||
bool offline_disabled:1;
|
||||
bool offline:1;
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ struct pubkey_hdr {
|
|||
uint32_t timestamp; /* key made, always 0 for now */
|
||||
uint8_t algo;
|
||||
uint8_t nmpi;
|
||||
char mpi[0];
|
||||
char mpi[];
|
||||
} __packed;
|
||||
|
||||
struct signature_hdr {
|
||||
|
|
@ -39,7 +39,7 @@ struct signature_hdr {
|
|||
uint8_t hash;
|
||||
uint8_t keyid[8];
|
||||
uint8_t nmpi;
|
||||
char mpi[0];
|
||||
char mpi[];
|
||||
} __packed;
|
||||
|
||||
#if defined(CONFIG_SIGNATURE) || defined(CONFIG_SIGNATURE_MODULE)
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ struct linux_dirent64 {
|
|||
s64 d_off;
|
||||
unsigned short d_reclen;
|
||||
unsigned char d_type;
|
||||
char d_name[0];
|
||||
char d_name[];
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -108,7 +108,7 @@ static inline void arch_dma_prep_coherent(struct page *page, size_t size)
|
|||
}
|
||||
#endif /* CONFIG_ARCH_HAS_DMA_PREP_COHERENT */
|
||||
|
||||
void *uncached_kernel_address(void *addr);
|
||||
void *cached_kernel_address(void *addr);
|
||||
void *arch_dma_set_uncached(void *addr, size_t size);
|
||||
void arch_dma_clear_uncached(void *addr, size_t size);
|
||||
|
||||
#endif /* _LINUX_DMA_NONCOHERENT_H */
|
||||
|
|
|
|||
|
|
@ -300,6 +300,8 @@ struct dma_router {
|
|||
* @chan_id: channel ID for sysfs
|
||||
* @dev: class device for sysfs
|
||||
* @name: backlink name for sysfs
|
||||
* @dbg_client_name: slave name for debugfs in format:
|
||||
* dev_name(requester's dev):channel name, for example: "2b00000.mcasp:tx"
|
||||
* @device_node: used to add this to the device chan list
|
||||
* @local: per-cpu pointer to a struct dma_chan_percpu
|
||||
* @client_count: how many clients are using this channel
|
||||
|
|
@ -318,6 +320,9 @@ struct dma_chan {
|
|||
int chan_id;
|
||||
struct dma_chan_dev *dev;
|
||||
const char *name;
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
char *dbg_client_name;
|
||||
#endif
|
||||
|
||||
struct list_head device_node;
|
||||
struct dma_chan_percpu __percpu *local;
|
||||
|
|
@ -618,10 +623,11 @@ static inline void dmaengine_unmap_put(struct dmaengine_unmap_data *unmap)
|
|||
|
||||
static inline void dma_descriptor_unmap(struct dma_async_tx_descriptor *tx)
|
||||
{
|
||||
if (tx->unmap) {
|
||||
dmaengine_unmap_put(tx->unmap);
|
||||
tx->unmap = NULL;
|
||||
}
|
||||
if (!tx->unmap)
|
||||
return;
|
||||
|
||||
dmaengine_unmap_put(tx->unmap);
|
||||
tx->unmap = NULL;
|
||||
}
|
||||
|
||||
#ifndef CONFIG_ASYNC_TX_ENABLE_CHANNEL_SWITCH
|
||||
|
|
@ -805,7 +811,9 @@ struct dma_filter {
|
|||
* called and there are no further references to this structure. This
|
||||
* must be implemented to free resources however many existing drivers
|
||||
* do not and are therefore not safe to unbind while in use.
|
||||
*
|
||||
* @dbg_summary_show: optional routine to show contents in debugfs; default code
|
||||
* will be used when this is omitted, but custom code can show extra,
|
||||
* controller specific information.
|
||||
*/
|
||||
struct dma_device {
|
||||
struct kref ref;
|
||||
|
|
@ -891,6 +899,11 @@ struct dma_device {
|
|||
struct dma_tx_state *txstate);
|
||||
void (*device_issue_pending)(struct dma_chan *chan);
|
||||
void (*device_release)(struct dma_device *dev);
|
||||
/* debugfs support */
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
void (*dbg_summary_show)(struct seq_file *s, struct dma_device *dev);
|
||||
struct dentry *dbg_dev_root;
|
||||
#endif
|
||||
};
|
||||
|
||||
static inline int dmaengine_slave_config(struct dma_chan *chan,
|
||||
|
|
@ -1155,14 +1168,7 @@ static inline dma_cookie_t dmaengine_submit(struct dma_async_tx_descriptor *desc
|
|||
static inline bool dmaengine_check_align(enum dmaengine_alignment align,
|
||||
size_t off1, size_t off2, size_t len)
|
||||
{
|
||||
size_t mask;
|
||||
|
||||
if (!align)
|
||||
return true;
|
||||
mask = (1 << align) - 1;
|
||||
if (mask & (off1 | off2 | len))
|
||||
return false;
|
||||
return true;
|
||||
return !(((1 << align) - 1) & (off1 | off2 | len));
|
||||
}
|
||||
|
||||
static inline bool is_dma_copy_aligned(struct dma_device *dev, size_t off1,
|
||||
|
|
@ -1236,9 +1242,9 @@ static inline int dma_maxpq(struct dma_device *dma, enum dma_ctrl_flags flags)
|
|||
{
|
||||
if (dma_dev_has_pq_continue(dma) || !dmaf_continue(flags))
|
||||
return dma_dev_to_maxpq(dma);
|
||||
else if (dmaf_p_disabled_continue(flags))
|
||||
if (dmaf_p_disabled_continue(flags))
|
||||
return dma_dev_to_maxpq(dma) - 1;
|
||||
else if (dmaf_continue(flags))
|
||||
if (dmaf_continue(flags))
|
||||
return dma_dev_to_maxpq(dma) - 3;
|
||||
BUG();
|
||||
}
|
||||
|
|
@ -1249,7 +1255,7 @@ static inline size_t dmaengine_get_icg(bool inc, bool sgl, size_t icg,
|
|||
if (inc) {
|
||||
if (dir_icg)
|
||||
return dir_icg;
|
||||
else if (sgl)
|
||||
if (sgl)
|
||||
return icg;
|
||||
}
|
||||
|
||||
|
|
@ -1415,11 +1421,12 @@ static inline enum dma_status dma_async_is_complete(dma_cookie_t cookie,
|
|||
static inline void
|
||||
dma_set_tx_state(struct dma_tx_state *st, dma_cookie_t last, dma_cookie_t used, u32 residue)
|
||||
{
|
||||
if (st) {
|
||||
st->last = last;
|
||||
st->used = used;
|
||||
st->residue = residue;
|
||||
}
|
||||
if (!st)
|
||||
return;
|
||||
|
||||
st->last = last;
|
||||
st->used = used;
|
||||
st->residue = residue;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DMA_ENGINE
|
||||
|
|
@ -1496,12 +1503,11 @@ static inline int dmaengine_desc_set_reuse(struct dma_async_tx_descriptor *tx)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (caps.descriptor_reuse) {
|
||||
tx->flags |= DMA_CTRL_REUSE;
|
||||
return 0;
|
||||
} else {
|
||||
if (!caps.descriptor_reuse)
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
tx->flags |= DMA_CTRL_REUSE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void dmaengine_desc_clear_reuse(struct dma_async_tx_descriptor *tx)
|
||||
|
|
@ -1517,10 +1523,10 @@ static inline bool dmaengine_desc_test_reuse(struct dma_async_tx_descriptor *tx)
|
|||
static inline int dmaengine_desc_free(struct dma_async_tx_descriptor *desc)
|
||||
{
|
||||
/* this is supported for reusable desc, so check that */
|
||||
if (dmaengine_desc_test_reuse(desc))
|
||||
return desc->desc_free(desc);
|
||||
else
|
||||
if (!dmaengine_desc_test_reuse(desc))
|
||||
return -EPERM;
|
||||
|
||||
return desc->desc_free(desc);
|
||||
}
|
||||
|
||||
/* --- DMA device --- */
|
||||
|
|
@ -1566,9 +1572,7 @@ dmaengine_get_direction_text(enum dma_transfer_direction dir)
|
|||
case DMA_DEV_TO_DEV:
|
||||
return "DEV_TO_DEV";
|
||||
default:
|
||||
break;
|
||||
return "invalid";
|
||||
}
|
||||
|
||||
return "invalid";
|
||||
}
|
||||
#endif /* DMAENGINE_H */
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ struct enclosure_device {
|
|||
struct device edev;
|
||||
struct enclosure_component_callbacks *cb;
|
||||
int components;
|
||||
struct enclosure_component component[0];
|
||||
struct enclosure_component component[];
|
||||
};
|
||||
|
||||
static inline struct enclosure_device *
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ struct em_cap_state {
|
|||
struct em_perf_domain {
|
||||
struct em_cap_state *table;
|
||||
int nr_cap_states;
|
||||
unsigned long cpus[0];
|
||||
unsigned long cpus[];
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ENERGY_MODEL
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@ struct compat_ethtool_rxnfc {
|
|||
compat_u64 data;
|
||||
struct compat_ethtool_rx_flow_spec fs;
|
||||
u32 rule_cnt;
|
||||
u32 rule_locs[0];
|
||||
u32 rule_locs[];
|
||||
};
|
||||
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
|
@ -462,7 +462,7 @@ int ethtool_check_ops(const struct ethtool_ops *ops);
|
|||
|
||||
struct ethtool_rx_flow_rule {
|
||||
struct flow_rule *rule;
|
||||
unsigned long priv[0];
|
||||
unsigned long priv[];
|
||||
};
|
||||
|
||||
struct ethtool_rx_flow_spec_input {
|
||||
|
|
|
|||
|
|
@ -17,30 +17,30 @@ struct extcon_dev;
|
|||
#if IS_ENABLED(CONFIG_EXTCON)
|
||||
|
||||
/* Following APIs register/unregister the extcon device. */
|
||||
extern int extcon_dev_register(struct extcon_dev *edev);
|
||||
extern void extcon_dev_unregister(struct extcon_dev *edev);
|
||||
extern int devm_extcon_dev_register(struct device *dev,
|
||||
int extcon_dev_register(struct extcon_dev *edev);
|
||||
void extcon_dev_unregister(struct extcon_dev *edev);
|
||||
int devm_extcon_dev_register(struct device *dev,
|
||||
struct extcon_dev *edev);
|
||||
extern void devm_extcon_dev_unregister(struct device *dev,
|
||||
void devm_extcon_dev_unregister(struct device *dev,
|
||||
struct extcon_dev *edev);
|
||||
|
||||
/* Following APIs allocate/free the memory of the extcon device. */
|
||||
extern struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
|
||||
extern void extcon_dev_free(struct extcon_dev *edev);
|
||||
extern struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
|
||||
struct extcon_dev *extcon_dev_allocate(const unsigned int *cable);
|
||||
void extcon_dev_free(struct extcon_dev *edev);
|
||||
struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
|
||||
const unsigned int *cable);
|
||||
extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
|
||||
void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
|
||||
|
||||
/* Synchronize the state and property value for each external connector. */
|
||||
extern int extcon_sync(struct extcon_dev *edev, unsigned int id);
|
||||
int extcon_sync(struct extcon_dev *edev, unsigned int id);
|
||||
|
||||
/*
|
||||
* Following APIs set the connected state of each external connector.
|
||||
* The 'id' argument indicates the defined external connector.
|
||||
*/
|
||||
extern int extcon_set_state(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_state(struct extcon_dev *edev, unsigned int id,
|
||||
bool state);
|
||||
extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
||||
bool state);
|
||||
|
||||
/*
|
||||
|
|
@ -52,13 +52,13 @@ extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
|||
* for each external connector. They are used to set the capability of the
|
||||
* property of each external connector based on the id and property.
|
||||
*/
|
||||
extern int extcon_set_property(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_property(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val);
|
||||
extern int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
|
||||
int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val);
|
||||
extern int extcon_set_property_capability(struct extcon_dev *edev,
|
||||
int extcon_set_property_capability(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop);
|
||||
|
||||
#else /* CONFIG_EXTCON */
|
||||
|
|
|
|||
|
|
@ -286,6 +286,11 @@ static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
|
|||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline const char *extcon_get_edev_name(struct extcon_dev *edev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_EXTCON */
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -125,6 +125,7 @@ struct f2fs_super_block {
|
|||
/*
|
||||
* For checkpoint
|
||||
*/
|
||||
#define CP_RESIZEFS_FLAG 0x00004000
|
||||
#define CP_DISABLED_QUICK_FLAG 0x00002000
|
||||
#define CP_DISABLED_FLAG 0x00001000
|
||||
#define CP_QUOTA_NEED_FSCK_FLAG 0x00000800
|
||||
|
|
|
|||
|
|
@ -47,7 +47,8 @@
|
|||
* Directory entry modification events - reported only to directory
|
||||
* where entry is modified and not to a watching parent.
|
||||
*/
|
||||
#define FANOTIFY_DIRENT_EVENTS (FAN_MOVE | FAN_CREATE | FAN_DELETE)
|
||||
#define FANOTIFY_DIRENT_EVENTS (FAN_MOVE | FAN_CREATE | FAN_DELETE | \
|
||||
FAN_DIR_MODIFY)
|
||||
|
||||
/* Events that can only be reported with data type FSNOTIFY_EVENT_INODE */
|
||||
#define FANOTIFY_INODE_EVENTS (FANOTIFY_DIRENT_EVENTS | \
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ enum imx_sc_rpc_svc {
|
|||
IMX_SC_RPC_SVC_PAD = 6,
|
||||
IMX_SC_RPC_SVC_MISC = 7,
|
||||
IMX_SC_RPC_SVC_IRQ = 8,
|
||||
IMX_SC_RPC_SVC_ABORT = 9
|
||||
};
|
||||
|
||||
struct imx_sc_rpc_msg {
|
||||
|
|
|
|||
|
|
@ -12,6 +12,8 @@ enum {
|
|||
SM_EFUSE_WRITE,
|
||||
SM_EFUSE_USER_MAX,
|
||||
SM_GET_CHIP_ID,
|
||||
SM_A1_PWRC_SET,
|
||||
SM_A1_PWRC_GET,
|
||||
};
|
||||
|
||||
struct meson_sm_firmware;
|
||||
|
|
|
|||
|
|
@ -329,7 +329,7 @@ struct zynqmp_eemi_ops {
|
|||
int zynqmp_pm_invoke_fn(u32 pm_api_id, u32 arg0, u32 arg1,
|
||||
u32 arg2, u32 arg3, u32 *ret_payload);
|
||||
|
||||
#if IS_REACHABLE(CONFIG_ARCH_ZYNQMP)
|
||||
#if IS_REACHABLE(CONFIG_ZYNQMP_FIRMWARE)
|
||||
const struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void);
|
||||
#else
|
||||
static inline struct zynqmp_eemi_ops *zynqmp_pm_get_eemi_ops(void)
|
||||
|
|
|
|||
|
|
@ -3399,7 +3399,7 @@ static inline bool io_is_direct(struct file *filp)
|
|||
return (filp->f_flags & O_DIRECT) || IS_DAX(filp->f_mapping->host);
|
||||
}
|
||||
|
||||
static inline bool vma_is_dax(struct vm_area_struct *vma)
|
||||
static inline bool vma_is_dax(const struct vm_area_struct *vma)
|
||||
{
|
||||
return vma->vm_file && IS_DAX(vma->vm_file->f_mapping->host);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,39 +18,63 @@
|
|||
#include <linux/bug.h>
|
||||
|
||||
/*
|
||||
* Notify this @dir inode about a change in the directory entry @dentry.
|
||||
* Notify this @dir inode about a change in a child directory entry.
|
||||
* The directory entry may have turned positive or negative or its inode may
|
||||
* have changed (i.e. renamed over).
|
||||
*
|
||||
* Unlike fsnotify_parent(), the event will be reported regardless of the
|
||||
* FS_EVENT_ON_CHILD mask on the parent inode.
|
||||
*/
|
||||
static inline int fsnotify_dirent(struct inode *dir, struct dentry *dentry,
|
||||
__u32 mask)
|
||||
static inline void fsnotify_name(struct inode *dir, __u32 mask,
|
||||
struct inode *child,
|
||||
const struct qstr *name, u32 cookie)
|
||||
{
|
||||
return fsnotify(dir, mask, d_inode(dentry), FSNOTIFY_EVENT_INODE,
|
||||
&dentry->d_name, 0);
|
||||
fsnotify(dir, mask, child, FSNOTIFY_EVENT_INODE, name, cookie);
|
||||
/*
|
||||
* Send another flavor of the event without child inode data and
|
||||
* without the specific event type (e.g. FS_CREATE|FS_IS_DIR).
|
||||
* The name is relative to the dir inode the event is reported to.
|
||||
*/
|
||||
fsnotify(dir, FS_DIR_MODIFY, dir, FSNOTIFY_EVENT_INODE, name, 0);
|
||||
}
|
||||
|
||||
/* Notify this dentry's parent about a child's events. */
|
||||
static inline int fsnotify_parent(const struct path *path,
|
||||
struct dentry *dentry, __u32 mask)
|
||||
static inline void fsnotify_dirent(struct inode *dir, struct dentry *dentry,
|
||||
__u32 mask)
|
||||
{
|
||||
if (!dentry)
|
||||
dentry = path->dentry;
|
||||
|
||||
return __fsnotify_parent(path, dentry, mask);
|
||||
fsnotify_name(dir, mask, d_inode(dentry), &dentry->d_name, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Simple wrapper to consolidate calls fsnotify_parent()/fsnotify() when
|
||||
* an event is on a path.
|
||||
* Simple wrappers to consolidate calls fsnotify_parent()/fsnotify() when
|
||||
* an event is on a file/dentry.
|
||||
*/
|
||||
static inline int fsnotify_path(struct inode *inode, const struct path *path,
|
||||
__u32 mask)
|
||||
static inline void fsnotify_dentry(struct dentry *dentry, __u32 mask)
|
||||
{
|
||||
int ret = fsnotify_parent(path, NULL, mask);
|
||||
struct inode *inode = d_inode(dentry);
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_parent(dentry, mask, inode, FSNOTIFY_EVENT_INODE);
|
||||
fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
}
|
||||
|
||||
static inline int fsnotify_file(struct file *file, __u32 mask)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
int ret;
|
||||
|
||||
if (file->f_mode & FMODE_NONOTIFY)
|
||||
return 0;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
ret = fsnotify_parent(path->dentry, mask, path, FSNOTIFY_EVENT_PATH);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return fsnotify(inode, mask, path, FSNOTIFY_EVENT_PATH, NULL, 0);
|
||||
}
|
||||
|
||||
|
|
@ -58,19 +82,16 @@ static inline int fsnotify_path(struct inode *inode, const struct path *path,
|
|||
static inline int fsnotify_perm(struct file *file, int mask)
|
||||
{
|
||||
int ret;
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 fsnotify_mask = 0;
|
||||
|
||||
if (file->f_mode & FMODE_NONOTIFY)
|
||||
return 0;
|
||||
if (!(mask & (MAY_READ | MAY_OPEN)))
|
||||
return 0;
|
||||
|
||||
if (mask & MAY_OPEN) {
|
||||
fsnotify_mask = FS_OPEN_PERM;
|
||||
|
||||
if (file->f_flags & __FMODE_EXEC) {
|
||||
ret = fsnotify_path(inode, path, FS_OPEN_EXEC_PERM);
|
||||
ret = fsnotify_file(file, FS_OPEN_EXEC_PERM);
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -79,10 +100,7 @@ static inline int fsnotify_perm(struct file *file, int mask)
|
|||
fsnotify_mask = FS_ACCESS_PERM;
|
||||
}
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
fsnotify_mask |= FS_ISDIR;
|
||||
|
||||
return fsnotify_path(inode, path, fsnotify_mask);
|
||||
return fsnotify_file(file, fsnotify_mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -122,10 +140,8 @@ static inline void fsnotify_move(struct inode *old_dir, struct inode *new_dir,
|
|||
mask |= FS_ISDIR;
|
||||
}
|
||||
|
||||
fsnotify(old_dir, old_dir_mask, source, FSNOTIFY_EVENT_INODE, old_name,
|
||||
fs_cookie);
|
||||
fsnotify(new_dir, new_dir_mask, source, FSNOTIFY_EVENT_INODE, new_name,
|
||||
fs_cookie);
|
||||
fsnotify_name(old_dir, old_dir_mask, source, old_name, fs_cookie);
|
||||
fsnotify_name(new_dir, new_dir_mask, source, new_name, fs_cookie);
|
||||
|
||||
if (target)
|
||||
fsnotify_link_count(target);
|
||||
|
|
@ -180,12 +196,13 @@ static inline void fsnotify_create(struct inode *inode, struct dentry *dentry)
|
|||
* Note: We have to pass also the linked inode ptr as some filesystems leave
|
||||
* new_dentry->d_inode NULL and instantiate inode pointer later
|
||||
*/
|
||||
static inline void fsnotify_link(struct inode *dir, struct inode *inode, struct dentry *new_dentry)
|
||||
static inline void fsnotify_link(struct inode *dir, struct inode *inode,
|
||||
struct dentry *new_dentry)
|
||||
{
|
||||
fsnotify_link_count(inode);
|
||||
audit_inode_child(dir, new_dentry, AUDIT_TYPE_CHILD_CREATE);
|
||||
|
||||
fsnotify(dir, FS_CREATE, inode, FSNOTIFY_EVENT_INODE, &new_dentry->d_name, 0);
|
||||
fsnotify_name(dir, FS_CREATE, inode, &new_dentry->d_name, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -229,15 +246,7 @@ static inline void fsnotify_rmdir(struct inode *dir, struct dentry *dentry)
|
|||
*/
|
||||
static inline void fsnotify_access(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 mask = FS_ACCESS;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
if (!(file->f_mode & FMODE_NONOTIFY))
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, FS_ACCESS);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -245,15 +254,7 @@ static inline void fsnotify_access(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_modify(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 mask = FS_MODIFY;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
if (!(file->f_mode & FMODE_NONOTIFY))
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, FS_MODIFY);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -261,16 +262,12 @@ static inline void fsnotify_modify(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_open(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
__u32 mask = FS_OPEN;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
if (file->f_flags & __FMODE_EXEC)
|
||||
mask |= FS_OPEN_EXEC;
|
||||
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -278,16 +275,10 @@ static inline void fsnotify_open(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_close(struct file *file)
|
||||
{
|
||||
const struct path *path = &file->f_path;
|
||||
struct inode *inode = file_inode(file);
|
||||
fmode_t mode = file->f_mode;
|
||||
__u32 mask = (mode & FMODE_WRITE) ? FS_CLOSE_WRITE : FS_CLOSE_NOWRITE;
|
||||
__u32 mask = (file->f_mode & FMODE_WRITE) ? FS_CLOSE_WRITE :
|
||||
FS_CLOSE_NOWRITE;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
if (!(file->f_mode & FMODE_NONOTIFY))
|
||||
fsnotify_path(inode, path, mask);
|
||||
fsnotify_file(file, mask);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -295,14 +286,7 @@ static inline void fsnotify_close(struct file *file)
|
|||
*/
|
||||
static inline void fsnotify_xattr(struct dentry *dentry)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
__u32 mask = FS_ATTRIB;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_parent(NULL, dentry, mask);
|
||||
fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
fsnotify_dentry(dentry, FS_ATTRIB);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -311,7 +295,6 @@ static inline void fsnotify_xattr(struct dentry *dentry)
|
|||
*/
|
||||
static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid)
|
||||
{
|
||||
struct inode *inode = dentry->d_inode;
|
||||
__u32 mask = 0;
|
||||
|
||||
if (ia_valid & ATTR_UID)
|
||||
|
|
@ -332,13 +315,8 @@ static inline void fsnotify_change(struct dentry *dentry, unsigned int ia_valid)
|
|||
if (ia_valid & ATTR_MODE)
|
||||
mask |= FS_ATTRIB;
|
||||
|
||||
if (mask) {
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
mask |= FS_ISDIR;
|
||||
|
||||
fsnotify_parent(NULL, dentry, mask);
|
||||
fsnotify(inode, mask, inode, FSNOTIFY_EVENT_INODE, NULL, 0);
|
||||
}
|
||||
if (mask)
|
||||
fsnotify_dentry(dentry, mask);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_FS_NOTIFY_H */
|
||||
|
|
|
|||
|
|
@ -47,18 +47,18 @@
|
|||
#define FS_OPEN_PERM 0x00010000 /* open event in an permission hook */
|
||||
#define FS_ACCESS_PERM 0x00020000 /* access event in a permissions hook */
|
||||
#define FS_OPEN_EXEC_PERM 0x00040000 /* open/exec event in a permission hook */
|
||||
#define FS_DIR_MODIFY 0x00080000 /* Directory entry was modified */
|
||||
|
||||
#define FS_EXCL_UNLINK 0x04000000 /* do not send events if object is unlinked */
|
||||
#define FS_ISDIR 0x40000000 /* event occurred against dir */
|
||||
#define FS_IN_ONESHOT 0x80000000 /* only send event once */
|
||||
|
||||
#define FS_DN_RENAME 0x10000000 /* file renamed */
|
||||
#define FS_DN_MULTISHOT 0x20000000 /* dnotify multishot */
|
||||
|
||||
/* This inode cares about things that happen to its children. Always set for
|
||||
* dnotify and inotify. */
|
||||
#define FS_EVENT_ON_CHILD 0x08000000
|
||||
|
||||
#define FS_DN_RENAME 0x10000000 /* file renamed */
|
||||
#define FS_DN_MULTISHOT 0x20000000 /* dnotify multishot */
|
||||
#define FS_ISDIR 0x40000000 /* event occurred against dir */
|
||||
#define FS_IN_ONESHOT 0x80000000 /* only send event once */
|
||||
|
||||
#define FS_MOVE (FS_MOVED_FROM | FS_MOVED_TO)
|
||||
|
||||
/*
|
||||
|
|
@ -67,7 +67,8 @@
|
|||
* The watching parent may get an FS_ATTRIB|FS_EVENT_ON_CHILD event
|
||||
* when a directory entry inside a child subdir changes.
|
||||
*/
|
||||
#define ALL_FSNOTIFY_DIRENT_EVENTS (FS_CREATE | FS_DELETE | FS_MOVE)
|
||||
#define ALL_FSNOTIFY_DIRENT_EVENTS (FS_CREATE | FS_DELETE | FS_MOVE | \
|
||||
FS_DIR_MODIFY)
|
||||
|
||||
#define ALL_FSNOTIFY_PERM_EVENTS (FS_OPEN_PERM | FS_ACCESS_PERM | \
|
||||
FS_OPEN_EXEC_PERM)
|
||||
|
|
@ -133,8 +134,7 @@ struct fsnotify_ops {
|
|||
*/
|
||||
struct fsnotify_event {
|
||||
struct list_head list;
|
||||
/* inode may ONLY be dereferenced during handle_event(). */
|
||||
struct inode *inode; /* either the inode the event happened to or its parent */
|
||||
unsigned long objectid; /* identifier for queue merges */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -213,10 +213,36 @@ struct fsnotify_group {
|
|||
};
|
||||
};
|
||||
|
||||
/* when calling fsnotify tell it if the data is a path or inode */
|
||||
#define FSNOTIFY_EVENT_NONE 0
|
||||
#define FSNOTIFY_EVENT_PATH 1
|
||||
#define FSNOTIFY_EVENT_INODE 2
|
||||
/* When calling fsnotify tell it if the data is a path or inode */
|
||||
enum fsnotify_data_type {
|
||||
FSNOTIFY_EVENT_NONE,
|
||||
FSNOTIFY_EVENT_PATH,
|
||||
FSNOTIFY_EVENT_INODE,
|
||||
};
|
||||
|
||||
static inline const struct inode *fsnotify_data_inode(const void *data,
|
||||
int data_type)
|
||||
{
|
||||
switch (data_type) {
|
||||
case FSNOTIFY_EVENT_INODE:
|
||||
return data;
|
||||
case FSNOTIFY_EVENT_PATH:
|
||||
return d_inode(((const struct path *)data)->dentry);
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline const struct path *fsnotify_data_path(const void *data,
|
||||
int data_type)
|
||||
{
|
||||
switch (data_type) {
|
||||
case FSNOTIFY_EVENT_PATH:
|
||||
return data;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
enum fsnotify_obj_type {
|
||||
FSNOTIFY_OBJ_TYPE_INODE,
|
||||
|
|
@ -351,9 +377,10 @@ struct fsnotify_mark {
|
|||
/* called from the vfs helpers */
|
||||
|
||||
/* main fsnotify call to send events */
|
||||
extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
|
||||
const struct qstr *name, u32 cookie);
|
||||
extern int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask);
|
||||
extern int fsnotify(struct inode *to_tell, __u32 mask, const void *data,
|
||||
int data_type, const struct qstr *name, u32 cookie);
|
||||
extern int fsnotify_parent(struct dentry *dentry, __u32 mask, const void *data,
|
||||
int data_type);
|
||||
extern void __fsnotify_inode_delete(struct inode *inode);
|
||||
extern void __fsnotify_vfsmount_delete(struct vfsmount *mnt);
|
||||
extern void fsnotify_sb_delete(struct super_block *sb);
|
||||
|
|
@ -500,21 +527,22 @@ extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info);
|
|||
extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info);
|
||||
|
||||
static inline void fsnotify_init_event(struct fsnotify_event *event,
|
||||
struct inode *inode)
|
||||
unsigned long objectid)
|
||||
{
|
||||
INIT_LIST_HEAD(&event->list);
|
||||
event->inode = inode;
|
||||
event->objectid = objectid;
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data, int data_is,
|
||||
const struct qstr *name, u32 cookie)
|
||||
static inline int fsnotify(struct inode *to_tell, __u32 mask, const void *data,
|
||||
int data_type, const struct qstr *name, u32 cookie)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int __fsnotify_parent(const struct path *path, struct dentry *dentry, __u32 mask)
|
||||
static inline int fsnotify_parent(struct dentry *dentry, __u32 mask,
|
||||
const void *data, int data_type)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -76,7 +76,7 @@ struct gen_pool_chunk {
|
|||
void *owner; /* private data to retrieve at alloc time */
|
||||
unsigned long start_addr; /* start address of memory chunk */
|
||||
unsigned long end_addr; /* end address of memory chunk (inclusive) */
|
||||
unsigned long bits[0]; /* bitmap for allocating memory chunk */
|
||||
unsigned long bits[]; /* bitmap for allocating memory chunk */
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -124,6 +124,8 @@ struct vm_area_struct;
|
|||
*
|
||||
* Reclaim modifiers
|
||||
* ~~~~~~~~~~~~~~~~~
|
||||
* Please note that all the following flags are only applicable to sleepable
|
||||
* allocations (e.g. %GFP_NOWAIT and %GFP_ATOMIC will ignore them).
|
||||
*
|
||||
* %__GFP_IO can start physical IO.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -102,11 +102,9 @@ void devm_gpio_free(struct device *dev, unsigned int gpio);
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/pinctrl/pinctrl.h>
|
||||
|
||||
struct device;
|
||||
struct gpio_chip;
|
||||
struct pinctrl_dev;
|
||||
|
||||
static inline bool gpio_is_valid(int number)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -2,9 +2,10 @@
|
|||
#ifndef __LINUX_GPIO_CONSUMER_H
|
||||
#define __LINUX_GPIO_CONSUMER_H
|
||||
|
||||
#include <linux/bits.h>
|
||||
#include <linux/bug.h>
|
||||
#include <linux/compiler_types.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
|
||||
struct device;
|
||||
|
||||
|
|
@ -156,6 +157,7 @@ int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|||
struct gpio_array *array_info,
|
||||
unsigned long *value_bitmap);
|
||||
|
||||
int gpiod_set_config(struct gpio_desc *desc, unsigned long config);
|
||||
int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce);
|
||||
int gpiod_set_transitory(struct gpio_desc *desc, bool transitory);
|
||||
void gpiod_toggle_active_low(struct gpio_desc *desc);
|
||||
|
|
@ -189,6 +191,8 @@ struct gpio_desc *devm_fwnode_gpiod_get_index(struct device *dev,
|
|||
|
||||
#else /* CONFIG_GPIOLIB */
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
static inline int gpiod_count(struct device *dev, const char *con_id)
|
||||
{
|
||||
return 0;
|
||||
|
|
@ -470,6 +474,13 @@ static inline int gpiod_set_raw_array_value_cansleep(unsigned int array_size,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int gpiod_set_config(struct gpio_desc *desc, unsigned long config)
|
||||
{
|
||||
/* GPIO can never have been requested */
|
||||
WARN_ON(desc);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int gpiod_set_debounce(struct gpio_desc *desc, unsigned debounce)
|
||||
{
|
||||
/* GPIO can never have been requested */
|
||||
|
|
|
|||
|
|
@ -87,7 +87,7 @@ struct gpio_irq_chip {
|
|||
* @need_valid_mask to make these GPIO lines unavailable for
|
||||
* translation.
|
||||
*/
|
||||
int (*child_to_parent_hwirq)(struct gpio_chip *chip,
|
||||
int (*child_to_parent_hwirq)(struct gpio_chip *gc,
|
||||
unsigned int child_hwirq,
|
||||
unsigned int child_type,
|
||||
unsigned int *parent_hwirq,
|
||||
|
|
@ -102,7 +102,7 @@ struct gpio_irq_chip {
|
|||
* variant named &gpiochip_populate_parent_fwspec_fourcell is also
|
||||
* available.
|
||||
*/
|
||||
void *(*populate_parent_alloc_arg)(struct gpio_chip *chip,
|
||||
void *(*populate_parent_alloc_arg)(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type);
|
||||
|
||||
|
|
@ -114,7 +114,7 @@ struct gpio_irq_chip {
|
|||
* callback. If this is not specified, then a default callback will be
|
||||
* provided that returns the line offset.
|
||||
*/
|
||||
unsigned int (*child_offset_to_irq)(struct gpio_chip *chip,
|
||||
unsigned int (*child_offset_to_irq)(struct gpio_chip *gc,
|
||||
unsigned int pin);
|
||||
|
||||
/**
|
||||
|
|
@ -209,7 +209,7 @@ struct gpio_irq_chip {
|
|||
* a particular driver wants to clear IRQ related registers
|
||||
* in order to avoid undesired events.
|
||||
*/
|
||||
int (*init_hw)(struct gpio_chip *chip);
|
||||
int (*init_hw)(struct gpio_chip *gc);
|
||||
|
||||
/**
|
||||
* @init_valid_mask: optional routine to initialize @valid_mask, to be
|
||||
|
|
@ -220,7 +220,7 @@ struct gpio_irq_chip {
|
|||
* then directly set some bits to "0" if they cannot be used for
|
||||
* interrupts.
|
||||
*/
|
||||
void (*init_valid_mask)(struct gpio_chip *chip,
|
||||
void (*init_valid_mask)(struct gpio_chip *gc,
|
||||
unsigned long *valid_mask,
|
||||
unsigned int ngpios);
|
||||
|
||||
|
|
@ -348,40 +348,40 @@ struct gpio_chip {
|
|||
struct device *parent;
|
||||
struct module *owner;
|
||||
|
||||
int (*request)(struct gpio_chip *chip,
|
||||
int (*request)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
void (*free)(struct gpio_chip *chip,
|
||||
void (*free)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*get_direction)(struct gpio_chip *chip,
|
||||
int (*get_direction)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*direction_input)(struct gpio_chip *chip,
|
||||
int (*direction_input)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*direction_output)(struct gpio_chip *chip,
|
||||
int (*direction_output)(struct gpio_chip *gc,
|
||||
unsigned offset, int value);
|
||||
int (*get)(struct gpio_chip *chip,
|
||||
int (*get)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
int (*get_multiple)(struct gpio_chip *chip,
|
||||
int (*get_multiple)(struct gpio_chip *gc,
|
||||
unsigned long *mask,
|
||||
unsigned long *bits);
|
||||
void (*set)(struct gpio_chip *chip,
|
||||
void (*set)(struct gpio_chip *gc,
|
||||
unsigned offset, int value);
|
||||
void (*set_multiple)(struct gpio_chip *chip,
|
||||
void (*set_multiple)(struct gpio_chip *gc,
|
||||
unsigned long *mask,
|
||||
unsigned long *bits);
|
||||
int (*set_config)(struct gpio_chip *chip,
|
||||
int (*set_config)(struct gpio_chip *gc,
|
||||
unsigned offset,
|
||||
unsigned long config);
|
||||
int (*to_irq)(struct gpio_chip *chip,
|
||||
int (*to_irq)(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
|
||||
void (*dbg_show)(struct seq_file *s,
|
||||
struct gpio_chip *chip);
|
||||
struct gpio_chip *gc);
|
||||
|
||||
int (*init_valid_mask)(struct gpio_chip *chip,
|
||||
int (*init_valid_mask)(struct gpio_chip *gc,
|
||||
unsigned long *valid_mask,
|
||||
unsigned int ngpios);
|
||||
|
||||
int (*add_pin_ranges)(struct gpio_chip *chip);
|
||||
int (*add_pin_ranges)(struct gpio_chip *gc);
|
||||
|
||||
int base;
|
||||
u16 ngpio;
|
||||
|
|
@ -458,11 +458,11 @@ struct gpio_chip {
|
|||
#endif /* CONFIG_OF_GPIO */
|
||||
};
|
||||
|
||||
extern const char *gpiochip_is_requested(struct gpio_chip *chip,
|
||||
extern const char *gpiochip_is_requested(struct gpio_chip *gc,
|
||||
unsigned offset);
|
||||
|
||||
/* add/remove chips */
|
||||
extern int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
|
||||
extern int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
|
||||
struct lock_class_key *lock_key,
|
||||
struct lock_class_key *request_key);
|
||||
|
||||
|
|
@ -490,43 +490,43 @@ extern int gpiochip_add_data_with_key(struct gpio_chip *chip, void *data,
|
|||
* Otherwise it returns zero as a success code.
|
||||
*/
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
#define gpiochip_add_data(chip, data) ({ \
|
||||
#define gpiochip_add_data(gc, data) ({ \
|
||||
static struct lock_class_key lock_key; \
|
||||
static struct lock_class_key request_key; \
|
||||
gpiochip_add_data_with_key(chip, data, &lock_key, \
|
||||
gpiochip_add_data_with_key(gc, data, &lock_key, \
|
||||
&request_key); \
|
||||
})
|
||||
#else
|
||||
#define gpiochip_add_data(chip, data) gpiochip_add_data_with_key(chip, data, NULL, NULL)
|
||||
#define gpiochip_add_data(gc, data) gpiochip_add_data_with_key(gc, data, NULL, NULL)
|
||||
#endif /* CONFIG_LOCKDEP */
|
||||
|
||||
static inline int gpiochip_add(struct gpio_chip *chip)
|
||||
static inline int gpiochip_add(struct gpio_chip *gc)
|
||||
{
|
||||
return gpiochip_add_data(chip, NULL);
|
||||
return gpiochip_add_data(gc, NULL);
|
||||
}
|
||||
extern void gpiochip_remove(struct gpio_chip *chip);
|
||||
extern int devm_gpiochip_add_data(struct device *dev, struct gpio_chip *chip,
|
||||
extern void gpiochip_remove(struct gpio_chip *gc);
|
||||
extern int devm_gpiochip_add_data(struct device *dev, struct gpio_chip *gc,
|
||||
void *data);
|
||||
|
||||
extern struct gpio_chip *gpiochip_find(void *data,
|
||||
int (*match)(struct gpio_chip *chip, void *data));
|
||||
int (*match)(struct gpio_chip *gc, void *data));
|
||||
|
||||
bool gpiochip_line_is_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
int gpiochip_reqres_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_relres_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_disable_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_enable_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
int gpiochip_reqres_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_relres_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_disable_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_enable_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
/* Line status inquiry for drivers */
|
||||
bool gpiochip_line_is_open_drain(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_open_source(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_open_drain(struct gpio_chip *gc, unsigned int offset);
|
||||
bool gpiochip_line_is_open_source(struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
/* Sleep persistence inquiry for drivers */
|
||||
bool gpiochip_line_is_persistent(struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_valid(const struct gpio_chip *chip, unsigned int offset);
|
||||
bool gpiochip_line_is_persistent(struct gpio_chip *gc, unsigned int offset);
|
||||
bool gpiochip_line_is_valid(const struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
/* get driver data */
|
||||
void *gpiochip_get_data(struct gpio_chip *chip);
|
||||
void *gpiochip_get_data(struct gpio_chip *gc);
|
||||
|
||||
struct bgpio_pdata {
|
||||
const char *label;
|
||||
|
|
@ -536,23 +536,23 @@ struct bgpio_pdata {
|
|||
|
||||
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
||||
|
||||
void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip,
|
||||
void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type);
|
||||
void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip,
|
||||
void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type);
|
||||
|
||||
#else
|
||||
|
||||
static inline void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *chip,
|
||||
static inline void *gpiochip_populate_parent_fwspec_twocell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *chip,
|
||||
static inline void *gpiochip_populate_parent_fwspec_fourcell(struct gpio_chip *gc,
|
||||
unsigned int parent_hwirq,
|
||||
unsigned int parent_type)
|
||||
{
|
||||
|
|
@ -572,6 +572,7 @@ int bgpio_init(struct gpio_chip *gc, struct device *dev,
|
|||
#define BGPIOF_BIG_ENDIAN_BYTE_ORDER BIT(3)
|
||||
#define BGPIOF_READ_OUTPUT_REG_SET BIT(4) /* reg_set stores output value */
|
||||
#define BGPIOF_NO_OUTPUT BIT(5) /* only input */
|
||||
#define BGPIOF_NO_SET_ON_INPUT BIT(6)
|
||||
|
||||
int gpiochip_irq_map(struct irq_domain *d, unsigned int irq,
|
||||
irq_hw_number_t hwirq);
|
||||
|
|
@ -582,11 +583,11 @@ int gpiochip_irq_domain_activate(struct irq_domain *domain,
|
|||
void gpiochip_irq_domain_deactivate(struct irq_domain *domain,
|
||||
struct irq_data *data);
|
||||
|
||||
void gpiochip_set_nested_irqchip(struct gpio_chip *gpiochip,
|
||||
void gpiochip_set_nested_irqchip(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int parent_irq);
|
||||
|
||||
int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip,
|
||||
int gpiochip_irqchip_add_key(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
|
|
@ -595,7 +596,7 @@ int gpiochip_irqchip_add_key(struct gpio_chip *gpiochip,
|
|||
struct lock_class_key *lock_key,
|
||||
struct lock_class_key *request_key);
|
||||
|
||||
bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip,
|
||||
bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gc,
|
||||
unsigned int offset);
|
||||
|
||||
#ifdef CONFIG_LOCKDEP
|
||||
|
|
@ -606,7 +607,7 @@ bool gpiochip_irqchip_irq_valid(const struct gpio_chip *gpiochip,
|
|||
* boilerplate static inlines provides such a key for each
|
||||
* unique instance.
|
||||
*/
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
|
|
@ -615,12 +616,12 @@ static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
|||
static struct lock_class_key lock_key;
|
||||
static struct lock_class_key request_key;
|
||||
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, false,
|
||||
&lock_key, &request_key);
|
||||
}
|
||||
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
|
|
@ -630,35 +631,35 @@ static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip,
|
|||
static struct lock_class_key lock_key;
|
||||
static struct lock_class_key request_key;
|
||||
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, true,
|
||||
&lock_key, &request_key);
|
||||
}
|
||||
#else /* ! CONFIG_LOCKDEP */
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
unsigned int type)
|
||||
{
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, false, NULL, NULL);
|
||||
}
|
||||
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gpiochip,
|
||||
static inline int gpiochip_irqchip_add_nested(struct gpio_chip *gc,
|
||||
struct irq_chip *irqchip,
|
||||
unsigned int first_irq,
|
||||
irq_flow_handler_t handler,
|
||||
unsigned int type)
|
||||
{
|
||||
return gpiochip_irqchip_add_key(gpiochip, irqchip, first_irq,
|
||||
return gpiochip_irqchip_add_key(gc, irqchip, first_irq,
|
||||
handler, type, true, NULL, NULL);
|
||||
}
|
||||
#endif /* CONFIG_LOCKDEP */
|
||||
|
||||
int gpiochip_generic_request(struct gpio_chip *chip, unsigned offset);
|
||||
void gpiochip_generic_free(struct gpio_chip *chip, unsigned offset);
|
||||
int gpiochip_generic_config(struct gpio_chip *chip, unsigned offset,
|
||||
int gpiochip_generic_request(struct gpio_chip *gc, unsigned offset);
|
||||
void gpiochip_generic_free(struct gpio_chip *gc, unsigned offset);
|
||||
int gpiochip_generic_config(struct gpio_chip *gc, unsigned offset,
|
||||
unsigned long config);
|
||||
|
||||
/**
|
||||
|
|
@ -675,25 +676,25 @@ struct gpio_pin_range {
|
|||
|
||||
#ifdef CONFIG_PINCTRL
|
||||
|
||||
int gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
|
||||
int gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name,
|
||||
unsigned int gpio_offset, unsigned int pin_offset,
|
||||
unsigned int npins);
|
||||
int gpiochip_add_pingroup_range(struct gpio_chip *chip,
|
||||
int gpiochip_add_pingroup_range(struct gpio_chip *gc,
|
||||
struct pinctrl_dev *pctldev,
|
||||
unsigned int gpio_offset, const char *pin_group);
|
||||
void gpiochip_remove_pin_ranges(struct gpio_chip *chip);
|
||||
void gpiochip_remove_pin_ranges(struct gpio_chip *gc);
|
||||
|
||||
#else /* ! CONFIG_PINCTRL */
|
||||
|
||||
static inline int
|
||||
gpiochip_add_pin_range(struct gpio_chip *chip, const char *pinctl_name,
|
||||
gpiochip_add_pin_range(struct gpio_chip *gc, const char *pinctl_name,
|
||||
unsigned int gpio_offset, unsigned int pin_offset,
|
||||
unsigned int npins)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int
|
||||
gpiochip_add_pingroup_range(struct gpio_chip *chip,
|
||||
gpiochip_add_pingroup_range(struct gpio_chip *gc,
|
||||
struct pinctrl_dev *pctldev,
|
||||
unsigned int gpio_offset, const char *pin_group)
|
||||
{
|
||||
|
|
@ -701,27 +702,27 @@ gpiochip_add_pingroup_range(struct gpio_chip *chip,
|
|||
}
|
||||
|
||||
static inline void
|
||||
gpiochip_remove_pin_ranges(struct gpio_chip *chip)
|
||||
gpiochip_remove_pin_ranges(struct gpio_chip *gc)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_PINCTRL */
|
||||
|
||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *chip,
|
||||
struct gpio_desc *gpiochip_request_own_desc(struct gpio_chip *gc,
|
||||
unsigned int hwnum,
|
||||
const char *label,
|
||||
enum gpio_lookup_flags lflags,
|
||||
enum gpiod_flags dflags);
|
||||
void gpiochip_free_own_desc(struct gpio_desc *desc);
|
||||
|
||||
void devprop_gpiochip_set_names(struct gpio_chip *chip,
|
||||
void devprop_gpiochip_set_names(struct gpio_chip *gc,
|
||||
const struct fwnode_handle *fwnode);
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
|
||||
/* lock/unlock as IRQ */
|
||||
int gpiochip_lock_as_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
void gpiochip_unlock_as_irq(struct gpio_chip *chip, unsigned int offset);
|
||||
int gpiochip_lock_as_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
void gpiochip_unlock_as_irq(struct gpio_chip *gc, unsigned int offset);
|
||||
|
||||
|
||||
struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc);
|
||||
|
|
@ -735,14 +736,14 @@ static inline struct gpio_chip *gpiod_to_chip(const struct gpio_desc *desc)
|
|||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline int gpiochip_lock_as_irq(struct gpio_chip *chip,
|
||||
static inline int gpiochip_lock_as_irq(struct gpio_chip *gc,
|
||||
unsigned int offset)
|
||||
{
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void gpiochip_unlock_as_irq(struct gpio_chip *chip,
|
||||
static inline void gpiochip_unlock_as_irq(struct gpio_chip *gc,
|
||||
unsigned int offset)
|
||||
{
|
||||
WARN_ON(1);
|
||||
|
|
|
|||
|
|
@ -46,9 +46,46 @@ extern bool move_huge_pmd(struct vm_area_struct *vma, unsigned long old_addr,
|
|||
pmd_t *old_pmd, pmd_t *new_pmd);
|
||||
extern int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
|
||||
unsigned long addr, pgprot_t newprot,
|
||||
int prot_numa);
|
||||
vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn, bool write);
|
||||
vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn, bool write);
|
||||
unsigned long cp_flags);
|
||||
vm_fault_t vmf_insert_pfn_pmd_prot(struct vm_fault *vmf, pfn_t pfn,
|
||||
pgprot_t pgprot, bool write);
|
||||
|
||||
/**
|
||||
* vmf_insert_pfn_pmd - insert a pmd size pfn
|
||||
* @vmf: Structure describing the fault
|
||||
* @pfn: pfn to insert
|
||||
* @pgprot: page protection to use
|
||||
* @write: whether it's a write fault
|
||||
*
|
||||
* Insert a pmd size pfn. See vmf_insert_pfn() for additional info.
|
||||
*
|
||||
* Return: vm_fault_t value.
|
||||
*/
|
||||
static inline vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn,
|
||||
bool write)
|
||||
{
|
||||
return vmf_insert_pfn_pmd_prot(vmf, pfn, vmf->vma->vm_page_prot, write);
|
||||
}
|
||||
vm_fault_t vmf_insert_pfn_pud_prot(struct vm_fault *vmf, pfn_t pfn,
|
||||
pgprot_t pgprot, bool write);
|
||||
|
||||
/**
|
||||
* vmf_insert_pfn_pud - insert a pud size pfn
|
||||
* @vmf: Structure describing the fault
|
||||
* @pfn: pfn to insert
|
||||
* @pgprot: page protection to use
|
||||
* @write: whether it's a write fault
|
||||
*
|
||||
* Insert a pud size pfn. See vmf_insert_pfn() for additional info.
|
||||
*
|
||||
* Return: vm_fault_t value.
|
||||
*/
|
||||
static inline vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn,
|
||||
bool write)
|
||||
{
|
||||
return vmf_insert_pfn_pud_prot(vmf, pfn, vmf->vma->vm_page_prot, write);
|
||||
}
|
||||
|
||||
enum transparent_hugepage_flag {
|
||||
TRANSPARENT_HUGEPAGE_FLAG,
|
||||
TRANSPARENT_HUGEPAGE_REQ_MADV_FLAG,
|
||||
|
|
|
|||
|
|
@ -895,4 +895,16 @@ static inline spinlock_t *huge_pte_lock(struct hstate *h,
|
|||
return ptl;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_HUGETLB_PAGE) && defined(CONFIG_CMA)
|
||||
extern void __init hugetlb_cma_reserve(int order);
|
||||
extern void __init hugetlb_cma_check(void);
|
||||
#else
|
||||
static inline __init void hugetlb_cma_reserve(int order)
|
||||
{
|
||||
}
|
||||
static inline __init void hugetlb_cma_check(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_HUGETLB_H */
|
||||
|
|
|
|||
|
|
@ -15,24 +15,19 @@
|
|||
|
||||
/**
|
||||
* i2c_smbus_alert_setup - platform data for the smbus_alert i2c client
|
||||
* @alert_edge_triggered: whether the alert interrupt is edge (1) or level (0)
|
||||
* triggered
|
||||
* @irq: IRQ number, if the smbus_alert driver should take care of interrupt
|
||||
* handling
|
||||
*
|
||||
* If irq is not specified, the smbus_alert driver doesn't take care of
|
||||
* interrupt handling. In that case it is up to the I2C bus driver to either
|
||||
* handle the interrupts or to poll for alerts.
|
||||
*
|
||||
* If irq is specified then it it crucial that alert_edge_triggered is
|
||||
* properly set.
|
||||
*/
|
||||
struct i2c_smbus_alert_setup {
|
||||
int irq;
|
||||
};
|
||||
|
||||
struct i2c_client *i2c_setup_smbus_alert(struct i2c_adapter *adapter,
|
||||
struct i2c_smbus_alert_setup *setup);
|
||||
struct i2c_client *i2c_new_smbus_alert_device(struct i2c_adapter *adapter,
|
||||
struct i2c_smbus_alert_setup *setup);
|
||||
int i2c_handle_smbus_alert(struct i2c_client *ara);
|
||||
|
||||
#if IS_ENABLED(CONFIG_I2C_SMBUS) && IS_ENABLED(CONFIG_OF)
|
||||
|
|
|
|||
|
|
@ -39,6 +39,14 @@ enum i2c_slave_event;
|
|||
typedef int (*i2c_slave_cb_t)(struct i2c_client *client,
|
||||
enum i2c_slave_event event, u8 *val);
|
||||
|
||||
/* I2C Frequency Modes */
|
||||
#define I2C_MAX_STANDARD_MODE_FREQ 100000
|
||||
#define I2C_MAX_FAST_MODE_FREQ 400000
|
||||
#define I2C_MAX_FAST_MODE_PLUS_FREQ 1000000
|
||||
#define I2C_MAX_TURBO_MODE_FREQ 1400000
|
||||
#define I2C_MAX_HIGH_SPEED_MODE_FREQ 3400000
|
||||
#define I2C_MAX_ULTRA_FAST_MODE_FREQ 5000000
|
||||
|
||||
struct module;
|
||||
struct property_entry;
|
||||
|
||||
|
|
@ -453,12 +461,6 @@ i2c_new_scanned_device(struct i2c_adapter *adap,
|
|||
unsigned short const *addr_list,
|
||||
int (*probe)(struct i2c_adapter *adap, unsigned short addr));
|
||||
|
||||
struct i2c_client *
|
||||
i2c_new_probed_device(struct i2c_adapter *adap,
|
||||
struct i2c_board_info *info,
|
||||
unsigned short const *addr_list,
|
||||
int (*probe)(struct i2c_adapter *adap, unsigned short addr));
|
||||
|
||||
/* Common custom probe functions */
|
||||
int i2c_probe_func_quick_read(struct i2c_adapter *adap, unsigned short addr);
|
||||
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ struct ip_sf_socklist {
|
|||
unsigned int sl_max;
|
||||
unsigned int sl_count;
|
||||
struct rcu_head rcu;
|
||||
__be32 sl_addr[0];
|
||||
__be32 sl_addr[];
|
||||
};
|
||||
|
||||
#define IP_SFLSIZE(count) (sizeof(struct ip_sf_socklist) + \
|
||||
|
|
|
|||
|
|
@ -18,7 +18,7 @@
|
|||
struct ihex_binrec {
|
||||
__be32 addr;
|
||||
__be16 len;
|
||||
uint8_t data[0];
|
||||
uint8_t data[];
|
||||
} __attribute__((packed));
|
||||
|
||||
static inline uint16_t ihex_binrec_size(const struct ihex_binrec *p)
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <linux/irqreturn.h>
|
||||
#include <linux/platform_data/cros_ec_commands.h>
|
||||
#include <linux/platform_data/cros_ec_proto.h>
|
||||
#include <linux/platform_data/cros_ec_sensorhub.h>
|
||||
|
||||
enum {
|
||||
CROS_EC_SENSOR_X,
|
||||
|
|
@ -29,8 +30,7 @@ enum {
|
|||
*/
|
||||
#define CROS_EC_SAMPLE_SIZE (sizeof(s64) * 2)
|
||||
|
||||
/* Minimum sampling period to use when device is suspending */
|
||||
#define CROS_EC_MIN_SUSPEND_SAMPLING_FREQUENCY 1000 /* 1 second */
|
||||
typedef irqreturn_t (*cros_ec_sensors_capture_t)(int irq, void *p);
|
||||
|
||||
/**
|
||||
* struct cros_ec_sensors_core_state - state data for EC sensors IIO driver
|
||||
|
|
@ -50,7 +50,9 @@ enum {
|
|||
* the timestamp. The timestamp is always last and
|
||||
* is always 8-byte aligned.
|
||||
* @read_ec_sensors_data: function used for accessing sensors values
|
||||
* @cuur_sampl_freq: current sampling period
|
||||
* @fifo_max_event_count: Size of the EC sensor FIFO
|
||||
* @frequencies: Table of known available frequencies:
|
||||
* 0, Min and Max in mHz
|
||||
*/
|
||||
struct cros_ec_sensors_core_state {
|
||||
struct cros_ec_device *ec;
|
||||
|
|
@ -73,101 +75,34 @@ struct cros_ec_sensors_core_state {
|
|||
int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
|
||||
unsigned long scan_mask, s16 *data);
|
||||
|
||||
int curr_sampl_freq;
|
||||
|
||||
/* Table of known available frequencies : 0, Min and Max in mHz */
|
||||
int frequencies[3];
|
||||
u32 fifo_max_event_count;
|
||||
int frequencies[6];
|
||||
};
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_read_lpc() - retrieve data from EC shared memory
|
||||
* @indio_dev: pointer to IIO device
|
||||
* @scan_mask: bitmap of the sensor indices to scan
|
||||
* @data: location to store data
|
||||
*
|
||||
* This is the safe function for reading the EC data. It guarantees that the
|
||||
* data sampled was not modified by the EC while being read.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_sensors_read_lpc(struct iio_dev *indio_dev, unsigned long scan_mask,
|
||||
s16 *data);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_read_cmd() - retrieve data using the EC command protocol
|
||||
* @indio_dev: pointer to IIO device
|
||||
* @scan_mask: bitmap of the sensor indices to scan
|
||||
* @data: location to store data
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_sensors_read_cmd(struct iio_dev *indio_dev, unsigned long scan_mask,
|
||||
s16 *data);
|
||||
|
||||
struct platform_device;
|
||||
/**
|
||||
* cros_ec_sensors_core_init() - basic initialization of the core structure
|
||||
* @pdev: platform device created for the sensors
|
||||
* @indio_dev: iio device structure of the device
|
||||
* @physical_device: true if the device refers to a physical device
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_sensors_core_init(struct platform_device *pdev,
|
||||
struct iio_dev *indio_dev, bool physical_device);
|
||||
struct iio_dev *indio_dev, bool physical_device,
|
||||
cros_ec_sensors_capture_t trigger_capture,
|
||||
cros_ec_sensorhub_push_data_cb_t push_data);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_capture() - the trigger handler function
|
||||
* @irq: the interrupt number.
|
||||
* @p: a pointer to the poll function.
|
||||
*
|
||||
* On a trigger event occurring, if the pollfunc is attached then this
|
||||
* handler is called as a threaded interrupt (and hence may sleep). It
|
||||
* is responsible for grabbing data from the device and pushing it into
|
||||
* the associated buffer.
|
||||
*
|
||||
* Return: IRQ_HANDLED
|
||||
*/
|
||||
irqreturn_t cros_ec_sensors_capture(int irq, void *p);
|
||||
int cros_ec_sensors_push_data(struct iio_dev *indio_dev,
|
||||
s16 *data,
|
||||
s64 timestamp);
|
||||
|
||||
/**
|
||||
* cros_ec_motion_send_host_cmd() - send motion sense host command
|
||||
* @st: pointer to state information for device
|
||||
* @opt_length: optional length to reduce the response size, useful on the data
|
||||
* path. Otherwise, the maximal allowed response size is used
|
||||
*
|
||||
* When called, the sub-command is assumed to be set in param->cmd.
|
||||
*
|
||||
* Return: 0 on success, -errno on failure.
|
||||
*/
|
||||
int cros_ec_motion_send_host_cmd(struct cros_ec_sensors_core_state *st,
|
||||
u16 opt_length);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_core_read() - function to request a value from the sensor
|
||||
* @st: pointer to state information for device
|
||||
* @chan: channel specification structure table
|
||||
* @val: will contain one element making up the returned value
|
||||
* @val2: will contain another element making up the returned value
|
||||
* @mask: specifies which values to be requested
|
||||
*
|
||||
* Return: the type of value returned by the device
|
||||
*/
|
||||
int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
|
||||
struct iio_chan_spec const *chan,
|
||||
int *val, int *val2, long mask);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_core_read_avail() - get available values
|
||||
* @indio_dev: pointer to state information for device
|
||||
* @chan: channel specification structure table
|
||||
* @vals: list of available values
|
||||
* @type: type of data returned
|
||||
* @length: number of data returned in the array
|
||||
* @mask: specifies which values to be requested
|
||||
*
|
||||
* Return: an error code, IIO_AVAIL_RANGE or IIO_AVAIL_LIST
|
||||
*/
|
||||
int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
|
||||
struct iio_chan_spec const *chan,
|
||||
const int **vals,
|
||||
|
|
@ -175,23 +110,12 @@ int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
|
|||
int *length,
|
||||
long mask);
|
||||
|
||||
/**
|
||||
* cros_ec_sensors_core_write() - function to write a value to the sensor
|
||||
* @st: pointer to state information for device
|
||||
* @chan: channel specification structure table
|
||||
* @val: first part of value to write
|
||||
* @val2: second part of value to write
|
||||
* @mask: specifies which values to write
|
||||
*
|
||||
* Return: the type of value returned by the device
|
||||
*/
|
||||
int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
|
||||
struct iio_chan_spec const *chan,
|
||||
int val, int val2, long mask);
|
||||
|
||||
extern const struct dev_pm_ops cros_ec_sensors_pm_ops;
|
||||
|
||||
/* List of extended channel specification for all sensors */
|
||||
extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];
|
||||
extern const struct attribute *cros_ec_sensor_fifo_attributes[];
|
||||
|
||||
#endif /* __CROS_EC_SENSORS_CORE_H */
|
||||
|
|
|
|||
|
|
@ -629,6 +629,8 @@ static inline clockid_t iio_device_get_clock(const struct iio_dev *indio_dev)
|
|||
return indio_dev->clock_id;
|
||||
}
|
||||
|
||||
int iio_device_set_clock(struct iio_dev *indio_dev, clockid_t clock_id);
|
||||
|
||||
/**
|
||||
* dev_to_iio_dev() - Get IIO device struct from a device struct
|
||||
* @dev: The device embedded in the IIO device
|
||||
|
|
|
|||
|
|
@ -77,8 +77,6 @@ void *devm_memremap(struct device *dev, resource_size_t offset,
|
|||
size_t size, unsigned long flags);
|
||||
void devm_memunmap(struct device *dev, void *addr);
|
||||
|
||||
void *__devm_memremap_pages(struct device *dev, struct resource *res);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
/*
|
||||
* The PCI specifications (Rev 3.0, 3.2.5 "Transaction Ordering and
|
||||
|
|
|
|||
|
|
@ -365,17 +365,20 @@ struct iommu_fault_param {
|
|||
};
|
||||
|
||||
/**
|
||||
* struct iommu_param - collection of per-device IOMMU data
|
||||
* struct dev_iommu - Collection of per-device IOMMU data
|
||||
*
|
||||
* @fault_param: IOMMU detected device fault reporting data
|
||||
* @fwspec: IOMMU fwspec data
|
||||
* @priv: IOMMU Driver private data
|
||||
*
|
||||
* TODO: migrate other per device data pointers under iommu_dev_data, e.g.
|
||||
* struct iommu_group *iommu_group;
|
||||
* struct iommu_fwspec *iommu_fwspec;
|
||||
*/
|
||||
struct iommu_param {
|
||||
struct dev_iommu {
|
||||
struct mutex lock;
|
||||
struct iommu_fault_param *fault_param;
|
||||
struct iommu_fault_param *fault_param;
|
||||
struct iommu_fwspec *fwspec;
|
||||
void *priv;
|
||||
};
|
||||
|
||||
int iommu_device_register(struct iommu_device *iommu);
|
||||
|
|
@ -588,11 +591,10 @@ struct iommu_group *fsl_mc_device_group(struct device *dev);
|
|||
struct iommu_fwspec {
|
||||
const struct iommu_ops *ops;
|
||||
struct fwnode_handle *iommu_fwnode;
|
||||
void *iommu_priv;
|
||||
u32 flags;
|
||||
u32 num_pasid_bits;
|
||||
unsigned int num_ids;
|
||||
u32 ids[1];
|
||||
u32 ids[];
|
||||
};
|
||||
|
||||
/* ATS is supported */
|
||||
|
|
@ -614,13 +616,26 @@ const struct iommu_ops *iommu_ops_from_fwnode(struct fwnode_handle *fwnode);
|
|||
|
||||
static inline struct iommu_fwspec *dev_iommu_fwspec_get(struct device *dev)
|
||||
{
|
||||
return dev->iommu_fwspec;
|
||||
if (dev->iommu)
|
||||
return dev->iommu->fwspec;
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline void dev_iommu_fwspec_set(struct device *dev,
|
||||
struct iommu_fwspec *fwspec)
|
||||
{
|
||||
dev->iommu_fwspec = fwspec;
|
||||
dev->iommu->fwspec = fwspec;
|
||||
}
|
||||
|
||||
static inline void *dev_iommu_priv_get(struct device *dev)
|
||||
{
|
||||
return dev->iommu->priv;
|
||||
}
|
||||
|
||||
static inline void dev_iommu_priv_set(struct device *dev, void *priv)
|
||||
{
|
||||
dev->iommu->priv = priv;
|
||||
}
|
||||
|
||||
int iommu_probe_device(struct device *dev);
|
||||
|
|
@ -1073,6 +1088,10 @@ static inline int iommu_sva_unbind_gpasid(struct iommu_domain *domain,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
static inline struct iommu_fwspec *dev_iommu_fwspec_get(struct device *dev)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
#endif /* CONFIG_IOMMU_API */
|
||||
|
||||
#ifdef CONFIG_IOMMU_DEBUGFS
|
||||
|
|
|
|||
|
|
@ -573,8 +573,6 @@ enum {
|
|||
#define IRQ_DEFAULT_INIT_FLAGS ARCH_IRQ_INIT_FLAGS
|
||||
|
||||
struct irqaction;
|
||||
extern int setup_irq(unsigned int irq, struct irqaction *new);
|
||||
extern void remove_irq(unsigned int irq, struct irqaction *act);
|
||||
extern int setup_percpu_irq(unsigned int irq, struct irqaction *new);
|
||||
extern void remove_percpu_irq(unsigned int irq, struct irqaction *act);
|
||||
|
||||
|
|
@ -1043,7 +1041,7 @@ struct irq_chip_generic {
|
|||
unsigned long unused;
|
||||
struct irq_domain *domain;
|
||||
struct list_head list;
|
||||
struct irq_chip_type chip_types[0];
|
||||
struct irq_chip_type chip_types[];
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1079,7 +1077,7 @@ struct irq_domain_chip_generic {
|
|||
unsigned int irq_flags_to_clear;
|
||||
unsigned int irq_flags_to_set;
|
||||
enum irq_gc_flags gc_flags;
|
||||
struct irq_chip_generic *gc[0];
|
||||
struct irq_chip_generic *gc[];
|
||||
};
|
||||
|
||||
/* Generic chip callback functions */
|
||||
|
|
|
|||
|
|
@ -243,6 +243,7 @@
|
|||
|
||||
#define GICR_TYPER_PLPIS (1U << 0)
|
||||
#define GICR_TYPER_VLPIS (1U << 1)
|
||||
#define GICR_TYPER_DIRTY (1U << 2)
|
||||
#define GICR_TYPER_DirectLPIS (1U << 3)
|
||||
#define GICR_TYPER_LAST (1U << 4)
|
||||
#define GICR_TYPER_RVPEID (1U << 7)
|
||||
|
|
@ -686,6 +687,7 @@ struct rdists {
|
|||
bool has_vlpis;
|
||||
bool has_rvpeid;
|
||||
bool has_direct_lpi;
|
||||
bool has_vpend_valid_dirty;
|
||||
};
|
||||
|
||||
struct irq_domain;
|
||||
|
|
|
|||
|
|
@ -58,16 +58,21 @@ do { \
|
|||
} while (0)
|
||||
|
||||
# define lockdep_hrtimer_enter(__hrtimer) \
|
||||
do { \
|
||||
if (!__hrtimer->is_hard) \
|
||||
current->irq_config = 1; \
|
||||
} while (0)
|
||||
({ \
|
||||
bool __expires_hardirq = true; \
|
||||
\
|
||||
if (!__hrtimer->is_hard) { \
|
||||
current->irq_config = 1; \
|
||||
__expires_hardirq = false; \
|
||||
} \
|
||||
__expires_hardirq; \
|
||||
})
|
||||
|
||||
# define lockdep_hrtimer_exit(__hrtimer) \
|
||||
do { \
|
||||
if (!__hrtimer->is_hard) \
|
||||
# define lockdep_hrtimer_exit(__expires_hardirq) \
|
||||
do { \
|
||||
if (!__expires_hardirq) \
|
||||
current->irq_config = 0; \
|
||||
} while (0)
|
||||
} while (0)
|
||||
|
||||
# define lockdep_posixtimer_enter() \
|
||||
do { \
|
||||
|
|
@ -102,8 +107,8 @@ do { \
|
|||
# define lockdep_hardirq_exit() do { } while (0)
|
||||
# define lockdep_softirq_enter() do { } while (0)
|
||||
# define lockdep_softirq_exit() do { } while (0)
|
||||
# define lockdep_hrtimer_enter(__hrtimer) do { } while (0)
|
||||
# define lockdep_hrtimer_exit(__hrtimer) do { } while (0)
|
||||
# define lockdep_hrtimer_enter(__hrtimer) false
|
||||
# define lockdep_hrtimer_exit(__context) do { } while (0)
|
||||
# define lockdep_posixtimer_enter() do { } while (0)
|
||||
# define lockdep_posixtimer_exit() do { } while (0)
|
||||
# define lockdep_irq_work_enter(__work) do { } while (0)
|
||||
|
|
|
|||
|
|
@ -37,8 +37,10 @@ enum kernfs_node_type {
|
|||
KERNFS_LINK = 0x0004,
|
||||
};
|
||||
|
||||
#define KERNFS_TYPE_MASK 0x000f
|
||||
#define KERNFS_FLAG_MASK ~KERNFS_TYPE_MASK
|
||||
#define KERNFS_TYPE_MASK 0x000f
|
||||
#define KERNFS_FLAG_MASK ~KERNFS_TYPE_MASK
|
||||
#define KERNFS_MAX_USER_XATTRS 128
|
||||
#define KERNFS_USER_XATTR_SIZE_LIMIT (128 << 10)
|
||||
|
||||
enum kernfs_node_flag {
|
||||
KERNFS_ACTIVATED = 0x0010,
|
||||
|
|
@ -78,6 +80,11 @@ enum kernfs_root_flag {
|
|||
* fhandle to access nodes of the fs.
|
||||
*/
|
||||
KERNFS_ROOT_SUPPORT_EXPORTOP = 0x0004,
|
||||
|
||||
/*
|
||||
* Support user xattrs to be written to nodes rooted at this root.
|
||||
*/
|
||||
KERNFS_ROOT_SUPPORT_USER_XATTR = 0x0008,
|
||||
};
|
||||
|
||||
/* type-specific structures for kernfs_node union members */
|
||||
|
|
|
|||
|
|
@ -127,7 +127,7 @@ struct key_type {
|
|||
* much is copied into the buffer
|
||||
* - shouldn't do the copy if the buffer is NULL
|
||||
*/
|
||||
long (*read)(const struct key *key, char __user *buffer, size_t buflen);
|
||||
long (*read)(const struct key *key, char *buffer, size_t buflen);
|
||||
|
||||
/* handle request_key() for this type instead of invoking
|
||||
* /sbin/request-key (optional)
|
||||
|
|
|
|||
|
|
@ -246,6 +246,37 @@ __kfifo_int_must_check_helper(int val)
|
|||
__tmpq->kfifo.in == __tmpq->kfifo.out; \
|
||||
})
|
||||
|
||||
/**
|
||||
* kfifo_is_empty_spinlocked - returns true if the fifo is empty using
|
||||
* a spinlock for locking
|
||||
* @fifo: address of the fifo to be used
|
||||
* @lock: spinlock to be used for locking
|
||||
*/
|
||||
#define kfifo_is_empty_spinlocked(fifo, lock) \
|
||||
({ \
|
||||
unsigned long __flags; \
|
||||
bool __ret; \
|
||||
spin_lock_irqsave(lock, __flags); \
|
||||
__ret = kfifo_is_empty(fifo); \
|
||||
spin_unlock_irqrestore(lock, __flags); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
/**
|
||||
* kfifo_is_empty_spinlocked_noirqsave - returns true if the fifo is empty
|
||||
* using a spinlock for locking, doesn't disable interrupts
|
||||
* @fifo: address of the fifo to be used
|
||||
* @lock: spinlock to be used for locking
|
||||
*/
|
||||
#define kfifo_is_empty_spinlocked_noirqsave(fifo, lock) \
|
||||
({ \
|
||||
bool __ret; \
|
||||
spin_lock(lock); \
|
||||
__ret = kfifo_is_empty(fifo); \
|
||||
spin_unlock(lock); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
/**
|
||||
* kfifo_is_full - returns true if the fifo is full
|
||||
* @fifo: address of the fifo to be used
|
||||
|
|
@ -517,6 +548,26 @@ __kfifo_uint_must_check_helper( \
|
|||
__ret; \
|
||||
})
|
||||
|
||||
/**
|
||||
* kfifo_in_spinlocked_noirqsave - put data into fifo using a spinlock for
|
||||
* locking, don't disable interrupts
|
||||
* @fifo: address of the fifo to be used
|
||||
* @buf: the data to be added
|
||||
* @n: number of elements to be added
|
||||
* @lock: pointer to the spinlock to use for locking
|
||||
*
|
||||
* This is a variant of kfifo_in_spinlocked() but uses spin_lock/unlock()
|
||||
* for locking and doesn't disable interrupts.
|
||||
*/
|
||||
#define kfifo_in_spinlocked_noirqsave(fifo, buf, n, lock) \
|
||||
({ \
|
||||
unsigned int __ret; \
|
||||
spin_lock(lock); \
|
||||
__ret = kfifo_in(fifo, buf, n); \
|
||||
spin_unlock(lock); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
/* alias for kfifo_in_spinlocked, will be removed in a future release */
|
||||
#define kfifo_in_locked(fifo, buf, n, lock) \
|
||||
kfifo_in_spinlocked(fifo, buf, n, lock)
|
||||
|
|
@ -569,6 +620,28 @@ __kfifo_uint_must_check_helper( \
|
|||
}) \
|
||||
)
|
||||
|
||||
/**
|
||||
* kfifo_out_spinlocked_noirqsave - get data from the fifo using a spinlock
|
||||
* for locking, don't disable interrupts
|
||||
* @fifo: address of the fifo to be used
|
||||
* @buf: pointer to the storage buffer
|
||||
* @n: max. number of elements to get
|
||||
* @lock: pointer to the spinlock to use for locking
|
||||
*
|
||||
* This is a variant of kfifo_out_spinlocked() which uses spin_lock/unlock()
|
||||
* for locking and doesn't disable interrupts.
|
||||
*/
|
||||
#define kfifo_out_spinlocked_noirqsave(fifo, buf, n, lock) \
|
||||
__kfifo_uint_must_check_helper( \
|
||||
({ \
|
||||
unsigned int __ret; \
|
||||
spin_lock(lock); \
|
||||
__ret = kfifo_out(fifo, buf, n); \
|
||||
spin_unlock(lock); \
|
||||
__ret; \
|
||||
}) \
|
||||
)
|
||||
|
||||
/* alias for kfifo_out_spinlocked, will be removed in a future release */
|
||||
#define kfifo_out_locked(fifo, buf, n, lock) \
|
||||
kfifo_out_spinlocked(fifo, buf, n, lock)
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ struct device_node;
|
|||
* LED Core
|
||||
*/
|
||||
|
||||
/* This is obsolete/useless. We now support variable maximum brightness. */
|
||||
enum led_brightness {
|
||||
LED_OFF = 0,
|
||||
LED_ON = 1,
|
||||
|
|
|
|||
|
|
@ -1,22 +0,0 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* PWM LED driver data - see drivers/leds/leds-pwm.c
|
||||
*/
|
||||
#ifndef __LINUX_LEDS_PWM_H
|
||||
#define __LINUX_LEDS_PWM_H
|
||||
|
||||
struct led_pwm {
|
||||
const char *name;
|
||||
const char *default_trigger;
|
||||
unsigned pwm_id __deprecated;
|
||||
u8 active_low;
|
||||
unsigned max_brightness;
|
||||
unsigned pwm_period_ns;
|
||||
};
|
||||
|
||||
struct led_pwm_platform_data {
|
||||
int num_leds;
|
||||
struct led_pwm *leds;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -37,6 +37,8 @@ enum {
|
|||
NDD_WORK_PENDING = 4,
|
||||
/* ignore / filter NSLABEL_FLAG_LOCAL for this DIMM, i.e. no aliasing */
|
||||
NDD_NOBLK = 5,
|
||||
/* dimm supports namespace labels */
|
||||
NDD_LABELING = 6,
|
||||
|
||||
/* need to set a limit somewhere, but yes, this is likely overkill */
|
||||
ND_IOCTL_MAX_BUFLEN = SZ_4M,
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ struct list_lru_one {
|
|||
struct list_lru_memcg {
|
||||
struct rcu_head rcu;
|
||||
/* array of per cgroup lists, indexed by memcg_cache_id */
|
||||
struct list_lru_one *lru[0];
|
||||
struct list_lru_one *lru[];
|
||||
};
|
||||
|
||||
struct list_lru_node {
|
||||
|
|
|
|||
|
|
@ -348,6 +348,9 @@ static inline int memblock_get_region_node(const struct memblock_region *r)
|
|||
|
||||
phys_addr_t memblock_phys_alloc_range(phys_addr_t size, phys_addr_t align,
|
||||
phys_addr_t start, phys_addr_t end);
|
||||
phys_addr_t memblock_alloc_range_nid(phys_addr_t size,
|
||||
phys_addr_t align, phys_addr_t start,
|
||||
phys_addr_t end, int nid, bool exact_nid);
|
||||
phys_addr_t memblock_phys_alloc_try_nid(phys_addr_t size, phys_addr_t align, int nid);
|
||||
|
||||
static inline phys_addr_t memblock_phys_alloc(phys_addr_t size,
|
||||
|
|
|
|||
|
|
@ -106,7 +106,7 @@ struct lruvec_stat {
|
|||
*/
|
||||
struct memcg_shrinker_map {
|
||||
struct rcu_head rcu;
|
||||
unsigned long map[0];
|
||||
unsigned long map[];
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -148,7 +148,7 @@ struct mem_cgroup_threshold_ary {
|
|||
/* Size of entries[] */
|
||||
unsigned int size;
|
||||
/* Array of thresholds */
|
||||
struct mem_cgroup_threshold entries[0];
|
||||
struct mem_cgroup_threshold entries[];
|
||||
};
|
||||
|
||||
struct mem_cgroup_thresholds {
|
||||
|
|
|
|||
|
|
@ -26,7 +26,6 @@
|
|||
struct memory_block {
|
||||
unsigned long start_section_nr;
|
||||
unsigned long state; /* serialized by the dev->lock */
|
||||
int section_count; /* serialized by mem_sysfs_mutex */
|
||||
int online_type; /* for passing data to online routine */
|
||||
int phys_device; /* to which fru does this belong? */
|
||||
struct device dev;
|
||||
|
|
|
|||
|
|
@ -47,20 +47,25 @@ enum {
|
|||
|
||||
/* Types for control the zone type of onlined and offlined memory */
|
||||
enum {
|
||||
MMOP_OFFLINE = -1,
|
||||
MMOP_ONLINE_KEEP,
|
||||
/* Offline the memory. */
|
||||
MMOP_OFFLINE = 0,
|
||||
/* Online the memory. Zone depends, see default_zone_for_pfn(). */
|
||||
MMOP_ONLINE,
|
||||
/* Online the memory to ZONE_NORMAL. */
|
||||
MMOP_ONLINE_KERNEL,
|
||||
/* Online the memory to ZONE_MOVABLE. */
|
||||
MMOP_ONLINE_MOVABLE,
|
||||
};
|
||||
|
||||
/*
|
||||
* Restrictions for the memory hotplug:
|
||||
* flags: MHP_ flags
|
||||
* altmap: alternative allocator for memmap array
|
||||
* Extended parameters for memory hotplug:
|
||||
* altmap: alternative allocator for memmap array (optional)
|
||||
* pgprot: page protection flags to apply to newly created page tables
|
||||
* (required)
|
||||
*/
|
||||
struct mhp_restrictions {
|
||||
unsigned long flags;
|
||||
struct mhp_params {
|
||||
struct vmem_altmap *altmap;
|
||||
pgprot_t pgprot;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -110,10 +115,13 @@ extern int restore_online_page_callback(online_page_callback_t callback);
|
|||
extern int try_online_node(int nid);
|
||||
|
||||
extern int arch_add_memory(int nid, u64 start, u64 size,
|
||||
struct mhp_restrictions *restrictions);
|
||||
struct mhp_params *params);
|
||||
extern u64 max_mem_size;
|
||||
|
||||
extern bool memhp_auto_online;
|
||||
extern int memhp_online_type_from_str(const char *str);
|
||||
|
||||
/* Default online_type (MMOP_*) when new memory blocks are added. */
|
||||
extern int memhp_default_online_type;
|
||||
/* If movable_node boot option specified */
|
||||
extern bool movable_node_enabled;
|
||||
static inline bool movable_node_is_enabled(void)
|
||||
|
|
@ -128,17 +136,17 @@ extern void __remove_pages(unsigned long start_pfn, unsigned long nr_pages,
|
|||
|
||||
/* reasonably generic interface to expand the physical pages */
|
||||
extern int __add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages,
|
||||
struct mhp_restrictions *restrictions);
|
||||
struct mhp_params *params);
|
||||
|
||||
#ifndef CONFIG_ARCH_HAS_ADD_PAGES
|
||||
static inline int add_pages(int nid, unsigned long start_pfn,
|
||||
unsigned long nr_pages, struct mhp_restrictions *restrictions)
|
||||
unsigned long nr_pages, struct mhp_params *params)
|
||||
{
|
||||
return __add_pages(nid, start_pfn, nr_pages, restrictions);
|
||||
return __add_pages(nid, start_pfn, nr_pages, params);
|
||||
}
|
||||
#else /* ARCH_HAS_ADD_PAGES */
|
||||
int add_pages(int nid, unsigned long start_pfn, unsigned long nr_pages,
|
||||
struct mhp_restrictions *restrictions);
|
||||
struct mhp_params *params);
|
||||
#endif /* ARCH_HAS_ADD_PAGES */
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
|
|
|
|||
|
|
@ -98,8 +98,6 @@ struct dev_pagemap_ops {
|
|||
* @ref: reference count that pins the devm_memremap_pages() mapping
|
||||
* @internal_ref: internal reference if @ref is not provided by the caller
|
||||
* @done: completion for @internal_ref
|
||||
* @dev: host device of the mapping for debug
|
||||
* @data: private data pointer for page_free()
|
||||
* @type: memory type: see MEMORY_* in memory_hotplug.h
|
||||
* @flags: PGMAP_* flags to specify defailed behavior
|
||||
* @ops: method table
|
||||
|
|
@ -136,6 +134,7 @@ struct dev_pagemap *get_dev_pagemap(unsigned long pfn,
|
|||
|
||||
unsigned long vmem_altmap_offset(struct vmem_altmap *altmap);
|
||||
void vmem_altmap_free(struct vmem_altmap *altmap, unsigned long nr_pfns);
|
||||
unsigned long memremap_compat_align(void);
|
||||
#else
|
||||
static inline void *devm_memremap_pages(struct device *dev,
|
||||
struct dev_pagemap *pgmap)
|
||||
|
|
@ -169,6 +168,12 @@ static inline void vmem_altmap_free(struct vmem_altmap *altmap,
|
|||
unsigned long nr_pfns)
|
||||
{
|
||||
}
|
||||
|
||||
/* when memremap_pages() is disabled all archs can remap a single page */
|
||||
static inline unsigned long memremap_compat_align(void)
|
||||
{
|
||||
return PAGE_SIZE;
|
||||
}
|
||||
#endif /* CONFIG_ZONE_DEVICE */
|
||||
|
||||
static inline void put_dev_pagemap(struct dev_pagemap *pgmap)
|
||||
|
|
@ -176,4 +181,5 @@ static inline void put_dev_pagemap(struct dev_pagemap *pgmap)
|
|||
if (pgmap)
|
||||
percpu_ref_put(pgmap->ref);
|
||||
}
|
||||
|
||||
#endif /* _LINUX_MEMREMAP_H_ */
|
||||
|
|
|
|||
139
include/linux/mfd/iqs62x.h
Normal file
139
include/linux/mfd/iqs62x.h
Normal file
|
|
@ -0,0 +1,139 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Azoteq IQS620A/621/622/624/625 Multi-Function Sensors
|
||||
*
|
||||
* Copyright (C) 2019 Jeff LaBundy <jeff@labundy.com>
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_MFD_IQS62X_H
|
||||
#define __LINUX_MFD_IQS62X_H
|
||||
|
||||
#define IQS620_PROD_NUM 0x41
|
||||
#define IQS621_PROD_NUM 0x46
|
||||
#define IQS622_PROD_NUM 0x42
|
||||
#define IQS624_PROD_NUM 0x43
|
||||
#define IQS625_PROD_NUM 0x4E
|
||||
|
||||
#define IQS621_ALS_FLAGS 0x16
|
||||
#define IQS622_ALS_FLAGS 0x14
|
||||
|
||||
#define IQS624_HALL_UI 0x70
|
||||
#define IQS624_HALL_UI_WHL_EVENT BIT(4)
|
||||
#define IQS624_HALL_UI_INT_EVENT BIT(3)
|
||||
#define IQS624_HALL_UI_AUTO_CAL BIT(2)
|
||||
|
||||
#define IQS624_INTERVAL_DIV 0x7D
|
||||
|
||||
#define IQS620_GLBL_EVENT_MASK 0xD7
|
||||
#define IQS620_GLBL_EVENT_MASK_PMU BIT(6)
|
||||
|
||||
#define IQS62X_NUM_KEYS 16
|
||||
#define IQS62X_NUM_EVENTS (IQS62X_NUM_KEYS + 5)
|
||||
|
||||
#define IQS62X_EVENT_SIZE 10
|
||||
|
||||
enum iqs62x_ui_sel {
|
||||
IQS62X_UI_PROX,
|
||||
IQS62X_UI_SAR1,
|
||||
};
|
||||
|
||||
enum iqs62x_event_reg {
|
||||
IQS62X_EVENT_NONE,
|
||||
IQS62X_EVENT_SYS,
|
||||
IQS62X_EVENT_PROX,
|
||||
IQS62X_EVENT_HYST,
|
||||
IQS62X_EVENT_HALL,
|
||||
IQS62X_EVENT_ALS,
|
||||
IQS62X_EVENT_IR,
|
||||
IQS62X_EVENT_WHEEL,
|
||||
IQS62X_EVENT_INTER,
|
||||
IQS62X_EVENT_UI_LO,
|
||||
IQS62X_EVENT_UI_HI,
|
||||
};
|
||||
|
||||
enum iqs62x_event_flag {
|
||||
/* keys */
|
||||
IQS62X_EVENT_PROX_CH0_T,
|
||||
IQS62X_EVENT_PROX_CH0_P,
|
||||
IQS62X_EVENT_PROX_CH1_T,
|
||||
IQS62X_EVENT_PROX_CH1_P,
|
||||
IQS62X_EVENT_PROX_CH2_T,
|
||||
IQS62X_EVENT_PROX_CH2_P,
|
||||
IQS62X_EVENT_HYST_POS_T,
|
||||
IQS62X_EVENT_HYST_POS_P,
|
||||
IQS62X_EVENT_HYST_NEG_T,
|
||||
IQS62X_EVENT_HYST_NEG_P,
|
||||
IQS62X_EVENT_SAR1_ACT,
|
||||
IQS62X_EVENT_SAR1_QRD,
|
||||
IQS62X_EVENT_SAR1_MOVE,
|
||||
IQS62X_EVENT_SAR1_HALT,
|
||||
IQS62X_EVENT_WHEEL_UP,
|
||||
IQS62X_EVENT_WHEEL_DN,
|
||||
|
||||
/* switches */
|
||||
IQS62X_EVENT_HALL_N_T,
|
||||
IQS62X_EVENT_HALL_N_P,
|
||||
IQS62X_EVENT_HALL_S_T,
|
||||
IQS62X_EVENT_HALL_S_P,
|
||||
|
||||
/* everything else */
|
||||
IQS62X_EVENT_SYS_RESET,
|
||||
};
|
||||
|
||||
struct iqs62x_event_data {
|
||||
u16 ui_data;
|
||||
u8 als_flags;
|
||||
u8 ir_flags;
|
||||
u8 interval;
|
||||
};
|
||||
|
||||
struct iqs62x_event_desc {
|
||||
enum iqs62x_event_reg reg;
|
||||
u8 mask;
|
||||
u8 val;
|
||||
};
|
||||
|
||||
struct iqs62x_dev_desc {
|
||||
const char *dev_name;
|
||||
const struct mfd_cell *sub_devs;
|
||||
int num_sub_devs;
|
||||
|
||||
u8 prod_num;
|
||||
u8 sw_num;
|
||||
const u8 *cal_regs;
|
||||
int num_cal_regs;
|
||||
|
||||
u8 prox_mask;
|
||||
u8 sar_mask;
|
||||
u8 hall_mask;
|
||||
u8 hyst_mask;
|
||||
u8 temp_mask;
|
||||
u8 als_mask;
|
||||
u8 ir_mask;
|
||||
|
||||
u8 prox_settings;
|
||||
u8 als_flags;
|
||||
u8 hall_flags;
|
||||
u8 hyst_shift;
|
||||
|
||||
u8 interval;
|
||||
u8 interval_div;
|
||||
|
||||
u8 clk_div;
|
||||
const char *fw_name;
|
||||
const enum iqs62x_event_reg (*event_regs)[IQS62X_EVENT_SIZE];
|
||||
};
|
||||
|
||||
struct iqs62x_core {
|
||||
const struct iqs62x_dev_desc *dev_desc;
|
||||
struct i2c_client *client;
|
||||
struct regmap *regmap;
|
||||
struct blocking_notifier_head nh;
|
||||
struct list_head fw_blk_head;
|
||||
struct completion fw_done;
|
||||
enum iqs62x_ui_sel ui_sel;
|
||||
};
|
||||
|
||||
extern const struct iqs62x_event_desc iqs62x_events[IQS62X_NUM_EVENTS];
|
||||
|
||||
#endif /* __LINUX_MFD_IQS62X_H */
|
||||
|
|
@ -620,7 +620,5 @@ struct rk808 {
|
|||
long variant;
|
||||
const struct regmap_config *regmap_cfg;
|
||||
const struct regmap_irq_chip *regmap_irq_chip;
|
||||
void (*pm_pwroff_fn)(void);
|
||||
void (*pm_pwroff_prep_fn)(void);
|
||||
};
|
||||
#endif /* __LINUX_REGULATOR_RK808_H */
|
||||
|
|
|
|||
|
|
@ -139,6 +139,17 @@
|
|||
#define RN5T618_INTPOL 0x9c
|
||||
#define RN5T618_INTEN 0x9d
|
||||
#define RN5T618_INTMON 0x9e
|
||||
|
||||
#define RN5T618_RTC_SECONDS 0xA0
|
||||
#define RN5T618_RTC_MDAY 0xA4
|
||||
#define RN5T618_RTC_MONTH 0xA5
|
||||
#define RN5T618_RTC_YEAR 0xA6
|
||||
#define RN5T618_RTC_ADJUST 0xA7
|
||||
#define RN5T618_RTC_ALARM_Y_SEC 0xA8
|
||||
#define RN5T618_RTC_DAL_MONTH 0xAC
|
||||
#define RN5T618_RTC_CTRL1 0xAE
|
||||
#define RN5T618_RTC_CTRL2 0xAF
|
||||
|
||||
#define RN5T618_PREVINDAC 0xb0
|
||||
#define RN5T618_BATDAC 0xb1
|
||||
#define RN5T618_CHGCTL1 0xb3
|
||||
|
|
@ -242,9 +253,24 @@ enum {
|
|||
RC5T619,
|
||||
};
|
||||
|
||||
/* RN5T618 IRQ definitions */
|
||||
enum {
|
||||
RN5T618_IRQ_SYS = 0,
|
||||
RN5T618_IRQ_DCDC,
|
||||
RN5T618_IRQ_RTC,
|
||||
RN5T618_IRQ_ADC,
|
||||
RN5T618_IRQ_GPIO,
|
||||
RN5T618_IRQ_CHG,
|
||||
RN5T618_NR_IRQS,
|
||||
};
|
||||
|
||||
struct rn5t618 {
|
||||
struct regmap *regmap;
|
||||
struct device *dev;
|
||||
long variant;
|
||||
|
||||
int irq;
|
||||
struct regmap_irq_chip_data *irq_data;
|
||||
};
|
||||
|
||||
#endif /* __LINUX_MFD_RN5T618_H */
|
||||
|
|
|
|||
7
include/linux/mfd/sc27xx-pmic.h
Normal file
7
include/linux/mfd/sc27xx-pmic.h
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __LINUX_MFD_SC27XX_PMIC_H
|
||||
#define __LINUX_MFD_SC27XX_PMIC_H
|
||||
|
||||
extern enum usb_charger_type sprd_pmic_detect_charger_type(struct device *dev);
|
||||
|
||||
#endif /* __LINUX_MFD_SC27XX_PMIC_H */
|
||||
|
|
@ -89,7 +89,6 @@ enum wm831x_watchdog_action {
|
|||
|
||||
struct wm831x_watchdog_pdata {
|
||||
enum wm831x_watchdog_action primary, secondary;
|
||||
int update_gpio;
|
||||
unsigned int software:1;
|
||||
};
|
||||
|
||||
|
|
|
|||
700
include/linux/mhi.h
Normal file
700
include/linux/mhi.h
Normal file
|
|
@ -0,0 +1,700 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
*/
|
||||
#ifndef _MHI_H_
|
||||
#define _MHI_H_
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-direction.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/rwlock_types.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock_types.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/workqueue.h>
|
||||
|
||||
struct mhi_chan;
|
||||
struct mhi_event;
|
||||
struct mhi_ctxt;
|
||||
struct mhi_cmd;
|
||||
struct mhi_buf_info;
|
||||
|
||||
/**
|
||||
* enum mhi_callback - MHI callback
|
||||
* @MHI_CB_IDLE: MHI entered idle state
|
||||
* @MHI_CB_PENDING_DATA: New data available for client to process
|
||||
* @MHI_CB_LPM_ENTER: MHI host entered low power mode
|
||||
* @MHI_CB_LPM_EXIT: MHI host about to exit low power mode
|
||||
* @MHI_CB_EE_RDDM: MHI device entered RDDM exec env
|
||||
* @MHI_CB_EE_MISSION_MODE: MHI device entered Mission Mode exec env
|
||||
* @MHI_CB_SYS_ERROR: MHI device entered error state (may recover)
|
||||
* @MHI_CB_FATAL_ERROR: MHI device entered fatal error state
|
||||
* @MHI_CB_BW_REQ: Received a bandwidth switch request from device
|
||||
*/
|
||||
enum mhi_callback {
|
||||
MHI_CB_IDLE,
|
||||
MHI_CB_PENDING_DATA,
|
||||
MHI_CB_LPM_ENTER,
|
||||
MHI_CB_LPM_EXIT,
|
||||
MHI_CB_EE_RDDM,
|
||||
MHI_CB_EE_MISSION_MODE,
|
||||
MHI_CB_SYS_ERROR,
|
||||
MHI_CB_FATAL_ERROR,
|
||||
MHI_CB_BW_REQ,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_flags - Transfer flags
|
||||
* @MHI_EOB: End of buffer for bulk transfer
|
||||
* @MHI_EOT: End of transfer
|
||||
* @MHI_CHAIN: Linked transfer
|
||||
*/
|
||||
enum mhi_flags {
|
||||
MHI_EOB,
|
||||
MHI_EOT,
|
||||
MHI_CHAIN,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_device_type - Device types
|
||||
* @MHI_DEVICE_XFER: Handles data transfer
|
||||
* @MHI_DEVICE_CONTROLLER: Control device
|
||||
*/
|
||||
enum mhi_device_type {
|
||||
MHI_DEVICE_XFER,
|
||||
MHI_DEVICE_CONTROLLER,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_ch_type - Channel types
|
||||
* @MHI_CH_TYPE_INVALID: Invalid channel type
|
||||
* @MHI_CH_TYPE_OUTBOUND: Outbound channel to the device
|
||||
* @MHI_CH_TYPE_INBOUND: Inbound channel from the device
|
||||
* @MHI_CH_TYPE_INBOUND_COALESCED: Coalesced channel for the device to combine
|
||||
* multiple packets and send them as a single
|
||||
* large packet to reduce CPU consumption
|
||||
*/
|
||||
enum mhi_ch_type {
|
||||
MHI_CH_TYPE_INVALID = 0,
|
||||
MHI_CH_TYPE_OUTBOUND = DMA_TO_DEVICE,
|
||||
MHI_CH_TYPE_INBOUND = DMA_FROM_DEVICE,
|
||||
MHI_CH_TYPE_INBOUND_COALESCED = 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct image_info - Firmware and RDDM table table
|
||||
* @mhi_buf - Buffer for firmware and RDDM table
|
||||
* @entries - # of entries in table
|
||||
*/
|
||||
struct image_info {
|
||||
struct mhi_buf *mhi_buf;
|
||||
struct bhi_vec_entry *bhi_vec;
|
||||
u32 entries;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_link_info - BW requirement
|
||||
* target_link_speed - Link speed as defined by TLS bits in LinkControl reg
|
||||
* target_link_width - Link width as defined by NLW bits in LinkStatus reg
|
||||
*/
|
||||
struct mhi_link_info {
|
||||
unsigned int target_link_speed;
|
||||
unsigned int target_link_width;
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_ee_type - Execution environment types
|
||||
* @MHI_EE_PBL: Primary Bootloader
|
||||
* @MHI_EE_SBL: Secondary Bootloader
|
||||
* @MHI_EE_AMSS: Modem, aka the primary runtime EE
|
||||
* @MHI_EE_RDDM: Ram dump download mode
|
||||
* @MHI_EE_WFW: WLAN firmware mode
|
||||
* @MHI_EE_PTHRU: Passthrough
|
||||
* @MHI_EE_EDL: Embedded downloader
|
||||
*/
|
||||
enum mhi_ee_type {
|
||||
MHI_EE_PBL,
|
||||
MHI_EE_SBL,
|
||||
MHI_EE_AMSS,
|
||||
MHI_EE_RDDM,
|
||||
MHI_EE_WFW,
|
||||
MHI_EE_PTHRU,
|
||||
MHI_EE_EDL,
|
||||
MHI_EE_MAX_SUPPORTED = MHI_EE_EDL,
|
||||
MHI_EE_DISABLE_TRANSITION, /* local EE, not related to mhi spec */
|
||||
MHI_EE_NOT_SUPPORTED,
|
||||
MHI_EE_MAX,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_state - MHI states
|
||||
* @MHI_STATE_RESET: Reset state
|
||||
* @MHI_STATE_READY: Ready state
|
||||
* @MHI_STATE_M0: M0 state
|
||||
* @MHI_STATE_M1: M1 state
|
||||
* @MHI_STATE_M2: M2 state
|
||||
* @MHI_STATE_M3: M3 state
|
||||
* @MHI_STATE_M3_FAST: M3 Fast state
|
||||
* @MHI_STATE_BHI: BHI state
|
||||
* @MHI_STATE_SYS_ERR: System Error state
|
||||
*/
|
||||
enum mhi_state {
|
||||
MHI_STATE_RESET = 0x0,
|
||||
MHI_STATE_READY = 0x1,
|
||||
MHI_STATE_M0 = 0x2,
|
||||
MHI_STATE_M1 = 0x3,
|
||||
MHI_STATE_M2 = 0x4,
|
||||
MHI_STATE_M3 = 0x5,
|
||||
MHI_STATE_M3_FAST = 0x6,
|
||||
MHI_STATE_BHI = 0x7,
|
||||
MHI_STATE_SYS_ERR = 0xFF,
|
||||
MHI_STATE_MAX,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_ch_ee_mask - Execution environment mask for channel
|
||||
* @MHI_CH_EE_PBL: Allow channel to be used in PBL EE
|
||||
* @MHI_CH_EE_SBL: Allow channel to be used in SBL EE
|
||||
* @MHI_CH_EE_AMSS: Allow channel to be used in AMSS EE
|
||||
* @MHI_CH_EE_RDDM: Allow channel to be used in RDDM EE
|
||||
* @MHI_CH_EE_PTHRU: Allow channel to be used in PTHRU EE
|
||||
* @MHI_CH_EE_WFW: Allow channel to be used in WFW EE
|
||||
* @MHI_CH_EE_EDL: Allow channel to be used in EDL EE
|
||||
*/
|
||||
enum mhi_ch_ee_mask {
|
||||
MHI_CH_EE_PBL = BIT(MHI_EE_PBL),
|
||||
MHI_CH_EE_SBL = BIT(MHI_EE_SBL),
|
||||
MHI_CH_EE_AMSS = BIT(MHI_EE_AMSS),
|
||||
MHI_CH_EE_RDDM = BIT(MHI_EE_RDDM),
|
||||
MHI_CH_EE_PTHRU = BIT(MHI_EE_PTHRU),
|
||||
MHI_CH_EE_WFW = BIT(MHI_EE_WFW),
|
||||
MHI_CH_EE_EDL = BIT(MHI_EE_EDL),
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_er_data_type - Event ring data types
|
||||
* @MHI_ER_DATA: Only client data over this ring
|
||||
* @MHI_ER_CTRL: MHI control data and client data
|
||||
*/
|
||||
enum mhi_er_data_type {
|
||||
MHI_ER_DATA,
|
||||
MHI_ER_CTRL,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum mhi_db_brst_mode - Doorbell mode
|
||||
* @MHI_DB_BRST_DISABLE: Burst mode disable
|
||||
* @MHI_DB_BRST_ENABLE: Burst mode enable
|
||||
*/
|
||||
enum mhi_db_brst_mode {
|
||||
MHI_DB_BRST_DISABLE = 0x2,
|
||||
MHI_DB_BRST_ENABLE = 0x3,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_channel_config - Channel configuration structure for controller
|
||||
* @name: The name of this channel
|
||||
* @num: The number assigned to this channel
|
||||
* @num_elements: The number of elements that can be queued to this channel
|
||||
* @local_elements: The local ring length of the channel
|
||||
* @event_ring: The event rung index that services this channel
|
||||
* @dir: Direction that data may flow on this channel
|
||||
* @type: Channel type
|
||||
* @ee_mask: Execution Environment mask for this channel
|
||||
* @pollcfg: Polling configuration for burst mode. 0 is default. milliseconds
|
||||
for UL channels, multiple of 8 ring elements for DL channels
|
||||
* @doorbell: Doorbell mode
|
||||
* @lpm_notify: The channel master requires low power mode notifications
|
||||
* @offload_channel: The client manages the channel completely
|
||||
* @doorbell_mode_switch: Channel switches to doorbell mode on M0 transition
|
||||
* @auto_queue: Framework will automatically queue buffers for DL traffic
|
||||
* @auto_start: Automatically start (open) this channel
|
||||
* @wake-capable: Channel capable of waking up the system
|
||||
*/
|
||||
struct mhi_channel_config {
|
||||
char *name;
|
||||
u32 num;
|
||||
u32 num_elements;
|
||||
u32 local_elements;
|
||||
u32 event_ring;
|
||||
enum dma_data_direction dir;
|
||||
enum mhi_ch_type type;
|
||||
u32 ee_mask;
|
||||
u32 pollcfg;
|
||||
enum mhi_db_brst_mode doorbell;
|
||||
bool lpm_notify;
|
||||
bool offload_channel;
|
||||
bool doorbell_mode_switch;
|
||||
bool auto_queue;
|
||||
bool auto_start;
|
||||
bool wake_capable;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_event_config - Event ring configuration structure for controller
|
||||
* @num_elements: The number of elements that can be queued to this ring
|
||||
* @irq_moderation_ms: Delay irq for additional events to be aggregated
|
||||
* @irq: IRQ associated with this ring
|
||||
* @channel: Dedicated channel number. U32_MAX indicates a non-dedicated ring
|
||||
* @priority: Priority of this ring. Use 1 for now
|
||||
* @mode: Doorbell mode
|
||||
* @data_type: Type of data this ring will process
|
||||
* @hardware_event: This ring is associated with hardware channels
|
||||
* @client_managed: This ring is client managed
|
||||
* @offload_channel: This ring is associated with an offloaded channel
|
||||
*/
|
||||
struct mhi_event_config {
|
||||
u32 num_elements;
|
||||
u32 irq_moderation_ms;
|
||||
u32 irq;
|
||||
u32 channel;
|
||||
u32 priority;
|
||||
enum mhi_db_brst_mode mode;
|
||||
enum mhi_er_data_type data_type;
|
||||
bool hardware_event;
|
||||
bool client_managed;
|
||||
bool offload_channel;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_controller_config - Root MHI controller configuration
|
||||
* @max_channels: Maximum number of channels supported
|
||||
* @timeout_ms: Timeout value for operations. 0 means use default
|
||||
* @buf_len: Size of automatically allocated buffers. 0 means use default
|
||||
* @num_channels: Number of channels defined in @ch_cfg
|
||||
* @ch_cfg: Array of defined channels
|
||||
* @num_events: Number of event rings defined in @event_cfg
|
||||
* @event_cfg: Array of defined event rings
|
||||
* @use_bounce_buf: Use a bounce buffer pool due to limited DDR access
|
||||
* @m2_no_db: Host is not allowed to ring DB in M2 state
|
||||
*/
|
||||
struct mhi_controller_config {
|
||||
u32 max_channels;
|
||||
u32 timeout_ms;
|
||||
u32 buf_len;
|
||||
u32 num_channels;
|
||||
struct mhi_channel_config *ch_cfg;
|
||||
u32 num_events;
|
||||
struct mhi_event_config *event_cfg;
|
||||
bool use_bounce_buf;
|
||||
bool m2_no_db;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_controller - Master MHI controller structure
|
||||
* @cntrl_dev: Pointer to the struct device of physical bus acting as the MHI
|
||||
* controller (required)
|
||||
* @mhi_dev: MHI device instance for the controller
|
||||
* @regs: Base address of MHI MMIO register space (required)
|
||||
* @bhi: Points to base of MHI BHI register space
|
||||
* @bhie: Points to base of MHI BHIe register space
|
||||
* @wake_db: MHI WAKE doorbell register address
|
||||
* @iova_start: IOMMU starting address for data (required)
|
||||
* @iova_stop: IOMMU stop address for data (required)
|
||||
* @fw_image: Firmware image name for normal booting (required)
|
||||
* @edl_image: Firmware image name for emergency download mode (optional)
|
||||
* @rddm_size: RAM dump size that host should allocate for debugging purpose
|
||||
* @sbl_size: SBL image size downloaded through BHIe (optional)
|
||||
* @seg_len: BHIe vector size (optional)
|
||||
* @fbc_image: Points to firmware image buffer
|
||||
* @rddm_image: Points to RAM dump buffer
|
||||
* @mhi_chan: Points to the channel configuration table
|
||||
* @lpm_chans: List of channels that require LPM notifications
|
||||
* @irq: base irq # to request (required)
|
||||
* @max_chan: Maximum number of channels the controller supports
|
||||
* @total_ev_rings: Total # of event rings allocated
|
||||
* @hw_ev_rings: Number of hardware event rings
|
||||
* @sw_ev_rings: Number of software event rings
|
||||
* @nr_irqs_req: Number of IRQs required to operate (optional)
|
||||
* @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
|
||||
* @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
|
||||
* @pm_mutex: Mutex for suspend/resume operation
|
||||
* @pm_lock: Lock for protecting MHI power management state
|
||||
* @timeout_ms: Timeout in ms for state transitions
|
||||
* @pm_state: MHI power management state
|
||||
* @db_access: DB access states
|
||||
* @ee: MHI device execution environment
|
||||
* @dev_state: MHI device state
|
||||
* @dev_wake: Device wakeup count
|
||||
* @pending_pkts: Pending packets for the controller
|
||||
* @transition_list: List of MHI state transitions
|
||||
* @transition_lock: Lock for protecting MHI state transition list
|
||||
* @wlock: Lock for protecting device wakeup
|
||||
* @mhi_link_info: Device bandwidth info
|
||||
* @st_worker: State transition worker
|
||||
* @fw_worker: Firmware download worker
|
||||
* @syserr_worker: System error worker
|
||||
* @state_event: State change event
|
||||
* @status_cb: CB function to notify power states of the device (required)
|
||||
* @link_status: CB function to query link status of the device (required)
|
||||
* @wake_get: CB function to assert device wake (optional)
|
||||
* @wake_put: CB function to de-assert device wake (optional)
|
||||
* @wake_toggle: CB function to assert and de-assert device wake (optional)
|
||||
* @runtime_get: CB function to controller runtime resume (required)
|
||||
* @runtimet_put: CB function to decrement pm usage (required)
|
||||
* @map_single: CB function to create TRE buffer
|
||||
* @unmap_single: CB function to destroy TRE buffer
|
||||
* @buffer_len: Bounce buffer length
|
||||
* @bounce_buf: Use of bounce buffer
|
||||
* @fbc_download: MHI host needs to do complete image transfer (optional)
|
||||
* @pre_init: MHI host needs to do pre-initialization before power up
|
||||
* @wake_set: Device wakeup set flag
|
||||
*
|
||||
* 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;
|
||||
struct mhi_device *mhi_dev;
|
||||
void __iomem *regs;
|
||||
void __iomem *bhi;
|
||||
void __iomem *bhie;
|
||||
void __iomem *wake_db;
|
||||
|
||||
dma_addr_t iova_start;
|
||||
dma_addr_t iova_stop;
|
||||
const char *fw_image;
|
||||
const char *edl_image;
|
||||
size_t rddm_size;
|
||||
size_t sbl_size;
|
||||
size_t seg_len;
|
||||
struct image_info *fbc_image;
|
||||
struct image_info *rddm_image;
|
||||
struct mhi_chan *mhi_chan;
|
||||
struct list_head lpm_chans;
|
||||
int *irq;
|
||||
u32 max_chan;
|
||||
u32 total_ev_rings;
|
||||
u32 hw_ev_rings;
|
||||
u32 sw_ev_rings;
|
||||
u32 nr_irqs_req;
|
||||
u32 nr_irqs;
|
||||
u32 family_number;
|
||||
u32 device_number;
|
||||
u32 major_version;
|
||||
u32 minor_version;
|
||||
|
||||
struct mhi_event *mhi_event;
|
||||
struct mhi_cmd *mhi_cmd;
|
||||
struct mhi_ctxt *mhi_ctxt;
|
||||
|
||||
struct mutex pm_mutex;
|
||||
rwlock_t pm_lock;
|
||||
u32 timeout_ms;
|
||||
u32 pm_state;
|
||||
u32 db_access;
|
||||
enum mhi_ee_type ee;
|
||||
enum mhi_state dev_state;
|
||||
atomic_t dev_wake;
|
||||
atomic_t pending_pkts;
|
||||
struct list_head transition_list;
|
||||
spinlock_t transition_lock;
|
||||
spinlock_t wlock;
|
||||
struct mhi_link_info mhi_link_info;
|
||||
struct work_struct st_worker;
|
||||
struct work_struct fw_worker;
|
||||
struct work_struct syserr_worker;
|
||||
wait_queue_head_t state_event;
|
||||
|
||||
void (*status_cb)(struct mhi_controller *mhi_cntrl,
|
||||
enum mhi_callback cb);
|
||||
int (*link_status)(struct mhi_controller *mhi_cntrl);
|
||||
void (*wake_get)(struct mhi_controller *mhi_cntrl, bool override);
|
||||
void (*wake_put)(struct mhi_controller *mhi_cntrl, bool override);
|
||||
void (*wake_toggle)(struct mhi_controller *mhi_cntrl);
|
||||
int (*runtime_get)(struct mhi_controller *mhi_cntrl);
|
||||
void (*runtime_put)(struct mhi_controller *mhi_cntrl);
|
||||
int (*map_single)(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_buf_info *buf);
|
||||
void (*unmap_single)(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_buf_info *buf);
|
||||
|
||||
size_t buffer_len;
|
||||
bool bounce_buf;
|
||||
bool fbc_download;
|
||||
bool pre_init;
|
||||
bool wake_set;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_device - Structure representing a MHI device which binds
|
||||
* to channels
|
||||
* @id: Pointer to MHI device ID struct
|
||||
* @chan_name: Name of the channel to which the device binds
|
||||
* @mhi_cntrl: Controller the device belongs to
|
||||
* @ul_chan: UL channel for the device
|
||||
* @dl_chan: DL channel for the device
|
||||
* @dev: Driver model device node for the MHI device
|
||||
* @dev_type: MHI device type
|
||||
* @ul_chan_id: MHI channel id for UL transfer
|
||||
* @dl_chan_id: MHI channel id for DL transfer
|
||||
* @dev_wake: Device wakeup counter
|
||||
*/
|
||||
struct mhi_device {
|
||||
const struct mhi_device_id *id;
|
||||
const char *chan_name;
|
||||
struct mhi_controller *mhi_cntrl;
|
||||
struct mhi_chan *ul_chan;
|
||||
struct mhi_chan *dl_chan;
|
||||
struct device dev;
|
||||
enum mhi_device_type dev_type;
|
||||
int ul_chan_id;
|
||||
int dl_chan_id;
|
||||
u32 dev_wake;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_result - Completed buffer information
|
||||
* @buf_addr: Address of data buffer
|
||||
* @bytes_xferd: # of bytes transferred
|
||||
* @dir: Channel direction
|
||||
* @transaction_status: Status of last transaction
|
||||
*/
|
||||
struct mhi_result {
|
||||
void *buf_addr;
|
||||
size_t bytes_xferd;
|
||||
enum dma_data_direction dir;
|
||||
int transaction_status;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_buf - MHI Buffer description
|
||||
* @buf: Virtual address of the buffer
|
||||
* @name: Buffer label. For offload channel, configurations name must be:
|
||||
* ECA - Event context array data
|
||||
* CCA - Channel context array data
|
||||
* @dma_addr: IOMMU address of the buffer
|
||||
* @len: # of bytes
|
||||
*/
|
||||
struct mhi_buf {
|
||||
void *buf;
|
||||
const char *name;
|
||||
dma_addr_t dma_addr;
|
||||
size_t len;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mhi_driver - Structure representing a MHI client driver
|
||||
* @probe: CB function for client driver probe function
|
||||
* @remove: CB function for client driver remove function
|
||||
* @ul_xfer_cb: CB function for UL data transfer
|
||||
* @dl_xfer_cb: CB function for DL data transfer
|
||||
* @status_cb: CB functions for asynchronous status
|
||||
* @driver: Device driver model driver
|
||||
*/
|
||||
struct mhi_driver {
|
||||
const struct mhi_device_id *id_table;
|
||||
int (*probe)(struct mhi_device *mhi_dev,
|
||||
const struct mhi_device_id *id);
|
||||
void (*remove)(struct mhi_device *mhi_dev);
|
||||
void (*ul_xfer_cb)(struct mhi_device *mhi_dev,
|
||||
struct mhi_result *result);
|
||||
void (*dl_xfer_cb)(struct mhi_device *mhi_dev,
|
||||
struct mhi_result *result);
|
||||
void (*status_cb)(struct mhi_device *mhi_dev, enum mhi_callback mhi_cb);
|
||||
struct device_driver driver;
|
||||
};
|
||||
|
||||
#define to_mhi_driver(drv) container_of(drv, struct mhi_driver, driver)
|
||||
#define to_mhi_device(dev) container_of(dev, struct mhi_device, dev)
|
||||
|
||||
/**
|
||||
* mhi_register_controller - Register MHI controller
|
||||
* @mhi_cntrl: MHI controller to register
|
||||
* @config: Configuration to use for the controller
|
||||
*/
|
||||
int mhi_register_controller(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_controller_config *config);
|
||||
|
||||
/**
|
||||
* mhi_unregister_controller - Unregister MHI controller
|
||||
* @mhi_cntrl: MHI controller to unregister
|
||||
*/
|
||||
void mhi_unregister_controller(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/*
|
||||
* module_mhi_driver() - Helper macro for drivers that don't do
|
||||
* anything special other than using default mhi_driver_register() and
|
||||
* mhi_driver_unregister(). This eliminates a lot of boilerplate.
|
||||
* Each module may only use this macro once.
|
||||
*/
|
||||
#define module_mhi_driver(mhi_drv) \
|
||||
module_driver(mhi_drv, mhi_driver_register, \
|
||||
mhi_driver_unregister)
|
||||
|
||||
/*
|
||||
* Macro to avoid include chaining to get THIS_MODULE
|
||||
*/
|
||||
#define mhi_driver_register(mhi_drv) \
|
||||
__mhi_driver_register(mhi_drv, THIS_MODULE)
|
||||
|
||||
/**
|
||||
* __mhi_driver_register - Register driver with MHI framework
|
||||
* @mhi_drv: Driver associated with the device
|
||||
* @owner: The module owner
|
||||
*/
|
||||
int __mhi_driver_register(struct mhi_driver *mhi_drv, struct module *owner);
|
||||
|
||||
/**
|
||||
* mhi_driver_unregister - Unregister a driver for mhi_devices
|
||||
* @mhi_drv: Driver associated with the device
|
||||
*/
|
||||
void mhi_driver_unregister(struct mhi_driver *mhi_drv);
|
||||
|
||||
/**
|
||||
* mhi_set_mhi_state - Set MHI device state
|
||||
* @mhi_cntrl: MHI controller
|
||||
* @state: State to set
|
||||
*/
|
||||
void mhi_set_mhi_state(struct mhi_controller *mhi_cntrl,
|
||||
enum mhi_state state);
|
||||
|
||||
/**
|
||||
* mhi_prepare_for_power_up - Do pre-initialization before power up.
|
||||
* This is optional, call this before power up if
|
||||
* the controller does not want bus framework to
|
||||
* automatically free any allocated memory during
|
||||
* shutdown process.
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_async_power_up - Start MHI power up sequence
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_async_power_up(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_sync_power_up - Start MHI power up sequence and wait till the device
|
||||
* device enters valid EE state
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_sync_power_up(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_power_down - Start MHI power down sequence
|
||||
* @mhi_cntrl: MHI controller
|
||||
* @graceful: Link is still accessible, so do a graceful shutdown process
|
||||
*/
|
||||
void mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful);
|
||||
|
||||
/**
|
||||
* mhi_unprepare_after_power_down - Free any allocated memory after power down
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
void mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_download_rddm_img - Download ramdump image from device for
|
||||
* debugging purpose.
|
||||
* @mhi_cntrl: MHI controller
|
||||
* @in_panic: Download rddm image during kernel panic
|
||||
*/
|
||||
int mhi_download_rddm_img(struct mhi_controller *mhi_cntrl, bool in_panic);
|
||||
|
||||
/**
|
||||
* mhi_force_rddm_mode - Force device into rddm mode
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
int mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_get_mhi_state - Get MHI state of the device
|
||||
* @mhi_cntrl: MHI controller
|
||||
*/
|
||||
enum mhi_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl);
|
||||
|
||||
/**
|
||||
* mhi_device_get - Disable device low power mode
|
||||
* @mhi_dev: Device associated with the channel
|
||||
*/
|
||||
void mhi_device_get(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_device_get_sync - Disable device low power mode. Synchronously
|
||||
* take the controller out of suspended state
|
||||
* @mhi_dev: Device associated with the channel
|
||||
*/
|
||||
int mhi_device_get_sync(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_device_put - Re-enable device low power mode
|
||||
* @mhi_dev: Device associated with the channel
|
||||
*/
|
||||
void mhi_device_put(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_prepare_for_transfer - Setup channel for data transfer
|
||||
* @mhi_dev: Device associated with the channels
|
||||
*/
|
||||
int mhi_prepare_for_transfer(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_unprepare_from_transfer - Unprepare the channels
|
||||
* @mhi_dev: Device associated with the channels
|
||||
*/
|
||||
void mhi_unprepare_from_transfer(struct mhi_device *mhi_dev);
|
||||
|
||||
/**
|
||||
* mhi_poll - Poll for any available data in DL direction
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @budget: # of events to process
|
||||
*/
|
||||
int mhi_poll(struct mhi_device *mhi_dev, u32 budget);
|
||||
|
||||
/**
|
||||
* mhi_queue_dma - Send or receive DMA mapped buffers from client device
|
||||
* over MHI channel
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @dir: DMA direction for the channel
|
||||
* @mhi_buf: Buffer for holding the DMA mapped data
|
||||
* @len: Buffer length
|
||||
* @mflags: MHI transfer flags used for the transfer
|
||||
*/
|
||||
int mhi_queue_dma(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
struct mhi_buf *mhi_buf, size_t len, enum mhi_flags mflags);
|
||||
|
||||
/**
|
||||
* mhi_queue_buf - Send or receive raw buffers from client device over MHI
|
||||
* channel
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @dir: DMA direction for the channel
|
||||
* @buf: Buffer for holding the data
|
||||
* @len: Buffer length
|
||||
* @mflags: MHI transfer flags used for the transfer
|
||||
*/
|
||||
int mhi_queue_buf(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
void *buf, size_t len, enum mhi_flags mflags);
|
||||
|
||||
/**
|
||||
* mhi_queue_skb - Send or receive SKBs from client device over MHI channel
|
||||
* @mhi_dev: Device associated with the channels
|
||||
* @dir: DMA direction for the channel
|
||||
* @skb: Buffer for holding SKBs
|
||||
* @len: Buffer length
|
||||
* @mflags: MHI transfer flags used for the transfer
|
||||
*/
|
||||
int mhi_queue_skb(struct mhi_device *mhi_dev, enum dma_data_direction dir,
|
||||
struct sk_buff *skb, size_t len, enum mhi_flags mflags);
|
||||
|
||||
#endif /* _MHI_H_ */
|
||||
|
|
@ -25,20 +25,31 @@
|
|||
#define TEMP_MINOR 131 /* Temperature Sensor */
|
||||
#define APM_MINOR_DEV 134
|
||||
#define RTC_MINOR 135
|
||||
#define EFI_RTC_MINOR 136 /* EFI Time services */
|
||||
/*#define EFI_RTC_MINOR 136 was EFI Time services */
|
||||
#define VHCI_MINOR 137
|
||||
#define SUN_OPENPROM_MINOR 139
|
||||
#define DMAPI_MINOR 140 /* unused */
|
||||
#define NVRAM_MINOR 144
|
||||
#define SBUS_FLASH_MINOR 152
|
||||
#define SGI_MMTIMER 153
|
||||
#define PMU_MINOR 154
|
||||
#define STORE_QUEUE_MINOR 155 /* unused */
|
||||
#define LCD_MINOR 156
|
||||
#define AC_MINOR 157
|
||||
#define BUTTON_MINOR 158 /* Major 10, Minor 158, /dev/nwbutton */
|
||||
#define NWFLASH_MINOR 160 /* MAJOR is 10 - miscdevice */
|
||||
#define ENVCTRL_MINOR 162
|
||||
#define I2O_MINOR 166
|
||||
#define UCTRL_MINOR 174
|
||||
#define AGPGART_MINOR 175
|
||||
#define TOSH_MINOR_DEV 181
|
||||
#define HWRNG_MINOR 183
|
||||
#define MICROCODE_MINOR 184
|
||||
#define KEYPAD_MINOR 185
|
||||
#define IRNET_MINOR 187
|
||||
#define D7S_MINOR 193
|
||||
#define VFIO_MINOR 196
|
||||
#define PXA3XX_GCU_MINOR 197
|
||||
#define TUN_MINOR 200
|
||||
#define CUSE_MINOR 203
|
||||
#define MWAVE_MINOR 219 /* ACP/Mwave Modem */
|
||||
|
|
@ -49,6 +60,7 @@
|
|||
#define MISC_MCELOG_MINOR 227
|
||||
#define HPET_MINOR 228
|
||||
#define FUSE_MINOR 229
|
||||
#define SNAPSHOT_MINOR 231
|
||||
#define KVM_MINOR 232
|
||||
#define BTRFS_MINOR 234
|
||||
#define AUTOFS_MINOR 235
|
||||
|
|
|
|||
|
|
@ -343,6 +343,20 @@ extern unsigned int kobjsize(const void *objp);
|
|||
/* Bits set in the VMA until the stack is in its final location */
|
||||
#define VM_STACK_INCOMPLETE_SETUP (VM_RAND_READ | VM_SEQ_READ)
|
||||
|
||||
#define TASK_EXEC ((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0)
|
||||
|
||||
/* Common data flag combinations */
|
||||
#define VM_DATA_FLAGS_TSK_EXEC (VM_READ | VM_WRITE | TASK_EXEC | \
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
#define VM_DATA_FLAGS_NON_EXEC (VM_READ | VM_WRITE | VM_MAYREAD | \
|
||||
VM_MAYWRITE | VM_MAYEXEC)
|
||||
#define VM_DATA_FLAGS_EXEC (VM_READ | VM_WRITE | VM_EXEC | \
|
||||
VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||
|
||||
#ifndef VM_DATA_DEFAULT_FLAGS /* arch can override this */
|
||||
#define VM_DATA_DEFAULT_FLAGS VM_DATA_FLAGS_EXEC
|
||||
#endif
|
||||
|
||||
#ifndef VM_STACK_DEFAULT_FLAGS /* arch can override this */
|
||||
#define VM_STACK_DEFAULT_FLAGS VM_DATA_DEFAULT_FLAGS
|
||||
#endif
|
||||
|
|
@ -355,6 +369,10 @@ extern unsigned int kobjsize(const void *objp);
|
|||
|
||||
#define VM_STACK_FLAGS (VM_STACK | VM_STACK_DEFAULT_FLAGS | VM_ACCOUNT)
|
||||
|
||||
/* VMA basic access permission flags */
|
||||
#define VM_ACCESS_FLAGS (VM_READ | VM_WRITE | VM_EXEC)
|
||||
|
||||
|
||||
/*
|
||||
* Special vmas that are non-mergable, non-mlock()able.
|
||||
*/
|
||||
|
|
@ -629,6 +647,12 @@ static inline bool vma_is_foreign(struct vm_area_struct *vma)
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline bool vma_is_accessible(struct vm_area_struct *vma)
|
||||
{
|
||||
return vma->vm_flags & VM_ACCESS_FLAGS;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SHMEM
|
||||
/*
|
||||
* The vma_is_shmem is not inline because it is used only by slow
|
||||
|
|
@ -1765,9 +1789,26 @@ extern unsigned long move_page_tables(struct vm_area_struct *vma,
|
|||
unsigned long old_addr, struct vm_area_struct *new_vma,
|
||||
unsigned long new_addr, unsigned long len,
|
||||
bool need_rmap_locks);
|
||||
|
||||
/*
|
||||
* Flags used by change_protection(). For now we make it a bitmap so
|
||||
* that we can pass in multiple flags just like parameters. However
|
||||
* for now all the callers are only use one of the flags at the same
|
||||
* time.
|
||||
*/
|
||||
/* Whether we should allow dirty bit accounting */
|
||||
#define MM_CP_DIRTY_ACCT (1UL << 0)
|
||||
/* Whether this protection change is for NUMA hints */
|
||||
#define MM_CP_PROT_NUMA (1UL << 1)
|
||||
/* Whether this change is for write protecting */
|
||||
#define MM_CP_UFFD_WP (1UL << 2) /* do wp */
|
||||
#define MM_CP_UFFD_WP_RESOLVE (1UL << 3) /* Resolve wp */
|
||||
#define MM_CP_UFFD_WP_ALL (MM_CP_UFFD_WP | \
|
||||
MM_CP_UFFD_WP_RESOLVE)
|
||||
|
||||
extern unsigned long change_protection(struct vm_area_struct *vma, unsigned long start,
|
||||
unsigned long end, pgprot_t newprot,
|
||||
int dirty_accountable, int prot_numa);
|
||||
unsigned long cp_flags);
|
||||
extern int mprotect_fixup(struct vm_area_struct *vma,
|
||||
struct vm_area_struct **pprev, unsigned long start,
|
||||
unsigned long end, unsigned long newflags);
|
||||
|
|
@ -1886,6 +1927,18 @@ static inline void sync_mm_rss(struct mm_struct *mm)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_ARCH_HAS_PTE_SPECIAL
|
||||
static inline int pte_special(pte_t pte)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkspecial(pte_t pte)
|
||||
{
|
||||
return pte;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef CONFIG_ARCH_HAS_PTE_DEVMAP
|
||||
static inline int pte_devmap(pte_t pte)
|
||||
{
|
||||
|
|
@ -2666,6 +2719,8 @@ struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
|
|||
int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
|
||||
unsigned long pfn, unsigned long size, pgprot_t);
|
||||
int vm_insert_page(struct vm_area_struct *, unsigned long addr, struct page *);
|
||||
int vm_insert_pages(struct vm_area_struct *vma, unsigned long addr,
|
||||
struct page **pages, unsigned long *num);
|
||||
int vm_map_pages(struct vm_area_struct *vma, struct page **pages,
|
||||
unsigned long num);
|
||||
int vm_map_pages_zero(struct vm_area_struct *vma, struct page **pages,
|
||||
|
|
@ -3014,6 +3069,23 @@ extern long copy_huge_page_from_user(struct page *dst_page,
|
|||
const void __user *usr_src,
|
||||
unsigned int pages_per_huge_page,
|
||||
bool allow_pagefault);
|
||||
|
||||
/**
|
||||
* vma_is_special_huge - Are transhuge page-table entries considered special?
|
||||
* @vma: Pointer to the struct vm_area_struct to consider
|
||||
*
|
||||
* Whether transhuge page-table entries are considered "special" following
|
||||
* the definition in vm_normal_page().
|
||||
*
|
||||
* Return: true if transhuge page-table entries should be considered special,
|
||||
* false otherwise.
|
||||
*/
|
||||
static inline bool vma_is_special_huge(const struct vm_area_struct *vma)
|
||||
{
|
||||
return vma_is_dax(vma) || (vma->vm_file &&
|
||||
(vma->vm_flags & (VM_PFNMAP | VM_MIXEDMAP)));
|
||||
}
|
||||
|
||||
#endif /* CONFIG_TRANSPARENT_HUGEPAGE || CONFIG_HUGETLBFS */
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
|
|
|
|||
|
|
@ -6,19 +6,20 @@
|
|||
#include <linux/swap.h>
|
||||
|
||||
/**
|
||||
* page_is_file_cache - should the page be on a file LRU or anon LRU?
|
||||
* page_is_file_lru - should the page be on a file LRU or anon LRU?
|
||||
* @page: the page to test
|
||||
*
|
||||
* Returns 1 if @page is page cache page backed by a regular filesystem,
|
||||
* or 0 if @page is anonymous, tmpfs or otherwise ram or swap backed.
|
||||
* Used by functions that manipulate the LRU lists, to sort a page
|
||||
* onto the right LRU list.
|
||||
* Returns 1 if @page is a regular filesystem backed page cache page or a lazily
|
||||
* freed anonymous page (e.g. via MADV_FREE). Returns 0 if @page is a normal
|
||||
* anonymous page, a tmpfs page or otherwise ram or swap backed page. Used by
|
||||
* functions that manipulate the LRU lists, to sort a page onto the right LRU
|
||||
* list.
|
||||
*
|
||||
* We would like to get this info without a page flag, but the state
|
||||
* needs to survive until the page is last deleted from the LRU, which
|
||||
* could be as far down as __page_cache_release.
|
||||
*/
|
||||
static inline int page_is_file_cache(struct page *page)
|
||||
static inline int page_is_file_lru(struct page *page)
|
||||
{
|
||||
return !PageSwapBacked(page);
|
||||
}
|
||||
|
|
@ -75,7 +76,7 @@ static __always_inline void del_page_from_lru_list(struct page *page,
|
|||
*/
|
||||
static inline enum lru_list page_lru_base_type(struct page *page)
|
||||
{
|
||||
if (page_is_file_cache(page))
|
||||
if (page_is_file_lru(page))
|
||||
return LRU_INACTIVE_FILE;
|
||||
return LRU_INACTIVE_ANON;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -289,8 +289,8 @@ struct vm_userfaultfd_ctx {};
|
|||
#endif /* CONFIG_USERFAULTFD */
|
||||
|
||||
/*
|
||||
* This struct defines a memory VMM memory area. There is one of these
|
||||
* per VM-area/task. A VM area is any part of the process virtual memory
|
||||
* This struct describes a virtual memory area. There is one of these
|
||||
* per VM-area/task. A VM area is any part of the process virtual memory
|
||||
* space that has a special rule for the page-fault handlers (ie a shared
|
||||
* library, the executable area etc).
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -100,41 +100,6 @@ struct free_area {
|
|||
unsigned long nr_free;
|
||||
};
|
||||
|
||||
/* Used for pages not on another list */
|
||||
static inline void add_to_free_area(struct page *page, struct free_area *area,
|
||||
int migratetype)
|
||||
{
|
||||
list_add(&page->lru, &area->free_list[migratetype]);
|
||||
area->nr_free++;
|
||||
}
|
||||
|
||||
/* Used for pages not on another list */
|
||||
static inline void add_to_free_area_tail(struct page *page, struct free_area *area,
|
||||
int migratetype)
|
||||
{
|
||||
list_add_tail(&page->lru, &area->free_list[migratetype]);
|
||||
area->nr_free++;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SHUFFLE_PAGE_ALLOCATOR
|
||||
/* Used to preserve page allocation order entropy */
|
||||
void add_to_free_area_random(struct page *page, struct free_area *area,
|
||||
int migratetype);
|
||||
#else
|
||||
static inline void add_to_free_area_random(struct page *page,
|
||||
struct free_area *area, int migratetype)
|
||||
{
|
||||
add_to_free_area(page, area, migratetype);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Used for pages which are on another list */
|
||||
static inline void move_to_free_area(struct page *page, struct free_area *area,
|
||||
int migratetype)
|
||||
{
|
||||
list_move(&page->lru, &area->free_list[migratetype]);
|
||||
}
|
||||
|
||||
static inline struct page *get_page_from_free_area(struct free_area *area,
|
||||
int migratetype)
|
||||
{
|
||||
|
|
@ -142,15 +107,6 @@ static inline struct page *get_page_from_free_area(struct free_area *area,
|
|||
struct page, lru);
|
||||
}
|
||||
|
||||
static inline void del_page_from_free_area(struct page *page,
|
||||
struct free_area *area)
|
||||
{
|
||||
list_del(&page->lru);
|
||||
__ClearPageBuddy(page);
|
||||
set_page_private(page, 0);
|
||||
area->nr_free--;
|
||||
}
|
||||
|
||||
static inline bool free_area_empty(struct free_area *area, int migratetype)
|
||||
{
|
||||
return list_empty(&area->free_list[migratetype]);
|
||||
|
|
@ -708,7 +664,6 @@ struct deferred_split {
|
|||
* Memory statistics and page replacement data structures are maintained on a
|
||||
* per-zone basis.
|
||||
*/
|
||||
struct bootmem_data;
|
||||
typedef struct pglist_data {
|
||||
struct zone node_zones[MAX_NR_ZONES];
|
||||
struct zonelist node_zonelists[MAX_ZONELISTS];
|
||||
|
|
@ -1172,6 +1127,7 @@ static inline unsigned long section_nr_to_pfn(unsigned long sec)
|
|||
#define SECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SECTION_MASK)
|
||||
|
||||
#define SUBSECTION_SHIFT 21
|
||||
#define SUBSECTION_SIZE (1UL << SUBSECTION_SHIFT)
|
||||
|
||||
#define PFN_SUBSECTION_SHIFT (SUBSECTION_SHIFT - PAGE_SHIFT)
|
||||
#define PAGES_PER_SUBSECTION (1UL << PFN_SUBSECTION_SHIFT)
|
||||
|
|
@ -1187,7 +1143,9 @@ static inline unsigned long section_nr_to_pfn(unsigned long sec)
|
|||
#define SUBSECTION_ALIGN_DOWN(pfn) ((pfn) & PAGE_SUBSECTION_MASK)
|
||||
|
||||
struct mem_section_usage {
|
||||
#ifdef CONFIG_SPARSEMEM_VMEMMAP
|
||||
DECLARE_BITMAP(subsection_map, SUBSECTIONS_PER_SECTION);
|
||||
#endif
|
||||
/* See declaration of similar field in struct zone */
|
||||
unsigned long pageblock_flags[0];
|
||||
};
|
||||
|
|
|
|||
|
|
@ -819,4 +819,17 @@ struct wmi_device_id {
|
|||
const void *context;
|
||||
};
|
||||
|
||||
#define MHI_DEVICE_MODALIAS_FMT "mhi:%s"
|
||||
#define MHI_NAME_SIZE 32
|
||||
|
||||
/**
|
||||
* struct mhi_device_id - MHI device identification
|
||||
* @chan: MHI channel name
|
||||
* @driver_data: driver data;
|
||||
*/
|
||||
struct mhi_device_id {
|
||||
const char chan[MHI_NAME_SIZE];
|
||||
kernel_ulong_t driver_data;
|
||||
};
|
||||
|
||||
#endif /* LINUX_MOD_DEVICETABLE_H */
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
|
||||
#include <linux/types.h>
|
||||
#include <linux/uio.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/notifier.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/of.h>
|
||||
|
|
@ -194,10 +195,43 @@ struct mtd_debug_info {
|
|||
const char *partid;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mtd_part - MTD partition specific fields
|
||||
*
|
||||
* @node: list node used to add an MTD partition to the parent partition list
|
||||
* @offset: offset of the partition relatively to the parent offset
|
||||
* @flags: original flags (before the mtdpart logic decided to tweak them based
|
||||
* on flash constraints, like eraseblock/pagesize alignment)
|
||||
*
|
||||
* This struct is embedded in mtd_info and contains partition-specific
|
||||
* properties/fields.
|
||||
*/
|
||||
struct mtd_part {
|
||||
struct list_head node;
|
||||
u64 offset;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct mtd_master - MTD master specific fields
|
||||
*
|
||||
* @partitions_lock: lock protecting accesses to the partition list. Protects
|
||||
* not only the master partition list, but also all
|
||||
* sub-partitions.
|
||||
* @suspended: et to 1 when the device is suspended, 0 otherwise
|
||||
*
|
||||
* This struct is embedded in mtd_info and contains master-specific
|
||||
* properties/fields. The master is the root MTD device from the MTD partition
|
||||
* point of view.
|
||||
*/
|
||||
struct mtd_master {
|
||||
struct mutex partitions_lock;
|
||||
unsigned int suspended : 1;
|
||||
};
|
||||
|
||||
struct mtd_info {
|
||||
u_char type;
|
||||
uint32_t flags;
|
||||
uint32_t orig_flags; /* Flags as before running mtd checks */
|
||||
uint64_t size; // Total size of the MTD
|
||||
|
||||
/* "Major" erase size for the device. Naïve users may take this
|
||||
|
|
@ -339,8 +373,52 @@ struct mtd_info {
|
|||
int usecount;
|
||||
struct mtd_debug_info dbg;
|
||||
struct nvmem_device *nvmem;
|
||||
|
||||
/*
|
||||
* Parent device from the MTD partition point of view.
|
||||
*
|
||||
* MTD masters do not have any parent, MTD partitions do. The parent
|
||||
* MTD device can itself be a partition.
|
||||
*/
|
||||
struct mtd_info *parent;
|
||||
|
||||
/* List of partitions attached to this MTD device */
|
||||
struct list_head partitions;
|
||||
|
||||
union {
|
||||
struct mtd_part part;
|
||||
struct mtd_master master;
|
||||
};
|
||||
};
|
||||
|
||||
static inline struct mtd_info *mtd_get_master(struct mtd_info *mtd)
|
||||
{
|
||||
while (mtd->parent)
|
||||
mtd = mtd->parent;
|
||||
|
||||
return mtd;
|
||||
}
|
||||
|
||||
static inline u64 mtd_get_master_ofs(struct mtd_info *mtd, u64 ofs)
|
||||
{
|
||||
while (mtd->parent) {
|
||||
ofs += mtd->part.offset;
|
||||
mtd = mtd->parent;
|
||||
}
|
||||
|
||||
return ofs;
|
||||
}
|
||||
|
||||
static inline bool mtd_is_partition(const struct mtd_info *mtd)
|
||||
{
|
||||
return mtd->parent;
|
||||
}
|
||||
|
||||
static inline bool mtd_has_partitions(const struct mtd_info *mtd)
|
||||
{
|
||||
return !list_empty(&mtd->partitions);
|
||||
}
|
||||
|
||||
int mtd_ooblayout_ecc(struct mtd_info *mtd, int section,
|
||||
struct mtd_oob_region *oobecc);
|
||||
int mtd_ooblayout_find_eccregion(struct mtd_info *mtd, int eccbyte,
|
||||
|
|
@ -392,13 +470,16 @@ static inline u32 mtd_oobavail(struct mtd_info *mtd, struct mtd_oob_ops *ops)
|
|||
static inline int mtd_max_bad_blocks(struct mtd_info *mtd,
|
||||
loff_t ofs, size_t len)
|
||||
{
|
||||
if (!mtd->_max_bad_blocks)
|
||||
struct mtd_info *master = mtd_get_master(mtd);
|
||||
|
||||
if (!master->_max_bad_blocks)
|
||||
return -ENOTSUPP;
|
||||
|
||||
if (mtd->size < (len + ofs) || ofs < 0)
|
||||
return -EINVAL;
|
||||
|
||||
return mtd->_max_bad_blocks(mtd, ofs, len);
|
||||
return master->_max_bad_blocks(master, mtd_get_master_ofs(mtd, ofs),
|
||||
len);
|
||||
}
|
||||
|
||||
int mtd_wunit_to_pairing_info(struct mtd_info *mtd, int wunit,
|
||||
|
|
@ -439,8 +520,10 @@ int mtd_writev(struct mtd_info *mtd, const struct kvec *vecs,
|
|||
|
||||
static inline void mtd_sync(struct mtd_info *mtd)
|
||||
{
|
||||
if (mtd->_sync)
|
||||
mtd->_sync(mtd);
|
||||
struct mtd_info *master = mtd_get_master(mtd);
|
||||
|
||||
if (master->_sync)
|
||||
master->_sync(master);
|
||||
}
|
||||
|
||||
int mtd_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len);
|
||||
|
|
@ -452,13 +535,31 @@ int mtd_block_markbad(struct mtd_info *mtd, loff_t ofs);
|
|||
|
||||
static inline int mtd_suspend(struct mtd_info *mtd)
|
||||
{
|
||||
return mtd->_suspend ? mtd->_suspend(mtd) : 0;
|
||||
struct mtd_info *master = mtd_get_master(mtd);
|
||||
int ret;
|
||||
|
||||
if (master->master.suspended)
|
||||
return 0;
|
||||
|
||||
ret = master->_suspend ? master->_suspend(master) : 0;
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
master->master.suspended = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void mtd_resume(struct mtd_info *mtd)
|
||||
{
|
||||
if (mtd->_resume)
|
||||
mtd->_resume(mtd);
|
||||
struct mtd_info *master = mtd_get_master(mtd);
|
||||
|
||||
if (!master->master.suspended)
|
||||
return;
|
||||
|
||||
if (master->_resume)
|
||||
master->_resume(master);
|
||||
|
||||
master->master.suspended = 0;
|
||||
}
|
||||
|
||||
static inline uint32_t mtd_div_by_eb(uint64_t sz, struct mtd_info *mtd)
|
||||
|
|
@ -538,7 +639,9 @@ static inline loff_t mtd_wunit_to_offset(struct mtd_info *mtd, loff_t base,
|
|||
|
||||
static inline int mtd_has_oob(const struct mtd_info *mtd)
|
||||
{
|
||||
return mtd->_read_oob && mtd->_write_oob;
|
||||
struct mtd_info *master = mtd_get_master((struct mtd_info *)mtd);
|
||||
|
||||
return master->_read_oob && master->_write_oob;
|
||||
}
|
||||
|
||||
static inline int mtd_type_is_nand(const struct mtd_info *mtd)
|
||||
|
|
@ -548,7 +651,9 @@ static inline int mtd_type_is_nand(const struct mtd_info *mtd)
|
|||
|
||||
static inline int mtd_can_have_bb(const struct mtd_info *mtd)
|
||||
{
|
||||
return !!mtd->_block_isbad;
|
||||
struct mtd_info *master = mtd_get_master((struct mtd_info *)mtd);
|
||||
|
||||
return !!master->_block_isbad;
|
||||
}
|
||||
|
||||
/* Kernel-side ioctl definitions */
|
||||
|
|
|
|||
|
|
@ -105,7 +105,6 @@ extern void deregister_mtd_parser(struct mtd_part_parser *parser);
|
|||
module_driver(__mtd_part_parser, register_mtd_parser, \
|
||||
deregister_mtd_parser)
|
||||
|
||||
int mtd_is_partition(const struct mtd_info *mtd);
|
||||
int mtd_add_partition(struct mtd_info *master, const char *name,
|
||||
long long offset, long long length);
|
||||
int mtd_del_partition(struct mtd_info *master, int partno);
|
||||
|
|
|
|||
|
|
@ -1064,6 +1064,8 @@ struct nand_legacy {
|
|||
* @lock: lock protecting the suspended field. Also used to
|
||||
* serialize accesses to the NAND device.
|
||||
* @suspended: set to 1 when the device is suspended, 0 when it's not.
|
||||
* @suspend: [REPLACEABLE] specific NAND device suspend operation
|
||||
* @resume: [REPLACEABLE] specific NAND device resume operation
|
||||
* @bbt: [INTERN] bad block table pointer
|
||||
* @bbt_td: [REPLACEABLE] bad block table descriptor for flash
|
||||
* lookup.
|
||||
|
|
@ -1077,6 +1079,8 @@ struct nand_legacy {
|
|||
* @manufacturer: [INTERN] Contains manufacturer information
|
||||
* @manufacturer.desc: [INTERN] Contains manufacturer's description
|
||||
* @manufacturer.priv: [INTERN] Contains manufacturer private information
|
||||
* @lock_area: [REPLACEABLE] specific NAND chip lock operation
|
||||
* @unlock_area: [REPLACEABLE] specific NAND chip unlock operation
|
||||
*/
|
||||
|
||||
struct nand_chip {
|
||||
|
|
@ -1117,6 +1121,8 @@ struct nand_chip {
|
|||
|
||||
struct mutex lock;
|
||||
unsigned int suspended : 1;
|
||||
int (*suspend)(struct nand_chip *chip);
|
||||
void (*resume)(struct nand_chip *chip);
|
||||
|
||||
uint8_t *oob_poi;
|
||||
struct nand_controller *controller;
|
||||
|
|
@ -1136,6 +1142,9 @@ struct nand_chip {
|
|||
const struct nand_manufacturer *desc;
|
||||
void *priv;
|
||||
} manufacturer;
|
||||
|
||||
int (*lock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len);
|
||||
int (*unlock_area)(struct nand_chip *chip, loff_t ofs, uint64_t len);
|
||||
};
|
||||
|
||||
extern const struct mtd_ooblayout_ops nand_ooblayout_sp_ops;
|
||||
|
|
@ -1215,7 +1224,7 @@ static inline struct device_node *nand_get_flash_node(struct nand_chip *chip)
|
|||
* struct nand_flash_dev - NAND Flash Device ID Structure
|
||||
* @name: a human-readable name of the NAND chip
|
||||
* @dev_id: the device ID (the second byte of the full chip ID array)
|
||||
* @mfr_id: manufecturer ID part of the full chip ID array (refers the same
|
||||
* @mfr_id: manufacturer ID part of the full chip ID array (refers the same
|
||||
* memory address as ``id[0]``)
|
||||
* @dev_id: device ID part of the full chip ID array (refers the same memory
|
||||
* address as ``id[1]``)
|
||||
|
|
|
|||
|
|
@ -11,23 +11,6 @@
|
|||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/spi/spi-mem.h>
|
||||
|
||||
/*
|
||||
* Manufacturer IDs
|
||||
*
|
||||
* The first byte returned from the flash after sending opcode SPINOR_OP_RDID.
|
||||
* Sometimes these are the same as CFI IDs, but sometimes they aren't.
|
||||
*/
|
||||
#define SNOR_MFR_ATMEL CFI_MFR_ATMEL
|
||||
#define SNOR_MFR_GIGADEVICE 0xc8
|
||||
#define SNOR_MFR_INTEL CFI_MFR_INTEL
|
||||
#define SNOR_MFR_ST CFI_MFR_ST /* ST Micro */
|
||||
#define SNOR_MFR_MICRON CFI_MFR_MICRON /* Micron */
|
||||
#define SNOR_MFR_ISSI CFI_MFR_PMC
|
||||
#define SNOR_MFR_MACRONIX CFI_MFR_MACRONIX
|
||||
#define SNOR_MFR_SPANSION CFI_MFR_AMD
|
||||
#define SNOR_MFR_SST CFI_MFR_SST
|
||||
#define SNOR_MFR_WINBOND 0xef /* Also used by some Spansion */
|
||||
|
||||
/*
|
||||
* Note on opcode nomenclature: some opcodes have a format like
|
||||
* SPINOR_OP_FUNCTION{4,}_x_y_z. The numbers x, y, and z stand for the number
|
||||
|
|
@ -128,7 +111,9 @@
|
|||
#define SR_BP0 BIT(2) /* Block protect 0 */
|
||||
#define SR_BP1 BIT(3) /* Block protect 1 */
|
||||
#define SR_BP2 BIT(4) /* Block protect 2 */
|
||||
#define SR_BP3 BIT(5) /* Block protect 3 */
|
||||
#define SR_TB_BIT5 BIT(5) /* Top/Bottom protect */
|
||||
#define SR_BP3_BIT6 BIT(6) /* Block protect 3 */
|
||||
#define SR_TB_BIT6 BIT(6) /* Top/Bottom protect */
|
||||
#define SR_SRWD BIT(7) /* SR write protect */
|
||||
/* Spansion/Cypress specific status bits */
|
||||
|
|
@ -137,6 +122,8 @@
|
|||
|
||||
#define SR1_QUAD_EN_BIT6 BIT(6)
|
||||
|
||||
#define SR_BP_SHIFT 2
|
||||
|
||||
/* Enhanced Volatile Configuration Register bits */
|
||||
#define EVCR_QUAD_EN_MICRON BIT(7) /* Micron Quad I/O */
|
||||
|
||||
|
|
@ -225,110 +212,6 @@ static inline u8 spi_nor_get_protocol_width(enum spi_nor_protocol proto)
|
|||
return spi_nor_get_protocol_data_nbits(proto);
|
||||
}
|
||||
|
||||
enum spi_nor_option_flags {
|
||||
SNOR_F_USE_FSR = BIT(0),
|
||||
SNOR_F_HAS_SR_TB = BIT(1),
|
||||
SNOR_F_NO_OP_CHIP_ERASE = BIT(2),
|
||||
SNOR_F_READY_XSR_RDY = BIT(3),
|
||||
SNOR_F_USE_CLSR = BIT(4),
|
||||
SNOR_F_BROKEN_RESET = BIT(5),
|
||||
SNOR_F_4B_OPCODES = BIT(6),
|
||||
SNOR_F_HAS_4BAIT = BIT(7),
|
||||
SNOR_F_HAS_LOCK = BIT(8),
|
||||
SNOR_F_HAS_16BIT_SR = BIT(9),
|
||||
SNOR_F_NO_READ_CR = BIT(10),
|
||||
SNOR_F_HAS_SR_TB_BIT6 = BIT(11),
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spi_nor_erase_type - Structure to describe a SPI NOR erase type
|
||||
* @size: the size of the sector/block erased by the erase type.
|
||||
* JEDEC JESD216B imposes erase sizes to be a power of 2.
|
||||
* @size_shift: @size is a power of 2, the shift is stored in
|
||||
* @size_shift.
|
||||
* @size_mask: the size mask based on @size_shift.
|
||||
* @opcode: the SPI command op code to erase the sector/block.
|
||||
* @idx: Erase Type index as sorted in the Basic Flash Parameter
|
||||
* Table. It will be used to synchronize the supported
|
||||
* Erase Types with the ones identified in the SFDP
|
||||
* optional tables.
|
||||
*/
|
||||
struct spi_nor_erase_type {
|
||||
u32 size;
|
||||
u32 size_shift;
|
||||
u32 size_mask;
|
||||
u8 opcode;
|
||||
u8 idx;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spi_nor_erase_command - Used for non-uniform erases
|
||||
* The structure is used to describe a list of erase commands to be executed
|
||||
* once we validate that the erase can be performed. The elements in the list
|
||||
* are run-length encoded.
|
||||
* @list: for inclusion into the list of erase commands.
|
||||
* @count: how many times the same erase command should be
|
||||
* consecutively used.
|
||||
* @size: the size of the sector/block erased by the command.
|
||||
* @opcode: the SPI command op code to erase the sector/block.
|
||||
*/
|
||||
struct spi_nor_erase_command {
|
||||
struct list_head list;
|
||||
u32 count;
|
||||
u32 size;
|
||||
u8 opcode;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spi_nor_erase_region - Structure to describe a SPI NOR erase region
|
||||
* @offset: the offset in the data array of erase region start.
|
||||
* LSB bits are used as a bitmask encoding flags to
|
||||
* determine if this region is overlaid, if this region is
|
||||
* the last in the SPI NOR flash memory and to indicate
|
||||
* all the supported erase commands inside this region.
|
||||
* The erase types are sorted in ascending order with the
|
||||
* smallest Erase Type size being at BIT(0).
|
||||
* @size: the size of the region in bytes.
|
||||
*/
|
||||
struct spi_nor_erase_region {
|
||||
u64 offset;
|
||||
u64 size;
|
||||
};
|
||||
|
||||
#define SNOR_ERASE_TYPE_MAX 4
|
||||
#define SNOR_ERASE_TYPE_MASK GENMASK_ULL(SNOR_ERASE_TYPE_MAX - 1, 0)
|
||||
|
||||
#define SNOR_LAST_REGION BIT(4)
|
||||
#define SNOR_OVERLAID_REGION BIT(5)
|
||||
|
||||
#define SNOR_ERASE_FLAGS_MAX 6
|
||||
#define SNOR_ERASE_FLAGS_MASK GENMASK_ULL(SNOR_ERASE_FLAGS_MAX - 1, 0)
|
||||
|
||||
/**
|
||||
* struct spi_nor_erase_map - Structure to describe the SPI NOR erase map
|
||||
* @regions: array of erase regions. The regions are consecutive in
|
||||
* address space. Walking through the regions is done
|
||||
* incrementally.
|
||||
* @uniform_region: a pre-allocated erase region for SPI NOR with a uniform
|
||||
* sector size (legacy implementation).
|
||||
* @erase_type: an array of erase types shared by all the regions.
|
||||
* The erase types are sorted in ascending order, with the
|
||||
* smallest Erase Type size being the first member in the
|
||||
* erase_type array.
|
||||
* @uniform_erase_type: bitmask encoding erase types that can erase the
|
||||
* entire memory. This member is completed at init by
|
||||
* uniform and non-uniform SPI NOR flash memories if they
|
||||
* support at least one erase type that can erase the
|
||||
* entire memory.
|
||||
*/
|
||||
struct spi_nor_erase_map {
|
||||
struct spi_nor_erase_region *regions;
|
||||
struct spi_nor_erase_region uniform_region;
|
||||
struct spi_nor_erase_type erase_type[SNOR_ERASE_TYPE_MAX];
|
||||
u8 uniform_erase_type;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spi_nor_hwcaps - Structure for describing the hardware capabilies
|
||||
* supported by the SPI controller (bus master).
|
||||
|
|
@ -404,61 +287,7 @@ struct spi_nor_hwcaps {
|
|||
#define SNOR_HWCAPS_ALL (SNOR_HWCAPS_READ_MASK | \
|
||||
SNOR_HWCAPS_PP_MASK)
|
||||
|
||||
struct spi_nor_read_command {
|
||||
u8 num_mode_clocks;
|
||||
u8 num_wait_states;
|
||||
u8 opcode;
|
||||
enum spi_nor_protocol proto;
|
||||
};
|
||||
|
||||
struct spi_nor_pp_command {
|
||||
u8 opcode;
|
||||
enum spi_nor_protocol proto;
|
||||
};
|
||||
|
||||
enum spi_nor_read_command_index {
|
||||
SNOR_CMD_READ,
|
||||
SNOR_CMD_READ_FAST,
|
||||
SNOR_CMD_READ_1_1_1_DTR,
|
||||
|
||||
/* Dual SPI */
|
||||
SNOR_CMD_READ_1_1_2,
|
||||
SNOR_CMD_READ_1_2_2,
|
||||
SNOR_CMD_READ_2_2_2,
|
||||
SNOR_CMD_READ_1_2_2_DTR,
|
||||
|
||||
/* Quad SPI */
|
||||
SNOR_CMD_READ_1_1_4,
|
||||
SNOR_CMD_READ_1_4_4,
|
||||
SNOR_CMD_READ_4_4_4,
|
||||
SNOR_CMD_READ_1_4_4_DTR,
|
||||
|
||||
/* Octal SPI */
|
||||
SNOR_CMD_READ_1_1_8,
|
||||
SNOR_CMD_READ_1_8_8,
|
||||
SNOR_CMD_READ_8_8_8,
|
||||
SNOR_CMD_READ_1_8_8_DTR,
|
||||
|
||||
SNOR_CMD_READ_MAX
|
||||
};
|
||||
|
||||
enum spi_nor_pp_command_index {
|
||||
SNOR_CMD_PP,
|
||||
|
||||
/* Quad SPI */
|
||||
SNOR_CMD_PP_1_1_4,
|
||||
SNOR_CMD_PP_1_4_4,
|
||||
SNOR_CMD_PP_4_4_4,
|
||||
|
||||
/* Octal SPI */
|
||||
SNOR_CMD_PP_1_1_8,
|
||||
SNOR_CMD_PP_1_8_8,
|
||||
SNOR_CMD_PP_8_8_8,
|
||||
|
||||
SNOR_CMD_PP_MAX
|
||||
};
|
||||
|
||||
/* Forward declaration that will be used in 'struct spi_nor_flash_parameter' */
|
||||
/* Forward declaration that is used in 'struct spi_nor_controller_ops' */
|
||||
struct spi_nor;
|
||||
|
||||
/**
|
||||
|
|
@ -489,68 +318,13 @@ struct spi_nor_controller_ops {
|
|||
int (*erase)(struct spi_nor *nor, loff_t offs);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spi_nor_locking_ops - SPI NOR locking methods
|
||||
* @lock: lock a region of the SPI NOR.
|
||||
* @unlock: unlock a region of the SPI NOR.
|
||||
* @is_locked: check if a region of the SPI NOR is completely locked
|
||||
*/
|
||||
struct spi_nor_locking_ops {
|
||||
int (*lock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
|
||||
int (*unlock)(struct spi_nor *nor, loff_t ofs, uint64_t len);
|
||||
int (*is_locked)(struct spi_nor *nor, loff_t ofs, uint64_t len);
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spi_nor_flash_parameter - SPI NOR flash parameters and settings.
|
||||
* Includes legacy flash parameters and settings that can be overwritten
|
||||
* by the spi_nor_fixups hooks, or dynamically when parsing the JESD216
|
||||
* Serial Flash Discoverable Parameters (SFDP) tables.
|
||||
*
|
||||
* @size: the flash memory density in bytes.
|
||||
* @page_size: the page size of the SPI NOR flash memory.
|
||||
* @hwcaps: describes the read and page program hardware
|
||||
* capabilities.
|
||||
* @reads: read capabilities ordered by priority: the higher index
|
||||
* in the array, the higher priority.
|
||||
* @page_programs: page program capabilities ordered by priority: the
|
||||
* higher index in the array, the higher priority.
|
||||
* @erase_map: the erase map parsed from the SFDP Sector Map Parameter
|
||||
* Table.
|
||||
* @quad_enable: enables SPI NOR quad mode.
|
||||
* @set_4byte: puts the SPI NOR in 4 byte addressing mode.
|
||||
* @convert_addr: converts an absolute address into something the flash
|
||||
* will understand. Particularly useful when pagesize is
|
||||
* not a power-of-2.
|
||||
* @setup: configures the SPI NOR memory. Useful for SPI NOR
|
||||
* flashes that have peculiarities to the SPI NOR standard
|
||||
* e.g. different opcodes, specific address calculation,
|
||||
* page size, etc.
|
||||
* @locking_ops: SPI NOR locking methods.
|
||||
*/
|
||||
struct spi_nor_flash_parameter {
|
||||
u64 size;
|
||||
u32 page_size;
|
||||
|
||||
struct spi_nor_hwcaps hwcaps;
|
||||
struct spi_nor_read_command reads[SNOR_CMD_READ_MAX];
|
||||
struct spi_nor_pp_command page_programs[SNOR_CMD_PP_MAX];
|
||||
|
||||
struct spi_nor_erase_map erase_map;
|
||||
|
||||
int (*quad_enable)(struct spi_nor *nor);
|
||||
int (*set_4byte)(struct spi_nor *nor, bool enable);
|
||||
u32 (*convert_addr)(struct spi_nor *nor, u32 addr);
|
||||
int (*setup)(struct spi_nor *nor, const struct spi_nor_hwcaps *hwcaps);
|
||||
|
||||
const struct spi_nor_locking_ops *locking_ops;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct flash_info - Forward declaration of a structure used internally by
|
||||
* spi_nor_scan()
|
||||
/*
|
||||
* Forward declarations that are used internally by the core and manufacturer
|
||||
* drivers.
|
||||
*/
|
||||
struct flash_info;
|
||||
struct spi_nor_manufacturer;
|
||||
struct spi_nor_flash_parameter;
|
||||
|
||||
/**
|
||||
* struct spi_nor - Structure for defining a the SPI NOR layer
|
||||
|
|
@ -562,6 +336,7 @@ struct flash_info;
|
|||
* layer is not DMA-able
|
||||
* @bouncebuf_size: size of the bounce buffer
|
||||
* @info: spi-nor part JDEC MFR id and other info
|
||||
* @manufacturer: spi-nor manufacturer
|
||||
* @page_size: the page size of the SPI NOR
|
||||
* @addr_width: number of address bytes
|
||||
* @erase_opcode: the opcode for erasing a sector
|
||||
|
|
@ -578,6 +353,7 @@ struct flash_info;
|
|||
* The structure includes legacy flash parameters and
|
||||
* settings that can be overwritten by the spi_nor_fixups
|
||||
* hooks, or dynamically when parsing the SFDP tables.
|
||||
* @dirmap: pointers to struct spi_mem_dirmap_desc for reads/writes.
|
||||
* @priv: the private data
|
||||
*/
|
||||
struct spi_nor {
|
||||
|
|
@ -588,6 +364,7 @@ struct spi_nor {
|
|||
u8 *bouncebuf;
|
||||
size_t bouncebuf_size;
|
||||
const struct flash_info *info;
|
||||
const struct spi_nor_manufacturer *manufacturer;
|
||||
u32 page_size;
|
||||
u8 addr_width;
|
||||
u8 erase_opcode;
|
||||
|
|
@ -602,40 +379,16 @@ struct spi_nor {
|
|||
|
||||
const struct spi_nor_controller_ops *controller_ops;
|
||||
|
||||
struct spi_nor_flash_parameter params;
|
||||
struct spi_nor_flash_parameter *params;
|
||||
|
||||
struct {
|
||||
struct spi_mem_dirmap_desc *rdesc;
|
||||
struct spi_mem_dirmap_desc *wdesc;
|
||||
} dirmap;
|
||||
|
||||
void *priv;
|
||||
};
|
||||
|
||||
static u64 __maybe_unused
|
||||
spi_nor_region_is_last(const struct spi_nor_erase_region *region)
|
||||
{
|
||||
return region->offset & SNOR_LAST_REGION;
|
||||
}
|
||||
|
||||
static u64 __maybe_unused
|
||||
spi_nor_region_end(const struct spi_nor_erase_region *region)
|
||||
{
|
||||
return (region->offset & ~SNOR_ERASE_FLAGS_MASK) + region->size;
|
||||
}
|
||||
|
||||
static void __maybe_unused
|
||||
spi_nor_region_mark_end(struct spi_nor_erase_region *region)
|
||||
{
|
||||
region->offset |= SNOR_LAST_REGION;
|
||||
}
|
||||
|
||||
static void __maybe_unused
|
||||
spi_nor_region_mark_overlay(struct spi_nor_erase_region *region)
|
||||
{
|
||||
region->offset |= SNOR_OVERLAID_REGION;
|
||||
}
|
||||
|
||||
static bool __maybe_unused spi_nor_has_uniform_erase(const struct spi_nor *nor)
|
||||
{
|
||||
return !!nor->params.erase_map.uniform_erase_type;
|
||||
}
|
||||
|
||||
static inline void spi_nor_set_flash_node(struct spi_nor *nor,
|
||||
struct device_node *np)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -32,9 +32,9 @@
|
|||
SPI_MEM_OP_NO_DUMMY, \
|
||||
SPI_MEM_OP_NO_DATA)
|
||||
|
||||
#define SPINAND_READID_OP(ndummy, buf, len) \
|
||||
#define SPINAND_READID_OP(naddr, ndummy, buf, len) \
|
||||
SPI_MEM_OP(SPI_MEM_OP_CMD(0x9f, 1), \
|
||||
SPI_MEM_OP_NO_ADDR, \
|
||||
SPI_MEM_OP_ADDR(naddr, 0, 1), \
|
||||
SPI_MEM_OP_DUMMY(ndummy, 1), \
|
||||
SPI_MEM_OP_DATA_IN(len, buf, 1))
|
||||
|
||||
|
|
@ -176,37 +176,46 @@ struct spinand_device;
|
|||
* @data: buffer containing the id bytes. Currently 4 bytes large, but can
|
||||
* be extended if required
|
||||
* @len: ID length
|
||||
*
|
||||
* struct_spinand_id->data contains all bytes returned after a READ_ID command,
|
||||
* including dummy bytes if the chip does not emit ID bytes right after the
|
||||
* READ_ID command. The responsibility to extract real ID bytes is left to
|
||||
* struct_manufacurer_ops->detect().
|
||||
*/
|
||||
struct spinand_id {
|
||||
u8 data[SPINAND_MAX_ID_LEN];
|
||||
int len;
|
||||
};
|
||||
|
||||
enum spinand_readid_method {
|
||||
SPINAND_READID_METHOD_OPCODE,
|
||||
SPINAND_READID_METHOD_OPCODE_ADDR,
|
||||
SPINAND_READID_METHOD_OPCODE_DUMMY,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct spinand_devid - SPI NAND device id structure
|
||||
* @id: device id of current chip
|
||||
* @len: number of bytes in device id
|
||||
* @method: method to read chip id
|
||||
* There are 3 possible variants:
|
||||
* SPINAND_READID_METHOD_OPCODE: chip id is returned immediately
|
||||
* after read_id opcode.
|
||||
* SPINAND_READID_METHOD_OPCODE_ADDR: chip id is returned after
|
||||
* read_id opcode + 1-byte address.
|
||||
* SPINAND_READID_METHOD_OPCODE_DUMMY: chip id is returned after
|
||||
* read_id opcode + 1 dummy byte.
|
||||
*/
|
||||
struct spinand_devid {
|
||||
const u8 *id;
|
||||
const u8 len;
|
||||
const enum spinand_readid_method method;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct manufacurer_ops - SPI NAND manufacturer specific operations
|
||||
* @detect: detect a SPI NAND device. Every time a SPI NAND device is probed
|
||||
* the core calls the struct_manufacurer_ops->detect() hook of each
|
||||
* registered manufacturer until one of them return 1. Note that
|
||||
* the first thing to check in this hook is that the manufacturer ID
|
||||
* in struct_spinand_device->id matches the manufacturer whose
|
||||
* ->detect() hook has been called. Should return 1 if there's a
|
||||
* match, 0 if the manufacturer ID does not match and a negative
|
||||
* error code otherwise. When true is returned, the core assumes
|
||||
* that properties of the NAND chip (spinand->base.memorg and
|
||||
* spinand->base.eccreq) have been filled
|
||||
* @init: initialize a SPI NAND device
|
||||
* @cleanup: cleanup a SPI NAND device
|
||||
*
|
||||
* Each SPI NAND manufacturer driver should implement this interface so that
|
||||
* NAND chips coming from this vendor can be detected and initialized properly.
|
||||
* NAND chips coming from this vendor can be initialized properly.
|
||||
*/
|
||||
struct spinand_manufacturer_ops {
|
||||
int (*detect)(struct spinand_device *spinand);
|
||||
int (*init)(struct spinand_device *spinand);
|
||||
void (*cleanup)(struct spinand_device *spinand);
|
||||
};
|
||||
|
|
@ -215,11 +224,16 @@ struct spinand_manufacturer_ops {
|
|||
* struct spinand_manufacturer - SPI NAND manufacturer instance
|
||||
* @id: manufacturer ID
|
||||
* @name: manufacturer name
|
||||
* @devid_len: number of bytes in device ID
|
||||
* @chips: supported SPI NANDs under current manufacturer
|
||||
* @nchips: number of SPI NANDs available in chips array
|
||||
* @ops: manufacturer operations
|
||||
*/
|
||||
struct spinand_manufacturer {
|
||||
u8 id;
|
||||
char *name;
|
||||
const struct spinand_info *chips;
|
||||
const size_t nchips;
|
||||
const struct spinand_manufacturer_ops *ops;
|
||||
};
|
||||
|
||||
|
|
@ -270,6 +284,7 @@ struct spinand_ecc_info {
|
|||
};
|
||||
|
||||
#define SPINAND_HAS_QE_BIT BIT(0)
|
||||
#define SPINAND_HAS_CR_FEAT_BIT BIT(1)
|
||||
|
||||
/**
|
||||
* struct spinand_info - Structure used to describe SPI NAND chips
|
||||
|
|
@ -291,7 +306,7 @@ struct spinand_ecc_info {
|
|||
*/
|
||||
struct spinand_info {
|
||||
const char *model;
|
||||
u16 devid;
|
||||
struct spinand_devid devid;
|
||||
u32 flags;
|
||||
struct nand_memory_organization memorg;
|
||||
struct nand_ecc_req eccreq;
|
||||
|
|
@ -305,6 +320,13 @@ struct spinand_info {
|
|||
unsigned int target);
|
||||
};
|
||||
|
||||
#define SPINAND_ID(__method, ...) \
|
||||
{ \
|
||||
.id = (const u8[]){ __VA_ARGS__ }, \
|
||||
.len = sizeof((u8[]){ __VA_ARGS__ }), \
|
||||
.method = __method, \
|
||||
}
|
||||
|
||||
#define SPINAND_INFO_OP_VARIANTS(__read, __write, __update) \
|
||||
{ \
|
||||
.read_cache = __read, \
|
||||
|
|
@ -451,9 +473,10 @@ static inline void spinand_set_of_node(struct spinand_device *spinand,
|
|||
nanddev_set_of_node(&spinand->base, np);
|
||||
}
|
||||
|
||||
int spinand_match_and_init(struct spinand_device *dev,
|
||||
int spinand_match_and_init(struct spinand_device *spinand,
|
||||
const struct spinand_info *table,
|
||||
unsigned int table_size, u16 devid);
|
||||
unsigned int table_size,
|
||||
enum spinand_readid_method rdid_method);
|
||||
|
||||
int spinand_upd_cfg(struct spinand_device *spinand, u8 mask, u8 val);
|
||||
int spinand_select_target(struct spinand_device *spinand, unsigned int target);
|
||||
|
|
|
|||
|
|
@ -354,6 +354,7 @@ static inline unsigned long nfs_save_change_attribute(struct inode *dir)
|
|||
extern int nfs_sync_mapping(struct address_space *mapping);
|
||||
extern void nfs_zap_mapping(struct inode *inode, struct address_space *mapping);
|
||||
extern void nfs_zap_caches(struct inode *);
|
||||
extern void nfs_set_inode_stale(struct inode *inode);
|
||||
extern void nfs_invalidate_atime(struct inode *);
|
||||
extern struct inode *nfs_fhget(struct super_block *, struct nfs_fh *,
|
||||
struct nfs_fattr *, struct nfs4_label *);
|
||||
|
|
|
|||
|
|
@ -139,9 +139,14 @@ extern size_t nfs_generic_pg_test(struct nfs_pageio_descriptor *desc,
|
|||
extern int nfs_wait_on_request(struct nfs_page *);
|
||||
extern void nfs_unlock_request(struct nfs_page *req);
|
||||
extern void nfs_unlock_and_release_request(struct nfs_page *);
|
||||
extern struct nfs_page *nfs_page_group_lock_head(struct nfs_page *req);
|
||||
extern int nfs_page_group_lock_subrequests(struct nfs_page *head);
|
||||
extern void nfs_join_page_group(struct nfs_page *head, struct inode *inode);
|
||||
extern int nfs_page_group_lock(struct nfs_page *);
|
||||
extern void nfs_page_group_unlock(struct nfs_page *);
|
||||
extern bool nfs_page_group_sync_on_bit(struct nfs_page *, unsigned int);
|
||||
extern int nfs_page_set_headlock(struct nfs_page *req);
|
||||
extern void nfs_page_clear_headlock(struct nfs_page *req);
|
||||
extern bool nfs_async_iocounter_wait(struct rpc_task *, struct nfs_lock_context *);
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -1266,16 +1266,25 @@ struct nfstime4 {
|
|||
struct pnfs_commit_bucket {
|
||||
struct list_head written;
|
||||
struct list_head committing;
|
||||
struct pnfs_layout_segment *wlseg;
|
||||
struct pnfs_layout_segment *clseg;
|
||||
struct pnfs_layout_segment *lseg;
|
||||
struct nfs_writeverf direct_verf;
|
||||
};
|
||||
|
||||
struct pnfs_commit_array {
|
||||
struct list_head cinfo_list;
|
||||
struct list_head lseg_list;
|
||||
struct pnfs_layout_segment *lseg;
|
||||
struct rcu_head rcu;
|
||||
refcount_t refcount;
|
||||
unsigned int nbuckets;
|
||||
struct pnfs_commit_bucket buckets[];
|
||||
};
|
||||
|
||||
struct pnfs_ds_commit_info {
|
||||
int nwritten;
|
||||
int ncommitting;
|
||||
int nbuckets;
|
||||
struct pnfs_commit_bucket *buckets;
|
||||
struct list_head commits;
|
||||
unsigned int nwritten;
|
||||
unsigned int ncommitting;
|
||||
const struct pnfs_commit_ops *ops;
|
||||
};
|
||||
|
||||
struct nfs41_state_protection {
|
||||
|
|
@ -1386,22 +1395,11 @@ struct nfs41_free_stateid_res {
|
|||
unsigned int status;
|
||||
};
|
||||
|
||||
static inline void
|
||||
nfs_free_pnfs_ds_cinfo(struct pnfs_ds_commit_info *cinfo)
|
||||
{
|
||||
kfree(cinfo->buckets);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
struct pnfs_ds_commit_info {
|
||||
};
|
||||
|
||||
static inline void
|
||||
nfs_free_pnfs_ds_cinfo(struct pnfs_ds_commit_info *cinfo)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NFS_V4_1 */
|
||||
|
||||
#ifdef CONFIG_NFS_V4_2
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef _LINUX_NUMA_H
|
||||
#define _LINUX_NUMA_H
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#ifdef CONFIG_NODES_SHIFT
|
||||
#define NODES_SHIFT CONFIG_NODES_SHIFT
|
||||
|
|
@ -13,4 +13,32 @@
|
|||
|
||||
#define NUMA_NO_NODE (-1)
|
||||
|
||||
/* optionally keep NUMA memory info available post init */
|
||||
#ifdef CONFIG_NUMA_KEEP_MEMINFO
|
||||
#define __initdata_or_meminfo
|
||||
#else
|
||||
#define __initdata_or_meminfo __initdata
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
/* Generic implementation available */
|
||||
int numa_map_to_online_node(int node);
|
||||
|
||||
/*
|
||||
* Optional architecture specific implementation, users need a "depends
|
||||
* on $ARCH"
|
||||
*/
|
||||
int phys_to_target_node(phys_addr_t addr);
|
||||
#else
|
||||
static inline int numa_map_to_online_node(int node)
|
||||
{
|
||||
return NUMA_NO_NODE;
|
||||
}
|
||||
|
||||
static inline int phys_to_target_node(phys_addr_t addr)
|
||||
{
|
||||
return NUMA_NO_NODE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _LINUX_NUMA_H */
|
||||
|
|
|
|||
|
|
@ -270,8 +270,6 @@ struct nvme_fc_remote_port {
|
|||
*
|
||||
* Host/Initiator Transport Entrypoints/Parameters:
|
||||
*
|
||||
* @module: The LLDD module using the interface
|
||||
*
|
||||
* @localport_delete: The LLDD initiates deletion of a localport via
|
||||
* nvme_fc_deregister_localport(). However, the teardown is
|
||||
* asynchronous. This routine is called upon the completion of the
|
||||
|
|
@ -385,8 +383,6 @@ struct nvme_fc_remote_port {
|
|||
* Value is Mandatory. Allowed to be zero.
|
||||
*/
|
||||
struct nvme_fc_port_template {
|
||||
struct module *module;
|
||||
|
||||
/* initiator-based functions */
|
||||
void (*localport_delete)(struct nvme_fc_local_port *);
|
||||
void (*remoteport_delete)(struct nvme_fc_remote_port *);
|
||||
|
|
|
|||
|
|
@ -63,6 +63,7 @@ void *nvmem_cell_read(struct nvmem_cell *cell, size_t *len);
|
|||
int nvmem_cell_write(struct nvmem_cell *cell, void *buf, size_t len);
|
||||
int nvmem_cell_read_u16(struct device *dev, const char *cell_id, u16 *val);
|
||||
int nvmem_cell_read_u32(struct device *dev, const char *cell_id, u32 *val);
|
||||
int nvmem_cell_read_u64(struct device *dev, const char *cell_id, u64 *val);
|
||||
|
||||
/* direct nvmem device read/write interface */
|
||||
struct nvmem_device *nvmem_device_get(struct device *dev, const char *name);
|
||||
|
|
@ -138,6 +139,12 @@ static inline int nvmem_cell_read_u32(struct device *dev,
|
|||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline int nvmem_cell_read_u64(struct device *dev,
|
||||
const char *cell_id, u64 *val)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
static inline struct nvmem_device *nvmem_device_get(struct device *dev,
|
||||
const char *name)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -10,21 +10,27 @@ struct of_pci_range_parser {
|
|||
struct device_node *node;
|
||||
const __be32 *range;
|
||||
const __be32 *end;
|
||||
int np;
|
||||
int na;
|
||||
int ns;
|
||||
int pna;
|
||||
bool dma;
|
||||
};
|
||||
#define of_range_parser of_pci_range_parser
|
||||
|
||||
struct of_pci_range {
|
||||
u32 pci_space;
|
||||
u64 pci_addr;
|
||||
union {
|
||||
u64 pci_addr;
|
||||
u64 bus_addr;
|
||||
};
|
||||
u64 cpu_addr;
|
||||
u64 size;
|
||||
u32 flags;
|
||||
};
|
||||
#define of_range of_pci_range
|
||||
|
||||
#define for_each_of_pci_range(parser, range) \
|
||||
for (; of_pci_range_parser_one(parser, range);)
|
||||
#define for_each_of_range for_each_of_pci_range
|
||||
|
||||
/* Translate a DMA address from device space to CPU space */
|
||||
extern u64 of_translate_dma_address(struct device_node *dev,
|
||||
|
|
@ -143,4 +149,3 @@ static inline int of_pci_range_to_resource(struct of_pci_range *range,
|
|||
#endif /* CONFIG_OF_ADDRESS && CONFIG_PCI */
|
||||
|
||||
#endif /* __OF_ADDRESS_H */
|
||||
|
||||
|
|
|
|||
|
|
@ -11,9 +11,8 @@
|
|||
#define __LINUX_OF_GPIO_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/gpio/driver.h>
|
||||
#include <linux/gpio.h> /* FIXME: Shouldn't be here */
|
||||
#include <linux/of.h>
|
||||
|
||||
struct device_node;
|
||||
|
|
@ -34,6 +33,8 @@ enum of_gpio_flags {
|
|||
|
||||
#ifdef CONFIG_OF_GPIO
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
/*
|
||||
* OF GPIO chip for memory mapped banks
|
||||
*/
|
||||
|
|
@ -63,6 +64,8 @@ extern void of_mm_gpiochip_remove(struct of_mm_gpio_chip *mm_gc);
|
|||
|
||||
#else /* CONFIG_OF_GPIO */
|
||||
|
||||
#include <linux/errno.h>
|
||||
|
||||
/* Drivers may not strictly depend on the GPIO support, so let them link. */
|
||||
static inline int of_get_named_gpio_flags(struct device_node *np,
|
||||
const char *list_name, int index, enum of_gpio_flags *flags)
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue