Skip to content

Commit f038ddf

Browse files
yangbolu1991davem330
authored andcommitted
ptp_qoriq: add little enadian support
There is QorIQ 1588 timer IP block on the new ENETC Ethernet controller. However it uses little endian mode which is different with before. This patch is to add little endian support for the driver by using "little-endian" dts node property. Signed-off-by: Yangbo Lu <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent ff54571 commit f038ddf

File tree

3 files changed

+60
-42
lines changed

3 files changed

+60
-42
lines changed

drivers/ptp/ptp_qoriq.c

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ static u64 tmr_cnt_read(struct ptp_qoriq *ptp_qoriq)
4343
u64 ns;
4444
u32 lo, hi;
4545

46-
lo = qoriq_read(&regs->ctrl_regs->tmr_cnt_l);
47-
hi = qoriq_read(&regs->ctrl_regs->tmr_cnt_h);
46+
lo = ptp_qoriq->read(&regs->ctrl_regs->tmr_cnt_l);
47+
hi = ptp_qoriq->read(&regs->ctrl_regs->tmr_cnt_h);
4848
ns = ((u64) hi) << 32;
4949
ns |= lo;
5050
return ns;
@@ -57,8 +57,8 @@ static void tmr_cnt_write(struct ptp_qoriq *ptp_qoriq, u64 ns)
5757
u32 hi = ns >> 32;
5858
u32 lo = ns & 0xffffffff;
5959

60-
qoriq_write(&regs->ctrl_regs->tmr_cnt_l, lo);
61-
qoriq_write(&regs->ctrl_regs->tmr_cnt_h, hi);
60+
ptp_qoriq->write(&regs->ctrl_regs->tmr_cnt_l, lo);
61+
ptp_qoriq->write(&regs->ctrl_regs->tmr_cnt_h, hi);
6262
}
6363

6464
/* Caller must hold ptp_qoriq->lock. */
@@ -73,8 +73,8 @@ static void set_alarm(struct ptp_qoriq *ptp_qoriq)
7373
ns -= ptp_qoriq->tclk_period;
7474
hi = ns >> 32;
7575
lo = ns & 0xffffffff;
76-
qoriq_write(&regs->alarm_regs->tmr_alarm1_l, lo);
77-
qoriq_write(&regs->alarm_regs->tmr_alarm1_h, hi);
76+
ptp_qoriq->write(&regs->alarm_regs->tmr_alarm1_l, lo);
77+
ptp_qoriq->write(&regs->alarm_regs->tmr_alarm1_h, hi);
7878
}
7979

8080
/* Caller must hold ptp_qoriq->lock. */
@@ -83,8 +83,8 @@ static void set_fipers(struct ptp_qoriq *ptp_qoriq)
8383
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
8484

8585
set_alarm(ptp_qoriq);
86-
qoriq_write(&regs->fiper_regs->tmr_fiper1, ptp_qoriq->tmr_fiper1);
87-
qoriq_write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
86+
ptp_qoriq->write(&regs->fiper_regs->tmr_fiper1, ptp_qoriq->tmr_fiper1);
87+
ptp_qoriq->write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
8888
}
8989

9090
static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
@@ -115,16 +115,16 @@ static int extts_clean_up(struct ptp_qoriq *ptp_qoriq, int index,
115115
event.index = index;
116116

117117
do {
118-
lo = qoriq_read(reg_etts_l);
119-
hi = qoriq_read(reg_etts_h);
118+
lo = ptp_qoriq->read(reg_etts_l);
119+
hi = ptp_qoriq->read(reg_etts_h);
120120

121121
if (update_event) {
122122
event.timestamp = ((u64) hi) << 32;
123123
event.timestamp |= lo;
124124
ptp_clock_event(ptp_qoriq->clock, &event);
125125
}
126126

127-
stat = qoriq_read(&regs->ctrl_regs->tmr_stat);
127+
stat = ptp_qoriq->read(&regs->ctrl_regs->tmr_stat);
128128
} while (ptp_qoriq->extts_fifo_support && (stat & valid));
129129

130130
return 0;
@@ -144,8 +144,8 @@ irqreturn_t ptp_qoriq_isr(int irq, void *priv)
144144

145145
spin_lock(&ptp_qoriq->lock);
146146

147-
val = qoriq_read(&regs->ctrl_regs->tmr_tevent);
148-
mask = qoriq_read(&regs->ctrl_regs->tmr_temask);
147+
val = ptp_qoriq->read(&regs->ctrl_regs->tmr_tevent);
148+
mask = ptp_qoriq->read(&regs->ctrl_regs->tmr_temask);
149149

150150
spin_unlock(&ptp_qoriq->lock);
151151

@@ -173,14 +173,14 @@ irqreturn_t ptp_qoriq_isr(int irq, void *priv)
173173
ns = ptp_qoriq->alarm_value + ptp_qoriq->alarm_interval;
174174
hi = ns >> 32;
175175
lo = ns & 0xffffffff;
176-
qoriq_write(&regs->alarm_regs->tmr_alarm2_l, lo);
177-
qoriq_write(&regs->alarm_regs->tmr_alarm2_h, hi);
176+
ptp_qoriq->write(&regs->alarm_regs->tmr_alarm2_l, lo);
177+
ptp_qoriq->write(&regs->alarm_regs->tmr_alarm2_h, hi);
178178
ptp_qoriq->alarm_value = ns;
179179
} else {
180180
spin_lock(&ptp_qoriq->lock);
181-
mask = qoriq_read(&regs->ctrl_regs->tmr_temask);
181+
mask = ptp_qoriq->read(&regs->ctrl_regs->tmr_temask);
182182
mask &= ~ALM2EN;
183-
qoriq_write(&regs->ctrl_regs->tmr_temask, mask);
183+
ptp_qoriq->write(&regs->ctrl_regs->tmr_temask, mask);
184184
spin_unlock(&ptp_qoriq->lock);
185185
ptp_qoriq->alarm_value = 0;
186186
ptp_qoriq->alarm_interval = 0;
@@ -194,7 +194,7 @@ irqreturn_t ptp_qoriq_isr(int irq, void *priv)
194194
}
195195

196196
if (ack) {
197-
qoriq_write(&regs->ctrl_regs->tmr_tevent, ack);
197+
ptp_qoriq->write(&regs->ctrl_regs->tmr_tevent, ack);
198198
return IRQ_HANDLED;
199199
} else
200200
return IRQ_NONE;
@@ -229,7 +229,7 @@ int ptp_qoriq_adjfine(struct ptp_clock_info *ptp, long scaled_ppm)
229229

230230
tmr_add = neg_adj ? tmr_add - diff : tmr_add + diff;
231231

232-
qoriq_write(&regs->ctrl_regs->tmr_add, tmr_add);
232+
ptp_qoriq->write(&regs->ctrl_regs->tmr_add, tmr_add);
233233

234234
return 0;
235235
}
@@ -326,15 +326,15 @@ int ptp_qoriq_enable(struct ptp_clock_info *ptp,
326326

327327
spin_lock_irqsave(&ptp_qoriq->lock, flags);
328328

329-
mask = qoriq_read(&regs->ctrl_regs->tmr_temask);
329+
mask = ptp_qoriq->read(&regs->ctrl_regs->tmr_temask);
330330
if (on) {
331331
mask |= bit;
332-
qoriq_write(&regs->ctrl_regs->tmr_tevent, bit);
332+
ptp_qoriq->write(&regs->ctrl_regs->tmr_tevent, bit);
333333
} else {
334334
mask &= ~bit;
335335
}
336336

337-
qoriq_write(&regs->ctrl_regs->tmr_temask, mask);
337+
ptp_qoriq->write(&regs->ctrl_regs->tmr_temask, mask);
338338

339339
spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
340340
return 0;
@@ -496,6 +496,14 @@ int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
496496
return -ENODEV;
497497
}
498498

499+
if (of_property_read_bool(node, "little-endian")) {
500+
ptp_qoriq->read = qoriq_read_le;
501+
ptp_qoriq->write = qoriq_write_le;
502+
} else {
503+
ptp_qoriq->read = qoriq_read_be;
504+
ptp_qoriq->write = qoriq_write_be;
505+
}
506+
499507
if (of_device_is_compatible(node, "fsl,fman-ptp-timer")) {
500508
ptp_qoriq->regs.ctrl_regs = base + FMAN_CTRL_REGS_OFFSET;
501509
ptp_qoriq->regs.alarm_regs = base + FMAN_ALARM_REGS_OFFSET;
@@ -519,13 +527,14 @@ int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
519527
spin_lock_irqsave(&ptp_qoriq->lock, flags);
520528

521529
regs = &ptp_qoriq->regs;
522-
qoriq_write(&regs->ctrl_regs->tmr_ctrl, tmr_ctrl);
523-
qoriq_write(&regs->ctrl_regs->tmr_add, ptp_qoriq->tmr_add);
524-
qoriq_write(&regs->ctrl_regs->tmr_prsc, ptp_qoriq->tmr_prsc);
525-
qoriq_write(&regs->fiper_regs->tmr_fiper1, ptp_qoriq->tmr_fiper1);
526-
qoriq_write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
530+
ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, tmr_ctrl);
531+
ptp_qoriq->write(&regs->ctrl_regs->tmr_add, ptp_qoriq->tmr_add);
532+
ptp_qoriq->write(&regs->ctrl_regs->tmr_prsc, ptp_qoriq->tmr_prsc);
533+
ptp_qoriq->write(&regs->fiper_regs->tmr_fiper1, ptp_qoriq->tmr_fiper1);
534+
ptp_qoriq->write(&regs->fiper_regs->tmr_fiper2, ptp_qoriq->tmr_fiper2);
527535
set_alarm(ptp_qoriq);
528-
qoriq_write(&regs->ctrl_regs->tmr_ctrl, tmr_ctrl|FIPERST|RTPE|TE|FRD);
536+
ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl,
537+
tmr_ctrl|FIPERST|RTPE|TE|FRD);
529538

530539
spin_unlock_irqrestore(&ptp_qoriq->lock, flags);
531540

@@ -543,8 +552,8 @@ void ptp_qoriq_free(struct ptp_qoriq *ptp_qoriq)
543552
{
544553
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
545554

546-
qoriq_write(&regs->ctrl_regs->tmr_temask, 0);
547-
qoriq_write(&regs->ctrl_regs->tmr_ctrl, 0);
555+
ptp_qoriq->write(&regs->ctrl_regs->tmr_temask, 0);
556+
ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, 0);
548557

549558
ptp_qoriq_remove_debugfs(ptp_qoriq);
550559
ptp_clock_unregister(ptp_qoriq->clock);

drivers/ptp/ptp_qoriq_debugfs.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ static int ptp_qoriq_fiper1_lpbk_get(void *data, u64 *val)
1111
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
1212
u32 ctrl;
1313

14-
ctrl = qoriq_read(&regs->ctrl_regs->tmr_ctrl);
14+
ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
1515
*val = ctrl & PP1L ? 1 : 0;
1616

1717
return 0;
@@ -23,13 +23,13 @@ static int ptp_qoriq_fiper1_lpbk_set(void *data, u64 val)
2323
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
2424
u32 ctrl;
2525

26-
ctrl = qoriq_read(&regs->ctrl_regs->tmr_ctrl);
26+
ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
2727
if (val == 0)
2828
ctrl &= ~PP1L;
2929
else
3030
ctrl |= PP1L;
3131

32-
qoriq_write(&regs->ctrl_regs->tmr_ctrl, ctrl);
32+
ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, ctrl);
3333
return 0;
3434
}
3535

@@ -42,7 +42,7 @@ static int ptp_qoriq_fiper2_lpbk_get(void *data, u64 *val)
4242
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
4343
u32 ctrl;
4444

45-
ctrl = qoriq_read(&regs->ctrl_regs->tmr_ctrl);
45+
ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
4646
*val = ctrl & PP2L ? 1 : 0;
4747

4848
return 0;
@@ -54,13 +54,13 @@ static int ptp_qoriq_fiper2_lpbk_set(void *data, u64 val)
5454
struct ptp_qoriq_registers *regs = &ptp_qoriq->regs;
5555
u32 ctrl;
5656

57-
ctrl = qoriq_read(&regs->ctrl_regs->tmr_ctrl);
57+
ctrl = ptp_qoriq->read(&regs->ctrl_regs->tmr_ctrl);
5858
if (val == 0)
5959
ctrl &= ~PP2L;
6060
else
6161
ctrl |= PP2L;
6262

63-
qoriq_write(&regs->ctrl_regs->tmr_ctrl, ctrl);
63+
ptp_qoriq->write(&regs->ctrl_regs->tmr_ctrl, ctrl);
6464
return 0;
6565
}
6666

include/linux/fsl/ptp_qoriq.h

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -157,21 +157,30 @@ struct ptp_qoriq {
157157
u32 cksel;
158158
u32 tmr_fiper1;
159159
u32 tmr_fiper2;
160+
u32 (*read)(unsigned __iomem *addr);
161+
void (*write)(unsigned __iomem *addr, u32 val);
160162
};
161163

162-
static inline u32 qoriq_read(unsigned __iomem *addr)
164+
static inline u32 qoriq_read_be(unsigned __iomem *addr)
163165
{
164-
u32 val;
165-
166-
val = ioread32be(addr);
167-
return val;
166+
return ioread32be(addr);
168167
}
169168

170-
static inline void qoriq_write(unsigned __iomem *addr, u32 val)
169+
static inline void qoriq_write_be(unsigned __iomem *addr, u32 val)
171170
{
172171
iowrite32be(val, addr);
173172
}
174173

174+
static inline u32 qoriq_read_le(unsigned __iomem *addr)
175+
{
176+
return ioread32(addr);
177+
}
178+
179+
static inline void qoriq_write_le(unsigned __iomem *addr, u32 val)
180+
{
181+
iowrite32(val, addr);
182+
}
183+
175184
irqreturn_t ptp_qoriq_isr(int irq, void *priv);
176185
int ptp_qoriq_init(struct ptp_qoriq *ptp_qoriq, void __iomem *base,
177186
const struct ptp_clock_info caps);

0 commit comments

Comments
 (0)