@@ -856,6 +856,8 @@ static void s3c24xx_serial_break_ctl(struct uart_port *port, int break_state)
856
856
static int s3c24xx_serial_request_dma (struct s3c24xx_uart_port * p )
857
857
{
858
858
struct s3c24xx_uart_dma * dma = p -> dma ;
859
+ struct dma_slave_caps dma_caps ;
860
+ const char * reason = NULL ;
859
861
int ret ;
860
862
861
863
/* Default slave configuration parameters */
@@ -871,17 +873,37 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
871
873
872
874
dma -> rx_chan = dma_request_chan (p -> port .dev , "rx" );
873
875
874
- if (IS_ERR (dma -> rx_chan ))
875
- return PTR_ERR (dma -> rx_chan );
876
+ if (IS_ERR (dma -> rx_chan )) {
877
+ reason = "DMA RX channel request failed" ;
878
+ ret = PTR_ERR (dma -> rx_chan );
879
+ goto err_warn ;
880
+ }
881
+
882
+ ret = dma_get_slave_caps (dma -> rx_chan , & dma_caps );
883
+ if (ret < 0 ||
884
+ dma_caps .residue_granularity < DMA_RESIDUE_GRANULARITY_BURST ) {
885
+ reason = "insufficient DMA RX engine capabilities" ;
886
+ ret = - EOPNOTSUPP ;
887
+ goto err_release_rx ;
888
+ }
876
889
877
890
dmaengine_slave_config (dma -> rx_chan , & dma -> rx_conf );
878
891
879
892
dma -> tx_chan = dma_request_chan (p -> port .dev , "tx" );
880
893
if (IS_ERR (dma -> tx_chan )) {
894
+ reason = "DMA TX channel request failed" ;
881
895
ret = PTR_ERR (dma -> tx_chan );
882
896
goto err_release_rx ;
883
897
}
884
898
899
+ ret = dma_get_slave_caps (dma -> tx_chan , & dma_caps );
900
+ if (ret < 0 ||
901
+ dma_caps .residue_granularity < DMA_RESIDUE_GRANULARITY_BURST ) {
902
+ reason = "insufficient DMA TX engine capabilities" ;
903
+ ret = - EOPNOTSUPP ;
904
+ goto err_release_tx ;
905
+ }
906
+
885
907
dmaengine_slave_config (dma -> tx_chan , & dma -> tx_conf );
886
908
887
909
/* RX buffer */
@@ -896,6 +918,7 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
896
918
dma -> rx_addr = dma_map_single (p -> port .dev , dma -> rx_buf ,
897
919
dma -> rx_size , DMA_FROM_DEVICE );
898
920
if (dma_mapping_error (p -> port .dev , dma -> rx_addr )) {
921
+ reason = "DMA mapping error for RX buffer" ;
899
922
ret = - EIO ;
900
923
goto err_free_rx ;
901
924
}
@@ -904,6 +927,7 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
904
927
dma -> tx_addr = dma_map_single (p -> port .dev , p -> port .state -> xmit .buf ,
905
928
UART_XMIT_SIZE , DMA_TO_DEVICE );
906
929
if (dma_mapping_error (p -> port .dev , dma -> tx_addr )) {
930
+ reason = "DMA mapping error for TX buffer" ;
907
931
ret = - EIO ;
908
932
goto err_unmap_rx ;
909
933
}
@@ -919,6 +943,9 @@ static int s3c24xx_serial_request_dma(struct s3c24xx_uart_port *p)
919
943
dma_release_channel (dma -> tx_chan );
920
944
err_release_rx :
921
945
dma_release_channel (dma -> rx_chan );
946
+ err_warn :
947
+ if (reason )
948
+ dev_warn (p -> port .dev , "%s, DMA will not be used\n" , reason );
922
949
return ret ;
923
950
}
924
951
@@ -1037,8 +1064,6 @@ static int s3c64xx_serial_startup(struct uart_port *port)
1037
1064
if (ourport -> dma ) {
1038
1065
ret = s3c24xx_serial_request_dma (ourport );
1039
1066
if (ret < 0 ) {
1040
- dev_warn (port -> dev ,
1041
- "DMA request failed, DMA will not be used\n" );
1042
1067
devm_kfree (port -> dev , ourport -> dma );
1043
1068
ourport -> dma = NULL ;
1044
1069
}
0 commit comments