@@ -44,14 +44,28 @@ enum {
44
44
REQUEST_BY_NODE ,
45
45
};
46
46
47
- static inline u32 __omap_dm_timer_read (struct omap_dm_timer * timer , u32 reg ,
48
- int posted )
47
+ /**
48
+ * dmtimer_read - read timer registers in posted and non-posted mode
49
+ * @timer: timer pointer over which read operation to perform
50
+ * @reg: lowest byte holds the register offset
51
+ *
52
+ * The posted mode bit is encoded in reg. Note that in posted mode, write
53
+ * pending bit must be checked. Otherwise a read of a non completed write
54
+ * will produce an error.
55
+ */
56
+ static inline u32 dmtimer_read (struct omap_dm_timer * timer , u32 reg )
49
57
{
50
- if (posted )
51
- while (readl_relaxed (timer -> pend ) & (reg >> WPSHIFT ))
58
+ u16 wp , offset ;
59
+
60
+ wp = reg >> WPSHIFT ;
61
+ offset = reg & 0xff ;
62
+
63
+ /* Wait for a possible write pending bit in posted mode */
64
+ if (wp && timer -> posted )
65
+ while (readl_relaxed (timer -> pend ) & wp )
52
66
cpu_relax ();
53
67
54
- return readl_relaxed (timer -> func_base + ( reg & 0xff ) );
68
+ return readl_relaxed (timer -> func_base + offset );
55
69
}
56
70
57
71
static inline void __omap_dm_timer_write (struct omap_dm_timer * timer ,
@@ -121,13 +135,13 @@ static inline void __omap_dm_timer_stop(struct omap_dm_timer *timer,
121
135
{
122
136
u32 l ;
123
137
124
- l = __omap_dm_timer_read (timer , OMAP_TIMER_CTRL_REG , posted );
138
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
125
139
if (l & OMAP_TIMER_CTRL_ST ) {
126
140
l &= ~0x1 ;
127
141
__omap_dm_timer_write (timer , OMAP_TIMER_CTRL_REG , l , posted );
128
142
#ifdef CONFIG_ARCH_OMAP2PLUS
129
143
/* Readback to make sure write has completed */
130
- __omap_dm_timer_read (timer , OMAP_TIMER_CTRL_REG , posted );
144
+ dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
131
145
/*
132
146
* Wait for functional clock period x 3.5 to make sure that
133
147
* timer is stopped
@@ -148,9 +162,9 @@ static inline void __omap_dm_timer_int_enable(struct omap_dm_timer *timer,
148
162
}
149
163
150
164
static inline unsigned int
151
- __omap_dm_timer_read_counter (struct omap_dm_timer * timer , int posted )
165
+ __omap_dm_timer_read_counter (struct omap_dm_timer * timer )
152
166
{
153
- return __omap_dm_timer_read (timer , OMAP_TIMER_COUNTER_REG , posted );
167
+ return dmtimer_read (timer , OMAP_TIMER_COUNTER_REG );
154
168
}
155
169
156
170
static inline void __omap_dm_timer_write_status (struct omap_dm_timer * timer ,
@@ -159,21 +173,6 @@ static inline void __omap_dm_timer_write_status(struct omap_dm_timer *timer,
159
173
writel_relaxed (value , timer -> irq_stat );
160
174
}
161
175
162
- /**
163
- * omap_dm_timer_read_reg - read timer registers in posted and non-posted mode
164
- * @timer: timer pointer over which read operation to perform
165
- * @reg: lowest byte holds the register offset
166
- *
167
- * The posted mode bit is encoded in reg. Note that in posted mode write
168
- * pending bit must be checked. Otherwise a read of a non completed write
169
- * will produce an error.
170
- */
171
- static inline u32 omap_dm_timer_read_reg (struct omap_dm_timer * timer , u32 reg )
172
- {
173
- WARN_ON ((reg & 0xff ) < _OMAP_TIMER_WAKEUP_EN_OFFSET );
174
- return __omap_dm_timer_read (timer , reg , timer -> posted );
175
- }
176
-
177
176
/**
178
177
* omap_dm_timer_write_reg - write timer registers in posted and non-posted mode
179
178
* @timer: timer pointer over which write operation is to perform
@@ -213,20 +212,14 @@ static void omap_timer_restore_context(struct omap_dm_timer *timer)
213
212
214
213
static void omap_timer_save_context (struct omap_dm_timer * timer )
215
214
{
216
- timer -> context .ocp_cfg =
217
- __omap_dm_timer_read (timer , OMAP_TIMER_OCP_CFG_OFFSET , 0 );
218
-
219
- timer -> context .tclr =
220
- omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
221
- timer -> context .twer =
222
- omap_dm_timer_read_reg (timer , OMAP_TIMER_WAKEUP_EN_REG );
223
- timer -> context .tldr =
224
- omap_dm_timer_read_reg (timer , OMAP_TIMER_LOAD_REG );
225
- timer -> context .tmar =
226
- omap_dm_timer_read_reg (timer , OMAP_TIMER_MATCH_REG );
215
+ timer -> context .ocp_cfg = dmtimer_read (timer , OMAP_TIMER_OCP_CFG_OFFSET );
216
+
217
+ timer -> context .tclr = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
218
+ timer -> context .twer = dmtimer_read (timer , OMAP_TIMER_WAKEUP_EN_REG );
219
+ timer -> context .tldr = dmtimer_read (timer , OMAP_TIMER_LOAD_REG );
220
+ timer -> context .tmar = dmtimer_read (timer , OMAP_TIMER_MATCH_REG );
227
221
timer -> context .tier = readl_relaxed (timer -> irq_ena );
228
- timer -> context .tsicr =
229
- omap_dm_timer_read_reg (timer , OMAP_TIMER_IF_CTRL_REG );
222
+ timer -> context .tsicr = dmtimer_read (timer , OMAP_TIMER_IF_CTRL_REG );
230
223
}
231
224
232
225
static int omap_timer_context_notifier (struct notifier_block * nb ,
@@ -266,8 +259,7 @@ static int omap_dm_timer_reset(struct omap_dm_timer *timer)
266
259
omap_dm_timer_write_reg (timer , OMAP_TIMER_IF_CTRL_REG , 0x06 );
267
260
268
261
do {
269
- l = __omap_dm_timer_read (timer ,
270
- OMAP_TIMER_V1_SYS_STAT_OFFSET , 0 );
262
+ l = dmtimer_read (timer , OMAP_TIMER_V1_SYS_STAT_OFFSET );
271
263
} while (!l && timeout -- );
272
264
273
265
if (!timeout ) {
@@ -276,7 +268,7 @@ static int omap_dm_timer_reset(struct omap_dm_timer *timer)
276
268
}
277
269
278
270
/* Configure timer for smart-idle mode */
279
- l = __omap_dm_timer_read (timer , OMAP_TIMER_OCP_CFG_OFFSET , 0 );
271
+ l = dmtimer_read (timer , OMAP_TIMER_OCP_CFG_OFFSET );
280
272
l |= 0x2 << 0x3 ;
281
273
__omap_dm_timer_write (timer , OMAP_TIMER_OCP_CFG_OFFSET , l , 0 );
282
274
@@ -550,7 +542,7 @@ __u32 omap_dm_timer_modify_idlect_mask(__u32 inputmask)
550
542
list_for_each_entry (timer , & omap_timer_list , node ) {
551
543
u32 l ;
552
544
553
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
545
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
554
546
if (l & OMAP_TIMER_CTRL_ST ) {
555
547
if (((omap_readl (MOD_CONF_CTRL_1 ) >> (i * 2 )) & 0x03 ) == 0 )
556
548
inputmask &= ~(1 << 1 );
@@ -591,7 +583,7 @@ static int omap_dm_timer_start(struct omap_dm_timer *timer)
591
583
592
584
omap_dm_timer_enable (timer );
593
585
594
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
586
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
595
587
if (!(l & OMAP_TIMER_CTRL_ST )) {
596
588
l |= OMAP_TIMER_CTRL_ST ;
597
589
omap_dm_timer_write_reg (timer , OMAP_TIMER_CTRL_REG , l );
@@ -638,7 +630,7 @@ static int omap_dm_timer_set_match(struct omap_dm_timer *timer, int enable,
638
630
return - EINVAL ;
639
631
640
632
omap_dm_timer_enable (timer );
641
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
633
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
642
634
if (enable )
643
635
l |= OMAP_TIMER_CTRL_CE ;
644
636
else
@@ -659,7 +651,7 @@ static int omap_dm_timer_set_pwm(struct omap_dm_timer *timer, int def_on,
659
651
return - EINVAL ;
660
652
661
653
omap_dm_timer_enable (timer );
662
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
654
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
663
655
l &= ~(OMAP_TIMER_CTRL_GPOCFG | OMAP_TIMER_CTRL_SCPWM |
664
656
OMAP_TIMER_CTRL_PT | (0x03 << 10 ) | OMAP_TIMER_CTRL_AR );
665
657
if (def_on )
@@ -683,7 +675,7 @@ static int omap_dm_timer_get_pwm_status(struct omap_dm_timer *timer)
683
675
return - EINVAL ;
684
676
685
677
omap_dm_timer_enable (timer );
686
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
678
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
687
679
omap_dm_timer_disable (timer );
688
680
689
681
return l ;
@@ -698,7 +690,7 @@ static int omap_dm_timer_set_prescaler(struct omap_dm_timer *timer,
698
690
return - EINVAL ;
699
691
700
692
omap_dm_timer_enable (timer );
701
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_CTRL_REG );
693
+ l = dmtimer_read (timer , OMAP_TIMER_CTRL_REG );
702
694
l &= ~(OMAP_TIMER_CTRL_PRE | (0x07 << 2 ));
703
695
if (prescaler >= 0 ) {
704
696
l |= OMAP_TIMER_CTRL_PRE ;
@@ -743,7 +735,7 @@ static int omap_dm_timer_set_int_disable(struct omap_dm_timer *timer, u32 mask)
743
735
l = readl_relaxed (timer -> irq_ena ) & ~mask ;
744
736
745
737
writel_relaxed (l , timer -> irq_dis );
746
- l = omap_dm_timer_read_reg (timer , OMAP_TIMER_WAKEUP_EN_REG ) & ~mask ;
738
+ l = dmtimer_read (timer , OMAP_TIMER_WAKEUP_EN_REG ) & ~mask ;
747
739
omap_dm_timer_write_reg (timer , OMAP_TIMER_WAKEUP_EN_REG , l );
748
740
749
741
omap_dm_timer_disable (timer );
@@ -781,7 +773,7 @@ static unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer)
781
773
return 0 ;
782
774
}
783
775
784
- return __omap_dm_timer_read_counter (timer , timer -> posted );
776
+ return __omap_dm_timer_read_counter (timer );
785
777
}
786
778
787
779
static int omap_dm_timer_write_counter (struct omap_dm_timer * timer , unsigned int value )
0 commit comments