aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/can/ifi_canfd/ifi_canfd.c
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2018-03-05 15:29:52 -0500
committerMarc Kleine-Budde <mkl@pengutronix.de>2018-03-12 04:55:11 -0400
commit591d65d5b15496af8d05e252bc1da611c66c0b79 (patch)
tree446b396ebfee7bbf20deb3b5f0dffdf311b7e715 /drivers/net/can/ifi_canfd/ifi_canfd.c
parentb7db978ac283b237835129ac87f26cbac94d04e7 (diff)
can: ifi: Check core revision upon probe
Older versions of the core are not compatible with the driver due to various intrusive fixes of the core. Read out the VER register, check the core revision bitfield and verify if the core in use is new enough (rev 2.1 or newer) to work correctly with this driver. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Heiko Schocher <hs@denx.de> Cc: Markus Marb <markus@marb.org> Cc: Marc Kleine-Budde <mkl@pengutronix.de> Cc: linux-stable <stable@vger.kernel.org> Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can/ifi_canfd/ifi_canfd.c')
-rw-r--r--drivers/net/can/ifi_canfd/ifi_canfd.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/net/can/ifi_canfd/ifi_canfd.c b/drivers/net/can/ifi_canfd/ifi_canfd.c
index 2772d05ff11c..9fd396c3569a 100644
--- a/drivers/net/can/ifi_canfd/ifi_canfd.c
+++ b/drivers/net/can/ifi_canfd/ifi_canfd.c
@@ -136,6 +136,8 @@
136#define IFI_CANFD_SYSCLOCK 0x50 136#define IFI_CANFD_SYSCLOCK 0x50
137 137
138#define IFI_CANFD_VER 0x54 138#define IFI_CANFD_VER 0x54
139#define IFI_CANFD_VER_REV_MASK 0xff
140#define IFI_CANFD_VER_REV_MIN_SUPPORTED 0x15
139 141
140#define IFI_CANFD_IP_ID 0x58 142#define IFI_CANFD_IP_ID 0x58
141#define IFI_CANFD_IP_ID_VALUE 0xD073CAFD 143#define IFI_CANFD_IP_ID_VALUE 0xD073CAFD
@@ -933,7 +935,7 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
933 struct resource *res; 935 struct resource *res;
934 void __iomem *addr; 936 void __iomem *addr;
935 int irq, ret; 937 int irq, ret;
936 u32 id; 938 u32 id, rev;
937 939
938 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 940 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
939 addr = devm_ioremap_resource(dev, res); 941 addr = devm_ioremap_resource(dev, res);
@@ -947,6 +949,13 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
947 return -EINVAL; 949 return -EINVAL;
948 } 950 }
949 951
952 rev = readl(addr + IFI_CANFD_VER) & IFI_CANFD_VER_REV_MASK;
953 if (rev < IFI_CANFD_VER_REV_MIN_SUPPORTED) {
954 dev_err(dev, "This block is too old (rev %i), minimum supported is rev %i\n",
955 rev, IFI_CANFD_VER_REV_MIN_SUPPORTED);
956 return -EINVAL;
957 }
958
950 ndev = alloc_candev(sizeof(*priv), 1); 959 ndev = alloc_candev(sizeof(*priv), 1);
951 if (!ndev) 960 if (!ndev)
952 return -ENOMEM; 961 return -ENOMEM;