Commit 4b378951 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'i3c/for-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux

Pull i3c updates from Alexandre Belloni:
 "Mostly non urgent fixes and a few improvements (including runtime pm
  suport) to the Silvaco driver"

* tag 'i3c/for-5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/i3c/linux:
  i3c: master: dw: check return of dw_i3c_master_get_free_pos()
  i3c: master: mipi-i3c-hci: correct the config reference for endianness
  i3c: master: svc: enable the interrupt in the enable ibi function
  i3c: master: svc: add the missing module device table
  i3c: master: svc: add runtime pm support
  i3c: master: svc: set ODSTOP to let I2C device see the STOP signal
  i3c: master: svc: add support for slave to stop returning data
  i3c: master: svc: separate err, fifo and disable interrupt of reset function
  i3c: master: svc: fix atomic issue
  i3c: master: svc: move module reset behind clk enable
  i3c/master/mipi-i3c-hci: Fix a potentially infinite loop in 'hci_dat_v1_get_index()'
  i3c: fix incorrect address slot lookup on 64-bit
  i3c/master/mipi-i3c-hci: Prefer kcalloc over open coded arithmetic
  i3c/master/mipi-i3c-hci: Prefer struct_size over open coded arithmetic
parents 96000bc9 13462ba1
...@@ -343,7 +343,8 @@ struct bus_type i3c_bus_type = { ...@@ -343,7 +343,8 @@ struct bus_type i3c_bus_type = {
static enum i3c_addr_slot_status static enum i3c_addr_slot_status
i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr) i3c_bus_get_addr_slot_status(struct i3c_bus *bus, u16 addr)
{ {
int status, bitpos = addr * 2; unsigned long status;
int bitpos = addr * 2;
if (addr > I2C_MAX_ADDR) if (addr > I2C_MAX_ADDR)
return I3C_ADDR_SLOT_RSVD; return I3C_ADDR_SLOT_RSVD;
......
...@@ -793,6 +793,10 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m) ...@@ -793,6 +793,10 @@ static int dw_i3c_master_daa(struct i3c_master_controller *m)
return -ENOMEM; return -ENOMEM;
pos = dw_i3c_master_get_free_pos(master); pos = dw_i3c_master_get_free_pos(master);
if (pos < 0) {
dw_i3c_master_free_xfer(xfer);
return pos;
}
cmd = &xfer->cmds[0]; cmd = &xfer->cmds[0];
cmd->cmd_hi = 0x1; cmd->cmd_hi = 0x1;
cmd->cmd_lo = COMMAND_PORT_DEV_COUNT(master->maxdevs - pos) | cmd->cmd_lo = COMMAND_PORT_DEV_COUNT(master->maxdevs - pos) |
......
...@@ -662,7 +662,7 @@ static int i3c_hci_init(struct i3c_hci *hci) ...@@ -662,7 +662,7 @@ static int i3c_hci_init(struct i3c_hci *hci)
/* Make sure our data ordering fits the host's */ /* Make sure our data ordering fits the host's */
regval = reg_read(HC_CONTROL); regval = reg_read(HC_CONTROL);
if (IS_ENABLED(CONFIG_BIG_ENDIAN)) { if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) {
if (!(regval & HC_CONTROL_DATA_BIG_ENDIAN)) { if (!(regval & HC_CONTROL_DATA_BIG_ENDIAN)) {
regval |= HC_CONTROL_DATA_BIG_ENDIAN; regval |= HC_CONTROL_DATA_BIG_ENDIAN;
reg_write(HC_CONTROL, regval); reg_write(HC_CONTROL, regval);
......
...@@ -160,9 +160,7 @@ static int hci_dat_v1_get_index(struct i3c_hci *hci, u8 dev_addr) ...@@ -160,9 +160,7 @@ static int hci_dat_v1_get_index(struct i3c_hci *hci, u8 dev_addr)
unsigned int dat_idx; unsigned int dat_idx;
u32 dat_w0; u32 dat_w0;
for (dat_idx = find_first_bit(hci->DAT_data, hci->DAT_entries); for_each_set_bit(dat_idx, hci->DAT_data, hci->DAT_entries) {
dat_idx < hci->DAT_entries;
dat_idx = find_next_bit(hci->DAT_data, hci->DAT_entries, dat_idx)) {
dat_w0 = dat_w0_read(dat_idx); dat_w0 = dat_w0_read(dat_idx);
if (FIELD_GET(DAT_0_DYNAMIC_ADDRESS, dat_w0) == dev_addr) if (FIELD_GET(DAT_0_DYNAMIC_ADDRESS, dat_w0) == dev_addr)
return dat_idx; return dat_idx;
......
...@@ -223,7 +223,7 @@ static int hci_dma_init(struct i3c_hci *hci) ...@@ -223,7 +223,7 @@ static int hci_dma_init(struct i3c_hci *hci)
} }
if (nr_rings > XFER_RINGS) if (nr_rings > XFER_RINGS)
nr_rings = XFER_RINGS; nr_rings = XFER_RINGS;
rings = kzalloc(sizeof(*rings) + nr_rings * sizeof(*rh), GFP_KERNEL); rings = kzalloc(struct_size(rings, headers, nr_rings), GFP_KERNEL);
if (!rings) if (!rings)
return -ENOMEM; return -ENOMEM;
hci->io_data = rings; hci->io_data = rings;
......
...@@ -98,7 +98,7 @@ struct hci_xfer { ...@@ -98,7 +98,7 @@ struct hci_xfer {
static inline struct hci_xfer *hci_alloc_xfer(unsigned int n) static inline struct hci_xfer *hci_alloc_xfer(unsigned int n)
{ {
return kzalloc(sizeof(struct hci_xfer) * n, GFP_KERNEL); return kcalloc(n, sizeof(struct hci_xfer), GFP_KERNEL);
} }
static inline void hci_free_xfer(struct hci_xfer *xfer, unsigned int n) static inline void hci_free_xfer(struct hci_xfer *xfer, unsigned int n)
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment