Skip to content

Commit 12f0841

Browse files
committed
Merge branch 'renesas-bit-twiddling'
Sergei Shtylyov says: ==================== Factor out register bit twiddling in the Renesas Ethernet drivers Here's a set of 2 patches against DaveM's 'net-next.git' repo. We factor out the often repeated pattern of reading a register, AND'ing and/or OR'ing some bits, and then writing the value back. [1/2] ravb: factor out register bit twiddling code [2/2] sh_eth: factor out register bit twiddling code ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents ef5c0e2 + b2b14d2 commit 12f0841

File tree

4 files changed

+60
-90
lines changed

4 files changed

+60
-90
lines changed

drivers/net/ethernet/renesas/ravb.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
*
33
* Copyright (C) 2014-2015 Renesas Electronics Corporation
44
* Copyright (C) 2015 Renesas Solutions Corp.
5-
* Copyright (C) 2015 Cogent Embedded, Inc. <[email protected]>
5+
* Copyright (C) 2015-2016 Cogent Embedded, Inc. <[email protected]>
66
*
77
* Based on the SuperH Ethernet driver
88
*
@@ -837,6 +837,8 @@ static inline void ravb_write(struct net_device *ndev, u32 data,
837837
iowrite32(data, priv->addr + reg);
838838
}
839839

840+
void ravb_modify(struct net_device *ndev, enum ravb_reg reg, u32 clear,
841+
u32 set);
840842
int ravb_wait(struct net_device *ndev, enum ravb_reg reg, u32 mask, u32 value);
841843

842844
irqreturn_t ravb_ptp_interrupt(struct net_device *ndev);

drivers/net/ethernet/renesas/ravb_main.c

Lines changed: 27 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
*
33
* Copyright (C) 2014-2015 Renesas Electronics Corporation
44
* Copyright (C) 2015 Renesas Solutions Corp.
5-
* Copyright (C) 2015 Cogent Embedded, Inc. <[email protected]>
5+
* Copyright (C) 2015-2016 Cogent Embedded, Inc. <[email protected]>
66
*
77
* Based on the SuperH Ethernet driver
88
*
@@ -42,6 +42,12 @@
4242
NETIF_MSG_RX_ERR | \
4343
NETIF_MSG_TX_ERR)
4444

45+
void ravb_modify(struct net_device *ndev, enum ravb_reg reg, u32 clear,
46+
u32 set)
47+
{
48+
ravb_write(ndev, (ravb_read(ndev, reg) & ~clear) | set, reg);
49+
}
50+
4551
int ravb_wait(struct net_device *ndev, enum ravb_reg reg, u32 mask, u32 value)
4652
{
4753
int i;
@@ -59,8 +65,7 @@ static int ravb_config(struct net_device *ndev)
5965
int error;
6066

6167
/* Set config mode */
62-
ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) | CCC_OPC_CONFIG,
63-
CCC);
68+
ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
6469
/* Check if the operating mode is changed to the config mode */
6570
error = ravb_wait(ndev, CSR, CSR_OPS, CSR_OPS_CONFIG);
6671
if (error)
@@ -72,13 +77,8 @@ static int ravb_config(struct net_device *ndev)
7277
static void ravb_set_duplex(struct net_device *ndev)
7378
{
7479
struct ravb_private *priv = netdev_priv(ndev);
75-
u32 ecmr = ravb_read(ndev, ECMR);
7680

77-
if (priv->duplex) /* Full */
78-
ecmr |= ECMR_DM;
79-
else /* Half */
80-
ecmr &= ~ECMR_DM;
81-
ravb_write(ndev, ecmr, ECMR);
81+
ravb_modify(ndev, ECMR, ECMR_DM, priv->duplex ? ECMR_DM : 0);
8282
}
8383

8484
static void ravb_set_rate(struct net_device *ndev)
@@ -131,13 +131,8 @@ static void ravb_mdio_ctrl(struct mdiobb_ctrl *ctrl, u32 mask, int set)
131131
{
132132
struct ravb_private *priv = container_of(ctrl, struct ravb_private,
133133
mdiobb);
134-
u32 pir = ravb_read(priv->ndev, PIR);
135134

136-
if (set)
137-
pir |= mask;
138-
else
139-
pir &= ~mask;
140-
ravb_write(priv->ndev, pir, PIR);
135+
ravb_modify(priv->ndev, PIR, mask, set ? mask : 0);
141136
}
142137

143138
/* MDC pin control */
@@ -393,9 +388,9 @@ static int ravb_dmac_init(struct net_device *ndev)
393388
ravb_ring_format(ndev, RAVB_NC);
394389

395390
#if defined(__LITTLE_ENDIAN)
396-
ravb_write(ndev, ravb_read(ndev, CCC) & ~CCC_BOC, CCC);
391+
ravb_modify(ndev, CCC, CCC_BOC, 0);
397392
#else
398-
ravb_write(ndev, ravb_read(ndev, CCC) | CCC_BOC, CCC);
393+
ravb_modify(ndev, CCC, CCC_BOC, CCC_BOC);
399394
#endif
400395

401396
/* Set AVB RX */
@@ -418,8 +413,7 @@ static int ravb_dmac_init(struct net_device *ndev)
418413
ravb_write(ndev, TIC_FTE0 | TIC_FTE1 | TIC_TFUE, TIC);
419414

420415
/* Setting the control will start the AVB-DMAC process. */
421-
ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) | CCC_OPC_OPERATION,
422-
CCC);
416+
ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_OPERATION);
423417

424418
return 0;
425419
}
@@ -493,7 +487,7 @@ static void ravb_get_tx_tstamp(struct net_device *ndev)
493487
break;
494488
}
495489
}
496-
ravb_write(ndev, ravb_read(ndev, TCCR) | TCCR_TFR, TCCR);
490+
ravb_modify(ndev, TCCR, TCCR_TFR, TCCR_TFR);
497491
}
498492
}
499493

@@ -613,13 +607,13 @@ static bool ravb_rx(struct net_device *ndev, int *quota, int q)
613607
static void ravb_rcv_snd_disable(struct net_device *ndev)
614608
{
615609
/* Disable TX and RX */
616-
ravb_write(ndev, ravb_read(ndev, ECMR) & ~(ECMR_RE | ECMR_TE), ECMR);
610+
ravb_modify(ndev, ECMR, ECMR_RE | ECMR_TE, 0);
617611
}
618612

619613
static void ravb_rcv_snd_enable(struct net_device *ndev)
620614
{
621615
/* Enable TX and RX */
622-
ravb_write(ndev, ravb_read(ndev, ECMR) | ECMR_RE | ECMR_TE, ECMR);
616+
ravb_modify(ndev, ECMR, ECMR_RE | ECMR_TE, ECMR_RE | ECMR_TE);
623617
}
624618

625619
/* function for waiting dma process finished */
@@ -812,8 +806,8 @@ static int ravb_poll(struct napi_struct *napi, int budget)
812806

813807
/* Re-enable RX/TX interrupts */
814808
spin_lock_irqsave(&priv->lock, flags);
815-
ravb_write(ndev, ravb_read(ndev, RIC0) | mask, RIC0);
816-
ravb_write(ndev, ravb_read(ndev, TIC) | mask, TIC);
809+
ravb_modify(ndev, RIC0, mask, mask);
810+
ravb_modify(ndev, TIC, mask, mask);
817811
mmiowb();
818812
spin_unlock_irqrestore(&priv->lock, flags);
819813

@@ -852,8 +846,7 @@ static void ravb_adjust_link(struct net_device *ndev)
852846
ravb_set_rate(ndev);
853847
}
854848
if (!priv->link) {
855-
ravb_write(ndev, ravb_read(ndev, ECMR) & ~ECMR_TXF,
856-
ECMR);
849+
ravb_modify(ndev, ECMR, ECMR_TXF, 0);
857850
new_state = true;
858851
priv->link = phydev->link;
859852
if (priv->no_avb_link)
@@ -1393,7 +1386,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev)
13931386
desc--;
13941387
desc->die_dt = DT_FSTART;
13951388

1396-
ravb_write(ndev, ravb_read(ndev, TCCR) | (TCCR_TSRQ0 << q), TCCR);
1389+
ravb_modify(ndev, TCCR, TCCR_TSRQ0 << q, TCCR_TSRQ0 << q);
13971390

13981391
priv->cur_tx[q] += NUM_TX_DESC;
13991392
if (priv->cur_tx[q] - priv->dirty_tx[q] >
@@ -1468,15 +1461,10 @@ static void ravb_set_rx_mode(struct net_device *ndev)
14681461
{
14691462
struct ravb_private *priv = netdev_priv(ndev);
14701463
unsigned long flags;
1471-
u32 ecmr;
14721464

14731465
spin_lock_irqsave(&priv->lock, flags);
1474-
ecmr = ravb_read(ndev, ECMR);
1475-
if (ndev->flags & IFF_PROMISC)
1476-
ecmr |= ECMR_PRM;
1477-
else
1478-
ecmr &= ~ECMR_PRM;
1479-
ravb_write(ndev, ecmr, ECMR);
1466+
ravb_modify(ndev, ECMR, ECMR_PRM,
1467+
ndev->flags & IFF_PROMISC ? ECMR_PRM : 0);
14801468
mmiowb();
14811469
spin_unlock_irqrestore(&priv->lock, flags);
14821470
}
@@ -1804,14 +1792,12 @@ static int ravb_probe(struct platform_device *pdev)
18041792

18051793
/* Set AVB config mode */
18061794
if (chip_id == RCAR_GEN2) {
1807-
ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) |
1808-
CCC_OPC_CONFIG, CCC);
1795+
ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG);
18091796
/* Set CSEL value */
1810-
ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_CSEL) |
1811-
CCC_CSEL_HPB, CCC);
1797+
ravb_modify(ndev, CCC, CCC_CSEL, CCC_CSEL_HPB);
18121798
} else {
1813-
ravb_write(ndev, (ravb_read(ndev, CCC) & ~CCC_OPC) |
1814-
CCC_OPC_CONFIG | CCC_GAC | CCC_CSEL_HPB, CCC);
1799+
ravb_modify(ndev, CCC, CCC_OPC, CCC_OPC_CONFIG |
1800+
CCC_GAC | CCC_CSEL_HPB);
18151801
}
18161802

18171803
/* Set CSEL value */
@@ -1824,7 +1810,7 @@ static int ravb_probe(struct platform_device *pdev)
18241810
goto out_release;
18251811

18261812
/* Request GTI loading */
1827-
ravb_write(ndev, ravb_read(ndev, GCCR) | GCCR_LTI, GCCR);
1813+
ravb_modify(ndev, GCCR, GCCR_LTI, GCCR_LTI);
18281814

18291815
/* Allocate descriptor base address table */
18301816
priv->desc_bat_size = sizeof(struct ravb_desc) * DBAT_ENTRY_NUM;

drivers/net/ethernet/renesas/ravb_ptp.c

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
*
33
* Copyright (C) 2013-2015 Renesas Electronics Corporation
44
* Copyright (C) 2015 Renesas Solutions Corp.
5-
* Copyright (C) 2015 Cogent Embedded, Inc. <[email protected]>
5+
* Copyright (C) 2015-2016 Cogent Embedded, Inc. <[email protected]>
66
*
77
* This program is free software; you can redistribute it and/or modify
88
* it under the terms of the GNU General Public License as published by
@@ -21,7 +21,7 @@ static int ravb_ptp_tcr_request(struct ravb_private *priv, u32 request)
2121
if (error)
2222
return error;
2323

24-
ravb_write(ndev, ravb_read(ndev, GCCR) | request, GCCR);
24+
ravb_modify(ndev, GCCR, request, request);
2525
return ravb_wait(ndev, GCCR, GCCR_TCR, GCCR_TCR_NOREQ);
2626
}
2727

@@ -185,7 +185,6 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp,
185185
ptp.info);
186186
struct net_device *ndev = priv->ndev;
187187
unsigned long flags;
188-
u32 gic;
189188

190189
if (req->index)
191190
return -EINVAL;
@@ -195,12 +194,7 @@ static int ravb_ptp_extts(struct ptp_clock_info *ptp,
195194
priv->ptp.extts[req->index] = on;
196195

197196
spin_lock_irqsave(&priv->lock, flags);
198-
gic = ravb_read(ndev, GIC);
199-
if (on)
200-
gic |= GIC_PTCE;
201-
else
202-
gic &= ~GIC_PTCE;
203-
ravb_write(ndev, gic, GIC);
197+
ravb_modify(ndev, GIC, GIC_PTCE, on ? GIC_PTCE : 0);
204198
mmiowb();
205199
spin_unlock_irqrestore(&priv->lock, flags);
206200

@@ -216,7 +210,6 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
216210
struct ravb_ptp_perout *perout;
217211
unsigned long flags;
218212
int error = 0;
219-
u32 gic;
220213

221214
if (req->index)
222215
return -EINVAL;
@@ -248,9 +241,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
248241
error = ravb_ptp_update_compare(priv, (u32)start_ns);
249242
if (!error) {
250243
/* Unmask interrupt */
251-
gic = ravb_read(ndev, GIC);
252-
gic |= GIC_PTME;
253-
ravb_write(ndev, gic, GIC);
244+
ravb_modify(ndev, GIC, GIC_PTME, GIC_PTME);
254245
}
255246
} else {
256247
spin_lock_irqsave(&priv->lock, flags);
@@ -259,9 +250,7 @@ static int ravb_ptp_perout(struct ptp_clock_info *ptp,
259250
perout->period = 0;
260251

261252
/* Mask interrupt */
262-
gic = ravb_read(ndev, GIC);
263-
gic &= ~GIC_PTME;
264-
ravb_write(ndev, gic, GIC);
253+
ravb_modify(ndev, GIC, GIC_PTME, 0);
265254
}
266255
mmiowb();
267256
spin_unlock_irqrestore(&priv->lock, flags);
@@ -331,7 +320,6 @@ void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev)
331320
{
332321
struct ravb_private *priv = netdev_priv(ndev);
333322
unsigned long flags;
334-
u32 gccr;
335323

336324
priv->ptp.info = ravb_ptp_info;
337325

@@ -340,8 +328,7 @@ void ravb_ptp_init(struct net_device *ndev, struct platform_device *pdev)
340328

341329
spin_lock_irqsave(&priv->lock, flags);
342330
ravb_wait(ndev, GCCR, GCCR_TCR, GCCR_TCR_NOREQ);
343-
gccr = ravb_read(ndev, GCCR) & ~GCCR_TCSS;
344-
ravb_write(ndev, gccr | GCCR_TCSS_ADJGPTP, GCCR);
331+
ravb_modify(ndev, GCCR, GCCR_TCSS, GCCR_TCSS_ADJGPTP);
345332
mmiowb();
346333
spin_unlock_irqrestore(&priv->lock, flags);
347334

0 commit comments

Comments
 (0)