diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2019-08-12 13:19:14 -0700 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2019-08-14 10:37:34 +0200 |
commit | 9f56e43083195ad565dc1b81f3412b0f02dda988 (patch) | |
tree | 9ad6e1eabd9ff55b6927c164ea30c220233aa6b9 /drivers/eeprom | |
parent | e015a29fc9804afc0ce7baae4654dc1eee0c63a2 (diff) | |
download | barebox-9f56e43083195ad565dc1b81f3412b0f02dda988.tar.gz barebox-9f56e43083195ad565dc1b81f3412b0f02dda988.tar.xz |
eeprom: at24: Drop at24_cdev_protect()
Instead of exposing a dedictaed .protect() callback, mimic the
behaviour of corresponding driver in Linux and adjust the value of WP
pin in .write() callback as necessary. This is done in order to
convert this driver to NVMEM subsytem.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'drivers/eeprom')
-rw-r--r-- | drivers/eeprom/at24.c | 37 |
1 files changed, 17 insertions, 20 deletions
diff --git a/drivers/eeprom/at24.c b/drivers/eeprom/at24.c index 1fd4aeaba6..db452c1076 100644 --- a/drivers/eeprom/at24.c +++ b/drivers/eeprom/at24.c @@ -317,6 +317,19 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf, return -ETIMEDOUT; } +static void at24_protect(struct at24_data *at24, bool prot) +{ + if (gpio_is_valid(at24->wp_gpio)) { + + if (at24->wp_active_low) + prot = !prot; + + gpio_set_value(at24->wp_gpio, prot); + + udelay(50); + } +} + static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off, size_t count) { @@ -325,6 +338,8 @@ static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off, if (unlikely(!count)) return count; + at24_protect(at24, false); + while (count) { ssize_t status; @@ -340,6 +355,8 @@ static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off, retval += status; } + at24_protect(at24, true); + return retval; } @@ -351,25 +368,6 @@ static ssize_t at24_cdev_write(struct cdev *cdev, const void *buf, size_t count, return at24_write(at24, buf, off, count); } -static int at24_cdev_protect(struct cdev *cdev, size_t count, loff_t offset, - int prot) -{ - struct at24_data *at24 = cdev->priv; - - if (!gpio_is_valid(at24->wp_gpio)) - return -EOPNOTSUPP; - - prot = !!prot; - if (at24->wp_active_low) - prot = !prot; - - gpio_set_value(at24->wp_gpio, prot); - - udelay(50); - - return 0; -} - static int at24_probe(struct device_d *dev) { struct i2c_client *client = to_i2c_client(dev); @@ -448,7 +446,6 @@ static int at24_probe(struct device_d *dev) at24->cdev.dev = dev; at24->cdev.ops = &at24->fops; at24->fops.read = at24_cdev_read, - at24->fops.protect = at24_cdev_protect, at24->cdev.size = chip.byte_len; writable = !(chip.flags & AT24_FLAG_READONLY); |