Skip to content

Commit 8405254

Browse files
committed
Merge tag 'counter-fixes-6.3a' of git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter into char-misc-linus
William writes: First set of Counter driver fixes for 6.3 This set consists of two fixes for the 104-quad-8 driver: - fix a read race condition between the FLAG and CNTR registers (as a result 25-bit count values are no longer supported) - invert condition check to report correct Index Synapse action * tag 'counter-fixes-6.3a' of git://git.kernel.org/pub/scm/linux/kernel/git/wbg/counter: counter: 104-quad-8: Fix Synapse action reported for Index signals counter: 104-quad-8: Fix race condition between FLAG and CNTR reads
2 parents e8d018d + 00f4bc5 commit 8405254

File tree

1 file changed

+9
-22
lines changed

1 file changed

+9
-22
lines changed

drivers/counter/104-quad-8.c

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,6 @@ struct quad8 {
9797
struct quad8_reg __iomem *reg;
9898
};
9999

100-
/* Borrow Toggle flip-flop */
101-
#define QUAD8_FLAG_BT BIT(0)
102-
/* Carry Toggle flip-flop */
103-
#define QUAD8_FLAG_CT BIT(1)
104100
/* Error flag */
105101
#define QUAD8_FLAG_E BIT(4)
106102
/* Up/Down flag */
@@ -133,6 +129,9 @@ struct quad8 {
133129
#define QUAD8_CMR_QUADRATURE_X2 0x10
134130
#define QUAD8_CMR_QUADRATURE_X4 0x18
135131

132+
/* Each Counter is 24 bits wide */
133+
#define LS7267_CNTR_MAX GENMASK(23, 0)
134+
136135
static int quad8_signal_read(struct counter_device *counter,
137136
struct counter_signal *signal,
138137
enum counter_signal_level *level)
@@ -156,18 +155,10 @@ static int quad8_count_read(struct counter_device *counter,
156155
{
157156
struct quad8 *const priv = counter_priv(counter);
158157
struct channel_reg __iomem *const chan = priv->reg->channel + count->id;
159-
unsigned int flags;
160-
unsigned int borrow;
161-
unsigned int carry;
162158
unsigned long irqflags;
163159
int i;
164160

165-
flags = ioread8(&chan->control);
166-
borrow = flags & QUAD8_FLAG_BT;
167-
carry = !!(flags & QUAD8_FLAG_CT);
168-
169-
/* Borrow XOR Carry effectively doubles count range */
170-
*val = (unsigned long)(borrow ^ carry) << 24;
161+
*val = 0;
171162

172163
spin_lock_irqsave(&priv->lock, irqflags);
173164

@@ -191,8 +182,7 @@ static int quad8_count_write(struct counter_device *counter,
191182
unsigned long irqflags;
192183
int i;
193184

194-
/* Only 24-bit values are supported */
195-
if (val > 0xFFFFFF)
185+
if (val > LS7267_CNTR_MAX)
196186
return -ERANGE;
197187

198188
spin_lock_irqsave(&priv->lock, irqflags);
@@ -378,7 +368,7 @@ static int quad8_action_read(struct counter_device *counter,
378368

379369
/* Handle Index signals */
380370
if (synapse->signal->id >= 16) {
381-
if (priv->preset_enable[count->id])
371+
if (!priv->preset_enable[count->id])
382372
*action = COUNTER_SYNAPSE_ACTION_RISING_EDGE;
383373
else
384374
*action = COUNTER_SYNAPSE_ACTION_NONE;
@@ -806,8 +796,7 @@ static int quad8_count_preset_write(struct counter_device *counter,
806796
struct quad8 *const priv = counter_priv(counter);
807797
unsigned long irqflags;
808798

809-
/* Only 24-bit values are supported */
810-
if (preset > 0xFFFFFF)
799+
if (preset > LS7267_CNTR_MAX)
811800
return -ERANGE;
812801

813802
spin_lock_irqsave(&priv->lock, irqflags);
@@ -834,8 +823,7 @@ static int quad8_count_ceiling_read(struct counter_device *counter,
834823
*ceiling = priv->preset[count->id];
835824
break;
836825
default:
837-
/* By default 0x1FFFFFF (25 bits unsigned) is maximum count */
838-
*ceiling = 0x1FFFFFF;
826+
*ceiling = LS7267_CNTR_MAX;
839827
break;
840828
}
841829

@@ -850,8 +838,7 @@ static int quad8_count_ceiling_write(struct counter_device *counter,
850838
struct quad8 *const priv = counter_priv(counter);
851839
unsigned long irqflags;
852840

853-
/* Only 24-bit values are supported */
854-
if (ceiling > 0xFFFFFF)
841+
if (ceiling > LS7267_CNTR_MAX)
855842
return -ERANGE;
856843

857844
spin_lock_irqsave(&priv->lock, irqflags);

0 commit comments

Comments
 (0)