Commit cf0361a2 authored by Srinivas Kandagatla's avatar Srinivas Kandagatla Committed by Greg Kroah-Hartman

eeprom: at24: remove nvmem regmap dependency

This patch moves to nvmem support in the driver to use callback instead
of regmap.
Signed-off-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 795ddd18
...@@ -3,7 +3,6 @@ menu "EEPROM support" ...@@ -3,7 +3,6 @@ menu "EEPROM support"
config EEPROM_AT24 config EEPROM_AT24
tristate "I2C EEPROMs / RAMs / ROMs from most vendors" tristate "I2C EEPROMs / RAMs / ROMs from most vendors"
depends on I2C && SYSFS depends on I2C && SYSFS
select REGMAP
select NVMEM select NVMEM
help help
Enable this driver to get read/write support to most I2C EEPROMs Enable this driver to get read/write support to most I2C EEPROMs
......
...@@ -23,7 +23,6 @@ ...@@ -23,7 +23,6 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/i2c.h> #include <linux/i2c.h>
#include <linux/nvmem-provider.h> #include <linux/nvmem-provider.h>
#include <linux/regmap.h>
#include <linux/platform_data/at24.h> #include <linux/platform_data/at24.h>
/* /*
...@@ -69,7 +68,6 @@ struct at24_data { ...@@ -69,7 +68,6 @@ struct at24_data {
unsigned write_max; unsigned write_max;
unsigned num_addresses; unsigned num_addresses;
struct regmap_config regmap_config;
struct nvmem_config nvmem_config; struct nvmem_config nvmem_config;
struct nvmem_device *nvmem; struct nvmem_device *nvmem;
...@@ -252,10 +250,10 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf, ...@@ -252,10 +250,10 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
return -ETIMEDOUT; return -ETIMEDOUT;
} }
static ssize_t at24_read(struct at24_data *at24, static int at24_read(void *priv, unsigned int off, void *val, size_t count)
char *buf, loff_t off, size_t count)
{ {
ssize_t retval = 0; struct at24_data *at24 = priv;
char *buf = val;
if (unlikely(!count)) if (unlikely(!count))
return count; return count;
...@@ -267,23 +265,21 @@ static ssize_t at24_read(struct at24_data *at24, ...@@ -267,23 +265,21 @@ static ssize_t at24_read(struct at24_data *at24,
mutex_lock(&at24->lock); mutex_lock(&at24->lock);
while (count) { while (count) {
ssize_t status; int status;
status = at24_eeprom_read(at24, buf, off, count); status = at24_eeprom_read(at24, buf, off, count);
if (status <= 0) { if (status < 0) {
if (retval == 0) mutex_unlock(&at24->lock);
retval = status; return status;
break;
} }
buf += status; buf += status;
off += status; off += status;
count -= status; count -= status;
retval += status;
} }
mutex_unlock(&at24->lock); mutex_unlock(&at24->lock);
return retval; return 0;
} }
/* /*
...@@ -372,13 +368,13 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf, ...@@ -372,13 +368,13 @@ static ssize_t at24_eeprom_write(struct at24_data *at24, const char *buf,
return -ETIMEDOUT; return -ETIMEDOUT;
} }
static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off, static int at24_write(void *priv, unsigned int off, void *val, size_t count)
size_t count)
{ {
ssize_t retval = 0; struct at24_data *at24 = priv;
char *buf = val;
if (unlikely(!count)) if (unlikely(!count))
return count; return -EINVAL;
/* /*
* Write data to chip, protecting against concurrent updates * Write data to chip, protecting against concurrent updates
...@@ -387,70 +383,23 @@ static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off, ...@@ -387,70 +383,23 @@ static ssize_t at24_write(struct at24_data *at24, const char *buf, loff_t off,
mutex_lock(&at24->lock); mutex_lock(&at24->lock);
while (count) { while (count) {
ssize_t status; int status;
status = at24_eeprom_write(at24, buf, off, count); status = at24_eeprom_write(at24, buf, off, count);
if (status <= 0) { if (status < 0) {
if (retval == 0) mutex_unlock(&at24->lock);
retval = status; return status;
break;
} }
buf += status; buf += status;
off += status; off += status;
count -= status; count -= status;
retval += status;
} }
mutex_unlock(&at24->lock); mutex_unlock(&at24->lock);
return retval;
}
/*-------------------------------------------------------------------------*/
/*
* Provide a regmap interface, which is registered with the NVMEM
* framework
*/
static int at24_regmap_read(void *context, const void *reg, size_t reg_size,
void *val, size_t val_size)
{
struct at24_data *at24 = context;
off_t offset = *(u32 *)reg;
int err;
err = at24_read(at24, val, offset, val_size);
if (err)
return err;
return 0;
}
static int at24_regmap_write(void *context, const void *data, size_t count)
{
struct at24_data *at24 = context;
const char *buf;
u32 offset;
size_t len;
int err;
memcpy(&offset, data, sizeof(offset));
buf = (const char *)data + sizeof(offset);
len = count - sizeof(offset);
err = at24_write(at24, buf, offset, len);
if (err)
return err;
return 0; return 0;
} }
static const struct regmap_bus at24_regmap_bus = {
.read = at24_regmap_read,
.write = at24_regmap_write,
.reg_format_endian_default = REGMAP_ENDIAN_NATIVE,
};
/*-------------------------------------------------------------------------*/
#ifdef CONFIG_OF #ifdef CONFIG_OF
static void at24_get_ofdata(struct i2c_client *client, static void at24_get_ofdata(struct i2c_client *client,
struct at24_platform_data *chip) struct at24_platform_data *chip)
...@@ -482,7 +431,6 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -482,7 +431,6 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
struct at24_data *at24; struct at24_data *at24;
int err; int err;
unsigned i, num_addresses; unsigned i, num_addresses;
struct regmap *regmap;
if (client->dev.platform_data) { if (client->dev.platform_data) {
chip = *(struct at24_platform_data *)client->dev.platform_data; chip = *(struct at24_platform_data *)client->dev.platform_data;
...@@ -612,19 +560,6 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -612,19 +560,6 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
} }
} }
at24->regmap_config.reg_bits = 32;
at24->regmap_config.val_bits = 8;
at24->regmap_config.reg_stride = 1;
at24->regmap_config.max_register = chip.byte_len - 1;
regmap = devm_regmap_init(&client->dev, &at24_regmap_bus, at24,
&at24->regmap_config);
if (IS_ERR(regmap)) {
dev_err(&client->dev, "regmap init failed\n");
err = PTR_ERR(regmap);
goto err_clients;
}
at24->nvmem_config.name = dev_name(&client->dev); at24->nvmem_config.name = dev_name(&client->dev);
at24->nvmem_config.dev = &client->dev; at24->nvmem_config.dev = &client->dev;
at24->nvmem_config.read_only = !writable; at24->nvmem_config.read_only = !writable;
...@@ -632,6 +567,12 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id) ...@@ -632,6 +567,12 @@ static int at24_probe(struct i2c_client *client, const struct i2c_device_id *id)
at24->nvmem_config.owner = THIS_MODULE; at24->nvmem_config.owner = THIS_MODULE;
at24->nvmem_config.compat = true; at24->nvmem_config.compat = true;
at24->nvmem_config.base_dev = &client->dev; at24->nvmem_config.base_dev = &client->dev;
at24->nvmem_config.reg_read = at24_read;
at24->nvmem_config.reg_write = at24_write;
at24->nvmem_config.priv = at24;
at24->nvmem_config.stride = 4;
at24->nvmem_config.word_size = 1;
at24->nvmem_config.size = chip.byte_len;
at24->nvmem = nvmem_register(&at24->nvmem_config); at24->nvmem = nvmem_register(&at24->nvmem_config);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment