15
15
#define SUPPORT_SYSRQ
16
16
#endif
17
17
18
+ #include <linux/clk.h>
18
19
#include <linux/err.h>
19
20
#include <linux/module.h>
20
21
#include <linux/device.h>
@@ -783,9 +784,10 @@ static int sccnxp_probe(struct platform_device *pdev)
783
784
struct resource * res = platform_get_resource (pdev , IORESOURCE_MEM , 0 );
784
785
int chiptype = pdev -> id_entry -> driver_data ;
785
786
struct sccnxp_pdata * pdata = dev_get_platdata (& pdev -> dev );
786
- int i , ret , fifosize , freq_min , freq_max ;
787
+ int i , ret , fifosize , freq_min , freq_max , uartclk ;
787
788
struct sccnxp_port * s ;
788
789
void __iomem * membase ;
790
+ struct clk * clk ;
789
791
790
792
membase = devm_ioremap_resource (& pdev -> dev , res );
791
793
if (IS_ERR (membase ))
@@ -898,11 +900,25 @@ static int sccnxp_probe(struct platform_device *pdev)
898
900
} else if (PTR_ERR (s -> regulator ) == - EPROBE_DEFER )
899
901
return - EPROBE_DEFER ;
900
902
901
- if (!pdata ) {
902
- dev_warn (& pdev -> dev ,
903
- "No platform data supplied, using defaults\n" );
904
- s -> pdata .frequency = s -> freq_std ;
903
+ clk = devm_clk_get (& pdev -> dev , NULL );
904
+ if (IS_ERR (clk )) {
905
+ if (PTR_ERR (clk ) == - EPROBE_DEFER ) {
906
+ ret = - EPROBE_DEFER ;
907
+ goto err_out ;
908
+ }
909
+ dev_notice (& pdev -> dev , "Using default clock frequency\n" );
910
+ uartclk = s -> freq_std ;
905
911
} else
912
+ uartclk = clk_get_rate (clk );
913
+
914
+ /* Check input frequency */
915
+ if ((uartclk < freq_min ) || (uartclk > freq_max )) {
916
+ dev_err (& pdev -> dev , "Frequency out of bounds\n" );
917
+ ret = - EINVAL ;
918
+ goto err_out ;
919
+ }
920
+
921
+ if (pdata )
906
922
memcpy (& s -> pdata , pdata , sizeof (struct sccnxp_pdata ));
907
923
908
924
if (s -> pdata .poll_time_us ) {
@@ -920,14 +936,6 @@ static int sccnxp_probe(struct platform_device *pdev)
920
936
}
921
937
}
922
938
923
- /* Check input frequency */
924
- if ((s -> pdata .frequency < freq_min ) ||
925
- (s -> pdata .frequency > freq_max )) {
926
- dev_err (& pdev -> dev , "Frequency out of bounds\n" );
927
- ret = - EINVAL ;
928
- goto err_out ;
929
- }
930
-
931
939
s -> uart .owner = THIS_MODULE ;
932
940
s -> uart .dev_name = "ttySC" ;
933
941
s -> uart .major = SCCNXP_MAJOR ;
@@ -959,7 +967,7 @@ static int sccnxp_probe(struct platform_device *pdev)
959
967
s -> port [i ].mapbase = res -> start ;
960
968
s -> port [i ].membase = membase ;
961
969
s -> port [i ].regshift = s -> pdata .reg_shift ;
962
- s -> port [i ].uartclk = s -> pdata . frequency ;
970
+ s -> port [i ].uartclk = uartclk ;
963
971
s -> port [i ].ops = & sccnxp_ops ;
964
972
uart_add_one_port (& s -> uart , & s -> port [i ]);
965
973
/* Set direction to input */
0 commit comments