]> rtime.felk.cvut.cz Git - lisovros/linux_canprio.git/blobdiff - arch/arm/plat-omap/mcbsp.c
OMAP: McBSP: Use textual values in DMA operating mode sysfs files
[lisovros/linux_canprio.git] / arch / arm / plat-omap / mcbsp.c
index b63a7209b41c012dd698696ceae3fff8994044f6..ee60ab68251df13c287196493017ff914f3c1db2 100644 (file)
@@ -1161,25 +1161,31 @@ static DEVICE_ATTR(prop, 0644, prop##_show, prop##_store);
 THRESHOLD_PROP_BUILDER(max_tx_thres);
 THRESHOLD_PROP_BUILDER(max_rx_thres);
 
+static const char *dma_op_modes[] = {
+       "element", "threshold", "frame",
+};
+
 static ssize_t dma_op_mode_show(struct device *dev,
                        struct device_attribute *attr, char *buf)
 {
        struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
-       int dma_op_mode;
+       int dma_op_mode, i = 0;
+       ssize_t len = 0;
+       const char * const *s;
 
        spin_lock_irq(&mcbsp->lock);
        dma_op_mode = mcbsp->dma_op_mode;
        spin_unlock_irq(&mcbsp->lock);
 
-       return sprintf(buf, "current mode: %d\n"
-                       "possible mode values are:\n"
-                       "%d - %s\n"
-                       "%d - %s\n"
-                       "%d - %s\n",
-                       dma_op_mode,
-                       MCBSP_DMA_MODE_ELEMENT, "element mode",
-                       MCBSP_DMA_MODE_THRESHOLD, "threshold mode",
-                       MCBSP_DMA_MODE_FRAME, "frame mode");
+       for (s = &dma_op_modes[i]; i < ARRAY_SIZE(dma_op_modes); s++, i++) {
+               if (dma_op_mode == i)
+                       len += sprintf(buf + len, "[%s] ", *s);
+               else
+                       len += sprintf(buf + len, "%s ", *s);
+       }
+       len += sprintf(buf + len, "\n");
+
+       return len;
 }
 
 static ssize_t dma_op_mode_store(struct device *dev,
@@ -1187,26 +1193,22 @@ static ssize_t dma_op_mode_store(struct device *dev,
                                const char *buf, size_t size)
 {
        struct omap_mcbsp *mcbsp = dev_get_drvdata(dev);
-       unsigned long val;
-       int status;
+       const char * const *s;
+       int i = 0;
 
-       status = strict_strtoul(buf, 0, &val);
-       if (status)
-               return status;
+       for (s = &dma_op_modes[i]; i < ARRAY_SIZE(dma_op_modes); s++, i++)
+               if (sysfs_streq(buf, *s))
+                       break;
 
-       spin_lock_irq(&mcbsp->lock);
+       if (i == ARRAY_SIZE(dma_op_modes))
+               return -EINVAL;
 
+       spin_lock_irq(&mcbsp->lock);
        if (!mcbsp->free) {
                size = -EBUSY;
                goto unlock;
        }
-
-       if (val > MCBSP_DMA_MODE_FRAME || val < MCBSP_DMA_MODE_ELEMENT) {
-               size = -EINVAL;
-               goto unlock;
-       }
-
-       mcbsp->dma_op_mode = val;
+       mcbsp->dma_op_mode = i;
 
 unlock:
        spin_unlock_irq(&mcbsp->lock);