diff options
Diffstat (limited to 'drivers/eeprom/at24.c')
-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); |