forked from Minki/linux
mtd: Add a retlen parameter to _get_{fact,user}_prot_info
Signed-off-by: Christian Riesch <christian.riesch@omicron.at> Cc: Artem Bityutskiy <Artem.Bityutskiy@linux.intel.com> Signed-off-by: Brian Norris <computersforpeace@gmail.com>
This commit is contained in:
parent
41bf1a24c1
commit
4b78fc42f3
@ -68,10 +68,10 @@ static int cfi_intelext_read_fact_prot_reg (struct mtd_info *, loff_t, size_t, s
|
||||
static int cfi_intelext_read_user_prot_reg (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
|
||||
static int cfi_intelext_write_user_prot_reg (struct mtd_info *, loff_t, size_t, size_t *, u_char *);
|
||||
static int cfi_intelext_lock_user_prot_reg (struct mtd_info *, loff_t, size_t);
|
||||
static int cfi_intelext_get_fact_prot_info (struct mtd_info *,
|
||||
struct otp_info *, size_t);
|
||||
static int cfi_intelext_get_user_prot_info (struct mtd_info *,
|
||||
struct otp_info *, size_t);
|
||||
static int cfi_intelext_get_fact_prot_info(struct mtd_info *, size_t,
|
||||
size_t *, struct otp_info *);
|
||||
static int cfi_intelext_get_user_prot_info(struct mtd_info *, size_t,
|
||||
size_t *, struct otp_info *);
|
||||
#endif
|
||||
static int cfi_intelext_suspend (struct mtd_info *);
|
||||
static void cfi_intelext_resume (struct mtd_info *);
|
||||
@ -2394,24 +2394,19 @@ static int cfi_intelext_lock_user_prot_reg(struct mtd_info *mtd,
|
||||
NULL, do_otp_lock, 1);
|
||||
}
|
||||
|
||||
static int cfi_intelext_get_fact_prot_info(struct mtd_info *mtd,
|
||||
struct otp_info *buf, size_t len)
|
||||
{
|
||||
size_t retlen;
|
||||
int ret;
|
||||
static int cfi_intelext_get_fact_prot_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf)
|
||||
|
||||
ret = cfi_intelext_otp_walk(mtd, 0, len, &retlen, (u_char *)buf, NULL, 0);
|
||||
return ret ? : retlen;
|
||||
{
|
||||
return cfi_intelext_otp_walk(mtd, 0, len, retlen, (u_char *)buf,
|
||||
NULL, 0);
|
||||
}
|
||||
|
||||
static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd,
|
||||
struct otp_info *buf, size_t len)
|
||||
static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf)
|
||||
{
|
||||
size_t retlen;
|
||||
int ret;
|
||||
|
||||
ret = cfi_intelext_otp_walk(mtd, 0, len, &retlen, (u_char *)buf, NULL, 1);
|
||||
return ret ? : retlen;
|
||||
return cfi_intelext_otp_walk(mtd, 0, len, retlen, (u_char *)buf,
|
||||
NULL, 1);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@ -439,8 +439,8 @@ static int dataflash_write(struct mtd_info *mtd, loff_t to, size_t len,
|
||||
|
||||
#ifdef CONFIG_MTD_DATAFLASH_OTP
|
||||
|
||||
static int dataflash_get_otp_info(struct mtd_info *mtd,
|
||||
struct otp_info *info, size_t len)
|
||||
static int dataflash_get_otp_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *info)
|
||||
{
|
||||
/* Report both blocks as identical: bytes 0..64, locked.
|
||||
* Unless the user block changed from all-ones, we can't
|
||||
@ -449,7 +449,8 @@ static int dataflash_get_otp_info(struct mtd_info *mtd,
|
||||
info->start = 0;
|
||||
info->length = 64;
|
||||
info->locked = 1;
|
||||
return sizeof(*info);
|
||||
*retlen = sizeof(*info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t otp_read(struct spi_device *spi, unsigned base,
|
||||
|
@ -889,25 +889,26 @@ static int mtdchar_ioctl(struct file *file, u_int cmd, u_long arg)
|
||||
case OTPGETREGIONINFO:
|
||||
{
|
||||
struct otp_info *buf = kmalloc(4096, GFP_KERNEL);
|
||||
size_t retlen;
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
switch (mfi->mode) {
|
||||
case MTD_FILE_MODE_OTP_FACTORY:
|
||||
ret = mtd_get_fact_prot_info(mtd, buf, 4096);
|
||||
ret = mtd_get_fact_prot_info(mtd, 4096, &retlen, buf);
|
||||
break;
|
||||
case MTD_FILE_MODE_OTP_USER:
|
||||
ret = mtd_get_user_prot_info(mtd, buf, 4096);
|
||||
ret = mtd_get_user_prot_info(mtd, 4096, &retlen, buf);
|
||||
break;
|
||||
default:
|
||||
ret = -EINVAL;
|
||||
break;
|
||||
}
|
||||
if (ret >= 0) {
|
||||
if (!ret) {
|
||||
if (cmd == OTPGETREGIONCOUNT) {
|
||||
int nbr = ret / sizeof(struct otp_info);
|
||||
int nbr = retlen / sizeof(struct otp_info);
|
||||
ret = copy_to_user(argp, &nbr, sizeof(int));
|
||||
} else
|
||||
ret = copy_to_user(argp, buf, ret);
|
||||
ret = copy_to_user(argp, buf, retlen);
|
||||
if (ret)
|
||||
ret = -EFAULT;
|
||||
}
|
||||
|
@ -883,14 +883,14 @@ EXPORT_SYMBOL_GPL(mtd_read_oob);
|
||||
* devices. The user data is one time programmable but the factory data is read
|
||||
* only.
|
||||
*/
|
||||
int mtd_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len)
|
||||
int mtd_get_fact_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen,
|
||||
struct otp_info *buf)
|
||||
{
|
||||
if (!mtd->_get_fact_prot_info)
|
||||
return -EOPNOTSUPP;
|
||||
if (!len)
|
||||
return 0;
|
||||
return mtd->_get_fact_prot_info(mtd, buf, len);
|
||||
return mtd->_get_fact_prot_info(mtd, len, retlen, buf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtd_get_fact_prot_info);
|
||||
|
||||
@ -906,14 +906,14 @@ int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtd_read_fact_prot_reg);
|
||||
|
||||
int mtd_get_user_prot_info(struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len)
|
||||
int mtd_get_user_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen,
|
||||
struct otp_info *buf)
|
||||
{
|
||||
if (!mtd->_get_user_prot_info)
|
||||
return -EOPNOTSUPP;
|
||||
if (!len)
|
||||
return 0;
|
||||
return mtd->_get_user_prot_info(mtd, buf, len);
|
||||
return mtd->_get_user_prot_info(mtd, len, retlen, buf);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mtd_get_user_prot_info);
|
||||
|
||||
|
@ -150,11 +150,12 @@ static int part_read_user_prot_reg(struct mtd_info *mtd, loff_t from,
|
||||
retlen, buf);
|
||||
}
|
||||
|
||||
static int part_get_user_prot_info(struct mtd_info *mtd,
|
||||
struct otp_info *buf, size_t len)
|
||||
static int part_get_user_prot_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf)
|
||||
{
|
||||
struct mtd_part *part = PART(mtd);
|
||||
return part->master->_get_user_prot_info(part->master, buf, len);
|
||||
return part->master->_get_user_prot_info(part->master, len, retlen,
|
||||
buf);
|
||||
}
|
||||
|
||||
static int part_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
|
||||
@ -165,11 +166,12 @@ static int part_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
|
||||
retlen, buf);
|
||||
}
|
||||
|
||||
static int part_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len)
|
||||
static int part_get_fact_prot_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf)
|
||||
{
|
||||
struct mtd_part *part = PART(mtd);
|
||||
return part->master->_get_fact_prot_info(part->master, buf, len);
|
||||
return part->master->_get_fact_prot_info(part->master, len, retlen,
|
||||
buf);
|
||||
}
|
||||
|
||||
static int part_write(struct mtd_info *mtd, loff_t to, size_t len,
|
||||
|
@ -3237,20 +3237,17 @@ static int onenand_otp_walk(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
/**
|
||||
* onenand_get_fact_prot_info - [MTD Interface] Read factory OTP info
|
||||
* @param mtd MTD device structure
|
||||
* @param buf the databuffer to put/get data
|
||||
* @param len number of bytes to read
|
||||
* @param retlen pointer to variable to store the number of read bytes
|
||||
* @param buf the databuffer to put/get data
|
||||
*
|
||||
* Read factory OTP info.
|
||||
*/
|
||||
static int onenand_get_fact_prot_info(struct mtd_info *mtd,
|
||||
struct otp_info *buf, size_t len)
|
||||
static int onenand_get_fact_prot_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf)
|
||||
{
|
||||
size_t retlen;
|
||||
int ret;
|
||||
|
||||
ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_FACTORY);
|
||||
|
||||
return ret ? : retlen;
|
||||
return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
|
||||
MTD_OTP_FACTORY);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -3272,20 +3269,17 @@ static int onenand_read_fact_prot_reg(struct mtd_info *mtd, loff_t from,
|
||||
/**
|
||||
* onenand_get_user_prot_info - [MTD Interface] Read user OTP info
|
||||
* @param mtd MTD device structure
|
||||
* @param buf the databuffer to put/get data
|
||||
* @param retlen pointer to variable to store the number of read bytes
|
||||
* @param len number of bytes to read
|
||||
* @param buf the databuffer to put/get data
|
||||
*
|
||||
* Read user OTP info.
|
||||
*/
|
||||
static int onenand_get_user_prot_info(struct mtd_info *mtd,
|
||||
struct otp_info *buf, size_t len)
|
||||
static int onenand_get_user_prot_info(struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf)
|
||||
{
|
||||
size_t retlen;
|
||||
int ret;
|
||||
|
||||
ret = onenand_otp_walk(mtd, 0, len, &retlen, (u_char *) buf, NULL, MTD_OTP_USER);
|
||||
|
||||
return ret ? : retlen;
|
||||
return onenand_otp_walk(mtd, 0, len, retlen, (u_char *) buf, NULL,
|
||||
MTD_OTP_USER);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -204,12 +204,12 @@ struct mtd_info {
|
||||
struct mtd_oob_ops *ops);
|
||||
int (*_write_oob) (struct mtd_info *mtd, loff_t to,
|
||||
struct mtd_oob_ops *ops);
|
||||
int (*_get_fact_prot_info) (struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len);
|
||||
int (*_get_fact_prot_info) (struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf);
|
||||
int (*_read_fact_prot_reg) (struct mtd_info *mtd, loff_t from,
|
||||
size_t len, size_t *retlen, u_char *buf);
|
||||
int (*_get_user_prot_info) (struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len);
|
||||
int (*_get_user_prot_info) (struct mtd_info *mtd, size_t len,
|
||||
size_t *retlen, struct otp_info *buf);
|
||||
int (*_read_user_prot_reg) (struct mtd_info *mtd, loff_t from,
|
||||
size_t len, size_t *retlen, u_char *buf);
|
||||
int (*_write_user_prot_reg) (struct mtd_info *mtd, loff_t to,
|
||||
@ -278,12 +278,12 @@ static inline int mtd_write_oob(struct mtd_info *mtd, loff_t to,
|
||||
return mtd->_write_oob(mtd, to, ops);
|
||||
}
|
||||
|
||||
int mtd_get_fact_prot_info(struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len);
|
||||
int mtd_get_fact_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen,
|
||||
struct otp_info *buf);
|
||||
int mtd_read_fact_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, u_char *buf);
|
||||
int mtd_get_user_prot_info(struct mtd_info *mtd, struct otp_info *buf,
|
||||
size_t len);
|
||||
int mtd_get_user_prot_info(struct mtd_info *mtd, size_t len, size_t *retlen,
|
||||
struct otp_info *buf);
|
||||
int mtd_read_user_prot_reg(struct mtd_info *mtd, loff_t from, size_t len,
|
||||
size_t *retlen, u_char *buf);
|
||||
int mtd_write_user_prot_reg(struct mtd_info *mtd, loff_t to, size_t len,
|
||||
|
Loading…
Reference in New Issue
Block a user