aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can
diff options
context:
space:
mode:
authorPavel Machek <pavel@denx.de>2014-05-06 09:57:02 -0400
committerMarc Kleine-Budde <mkl@pengutronix.de>2014-05-19 03:38:22 -0400
commitccbc5357db3098c57176945f677b0af37f5e87e6 (patch)
tree9200ce6c25f8bb2ec94c42fe8d0b2260105f9913 /drivers/net/can
parente07e83ae600ea51b857e02132220eb7b7e52e928 (diff)
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>
Diffstat (limited to 'drivers/net/can')
-rw-r--r--drivers/net/can/c_can/c_can.c15
-rw-r--r--drivers/net/can/c_can/c_can.h2
-rw-r--r--drivers/net/can/c_can/c_can_pci.c19
-rw-r--r--drivers/net/can/c_can/c_can_platform.c34
4 files changed, 60 insertions, 10 deletions
diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
index a2ca820b5373..e154b4cb0f1a 100644
--- a/drivers/net/can/c_can/c_can.c
+++ b/drivers/net/can/c_can/c_can.c
@@ -252,8 +252,7 @@ static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj
252 struct c_can_priv *priv = netdev_priv(dev); 252 struct c_can_priv *priv = netdev_priv(dev);
253 int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface); 253 int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
254 254
255 priv->write_reg(priv, reg + 1, cmd); 255 priv->write_reg32(priv, reg, (cmd << 16) | obj);
256 priv->write_reg(priv, reg, obj);
257 256
258 for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) { 257 for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
259 if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY)) 258 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,
328 change_bit(idx, &priv->tx_dir); 327 change_bit(idx, &priv->tx_dir);
329 } 328 }
330 329
331 priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), arb); 330 priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
332 priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), arb >> 16);
333 331
334 priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); 332 priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
335 333
@@ -391,8 +389,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl)
391 389
392 frame->can_dlc = get_can_dlc(ctrl & 0x0F); 390 frame->can_dlc = get_can_dlc(ctrl & 0x0F);
393 391
394 arb = priv->read_reg(priv, C_CAN_IFACE(ARB1_REG, iface)); 392 arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
395 arb |= priv->read_reg(priv, C_CAN_IFACE(ARB2_REG, iface)) << 16;
396 393
397 if (arb & IF_ARB_MSGXTD) 394 if (arb & IF_ARB_MSGXTD)
398 frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG; 395 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,
424 struct c_can_priv *priv = netdev_priv(dev); 421 struct c_can_priv *priv = netdev_priv(dev);
425 422
426 mask |= BIT(29); 423 mask |= BIT(29);
427 priv->write_reg(priv, C_CAN_IFACE(MASK1_REG, iface), mask); 424 priv->write_reg32(priv, C_CAN_IFACE(MASK1_REG, iface), mask);
428 priv->write_reg(priv, C_CAN_IFACE(MASK2_REG, iface), mask >> 16);
429 425
430 id |= IF_ARB_MSGVAL; 426 id |= IF_ARB_MSGVAL;
431 priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), id); 427 priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), id);
432 priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), id >> 16);
433 428
434 priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont); 429 priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont);
435 c_can_object_put(dev, iface, obj, IF_COMM_RCV_SETUP); 430 c_can_object_put(dev, iface, obj, IF_COMM_RCV_SETUP);
diff --git a/drivers/net/can/c_can/c_can.h b/drivers/net/can/c_can/c_can.h
index b948b552a210..44433e1ebe00 100644
--- a/drivers/net/can/c_can/c_can.h
+++ b/drivers/net/can/c_can/c_can.h
@@ -178,6 +178,8 @@ struct c_can_priv {
178 int last_status; 178 int last_status;
179 u16 (*read_reg) (const struct c_can_priv *priv, enum reg index); 179 u16 (*read_reg) (const struct c_can_priv *priv, enum reg index);
180 void (*write_reg) (const struct c_can_priv *priv, enum reg index, u16 val); 180 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);
181 void __iomem *base; 183 void __iomem *base;
182 const u16 *regs; 184 const u16 *regs;
183 void *priv; /* for board-specific data */ 185 void *priv; /* for board-specific data */
diff --git a/drivers/net/can/c_can/c_can_pci.c b/drivers/net/can/c_can/c_can_pci.c
index b901a798f7e2..5d11e0e4225b 100644
--- a/drivers/net/can/c_can/c_can_pci.c
+++ b/drivers/net/can/c_can/c_can_pci.c
@@ -83,6 +83,23 @@ static void c_can_pci_write_reg_32bit(const struct c_can_priv *priv,
83 iowrite32((u32)val, priv->base + 2 * priv->regs[index]); 83 iowrite32((u32)val, priv->base + 2 * priv->regs[index]);
84} 84}
85 85
86static 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
96static 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
86static void c_can_pci_reset_pch(const struct c_can_priv *priv, bool enable) 103static void c_can_pci_reset_pch(const struct c_can_priv *priv, bool enable)
87{ 104{
88 if (enable) { 105 if (enable) {
@@ -187,6 +204,8 @@ static int c_can_pci_probe(struct pci_dev *pdev,
187 ret = -EINVAL; 204 ret = -EINVAL;
188 goto out_free_c_can; 205 goto out_free_c_can;
189 } 206 }
207 priv->read_reg32 = c_can_pci_read_reg32;
208 priv->write_reg32 = c_can_pci_write_reg32;
190 209
191 priv->raminit = c_can_pci_data->init; 210 priv->raminit = c_can_pci_data->init;
192 211
diff --git a/drivers/net/can/c_can/c_can_platform.c b/drivers/net/can/c_can/c_can_platform.c
index 0b44f4d79451..0db3625b691f 100644
--- a/drivers/net/can/c_can/c_can_platform.c
+++ b/drivers/net/can/c_can/c_can_platform.c
@@ -108,6 +108,34 @@ static void c_can_hw_raminit(const struct c_can_priv *priv, bool enable)
108 spin_unlock(&raminit_lock); 108 spin_unlock(&raminit_lock);
109} 109}
110 110
111static 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
121static 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
128static 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
133static 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
111static struct platform_device_id c_can_id_table[] = { 139static struct platform_device_id c_can_id_table[] = {
112 [BOSCH_C_CAN_PLATFORM] = { 140 [BOSCH_C_CAN_PLATFORM] = {
113 .name = KBUILD_MODNAME, 141 .name = KBUILD_MODNAME,
@@ -201,11 +229,15 @@ static int c_can_plat_probe(struct platform_device *pdev)
201 case IORESOURCE_MEM_32BIT: 229 case IORESOURCE_MEM_32BIT:
202 priv->read_reg = c_can_plat_read_reg_aligned_to_32bit; 230 priv->read_reg = c_can_plat_read_reg_aligned_to_32bit;
203 priv->write_reg = c_can_plat_write_reg_aligned_to_32bit; 231 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;
204 break; 234 break;
205 case IORESOURCE_MEM_16BIT: 235 case IORESOURCE_MEM_16BIT:
206 default: 236 default:
207 priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; 237 priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
208 priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; 238 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;
209 break; 241 break;
210 } 242 }
211 break; 243 break;
@@ -214,6 +246,8 @@ static int c_can_plat_probe(struct platform_device *pdev)
214 priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; 246 priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
215 priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; 247 priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
216 priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; 248 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;
217 251
218 if (pdev->dev.of_node) 252 if (pdev->dev.of_node)
219 priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can"); 253 priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can");