Commit 86310cc4 authored by David S. Miller's avatar David S. Miller

Merge tag 'linux-can-next-for-4.6-20160220' of...

Merge tag 'linux-can-next-for-4.6-20160220' of git://git.kernel.org/pub/scm/linux/kernel/git/mkl/linux-can-next

Marc Kleine-Budde says:

====================
pull-request: can-next 2016-02-20

this is a pull request of 9 patch for net-next/master.

The first 3 patches are from Damien Riegel, they add support for
Technologic Systems IP core to tje sja100 driver. The next patches 6 by
Marek Vasut (including one my me) first clean sort the CAN driver's
Kconfig and Makefiles and then add support for the IFI CANFD IP core.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 9c572dc4 0c4d9c94
IFI CANFD controller
--------------------
Required properties:
- compatible: Should be "ifi,canfd-1.0"
- reg: Should contain CAN controller registers location and length
- interrupts: Should contain IRQ line for the CAN controller
Example:
canfd0: canfd@ff220000 {
compatible = "ifi,canfd-1.0";
reg = <0xff220000 0x00001000>;
interrupts = <0 43 0>;
};
...@@ -2,7 +2,7 @@ Memory mapped SJA1000 CAN controller from NXP (formerly Philips) ...@@ -2,7 +2,7 @@ Memory mapped SJA1000 CAN controller from NXP (formerly Philips)
Required properties: Required properties:
- compatible : should be "nxp,sja1000". - compatible : should be one of "nxp,sja1000", "technologic,sja1000".
- reg : should specify the chip select, address offset and size required - reg : should specify the chip select, address offset and size required
to map the registers of the SJA1000. The size is usually 0x80. to map the registers of the SJA1000. The size is usually 0x80.
...@@ -14,6 +14,7 @@ Optional properties: ...@@ -14,6 +14,7 @@ Optional properties:
- reg-io-width : Specify the size (in bytes) of the IO accesses that - reg-io-width : Specify the size (in bytes) of the IO accesses that
should be performed on the device. Valid value is 1, 2 or 4. should be performed on the device. Valid value is 1, 2 or 4.
This property is ignored for technologic version.
Default to 1 (8 bits). Default to 1 (8 bits).
- nxp,external-clock-frequency : Frequency of the external oscillator - nxp,external-clock-frequency : Frequency of the external oscillator
......
...@@ -111,6 +111,7 @@ hp Hewlett Packard ...@@ -111,6 +111,7 @@ hp Hewlett Packard
i2se I2SE GmbH i2se I2SE GmbH
ibm International Business Machines (IBM) ibm International Business Machines (IBM)
idt Integrated Device Technologies, Inc. idt Integrated Device Technologies, Inc.
ifi Ingenieurburo Fur Ic-Technologie (I/F/I)
iom Iomega Corporation iom Iomega Corporation
img Imagination Technologies Ltd. img Imagination Technologies Ltd.
ingenic Ingenic Semiconductor ingenic Ingenic Semiconductor
......
...@@ -70,13 +70,6 @@ config CAN_AT91 ...@@ -70,13 +70,6 @@ config CAN_AT91
This is a driver for the SoC CAN controller in Atmel's AT91SAM9263 This is a driver for the SoC CAN controller in Atmel's AT91SAM9263
and AT91SAM9X5 processors. and AT91SAM9X5 processors.
config CAN_TI_HECC
depends on ARM
tristate "TI High End CAN Controller"
---help---
Driver for TI HECC (High End CAN Controller) module found on many
TI devices. The device specifications are available from www.ti.com
config CAN_BFIN config CAN_BFIN
depends on BF534 || BF536 || BF537 || BF538 || BF539 || BF54x depends on BF534 || BF536 || BF537 || BF538 || BF539 || BF54x
tristate "Analog Devices Blackfin on-chip CAN" tristate "Analog Devices Blackfin on-chip CAN"
...@@ -86,30 +79,12 @@ config CAN_BFIN ...@@ -86,30 +79,12 @@ config CAN_BFIN
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called bfin_can. module will be called bfin_can.
config CAN_JANZ_ICAN3
tristate "Janz VMOD-ICAN3 Intelligent CAN controller"
depends on MFD_JANZ_CMODIO
---help---
Driver for Janz VMOD-ICAN3 Intelligent CAN controller module, which
connects to a MODULbus carrier board.
This driver can also be built as a module. If so, the module will be
called janz-ican3.ko.
config CAN_FLEXCAN config CAN_FLEXCAN
tristate "Support for Freescale FLEXCAN based chips" tristate "Support for Freescale FLEXCAN based chips"
depends on ARM || PPC depends on ARM || PPC
---help--- ---help---
Say Y here if you want to support for Freescale FlexCAN. Say Y here if you want to support for Freescale FlexCAN.
config PCH_CAN
tristate "Intel EG20T PCH CAN controller"
depends on PCI && (X86_32 || COMPILE_TEST)
---help---
This driver is for PCH CAN of Topcliff (Intel EG20T PCH) which
is an IOH for x86 embedded processor (Intel Atom E6xx series).
This driver can access CAN bus.
config CAN_GRCAN config CAN_GRCAN
tristate "Aeroflex Gaisler GRCAN and GRHCAN CAN devices" tristate "Aeroflex Gaisler GRCAN and GRHCAN CAN devices"
depends on OF && HAS_DMA depends on OF && HAS_DMA
...@@ -119,6 +94,16 @@ config CAN_GRCAN ...@@ -119,6 +94,16 @@ config CAN_GRCAN
endian syntheses of the cores would need some modifications on endian syntheses of the cores would need some modifications on
the hardware level to work. the hardware level to work.
config CAN_JANZ_ICAN3
tristate "Janz VMOD-ICAN3 Intelligent CAN controller"
depends on MFD_JANZ_CMODIO
---help---
Driver for Janz VMOD-ICAN3 Intelligent CAN controller module, which
connects to a MODULbus carrier board.
This driver can also be built as a module. If so, the module will be
called janz-ican3.ko.
config CAN_RCAR config CAN_RCAR
tristate "Renesas R-Car CAN controller" tristate "Renesas R-Car CAN controller"
depends on ARM depends on ARM
...@@ -139,6 +124,13 @@ config CAN_SUN4I ...@@ -139,6 +124,13 @@ config CAN_SUN4I
To compile this driver as a module, choose M here: the module will To compile this driver as a module, choose M here: the module will
be called sun4i_can. be called sun4i_can.
config CAN_TI_HECC
depends on ARM
tristate "TI High End CAN Controller"
---help---
Driver for TI HECC (High End CAN Controller) module found on many
TI devices. The device specifications are available from www.ti.com
config CAN_XILINXCAN config CAN_XILINXCAN
tristate "Xilinx CAN" tristate "Xilinx CAN"
depends on ARCH_ZYNQ || ARM64 || MICROBLAZE || COMPILE_TEST depends on ARCH_ZYNQ || ARM64 || MICROBLAZE || COMPILE_TEST
...@@ -147,22 +139,24 @@ config CAN_XILINXCAN ...@@ -147,22 +139,24 @@ config CAN_XILINXCAN
Xilinx CAN driver. This driver supports both soft AXI CAN IP and Xilinx CAN driver. This driver supports both soft AXI CAN IP and
Zynq CANPS IP. Zynq CANPS IP.
source "drivers/net/can/mscan/Kconfig" config PCH_CAN
tristate "Intel EG20T PCH CAN controller"
source "drivers/net/can/sja1000/Kconfig" depends on PCI && (X86_32 || COMPILE_TEST)
---help---
This driver is for PCH CAN of Topcliff (Intel EG20T PCH) which
is an IOH for x86 embedded processor (Intel Atom E6xx series).
This driver can access CAN bus.
source "drivers/net/can/c_can/Kconfig" source "drivers/net/can/c_can/Kconfig"
source "drivers/net/can/m_can/Kconfig"
source "drivers/net/can/cc770/Kconfig" source "drivers/net/can/cc770/Kconfig"
source "drivers/net/can/ifi_canfd/Kconfig"
source "drivers/net/can/m_can/Kconfig"
source "drivers/net/can/mscan/Kconfig"
source "drivers/net/can/sja1000/Kconfig"
source "drivers/net/can/softing/Kconfig"
source "drivers/net/can/spi/Kconfig" source "drivers/net/can/spi/Kconfig"
source "drivers/net/can/usb/Kconfig" source "drivers/net/can/usb/Kconfig"
source "drivers/net/can/softing/Kconfig"
endif endif
config CAN_DEBUG_DEVICES config CAN_DEBUG_DEVICES
......
...@@ -14,21 +14,22 @@ obj-y += spi/ ...@@ -14,21 +14,22 @@ obj-y += spi/
obj-y += usb/ obj-y += usb/
obj-y += softing/ obj-y += softing/
obj-$(CONFIG_CAN_SJA1000) += sja1000/
obj-$(CONFIG_CAN_MSCAN) += mscan/
obj-$(CONFIG_CAN_C_CAN) += c_can/
obj-$(CONFIG_CAN_M_CAN) += m_can/
obj-$(CONFIG_CAN_CC770) += cc770/
obj-$(CONFIG_CAN_AT91) += at91_can.o obj-$(CONFIG_CAN_AT91) += at91_can.o
obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o
obj-$(CONFIG_CAN_BFIN) += bfin_can.o obj-$(CONFIG_CAN_BFIN) += bfin_can.o
obj-$(CONFIG_CAN_JANZ_ICAN3) += janz-ican3.o obj-$(CONFIG_CAN_CC770) += cc770/
obj-$(CONFIG_CAN_C_CAN) += c_can/
obj-$(CONFIG_CAN_FLEXCAN) += flexcan.o obj-$(CONFIG_CAN_FLEXCAN) += flexcan.o
obj-$(CONFIG_PCH_CAN) += pch_can.o
obj-$(CONFIG_CAN_GRCAN) += grcan.o obj-$(CONFIG_CAN_GRCAN) += grcan.o
obj-$(CONFIG_CAN_IFI_CANFD) += ifi_canfd/
obj-$(CONFIG_CAN_JANZ_ICAN3) += janz-ican3.o
obj-$(CONFIG_CAN_MSCAN) += mscan/
obj-$(CONFIG_CAN_M_CAN) += m_can/
obj-$(CONFIG_CAN_RCAR) += rcar_can.o obj-$(CONFIG_CAN_RCAR) += rcar_can.o
obj-$(CONFIG_CAN_SJA1000) += sja1000/
obj-$(CONFIG_CAN_SUN4I) += sun4i_can.o obj-$(CONFIG_CAN_SUN4I) += sun4i_can.o
obj-$(CONFIG_CAN_TI_HECC) += ti_hecc.o
obj-$(CONFIG_CAN_XILINXCAN) += xilinx_can.o obj-$(CONFIG_CAN_XILINXCAN) += xilinx_can.o
obj-$(CONFIG_PCH_CAN) += pch_can.o
subdir-ccflags-y += -D__CHECK_ENDIAN__ subdir-ccflags-y += -D__CHECK_ENDIAN__
subdir-ccflags-$(CONFIG_CAN_DEBUG_DEVICES) += -DDEBUG subdir-ccflags-$(CONFIG_CAN_DEBUG_DEVICES) += -DDEBUG
config CAN_IFI_CANFD
depends on HAS_IOMEM
tristate "IFI CAN_FD IP"
---help---
This driver adds support for the I/F/I CAN_FD soft IP block
connected to the "platform bus" (Linux abstraction for directly
to the processor attached devices). The CAN_FD is most often
synthesised into an FPGA or CPLD.
#
# Makefile for the IFI CANFD controller driver.
#
obj-$(CONFIG_CAN_IFI_CANFD) += ifi_canfd.o
This diff is collapsed.
...@@ -27,6 +27,7 @@ ...@@ -27,6 +27,7 @@
#include <linux/can/platform/sja1000.h> #include <linux/can/platform/sja1000.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h>
#include <linux/of_irq.h> #include <linux/of_irq.h>
#include "sja1000.h" #include "sja1000.h"
...@@ -40,6 +41,15 @@ MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus"); ...@@ -40,6 +41,15 @@ MODULE_DESCRIPTION("Socket-CAN driver for SJA1000 on the platform bus");
MODULE_ALIAS("platform:" DRV_NAME); MODULE_ALIAS("platform:" DRV_NAME);
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
struct sja1000_of_data {
size_t priv_sz;
int (*init)(struct sja1000_priv *priv, struct device_node *of);
};
struct technologic_priv {
spinlock_t io_lock;
};
static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg) static u8 sp_read_reg8(const struct sja1000_priv *priv, int reg)
{ {
return ioread8(priv->reg_base + reg); return ioread8(priv->reg_base + reg);
...@@ -70,6 +80,43 @@ static void sp_write_reg32(const struct sja1000_priv *priv, int reg, u8 val) ...@@ -70,6 +80,43 @@ static void sp_write_reg32(const struct sja1000_priv *priv, int reg, u8 val)
iowrite8(val, priv->reg_base + reg * 4); iowrite8(val, priv->reg_base + reg * 4);
} }
static u8 sp_technologic_read_reg16(const struct sja1000_priv *priv, int reg)
{
struct technologic_priv *tp = priv->priv;
unsigned long flags;
u8 val;
spin_lock_irqsave(&tp->io_lock, flags);
iowrite16(reg, priv->reg_base + 0);
val = ioread16(priv->reg_base + 2);
spin_unlock_irqrestore(&tp->io_lock, flags);
return val;
}
static void sp_technologic_write_reg16(const struct sja1000_priv *priv,
int reg, u8 val)
{
struct technologic_priv *tp = priv->priv;
unsigned long flags;
spin_lock_irqsave(&tp->io_lock, flags);
iowrite16(reg, priv->reg_base + 0);
iowrite16(val, priv->reg_base + 2);
spin_unlock_irqrestore(&tp->io_lock, flags);
}
static int sp_technologic_init(struct sja1000_priv *priv, struct device_node *of)
{
struct technologic_priv *tp = priv->priv;
priv->read_reg = sp_technologic_read_reg16;
priv->write_reg = sp_technologic_write_reg16;
spin_lock_init(&tp->io_lock);
return 0;
}
static void sp_populate(struct sja1000_priv *priv, static void sp_populate(struct sja1000_priv *priv,
struct sja1000_platform_data *pdata, struct sja1000_platform_data *pdata,
unsigned long resource_mem_flags) unsigned long resource_mem_flags)
...@@ -154,6 +201,18 @@ static void sp_populate_of(struct sja1000_priv *priv, struct device_node *of) ...@@ -154,6 +201,18 @@ static void sp_populate_of(struct sja1000_priv *priv, struct device_node *of)
priv->cdr |= CDR_CBP; /* default */ priv->cdr |= CDR_CBP; /* default */
} }
static struct sja1000_of_data technologic_data = {
.priv_sz = sizeof(struct technologic_priv),
.init = sp_technologic_init,
};
static const struct of_device_id sp_of_table[] = {
{ .compatible = "nxp,sja1000", .data = NULL, },
{ .compatible = "technologic,sja1000", .data = &technologic_data, },
{ /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, sp_of_table);
static int sp_probe(struct platform_device *pdev) static int sp_probe(struct platform_device *pdev)
{ {
int err, irq = 0; int err, irq = 0;
...@@ -163,6 +222,9 @@ static int sp_probe(struct platform_device *pdev) ...@@ -163,6 +222,9 @@ static int sp_probe(struct platform_device *pdev)
struct resource *res_mem, *res_irq = NULL; struct resource *res_mem, *res_irq = NULL;
struct sja1000_platform_data *pdata; struct sja1000_platform_data *pdata;
struct device_node *of = pdev->dev.of_node; struct device_node *of = pdev->dev.of_node;
const struct of_device_id *of_id;
const struct sja1000_of_data *of_data = NULL;
size_t priv_sz = 0;
pdata = dev_get_platdata(&pdev->dev); pdata = dev_get_platdata(&pdev->dev);
if (!pdata && !of) { if (!pdata && !of) {
...@@ -191,7 +253,13 @@ static int sp_probe(struct platform_device *pdev) ...@@ -191,7 +253,13 @@ static int sp_probe(struct platform_device *pdev)
if (!irq && !res_irq) if (!irq && !res_irq)
return -ENODEV; return -ENODEV;
dev = alloc_sja1000dev(0); of_id = of_match_device(sp_of_table, &pdev->dev);
if (of_id && of_id->data) {
of_data = of_id->data;
priv_sz = of_data->priv_sz;
}
dev = alloc_sja1000dev(priv_sz);
if (!dev) if (!dev)
return -ENOMEM; return -ENOMEM;
priv = netdev_priv(dev); priv = netdev_priv(dev);
...@@ -208,10 +276,17 @@ static int sp_probe(struct platform_device *pdev) ...@@ -208,10 +276,17 @@ static int sp_probe(struct platform_device *pdev)
dev->irq = irq; dev->irq = irq;
priv->reg_base = addr; priv->reg_base = addr;
if (of) if (of) {
sp_populate_of(priv, of); sp_populate_of(priv, of);
else
if (of_data && of_data->init) {
err = of_data->init(priv, of);
if (err)
goto exit_free;
}
} else {
sp_populate(priv, pdata, res_mem->flags); sp_populate(priv, pdata, res_mem->flags);
}
platform_set_drvdata(pdev, dev); platform_set_drvdata(pdev, dev);
SET_NETDEV_DEV(dev, &pdev->dev); SET_NETDEV_DEV(dev, &pdev->dev);
...@@ -242,12 +317,6 @@ static int sp_remove(struct platform_device *pdev) ...@@ -242,12 +317,6 @@ static int sp_remove(struct platform_device *pdev)
return 0; return 0;
} }
static const struct of_device_id sp_of_table[] = {
{.compatible = "nxp,sja1000"},
{},
};
MODULE_DEVICE_TABLE(of, sp_of_table);
static struct platform_driver sp_driver = { static struct platform_driver sp_driver = {
.probe = sp_probe, .probe = sp_probe,
.remove = sp_remove, .remove = sp_remove,
......
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