Lines Matching +full:mbox +full:- +full:dir
1 // SPDX-License-Identifier: GPL-2.0
94 int dir; member
98 struct mbox_controller mbox; member
112 static struct cix_mbox_priv *to_cix_mbox_priv(struct mbox_controller *mbox) in to_cix_mbox_priv() argument
114 return container_of(mbox, struct cix_mbox_priv, mbox); in to_cix_mbox_priv()
119 if (priv->use_shmem) in cix_mbox_write()
120 iowrite32(val, priv->base + offset - CIX_SHMEM_OFFSET); in cix_mbox_write()
122 iowrite32(val, priv->base + offset); in cix_mbox_write()
127 if (priv->use_shmem) in cix_mbox_read()
128 return ioread32(priv->base + offset - CIX_SHMEM_OFFSET); in cix_mbox_read()
130 return ioread32(priv->base + offset); in cix_mbox_read()
135 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in mbox_fifo_empty()
154 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_send_data_db()
164 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_send_data_reg()
169 return -EINVAL; in cix_mbox_send_data_reg()
173 cix_mbox_write(priv, msg->buf[i], CIX_REG_MSG(i)); in cix_mbox_send_data_reg()
183 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_send_data_fifo()
188 return -EINVAL; in cix_mbox_send_data_fifo()
193 cix_mbox_write(priv, msg->buf[i], CIX_FIFO_WR); in cix_mbox_send_data_fifo()
205 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_send_data_fast()
206 struct cix_mbox_con_priv *cp = chan->con_priv; in cix_mbox_send_data_fast()
208 int index = cp->index; in cix_mbox_send_data_fast()
211 return -EINVAL; in cix_mbox_send_data_fast()
214 dev_err(priv->dev, "Invalid Mbox index %d\n", index); in cix_mbox_send_data_fast()
215 return -EINVAL; in cix_mbox_send_data_fast()
225 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_send_data()
226 struct cix_mbox_con_priv *cp = chan->con_priv; in cix_mbox_send_data()
228 if (priv->dir != CIX_MBOX_TX) { in cix_mbox_send_data()
229 dev_err(priv->dev, "Invalid Mbox dir %d\n", priv->dir); in cix_mbox_send_data()
230 return -EINVAL; in cix_mbox_send_data()
233 switch (cp->type) { in cix_mbox_send_data()
247 dev_err(priv->dev, "Invalid channel type: %d\n", cp->type); in cix_mbox_send_data()
248 return -EINVAL; in cix_mbox_send_data()
255 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_isr_db()
260 if (priv->dir == CIX_MBOX_RX) { in cix_mbox_isr_db()
279 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_isr_reg()
284 if (priv->dir == CIX_MBOX_RX) { in cix_mbox_isr_reg()
310 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_isr_fifo()
315 if (priv->dir == CIX_MBOX_RX) { in cix_mbox_isr_fifo()
331 dev_err(priv->dev, "fifo underflow: int_stats %d\n", status); in cix_mbox_isr_fifo()
349 dev_err(priv->dev, "fifo overlow: int_stats %d\n", status); in cix_mbox_isr_fifo()
357 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_isr_fast()
358 struct cix_mbox_con_priv *cp = chan->con_priv; in cix_mbox_isr_fast()
361 /* no irq will be trigger for TX dir mbox */ in cix_mbox_isr_fast()
362 if (priv->dir != CIX_MBOX_RX) in cix_mbox_isr_fast()
367 if (int_status & CIX_FAST_CH_INT(cp->index)) { in cix_mbox_isr_fast()
368 cix_mbox_write(priv, CIX_FAST_CH_INT(cp->index), CIX_INT_CLEAR); in cix_mbox_isr_fast()
369 data = cix_mbox_read(priv, CIX_REG_F_INT(cp->index)); in cix_mbox_isr_fast()
377 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_isr()
378 struct cix_mbox_con_priv *cp = chan->con_priv; in cix_mbox_isr()
380 switch (cp->type) { in cix_mbox_isr()
394 dev_err(priv->dev, "Invalid channel type: %d\n", cp->type); in cix_mbox_isr()
403 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_startup()
404 struct cix_mbox_con_priv *cp = chan->con_priv; in cix_mbox_startup()
405 int index = cp->index, ret; in cix_mbox_startup()
408 ret = request_irq(priv->irq, cix_mbox_isr, 0, in cix_mbox_startup()
409 dev_name(priv->dev), chan); in cix_mbox_startup()
411 dev_err(priv->dev, "Unable to acquire IRQ %d\n", priv->irq); in cix_mbox_startup()
415 switch (cp->type) { in cix_mbox_startup()
418 chan->txdone_method = TXDONE_BY_ACK; in cix_mbox_startup()
421 if (priv->dir == CIX_MBOX_TX) { in cix_mbox_startup()
438 if (priv->dir == CIX_MBOX_TX) { in cix_mbox_startup()
452 if (priv->dir == CIX_MBOX_RX) { in cix_mbox_startup()
454 dev_err(priv->dev, "Invalid index %d\n", index); in cix_mbox_startup()
455 ret = -EINVAL; in cix_mbox_startup()
465 dev_err(priv->dev, "Invalid channel type: %d\n", cp->type); in cix_mbox_startup()
466 ret = -EINVAL; in cix_mbox_startup()
472 free_irq(priv->irq, chan); in cix_mbox_startup()
478 struct cix_mbox_priv *priv = to_cix_mbox_priv(chan->mbox); in cix_mbox_shutdown()
479 struct cix_mbox_con_priv *cp = chan->con_priv; in cix_mbox_shutdown()
480 int index = cp->index; in cix_mbox_shutdown()
483 switch (cp->type) { in cix_mbox_shutdown()
486 if (priv->dir == CIX_MBOX_TX) { in cix_mbox_shutdown()
491 } else if (priv->dir == CIX_MBOX_RX) { in cix_mbox_shutdown()
499 if (priv->dir == CIX_MBOX_TX) { in cix_mbox_shutdown()
504 } else if (priv->dir == CIX_MBOX_RX) { in cix_mbox_shutdown()
512 if (priv->dir == CIX_MBOX_RX) { in cix_mbox_shutdown()
514 dev_err(priv->dev, "Invalid index %d\n", index); in cix_mbox_shutdown()
525 dev_err(priv->dev, "Invalid channel type: %d\n", cp->type); in cix_mbox_shutdown()
529 free_irq(priv->irq, chan); in cix_mbox_shutdown()
544 cp = &priv->con_priv[i]; in cix_mbox_init()
545 cp->index = i; in cix_mbox_init()
546 cp->chan = &priv->mbox_chans[i]; in cix_mbox_init()
547 priv->mbox_chans[i].con_priv = cp; in cix_mbox_init()
548 if (cp->index <= CIX_MBOX_FAST_IDX) in cix_mbox_init()
549 cp->type = CIX_MBOX_TYPE_FAST; in cix_mbox_init()
550 if (cp->index == CIX_MBOX_DB_IDX) in cix_mbox_init()
551 cp->type = CIX_MBOX_TYPE_DB; in cix_mbox_init()
552 if (cp->index == CIX_MBOX_FIFO_IDX) in cix_mbox_init()
553 cp->type = CIX_MBOX_TYPE_FIFO; in cix_mbox_init()
554 if (cp->index == CIX_MBOX_REG_IDX) in cix_mbox_init()
555 cp->type = CIX_MBOX_TYPE_REG; in cix_mbox_init()
561 struct device *dev = &pdev->dev; in cix_mbox_probe()
569 return -ENOMEM; in cix_mbox_probe()
571 priv->dev = dev; in cix_mbox_probe()
572 priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in cix_mbox_probe()
573 if (IS_ERR(priv->base)) in cix_mbox_probe()
574 return PTR_ERR(priv->base); in cix_mbox_probe()
586 priv->use_shmem = !!(res->start & CIX_SHMEM_OFFSET); in cix_mbox_probe()
588 priv->irq = platform_get_irq(pdev, 0); in cix_mbox_probe()
589 if (priv->irq < 0) in cix_mbox_probe()
590 return priv->irq; in cix_mbox_probe()
592 if (device_property_read_string(dev, "cix,mbox-dir", &dir_str)) { in cix_mbox_probe()
593 dev_err(priv->dev, "cix,mbox_dir property not found\n"); in cix_mbox_probe()
594 return -EINVAL; in cix_mbox_probe()
598 priv->dir = 0; in cix_mbox_probe()
600 priv->dir = 1; in cix_mbox_probe()
602 dev_err(priv->dev, "cix,mbox_dir=%s is not expected\n", dir_str); in cix_mbox_probe()
603 return -EINVAL; in cix_mbox_probe()
608 priv->mbox.dev = dev; in cix_mbox_probe()
609 priv->mbox.ops = &cix_mbox_chan_ops; in cix_mbox_probe()
610 priv->mbox.chans = priv->mbox_chans; in cix_mbox_probe()
611 priv->mbox.txdone_irq = true; in cix_mbox_probe()
612 priv->mbox.num_chans = CIX_MBOX_CHANS; in cix_mbox_probe()
613 priv->mbox.of_xlate = NULL; in cix_mbox_probe()
616 ret = devm_mbox_controller_register(dev, &priv->mbox); in cix_mbox_probe()
624 { .compatible = "cix,sky1-mbox" },