diff options
author | Pavel Machek <pavel@denx.de> | 2014-05-06 09:57:02 -0400 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2014-05-19 03:38:22 -0400 |
commit | ccbc5357db3098c57176945f677b0af37f5e87e6 (patch) | |
tree | 9200ce6c25f8bb2ec94c42fe8d0b2260105f9913 /drivers/net/can | |
parent | e07e83ae600ea51b857e02132220eb7b7e52e928 (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.c | 15 | ||||
-rw-r--r-- | drivers/net/can/c_can/c_can.h | 2 | ||||
-rw-r--r-- | drivers/net/can/c_can/c_can_pci.c | 19 | ||||
-rw-r--r-- | drivers/net/can/c_can/c_can_platform.c | 34 |
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 | ||
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 | |||
86 | static void c_can_pci_reset_pch(const struct c_can_priv *priv, bool enable) | 103 | static 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 | ||
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 | |||
111 | static struct platform_device_id c_can_id_table[] = { | 139 | static 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"); |