Loading drivers/misc/eeprom/Kconfig +0 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ config EEPROM_AT24 config EEPROM_AT25 tristate "SPI EEPROMs from most vendors" depends on SPI && SYSFS select REGMAP select NVMEM help Enable this driver to get read/write support to most SPI EEPROMs, Loading drivers/misc/eeprom/at25.c +19 −70 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ #include <linux/sched.h> #include <linux/nvmem-provider.h> #include <linux/regmap.h> #include <linux/spi/spi.h> #include <linux/spi/eeprom.h> #include <linux/property.h> Loading @@ -34,7 +33,6 @@ struct at25_data { struct mutex lock; struct spi_eeprom chip; unsigned addrlen; struct regmap_config regmap_config; struct nvmem_config nvmem_config; struct nvmem_device *nvmem; }; Loading Loading @@ -65,14 +63,11 @@ struct at25_data { #define io_limit PAGE_SIZE /* bytes */ static ssize_t at25_ee_read( struct at25_data *at25, char *buf, unsigned offset, size_t count ) static int at25_ee_read(void *priv, unsigned int offset, void *val, size_t count) { struct at25_data *at25 = priv; char *buf = val; u8 command[EE_MAXADDRLEN + 1]; u8 *cp; ssize_t status; Loading @@ -81,11 +76,11 @@ at25_ee_read( u8 instr; if (unlikely(offset >= at25->chip.byte_len)) return 0; return -EINVAL; if ((offset + count) > at25->chip.byte_len) count = at25->chip.byte_len - offset; if (unlikely(!count)) return count; return -EINVAL; cp = command; Loading Loading @@ -131,28 +126,14 @@ at25_ee_read( count, offset, (int) status); mutex_unlock(&at25->lock); return status ? status : count; return status; } static int at25_regmap_read(void *context, const void *reg, size_t reg_size, void *val, size_t val_size) static int at25_ee_write(void *priv, unsigned int off, void *val, size_t count) { struct at25_data *at25 = context; off_t offset = *(u32 *)reg; int err; err = at25_ee_read(at25, val, offset, val_size); if (err) return err; return 0; } static ssize_t at25_ee_write(struct at25_data *at25, const char *buf, loff_t off, size_t count) { ssize_t status = 0; unsigned written = 0; struct at25_data *at25 = priv; const char *buf = val; int status = 0; unsigned buf_size; u8 *bounce; Loading @@ -161,7 +142,7 @@ at25_ee_write(struct at25_data *at25, const char *buf, loff_t off, if ((off + count) > at25->chip.byte_len) count = at25->chip.byte_len - off; if (unlikely(!count)) return count; return -EINVAL; /* Temp buffer starts with command and address */ buf_size = at25->chip.page_size; Loading Loading @@ -256,40 +237,15 @@ at25_ee_write(struct at25_data *at25, const char *buf, loff_t off, off += segment; buf += segment; count -= segment; written += segment; } while (count > 0); mutex_unlock(&at25->lock); kfree(bounce); return written ? written : status; } static int at25_regmap_write(void *context, const void *data, size_t count) { struct at25_data *at25 = 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 = at25_ee_write(at25, buf, offset, len); if (err) return err; return 0; return status; } static const struct regmap_bus at25_regmap_bus = { .read = at25_regmap_read, .write = at25_regmap_write, .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, }; /*-------------------------------------------------------------------------*/ static int at25_fw_to_chip(struct device *dev, struct spi_eeprom *chip) Loading Loading @@ -349,7 +305,6 @@ static int at25_probe(struct spi_device *spi) { struct at25_data *at25 = NULL; struct spi_eeprom chip; struct regmap *regmap; int err; int sr; int addrlen; Loading Loading @@ -394,18 +349,6 @@ static int at25_probe(struct spi_device *spi) spi_set_drvdata(spi, at25); at25->addrlen = addrlen; at25->regmap_config.reg_bits = 32; at25->regmap_config.val_bits = 8; at25->regmap_config.reg_stride = 1; at25->regmap_config.max_register = chip.byte_len - 1; regmap = devm_regmap_init(&spi->dev, &at25_regmap_bus, at25, &at25->regmap_config); if (IS_ERR(regmap)) { dev_err(&spi->dev, "regmap init failed\n"); return PTR_ERR(regmap); } at25->nvmem_config.name = dev_name(&spi->dev); at25->nvmem_config.dev = &spi->dev; at25->nvmem_config.read_only = chip.flags & EE_READONLY; Loading @@ -413,6 +356,12 @@ static int at25_probe(struct spi_device *spi) at25->nvmem_config.owner = THIS_MODULE; at25->nvmem_config.compat = true; at25->nvmem_config.base_dev = &spi->dev; at25->nvmem_config.reg_read = at25_ee_read; at25->nvmem_config.reg_write = at25_ee_write; at25->nvmem_config.priv = at25; at25->nvmem_config.stride = 4; at25->nvmem_config.word_size = 1; at25->nvmem_config.size = chip.byte_len; at25->nvmem = nvmem_register(&at25->nvmem_config); if (IS_ERR(at25->nvmem)) Loading Loading
drivers/misc/eeprom/Kconfig +0 −1 Original line number Diff line number Diff line Loading @@ -31,7 +31,6 @@ config EEPROM_AT24 config EEPROM_AT25 tristate "SPI EEPROMs from most vendors" depends on SPI && SYSFS select REGMAP select NVMEM help Enable this driver to get read/write support to most SPI EEPROMs, Loading
drivers/misc/eeprom/at25.c +19 −70 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ #include <linux/sched.h> #include <linux/nvmem-provider.h> #include <linux/regmap.h> #include <linux/spi/spi.h> #include <linux/spi/eeprom.h> #include <linux/property.h> Loading @@ -34,7 +33,6 @@ struct at25_data { struct mutex lock; struct spi_eeprom chip; unsigned addrlen; struct regmap_config regmap_config; struct nvmem_config nvmem_config; struct nvmem_device *nvmem; }; Loading Loading @@ -65,14 +63,11 @@ struct at25_data { #define io_limit PAGE_SIZE /* bytes */ static ssize_t at25_ee_read( struct at25_data *at25, char *buf, unsigned offset, size_t count ) static int at25_ee_read(void *priv, unsigned int offset, void *val, size_t count) { struct at25_data *at25 = priv; char *buf = val; u8 command[EE_MAXADDRLEN + 1]; u8 *cp; ssize_t status; Loading @@ -81,11 +76,11 @@ at25_ee_read( u8 instr; if (unlikely(offset >= at25->chip.byte_len)) return 0; return -EINVAL; if ((offset + count) > at25->chip.byte_len) count = at25->chip.byte_len - offset; if (unlikely(!count)) return count; return -EINVAL; cp = command; Loading Loading @@ -131,28 +126,14 @@ at25_ee_read( count, offset, (int) status); mutex_unlock(&at25->lock); return status ? status : count; return status; } static int at25_regmap_read(void *context, const void *reg, size_t reg_size, void *val, size_t val_size) static int at25_ee_write(void *priv, unsigned int off, void *val, size_t count) { struct at25_data *at25 = context; off_t offset = *(u32 *)reg; int err; err = at25_ee_read(at25, val, offset, val_size); if (err) return err; return 0; } static ssize_t at25_ee_write(struct at25_data *at25, const char *buf, loff_t off, size_t count) { ssize_t status = 0; unsigned written = 0; struct at25_data *at25 = priv; const char *buf = val; int status = 0; unsigned buf_size; u8 *bounce; Loading @@ -161,7 +142,7 @@ at25_ee_write(struct at25_data *at25, const char *buf, loff_t off, if ((off + count) > at25->chip.byte_len) count = at25->chip.byte_len - off; if (unlikely(!count)) return count; return -EINVAL; /* Temp buffer starts with command and address */ buf_size = at25->chip.page_size; Loading Loading @@ -256,40 +237,15 @@ at25_ee_write(struct at25_data *at25, const char *buf, loff_t off, off += segment; buf += segment; count -= segment; written += segment; } while (count > 0); mutex_unlock(&at25->lock); kfree(bounce); return written ? written : status; } static int at25_regmap_write(void *context, const void *data, size_t count) { struct at25_data *at25 = 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 = at25_ee_write(at25, buf, offset, len); if (err) return err; return 0; return status; } static const struct regmap_bus at25_regmap_bus = { .read = at25_regmap_read, .write = at25_regmap_write, .reg_format_endian_default = REGMAP_ENDIAN_NATIVE, }; /*-------------------------------------------------------------------------*/ static int at25_fw_to_chip(struct device *dev, struct spi_eeprom *chip) Loading Loading @@ -349,7 +305,6 @@ static int at25_probe(struct spi_device *spi) { struct at25_data *at25 = NULL; struct spi_eeprom chip; struct regmap *regmap; int err; int sr; int addrlen; Loading Loading @@ -394,18 +349,6 @@ static int at25_probe(struct spi_device *spi) spi_set_drvdata(spi, at25); at25->addrlen = addrlen; at25->regmap_config.reg_bits = 32; at25->regmap_config.val_bits = 8; at25->regmap_config.reg_stride = 1; at25->regmap_config.max_register = chip.byte_len - 1; regmap = devm_regmap_init(&spi->dev, &at25_regmap_bus, at25, &at25->regmap_config); if (IS_ERR(regmap)) { dev_err(&spi->dev, "regmap init failed\n"); return PTR_ERR(regmap); } at25->nvmem_config.name = dev_name(&spi->dev); at25->nvmem_config.dev = &spi->dev; at25->nvmem_config.read_only = chip.flags & EE_READONLY; Loading @@ -413,6 +356,12 @@ static int at25_probe(struct spi_device *spi) at25->nvmem_config.owner = THIS_MODULE; at25->nvmem_config.compat = true; at25->nvmem_config.base_dev = &spi->dev; at25->nvmem_config.reg_read = at25_ee_read; at25->nvmem_config.reg_write = at25_ee_write; at25->nvmem_config.priv = at25; at25->nvmem_config.stride = 4; at25->nvmem_config.word_size = 1; at25->nvmem_config.size = chip.byte_len; at25->nvmem = nvmem_register(&at25->nvmem_config); if (IS_ERR(at25->nvmem)) Loading