Lines Matching +full:x +full:- +full:gene
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * APM X-Gene SLIMpro MailBox Driver
18 #define MBOX_CON_NAME "slimpro-mbox"
35 * X-Gene SlimPRO mailbox channel information
52 * X-Gene SlimPRO Mailbox controller data
54 * X-Gene SlimPRO Mailbox controller has 8 communication channels.
70 writel(msg[1], mb_chan->reg + REG_DB_DOUT0); in mb_chan_send_msg()
71 writel(msg[2], mb_chan->reg + REG_DB_DOUT1); in mb_chan_send_msg()
72 writel(msg[0], mb_chan->reg + REG_DB_OUT); in mb_chan_send_msg()
77 mb_chan->rx_msg[1] = readl(mb_chan->reg + REG_DB_DIN0); in mb_chan_recv_msg()
78 mb_chan->rx_msg[2] = readl(mb_chan->reg + REG_DB_DIN1); in mb_chan_recv_msg()
79 mb_chan->rx_msg[0] = readl(mb_chan->reg + REG_DB_IN); in mb_chan_recv_msg()
84 u32 val = readl(mb_chan->reg + REG_DB_STAT); in mb_chan_status_ack()
87 writel(MBOX_STATUS_ACK_MASK, mb_chan->reg + REG_DB_STAT); in mb_chan_status_ack()
95 u32 val = readl(mb_chan->reg + REG_DB_STAT); in mb_chan_status_avail()
99 writel(MBOX_STATUS_AVAIL_MASK, mb_chan->reg + REG_DB_STAT); in mb_chan_status_avail()
110 mbox_chan_txdone(mb_chan->chan, 0); in slimpro_mbox_irq()
113 mbox_chan_received_data(mb_chan->chan, mb_chan->rx_msg); in slimpro_mbox_irq()
120 struct slimpro_mbox_chan *mb_chan = chan->con_priv; in slimpro_mbox_send_data()
128 struct slimpro_mbox_chan *mb_chan = chan->con_priv; in slimpro_mbox_startup()
132 rc = devm_request_irq(mb_chan->dev, mb_chan->irq, slimpro_mbox_irq, 0, in slimpro_mbox_startup()
135 dev_err(mb_chan->dev, "failed to register mailbox interrupt %d\n", in slimpro_mbox_startup()
136 mb_chan->irq); in slimpro_mbox_startup()
142 mb_chan->reg + REG_DB_STAT); in slimpro_mbox_startup()
144 val = readl(mb_chan->reg + REG_DB_STATMASK); in slimpro_mbox_startup()
146 writel(val, mb_chan->reg + REG_DB_STATMASK); in slimpro_mbox_startup()
153 struct slimpro_mbox_chan *mb_chan = chan->con_priv; in slimpro_mbox_shutdown()
157 val = readl(mb_chan->reg + REG_DB_STATMASK); in slimpro_mbox_shutdown()
159 writel(val, mb_chan->reg + REG_DB_STATMASK); in slimpro_mbox_shutdown()
161 devm_free_irq(mb_chan->dev, mb_chan->irq, mb_chan); in slimpro_mbox_shutdown()
177 ctx = devm_kzalloc(&pdev->dev, sizeof(struct slimpro_mbox), GFP_KERNEL); in slimpro_mbox_probe()
179 return -ENOMEM; in slimpro_mbox_probe()
189 ctx->mc[i].irq = platform_get_irq(pdev, i); in slimpro_mbox_probe()
190 if (ctx->mc[i].irq < 0) { in slimpro_mbox_probe()
192 dev_err(&pdev->dev, "no available IRQ\n"); in slimpro_mbox_probe()
193 return -EINVAL; in slimpro_mbox_probe()
195 dev_info(&pdev->dev, "no IRQ for channel %d\n", i); in slimpro_mbox_probe()
199 ctx->mc[i].dev = &pdev->dev; in slimpro_mbox_probe()
200 ctx->mc[i].reg = mb_base + i * MBOX_REG_SET_OFFSET; in slimpro_mbox_probe()
201 ctx->mc[i].chan = &ctx->chans[i]; in slimpro_mbox_probe()
202 ctx->chans[i].con_priv = &ctx->mc[i]; in slimpro_mbox_probe()
206 ctx->mb_ctrl.dev = &pdev->dev; in slimpro_mbox_probe()
207 ctx->mb_ctrl.chans = ctx->chans; in slimpro_mbox_probe()
208 ctx->mb_ctrl.txdone_irq = true; in slimpro_mbox_probe()
209 ctx->mb_ctrl.ops = &slimpro_mbox_ops; in slimpro_mbox_probe()
210 ctx->mb_ctrl.num_chans = i; in slimpro_mbox_probe()
212 rc = devm_mbox_controller_register(&pdev->dev, &ctx->mb_ctrl); in slimpro_mbox_probe()
214 dev_err(&pdev->dev, in slimpro_mbox_probe()
215 "APM X-Gene SLIMpro MailBox register failed:%d\n", rc); in slimpro_mbox_probe()
219 dev_info(&pdev->dev, "APM X-Gene SLIMpro MailBox registered\n"); in slimpro_mbox_probe()
224 {.compatible = "apm,xgene-slimpro-mbox" },
240 .name = "xgene-slimpro-mbox",
259 MODULE_DESCRIPTION("APM X-Gene SLIMpro Mailbox Driver");