Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754808AbbLXRoA (ORCPT ); Thu, 24 Dec 2015 12:44:00 -0500 Received: from mail.savoirfairelinux.com ([208.88.110.44]:44718 "EHLO mail.savoirfairelinux.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754255AbbLXRnP (ORCPT ); Thu, 24 Dec 2015 12:43:15 -0500 From: Damien Riegel To: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-can@vger.kernel.org Cc: Rob Herring , Pawel Moll , Mark Rutland , Ian Campbell , Kumar Gala , Wolfgang Grandegger , Marc Kleine-Budde , kernel@savoirfairelinux.com, Damien Riegel Subject: [PATCH v2 3/3] can: sja1000: of: add compatibility with Technologic Systems version Date: Thu, 24 Dec 2015 12:42:53 -0500 Message-Id: <1450978973-30417-4-git-send-email-damien.riegel@savoirfairelinux.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1450978973-30417-1-git-send-email-damien.riegel@savoirfairelinux.com> References: <1450978973-30417-1-git-send-email-damien.riegel@savoirfairelinux.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2993 Lines: 97 Technologic Systems provides an IP compatible with the SJA1000, instantiated in an FPGA. Because of some bus widths issue, access to registers is made through a "window" that works like this: base + 0x0: address to read/write base + 0x2: 8-bit register value This commit adds a new compatible device, "technologic,sja1000", with read and write functions using the window mechanism. Signed-off-by: Damien Riegel --- drivers/net/can/sja1000/sja1000_platform.c | 47 ++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/drivers/net/can/sja1000/sja1000_platform.c b/drivers/net/can/sja1000/sja1000_platform.c index e0572d0..bfb124d 100644 --- a/drivers/net/can/sja1000/sja1000_platform.c +++ b/drivers/net/can/sja1000/sja1000_platform.c @@ -45,6 +45,10 @@ struct sja1000_of_data { 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) { return ioread8(priv->reg_base + reg); @@ -75,6 +79,43 @@ static void sp_write_reg32(const struct sja1000_priv *priv, int reg, u8 val) iowrite8(val, priv->reg_base + reg * 4); } +static u8 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 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 technologic_init(struct sja1000_priv *priv, struct device_node *of) +{ + struct technologic_priv *tp = priv->priv; + + priv->read_reg = technologic_read_reg16; + priv->write_reg = technologic_write_reg16; + spin_lock_init(&tp->io_lock); + + return 0; +} + static void sp_populate(struct sja1000_priv *priv, struct sja1000_platform_data *pdata, unsigned long resource_mem_flags) @@ -255,8 +296,14 @@ static int sp_remove(struct platform_device *pdev) return 0; } +struct sja1000_of_data technologic_data = { + .priv_sz = sizeof(struct technologic_priv), + .init = technologic_init, +}; + static const struct of_device_id sp_of_table[] = { {.compatible = "nxp,sja1000"}, + {.compatible = "technologic,sja1000", .data = &technologic_data}, {}, }; MODULE_DEVICE_TABLE(of, sp_of_table); -- 2.5.0 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/