[PATCH V5 05/12] mailbox: Add NVIDIA Tegra XUSB mailbox driver
Andrew Bresticker
abrestic at chromium.org
Mon Nov 24 09:20:07 PST 2014
On Mon, Nov 24, 2014 at 12:34 AM, Jassi Brar <jaswinder.singh at linaro.org> wrote:
> On 18 November 2014 at 04:11, Andrew Bresticker <abrestic at chromium.org> wrote:
>
>> +
>> +static int tegra_xusb_mbox_send_data(struct mbox_chan *chan, void *data)
>> +{
>> + struct tegra_xusb_mbox *mbox = to_tegra_mbox(chan->mbox);
>> + struct tegra_xusb_mbox_msg *msg = data;
>> + unsigned long flags;
>> + u32 reg, owner;
>> +
>> + dev_dbg(mbox->mbox.dev, "TX message %#x:%#x\n", msg->cmd, msg->data);
>> +
>> + /* ACK/NAK must be sent with the controller as the mailbox owner */
>> + if (msg->cmd == MBOX_CMD_ACK || msg->cmd == MBOX_CMD_NAK)
>> + owner = MBOX_OWNER_FW;
>> + else
>> + owner = MBOX_OWNER_SW;
>> +
>> + spin_lock_irqsave(&mbox->lock, flags);
>> +
>> + /* Acquire mailbox */
>> + if (mbox_readl(mbox, XUSB_CFG_ARU_MBOX_OWNER) != MBOX_OWNER_NONE) {
>> + dev_err(mbox->mbox.dev, "Mailbox not idle\n");
>> + goto busy;
>> + }
>> + mbox_writel(mbox, owner, XUSB_CFG_ARU_MBOX_OWNER);
>> + if (mbox_readl(mbox, XUSB_CFG_ARU_MBOX_OWNER) != owner) {
>> + dev_err(mbox->mbox.dev, "Failed to acquire mailbox");
>> + goto busy;
>> + }
>> +
>> + mbox_writel(mbox, mbox_pack_msg(msg), XUSB_CFG_ARU_MBOX_DATA_IN);
>> + reg = mbox_readl(mbox, XUSB_CFG_ARU_MBOX_CMD);
>> + reg |= MBOX_INT_EN | MBOX_DEST_FALC;
>> + mbox_writel(mbox, reg, XUSB_CFG_ARU_MBOX_CMD);
>> +
>> + spin_unlock_irqrestore(&mbox->lock, flags);
>> +
>> + return 0;
>> +busy:
>> + spin_unlock_irqrestore(&mbox->lock, flags);
>> + return -EBUSY;
>> +}
>> +
>> +static int tegra_xusb_mbox_startup(struct mbox_chan *chan)
>> +{
>> + return 0;
>> +}
>> +
>> +static void tegra_xusb_mbox_shutdown(struct mbox_chan *chan)
>> +{
>> +}
>> +
>> +static bool tegra_xusb_mbox_last_tx_done(struct mbox_chan *chan)
>> +{
>> + /*
>> + * Transmissions are assumed to be completed as soon as they are
>> + * written to the mailbox.
>> + */
>> + return true;
>>
> In .send_data() you you mark the channel busy by setting the
> XUSB_CFG_ARU_MBOX_OWNER to !MBOX_OWNER_NONE, which remains so until
> you get an IRQ. So maybe you should check for the OWNER_NONE flag in
> .last_tx_done()?
Ah, you're right. It does look like the controller firmware clears MBOX_OWNER.
More information about the linux-arm-kernel
mailing list