@@ -98,6 +98,7 @@ struct meson_pwm_channel {
98
98
99
99
struct meson_pwm_data {
100
100
const char * const parent_names [MESON_NUM_MUX_PARENTS ];
101
+ int (* channels_init )(struct pwm_chip * chip );
101
102
};
102
103
103
104
struct meson_pwm {
@@ -338,86 +339,16 @@ static const struct pwm_ops meson_pwm_ops = {
338
339
.get_state = meson_pwm_get_state ,
339
340
};
340
341
341
- static const struct meson_pwm_data pwm_meson8b_data = {
342
- .parent_names = { "xtal" , NULL , "fclk_div4" , "fclk_div3" },
343
- };
344
-
345
- /*
346
- * Only the 2 first inputs of the GXBB AO PWMs are valid
347
- * The last 2 are grounded
348
- */
349
- static const struct meson_pwm_data pwm_gxbb_ao_data = {
350
- .parent_names = { "xtal" , "clk81" , NULL , NULL },
351
- };
352
-
353
- static const struct meson_pwm_data pwm_axg_ee_data = {
354
- .parent_names = { "xtal" , "fclk_div5" , "fclk_div4" , "fclk_div3" },
355
- };
356
-
357
- static const struct meson_pwm_data pwm_axg_ao_data = {
358
- .parent_names = { "xtal" , "axg_ao_clk81" , "fclk_div4" , "fclk_div5" },
359
- };
360
-
361
- static const struct meson_pwm_data pwm_g12a_ao_ab_data = {
362
- .parent_names = { "xtal" , "g12a_ao_clk81" , "fclk_div4" , "fclk_div5" },
363
- };
364
-
365
- static const struct meson_pwm_data pwm_g12a_ao_cd_data = {
366
- .parent_names = { "xtal" , "g12a_ao_clk81" , NULL , NULL },
367
- };
368
-
369
- static const struct of_device_id meson_pwm_matches [] = {
370
- {
371
- .compatible = "amlogic,meson8b-pwm" ,
372
- .data = & pwm_meson8b_data
373
- },
374
- {
375
- .compatible = "amlogic,meson-gxbb-pwm" ,
376
- .data = & pwm_meson8b_data
377
- },
378
- {
379
- .compatible = "amlogic,meson-gxbb-ao-pwm" ,
380
- .data = & pwm_gxbb_ao_data
381
- },
382
- {
383
- .compatible = "amlogic,meson-axg-ee-pwm" ,
384
- .data = & pwm_axg_ee_data
385
- },
386
- {
387
- .compatible = "amlogic,meson-axg-ao-pwm" ,
388
- .data = & pwm_axg_ao_data
389
- },
390
- {
391
- .compatible = "amlogic,meson-g12a-ee-pwm" ,
392
- .data = & pwm_meson8b_data
393
- },
394
- {
395
- .compatible = "amlogic,meson-g12a-ao-pwm-ab" ,
396
- .data = & pwm_g12a_ao_ab_data
397
- },
398
- {
399
- .compatible = "amlogic,meson-g12a-ao-pwm-cd" ,
400
- .data = & pwm_g12a_ao_cd_data
401
- },
402
- {},
403
- };
404
- MODULE_DEVICE_TABLE (of , meson_pwm_matches );
405
-
406
- static int meson_pwm_init_channels (struct pwm_chip * chip )
342
+ static int meson_pwm_init_clocks_meson8b (struct pwm_chip * chip ,
343
+ struct clk_parent_data * mux_parent_data )
407
344
{
408
345
struct meson_pwm * meson = to_meson_pwm (chip );
409
- struct clk_parent_data mux_parent_data [MESON_NUM_MUX_PARENTS ] = {};
410
346
struct device * dev = pwmchip_parent (chip );
411
347
unsigned int i ;
412
348
char name [255 ];
413
349
int err ;
414
350
415
- for (i = 0 ; i < MESON_NUM_MUX_PARENTS ; i ++ ) {
416
- mux_parent_data [i ].index = -1 ;
417
- mux_parent_data [i ].name = meson -> data -> parent_names [i ];
418
- }
419
-
420
- for (i = 0 ; i < chip -> npwm ; i ++ ) {
351
+ for (i = 0 ; i < MESON_NUM_PWMS ; i ++ ) {
421
352
struct meson_pwm_channel * channel = & meson -> channels [i ];
422
353
struct clk_parent_data div_parent = {}, gate_parent = {};
423
354
struct clk_init_data init = {};
@@ -495,6 +426,122 @@ static int meson_pwm_init_channels(struct pwm_chip *chip)
495
426
return 0 ;
496
427
}
497
428
429
+ static int meson_pwm_init_channels_meson8b_legacy (struct pwm_chip * chip )
430
+ {
431
+ struct clk_parent_data mux_parent_data [MESON_NUM_MUX_PARENTS ] = {};
432
+ struct meson_pwm * meson = to_meson_pwm (chip );
433
+ int i ;
434
+
435
+ dev_warn_once (pwmchip_parent (chip ),
436
+ "using obsolete compatible, please consider updating dt\n" );
437
+
438
+ for (i = 0 ; i < MESON_NUM_MUX_PARENTS ; i ++ ) {
439
+ mux_parent_data [i ].index = -1 ;
440
+ mux_parent_data [i ].name = meson -> data -> parent_names [i ];
441
+ }
442
+
443
+ return meson_pwm_init_clocks_meson8b (chip , mux_parent_data );
444
+ }
445
+
446
+ static int meson_pwm_init_channels_meson8b_v2 (struct pwm_chip * chip )
447
+ {
448
+ struct clk_parent_data mux_parent_data [MESON_NUM_MUX_PARENTS ] = {};
449
+ int i ;
450
+
451
+ /*
452
+ * NOTE: Instead of relying on the hard coded names in the driver
453
+ * as the legacy version, this relies on DT to provide the list of
454
+ * clocks.
455
+ * For once, using input numbers actually makes more sense than names.
456
+ * Also DT requires clock-names to be explicitly ordered, so there is
457
+ * no point bothering with clock names in this case.
458
+ */
459
+ for (i = 0 ; i < MESON_NUM_MUX_PARENTS ; i ++ )
460
+ mux_parent_data [i ].index = i ;
461
+
462
+ return meson_pwm_init_clocks_meson8b (chip , mux_parent_data );
463
+ }
464
+
465
+ static const struct meson_pwm_data pwm_meson8b_data = {
466
+ .parent_names = { "xtal" , NULL , "fclk_div4" , "fclk_div3" },
467
+ .channels_init = meson_pwm_init_channels_meson8b_legacy ,
468
+ };
469
+
470
+ /*
471
+ * Only the 2 first inputs of the GXBB AO PWMs are valid
472
+ * The last 2 are grounded
473
+ */
474
+ static const struct meson_pwm_data pwm_gxbb_ao_data = {
475
+ .parent_names = { "xtal" , "clk81" , NULL , NULL },
476
+ .channels_init = meson_pwm_init_channels_meson8b_legacy ,
477
+ };
478
+
479
+ static const struct meson_pwm_data pwm_axg_ee_data = {
480
+ .parent_names = { "xtal" , "fclk_div5" , "fclk_div4" , "fclk_div3" },
481
+ .channels_init = meson_pwm_init_channels_meson8b_legacy ,
482
+ };
483
+
484
+ static const struct meson_pwm_data pwm_axg_ao_data = {
485
+ .parent_names = { "xtal" , "axg_ao_clk81" , "fclk_div4" , "fclk_div5" },
486
+ .channels_init = meson_pwm_init_channels_meson8b_legacy ,
487
+ };
488
+
489
+ static const struct meson_pwm_data pwm_g12a_ao_ab_data = {
490
+ .parent_names = { "xtal" , "g12a_ao_clk81" , "fclk_div4" , "fclk_div5" },
491
+ .channels_init = meson_pwm_init_channels_meson8b_legacy ,
492
+ };
493
+
494
+ static const struct meson_pwm_data pwm_g12a_ao_cd_data = {
495
+ .parent_names = { "xtal" , "g12a_ao_clk81" , NULL , NULL },
496
+ .channels_init = meson_pwm_init_channels_meson8b_legacy ,
497
+ };
498
+
499
+ static const struct meson_pwm_data pwm_meson8_v2_data = {
500
+ .channels_init = meson_pwm_init_channels_meson8b_v2 ,
501
+ };
502
+
503
+ static const struct of_device_id meson_pwm_matches [] = {
504
+ {
505
+ .compatible = "amlogic,meson8-pwm-v2" ,
506
+ .data = & pwm_meson8_v2_data
507
+ },
508
+ /* The following compatibles are obsolete */
509
+ {
510
+ .compatible = "amlogic,meson8b-pwm" ,
511
+ .data = & pwm_meson8b_data
512
+ },
513
+ {
514
+ .compatible = "amlogic,meson-gxbb-pwm" ,
515
+ .data = & pwm_meson8b_data
516
+ },
517
+ {
518
+ .compatible = "amlogic,meson-gxbb-ao-pwm" ,
519
+ .data = & pwm_gxbb_ao_data
520
+ },
521
+ {
522
+ .compatible = "amlogic,meson-axg-ee-pwm" ,
523
+ .data = & pwm_axg_ee_data
524
+ },
525
+ {
526
+ .compatible = "amlogic,meson-axg-ao-pwm" ,
527
+ .data = & pwm_axg_ao_data
528
+ },
529
+ {
530
+ .compatible = "amlogic,meson-g12a-ee-pwm" ,
531
+ .data = & pwm_meson8b_data
532
+ },
533
+ {
534
+ .compatible = "amlogic,meson-g12a-ao-pwm-ab" ,
535
+ .data = & pwm_g12a_ao_ab_data
536
+ },
537
+ {
538
+ .compatible = "amlogic,meson-g12a-ao-pwm-cd" ,
539
+ .data = & pwm_g12a_ao_cd_data
540
+ },
541
+ {},
542
+ };
543
+ MODULE_DEVICE_TABLE (of , meson_pwm_matches );
544
+
498
545
static int meson_pwm_probe (struct platform_device * pdev )
499
546
{
500
547
struct pwm_chip * chip ;
@@ -515,7 +562,7 @@ static int meson_pwm_probe(struct platform_device *pdev)
515
562
516
563
meson -> data = of_device_get_match_data (& pdev -> dev );
517
564
518
- err = meson_pwm_init_channels (chip );
565
+ err = meson -> data -> channels_init (chip );
519
566
if (err < 0 )
520
567
return err ;
521
568
0 commit comments