aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Hillenbrand <codeworkx@cyanogenmod.org>2013-06-24 07:28:36 -0700
committerGerrit Code Review <gerrit@cyanogenmod.org>2013-06-24 07:28:36 -0700
commitdedc6146fcc87366872b4b1b92865e15d4554e1d (patch)
tree5428a7475bf3281aa98a06097a7537bfcc3e5652
parent4b2308ce699b9c599dd6e6acf57ac11f483381d9 (diff)
parent35eb2302caf8eb74e7ad2e80b1509525286e2fc6 (diff)
downloadkernel_samsung_smdk4412-dedc6146fcc87366872b4b1b92865e15d4554e1d.tar.gz
kernel_samsung_smdk4412-dedc6146fcc87366872b4b1b92865e15d4554e1d.tar.bz2
kernel_samsung_smdk4412-dedc6146fcc87366872b4b1b92865e15d4554e1d.zip
Merge "UMS: f_mass_storage: Added cdrom option to UMS-lun-devices" into cm-10.1
-rw-r--r--drivers/usb/gadget/f_mass_storage.c6
-rw-r--r--drivers/usb/gadget/storage_common.c37
2 files changed, 43 insertions, 0 deletions
diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c
index ec1d520ba15..884caa86c76 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -3145,6 +3145,7 @@ static int fsg_main_thread(void *common_)
static DEVICE_ATTR(ro, 0644, fsg_show_ro, fsg_store_ro);
static DEVICE_ATTR(nofua, 0644, fsg_show_nofua, fsg_store_nofua);
static DEVICE_ATTR(file, 0644, fsg_show_file, fsg_store_file);
+static DEVICE_ATTR(cdrom, 0644, fsg_show_cdrom, fsg_store_cdrom);
/****************************** FSG COMMON ******************************/
@@ -3260,6 +3261,10 @@ static struct fsg_common *fsg_common_init(struct fsg_common *common,
rc = device_create_file(&curlun->dev, &dev_attr_nofua);
if (rc)
goto error_luns;
+ rc = device_create_file(&curlun->dev, &dev_attr_cdrom);
+ if (rc)
+ goto error_luns;
+
if (lcfg->filename) {
rc = fsg_lun_open(curlun, lcfg->filename);
@@ -3401,6 +3406,7 @@ static void fsg_common_release(struct kref *ref)
device_remove_file(&lun->dev, &dev_attr_nofua);
device_remove_file(&lun->dev, &dev_attr_ro);
device_remove_file(&lun->dev, &dev_attr_file);
+ device_remove_file(&lun->dev, &dev_attr_cdrom);
fsg_lun_close(lun);
device_unregister(&lun->dev);
}
diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c
index 70a474c5266..0c7f16b46e4 100644
--- a/drivers/usb/gadget/storage_common.c
+++ b/drivers/usb/gadget/storage_common.c
@@ -913,3 +913,40 @@ static ssize_t fsg_store_file(struct device *dev, struct device_attribute *attr,
up_write(filesem);
return (rc < 0 ? rc : count);
}
+
+static ssize_t fsg_show_cdrom (struct device *dev, struct device_attribute *attr,
+ char *buf)
+{
+ struct fsg_lun *curlun = fsg_lun_from_dev(dev);
+
+ return sprintf(buf, "%d\n", curlun->cdrom);
+}
+
+static ssize_t fsg_store_cdrom(struct device *dev, struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ ssize_t rc;
+ struct fsg_lun *curlun = fsg_lun_from_dev(dev);
+ struct rw_semaphore *filesem = dev_get_drvdata(dev);
+ unsigned cdrom;
+
+ rc = kstrtouint(buf, 2, &cdrom);
+ if (rc)
+ return rc;
+
+ /*
+ * Allow the cdrom status to change only while the
+ * backing file is closed.
+ */
+ down_read(filesem);
+ if (fsg_lun_is_open(curlun)) {
+ LDBG(curlun, "cdrom status change prevented\n");
+ rc = -EBUSY;
+ } else {
+ curlun->cdrom = cdrom;
+ LDBG(curlun, "cdrom status set to %d\n", curlun->cdrom);
+ rc = count;
+ }
+ up_read(filesem);
+ return rc;
+}