11// SPDX-License-Identifier: GPL-2.0
22/*
33 * Copyright (c) 2018 Pengutronix, Oleksij Rempel <[email protected] > 4+ * Copyright 2022 NXP, Peng Fan <[email protected] > 45 */
56
67#include <linux/clk.h>
2829#define IMX_MU_SECO_TX_TOUT (msecs_to_jiffies(3000))
2930#define IMX_MU_SECO_RX_TOUT (msecs_to_jiffies(3000))
3031
32+ /* Please not change TX & RX */
3133enum imx_mu_chan_type {
32- IMX_MU_TYPE_TX , /* Tx */
33- IMX_MU_TYPE_RX , /* Rx */
34- IMX_MU_TYPE_TXDB , /* Tx doorbell */
35- IMX_MU_TYPE_RXDB , /* Rx doorbell */
34+ IMX_MU_TYPE_TX = 0 , /* Tx */
35+ IMX_MU_TYPE_RX = 1 , /* Rx */
36+ IMX_MU_TYPE_TXDB = 2 , /* Tx doorbell */
37+ IMX_MU_TYPE_RXDB = 3 , /* Rx doorbell */
3638};
3739
3840enum imx_mu_xcr {
@@ -92,6 +94,7 @@ enum imx_mu_type {
9294 IMX_MU_V1 ,
9395 IMX_MU_V2 = BIT (1 ),
9496 IMX_MU_V2_S4 = BIT (15 ),
97+ IMX_MU_V2_IRQ = BIT (16 ),
9598};
9699
97100struct imx_mu_dcfg {
@@ -536,7 +539,7 @@ static int imx_mu_startup(struct mbox_chan *chan)
536539{
537540 struct imx_mu_priv * priv = to_imx_mu_priv (chan -> mbox );
538541 struct imx_mu_con_priv * cp = chan -> con_priv ;
539- unsigned long irq_flag = IRQF_SHARED ;
542+ unsigned long irq_flag = 0 ;
540543 int ret ;
541544
542545 pm_runtime_get_sync (priv -> dev );
@@ -551,11 +554,12 @@ static int imx_mu_startup(struct mbox_chan *chan)
551554 if (!priv -> dev -> pm_domain )
552555 irq_flag |= IRQF_NO_SUSPEND ;
553556
554- ret = request_irq (priv -> irq [0 ], imx_mu_isr , irq_flag ,
555- cp -> irq_desc , chan );
557+ if (!(priv -> dcfg -> type & IMX_MU_V2_IRQ ))
558+ irq_flag |= IRQF_SHARED ;
559+
560+ ret = request_irq (priv -> irq [cp -> type ], imx_mu_isr , irq_flag , cp -> irq_desc , chan );
556561 if (ret ) {
557- dev_err (priv -> dev ,
558- "Unable to acquire IRQ %d\n" , priv -> irq [0 ]);
562+ dev_err (priv -> dev , "Unable to acquire IRQ %d\n" , priv -> irq [cp -> type ]);
559563 return ret ;
560564 }
561565
@@ -598,7 +602,7 @@ static void imx_mu_shutdown(struct mbox_chan *chan)
598602 break ;
599603 }
600604
601- free_irq (priv -> irq [0 ], chan );
605+ free_irq (priv -> irq [cp -> type ], chan );
602606 pm_runtime_put_sync (priv -> dev );
603607}
604608
@@ -749,7 +753,7 @@ static int imx_mu_probe(struct platform_device *pdev)
749753 struct device_node * np = dev -> of_node ;
750754 struct imx_mu_priv * priv ;
751755 const struct imx_mu_dcfg * dcfg ;
752- int ret ;
756+ int i , ret ;
753757 u32 size ;
754758
755759 priv = devm_kzalloc (dev , sizeof (* priv ), GFP_KERNEL );
@@ -762,14 +766,25 @@ static int imx_mu_probe(struct platform_device *pdev)
762766 if (IS_ERR (priv -> base ))
763767 return PTR_ERR (priv -> base );
764768
765- priv -> irq [0 ] = platform_get_irq (pdev , 0 );
766- if (priv -> irq [0 ] < 0 )
767- return priv -> irq [0 ];
768-
769769 dcfg = of_device_get_match_data (dev );
770770 if (!dcfg )
771771 return - EINVAL ;
772772 priv -> dcfg = dcfg ;
773+ if (priv -> dcfg -> type & IMX_MU_V2_IRQ ) {
774+ priv -> irq [IMX_MU_TYPE_TX ] = platform_get_irq_byname (pdev , "tx" );
775+ if (priv -> irq [IMX_MU_TYPE_TX ] < 0 )
776+ return priv -> irq [IMX_MU_TYPE_TX ];
777+ priv -> irq [IMX_MU_TYPE_RX ] = platform_get_irq_byname (pdev , "rx" );
778+ if (priv -> irq [IMX_MU_TYPE_RX ] < 0 )
779+ return priv -> irq [IMX_MU_TYPE_RX ];
780+ } else {
781+ ret = platform_get_irq (pdev , 0 );
782+ if (ret < 0 )
783+ return ret ;
784+
785+ for (i = 0 ; i < IMX_MU_CHANS ; i ++ )
786+ priv -> irq [i ] = ret ;
787+ }
773788
774789 if (priv -> dcfg -> type & IMX_MU_V2_S4 )
775790 size = sizeof (struct imx_s4_rpc_msg_max );
0 commit comments