Hi Andrew,

On 26.02.2016 21:59, Andrew Lunn wrote:
> Add a regmap for accessing the EEPROM, and then use that with the
> NVMEM framework. Enable backward compatibility in the NVMEM config
> structure, so that the 'eeprom' file in sys is provided by the
> framework.
> 
> Signed-off-by: Andrew Lunn <and...@lunn.ch>
> Acked-by: Srinivas Kandagatla <srinivas.kandaga...@linaro.org>
> ---

[snip]

>  
>  static ssize_t
> -eeprom_93xx46_bin_read(struct file *filp, struct kobject *kobj,
> -                    struct bin_attribute *bin_attr,
> -                    char *buf, loff_t off, size_t count)
> +eeprom_93xx46_read(struct eeprom_93xx46_dev *edev, char *buf,
> +                unsigned off, size_t count)
>  {
> -     struct eeprom_93xx46_dev *edev;
> -     struct device *dev;
>       ssize_t ret = 0;
>  
> -     dev = kobj_to_dev(kobj);
> -     edev = dev_get_drvdata(dev);
> +     if (unlikely(off >= edev->size))
> +             return 0;
> +     if ((off + count) > edev->size)
> +             count = edev->size - off;
> +     if (unlikely(!count))
> +             return count;
>  

I'm scratching my head, do you want to kind of revert
the change https://lkml.org/lkml/2015/7/26/89 ? Why?

If you know regmap_config.max_register, then all necessary
boundary checks can be done inside NVMEM core.

>       mutex_lock(&edev->lock);
>  
> @@ -226,16 +231,17 @@ eeprom_93xx46_write_word(struct eeprom_93xx46_dev *edev,
>  }
>  
>  static ssize_t
> -eeprom_93xx46_bin_write(struct file *filp, struct kobject *kobj,
> -                     struct bin_attribute *bin_attr,
> -                     char *buf, loff_t off, size_t count)
> +eeprom_93xx46_write(struct eeprom_93xx46_dev *edev, const char *buf,
> +                 loff_t off, size_t count)
>  {
> -     struct eeprom_93xx46_dev *edev;
> -     struct device *dev;
>       int i, ret, step = 1;
>  
> -     dev = kobj_to_dev(kobj);
> -     edev = dev_get_drvdata(dev);
> +     if (unlikely(off >= edev->size))
> +             return -EFBIG;
> +     if ((off + count) > edev->size)
> +             count = edev->size - off;
> +     if (unlikely(!count))
> +             return count;
>  

See a comment above.

>       /* only write even number of bytes on 16-bit devices */
>       if (edev->addrlen == 6) {
> @@ -272,6 +278,49 @@ eeprom_93xx46_bin_write(struct file *filp, struct 
> kobject *kobj,
>       return ret ? : count;
>  }
>  
> +/*
> + * Provide a regmap interface, which is registered with the NVMEM
> + * framework
> +*/
> +static int eeprom_93xx46_regmap_read(void *context, const void *reg,
> +                                  size_t reg_size, void *val,
> +                                  size_t val_size)
> +{
> +     struct eeprom_93xx46_dev *eeprom_93xx46 = context;
> +     off_t offset = *(u32 *)reg;
> +     int err;
> +
> +     err = eeprom_93xx46_read(eeprom_93xx46, val, offset, val_size);
> +     if (err)
> +             return err;
> +     return 0;

return eeprom_93xx46_read(eeprom_93xx46, val, offset, val_size);

> +}
> +
> +static int eeprom_93xx46_regmap_write(void *context, const void *data,
> +                                   size_t count)
> +{
> +     struct eeprom_93xx46_dev *eeprom_93xx46 = 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 = eeprom_93xx46_write(eeprom_93xx46, buf, offset, len);
> +     if (err)
> +             return err;
> +     return 0;

return eeprom_93xx46_write(eeprom_93xx46, buf, offset, len);

> +}
> +


--
With best wishes,
Vladimir

Reply via email to