#include <linux/bitfield.h>
#include <linux/bitops.h>
#include <linux/bits.h>
#include <linux/cleanup.h>
#include <linux/device.h>
#include <linux/interrupt.h>
#include <linux/mailbox_controller.h>
#include <linux/module.h>
#include <linux/of_address.h>
#include <linux/platform_device.h>
#include <linux/spinlock.h>
#include <linux/sizes.h>
#include <linux/slab.h>
#include <linux/types.h>
#define MHUV3_DBCW_MAX …
#define MHUV3_DBCH_CMB_INT_ST_REG_CNT …
#define MHUV3_FFCH_CMB_INT_ST_REG_CNT …
#define MHUV3_FLAG_BITS …
#define MHUV3_MAJOR_VERSION …
enum { … };
struct blk_id { … } __packed;
struct feat_spt0 { … } __packed;
struct feat_spt1 { … } __packed;
struct dbch_cfg0 { … } __packed;
struct ffch_cfg0 { … } __packed;
struct fch_cfg0 { … } __packed;
struct ctrl { … } __packed;
struct fch_ctrl { … } __packed;
struct iidr { … } __packed;
struct aidr { … } __packed;
struct ctrl_page { … } __packed;
struct xbcw_ctrl { … } __packed;
struct pdbcw_int { … } __packed;
struct pdbcw_page { … } __packed;
struct mdbcw_page { … } __packed;
struct dummy_page { … } __packed;
struct mhu3_pbx_frame_reg { … } __packed;
struct mhu3_mbx_frame_reg { … } __packed;
#define readl_relaxed_bitmask(_regptr, _bitmask) …
#define writel_relaxed_bitmask(_value, _regptr, _bitmask) …
enum mhuv3_frame { … };
static char *mhuv3_str[] = …;
enum mhuv3_extension_type { … };
static char *mhuv3_ext_str[] = …;
struct mhuv3;
struct mhuv3_protocol_ops { … };
struct mhuv3_mbox_chan_priv { … };
struct mhuv3_extension { … };
struct mhuv3 { … };
#define mhu_from_mbox(_mbox) …
mhuv3_extension_initializer;
static void mhuv3_doorbell_tx_startup(struct mhuv3 *mhu, struct mbox_chan *chan)
{ … }
static void mhuv3_doorbell_tx_shutdown(struct mhuv3 *mhu, struct mbox_chan *chan)
{ … }
static int mhuv3_doorbell_rx_startup(struct mhuv3 *mhu, struct mbox_chan *chan)
{ … }
static void mhuv3_doorbell_rx_shutdown(struct mhuv3 *mhu,
struct mbox_chan *chan)
{ … }
static void mhuv3_doorbell_rx_complete(struct mhuv3 *mhu, struct mbox_chan *chan)
{ … }
static int mhuv3_doorbell_last_tx_done(struct mhuv3 *mhu,
struct mbox_chan *chan)
{ … }
static int mhuv3_doorbell_send_data(struct mhuv3 *mhu, struct mbox_chan *chan,
void *arg)
{ … }
static const struct mhuv3_protocol_ops mhuv3_doorbell_ops = …;
static bool mhuv3_sender_last_tx_done(struct mbox_chan *chan)
{ … }
static int mhuv3_sender_send_data(struct mbox_chan *chan, void *data)
{ … }
static int mhuv3_sender_startup(struct mbox_chan *chan)
{ … }
static void mhuv3_sender_shutdown(struct mbox_chan *chan)
{ … }
static const struct mbox_chan_ops mhuv3_sender_ops = …;
static int mhuv3_receiver_startup(struct mbox_chan *chan)
{ … }
static void mhuv3_receiver_shutdown(struct mbox_chan *chan)
{ … }
static int mhuv3_receiver_send_data(struct mbox_chan *chan, void *data)
{ … }
static bool mhuv3_receiver_last_tx_done(struct mbox_chan *chan)
{ … }
static const struct mbox_chan_ops mhuv3_receiver_ops = …;
static struct mbox_chan *mhuv3_dbe_mbox_of_xlate(struct mhuv3 *mhu,
unsigned int channel,
unsigned int doorbell)
{ … }
static void mhuv3_dbe_combined_irq_setup(struct mhuv3 *mhu)
{ … }
static int mhuv3_dbe_channels_init(struct mhuv3 *mhu)
{ … }
static bool mhuv3_dbe_doorbell_lookup(struct mhuv3 *mhu, unsigned int channel,
unsigned int *db)
{ … }
static struct mbox_chan *mhuv3_dbe_chan_from_comb_irq_get(struct mhuv3 *mhu)
{ … }
static int mhuv3_dbe_init(struct mhuv3 *mhu)
{ … }
static int mhuv3_fce_init(struct mhuv3 *mhu)
{ … }
static int mhuv3_fe_init(struct mhuv3 *mhu)
{ … }
static mhuv3_extension_initializer mhuv3_extension_init[NUM_EXT] = …;
static int mhuv3_initialize_channels(struct device *dev, struct mhuv3 *mhu)
{ … }
static struct mbox_chan *mhuv3_mbox_of_xlate(struct mbox_controller *mbox,
const struct of_phandle_args *pa)
{ … }
static void mhu_frame_cleanup_actions(void *data)
{ … }
static int mhuv3_frame_init(struct mhuv3 *mhu, void __iomem *regs)
{ … }
static irqreturn_t mhuv3_pbx_comb_interrupt(int irq, void *arg)
{ … }
static irqreturn_t mhuv3_mbx_comb_interrupt(int irq, void *arg)
{ … }
static int mhuv3_setup_pbx(struct mhuv3 *mhu)
{ … }
static int mhuv3_setup_mbx(struct mhuv3 *mhu)
{ … }
static int mhuv3_irqs_init(struct mhuv3 *mhu, struct platform_device *pdev)
{ … }
static int mhuv3_probe(struct platform_device *pdev)
{ … }
static const struct of_device_id mhuv3_of_match[] = …;
MODULE_DEVICE_TABLE(of, mhuv3_of_match);
static struct platform_driver mhuv3_driver = …;
module_platform_driver(…) …;
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_AUTHOR(…) …;