179
179
struct s32k1xx_uart_s
180
180
{
181
181
struct uart_dev_s dev ; /* Generic UART device */
182
+ spinlock_t lock ; /* Spinlock */
182
183
uint32_t uartbase ; /* Base address of UART registers */
183
184
uint32_t baud ; /* Configured baud */
184
185
uint32_t ie ; /* Saved enabled interrupts */
@@ -450,6 +451,7 @@ static struct s32k1xx_uart_s g_lpuart0priv =
450
451
# endif
451
452
.priv = & g_lpuart0priv ,
452
453
},
454
+ .lock = SP_UNLOCKED ,
453
455
.uartbase = S32K1XX_LPUART0_BASE ,
454
456
.baud = CONFIG_LPUART0_BAUD ,
455
457
.irq = S32K1XX_IRQ_LPUART0 ,
@@ -515,6 +517,7 @@ static struct s32k1xx_uart_s g_lpuart1priv =
515
517
.priv = & g_lpuart1priv ,
516
518
},
517
519
520
+ .lock = SP_UNLOCKED ,
518
521
.uartbase = S32K1XX_LPUART1_BASE ,
519
522
.baud = CONFIG_LPUART1_BAUD ,
520
523
.irq = S32K1XX_IRQ_LPUART1 ,
@@ -577,6 +580,7 @@ static struct s32k1xx_uart_s g_lpuart2priv =
577
580
.priv = & g_lpuart2priv ,
578
581
},
579
582
583
+ .lock = SP_UNLOCKED ,
580
584
.uartbase = S32K1XX_LPUART2_BASE ,
581
585
.baud = CONFIG_LPUART2_BAUD ,
582
586
.irq = S32K1XX_IRQ_LPUART2 ,
@@ -669,10 +673,8 @@ static int s32k1xx_dma_nextrx(struct s32k1xx_uart_s *priv)
669
673
static inline void s32k1xx_disableuartint (struct s32k1xx_uart_s * priv ,
670
674
uint32_t * ie )
671
675
{
672
- irqstate_t flags ;
673
676
uint32_t regval ;
674
677
675
- flags = spin_lock_irqsave (NULL );
676
678
regval = s32k1xx_serialin (priv , S32K1XX_LPUART_CTRL_OFFSET );
677
679
678
680
/* Return the current Rx and Tx interrupt state */
@@ -684,7 +686,6 @@ static inline void s32k1xx_disableuartint(struct s32k1xx_uart_s *priv,
684
686
685
687
regval &= ~LPUART_ALL_INTS ;
686
688
s32k1xx_serialout (priv , S32K1XX_LPUART_CTRL_OFFSET , regval );
687
- spin_unlock_irqrestore (NULL , flags );
688
689
}
689
690
690
691
/****************************************************************************
@@ -694,19 +695,16 @@ static inline void s32k1xx_disableuartint(struct s32k1xx_uart_s *priv,
694
695
static inline void s32k1xx_restoreuartint (struct s32k1xx_uart_s * priv ,
695
696
uint32_t ie )
696
697
{
697
- irqstate_t flags ;
698
698
uint32_t regval ;
699
699
700
700
/* Enable/disable any interrupts that are currently disabled but should be
701
701
* enabled/disabled.
702
702
*/
703
703
704
- flags = spin_lock_irqsave (NULL );
705
704
regval = s32k1xx_serialin (priv , S32K1XX_LPUART_CTRL_OFFSET );
706
705
regval &= ~LPUART_ALL_INTS ;
707
706
regval |= ie ;
708
707
s32k1xx_serialout (priv , S32K1XX_LPUART_CTRL_OFFSET , regval );
709
- spin_unlock_irqrestore (NULL , flags );
710
708
}
711
709
712
710
/****************************************************************************
@@ -1329,15 +1327,15 @@ static int s32k1xx_ioctl(struct file *filep, int cmd, unsigned long arg)
1329
1327
* implement TCSADRAIN / TCSAFLUSH
1330
1328
*/
1331
1329
1332
- flags = spin_lock_irqsave (NULL );
1330
+ flags = spin_lock_irqsave (& priv -> lock );
1333
1331
s32k1xx_disableuartint (priv , & ie );
1334
1332
ret = dev -> ops -> setup (dev );
1335
1333
1336
1334
/* Restore the interrupt state */
1337
1335
1338
1336
s32k1xx_restoreuartint (priv , ie );
1339
1337
priv -> ie = ie ;
1340
- spin_unlock_irqrestore (NULL , flags );
1338
+ spin_unlock_irqrestore (& priv -> lock , flags );
1341
1339
}
1342
1340
}
1343
1341
break ;
@@ -1351,7 +1349,7 @@ static int s32k1xx_ioctl(struct file *filep, int cmd, unsigned long arg)
1351
1349
uint32_t regval ;
1352
1350
struct s32k1xx_uart_s * priv = (struct s32k1xx_uart_s * )dev -> priv ;
1353
1351
1354
- flags = spin_lock_irqsave (NULL );
1352
+ flags = spin_lock_irqsave (& priv -> lock );
1355
1353
ctrl = s32k1xx_serialin (priv , S32K1XX_LPUART_CTRL_OFFSET );
1356
1354
stat = s32k1xx_serialin (priv , S32K1XX_LPUART_STAT_OFFSET );
1357
1355
regval = ctrl ;
@@ -1387,7 +1385,7 @@ static int s32k1xx_ioctl(struct file *filep, int cmd, unsigned long arg)
1387
1385
s32k1xx_serialout (priv , S32K1XX_LPUART_STAT_OFFSET , stat );
1388
1386
s32k1xx_serialout (priv , S32K1XX_LPUART_CTRL_OFFSET , ctrl );
1389
1387
1390
- spin_unlock_irqrestore (NULL , flags );
1388
+ spin_unlock_irqrestore (& priv -> lock , flags );
1391
1389
}
1392
1390
break ;
1393
1391
#endif
@@ -1441,7 +1439,7 @@ static void s32k1xx_rxint(struct uart_dev_s *dev, bool enable)
1441
1439
1442
1440
/* Enable interrupts for data available at Rx */
1443
1441
1444
- flags = spin_lock_irqsave (NULL );
1442
+ flags = spin_lock_irqsave (& priv -> lock );
1445
1443
if (enable )
1446
1444
{
1447
1445
#ifndef CONFIG_SUPPRESS_SERIAL_INTS
@@ -1457,7 +1455,7 @@ static void s32k1xx_rxint(struct uart_dev_s *dev, bool enable)
1457
1455
regval &= ~LPUART_ALL_INTS ;
1458
1456
regval |= priv -> ie ;
1459
1457
s32k1xx_serialout (priv , S32K1XX_LPUART_CTRL_OFFSET , regval );
1460
- spin_unlock_irqrestore (NULL , flags );
1458
+ spin_unlock_irqrestore (& priv -> lock , flags );
1461
1459
}
1462
1460
#endif
1463
1461
@@ -1890,7 +1888,7 @@ static void s32k1xx_txint(struct uart_dev_s *dev, bool enable)
1890
1888
1891
1889
/* Enable interrupt for TX complete */
1892
1890
1893
- flags = spin_lock_irqsave (NULL );
1891
+ flags = spin_lock_irqsave (& priv -> lock );
1894
1892
if (enable )
1895
1893
{
1896
1894
#ifndef CONFIG_SUPPRESS_SERIAL_INTS
@@ -1906,7 +1904,7 @@ static void s32k1xx_txint(struct uart_dev_s *dev, bool enable)
1906
1904
regval &= ~LPUART_ALL_INTS ;
1907
1905
regval |= priv -> ie ;
1908
1906
s32k1xx_serialout (priv , S32K1XX_LPUART_CTRL_OFFSET , regval );
1909
- spin_unlock_irqrestore (NULL , flags );
1907
+ spin_unlock_irqrestore (& priv -> lock , flags );
1910
1908
}
1911
1909
#endif
1912
1910
@@ -2549,11 +2547,14 @@ void up_putc(int ch)
2549
2547
#ifdef CONSOLE_DEV
2550
2548
struct s32k1xx_uart_s * priv =
2551
2549
(struct s32k1xx_uart_s * )CONSOLE_DEV .dev .priv ;
2550
+ irqstate_t flags ;
2552
2551
uint32_t ie ;
2553
2552
2553
+ flags = spin_lock_irqsave (& priv -> lock );
2554
2554
s32k1xx_disableuartint (priv , & ie );
2555
2555
s32k1xx_lowputc (ch );
2556
2556
s32k1xx_restoreuartint (priv , ie );
2557
+ spin_unlock_irqrestore (& priv -> lock , flags );
2557
2558
#endif
2558
2559
}
2559
2560
0 commit comments