aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBartosz Golaszewski <bgolaszewski@baylibre.com>2016-06-06 04:48:46 -0400
committerWolfram Sang <wsa@the-dreams.de>2016-07-17 13:41:54 -0400
commit318aa9c66b337924f96caffab689553e1875aadf (patch)
tree180f0ad46998ed60f45d763d718a1ee49a166649
parent2da78ac3ba577e0e4c9f13cbfce51db5a74f7ba3 (diff)
eeprom: at24: call read/write functions via function pointers
The first step in simplifying the read and write functions is to call them via function pointers stored in at24_data. When we eventually split the routines into smaller ones (depending on whether they use smbus or i2c operations) we'll simply assign them to said pointers instead of checking the flags at runtime every time we read/write. Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com> Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
-rw-r--r--drivers/misc/eeprom/at24.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 564a20113377..0621937e7b3a 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -58,6 +58,10 @@ struct at24_data {
58 int use_smbus; 58 int use_smbus;
59 int use_smbus_write; 59 int use_smbus_write;
60 60
61 ssize_t (*read_func)(struct at24_data *, char *, unsigned int, size_t);
62 ssize_t (*write_func)(struct at24_data *,
63 const char *, unsigned int, size_t);
64
61 /* 65 /*
62 * Lock protects against activities from other Linux tasks, 66 * Lock protects against activities from other Linux tasks,
63 * but not from changes by other I2C masters. 67 * but not from changes by other I2C masters.
@@ -351,7 +355,7 @@ static int at24_read(void *priv, unsigned int off, void *val, size_t count)
351 while (count) { 355 while (count) {
352 int status; 356 int status;
353 357
354 status = at24_eeprom_read(at24, buf, off, count); 358 status = at24->read_func(at24, buf, off, count);
355 if (status < 0) { 359 if (status < 0) {
356 mutex_unlock(&at24->lock); 360 mutex_unlock(&at24->lock);
357 return status; 361 return status;
@@ -383,7 +387,7 @@ static int at24_write(void *priv, unsigned int off, void *val, size_t count)
383 while (count) { 387 while (count) {
384 int status; 388 int status;
385 389
386 status = at24_eeprom_write(at24, buf, off, count); 390 status = at24->write_func(at24, buf, off, count);
387 if (status < 0) { 391 if (status < 0) {
388 mutex_unlock(&at24->lock); 392 mutex_unlock(&at24->lock);
389 return status; 393 return status;
@@ -518,6 +522,9 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
518 at24->chip = chip; 522 at24->chip = chip;
519 at24->num_addresses = num_addresses; 523 at24->num_addresses = num_addresses;
520 524
525 at24->read_func = at24_eeprom_read;
526 at24->write_func = at24_eeprom_write;
527
521 writable = !(chip.flags & AT24_FLAG_READONLY); 528 writable = !(chip.flags & AT24_FLAG_READONLY);
522 if (writable) { 529 if (writable) {
523 if (!use_smbus || use_smbus_write) { 530 if (!use_smbus || use_smbus_write) {