counter: Simplify the count_read and count_write callbacks
authorWilliam Breathitt Gray <vilhelm.gray@gmail.com>
Sun, 6 Oct 2019 20:03:09 +0000 (16:03 -0400)
committerJonathan Cameron <Jonathan.Cameron@huawei.com>
Fri, 18 Oct 2019 18:47:27 +0000 (19:47 +0100)
The count_read and count_write callbacks are simplified to pass val as
unsigned long rather than as an opaque data structure. The opaque
counter_count_read_value and counter_count_write_value structures,
counter_count_value_type enum, and relevant counter_count_read_value_set
and counter_count_write_value_get functions, are removed as they are no
longer used.

Cc: Patrick Havelange <patrick.havelange@essensium.com>
Acked-by: Fabrice Gasnier <fabrice.gasnier@st.com>
Acked-by: David Lechner <david@lechnology.com>
Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
drivers/counter/104-quad-8.c
drivers/counter/counter.c
drivers/counter/ftm-quaddec.c
drivers/counter/stm32-lptimer-cnt.c
drivers/counter/stm32-timer-cnt.c
drivers/counter/ti-eqep.c
include/linux/counter.h

index 00b113f..17e67a8 100644 (file)
@@ -562,11 +562,10 @@ static const struct iio_chan_spec quad8_channels[] = {
 };
 
 static int quad8_signal_read(struct counter_device *counter,
-       struct counter_signal *signal, struct counter_signal_read_value *val)
+       struct counter_signal *signal, enum counter_signal_value *val)
 {
        const struct quad8_iio *const priv = counter->priv;
        unsigned int state;
-       enum counter_signal_level level;
 
        /* Only Index signal levels can be read */
        if (signal->id < 16)
@@ -575,22 +574,19 @@ static int quad8_signal_read(struct counter_device *counter,
        state = inb(priv->base + QUAD8_REG_INDEX_INPUT_LEVELS)
                & BIT(signal->id - 16);
 
-       level = (state) ? COUNTER_SIGNAL_LEVEL_HIGH : COUNTER_SIGNAL_LEVEL_LOW;
-
-       counter_signal_read_value_set(val, COUNTER_SIGNAL_LEVEL, &level);
+       *val = (state) ? COUNTER_SIGNAL_HIGH : COUNTER_SIGNAL_LOW;
 
        return 0;
 }
 
 static int quad8_count_read(struct counter_device *counter,
-       struct counter_count *count, struct counter_count_read_value *val)
+       struct counter_count *count, unsigned long *val)
 {
        const struct quad8_iio *const priv = counter->priv;
        const int base_offset = priv->base + 2 * count->id;
        unsigned int flags;
        unsigned int borrow;
        unsigned int carry;
-       unsigned long position;
        int i;
 
        flags = inb(base_offset + 1);
@@ -598,36 +594,27 @@ static int quad8_count_read(struct counter_device *counter,
        carry = !!(flags & QUAD8_FLAG_CT);
 
        /* Borrow XOR Carry effectively doubles count range */
-       position = (unsigned long)(borrow ^ carry) << 24;
+       *val = (unsigned long)(borrow ^ carry) << 24;
 
        /* Reset Byte Pointer; transfer Counter to Output Latch */
        outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP | QUAD8_RLD_CNTR_OUT,
             base_offset + 1);
 
        for (i = 0; i < 3; i++)
-               position |= (unsigned long)inb(base_offset) << (8 * i);
-
-       counter_count_read_value_set(val, COUNTER_COUNT_POSITION, &position);
+               *val |= (unsigned long)inb(base_offset) << (8 * i);
 
        return 0;
 }
 
 static int quad8_count_write(struct counter_device *counter,
-       struct counter_count *count, struct counter_count_write_value *val)
+       struct counter_count *count, unsigned long val)
 {
        const struct quad8_iio *const priv = counter->priv;
        const int base_offset = priv->base + 2 * count->id;
-       int err;
-       unsigned long position;
        int i;
 
-       err = counter_count_write_value_get(&position, COUNTER_COUNT_POSITION,
-                                           val);
-       if (err)
-               return err;
-
        /* Only 24-bit values are supported */
-       if (position > 0xFFFFFF)
+       if (val > 0xFFFFFF)
                return -EINVAL;
 
        /* Reset Byte Pointer */
@@ -635,7 +622,7 @@ static int quad8_count_write(struct counter_device *counter,
 
        /* Counter can only be set via Preset Register */
        for (i = 0; i < 3; i++)
-               outb(position >> (8 * i), base_offset);
+               outb(val >> (8 * i), base_offset);
 
        /* Transfer Preset Register to Counter */
        outb(QUAD8_CTR_RLD | QUAD8_RLD_PRESET_CNTR, base_offset + 1);
@@ -644,9 +631,9 @@ static int quad8_count_write(struct counter_device *counter,
        outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_BP, base_offset + 1);
 
        /* Set Preset Register back to original value */
-       position = priv->preset[count->id];
+       val = priv->preset[count->id];
        for (i = 0; i < 3; i++)
-               outb(position >> (8 * i), base_offset);
+               outb(val >> (8 * i), base_offset);
 
        /* Reset Borrow, Carry, Compare, and Sign flags */
        outb(QUAD8_CTR_RLD | QUAD8_RLD_RESET_FLAGS, base_offset + 1);
index 106bc71..6a683d0 100644 (file)
@@ -220,86 +220,6 @@ ssize_t counter_device_enum_available_read(struct counter_device *counter,
 }
 EXPORT_SYMBOL_GPL(counter_device_enum_available_read);
 
-static const char *const counter_signal_level_str[] = {
-       [COUNTER_SIGNAL_LEVEL_LOW] = "low",
-       [COUNTER_SIGNAL_LEVEL_HIGH] = "high"
-};
-
-/**
- * counter_signal_read_value_set - set counter_signal_read_value data
- * @val:       counter_signal_read_value structure to set
- * @type:      property Signal data represents
- * @data:      Signal data
- *
- * This function sets an opaque counter_signal_read_value structure with the
- * provided Signal data.
- */
-void counter_signal_read_value_set(struct counter_signal_read_value *const val,
-                                  const enum counter_signal_value_type type,
-                                  void *const data)
-{
-       if (type == COUNTER_SIGNAL_LEVEL)
-               val->len = sprintf(val->buf, "%s\n",
-                                  counter_signal_level_str[*(enum counter_signal_level *)data]);
-       else
-               val->len = 0;
-}
-EXPORT_SYMBOL_GPL(counter_signal_read_value_set);
-
-/**
- * counter_count_read_value_set - set counter_count_read_value data
- * @val:       counter_count_read_value structure to set
- * @type:      property Count data represents
- * @data:      Count data
- *
- * This function sets an opaque counter_count_read_value structure with the
- * provided Count data.
- */
-void counter_count_read_value_set(struct counter_count_read_value *const val,
-                                 const enum counter_count_value_type type,
-                                 void *const data)
-{
-       switch (type) {
-       case COUNTER_COUNT_POSITION:
-               val->len = sprintf(val->buf, "%lu\n", *(unsigned long *)data);
-               break;
-       default:
-               val->len = 0;
-       }
-}
-EXPORT_SYMBOL_GPL(counter_count_read_value_set);
-
-/**
- * counter_count_write_value_get - get counter_count_write_value data
- * @data:      Count data
- * @type:      property Count data represents
- * @val:       counter_count_write_value structure containing data
- *
- * This function extracts Count data from the provided opaque
- * counter_count_write_value structure and stores it at the address provided by
- * @data.
- *
- * RETURNS:
- * 0 on success, negative error number on failure.
- */
-int counter_count_write_value_get(void *const data,
-                                 const enum counter_count_value_type type,
-                                 const struct counter_count_write_value *const val)
-{
-       int err;
-
-       switch (type) {
-       case COUNTER_COUNT_POSITION:
-               err = kstrtoul(val->buf, 0, data);
-               if (err)
-                       return err;
-               break;
-       }
-
-       return 0;
-}
-EXPORT_SYMBOL_GPL(counter_count_write_value_get);
-
 struct counter_attr_parm {
        struct counter_device_attr_group *group;
        const char *prefix;
@@ -369,6 +289,11 @@ struct counter_signal_unit {
        struct counter_signal *signal;
 };
 
+static const char *const counter_signal_value_str[] = {
+       [COUNTER_SIGNAL_LOW] = "low",
+       [COUNTER_SIGNAL_HIGH] = "high"
+};
+
 static ssize_t counter_signal_show(struct device *dev,
                                   struct device_attribute *attr, char *buf)
 {
@@ -377,13 +302,13 @@ static ssize_t counter_signal_show(struct device *dev,
        const struct counter_signal_unit *const component = devattr->component;
        struct counter_signal *const signal = component->signal;
        int err;
-       struct counter_signal_read_value val = { .buf = buf };
+       enum counter_signal_value val;
 
        err = counter->ops->signal_read(counter, signal, &val);
        if (err)
                return err;
 
-       return val.len;
+       return sprintf(buf, "%s\n", counter_signal_value_str[val]);
 }
 
 struct counter_name_unit {
@@ -788,13 +713,13 @@ static ssize_t counter_count_show(struct device *dev,
        const struct counter_count_unit *const component = devattr->component;
        struct counter_count *const count = component->count;
        int err;
-       struct counter_count_read_value val = { .buf = buf };
+       unsigned long val;
 
        err = counter->ops->count_read(counter, count, &val);
        if (err)
                return err;
 
-       return val.len;
+       return sprintf(buf, "%lu\n", val);
 }
 
 static ssize_t counter_count_store(struct device *dev,
@@ -806,9 +731,13 @@ static ssize_t counter_count_store(struct device *dev,
        const struct counter_count_unit *const component = devattr->component;
        struct counter_count *const count = component->count;
        int err;
-       struct counter_count_write_value val = { .buf = buf };
+       unsigned long val;
+
+       err = kstrtoul(buf, 0, &val);
+       if (err)
+               return err;
 
-       err = counter->ops->count_write(counter, count, &val);
+       err = counter->ops->count_write(counter, count, val);
        if (err)
                return err;
 
index 4046aa9..c2b3fdf 100644 (file)
@@ -178,31 +178,25 @@ static const enum counter_count_function ftm_quaddec_count_functions[] = {
 
 static int ftm_quaddec_count_read(struct counter_device *counter,
                                  struct counter_count *count,
-                                 struct counter_count_read_value *val)
+                                 unsigned long *val)
 {
        struct ftm_quaddec *const ftm = counter->priv;
        uint32_t cntval;
 
        ftm_read(ftm, FTM_CNT, &cntval);
 
-       counter_count_read_value_set(val, COUNTER_COUNT_POSITION, &cntval);
+       *val = cntval;
 
        return 0;
 }
 
 static int ftm_quaddec_count_write(struct counter_device *counter,
                                   struct counter_count *count,
-                                  struct counter_count_write_value *val)
+                                  const unsigned long val)
 {
        struct ftm_quaddec *const ftm = counter->priv;
-       u32 cnt;
-       int err;
 
-       err = counter_count_write_value_get(&cnt, COUNTER_COUNT_POSITION, val);
-       if (err)
-               return err;
-
-       if (cnt != 0) {
+       if (val != 0) {
                dev_warn(&ftm->pdev->dev, "Can only accept '0' as new counter value\n");
                return -EINVAL;
        }
index 28b6364..8e276eb 100644 (file)
@@ -377,8 +377,7 @@ static enum counter_synapse_action stm32_lptim_cnt_synapse_actions[] = {
 };
 
 static int stm32_lptim_cnt_read(struct counter_device *counter,
-                               struct counter_count *count,
-                               struct counter_count_read_value *val)
+                               struct counter_count *count, unsigned long *val)
 {
        struct stm32_lptim_cnt *const priv = counter->priv;
        u32 cnt;
@@ -388,7 +387,7 @@ static int stm32_lptim_cnt_read(struct counter_device *counter,
        if (ret)
                return ret;
 
-       counter_count_read_value_set(val, COUNTER_COUNT_POSITION, &cnt);
+       *val = cnt;
 
        return 0;
 }
index b61135b..3eafcce 100644 (file)
@@ -48,34 +48,27 @@ static enum counter_count_function stm32_count_functions[] = {
 };
 
 static int stm32_count_read(struct counter_device *counter,
-                           struct counter_count *count,
-                           struct counter_count_read_value *val)
+                           struct counter_count *count, unsigned long *val)
 {
        struct stm32_timer_cnt *const priv = counter->priv;
        u32 cnt;
 
        regmap_read(priv->regmap, TIM_CNT, &cnt);
-       counter_count_read_value_set(val, COUNTER_COUNT_POSITION, &cnt);
+       *val = cnt;
 
        return 0;
 }
 
 static int stm32_count_write(struct counter_device *counter,
                             struct counter_count *count,
-                            struct counter_count_write_value *val)
+                            const unsigned long val)
 {
        struct stm32_timer_cnt *const priv = counter->priv;
-       u32 cnt;
-       int err;
-
-       err = counter_count_write_value_get(&cnt, COUNTER_COUNT_POSITION, val);
-       if (err)
-               return err;
 
-       if (cnt > priv->ceiling)
+       if (val > priv->ceiling)
                return -EINVAL;
 
-       return regmap_write(priv->regmap, TIM_CNT, cnt);
+       return regmap_write(priv->regmap, TIM_CNT, val);
 }
 
 static int stm32_count_function_get(struct counter_device *counter,
index 4b3ef24..1ff07fa 100644 (file)
@@ -93,35 +93,28 @@ struct ti_eqep_cnt {
 };
 
 static int ti_eqep_count_read(struct counter_device *counter,
-                             struct counter_count *count,
-                             struct counter_count_read_value *val)
+                             struct counter_count *count, unsigned long *val)
 {
        struct ti_eqep_cnt *priv = counter->priv;
        u32 cnt;
 
        regmap_read(priv->regmap32, QPOSCNT, &cnt);
-       counter_count_read_value_set(val, COUNTER_COUNT_POSITION, &cnt);
+       *val = cnt;
 
        return 0;
 }
 
 static int ti_eqep_count_write(struct counter_device *counter,
-                              struct counter_count *count,
-                              struct counter_count_write_value *val)
+                              struct counter_count *count, unsigned long val)
 {
        struct ti_eqep_cnt *priv = counter->priv;
-       u32 cnt, max;
-       int err;
-
-       err = counter_count_write_value_get(&cnt, COUNTER_COUNT_POSITION, val);
-       if (err)
-               return err;
+       u32 max;
 
        regmap_read(priv->regmap32, QPOSMAX, &max);
-       if (cnt > max)
+       if (val > max)
                return -EINVAL;
 
-       return regmap_write(priv->regmap32, QPOSCNT, cnt);
+       return regmap_write(priv->regmap32, QPOSCNT, val);
 }
 
 static int ti_eqep_function_get(struct counter_device *counter,
index a061cdc..32fb4d8 100644 (file)
@@ -290,53 +290,22 @@ struct counter_device_state {
        const struct attribute_group **groups;
 };
 
-/**
- * struct counter_signal_read_value - Opaque Signal read value
- * @buf:       string representation of Signal read value
- * @len:       length of string in @buf
- */
-struct counter_signal_read_value {
-       char *buf;
-       size_t len;
-};
-
-/**
- * struct counter_count_read_value - Opaque Count read value
- * @buf:       string representation of Count read value
- * @len:       length of string in @buf
- */
-struct counter_count_read_value {
-       char *buf;
-       size_t len;
-};
-
-/**
- * struct counter_count_write_value - Opaque Count write value
- * @buf:       string representation of Count write value
- */
-struct counter_count_write_value {
-       const char *buf;
+enum counter_signal_value {
+       COUNTER_SIGNAL_LOW = 0,
+       COUNTER_SIGNAL_HIGH
 };
 
 /**
  * struct counter_ops - Callbacks from driver
  * @signal_read:       optional read callback for Signal attribute. The read
  *                     value of the respective Signal should be passed back via
- *                     the val parameter. val points to an opaque type which
- *                     should be set only by calling the
- *                     counter_signal_read_value_set function from within the
- *                     signal_read callback.
+ *                     the val parameter.
  * @count_read:                optional read callback for Count attribute. The read
  *                     value of the respective Count should be passed back via
- *                     the val parameter. val points to an opaque type which
- *                     should be set only by calling the
- *                     counter_count_read_value_set function from within the
- *                     count_read callback.
+ *                     the val parameter.
  * @count_write:       optional write callback for Count attribute. The write
  *                     value for the respective Count is passed in via the val
- *                     parameter. val points to an opaque type which should be
- *                     accessed only by calling the
- *                     counter_count_write_value_get function.
+ *                     parameter.
  * @function_get:      function to get the current count function mode. Returns
  *                     0 on success and negative error code on error. The index
  *                     of the respective Count's returned function mode should
@@ -355,13 +324,11 @@ struct counter_count_write_value {
 struct counter_ops {
        int (*signal_read)(struct counter_device *counter,
                           struct counter_signal *signal,
-                          struct counter_signal_read_value *val);
+                          enum counter_signal_value *val);
        int (*count_read)(struct counter_device *counter,
-                         struct counter_count *count,
-                         struct counter_count_read_value *val);
+                         struct counter_count *count, unsigned long *val);
        int (*count_write)(struct counter_device *counter,
-                          struct counter_count *count,
-                          struct counter_count_write_value *val);
+                          struct counter_count *count, unsigned long val);
        int (*function_get)(struct counter_device *counter,
                            struct counter_count *count, size_t *function);
        int (*function_set)(struct counter_device *counter,
@@ -477,29 +444,6 @@ struct counter_device {
        void *priv;
 };
 
-enum counter_signal_level {
-       COUNTER_SIGNAL_LEVEL_LOW = 0,
-       COUNTER_SIGNAL_LEVEL_HIGH
-};
-
-enum counter_signal_value_type {
-       COUNTER_SIGNAL_LEVEL = 0
-};
-
-enum counter_count_value_type {
-       COUNTER_COUNT_POSITION = 0,
-};
-
-void counter_signal_read_value_set(struct counter_signal_read_value *const val,
-                                  const enum counter_signal_value_type type,
-                                  void *const data);
-void counter_count_read_value_set(struct counter_count_read_value *const val,
-                                 const enum counter_count_value_type type,
-                                 void *const data);
-int counter_count_write_value_get(void *const data,
-                                 const enum counter_count_value_type type,
-                                 const struct counter_count_write_value *const val);
-
 int counter_register(struct counter_device *const counter);
 void counter_unregister(struct counter_device *const counter);
 int devm_counter_register(struct device *dev,