Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+21 −6
Original line number Original line Diff line number Diff line
@@ -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);
+6 −25
Original line number Original line Diff line number Diff line
@@ -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);
/*-------------------------------------------------------------------------*/
/*-------------------------------------------------------------------------*/




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,
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,
}
}
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,
}
}
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)) {
+11 −10
Original line number Original line Diff line number Diff line
@@ -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);
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 */