34
34
#define STM32F4_ADC_ADCPRE_SHIFT 16
35
35
#define STM32F4_ADC_ADCPRE_MASK GENMASK(17, 16)
36
36
37
- /* STM32 F4 maximum analog clock rate (from datasheet) */
38
- #define STM32F4_ADC_MAX_CLK_RATE 36000000
39
-
40
37
/* STM32H7 - common registers for all ADC instances */
41
38
#define STM32H7_ADC_CSR (STM32_ADCX_COMN_OFFSET + 0x00)
42
39
#define STM32H7_ADC_CCR (STM32_ADCX_COMN_OFFSET + 0x08)
51
48
#define STM32H7_CKMODE_SHIFT 16
52
49
#define STM32H7_CKMODE_MASK GENMASK(17, 16)
53
50
54
- /* STM32 H7 maximum analog clock rate (from datasheet) */
55
- #define STM32H7_ADC_MAX_CLK_RATE 36000000
56
-
57
51
/**
58
52
* stm32_adc_common_regs - stm32 common registers, compatible dependent data
59
53
* @csr: common status register offset
@@ -74,15 +68,17 @@ struct stm32_adc_priv;
74
68
* stm32_adc_priv_cfg - stm32 core compatible configuration data
75
69
* @regs: common registers for all instances
76
70
* @clk_sel: clock selection routine
71
+ * @max_clk_rate_hz: maximum analog clock rate (Hz, from datasheet)
77
72
*/
78
73
struct stm32_adc_priv_cfg {
79
74
const struct stm32_adc_common_regs * regs ;
80
75
int (* clk_sel )(struct platform_device * , struct stm32_adc_priv * );
76
+ u32 max_clk_rate_hz ;
81
77
};
82
78
83
79
/**
84
80
* struct stm32_adc_priv - stm32 ADC core private data
85
- * @irq: irq for ADC block
81
+ * @irq: irq(s) for ADC block
86
82
* @domain: irq domain reference
87
83
* @aclk: clock reference for the analog circuitry
88
84
* @bclk: bus clock common for all ADCs, depends on part used
@@ -91,7 +87,7 @@ struct stm32_adc_priv_cfg {
91
87
* @common: common data for all ADC instances
92
88
*/
93
89
struct stm32_adc_priv {
94
- int irq ;
90
+ int irq [ STM32_ADC_MAX_ADCS ] ;
95
91
struct irq_domain * domain ;
96
92
struct clk * aclk ;
97
93
struct clk * bclk ;
@@ -133,7 +129,7 @@ static int stm32f4_adc_clk_sel(struct platform_device *pdev,
133
129
}
134
130
135
131
for (i = 0 ; i < ARRAY_SIZE (stm32f4_pclk_div ); i ++ ) {
136
- if ((rate / stm32f4_pclk_div [i ]) <= STM32F4_ADC_MAX_CLK_RATE )
132
+ if ((rate / stm32f4_pclk_div [i ]) <= priv -> cfg -> max_clk_rate_hz )
137
133
break ;
138
134
}
139
135
if (i >= ARRAY_SIZE (stm32f4_pclk_div )) {
@@ -222,7 +218,7 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,
222
218
if (ckmode )
223
219
continue ;
224
220
225
- if ((rate / div ) <= STM32H7_ADC_MAX_CLK_RATE )
221
+ if ((rate / div ) <= priv -> cfg -> max_clk_rate_hz )
226
222
goto out ;
227
223
}
228
224
}
@@ -242,7 +238,7 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,
242
238
if (!ckmode )
243
239
continue ;
244
240
245
- if ((rate / div ) <= STM32H7_ADC_MAX_CLK_RATE )
241
+ if ((rate / div ) <= priv -> cfg -> max_clk_rate_hz )
246
242
goto out ;
247
243
}
248
244
@@ -328,11 +324,24 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,
328
324
struct stm32_adc_priv * priv )
329
325
{
330
326
struct device_node * np = pdev -> dev .of_node ;
327
+ unsigned int i ;
328
+
329
+ for (i = 0 ; i < STM32_ADC_MAX_ADCS ; i ++ ) {
330
+ priv -> irq [i ] = platform_get_irq (pdev , i );
331
+ if (priv -> irq [i ] < 0 ) {
332
+ /*
333
+ * At least one interrupt must be provided, make others
334
+ * optional:
335
+ * - stm32f4/h7 shares a common interrupt.
336
+ * - stm32mp1, has one line per ADC (either for ADC1,
337
+ * ADC2 or both).
338
+ */
339
+ if (i && priv -> irq [i ] == - ENXIO )
340
+ continue ;
341
+ dev_err (& pdev -> dev , "failed to get irq\n" );
331
342
332
- priv -> irq = platform_get_irq (pdev , 0 );
333
- if (priv -> irq < 0 ) {
334
- dev_err (& pdev -> dev , "failed to get irq\n" );
335
- return priv -> irq ;
343
+ return priv -> irq [i ];
344
+ }
336
345
}
337
346
338
347
priv -> domain = irq_domain_add_simple (np , STM32_ADC_MAX_ADCS , 0 ,
@@ -343,8 +352,12 @@ static int stm32_adc_irq_probe(struct platform_device *pdev,
343
352
return - ENOMEM ;
344
353
}
345
354
346
- irq_set_chained_handler (priv -> irq , stm32_adc_irq_handler );
347
- irq_set_handler_data (priv -> irq , priv );
355
+ for (i = 0 ; i < STM32_ADC_MAX_ADCS ; i ++ ) {
356
+ if (priv -> irq [i ] < 0 )
357
+ continue ;
358
+ irq_set_chained_handler (priv -> irq [i ], stm32_adc_irq_handler );
359
+ irq_set_handler_data (priv -> irq [i ], priv );
360
+ }
348
361
349
362
return 0 ;
350
363
}
@@ -353,11 +366,17 @@ static void stm32_adc_irq_remove(struct platform_device *pdev,
353
366
struct stm32_adc_priv * priv )
354
367
{
355
368
int hwirq ;
369
+ unsigned int i ;
356
370
357
371
for (hwirq = 0 ; hwirq < STM32_ADC_MAX_ADCS ; hwirq ++ )
358
372
irq_dispose_mapping (irq_find_mapping (priv -> domain , hwirq ));
359
373
irq_domain_remove (priv -> domain );
360
- irq_set_chained_handler (priv -> irq , NULL );
374
+
375
+ for (i = 0 ; i < STM32_ADC_MAX_ADCS ; i ++ ) {
376
+ if (priv -> irq [i ] < 0 )
377
+ continue ;
378
+ irq_set_chained_handler (priv -> irq [i ], NULL );
379
+ }
361
380
}
362
381
363
382
static int stm32_adc_probe (struct platform_device * pdev )
@@ -497,11 +516,19 @@ static int stm32_adc_remove(struct platform_device *pdev)
497
516
static const struct stm32_adc_priv_cfg stm32f4_adc_priv_cfg = {
498
517
.regs = & stm32f4_adc_common_regs ,
499
518
.clk_sel = stm32f4_adc_clk_sel ,
519
+ .max_clk_rate_hz = 36000000 ,
500
520
};
501
521
502
522
static const struct stm32_adc_priv_cfg stm32h7_adc_priv_cfg = {
503
523
.regs = & stm32h7_adc_common_regs ,
504
524
.clk_sel = stm32h7_adc_clk_sel ,
525
+ .max_clk_rate_hz = 36000000 ,
526
+ };
527
+
528
+ static const struct stm32_adc_priv_cfg stm32mp1_adc_priv_cfg = {
529
+ .regs = & stm32h7_adc_common_regs ,
530
+ .clk_sel = stm32h7_adc_clk_sel ,
531
+ .max_clk_rate_hz = 40000000 ,
505
532
};
506
533
507
534
static const struct of_device_id stm32_adc_of_match [] = {
@@ -511,6 +538,9 @@ static const struct of_device_id stm32_adc_of_match[] = {
511
538
}, {
512
539
.compatible = "st,stm32h7-adc-core" ,
513
540
.data = (void * )& stm32h7_adc_priv_cfg
541
+ }, {
542
+ .compatible = "st,stm32mp1-adc-core" ,
543
+ .data = (void * )& stm32mp1_adc_priv_cfg
514
544
}, {
515
545
},
516
546
};
0 commit comments