Commit 77850ae2 authored by Andrzej Pietrasiewicz's avatar Andrzej Pietrasiewicz Committed by Felipe Balbi

usb: gadget: storage_common: make attribute operations more generic

Show/store methods for sysfs attributes contain code which can be used
also by configfs. Make them abstract the source the lun and rw_semaphore
are taken from.
Signed-off-by: default avatarAndrzej Pietrasiewicz <andrzej.p@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarFelipe Balbi <balbi@ti.com>
parent 2412fbf1
...@@ -2581,37 +2581,52 @@ static int fsg_main_thread(void *common_) ...@@ -2581,37 +2581,52 @@ static int fsg_main_thread(void *common_)
static ssize_t ro_show(struct device *dev, struct device_attribute *attr, char *buf) static ssize_t ro_show(struct device *dev, struct device_attribute *attr, char *buf)
{ {
return fsg_show_ro(dev, attr, buf); struct fsg_lun *curlun = fsg_lun_from_dev(dev);
return fsg_show_ro(curlun, buf);
} }
static ssize_t nofua_show(struct device *dev, struct device_attribute *attr, static ssize_t nofua_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
return fsg_show_nofua(dev, attr, buf); struct fsg_lun *curlun = fsg_lun_from_dev(dev);
return fsg_show_nofua(curlun, buf);
} }
static ssize_t file_show(struct device *dev, struct device_attribute *attr, static ssize_t file_show(struct device *dev, struct device_attribute *attr,
char *buf) char *buf)
{ {
return fsg_show_file(dev, attr, buf); struct fsg_lun *curlun = fsg_lun_from_dev(dev);
struct rw_semaphore *filesem = dev_get_drvdata(dev);
return fsg_show_file(curlun, filesem, buf);
} }
static ssize_t ro_store(struct device *dev, struct device_attribute *attr, static ssize_t ro_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
return fsg_store_ro(dev, attr, buf, count); struct fsg_lun *curlun = fsg_lun_from_dev(dev);
struct rw_semaphore *filesem = dev_get_drvdata(dev);
return fsg_store_ro(curlun, filesem, buf, count);
} }
static ssize_t nofua_store(struct device *dev, struct device_attribute *attr, static ssize_t nofua_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
return fsg_store_nofua(dev, attr, buf, count); struct fsg_lun *curlun = fsg_lun_from_dev(dev);
return fsg_store_nofua(curlun, buf, count);
} }
static ssize_t file_store(struct device *dev, struct device_attribute *attr, static ssize_t file_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count) const char *buf, size_t count)
{ {
return fsg_store_file(dev, attr, buf, count); struct fsg_lun *curlun = fsg_lun_from_dev(dev);
struct rw_semaphore *filesem = dev_get_drvdata(dev);
return fsg_store_file(curlun, filesem, buf, count);
} }
static DEVICE_ATTR_RW(ro); static DEVICE_ATTR_RW(ro);
......
...@@ -31,11 +31,6 @@ ...@@ -31,11 +31,6 @@
#include "storage_common.h" #include "storage_common.h"
static inline struct fsg_lun *fsg_lun_from_dev(struct device *dev)
{
return container_of(dev, struct fsg_lun, dev);
}
/* There is only one interface. */ /* There is only one interface. */
struct usb_interface_descriptor fsg_intf_desc = { struct usb_interface_descriptor fsg_intf_desc = {
...@@ -324,31 +319,23 @@ EXPORT_SYMBOL(store_cdrom_address); ...@@ -324,31 +319,23 @@ EXPORT_SYMBOL(store_cdrom_address);
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
ssize_t fsg_show_ro(struct device *dev, struct device_attribute *attr, ssize_t fsg_show_ro(struct fsg_lun *curlun, char *buf)
char *buf)
{ {
struct fsg_lun *curlun = fsg_lun_from_dev(dev);
return sprintf(buf, "%d\n", fsg_lun_is_open(curlun) return sprintf(buf, "%d\n", fsg_lun_is_open(curlun)
? curlun->ro ? curlun->ro
: curlun->initially_ro); : curlun->initially_ro);
} }
EXPORT_SYMBOL(fsg_show_ro); EXPORT_SYMBOL(fsg_show_ro);
ssize_t fsg_show_nofua(struct device *dev, struct device_attribute *attr, ssize_t fsg_show_nofua(struct fsg_lun *curlun, char *buf)
char *buf)
{ {
struct fsg_lun *curlun = fsg_lun_from_dev(dev);
return sprintf(buf, "%u\n", curlun->nofua); return sprintf(buf, "%u\n", curlun->nofua);
} }
EXPORT_SYMBOL(fsg_show_nofua); EXPORT_SYMBOL(fsg_show_nofua);
ssize_t fsg_show_file(struct device *dev, struct device_attribute *attr, ssize_t fsg_show_file(struct fsg_lun *curlun, struct rw_semaphore *filesem,
char *buf) char *buf)
{ {
struct fsg_lun *curlun = fsg_lun_from_dev(dev);
struct rw_semaphore *filesem = dev_get_drvdata(dev);
char *p; char *p;
ssize_t rc; ssize_t rc;
...@@ -373,12 +360,10 @@ ssize_t fsg_show_file(struct device *dev, struct device_attribute *attr, ...@@ -373,12 +360,10 @@ ssize_t fsg_show_file(struct device *dev, struct device_attribute *attr,
EXPORT_SYMBOL(fsg_show_file); EXPORT_SYMBOL(fsg_show_file);
ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr, ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem,
const char *buf, size_t count) const char *buf, size_t count)
{ {
ssize_t rc; ssize_t rc;
struct fsg_lun *curlun = fsg_lun_from_dev(dev);
struct rw_semaphore *filesem = dev_get_drvdata(dev);
unsigned ro; unsigned ro;
rc = kstrtouint(buf, 2, &ro); rc = kstrtouint(buf, 2, &ro);
...@@ -404,10 +389,8 @@ ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr, ...@@ -404,10 +389,8 @@ ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr,
} }
EXPORT_SYMBOL(fsg_store_ro); EXPORT_SYMBOL(fsg_store_ro);
ssize_t fsg_store_nofua(struct device *dev, struct device_attribute *attr, ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count)
const char *buf, size_t count)
{ {
struct fsg_lun *curlun = fsg_lun_from_dev(dev);
unsigned nofua; unsigned nofua;
int ret; int ret;
...@@ -425,11 +408,9 @@ ssize_t fsg_store_nofua(struct device *dev, struct device_attribute *attr, ...@@ -425,11 +408,9 @@ ssize_t fsg_store_nofua(struct device *dev, struct device_attribute *attr,
} }
EXPORT_SYMBOL(fsg_store_nofua); EXPORT_SYMBOL(fsg_store_nofua);
ssize_t fsg_store_file(struct device *dev, struct device_attribute *attr, ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem,
const char *buf, size_t count) const char *buf, size_t count)
{ {
struct fsg_lun *curlun = fsg_lun_from_dev(dev);
struct rw_semaphore *filesem = dev_get_drvdata(dev);
int rc = 0; int rc = 0;
if (curlun->prevent_medium_removal && fsg_lun_is_open(curlun)) { if (curlun->prevent_medium_removal && fsg_lun_is_open(curlun)) {
......
...@@ -181,6 +181,11 @@ static inline u32 get_unaligned_be24(u8 *buf) ...@@ -181,6 +181,11 @@ static inline u32 get_unaligned_be24(u8 *buf)
return 0xffffff & (u32) get_unaligned_be32(buf - 1); return 0xffffff & (u32) get_unaligned_be32(buf - 1);
} }
static inline struct fsg_lun *fsg_lun_from_dev(struct device *dev)
{
return container_of(dev, struct fsg_lun, dev);
}
enum { enum {
FSG_STRING_INTERFACE FSG_STRING_INTERFACE
}; };
...@@ -205,18 +210,14 @@ void fsg_lun_close(struct fsg_lun *curlun); ...@@ -205,18 +210,14 @@ void fsg_lun_close(struct fsg_lun *curlun);
int fsg_lun_open(struct fsg_lun *curlun, const char *filename); int fsg_lun_open(struct fsg_lun *curlun, const char *filename);
int fsg_lun_fsync_sub(struct fsg_lun *curlun); int fsg_lun_fsync_sub(struct fsg_lun *curlun);
void store_cdrom_address(u8 *dest, int msf, u32 addr); void store_cdrom_address(u8 *dest, int msf, u32 addr);
ssize_t fsg_show_ro(struct device *dev, struct device_attribute *attr, ssize_t fsg_show_ro(struct fsg_lun *curlun, char *buf);
ssize_t fsg_show_nofua(struct fsg_lun *curlun, char *buf);
ssize_t fsg_show_file(struct fsg_lun *curlun, struct rw_semaphore *filesem,
char *buf); char *buf);
ssize_t fsg_show_nofua(struct device *dev, struct device_attribute *attr, ssize_t fsg_store_ro(struct fsg_lun *curlun, struct rw_semaphore *filesem,
char *buf);
ssize_t fsg_show_file(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t fsg_store_ro(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count);
ssize_t fsg_store_nofua(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count); const char *buf, size_t count);
ssize_t fsg_store_file(struct device *dev, struct device_attribute *attr, ssize_t fsg_store_nofua(struct fsg_lun *curlun, const char *buf, size_t count);
ssize_t fsg_store_file(struct fsg_lun *curlun, struct rw_semaphore *filesem,
const char *buf, size_t count); const char *buf, size_t count);
#endif /* USB_STORAGE_COMMON_H */ #endif /* USB_STORAGE_COMMON_H */
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