Merge tag 'char-misc-4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver updates from Greg KH:
"Here is the big char/misc driver update for 4.14-rc1.
Lots of different stuff in here, it's been an active development cycle
for some reason. Highlights are:
- updated binder driver, this brings binder up to date with what
shipped in the Android O release, plus some more changes that
happened since then that are in the Android development trees.
- coresight updates and fixes
- mux driver file renames to be a bit "nicer"
- intel_th driver updates
- normal set of hyper-v updates and changes
- small fpga subsystem and driver updates
- lots of const code changes all over the driver trees
- extcon driver updates
- fmc driver subsystem upadates
- w1 subsystem minor reworks and new features and drivers added
- spmi driver updates
Plus a smattering of other minor driver updates and fixes.
All of these have been in linux-next with no reported issues for a
while"
* tag 'char-misc-4.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc: (244 commits)
ANDROID: binder: don't queue async transactions to thread.
ANDROID: binder: don't enqueue death notifications to thread todo.
ANDROID: binder: Don't BUG_ON(!spin_is_locked()).
ANDROID: binder: Add BINDER_GET_NODE_DEBUG_INFO ioctl
ANDROID: binder: push new transactions to waiting threads.
ANDROID: binder: remove proc waitqueue
android: binder: Add page usage in binder stats
android: binder: fixup crash introduced by moving buffer hdr
drivers: w1: add hwmon temp support for w1_therm
drivers: w1: refactor w1_slave_show to make the temp reading functionality separate
drivers: w1: add hwmon support structures
eeprom: idt_89hpesx: Support both ACPI and OF probing
mcb: Fix an error handling path in 'chameleon_parse_cells()'
MCB: add support for SC31 to mcb-lpc
mux: make device_type const
char: virtio: constify attribute_group structures.
Documentation/ABI: document the nvmem sysfs files
lkdtm: fix spelling mistake: "incremeted" -> "incremented"
perf: cs-etm: Fix ETMv4 CONFIGR entry in perf.data file
nvmem: include linux/err.h from header
...
This commit is contained in:
@@ -29,6 +29,8 @@ static inline u32 __bitrev32(u32 x)
|
||||
|
||||
#endif /* CONFIG_HAVE_ARCH_BITREVERSE */
|
||||
|
||||
#define __bitrev8x4(x) (__bitrev32(swab32(x)))
|
||||
|
||||
#define __constant_bitrev32(x) \
|
||||
({ \
|
||||
u32 __x = x; \
|
||||
@@ -50,6 +52,15 @@ static inline u32 __bitrev32(u32 x)
|
||||
__x; \
|
||||
})
|
||||
|
||||
#define __constant_bitrev8x4(x) \
|
||||
({ \
|
||||
u32 __x = x; \
|
||||
__x = ((__x & (u32)0xF0F0F0F0UL) >> 4) | ((__x & (u32)0x0F0F0F0FUL) << 4); \
|
||||
__x = ((__x & (u32)0xCCCCCCCCUL) >> 2) | ((__x & (u32)0x33333333UL) << 2); \
|
||||
__x = ((__x & (u32)0xAAAAAAAAUL) >> 1) | ((__x & (u32)0x55555555UL) << 1); \
|
||||
__x; \
|
||||
})
|
||||
|
||||
#define __constant_bitrev8(x) \
|
||||
({ \
|
||||
u8 __x = x; \
|
||||
@@ -75,6 +86,14 @@ static inline u32 __bitrev32(u32 x)
|
||||
__bitrev16(__x); \
|
||||
})
|
||||
|
||||
#define bitrev8x4(x) \
|
||||
({ \
|
||||
u32 __x = x; \
|
||||
__builtin_constant_p(__x) ? \
|
||||
__constant_bitrev8x4(__x) : \
|
||||
__bitrev8x4(__x); \
|
||||
})
|
||||
|
||||
#define bitrev8(x) \
|
||||
({ \
|
||||
u8 __x = x; \
|
||||
|
||||
@@ -24,6 +24,12 @@
|
||||
/* ETMv3.5/PTM's ETMCR config bit */
|
||||
#define ETM_OPT_CYCACC 12
|
||||
#define ETM_OPT_TS 28
|
||||
#define ETM_OPT_RETSTK 29
|
||||
|
||||
/* ETMv4 CONFIGR programming bits for the ETM OPTs */
|
||||
#define ETM4_CFG_BIT_CYCACC 4
|
||||
#define ETM4_CFG_BIT_TS 11
|
||||
#define ETM4_CFG_BIT_RETSTK 12
|
||||
|
||||
static inline int coresight_get_trace_id(int cpu)
|
||||
{
|
||||
|
||||
@@ -2,8 +2,7 @@
|
||||
* Module: eeprom_93xx46
|
||||
* platform description for 93xx46 EEPROMs.
|
||||
*/
|
||||
|
||||
struct gpio_desc;
|
||||
#include <linux/gpio/consumer.h>
|
||||
|
||||
struct eeprom_93xx46_platform_data {
|
||||
unsigned char flags;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* External connector (extcon) class driver
|
||||
* External Connector (extcon) framework
|
||||
*
|
||||
* Copyright (C) 2015 Samsung Electronics
|
||||
* Author: Chanwoo Choi <cw00.choi@samsung.com>
|
||||
@@ -20,8 +20,7 @@
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
*/
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_EXTCON_H__
|
||||
#define __LINUX_EXTCON_H__
|
||||
@@ -93,7 +92,7 @@
|
||||
#define EXTCON_NUM 63
|
||||
|
||||
/*
|
||||
* Define the property of supported external connectors.
|
||||
* Define the properties of supported external connectors.
|
||||
*
|
||||
* When adding the new extcon property, they *must* have
|
||||
* the type/value/default information. Also, you *have to*
|
||||
@@ -176,44 +175,42 @@ struct extcon_dev;
|
||||
|
||||
#if IS_ENABLED(CONFIG_EXTCON)
|
||||
|
||||
/*
|
||||
* Following APIs are for notifiers or configurations.
|
||||
* Notifiers are the external port and connection devices.
|
||||
*/
|
||||
/* 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,
|
||||
struct extcon_dev *edev);
|
||||
struct extcon_dev *edev);
|
||||
extern void devm_extcon_dev_unregister(struct device *dev,
|
||||
struct extcon_dev *edev);
|
||||
extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
|
||||
struct extcon_dev *edev);
|
||||
|
||||
/*
|
||||
* Following APIs control the memory of extcon device.
|
||||
*/
|
||||
/* 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,
|
||||
const unsigned int *cable);
|
||||
const unsigned int *cable);
|
||||
extern void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev);
|
||||
|
||||
/*
|
||||
* get/set_state access each bit of the 32b encoded state value.
|
||||
* They are used to access the status of each cable based on the cable id.
|
||||
*/
|
||||
extern int extcon_get_state(struct extcon_dev *edev, unsigned int id);
|
||||
extern int extcon_set_state(struct extcon_dev *edev, unsigned int id,
|
||||
bool cable_state);
|
||||
extern int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
||||
bool cable_state);
|
||||
/*
|
||||
* Synchronize the state and property data for a specific external connector.
|
||||
*/
|
||||
/* Synchronize the state and property value for each external connector. */
|
||||
extern int extcon_sync(struct extcon_dev *edev, unsigned int id);
|
||||
|
||||
/*
|
||||
* get/set_property access the property value of each external connector.
|
||||
* They are used to access the property of each cable based on the property id.
|
||||
* Following APIs get/set the connected state of each external connector.
|
||||
* The 'id' argument indicates the defined external connector.
|
||||
*/
|
||||
extern int extcon_get_state(struct extcon_dev *edev, unsigned int id);
|
||||
extern 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,
|
||||
bool state);
|
||||
|
||||
/*
|
||||
* Following APIs get/set the property of each external connector.
|
||||
* The 'id' argument indicates the defined external connector
|
||||
* and the 'prop' indicates the extcon property.
|
||||
*
|
||||
* And extcon_get/set_property_capability() set the capability of the property
|
||||
* 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_get_property(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
@@ -224,28 +221,24 @@ extern int extcon_set_property(struct extcon_dev *edev, unsigned int id,
|
||||
extern int extcon_set_property_sync(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val);
|
||||
|
||||
/*
|
||||
* get/set_property_capability set the capability of the property 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_get_property_capability(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop);
|
||||
extern int extcon_set_property_capability(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop);
|
||||
|
||||
/*
|
||||
* Following APIs are to monitor the status change of the external connectors.
|
||||
* Following APIs register the notifier block in order to detect
|
||||
* the change of both state and property value for each external connector.
|
||||
*
|
||||
* extcon_register_notifier(*edev, id, *nb) : Register a notifier block
|
||||
* for specific external connector of the extcon.
|
||||
* extcon_register_notifier_all(*edev, *nb) : Register a notifier block
|
||||
* for all supported external connectors of the extcon.
|
||||
*/
|
||||
extern int extcon_register_notifier(struct extcon_dev *edev, unsigned int id,
|
||||
struct notifier_block *nb);
|
||||
struct notifier_block *nb);
|
||||
extern int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id,
|
||||
struct notifier_block *nb);
|
||||
struct notifier_block *nb);
|
||||
extern int devm_extcon_register_notifier(struct device *dev,
|
||||
struct extcon_dev *edev, unsigned int id,
|
||||
struct notifier_block *nb);
|
||||
@@ -265,16 +258,15 @@ extern void devm_extcon_unregister_notifier_all(struct device *dev,
|
||||
struct notifier_block *nb);
|
||||
|
||||
/*
|
||||
* Following API get the extcon device from devicetree.
|
||||
* This function use phandle of devicetree to get extcon device directly.
|
||||
* Following APIs get the extcon_dev from devicetree or by through extcon name.
|
||||
*/
|
||||
extern struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name);
|
||||
extern struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
|
||||
int index);
|
||||
|
||||
/* Following API to get information of extcon device */
|
||||
/* Following API get the name of extcon device. */
|
||||
extern const char *extcon_get_edev_name(struct extcon_dev *edev);
|
||||
|
||||
|
||||
#else /* CONFIG_EXTCON */
|
||||
static inline int extcon_dev_register(struct extcon_dev *edev)
|
||||
{
|
||||
@@ -284,13 +276,13 @@ static inline int extcon_dev_register(struct extcon_dev *edev)
|
||||
static inline void extcon_dev_unregister(struct extcon_dev *edev) { }
|
||||
|
||||
static inline int devm_extcon_dev_register(struct device *dev,
|
||||
struct extcon_dev *edev)
|
||||
struct extcon_dev *edev)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline void devm_extcon_dev_unregister(struct device *dev,
|
||||
struct extcon_dev *edev) { }
|
||||
struct extcon_dev *edev) { }
|
||||
|
||||
static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable)
|
||||
{
|
||||
@@ -300,7 +292,7 @@ static inline struct extcon_dev *extcon_dev_allocate(const unsigned int *cable)
|
||||
static inline void extcon_dev_free(struct extcon_dev *edev) { }
|
||||
|
||||
static inline struct extcon_dev *devm_extcon_dev_allocate(struct device *dev,
|
||||
const unsigned int *cable)
|
||||
const unsigned int *cable)
|
||||
{
|
||||
return ERR_PTR(-ENOSYS);
|
||||
}
|
||||
@@ -314,13 +306,13 @@ static inline int extcon_get_state(struct extcon_dev *edev, unsigned int id)
|
||||
}
|
||||
|
||||
static inline int extcon_set_state(struct extcon_dev *edev, unsigned int id,
|
||||
bool cable_state)
|
||||
bool state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_set_state_sync(struct extcon_dev *edev, unsigned int id,
|
||||
bool cable_state)
|
||||
bool state)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -331,52 +323,45 @@ static inline int extcon_sync(struct extcon_dev *edev, unsigned int id)
|
||||
}
|
||||
|
||||
static inline int extcon_get_property(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value *prop_val)
|
||||
unsigned int prop,
|
||||
union extcon_property_value *prop_val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int extcon_set_property(struct extcon_dev *edev, unsigned int id,
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val)
|
||||
unsigned int prop,
|
||||
union extcon_property_value prop_val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_set_property_sync(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop,
|
||||
union extcon_property_value prop_val)
|
||||
unsigned int id, unsigned int prop,
|
||||
union extcon_property_value prop_val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_get_property_capability(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop)
|
||||
unsigned int id, unsigned int prop)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_set_property_capability(struct extcon_dev *edev,
|
||||
unsigned int id, unsigned int prop)
|
||||
unsigned int id, unsigned int prop)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int extcon_register_notifier(struct extcon_dev *edev,
|
||||
unsigned int id,
|
||||
struct notifier_block *nb)
|
||||
unsigned int id, struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int extcon_unregister_notifier(struct extcon_dev *edev,
|
||||
unsigned int id,
|
||||
struct notifier_block *nb)
|
||||
unsigned int id, struct notifier_block *nb)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -392,8 +377,13 @@ static inline void devm_extcon_unregister_notifier(struct device *dev,
|
||||
struct extcon_dev *edev, unsigned int id,
|
||||
struct notifier_block *nb) { }
|
||||
|
||||
static inline struct extcon_dev *extcon_get_extcon_dev(const char *extcon_name)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
|
||||
static inline struct extcon_dev *extcon_get_edev_by_phandle(struct device *dev,
|
||||
int index)
|
||||
int index)
|
||||
{
|
||||
return ERR_PTR(-ENODEV);
|
||||
}
|
||||
@@ -411,26 +401,14 @@ struct extcon_specific_cable_nb {
|
||||
};
|
||||
|
||||
static inline int extcon_register_interest(struct extcon_specific_cable_nb *obj,
|
||||
const char *extcon_name, const char *cable_name,
|
||||
struct notifier_block *nb)
|
||||
const char *extcon_name, const char *cable_name,
|
||||
struct notifier_block *nb)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int extcon_unregister_interest(struct extcon_specific_cable_nb
|
||||
*obj)
|
||||
static inline int extcon_unregister_interest(struct extcon_specific_cable_nb *obj)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int extcon_get_cable_state_(struct extcon_dev *edev, unsigned int id)
|
||||
{
|
||||
return extcon_get_state(edev, id);
|
||||
}
|
||||
|
||||
static inline int extcon_set_cable_state_(struct extcon_dev *edev, unsigned int id,
|
||||
bool cable_state)
|
||||
{
|
||||
return extcon_set_state_sync(edev, id, cable_state);
|
||||
}
|
||||
#endif /* __LINUX_EXTCON_H__ */
|
||||
|
||||
@@ -132,6 +132,8 @@ struct fmc_operations {
|
||||
uint32_t (*read32)(struct fmc_device *fmc, int offset);
|
||||
void (*write32)(struct fmc_device *fmc, uint32_t value, int offset);
|
||||
int (*validate)(struct fmc_device *fmc, struct fmc_driver *drv);
|
||||
int (*reprogram_raw)(struct fmc_device *f, struct fmc_driver *d,
|
||||
void *gw, unsigned long len);
|
||||
int (*reprogram)(struct fmc_device *f, struct fmc_driver *d, char *gw);
|
||||
int (*irq_request)(struct fmc_device *fmc, irq_handler_t h,
|
||||
char *name, int flags);
|
||||
@@ -144,6 +146,8 @@ struct fmc_operations {
|
||||
};
|
||||
|
||||
/* Prefer this helper rather than calling of fmc->reprogram directly */
|
||||
int fmc_reprogram_raw(struct fmc_device *fmc, struct fmc_driver *d,
|
||||
void *gw, unsigned long len, int sdb_entry);
|
||||
extern int fmc_reprogram(struct fmc_device *f, struct fmc_driver *d, char *gw,
|
||||
int sdb_entry);
|
||||
|
||||
@@ -180,6 +184,9 @@ struct fmc_device {
|
||||
uint32_t device_id; /* Filled by the device */
|
||||
char *mezzanine_name; /* Defaults to ``fmc'' */
|
||||
void *mezzanine_data;
|
||||
|
||||
struct dentry *dbg_dir;
|
||||
struct dentry *dbg_sdb_dump;
|
||||
};
|
||||
#define to_fmc_device(x) container_of((x), struct fmc_device, dev)
|
||||
|
||||
@@ -217,14 +224,23 @@ static inline void fmc_set_drvdata(struct fmc_device *fmc, void *data)
|
||||
dev_set_drvdata(&fmc->dev, data);
|
||||
}
|
||||
|
||||
/* The 4 access points */
|
||||
struct fmc_gateware {
|
||||
void *bitstream;
|
||||
unsigned long len;
|
||||
};
|
||||
|
||||
/* The 5 access points */
|
||||
extern int fmc_driver_register(struct fmc_driver *drv);
|
||||
extern void fmc_driver_unregister(struct fmc_driver *drv);
|
||||
extern int fmc_device_register(struct fmc_device *tdev);
|
||||
extern int fmc_device_register_gw(struct fmc_device *tdev,
|
||||
struct fmc_gateware *gw);
|
||||
extern void fmc_device_unregister(struct fmc_device *tdev);
|
||||
|
||||
/* Two more for device sets, all driven by the same FPGA */
|
||||
/* Three more for device sets, all driven by the same FPGA */
|
||||
extern int fmc_device_register_n(struct fmc_device **devs, int n);
|
||||
extern int fmc_device_register_n_gw(struct fmc_device **devs, int n,
|
||||
struct fmc_gateware *gw);
|
||||
extern void fmc_device_unregister_n(struct fmc_device **devs, int n);
|
||||
|
||||
/* Internal cross-calls between files; not exported to other modules */
|
||||
@@ -232,6 +248,23 @@ extern int fmc_match(struct device *dev, struct device_driver *drv);
|
||||
extern int fmc_fill_id_info(struct fmc_device *fmc);
|
||||
extern void fmc_free_id_info(struct fmc_device *fmc);
|
||||
extern void fmc_dump_eeprom(const struct fmc_device *fmc);
|
||||
extern void fmc_dump_sdb(const struct fmc_device *fmc);
|
||||
|
||||
/* helpers for FMC operations */
|
||||
extern int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h,
|
||||
char *name, int flags);
|
||||
extern void fmc_irq_free(struct fmc_device *fmc);
|
||||
extern void fmc_irq_ack(struct fmc_device *fmc);
|
||||
extern int fmc_validate(struct fmc_device *fmc, struct fmc_driver *drv);
|
||||
extern int fmc_gpio_config(struct fmc_device *fmc, struct fmc_gpio *gpio,
|
||||
int ngpio);
|
||||
extern int fmc_read_ee(struct fmc_device *fmc, int pos, void *d, int l);
|
||||
extern int fmc_write_ee(struct fmc_device *fmc, int pos, const void *d, int l);
|
||||
|
||||
/* helpers for FMC operations */
|
||||
extern int fmc_irq_request(struct fmc_device *fmc, irq_handler_t h,
|
||||
char *name, int flags);
|
||||
extern void fmc_irq_free(struct fmc_device *fmc);
|
||||
extern void fmc_irq_ack(struct fmc_device *fmc);
|
||||
extern int fmc_validate(struct fmc_device *fmc, struct fmc_driver *drv);
|
||||
|
||||
#endif /* __LINUX_FMC_H__ */
|
||||
|
||||
@@ -67,10 +67,14 @@ enum fpga_mgr_states {
|
||||
* FPGA Manager flags
|
||||
* FPGA_MGR_PARTIAL_RECONFIG: do partial reconfiguration if supported
|
||||
* FPGA_MGR_EXTERNAL_CONFIG: FPGA has been configured prior to Linux booting
|
||||
* FPGA_MGR_BITSTREAM_LSB_FIRST: SPI bitstream bit order is LSB first
|
||||
* FPGA_MGR_COMPRESSED_BITSTREAM: FPGA bitstream is compressed
|
||||
*/
|
||||
#define FPGA_MGR_PARTIAL_RECONFIG BIT(0)
|
||||
#define FPGA_MGR_EXTERNAL_CONFIG BIT(1)
|
||||
#define FPGA_MGR_ENCRYPTED_BITSTREAM BIT(2)
|
||||
#define FPGA_MGR_BITSTREAM_LSB_FIRST BIT(3)
|
||||
#define FPGA_MGR_COMPRESSED_BITSTREAM BIT(4)
|
||||
|
||||
/**
|
||||
* struct fpga_image_info - information specific to a FPGA image
|
||||
|
||||
@@ -2473,9 +2473,13 @@ static inline void bd_unlink_disk_holder(struct block_device *bdev,
|
||||
#endif
|
||||
|
||||
/* fs/char_dev.c */
|
||||
#define CHRDEV_MAJOR_HASH_SIZE 255
|
||||
#define CHRDEV_MAJOR_MAX 512
|
||||
/* Marks the bottom of the first segment of free char majors */
|
||||
#define CHRDEV_MAJOR_DYN_END 234
|
||||
/* Marks the top and bottom of the second segment of free char majors */
|
||||
#define CHRDEV_MAJOR_DYN_EXT_START 511
|
||||
#define CHRDEV_MAJOR_DYN_EXT_END 384
|
||||
|
||||
extern int alloc_chrdev_region(dev_t *, unsigned, unsigned, const char *);
|
||||
extern int register_chrdev_region(dev_t, unsigned, const char *);
|
||||
extern int __register_chrdev(unsigned int major, unsigned int baseminor,
|
||||
@@ -2502,14 +2506,14 @@ static inline void unregister_chrdev(unsigned int major, const char *name)
|
||||
#define BDEVT_SIZE 10 /* Largest string for MAJ:MIN for blkdev */
|
||||
|
||||
#ifdef CONFIG_BLOCK
|
||||
#define BLKDEV_MAJOR_HASH_SIZE 255
|
||||
#define BLKDEV_MAJOR_MAX 512
|
||||
extern const char *__bdevname(dev_t, char *buffer);
|
||||
extern const char *bdevname(struct block_device *bdev, char *buffer);
|
||||
extern struct block_device *lookup_bdev(const char *);
|
||||
extern void blkdev_show(struct seq_file *,off_t);
|
||||
|
||||
#else
|
||||
#define BLKDEV_MAJOR_HASH_SIZE 0
|
||||
#define BLKDEV_MAJOR_MAX 0
|
||||
#endif
|
||||
|
||||
extern void init_special_inode(struct inode *, umode_t, dev_t);
|
||||
|
||||
@@ -124,10 +124,7 @@ struct hv_ring_buffer_info {
|
||||
spinlock_t ring_lock;
|
||||
|
||||
u32 ring_datasize; /* < ring_size */
|
||||
u32 ring_data_startoffset;
|
||||
u32 priv_write_index;
|
||||
u32 priv_read_index;
|
||||
u32 cached_read_index;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -180,19 +177,6 @@ static inline u32 hv_get_bytes_to_write(const struct hv_ring_buffer_info *rbi)
|
||||
return write;
|
||||
}
|
||||
|
||||
static inline u32 hv_get_cached_bytes_to_write(
|
||||
const struct hv_ring_buffer_info *rbi)
|
||||
{
|
||||
u32 read_loc, write_loc, dsize, write;
|
||||
|
||||
dsize = rbi->ring_datasize;
|
||||
read_loc = rbi->cached_read_index;
|
||||
write_loc = rbi->ring_buffer->write_index;
|
||||
|
||||
write = write_loc >= read_loc ? dsize - (write_loc - read_loc) :
|
||||
read_loc - write_loc;
|
||||
return write;
|
||||
}
|
||||
/*
|
||||
* VMBUS version is 32 bit entity broken up into
|
||||
* two 16 bit quantities: major_number. minor_number.
|
||||
@@ -895,6 +879,8 @@ struct vmbus_channel {
|
||||
*/
|
||||
enum hv_numa_policy affinity_policy;
|
||||
|
||||
bool probe_done;
|
||||
|
||||
};
|
||||
|
||||
static inline bool is_hvsock_channel(const struct vmbus_channel *c)
|
||||
@@ -1473,55 +1459,6 @@ hv_get_ring_buffer(const struct hv_ring_buffer_info *ring_info)
|
||||
return ring_info->ring_buffer->buffer;
|
||||
}
|
||||
|
||||
/*
|
||||
* To optimize the flow management on the send-side,
|
||||
* when the sender is blocked because of lack of
|
||||
* sufficient space in the ring buffer, potential the
|
||||
* consumer of the ring buffer can signal the producer.
|
||||
* This is controlled by the following parameters:
|
||||
*
|
||||
* 1. pending_send_sz: This is the size in bytes that the
|
||||
* producer is trying to send.
|
||||
* 2. The feature bit feat_pending_send_sz set to indicate if
|
||||
* the consumer of the ring will signal when the ring
|
||||
* state transitions from being full to a state where
|
||||
* there is room for the producer to send the pending packet.
|
||||
*/
|
||||
|
||||
static inline void hv_signal_on_read(struct vmbus_channel *channel)
|
||||
{
|
||||
u32 cur_write_sz, cached_write_sz;
|
||||
u32 pending_sz;
|
||||
struct hv_ring_buffer_info *rbi = &channel->inbound;
|
||||
|
||||
/*
|
||||
* Issue a full memory barrier before making the signaling decision.
|
||||
* Here is the reason for having this barrier:
|
||||
* If the reading of the pend_sz (in this function)
|
||||
* were to be reordered and read before we commit the new read
|
||||
* index (in the calling function) we could
|
||||
* have a problem. If the host were to set the pending_sz after we
|
||||
* have sampled pending_sz and go to sleep before we commit the
|
||||
* read index, we could miss sending the interrupt. Issue a full
|
||||
* memory barrier to address this.
|
||||
*/
|
||||
virt_mb();
|
||||
|
||||
pending_sz = READ_ONCE(rbi->ring_buffer->pending_send_sz);
|
||||
/* If the other end is not blocked on write don't bother. */
|
||||
if (pending_sz == 0)
|
||||
return;
|
||||
|
||||
cur_write_sz = hv_get_bytes_to_write(rbi);
|
||||
|
||||
if (cur_write_sz < pending_sz)
|
||||
return;
|
||||
|
||||
cached_write_sz = hv_get_cached_bytes_to_write(rbi);
|
||||
if (cached_write_sz < pending_sz)
|
||||
vmbus_setevent(channel);
|
||||
}
|
||||
|
||||
/*
|
||||
* Mask off host interrupt callback notifications
|
||||
*/
|
||||
|
||||
@@ -285,6 +285,11 @@ enum host_event_code {
|
||||
EC_HOST_EVENT_HANG_DETECT = 20,
|
||||
/* Hang detect logic detected a hang and warm rebooted the AP */
|
||||
EC_HOST_EVENT_HANG_REBOOT = 21,
|
||||
/* PD MCU triggering host event */
|
||||
EC_HOST_EVENT_PD_MCU = 22,
|
||||
|
||||
/* EC desires to change state of host-controlled USB mux */
|
||||
EC_HOST_EVENT_USB_MUX = 28,
|
||||
|
||||
/*
|
||||
* The high bit of the event mask is not used as a host event code. If
|
||||
@@ -2905,6 +2910,76 @@ struct ec_params_usb_pd_control {
|
||||
uint8_t mux;
|
||||
} __packed;
|
||||
|
||||
#define PD_CTRL_RESP_ENABLED_COMMS (1 << 0) /* Communication enabled */
|
||||
#define PD_CTRL_RESP_ENABLED_CONNECTED (1 << 1) /* Device connected */
|
||||
#define PD_CTRL_RESP_ENABLED_PD_CAPABLE (1 << 2) /* Partner is PD capable */
|
||||
|
||||
struct ec_response_usb_pd_control_v1 {
|
||||
uint8_t enabled;
|
||||
uint8_t role;
|
||||
uint8_t polarity;
|
||||
char state[32];
|
||||
} __packed;
|
||||
|
||||
#define EC_CMD_USB_PD_PORTS 0x102
|
||||
|
||||
struct ec_response_usb_pd_ports {
|
||||
uint8_t num_ports;
|
||||
} __packed;
|
||||
|
||||
#define EC_CMD_USB_PD_POWER_INFO 0x103
|
||||
|
||||
#define PD_POWER_CHARGING_PORT 0xff
|
||||
struct ec_params_usb_pd_power_info {
|
||||
uint8_t port;
|
||||
} __packed;
|
||||
|
||||
enum usb_chg_type {
|
||||
USB_CHG_TYPE_NONE,
|
||||
USB_CHG_TYPE_PD,
|
||||
USB_CHG_TYPE_C,
|
||||
USB_CHG_TYPE_PROPRIETARY,
|
||||
USB_CHG_TYPE_BC12_DCP,
|
||||
USB_CHG_TYPE_BC12_CDP,
|
||||
USB_CHG_TYPE_BC12_SDP,
|
||||
USB_CHG_TYPE_OTHER,
|
||||
USB_CHG_TYPE_VBUS,
|
||||
USB_CHG_TYPE_UNKNOWN,
|
||||
};
|
||||
|
||||
struct usb_chg_measures {
|
||||
uint16_t voltage_max;
|
||||
uint16_t voltage_now;
|
||||
uint16_t current_max;
|
||||
uint16_t current_lim;
|
||||
} __packed;
|
||||
|
||||
struct ec_response_usb_pd_power_info {
|
||||
uint8_t role;
|
||||
uint8_t type;
|
||||
uint8_t dualrole;
|
||||
uint8_t reserved1;
|
||||
struct usb_chg_measures meas;
|
||||
uint32_t max_power;
|
||||
} __packed;
|
||||
|
||||
/* Get info about USB-C SS muxes */
|
||||
#define EC_CMD_USB_PD_MUX_INFO 0x11a
|
||||
|
||||
struct ec_params_usb_pd_mux_info {
|
||||
uint8_t port; /* USB-C port number */
|
||||
} __packed;
|
||||
|
||||
/* Flags representing mux state */
|
||||
#define USB_PD_MUX_USB_ENABLED (1 << 0)
|
||||
#define USB_PD_MUX_DP_ENABLED (1 << 1)
|
||||
#define USB_PD_MUX_POLARITY_INVERTED (1 << 2)
|
||||
#define USB_PD_MUX_HPD_IRQ (1 << 3)
|
||||
|
||||
struct ec_response_usb_pd_mux_info {
|
||||
uint8_t flags; /* USB_PD_MUX_*-encoded USB mux state */
|
||||
} __packed;
|
||||
|
||||
/*****************************************************************************/
|
||||
/*
|
||||
* Passthru commands
|
||||
|
||||
@@ -1,13 +1,28 @@
|
||||
/* MFD cell driver data for the DS1WM driver */
|
||||
/* MFD cell driver data for the DS1WM driver
|
||||
*
|
||||
* to be defined in the MFD device that is
|
||||
* using this driver for one of his sub devices
|
||||
*/
|
||||
|
||||
struct ds1wm_driver_data {
|
||||
int active_high;
|
||||
int clock_rate;
|
||||
/* in milliseconds, the amount of time to */
|
||||
/* sleep following a reset pulse. Zero */
|
||||
/* should work if your bus devices recover*/
|
||||
/* time respects the 1-wire spec since the*/
|
||||
/* ds1wm implements the precise timings of*/
|
||||
/* a reset pulse/presence detect sequence.*/
|
||||
/* in milliseconds, the amount of time to
|
||||
* sleep following a reset pulse. Zero
|
||||
* should work if your bus devices recover
|
||||
* time respects the 1-wire spec since the
|
||||
* ds1wm implements the precise timings of
|
||||
* a reset pulse/presence detect sequence.
|
||||
*/
|
||||
unsigned int reset_recover_delay;
|
||||
|
||||
/* Say 1 here for big endian Hardware
|
||||
* (only relevant with bus-shift > 0
|
||||
*/
|
||||
bool is_hw_big_endian;
|
||||
|
||||
/* left shift of register number to get register address offsett.
|
||||
* Only 0,1,2 allowed for 8,16 or 32 bit bus width respectively
|
||||
*/
|
||||
unsigned int bus_shift;
|
||||
};
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
#ifndef _LINUX_MUX_CONSUMER_H
|
||||
#define _LINUX_MUX_CONSUMER_H
|
||||
|
||||
#include <linux/compiler.h>
|
||||
|
||||
struct device;
|
||||
struct mux_control;
|
||||
|
||||
|
||||
@@ -12,6 +12,9 @@
|
||||
#ifndef _LINUX_NVMEM_CONSUMER_H
|
||||
#define _LINUX_NVMEM_CONSUMER_H
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/errno.h>
|
||||
|
||||
struct device;
|
||||
struct device_node;
|
||||
/* consumer cookie */
|
||||
@@ -35,6 +38,7 @@ void nvmem_cell_put(struct nvmem_cell *cell);
|
||||
void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell);
|
||||
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_u32(struct device *dev, const char *cell_id, u32 *val);
|
||||
|
||||
/* direct nvmem device read/write interface */
|
||||
struct nvmem_device *nvmem_device_get(struct device *dev, const char *name);
|
||||
@@ -85,6 +89,12 @@ static inline int nvmem_cell_write(struct nvmem_cell *cell,
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int nvmem_cell_read_u32(struct device *dev,
|
||||
const char *cell_id, u32 *val)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline struct nvmem_device *nvmem_device_get(struct device *dev,
|
||||
const char *name)
|
||||
{
|
||||
|
||||
@@ -68,6 +68,7 @@ struct w1_reg_num {
|
||||
* @family: module for device family type
|
||||
* @family_data: pointer for use by the family module
|
||||
* @dev: kernel device identifier
|
||||
* @hwmon: pointer to hwmon device
|
||||
*
|
||||
*/
|
||||
struct w1_slave {
|
||||
@@ -83,6 +84,7 @@ struct w1_slave {
|
||||
struct w1_family *family;
|
||||
void *family_data;
|
||||
struct device dev;
|
||||
struct device *hwmon;
|
||||
};
|
||||
|
||||
typedef void (*w1_slave_found_callback)(struct w1_master *, u64);
|
||||
@@ -250,11 +252,13 @@ void w1_remove_master_device(struct w1_bus_master *master);
|
||||
* @add_slave: add_slave
|
||||
* @remove_slave: remove_slave
|
||||
* @groups: sysfs group
|
||||
* @chip_info: pointer to struct hwmon_chip_info
|
||||
*/
|
||||
struct w1_family_ops {
|
||||
int (*add_slave)(struct w1_slave *sl);
|
||||
void (*remove_slave)(struct w1_slave *sl);
|
||||
const struct attribute_group **groups;
|
||||
const struct hwmon_chip_info *chip_info;
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -132,6 +132,7 @@ enum {
|
||||
|
||||
/* struct binder_fd_array_object - object describing an array of fds in a buffer
|
||||
* @hdr: common header structure
|
||||
* @pad: padding to ensure correct alignment
|
||||
* @num_fds: number of file descriptors in the buffer
|
||||
* @parent: index in offset array to buffer holding the fd array
|
||||
* @parent_offset: start offset of fd array in the buffer
|
||||
@@ -152,6 +153,7 @@ enum {
|
||||
*/
|
||||
struct binder_fd_array_object {
|
||||
struct binder_object_header hdr;
|
||||
__u32 pad;
|
||||
binder_size_t num_fds;
|
||||
binder_size_t parent;
|
||||
binder_size_t parent_offset;
|
||||
@@ -184,6 +186,19 @@ struct binder_version {
|
||||
#define BINDER_CURRENT_PROTOCOL_VERSION 8
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Use with BINDER_GET_NODE_DEBUG_INFO, driver reads ptr, writes to all fields.
|
||||
* Set ptr to NULL for the first call to get the info for the first node, and
|
||||
* then repeat the call passing the previously returned value to get the next
|
||||
* nodes. ptr will be 0 when there are no more nodes.
|
||||
*/
|
||||
struct binder_node_debug_info {
|
||||
binder_uintptr_t ptr;
|
||||
binder_uintptr_t cookie;
|
||||
__u32 has_strong_ref;
|
||||
__u32 has_weak_ref;
|
||||
};
|
||||
|
||||
#define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read)
|
||||
#define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, __s64)
|
||||
#define BINDER_SET_MAX_THREADS _IOW('b', 5, __u32)
|
||||
@@ -191,6 +206,7 @@ struct binder_version {
|
||||
#define BINDER_SET_CONTEXT_MGR _IOW('b', 7, __s32)
|
||||
#define BINDER_THREAD_EXIT _IOW('b', 8, __s32)
|
||||
#define BINDER_VERSION _IOWR('b', 9, struct binder_version)
|
||||
#define BINDER_GET_NODE_DEBUG_INFO _IOWR('b', 11, struct binder_node_debug_info)
|
||||
|
||||
/*
|
||||
* NOTE: Two special error codes you should check for when calling
|
||||
|
||||
Reference in New Issue
Block a user