diff options
author | Wolfram Sang <wsa@the-dreams.de> | 2017-12-12 17:08:33 -0500 |
---|---|---|
committer | Wolfram Sang <wsa@the-dreams.de> | 2017-12-12 17:08:33 -0500 |
commit | a3fe09bc03f31dd7351d8277348fa59bcec9cd20 (patch) | |
tree | 612a909dc01f19619f378f45f5a50260d5ed4186 | |
parent | 04271ce9601f1686db480ea11ea1848394d9e6a2 (diff) | |
parent | 7f6d2ecd3d7acaf205ea7b3e96f9ffc55b92298b (diff) |
Merge tag 'at24-4.15-rc3-fixes-for-wolfram' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux into i2c/for-current
Sakari fixed a regression introduced during the 4.15 merge window and
David submitted a fix for an issue that has existed in at24 since
introducing nvmem.
-rw-r--r-- | drivers/misc/eeprom/at24.c | 26 |
1 files changed, 11 insertions, 15 deletions
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c index 305a7a464d09..4d63ac8a82e0 100644 --- a/drivers/misc/eeprom/at24.c +++ b/drivers/misc/eeprom/at24.c | |||
@@ -562,7 +562,7 @@ static ssize_t at24_eeprom_write_i2c(struct at24_data *at24, const char *buf, | |||
562 | static int at24_read(void *priv, unsigned int off, void *val, size_t count) | 562 | static int at24_read(void *priv, unsigned int off, void *val, size_t count) |
563 | { | 563 | { |
564 | struct at24_data *at24 = priv; | 564 | struct at24_data *at24 = priv; |
565 | struct i2c_client *client; | 565 | struct device *dev = &at24->client[0]->dev; |
566 | char *buf = val; | 566 | char *buf = val; |
567 | int ret; | 567 | int ret; |
568 | 568 | ||
@@ -572,11 +572,9 @@ static int at24_read(void *priv, unsigned int off, void *val, size_t count) | |||
572 | if (off + count > at24->chip.byte_len) | 572 | if (off + count > at24->chip.byte_len) |
573 | return -EINVAL; | 573 | return -EINVAL; |
574 | 574 | ||
575 | client = at24_translate_offset(at24, &off); | 575 | ret = pm_runtime_get_sync(dev); |
576 | |||
577 | ret = pm_runtime_get_sync(&client->dev); | ||
578 | if (ret < 0) { | 576 | if (ret < 0) { |
579 | pm_runtime_put_noidle(&client->dev); | 577 | pm_runtime_put_noidle(dev); |
580 | return ret; | 578 | return ret; |
581 | } | 579 | } |
582 | 580 | ||
@@ -592,7 +590,7 @@ static int at24_read(void *priv, unsigned int off, void *val, size_t count) | |||
592 | status = at24->read_func(at24, buf, off, count); | 590 | status = at24->read_func(at24, buf, off, count); |
593 | if (status < 0) { | 591 | if (status < 0) { |
594 | mutex_unlock(&at24->lock); | 592 | mutex_unlock(&at24->lock); |
595 | pm_runtime_put(&client->dev); | 593 | pm_runtime_put(dev); |
596 | return status; | 594 | return status; |
597 | } | 595 | } |
598 | buf += status; | 596 | buf += status; |
@@ -602,7 +600,7 @@ static int at24_read(void *priv, unsigned int off, void *val, size_t count) | |||
602 | 600 | ||
603 | mutex_unlock(&at24->lock); | 601 | mutex_unlock(&at24->lock); |
604 | 602 | ||
605 | pm_runtime_put(&client->dev); | 603 | pm_runtime_put(dev); |
606 | 604 | ||
607 | return 0; | 605 | return 0; |
608 | } | 606 | } |
@@ -610,7 +608,7 @@ static int at24_read(void *priv, unsigned int off, void *val, size_t count) | |||
610 | static int at24_write(void *priv, unsigned int off, void *val, size_t count) | 608 | static int at24_write(void *priv, unsigned int off, void *val, size_t count) |
611 | { | 609 | { |
612 | struct at24_data *at24 = priv; | 610 | struct at24_data *at24 = priv; |
613 | struct i2c_client *client; | 611 | struct device *dev = &at24->client[0]->dev; |
614 | char *buf = val; | 612 | char *buf = val; |
615 | int ret; | 613 | int ret; |
616 | 614 | ||
@@ -620,11 +618,9 @@ static int at24_write(void *priv, unsigned int off, void *val, size_t count) | |||
620 | if (off + count > at24->chip.byte_len) | 618 | if (off + count > at24->chip.byte_len) |
621 | return -EINVAL; | 619 | return -EINVAL; |
622 | 620 | ||
623 | client = at24_translate_offset(at24, &off); | 621 | ret = pm_runtime_get_sync(dev); |
624 | |||
625 | ret = pm_runtime_get_sync(&client->dev); | ||
626 | if (ret < 0) { | 622 | if (ret < 0) { |
627 | pm_runtime_put_noidle(&client->dev); | 623 | pm_runtime_put_noidle(dev); |
628 | return ret; | 624 | return ret; |
629 | } | 625 | } |
630 | 626 | ||
@@ -640,7 +636,7 @@ static int at24_write(void *priv, unsigned int off, void *val, size_t count) | |||
640 | status = at24->write_func(at24, buf, off, count); | 636 | status = at24->write_func(at24, buf, off, count); |
641 | if (status < 0) { | 637 | if (status < 0) { |
642 | mutex_unlock(&at24->lock); | 638 | mutex_unlock(&at24->lock); |
643 | pm_runtime_put(&client->dev); | 639 | pm_runtime_put(dev); |
644 | return status; | 640 | return status; |
645 | } | 641 | } |
646 | buf += status; | 642 | buf += status; |
@@ -650,7 +646,7 @@ static int at24_write(void *priv, unsigned int off, void *val, size_t count) | |||
650 | 646 | ||
651 | mutex_unlock(&at24->lock); | 647 | mutex_unlock(&at24->lock); |
652 | 648 | ||
653 | pm_runtime_put(&client->dev); | 649 | pm_runtime_put(dev); |
654 | 650 | ||
655 | return 0; | 651 | return 0; |
656 | } | 652 | } |
@@ -880,7 +876,7 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) | |||
880 | at24->nvmem_config.reg_read = at24_read; | 876 | at24->nvmem_config.reg_read = at24_read; |
881 | at24->nvmem_config.reg_write = at24_write; | 877 | at24->nvmem_config.reg_write = at24_write; |
882 | at24->nvmem_config.priv = at24; | 878 | at24->nvmem_config.priv = at24; |
883 | at24->nvmem_config.stride = 4; | 879 | at24->nvmem_config.stride = 1; |
884 | at24->nvmem_config.word_size = 1; | 880 | at24->nvmem_config.word_size = 1; |
885 | at24->nvmem_config.size = chip.byte_len; | 881 | at24->nvmem_config.size = chip.byte_len; |
886 | 882 | ||