Commit ccbc5357 authored by Pavel Machek's avatar Pavel Machek Committed by Marc Kleine-Budde

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: default avatarThor Thayer <tthayer@altera.com>
Signed-off-by: default avatarThor Thayer <tthayer@altera.com>
Signed-off-by: default avatarPavel Machek <pavel@denx.de>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent e07e83ae
...@@ -252,8 +252,7 @@ static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj ...@@ -252,8 +252,7 @@ static void c_can_obj_update(struct net_device *dev, int iface, u32 cmd, u32 obj
struct c_can_priv *priv = netdev_priv(dev); struct c_can_priv *priv = netdev_priv(dev);
int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface); int cnt, reg = C_CAN_IFACE(COMREQ_REG, iface);
priv->write_reg(priv, reg + 1, cmd); priv->write_reg32(priv, reg, (cmd << 16) | obj);
priv->write_reg(priv, reg, obj);
for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) { for (cnt = MIN_TIMEOUT_VALUE; cnt; cnt--) {
if (!(priv->read_reg(priv, reg) & IF_COMR_BUSY)) 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,8 +327,7 @@ static void c_can_setup_tx_object(struct net_device *dev, int iface,
change_bit(idx, &priv->tx_dir); change_bit(idx, &priv->tx_dir);
} }
priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), arb); priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), arb);
priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), arb >> 16);
priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl); priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), ctrl);
...@@ -391,8 +389,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl) ...@@ -391,8 +389,7 @@ static int c_can_read_msg_object(struct net_device *dev, int iface, u32 ctrl)
frame->can_dlc = get_can_dlc(ctrl & 0x0F); frame->can_dlc = get_can_dlc(ctrl & 0x0F);
arb = priv->read_reg(priv, C_CAN_IFACE(ARB1_REG, iface)); arb = priv->read_reg32(priv, C_CAN_IFACE(ARB1_REG, iface));
arb |= priv->read_reg(priv, C_CAN_IFACE(ARB2_REG, iface)) << 16;
if (arb & IF_ARB_MSGXTD) if (arb & IF_ARB_MSGXTD)
frame->can_id = (arb & CAN_EFF_MASK) | CAN_EFF_FLAG; 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,12 +421,10 @@ static void c_can_setup_receive_object(struct net_device *dev, int iface,
struct c_can_priv *priv = netdev_priv(dev); struct c_can_priv *priv = netdev_priv(dev);
mask |= BIT(29); mask |= BIT(29);
priv->write_reg(priv, C_CAN_IFACE(MASK1_REG, iface), mask); priv->write_reg32(priv, C_CAN_IFACE(MASK1_REG, iface), mask);
priv->write_reg(priv, C_CAN_IFACE(MASK2_REG, iface), mask >> 16);
id |= IF_ARB_MSGVAL; id |= IF_ARB_MSGVAL;
priv->write_reg(priv, C_CAN_IFACE(ARB1_REG, iface), id); priv->write_reg32(priv, C_CAN_IFACE(ARB1_REG, iface), id);
priv->write_reg(priv, C_CAN_IFACE(ARB2_REG, iface), id >> 16);
priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont); priv->write_reg(priv, C_CAN_IFACE(MSGCTRL_REG, iface), mcont);
c_can_object_put(dev, iface, obj, IF_COMM_RCV_SETUP); c_can_object_put(dev, iface, obj, IF_COMM_RCV_SETUP);
......
...@@ -178,6 +178,8 @@ struct c_can_priv { ...@@ -178,6 +178,8 @@ struct c_can_priv {
int last_status; int last_status;
u16 (*read_reg) (const struct c_can_priv *priv, enum reg index); u16 (*read_reg) (const struct c_can_priv *priv, enum reg index);
void (*write_reg) (const struct c_can_priv *priv, enum reg index, u16 val); void (*write_reg) (const struct c_can_priv *priv, enum reg index, u16 val);
u32 (*read_reg32) (const struct c_can_priv *priv, enum reg index);
void (*write_reg32) (const struct c_can_priv *priv, enum reg index, u32 val);
void __iomem *base; void __iomem *base;
const u16 *regs; const u16 *regs;
void *priv; /* for board-specific data */ void *priv; /* for board-specific data */
......
...@@ -83,6 +83,23 @@ static void c_can_pci_write_reg_32bit(const struct c_can_priv *priv, ...@@ -83,6 +83,23 @@ static void c_can_pci_write_reg_32bit(const struct c_can_priv *priv,
iowrite32((u32)val, priv->base + 2 * priv->regs[index]); iowrite32((u32)val, priv->base + 2 * priv->regs[index]);
} }
static u32 c_can_pci_read_reg32(const struct c_can_priv *priv, enum reg index)
{
u32 val;
val = priv->read_reg(priv, index);
val |= ((u32) priv->read_reg(priv, index + 1)) << 16;
return val;
}
static void c_can_pci_write_reg32(const struct c_can_priv *priv, enum reg index,
u32 val)
{
priv->write_reg(priv, index + 1, val >> 16);
priv->write_reg(priv, index, val);
}
static void c_can_pci_reset_pch(const struct c_can_priv *priv, bool enable) static void c_can_pci_reset_pch(const struct c_can_priv *priv, bool enable)
{ {
if (enable) { if (enable) {
...@@ -187,6 +204,8 @@ static int c_can_pci_probe(struct pci_dev *pdev, ...@@ -187,6 +204,8 @@ static int c_can_pci_probe(struct pci_dev *pdev,
ret = -EINVAL; ret = -EINVAL;
goto out_free_c_can; goto out_free_c_can;
} }
priv->read_reg32 = c_can_pci_read_reg32;
priv->write_reg32 = c_can_pci_write_reg32;
priv->raminit = c_can_pci_data->init; priv->raminit = c_can_pci_data->init;
......
...@@ -108,6 +108,34 @@ static void c_can_hw_raminit(const struct c_can_priv *priv, bool enable) ...@@ -108,6 +108,34 @@ static void c_can_hw_raminit(const struct c_can_priv *priv, bool enable)
spin_unlock(&raminit_lock); spin_unlock(&raminit_lock);
} }
static u32 c_can_plat_read_reg32(const struct c_can_priv *priv, enum reg index)
{
u32 val;
val = priv->read_reg(priv, index);
val |= ((u32) priv->read_reg(priv, index + 1)) << 16;
return val;
}
static void c_can_plat_write_reg32(const struct c_can_priv *priv, enum reg index,
u32 val)
{
priv->write_reg(priv, index + 1, val >> 16);
priv->write_reg(priv, index, val);
}
static u32 d_can_plat_read_reg32(const struct c_can_priv *priv, enum reg index)
{
return readl(priv->base + priv->regs[index]);
}
static void d_can_plat_write_reg32(const struct c_can_priv *priv, enum reg index,
u32 val)
{
writel(val, priv->base + priv->regs[index]);
}
static struct platform_device_id c_can_id_table[] = { static struct platform_device_id c_can_id_table[] = {
[BOSCH_C_CAN_PLATFORM] = { [BOSCH_C_CAN_PLATFORM] = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
...@@ -201,11 +229,15 @@ static int c_can_plat_probe(struct platform_device *pdev) ...@@ -201,11 +229,15 @@ static int c_can_plat_probe(struct platform_device *pdev)
case IORESOURCE_MEM_32BIT: case IORESOURCE_MEM_32BIT:
priv->read_reg = c_can_plat_read_reg_aligned_to_32bit; priv->read_reg = c_can_plat_read_reg_aligned_to_32bit;
priv->write_reg = c_can_plat_write_reg_aligned_to_32bit; priv->write_reg = c_can_plat_write_reg_aligned_to_32bit;
priv->read_reg32 = c_can_plat_read_reg32;
priv->write_reg32 = c_can_plat_write_reg32;
break; break;
case IORESOURCE_MEM_16BIT: case IORESOURCE_MEM_16BIT:
default: default:
priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
priv->read_reg32 = c_can_plat_read_reg32;
priv->write_reg32 = c_can_plat_write_reg32;
break; break;
} }
break; break;
...@@ -214,6 +246,8 @@ static int c_can_plat_probe(struct platform_device *pdev) ...@@ -214,6 +246,8 @@ static int c_can_plat_probe(struct platform_device *pdev)
priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES;
priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; priv->read_reg = c_can_plat_read_reg_aligned_to_16bit;
priv->write_reg = c_can_plat_write_reg_aligned_to_16bit; priv->write_reg = c_can_plat_write_reg_aligned_to_16bit;
priv->read_reg32 = d_can_plat_read_reg32;
priv->write_reg32 = d_can_plat_write_reg32;
if (pdev->dev.of_node) if (pdev->dev.of_node)
priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can"); priv->instance = of_alias_get_id(pdev->dev.of_node, "d_can");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment