Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / counter / intel-qep.c
index 8a6847d..0924d16 100644 (file)
 
 #define INTEL_QEP_CLK_PERIOD_NS                10
 
-#define INTEL_QEP_COUNTER_EXT_RW(_name)                                \
-{                                                              \
-       .name = #_name,                                         \
-       .read = _name##_read,                                   \
-       .write = _name##_write,                                 \
-}
-
 struct intel_qep {
        struct counter_device counter;
        struct mutex lock;
@@ -114,8 +107,7 @@ static void intel_qep_init(struct intel_qep *qep)
 }
 
 static int intel_qep_count_read(struct counter_device *counter,
-                               struct counter_count *count,
-                               unsigned long *val)
+                               struct counter_count *count, u64 *val)
 {
        struct intel_qep *const qep = counter->priv;
 
@@ -130,11 +122,11 @@ static const enum counter_function intel_qep_count_functions[] = {
        COUNTER_FUNCTION_QUADRATURE_X4,
 };
 
-static int intel_qep_function_get(struct counter_device *counter,
-                                 struct counter_count *count,
-                                 size_t *function)
+static int intel_qep_function_read(struct counter_device *counter,
+                                  struct counter_count *count,
+                                  enum counter_function *function)
 {
-       *function = 0;
+       *function = COUNTER_FUNCTION_QUADRATURE_X4;
 
        return 0;
 }
@@ -143,19 +135,19 @@ static const enum counter_synapse_action intel_qep_synapse_actions[] = {
        COUNTER_SYNAPSE_ACTION_BOTH_EDGES,
 };
 
-static int intel_qep_action_get(struct counter_device *counter,
-                               struct counter_count *count,
-                               struct counter_synapse *synapse,
-                               size_t *action)
+static int intel_qep_action_read(struct counter_device *counter,
+                                struct counter_count *count,
+                                struct counter_synapse *synapse,
+                                enum counter_synapse_action *action)
 {
-       *action = 0;
+       *action = COUNTER_SYNAPSE_ACTION_BOTH_EDGES;
        return 0;
 }
 
 static const struct counter_ops intel_qep_counter_ops = {
        .count_read = intel_qep_count_read,
-       .function_get = intel_qep_function_get,
-       .action_get = intel_qep_action_get,
+       .function_read = intel_qep_function_read,
+       .action_read = intel_qep_action_read,
 };
 
 #define INTEL_QEP_SIGNAL(_id, _name) {                         \
@@ -181,31 +173,27 @@ static struct counter_synapse intel_qep_count_synapses[] = {
        INTEL_QEP_SYNAPSE(2),
 };
 
-static ssize_t ceiling_read(struct counter_device *counter,
-                           struct counter_count *count,
-                           void *priv, char *buf)
+static int intel_qep_ceiling_read(struct counter_device *counter,
+                                 struct counter_count *count, u64 *ceiling)
 {
        struct intel_qep *qep = counter->priv;
-       u32 reg;
 
        pm_runtime_get_sync(qep->dev);
-       reg = intel_qep_readl(qep, INTEL_QEPMAX);
+       *ceiling = intel_qep_readl(qep, INTEL_QEPMAX);
        pm_runtime_put(qep->dev);
 
-       return sysfs_emit(buf, "%u\n", reg);
+       return 0;
 }
 
-static ssize_t ceiling_write(struct counter_device *counter,
-                            struct counter_count *count,
-                            void *priv, const char *buf, size_t len)
+static int intel_qep_ceiling_write(struct counter_device *counter,
+                                  struct counter_count *count, u64 max)
 {
        struct intel_qep *qep = counter->priv;
-       u32 max;
-       int ret;
+       int ret = 0;
 
-       ret = kstrtou32(buf, 0, &max);
-       if (ret < 0)
-               return ret;
+       /* Intel QEP ceiling configuration only supports 32-bit values */
+       if (max != (u32)max)
+               return -ERANGE;
 
        mutex_lock(&qep->lock);
        if (qep->enabled) {
@@ -216,34 +204,28 @@ static ssize_t ceiling_write(struct counter_device *counter,
        pm_runtime_get_sync(qep->dev);
        intel_qep_writel(qep, INTEL_QEPMAX, max);
        pm_runtime_put(qep->dev);
-       ret = len;
 
 out:
        mutex_unlock(&qep->lock);
        return ret;
 }
 
-static ssize_t enable_read(struct counter_device *counter,
-                          struct counter_count *count,
-                          void *priv, char *buf)
+static int intel_qep_enable_read(struct counter_device *counter,
+                                struct counter_count *count, u8 *enable)
 {
        struct intel_qep *qep = counter->priv;
 
-       return sysfs_emit(buf, "%u\n", qep->enabled);
+       *enable = qep->enabled;
+
+       return 0;
 }
 
-static ssize_t enable_write(struct counter_device *counter,
-                           struct counter_count *count,
-                           void *priv, const char *buf, size_t len)
+static int intel_qep_enable_write(struct counter_device *counter,
+                                 struct counter_count *count, u8 val)
 {
        struct intel_qep *qep = counter->priv;
        u32 reg;
-       bool val, changed;
-       int ret;
-
-       ret = kstrtobool(buf, &val);
-       if (ret)
-               return ret;
+       bool changed;
 
        mutex_lock(&qep->lock);
        changed = val ^ qep->enabled;
@@ -267,12 +249,12 @@ static ssize_t enable_write(struct counter_device *counter,
 
 out:
        mutex_unlock(&qep->lock);
-       return len;
+       return 0;
 }
 
-static ssize_t spike_filter_ns_read(struct counter_device *counter,
-                                   struct counter_count *count,
-                                   void *priv, char *buf)
+static int intel_qep_spike_filter_ns_read(struct counter_device *counter,
+                                         struct counter_count *count,
+                                         u64 *length)
 {
        struct intel_qep *qep = counter->priv;
        u32 reg;
@@ -281,33 +263,31 @@ static ssize_t spike_filter_ns_read(struct counter_device *counter,
        reg = intel_qep_readl(qep, INTEL_QEPCON);
        if (!(reg & INTEL_QEPCON_FLT_EN)) {
                pm_runtime_put(qep->dev);
-               return sysfs_emit(buf, "0\n");
+               return 0;
        }
        reg = INTEL_QEPFLT_MAX_COUNT(intel_qep_readl(qep, INTEL_QEPFLT));
        pm_runtime_put(qep->dev);
 
-       return sysfs_emit(buf, "%u\n", (reg + 2) * INTEL_QEP_CLK_PERIOD_NS);
+       *length = (reg + 2) * INTEL_QEP_CLK_PERIOD_NS;
+
+       return 0;
 }
 
-static ssize_t spike_filter_ns_write(struct counter_device *counter,
-                                    struct counter_count *count,
-                                    void *priv, const char *buf, size_t len)
+static int intel_qep_spike_filter_ns_write(struct counter_device *counter,
+                                          struct counter_count *count,
+                                          u64 length)
 {
        struct intel_qep *qep = counter->priv;
-       u32 reg, length;
+       u32 reg;
        bool enable;
-       int ret;
-
-       ret = kstrtou32(buf, 0, &length);
-       if (ret < 0)
-               return ret;
+       int ret = 0;
 
        /*
         * Spike filter length is (MAX_COUNT + 2) clock periods.
         * Disable filter when userspace writes 0, enable for valid
         * nanoseconds values and error out otherwise.
         */
-       length /= INTEL_QEP_CLK_PERIOD_NS;
+       do_div(length, INTEL_QEP_CLK_PERIOD_NS);
        if (length == 0) {
                enable = false;
                length = 0;
@@ -336,16 +316,15 @@ static ssize_t spike_filter_ns_write(struct counter_device *counter,
        intel_qep_writel(qep, INTEL_QEPFLT, length);
        intel_qep_writel(qep, INTEL_QEPCON, reg);
        pm_runtime_put(qep->dev);
-       ret = len;
 
 out:
        mutex_unlock(&qep->lock);
        return ret;
 }
 
-static ssize_t preset_enable_read(struct counter_device *counter,
-                                 struct counter_count *count,
-                                 void *priv, char *buf)
+static int intel_qep_preset_enable_read(struct counter_device *counter,
+                                       struct counter_count *count,
+                                       u8 *preset_enable)
 {
        struct intel_qep *qep = counter->priv;
        u32 reg;
@@ -353,21 +332,18 @@ static ssize_t preset_enable_read(struct counter_device *counter,
        pm_runtime_get_sync(qep->dev);
        reg = intel_qep_readl(qep, INTEL_QEPCON);
        pm_runtime_put(qep->dev);
-       return sysfs_emit(buf, "%u\n", !(reg & INTEL_QEPCON_COUNT_RST_MODE));
+
+       *preset_enable = !(reg & INTEL_QEPCON_COUNT_RST_MODE);
+
+       return 0;
 }
 
-static ssize_t preset_enable_write(struct counter_device *counter,
-                                  struct counter_count *count,
-                                  void *priv, const char *buf, size_t len)
+static int intel_qep_preset_enable_write(struct counter_device *counter,
+                                        struct counter_count *count, u8 val)
 {
        struct intel_qep *qep = counter->priv;
        u32 reg;
-       bool val;
-       int ret;
-
-       ret = kstrtobool(buf, &val);
-       if (ret)
-               return ret;
+       int ret = 0;
 
        mutex_lock(&qep->lock);
        if (qep->enabled) {
@@ -384,7 +360,6 @@ static ssize_t preset_enable_write(struct counter_device *counter,
 
        intel_qep_writel(qep, INTEL_QEPCON, reg);
        pm_runtime_put(qep->dev);
-       ret = len;
 
 out:
        mutex_unlock(&qep->lock);
@@ -392,11 +367,14 @@ out:
        return ret;
 }
 
-static const struct counter_count_ext intel_qep_count_ext[] = {
-       INTEL_QEP_COUNTER_EXT_RW(ceiling),
-       INTEL_QEP_COUNTER_EXT_RW(enable),
-       INTEL_QEP_COUNTER_EXT_RW(spike_filter_ns),
-       INTEL_QEP_COUNTER_EXT_RW(preset_enable)
+static struct counter_comp intel_qep_count_ext[] = {
+       COUNTER_COMP_ENABLE(intel_qep_enable_read, intel_qep_enable_write),
+       COUNTER_COMP_CEILING(intel_qep_ceiling_read, intel_qep_ceiling_write),
+       COUNTER_COMP_PRESET_ENABLE(intel_qep_preset_enable_read,
+                                  intel_qep_preset_enable_write),
+       COUNTER_COMP_COUNT_U64("spike_filter_ns",
+                              intel_qep_spike_filter_ns_read,
+                              intel_qep_spike_filter_ns_write),
 };
 
 static struct counter_count intel_qep_counter_count[] = {