lkml.org 
[lkml]   [2014]   [Nov]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH V5 05/12] mailbox: Add NVIDIA Tegra XUSB mailbox driver
    From
    On Mon, Nov 24, 2014 at 12:34 AM, Jassi Brar <jaswinder.singh@linaro.org> wrote:
    > On 18 November 2014 at 04:11, Andrew Bresticker <abrestic@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.


    \
     
     \ /
      Last update: 2014-11-24 19:01    [W:2.661 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site