summaryrefslogtreecommitdiffstats
path: root/drivers/eeprom
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2019-08-12 13:19:14 -0700
committerSascha Hauer <s.hauer@pengutronix.de>2019-08-14 10:37:34 +0200
commit9f56e43083195ad565dc1b81f3412b0f02dda988 (patch)
tree9ad6e1eabd9ff55b6927c164ea30c220233aa6b9 /drivers/eeprom
parente015a29fc9804afc0ce7baae4654dc1eee0c63a2 (diff)
downloadbarebox-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.c37
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);