[PATCH v4 2/5] mailbox: Add support for ST's Mailbox IP

2015-10-16 Thread Lee Jones
ST's platforms currently support a maximum of 5 Mailboxes, one for
each of the supported co-processors situated on the platform.  Each
Mailbox is divided up into 4 instances which consist of 32 channels.
Messages are passed between the application and co-processors using
shared memory areas.  It is the Client's responsibility to manage
these areas.

Signed-off-by: Lee Jones 
---
 drivers/mailbox/Kconfig   |   7 +
 drivers/mailbox/Makefile  |   2 +
 drivers/mailbox/mailbox-sti.c | 513 ++
 3 files changed, 522 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-sti.c

diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
index bbec500..7b53386 100644
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -71,4 +71,11 @@ config BCM2835_MBOX
  the services of the Videocore. Say Y here if you want to use the
  BCM2835 Mailbox.
 
+config STI_MBOX
+   tristate "STI Mailbox framework support"
+   depends on ARCH_STI && OF
+   help
+ Mailbox implementation for STMicroelectonics family chips with
+ hardware for interprocessor communication.
+
 endif
diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile
index 8e6d822..7cb4766 100644
--- a/drivers/mailbox/Makefile
+++ b/drivers/mailbox/Makefile
@@ -13,3 +13,5 @@ obj-$(CONFIG_PCC) += pcc.o
 obj-$(CONFIG_ALTERA_MBOX)  += mailbox-altera.o
 
 obj-$(CONFIG_BCM2835_MBOX) += bcm2835-mailbox.o
+
+obj-$(CONFIG_STI_MBOX) += mailbox-sti.o
diff --git a/drivers/mailbox/mailbox-sti.c b/drivers/mailbox/mailbox-sti.c
new file mode 100644
index 000..f11d4e8
--- /dev/null
+++ b/drivers/mailbox/mailbox-sti.c
@@ -0,0 +1,513 @@
+/*
+ * STi Mailbox
+ *
+ * Copyright (C) 2015 ST Microelectronics
+ *
+ * Author: Lee Jones  for ST Microelectronics
+ *
+ * Based on the original driver written by;
+ *   Alexandre Torgue, Olivier Lebreton and Loic Pallardy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "mailbox.h"
+
+#define STI_MBOX_INST_MAX  4  /* RAM saving: Max supported instances */
+#define STI_MBOX_CHAN_MAX  20 /* RAM saving: Max supported channels  */
+
+#define STI_IRQ_VAL_OFFSET 0x04   /* Read interrupt status   */
+#define STI_IRQ_SET_OFFSET 0x24   /* Generate a Tx channel interrupt */
+#define STI_IRQ_CLR_OFFSET 0x44   /* Clear pending Rx interrupts */
+#define STI_ENA_VAL_OFFSET 0x64   /* Read enable status  */
+#define STI_ENA_SET_OFFSET 0x84   /* Enable a channel*/
+#define STI_ENA_CLR_OFFSET 0xa4   /* Disable a channel   */
+
+#define MBOX_BASE(mdev, inst)   ((mdev)->base + ((inst) * 4))
+
+/**
+ * STi Mailbox device data
+ *
+ * An IP Mailbox is currently composed of 4 instances
+ * Each instance is currently composed of 32 channels
+ * This means that we have 128 channels per Mailbox
+ * A channel an be used for TX or RX
+ *
+ * @dev:   Device to which it is attached
+ * @mbox:  Representation of a communication channel controller
+ * @base:  Base address of the register mapping region
+ * @name:  Name of the mailbox
+ * @enabled:   Local copy of enabled channels
+ * @lock:  Mutex protecting enabled status
+ */
+struct sti_mbox_device {
+   struct device   *dev;
+   struct mbox_controller  *mbox;
+   void __iomem*base;
+   const char  *name;
+   u32 enabled[STI_MBOX_INST_MAX];
+   spinlock_t  lock;
+};
+
+/**
+ * STi Mailbox platform specfic configuration
+ *
+ * @num_inst:  Maximum number of instances in one HW Mailbox
+ * @num_chan:  Maximum number of channel per instance
+ */
+struct sti_mbox_pdata {
+   unsigned intnum_inst;
+   unsigned intnum_chan;
+};
+
+/**
+ * STi Mailbox allocated channel information
+ *
+ * @mdev:  Pointer to parent Mailbox device
+ * @instance:  Instance number channel resides in
+ * @channel:   Channel number pertaining to this container
+ */
+struct sti_channel {
+   struct sti_mbox_device  *mdev;
+   unsigned intinstance;
+   unsigned intchannel;
+};
+
+static inline bool sti_mbox_channel_is_enabled(struct mbox_chan *chan)
+{
+   struct sti_channel *chan_info = chan->con_priv;
+   struct sti_mbox_device *mdev = chan_info->mdev;
+   unsigned int instance = chan_info->instance;
+   unsigned int channel = chan_info->channel;
+
+   return mdev->enabled[instance] & BIT(channel);
+}
+
+static inline
+struct mbox_chan *sti_mbox_to_channel(struct mbox_co

[PATCH v4 2/5] mailbox: Add support for ST's Mailbox IP

2015-10-05 Thread Lee Jones
ST's platforms currently support a maximum of 5 Mailboxes, one for
each of the supported co-processors situated on the platform.  Each
Mailbox is divided up into 4 instances which consist of 32 channels.
Messages are passed between the application and co-processors using
shared memory areas.  It is the Client's responsibility to manage
these areas.

Signed-off-by: Lee Jones 
---
 drivers/mailbox/Kconfig   |   7 +
 drivers/mailbox/Makefile  |   2 +
 drivers/mailbox/mailbox-sti.c | 516 ++
 3 files changed, 525 insertions(+)
 create mode 100644 drivers/mailbox/mailbox-sti.c

diff --git a/drivers/mailbox/Kconfig b/drivers/mailbox/Kconfig
index e269f08..2cc4c39 100644
--- a/drivers/mailbox/Kconfig
+++ b/drivers/mailbox/Kconfig
@@ -70,4 +70,11 @@ config BCM2835_MBOX
  the services of the Videocore. Say Y here if you want to use the
  BCM2835 Mailbox.
 
+config STI_MBOX
+   tristate "STI Mailbox framework support"
+   depends on ARCH_STI && OF
+   help
+ Mailbox implementation for STMicroelectonics family chips with
+ hardware for interprocessor communication.
+
 endif
diff --git a/drivers/mailbox/Makefile b/drivers/mailbox/Makefile
index 8e6d822..7cb4766 100644
--- a/drivers/mailbox/Makefile
+++ b/drivers/mailbox/Makefile
@@ -13,3 +13,5 @@ obj-$(CONFIG_PCC) += pcc.o
 obj-$(CONFIG_ALTERA_MBOX)  += mailbox-altera.o
 
 obj-$(CONFIG_BCM2835_MBOX) += bcm2835-mailbox.o
+
+obj-$(CONFIG_STI_MBOX) += mailbox-sti.o
diff --git a/drivers/mailbox/mailbox-sti.c b/drivers/mailbox/mailbox-sti.c
new file mode 100644
index 000..b1618d2
--- /dev/null
+++ b/drivers/mailbox/mailbox-sti.c
@@ -0,0 +1,516 @@
+/*
+ * STi Mailbox
+ *
+ * Copyright (C) 2015 ST Microelectronics
+ *
+ * Author: Lee Jones  for ST Microelectronics
+ *
+ * Based on the original driver written by;
+ *   Alexandre Torgue, Olivier Lebreton and Loic Pallardy
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "mailbox.h"
+
+#define STI_MBOX_INST_MAX  4  /* RAM saving: Max supported instances */
+#define STI_MBOX_CHAN_MAX  20 /* RAM saving: Max supported channels  */
+
+#define STI_IRQ_VAL_OFFSET 0x04   /* Read interrupt status   */
+#define STI_IRQ_SET_OFFSET 0x24   /* Generate a Tx channel interrupt */
+#define STI_IRQ_CLR_OFFSET 0x44   /* Clear pending Rx interrupts */
+#define STI_ENA_VAL_OFFSET 0x64   /* Read enable status  */
+#define STI_ENA_SET_OFFSET 0x84   /* Enable a channel*/
+#define STI_ENA_CLR_OFFSET 0xa4   /* Disable a channel   */
+
+#define MBOX_BASE(mdev, inst)   ((mdev)->base + (inst * 4))
+
+/**
+ * STi Mailbox device data
+ *
+ * An IP Mailbox is currently composed of 4 instances
+ * Each instance is currently composed of 32 channels
+ * This means that we have 128 channels per Mailbox
+ * A channel an be used for TX or RX
+ *
+ * @dev:   Device to which it is attached
+ * @mbox:  Representation of a communication channel controller
+ * @base:  Base address of the register mapping region
+ * @name:  Name of the mailbox
+ * @enabled:   Local copy of enabled channels
+ * @lock:  Mutex protecting enabled status
+ */
+struct sti_mbox_device {
+   struct device   *dev;
+   struct mbox_controller  *mbox;
+   void __iomem*base;
+   const char  *name;
+   u32 enabled[STI_MBOX_INST_MAX];
+   spinlock_t  lock;
+   booltxonly;
+};
+
+/**
+ * STi Mailbox platform specfic configuration
+ *
+ * @num_inst:  Maximum number of instances in one HW Mailbox
+ * @num_chan:  Maximum number of channel per instance
+ */
+struct sti_mbox_pdata {
+   unsigned intnum_inst;
+   unsigned intnum_chan;
+};
+
+/**
+ * STi Mailbox allocated channel information
+ *
+ * @mdev:  Pointer to parent Mailbox device
+ * @instance:  Instance number channel resides in
+ * @channel:   Channel number pertaining to this container
+ */
+struct sti_channel {
+   struct sti_mbox_device  *mdev;
+   unsigned intinstance;
+   unsigned intchannel;
+};
+
+static inline bool sti_mbox_channel_is_enabled(struct mbox_chan *chan)
+{
+   struct sti_channel *chan_info = chan->con_priv;
+   struct sti_mbox_device *mdev = chan_info->mdev;
+   unsigned int instance = chan_info->instance;
+   unsigned int channel = chan_info->channel;
+
+   return mdev->enabled[instance] & BIT(channel);
+}
+
+static inline
+struct mbox_ch