From 9f56e43083195ad565dc1b81f3412b0f02dda988 Mon Sep 17 00:00:00 2001 From: Andrey Smirnov Date: Mon, 12 Aug 2019 13:19:14 -0700 Subject: 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 Signed-off-by: Sascha Hauer --- drivers/eeprom/at24.c | 37 +++++++++++++++++-------------------- 1 file 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); -- cgit v1.2.3