mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-25 13:43:55 +08:00
linux-can-next-for-3.17-20140715
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iEYEABECAAYFAlPE2fYACgkQjTAFq1RaXHNpmwCfY+zM07sxULHpFYoLPEHVbdVh tXgAoIG6RVra8G8aPEBEk1MeRMAx+HRj =2is3 -----END PGP SIGNATURE----- Merge tag 'linux-can-next-for-3.17-20140715' of git://gitorious.org/linux-can/linux-can-next Marc Kleine-Budde says: ==================== pull-request: can-next 2014-07-15 this is a pull request of 4 patches for net-next/master. Prabhakar Lad contributes a patch that converts the c_can driver to use the devm api. The remaining four patches by Nikita Edward Baruzdin improve the SJA1000 driver with loopback testing support and introduce a new testing mode presume ack, for successful transmission even if no ACK is received. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
725b70185d
@ -208,40 +208,31 @@ static int c_can_plat_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
/* get the appropriate clk */
|
||||
clk = clk_get(&pdev->dev, NULL);
|
||||
clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(clk)) {
|
||||
dev_err(&pdev->dev, "no clock defined\n");
|
||||
ret = -ENODEV;
|
||||
ret = PTR_ERR(clk);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* get the platform data */
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (!mem || irq <= 0) {
|
||||
if (irq <= 0) {
|
||||
ret = -ENODEV;
|
||||
goto exit_free_clk;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (!request_mem_region(mem->start, resource_size(mem),
|
||||
KBUILD_MODNAME)) {
|
||||
dev_err(&pdev->dev, "resource unavailable\n");
|
||||
ret = -ENODEV;
|
||||
goto exit_free_clk;
|
||||
}
|
||||
|
||||
addr = ioremap(mem->start, resource_size(mem));
|
||||
if (!addr) {
|
||||
dev_err(&pdev->dev, "failed to map can port\n");
|
||||
ret = -ENOMEM;
|
||||
goto exit_release_mem;
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
addr = devm_ioremap_resource(&pdev->dev, mem);
|
||||
if (IS_ERR(addr)) {
|
||||
ret = PTR_ERR(addr);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
/* allocate the c_can device */
|
||||
dev = alloc_c_can_dev();
|
||||
if (!dev) {
|
||||
ret = -ENOMEM;
|
||||
goto exit_iounmap;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
priv = netdev_priv(dev);
|
||||
@ -321,12 +312,6 @@ static int c_can_plat_probe(struct platform_device *pdev)
|
||||
|
||||
exit_free_device:
|
||||
free_c_can_dev(dev);
|
||||
exit_iounmap:
|
||||
iounmap(addr);
|
||||
exit_release_mem:
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
exit_free_clk:
|
||||
clk_put(clk);
|
||||
exit:
|
||||
dev_err(&pdev->dev, "probe failed\n");
|
||||
|
||||
@ -336,18 +321,10 @@ exit:
|
||||
static int c_can_plat_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev = platform_get_drvdata(pdev);
|
||||
struct c_can_priv *priv = netdev_priv(dev);
|
||||
struct resource *mem;
|
||||
|
||||
unregister_c_can_dev(dev);
|
||||
|
||||
free_c_can_dev(dev);
|
||||
iounmap(priv->base);
|
||||
|
||||
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
|
||||
clk_put(priv->priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -141,6 +141,7 @@ static void set_normal_mode(struct net_device *dev)
|
||||
{
|
||||
struct sja1000_priv *priv = netdev_priv(dev);
|
||||
unsigned char status = priv->read_reg(priv, SJA1000_MOD);
|
||||
u8 mod_reg_val = 0x00;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 100; i++) {
|
||||
@ -158,9 +159,10 @@ static void set_normal_mode(struct net_device *dev)
|
||||
|
||||
/* set chip to normal mode */
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY)
|
||||
priv->write_reg(priv, SJA1000_MOD, MOD_LOM);
|
||||
else
|
||||
priv->write_reg(priv, SJA1000_MOD, 0x00);
|
||||
mod_reg_val |= MOD_LOM;
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_PRESUME_ACK)
|
||||
mod_reg_val |= MOD_STM;
|
||||
priv->write_reg(priv, SJA1000_MOD, mod_reg_val);
|
||||
|
||||
udelay(10);
|
||||
|
||||
@ -278,6 +280,7 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb,
|
||||
uint8_t dlc;
|
||||
canid_t id;
|
||||
uint8_t dreg;
|
||||
u8 cmd_reg_val = 0x00;
|
||||
int i;
|
||||
|
||||
if (can_dropped_invalid_skb(dev, skb))
|
||||
@ -312,9 +315,14 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb,
|
||||
can_put_echo_skb(skb, dev, 0);
|
||||
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT)
|
||||
sja1000_write_cmdreg(priv, CMD_TR | CMD_AT);
|
||||
cmd_reg_val |= CMD_AT;
|
||||
|
||||
if (priv->can.ctrlmode & CAN_CTRLMODE_LOOPBACK)
|
||||
cmd_reg_val |= CMD_SRR;
|
||||
else
|
||||
sja1000_write_cmdreg(priv, CMD_TR);
|
||||
cmd_reg_val |= CMD_TR;
|
||||
|
||||
sja1000_write_cmdreg(priv, cmd_reg_val);
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
@ -622,9 +630,12 @@ struct net_device *alloc_sja1000dev(int sizeof_priv)
|
||||
priv->can.do_set_bittiming = sja1000_set_bittiming;
|
||||
priv->can.do_set_mode = sja1000_set_mode;
|
||||
priv->can.do_get_berr_counter = sja1000_get_berr_counter;
|
||||
priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES |
|
||||
CAN_CTRLMODE_BERR_REPORTING | CAN_CTRLMODE_LISTENONLY |
|
||||
CAN_CTRLMODE_ONE_SHOT;
|
||||
priv->can.ctrlmode_supported = CAN_CTRLMODE_LOOPBACK |
|
||||
CAN_CTRLMODE_LISTENONLY |
|
||||
CAN_CTRLMODE_3_SAMPLES |
|
||||
CAN_CTRLMODE_ONE_SHOT |
|
||||
CAN_CTRLMODE_BERR_REPORTING |
|
||||
CAN_CTRLMODE_PRESUME_ACK;
|
||||
|
||||
spin_lock_init(&priv->cmdreg_lock);
|
||||
|
||||
|
@ -97,6 +97,7 @@ struct can_ctrlmode {
|
||||
#define CAN_CTRLMODE_ONE_SHOT 0x08 /* One-Shot mode */
|
||||
#define CAN_CTRLMODE_BERR_REPORTING 0x10 /* Bus-error reporting */
|
||||
#define CAN_CTRLMODE_FD 0x20 /* CAN FD mode */
|
||||
#define CAN_CTRLMODE_PRESUME_ACK 0x40 /* Ignore missing CAN ACKs */
|
||||
|
||||
/*
|
||||
* CAN device statistics
|
||||
|
Loading…
Reference in New Issue
Block a user