82
82
#define TCR_RXMSK BIT(19)
83
83
#define TCR_TXMSK BIT(18)
84
84
85
+ struct fsl_lpspi_devtype_data {
86
+ u8 prescale_max ;
87
+ };
88
+
85
89
struct lpspi_config {
86
90
u8 bpw ;
87
91
u8 chip_select ;
@@ -119,10 +123,25 @@ struct fsl_lpspi_data {
119
123
bool usedma ;
120
124
struct completion dma_rx_completion ;
121
125
struct completion dma_tx_completion ;
126
+
127
+ const struct fsl_lpspi_devtype_data * devtype_data ;
128
+ };
129
+
130
+ /*
131
+ * ERR051608 fixed or not:
132
+ * https://www.nxp.com/docs/en/errata/i.MX93_1P87f.pdf
133
+ */
134
+ static struct fsl_lpspi_devtype_data imx93_lpspi_devtype_data = {
135
+ .prescale_max = 1 ,
136
+ };
137
+
138
+ static struct fsl_lpspi_devtype_data imx7ulp_lpspi_devtype_data = {
139
+ .prescale_max = 8 ,
122
140
};
123
141
124
142
static const struct of_device_id fsl_lpspi_dt_ids [] = {
125
- { .compatible = "fsl,imx7ulp-spi" , },
143
+ { .compatible = "fsl,imx7ulp-spi" , .data = & imx7ulp_lpspi_devtype_data ,},
144
+ { .compatible = "fsl,imx93-spi" , .data = & imx93_lpspi_devtype_data ,},
126
145
{ /* sentinel */ }
127
146
};
128
147
MODULE_DEVICE_TABLE (of , fsl_lpspi_dt_ids );
@@ -297,9 +316,11 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
297
316
{
298
317
struct lpspi_config config = fsl_lpspi -> config ;
299
318
unsigned int perclk_rate , scldiv , div ;
319
+ u8 prescale_max ;
300
320
u8 prescale ;
301
321
302
322
perclk_rate = clk_get_rate (fsl_lpspi -> clk_per );
323
+ prescale_max = fsl_lpspi -> devtype_data -> prescale_max ;
303
324
304
325
if (!config .speed_hz ) {
305
326
dev_err (fsl_lpspi -> dev ,
@@ -315,7 +336,7 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
315
336
316
337
div = DIV_ROUND_UP (perclk_rate , config .speed_hz );
317
338
318
- for (prescale = 0 ; prescale < 8 ; prescale ++ ) {
339
+ for (prescale = 0 ; prescale < prescale_max ; prescale ++ ) {
319
340
scldiv = div / (1 << prescale ) - 2 ;
320
341
if (scldiv < 256 ) {
321
342
fsl_lpspi -> config .prescale = prescale ;
@@ -822,6 +843,7 @@ static int fsl_lpspi_init_rpm(struct fsl_lpspi_data *fsl_lpspi)
822
843
823
844
static int fsl_lpspi_probe (struct platform_device * pdev )
824
845
{
846
+ const struct fsl_lpspi_devtype_data * devtype_data ;
825
847
struct fsl_lpspi_data * fsl_lpspi ;
826
848
struct spi_controller * controller ;
827
849
struct resource * res ;
@@ -830,6 +852,10 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
830
852
u32 temp ;
831
853
bool is_target ;
832
854
855
+ devtype_data = of_device_get_match_data (& pdev -> dev );
856
+ if (!devtype_data )
857
+ return - ENODEV ;
858
+
833
859
is_target = of_property_read_bool ((& pdev -> dev )-> of_node , "spi-slave" );
834
860
if (is_target )
835
861
controller = devm_spi_alloc_target (& pdev -> dev ,
@@ -848,6 +874,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
848
874
fsl_lpspi -> is_target = is_target ;
849
875
fsl_lpspi -> is_only_cs1 = of_property_read_bool ((& pdev -> dev )-> of_node ,
850
876
"fsl,spi-only-use-cs1-sel" );
877
+ fsl_lpspi -> devtype_data = devtype_data ;
851
878
852
879
init_completion (& fsl_lpspi -> xfer_done );
853
880
0 commit comments