Merge branch 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c updates from Wolfram Sang:
"Most notable:
- introducing the i2c_quirk infrastructure. Now, flaws of I2C
controllers can be described and the core will check if the flaws
collide with the messages to be sent
- wait_for_completion return type cleanup series
- new drivers for Digicolor, Netlogic XLP, Ingenic JZ4780
- updates to the I2C slave framework which include API changes. Its
only user was updated, too. Documentation was finally added
- changed dynamic bus numbering for the DT case. This could change
bus numbers for users. However, it fixes a collision where dynamic
and static busses request the same id.
- driver bugfixes, cleanups"
* 'i2c/for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (52 commits)
i2c: xlp9xx: Driver for Netlogic XLP9XX/5XX I2C controller
of: Add vendor prefix 'netlogic'
i2c: davinci: use ICPFUNC to toggle I2C as gpio for bus recovery
i2c: davinci: use bus recovery infrastructure
i2c: change input parameter to i2c_adapter for prepare/unprepare_recovery
i2c: i2c-mux-gpio: remove error messages for probe deferrals
i2c: jz4780: Add i2c bus controller driver for Ingenic JZ4780
i2c: dln2: set the device tree node of the adapter
i2c: davinci: fixup wait_for_completion_timeout handling
i2c: mpc: Fix ISR return value
i2c: slave-eeprom: add more info when to increase the pointer
i2c: slave: add documentation for i2c-slave-eeprom
Documentation: i2c: describe the new slave mode
i2c: slave: rework the slave API
i2c: add support for the Digicolor I2C controller
i2c: busses with dynamic ids should start after fixed ids for DT
of: base: add function to get highest id of an alias stem
i2c: designware: Suppress error message if platform_get_irq() < 0
i2c: mpc: assign the correct prescaler from SVR
i2c: img-scb: fixup of wait_for_completion_timeout return handling
...
This commit is contained in:
commit
c3a416a669
46 changed files with 2483 additions and 276 deletions
|
|
@ -253,10 +253,10 @@ static inline void i2c_set_clientdata(struct i2c_client *dev, void *data)
|
|||
|
||||
#if IS_ENABLED(CONFIG_I2C_SLAVE)
|
||||
enum i2c_slave_event {
|
||||
I2C_SLAVE_REQ_READ_START,
|
||||
I2C_SLAVE_REQ_READ_END,
|
||||
I2C_SLAVE_REQ_WRITE_START,
|
||||
I2C_SLAVE_REQ_WRITE_END,
|
||||
I2C_SLAVE_READ_REQUESTED,
|
||||
I2C_SLAVE_WRITE_REQUESTED,
|
||||
I2C_SLAVE_READ_PROCESSED,
|
||||
I2C_SLAVE_WRITE_RECEIVED,
|
||||
I2C_SLAVE_STOP,
|
||||
};
|
||||
|
||||
|
|
@ -435,8 +435,8 @@ struct i2c_bus_recovery_info {
|
|||
void (*set_scl)(struct i2c_adapter *, int val);
|
||||
int (*get_sda)(struct i2c_adapter *);
|
||||
|
||||
void (*prepare_recovery)(struct i2c_bus_recovery_info *bri);
|
||||
void (*unprepare_recovery)(struct i2c_bus_recovery_info *bri);
|
||||
void (*prepare_recovery)(struct i2c_adapter *);
|
||||
void (*unprepare_recovery)(struct i2c_adapter *);
|
||||
|
||||
/* gpio recovery */
|
||||
int scl_gpio;
|
||||
|
|
@ -449,6 +449,48 @@ int i2c_recover_bus(struct i2c_adapter *adap);
|
|||
int i2c_generic_gpio_recovery(struct i2c_adapter *adap);
|
||||
int i2c_generic_scl_recovery(struct i2c_adapter *adap);
|
||||
|
||||
/**
|
||||
* struct i2c_adapter_quirks - describe flaws of an i2c adapter
|
||||
* @flags: see I2C_AQ_* for possible flags and read below
|
||||
* @max_num_msgs: maximum number of messages per transfer
|
||||
* @max_write_len: maximum length of a write message
|
||||
* @max_read_len: maximum length of a read message
|
||||
* @max_comb_1st_msg_len: maximum length of the first msg in a combined message
|
||||
* @max_comb_2nd_msg_len: maximum length of the second msg in a combined message
|
||||
*
|
||||
* Note about combined messages: Some I2C controllers can only send one message
|
||||
* per transfer, plus something called combined message or write-then-read.
|
||||
* This is (usually) a small write message followed by a read message and
|
||||
* barely enough to access register based devices like EEPROMs. There is a flag
|
||||
* to support this mode. It implies max_num_msg = 2 and does the length checks
|
||||
* with max_comb_*_len because combined message mode usually has its own
|
||||
* limitations. Because of HW implementations, some controllers can actually do
|
||||
* write-then-anything or other variants. To support that, write-then-read has
|
||||
* been broken out into smaller bits like write-first and read-second which can
|
||||
* be combined as needed.
|
||||
*/
|
||||
|
||||
struct i2c_adapter_quirks {
|
||||
u64 flags;
|
||||
int max_num_msgs;
|
||||
u16 max_write_len;
|
||||
u16 max_read_len;
|
||||
u16 max_comb_1st_msg_len;
|
||||
u16 max_comb_2nd_msg_len;
|
||||
};
|
||||
|
||||
/* enforce max_num_msgs = 2 and use max_comb_*_len for length checks */
|
||||
#define I2C_AQ_COMB BIT(0)
|
||||
/* first combined message must be write */
|
||||
#define I2C_AQ_COMB_WRITE_FIRST BIT(1)
|
||||
/* second combined message must be read */
|
||||
#define I2C_AQ_COMB_READ_SECOND BIT(2)
|
||||
/* both combined messages must have the same target address */
|
||||
#define I2C_AQ_COMB_SAME_ADDR BIT(3)
|
||||
/* convenience macro for typical write-then read case */
|
||||
#define I2C_AQ_COMB_WRITE_THEN_READ (I2C_AQ_COMB | I2C_AQ_COMB_WRITE_FIRST | \
|
||||
I2C_AQ_COMB_READ_SECOND | I2C_AQ_COMB_SAME_ADDR)
|
||||
|
||||
/*
|
||||
* i2c_adapter is the structure used to identify a physical i2c bus along
|
||||
* with the access algorithms necessary to access it.
|
||||
|
|
@ -474,6 +516,7 @@ struct i2c_adapter {
|
|||
struct list_head userspace_clients;
|
||||
|
||||
struct i2c_bus_recovery_info *bus_recovery_info;
|
||||
const struct i2c_adapter_quirks *quirks;
|
||||
};
|
||||
#define to_i2c_adapter(d) container_of(d, struct i2c_adapter, dev)
|
||||
|
||||
|
|
|
|||
|
|
@ -332,6 +332,7 @@ extern int of_count_phandle_with_args(const struct device_node *np,
|
|||
|
||||
extern void of_alias_scan(void * (*dt_alloc)(u64 size, u64 align));
|
||||
extern int of_alias_get_id(struct device_node *np, const char *stem);
|
||||
extern int of_alias_get_highest_id(const char *stem);
|
||||
|
||||
extern int of_machine_is_compatible(const char *compat);
|
||||
|
||||
|
|
@ -594,6 +595,11 @@ static inline int of_alias_get_id(struct device_node *np, const char *stem)
|
|||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int of_alias_get_highest_id(const char *stem)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline int of_machine_is_compatible(const char *compat)
|
||||
{
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ struct davinci_i2c_platform_data {
|
|||
unsigned int bus_delay; /* post-transaction delay (usec) */
|
||||
unsigned int sda_pin; /* GPIO pin ID to use for SDA */
|
||||
unsigned int scl_pin; /* GPIO pin ID to use for SCL */
|
||||
bool has_pfunc; /*chip has a ICPFUNC register */
|
||||
};
|
||||
|
||||
/* for board setup code */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue