Skip to content

Commit ccbc535

Browse files
Pavel Machekmarckleinebudde
authored andcommitted
can: c_can: Add and make use of 32-bit accesses functions
Add helpers for 32-bit accesses and replace open-coded 32-bit access with calls to helpers. Minimum changes are done to the pci case, as I don't have access to that hardware. Tested-by: Thor Thayer <tthayer@altera.com> Signed-off-by: Thor Thayer <tthayer@altera.com> Signed-off-by: Pavel Machek <pavel@denx.de> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
1 parent e07e83a commit ccbc535

File tree

4 files changed

+60
-10
lines changed

4 files changed

+60
-10
lines changed

drivers/net/can/c_can/c_can.c

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -252,8 +252,7 @@ static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj
252252
struct c_can_priv *priv = netdev_priv(dev);
253253
int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
254254

255-
priv->write_reg(priv, reg + 1, cmd);
256-
priv->write_reg(priv, reg, obj);
255+
priv->write_reg32(priv, reg, (cmd << 16) | obj);
257256

258257
for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
259258
if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY))
@@ -328,8 +327,7 @@ static void c_can_setup_tx_object(struct net_device *dev, int iface,
328327
change_bit(idx, &priv->tx_dir);
329328
}
330329

331-
priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
332-
priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), arb >> 16);
330+
priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
333331

334332
priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
335333

@@ -391,8 +389,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl)
391389

392390
frame->can_dlc = get_can_dlc(ctrl & 0x0F);
393391

394-
arb = priv->read_reg(priv, C_CAN_IFACE(ARB1_REG, iface));
395-
arb |= priv->read_reg(priv, C_CAN_IFACE(ARB2_REG, iface)) << 16;
392+
arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
396393

397394
if (arb & IF_ARB_MSGXTD)
398395
frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG;
@@ -424,12 +421,10 @@ static void c_can_setup_receive_object(struct net_device *dev, int iface,
424421
struct c_can_priv *priv = netdev_priv(dev);
425422

426423
mask |= BIT(29);
427-
priv->write_reg(priv, C_CAN_IFACE(MASK1_REG, iface), mask);
428-
priv->write_reg(priv, C_CAN_IFACE(MASK2_REG, iface), mask >> 16);
424+
priv->write_reg32(priv, C_CAN_IFACE(MASK1_REG, iface), mask);
429425

430426
id |= IF_ARB_MSGVAL;
431-
priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), id);
432-
priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), id >> 16);
427+
priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), id);
433428

434429
priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont);
435430
c_can_object_put(dev, iface, obj, IF_COMM_RCV_SETUP);

drivers/net/can/c_can/c_can.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,8 @@ struct c_can_priv {
178178
int last_status;
179179
u16 (*read_reg) (const struct c_can_priv *priv, enum reg index);
180180
void (*write_reg) (const struct c_can_priv *priv, enum reg index, u16 val);
181+
u32 (*read_reg32) (const struct c_can_priv *priv, enum reg index);
182+
void (*write_reg32) (const struct c_can_priv *priv, enum reg index, u32 val);
181183
void __iomem *base;
182184
const u16 *regs;
183185
void *priv; /* for board-specific data */

drivers/net/can/c_can/c_can_pci.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,23 @@ static void c_can_pci_write_reg_32bit(const struct c_can_priv *priv,
8383
iowrite32((u32)val, priv->base + 2 * priv->regs[index]);
8484
}
8585

86+
static u32 c_can_pci_read_reg32(const struct c_can_priv *priv, enum reg index)
87+
{
88+
u32 val;
89+
90+
val = priv->read_reg(priv, index);
91+
val |= ((u32) priv->read_reg(priv, index + 1)) << 16;
92+
93+
return val;
94+
}
95+
96+
static void c_can_pci_write_reg32(const struct c_can_priv *priv, enum reg index,
97+
u32 val)
98+
{
99+
priv->write_reg(priv, index + 1, val >> 16);
100+
priv->write_reg(priv, index, val);
101+
}
102+
86103
static void c_can_pci_reset_pch(const struct c_can_priv *priv, bool enable)
87104
{
88105
if (enable) {
@@ -187,6 +204,8 @@ static int c_can_pci_probe(struct pci_dev *pdev,
187204
ret = -EINVAL;
188205
goto out_free_c_can;
189206
}
207+
priv->read_reg32 = c_can_pci_read_reg32;
208+
priv->write_reg32 = c_can_pci_write_reg32;
190209

191210
priv->raminit = c_can_pci_data->init;
192211

drivers/net/can/c_can/c_can_platform.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,34 @@ static void c_can_hw_raminit(const struct c_can_priv *priv, bool enable)
108108
spin_unlock(&raminit_lock);
109109
}
110110

111+
static u32 c_can_plat_read_reg32(const struct c_can_priv *priv, enum reg index)
112+
{
113+
u32 val;
114+
115+
val = priv->read_reg(priv, index);
116+
val |= ((u32) priv->read_reg(priv, index + 1)) << 16;
117+
118+
return val;
119+
}
120+
121+
static void c_can_plat_write_reg32(const struct c_can_priv *priv, enum reg index,
122+
u32 val)
123+
{
124+
priv->write_reg(priv, index + 1, val >> 16);
125+
priv->write_reg(priv, index, val);
126+
}
127+
128+
static u32 d_can_plat_read_reg32(const struct c_can_priv *priv, enum reg index)
129+
{
130+
return readl(priv->base + priv->regs[index]);
131+
}
132+
133+
static void d_can_plat_write_reg32(const struct c_can_priv *priv, enum reg index,
134+
u32 val)
135+
{
136+
writel(val, priv->base + priv->regs[index]);
137+
}
138+
111139
static struct platform_device_id c_can_id_table[] = {
112140
[BOSCH_C_CAN_PLATFORM] = {
113141
.name = KBUILD_MODNAME,
@@ -201,11 +229,15 @@ static int c_can_plat_probe(struct platform_device *pdev)
201229
case IORESOURCE_MEM_32BIT:
202230
priv->read_reg = c_can_plat_read_reg_aligned_to_32bit;
203231
priv->write_reg = c_can_plat_write_reg_aligned_to_32bit;
232+
priv->read_reg32 = c_can_plat_read_reg32;
233+
priv->write_reg32 = c_can_plat_write_reg32;
204234
break;
205235
case IORESOURCE_MEM_16BIT:
206236
default:
207237
priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
208238
priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
239+
priv->read_reg32 = c_can_plat_read_reg32;
240+
priv->write_reg32 = c_can_plat_write_reg32;
209241
break;
210242
}
211243
break;
@@ -214,6 +246,8 @@ static int c_can_plat_probe(struct platform_device *pdev)
214246
priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
215247
priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
216248
priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
249+
priv->read_reg32 = d_can_plat_read_reg32;
250+
priv->write_reg32 = d_can_plat_write_reg32;
217251

218252
if (pdev->dev.of_node)
219253
priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can");

0 commit comments

Comments
 (0)