Merge branch 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux

Pull i2c fixes from Wolfram Sang:
"Here are two bugfixes for I2C, fixing a memleak in the core and irq
allocation for i801.

Also three bugfixes for the at24 eeprom driver which Bartosz collected
while taking over maintainership for this driver"

* 'i2c/for-current' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux:
eeprom: at24: check at24_read/write arguments
eeprom: at24: fix reading from 24MAC402/24MAC602
eeprom: at24: correctly set the size for at24mac402
i2c: i2c-boardinfo: fix memory leaks on devinfo
i2c: i801: Fix Failed to allocate irq -2147483648 error

Changed files
+23 -1
drivers
i2c
misc
eeprom
+3
drivers/i2c/busses/i2c-i801.c
··· 1617 1617 /* Default timeout in interrupt mode: 200 ms */ 1618 1618 priv->adapter.timeout = HZ / 5; 1619 1619 1620 + if (dev->irq == IRQ_NOTCONNECTED) 1621 + priv->features &= ~FEATURE_IRQ; 1622 + 1620 1623 if (priv->features & FEATURE_IRQ) { 1621 1624 u16 pcictl, pcists; 1622 1625
+2
drivers/i2c/i2c-boardinfo.c
··· 86 86 property_entries_dup(info->properties); 87 87 if (IS_ERR(devinfo->board_info.properties)) { 88 88 status = PTR_ERR(devinfo->board_info.properties); 89 + kfree(devinfo); 89 90 break; 90 91 } 91 92 } ··· 99 98 GFP_KERNEL); 100 99 if (!devinfo->board_info.resources) { 101 100 status = -ENOMEM; 101 + kfree(devinfo); 102 102 break; 103 103 } 104 104 }
+18 -1
drivers/misc/eeprom/at24.c
··· 425 425 memset(msg, 0, sizeof(msg)); 426 426 msg[0].addr = client->addr; 427 427 msg[0].buf = addrbuf; 428 - addrbuf[0] = 0x90 + offset; 428 + /* EUI-48 starts from 0x9a, EUI-64 from 0x98 */ 429 + addrbuf[0] = 0xa0 - at24->chip.byte_len + offset; 429 430 msg[0].len = 1; 430 431 msg[1].addr = client->addr; 431 432 msg[1].flags = I2C_M_RD; ··· 569 568 if (unlikely(!count)) 570 569 return count; 571 570 571 + if (off + count > at24->chip.byte_len) 572 + return -EINVAL; 573 + 572 574 client = at24_translate_offset(at24, &off); 573 575 574 576 ret = pm_runtime_get_sync(&client->dev); ··· 615 611 int ret; 616 612 617 613 if (unlikely(!count)) 614 + return -EINVAL; 615 + 616 + if (off + count > at24->chip.byte_len) 618 617 return -EINVAL; 619 618 620 619 client = at24_translate_offset(at24, &off); ··· 736 729 if (!is_power_of_2(chip.page_size)) 737 730 dev_warn(&client->dev, 738 731 "page_size looks suspicious (no power of 2)!\n"); 732 + 733 + /* 734 + * REVISIT: the size of the EUI-48 byte array is 6 in at24mac402, while 735 + * the call to ilog2() in AT24_DEVICE_MAGIC() rounds it down to 4. 736 + * 737 + * Eventually we'll get rid of the magic values altoghether in favor of 738 + * real structs, but for now just manually set the right size. 739 + */ 740 + if (chip.flags & AT24_FLAG_MAC && chip.byte_len == 4) 741 + chip.byte_len = 6; 739 742 740 743 /* Use I2C operations unless we're stuck with SMBus extensions. */ 741 744 if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {