hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/mfd/display-serdes/maxim/maxim-max96745.c
....@@ -121,7 +121,7 @@
121121
122122 #define FUNCTION_DESC_GPIO_OUTPUT_A(id) \
123123 { \
124
- .name = "DES_GPIO"#id"_OUTPUT_A", \
124
+ .name = "SER_TXID"#id"_TO_DES_LINKA", \
125125 .group_names = serdes_gpio_groups, \
126126 .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
127127 .data = (void *)(const struct serdes_function_data []) { \
....@@ -132,7 +132,7 @@
132132
133133 #define FUNCTION_DESC_GPIO_OUTPUT_B(id) \
134134 { \
135
- .name = "DES_GPIO"#id"_OUTPUT_B", \
135
+ .name = "SER_TXID"#id"_TO_DES_LINKB", \
136136 .group_names = serdes_gpio_groups, \
137137 .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
138138 .data = (void *)(const struct serdes_function_data []) { \
....@@ -143,7 +143,7 @@
143143
144144 #define FUNCTION_DESC_GPIO_INPUT_A(id) \
145145 { \
146
- .name = "DES_GPIO"#id"_INPUT_A", \
146
+ .name = "DES_RXID"#id"_TO_SER_LINKA", \
147147 .group_names = serdes_gpio_groups, \
148148 .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
149149 .data = (void *)(const struct serdes_function_data []) { \
....@@ -153,7 +153,7 @@
153153
154154 #define FUNCTION_DESC_GPIO_INPUT_B(id) \
155155 { \
156
- .name = "DES_GPIO"#id"_INPUT_B", \
156
+ .name = "DES_RXID"#id"_TO_SER_LINKB", \
157157 .group_names = serdes_gpio_groups, \
158158 .num_group_names = ARRAY_SIZE(serdes_gpio_groups), \
159159 .data = (void *)(const struct serdes_function_data []) { \
....@@ -377,12 +377,26 @@
377377 static bool max96745_vid_tx_active(struct serdes *serdes)
378378 {
379379 u32 val;
380
+ int i = 0, ret = 0;
380381
381
- if (serdes_reg_read(serdes, 0x0107, &val))
382
- return false;
382
+ for (i = 0; i < 5; i++) {
383
+ ret = serdes_reg_read(serdes, 0x0107, &val);
384
+ if (!ret)
385
+ break;
383386
384
- if (!FIELD_GET(VID_TX_ACTIVE_A | VID_TX_ACTIVE_B, val))
387
+ SERDES_DBG_CHIP("serdes %s: false val=%d i=%d ret=%d\n", __func__, val, i, ret);
388
+ msleep(20);
389
+ }
390
+
391
+ if (ret) {
392
+ SERDES_DBG_CHIP("serdes %s: false val=%d ret=%d\n", __func__, val, ret);
385393 return false;
394
+ }
395
+
396
+ if (!FIELD_GET(VID_TX_ACTIVE_A | VID_TX_ACTIVE_B, val)) {
397
+ SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
398
+ return false;
399
+ }
386400
387401 return true;
388402 }
....@@ -391,9 +405,9 @@
391405 {
392406 if (max96745_vid_tx_active(serdes)) {
393407 extcon_set_state(serdes->extcon, EXTCON_JACK_VIDEO_OUT, true);
394
- pr_info("%s, extcon is true\n", __func__);
408
+ pr_info("serdes %s, extcon is true state=%d\n", __func__, serdes->extcon->state);
395409 } else {
396
- pr_info("%s, extcon is false\n", __func__);
410
+ pr_info("serdes %s, extcon is false\n", __func__);
397411 }
398412
399413 return 0;
....@@ -403,14 +417,21 @@
403417 {
404418 u32 val;
405419
406
- if (serdes->lock_gpio)
407
- return gpiod_get_value_cansleep(serdes->lock_gpio);
420
+ if (serdes->lock_gpio) {
421
+ val = gpiod_get_value_cansleep(serdes->lock_gpio);
422
+ SERDES_DBG_CHIP("serdes %s:val=%d\n", __func__, val);
423
+ return val;
424
+ }
408425
409
- if (serdes_reg_read(serdes, 0x002a, &val))
426
+ if (serdes_reg_read(serdes, 0x002a, &val)) {
427
+ SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
410428 return false;
429
+ }
411430
412
- if (!FIELD_GET(LINK_LOCKED, val))
431
+ if (!FIELD_GET(LOCKED, val)) {
432
+ SERDES_DBG_CHIP("serdes %s: false val=%d\n", __func__, val);
413433 return false;
434
+ }
414435
415436 return true;
416437 }
....@@ -444,11 +465,13 @@
444465
445466 if (atomic_cmpxchg(&serdes_bridge->triggered, 1, 0)) {
446467 status = connector_status_disconnected;
468
+ SERDES_DBG_CHIP("1 status=%d state=%d\n", status, serdes->extcon->state);
447469 goto out;
448470 }
449471
450472 if (serdes_reg_read(serdes, 0x641a, &dprx_trn_status2)) {
451473 status = connector_status_disconnected;
474
+ SERDES_DBG_CHIP("2 status=%d state=%d\n", status, serdes->extcon->state);
452475 goto out;
453476 }
454477
....@@ -456,15 +479,20 @@
456479 dev_err(serdes->dev, "Training State: 0x%lx\n",
457480 FIELD_GET(DPRX_TRAIN_STATE, dprx_trn_status2));
458481 status = connector_status_disconnected;
482
+ SERDES_DBG_CHIP("3 status=%d state=%d\n", status, serdes->extcon->state);
459483 goto out;
460484 }
461485 } else {
462486 atomic_set(&serdes_bridge->triggered, 0);
487
+ SERDES_DBG_CHIP("4 status=%d state=%d\n", status, serdes->extcon->state);
463488 }
489
+
490
+ if (serdes_bridge->next_bridge && (serdes_bridge->next_bridge->ops & DRM_BRIDGE_OP_DETECT))
491
+ return drm_bridge_detect(serdes_bridge->next_bridge);
464492
465493 out:
466494 serdes_bridge->status = status;
467
- SERDES_DBG_MFD("%s: status=%d\n", __func__, status);
495
+ SERDES_DBG_CHIP("5 status=%d state=%d\n", status, serdes->extcon->state);
468496 return status;
469497 }
470498
....@@ -472,7 +500,8 @@
472500 {
473501 int ret = 0;
474502
475
- SERDES_DBG_CHIP("%s: serdes chip %s ret=%d\n", __func__, serdes->chip_data->name, ret);
503
+ SERDES_DBG_CHIP("%s: serdes chip %s ret=%d state=%d\n",
504
+ __func__, serdes->chip_data->name, ret, serdes->extcon->state);
476505 return ret;
477506 }
478507
....@@ -490,6 +519,59 @@
490519 .enable = max96745_bridge_enable,
491520 .disable = max96745_bridge_disable,
492521 };
522
+
523
+static int max96745_pinctrl_set_mux(struct serdes *serdes,
524
+ unsigned int function, unsigned int group)
525
+{
526
+ struct serdes_pinctrl *pinctrl = serdes->pinctrl;
527
+ struct function_desc *func;
528
+ struct group_desc *grp;
529
+ int i;
530
+
531
+ func = pinmux_generic_get_function(pinctrl->pctl, function);
532
+ if (!func)
533
+ return -EINVAL;
534
+
535
+ grp = pinctrl_generic_get_group(pinctrl->pctl, group);
536
+ if (!grp)
537
+ return -EINVAL;
538
+
539
+ SERDES_DBG_CHIP("%s: serdes chip %s func=%s data=%p group=%s data=%p, num_pin=%d\n",
540
+ __func__, serdes->chip_data->name,
541
+ func->name, func->data, grp->name, grp->data, grp->num_pins);
542
+
543
+ if (func->data) {
544
+ struct serdes_function_data *data = func->data;
545
+
546
+ for (i = 0; i < grp->num_pins; i++) {
547
+ serdes_set_bits(serdes,
548
+ GPIO_A_REG(grp->pins[i] - pinctrl->pin_base),
549
+ GPIO_OUT_DIS,
550
+ FIELD_PREP(GPIO_OUT_DIS, data->gpio_out_dis));
551
+ if (data->gpio_tx_en_a || data->gpio_tx_en_b)
552
+ serdes_set_bits(serdes,
553
+ GPIO_B_REG(grp->pins[i] - pinctrl->pin_base),
554
+ GPIO_TX_ID,
555
+ FIELD_PREP(GPIO_TX_ID, data->gpio_tx_id));
556
+ if (data->gpio_rx_en_a || data->gpio_rx_en_b)
557
+ serdes_set_bits(serdes,
558
+ GPIO_C_REG(grp->pins[i] - pinctrl->pin_base),
559
+ GPIO_RX_ID,
560
+ FIELD_PREP(GPIO_RX_ID, data->gpio_rx_id));
561
+ serdes_set_bits(serdes,
562
+ GPIO_D_REG(grp->pins[i] - pinctrl->pin_base),
563
+ GPIO_TX_EN_A | GPIO_TX_EN_B | GPIO_IO_RX_EN |
564
+ GPIO_RX_EN_A | GPIO_RX_EN_B,
565
+ FIELD_PREP(GPIO_TX_EN_A, data->gpio_tx_en_a) |
566
+ FIELD_PREP(GPIO_TX_EN_B, data->gpio_tx_en_b) |
567
+ FIELD_PREP(GPIO_RX_EN_A, data->gpio_rx_en_a) |
568
+ FIELD_PREP(GPIO_RX_EN_B, data->gpio_rx_en_b) |
569
+ FIELD_PREP(GPIO_IO_RX_EN, data->gpio_io_rx_en));
570
+ }
571
+ }
572
+
573
+ return 0;
574
+}
493575
494576 static int max96745_pinctrl_config_get(struct serdes *serdes,
495577 unsigned int pin, unsigned long *config)
....@@ -635,59 +717,6 @@
635717 return 0;
636718 }
637719
638
-static int max96745_pinctrl_set_mux(struct serdes *serdes,
639
- unsigned int function, unsigned int group)
640
-{
641
- struct serdes_pinctrl *pinctrl = serdes->pinctrl;
642
- struct function_desc *func;
643
- struct group_desc *grp;
644
- int i;
645
-
646
- func = pinmux_generic_get_function(pinctrl->pctl, function);
647
- if (!func)
648
- return -EINVAL;
649
-
650
- grp = pinctrl_generic_get_group(pinctrl->pctl, group);
651
- if (!grp)
652
- return -EINVAL;
653
-
654
- SERDES_DBG_CHIP("%s: serdes chip %s func=%s data=%p group=%s data=%p, num_pin=%d\n",
655
- __func__, serdes->chip_data->name,
656
- func->name, func->data, grp->name, grp->data, grp->num_pins);
657
-
658
- if (func->data) {
659
- struct serdes_function_data *data = func->data;
660
-
661
- for (i = 0; i < grp->num_pins; i++) {
662
- serdes_set_bits(serdes,
663
- GPIO_A_REG(grp->pins[i] - pinctrl->pin_base),
664
- GPIO_OUT_DIS,
665
- FIELD_PREP(GPIO_OUT_DIS, data->gpio_out_dis));
666
- if (data->gpio_tx_en_a || data->gpio_tx_en_b)
667
- serdes_set_bits(serdes,
668
- GPIO_B_REG(grp->pins[i] - pinctrl->pin_base),
669
- GPIO_TX_ID,
670
- FIELD_PREP(GPIO_TX_ID, data->gpio_tx_id));
671
- if (data->gpio_rx_en_a || data->gpio_rx_en_b)
672
- serdes_set_bits(serdes,
673
- GPIO_C_REG(grp->pins[i] - pinctrl->pin_base),
674
- GPIO_RX_ID,
675
- FIELD_PREP(GPIO_RX_ID, data->gpio_rx_id));
676
- serdes_set_bits(serdes,
677
- GPIO_D_REG(grp->pins[i] - pinctrl->pin_base),
678
- GPIO_TX_EN_A | GPIO_TX_EN_B | GPIO_IO_RX_EN |
679
- GPIO_RX_EN_A | GPIO_RX_EN_B,
680
- FIELD_PREP(GPIO_TX_EN_A, data->gpio_tx_en_a) |
681
- FIELD_PREP(GPIO_TX_EN_B, data->gpio_tx_en_b) |
682
- FIELD_PREP(GPIO_RX_EN_A, data->gpio_rx_en_a) |
683
- FIELD_PREP(GPIO_RX_EN_B, data->gpio_rx_en_b) |
684
- FIELD_PREP(GPIO_IO_RX_EN, data->gpio_io_rx_en));
685
- }
686
- }
687
-
688
- return 0;
689
-}
690
-
691720 static struct serdes_chip_pinctrl_ops max96745_pinctrl_ops = {
692721 .pin_config_get = max96745_pinctrl_config_get,
693722 .pin_config_set = max96745_pinctrl_config_set,
....@@ -733,6 +762,84 @@
733762 .to_irq = max96745_gpio_to_irq,
734763 };
735764
765
+static int max96745_select(struct serdes *serdes, int chan)
766
+{
767
+ /*0076 for linkA and 0086 for linkB*/
768
+ if (chan == DUAL_LINK) {
769
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
770
+ FIELD_PREP(DIS_REM_CC, 0));
771
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
772
+ FIELD_PREP(DIS_REM_CC, 0));
773
+ SERDES_DBG_CHIP("%s: enable %s remote i2c of linkA and linkB\n", __func__,
774
+ serdes->chip_data->name);
775
+ } else if (chan == LINKA) {
776
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
777
+ FIELD_PREP(DIS_REM_CC, 0));
778
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
779
+ FIELD_PREP(DIS_REM_CC, 1));
780
+ SERDES_DBG_CHIP("%s: only enable %s remote i2c of linkA\n", __func__,
781
+ serdes->chip_data->name);
782
+ } else if (chan == LINKB) {
783
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
784
+ FIELD_PREP(DIS_REM_CC, 1));
785
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
786
+ FIELD_PREP(DIS_REM_CC, 0));
787
+ SERDES_DBG_CHIP("%s: only enable %s remote i2c of linkB\n", __func__,
788
+ serdes->chip_data->name);
789
+ } else if (chan == SPLITTER_MODE) {
790
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
791
+ FIELD_PREP(DIS_REM_CC, 0));
792
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
793
+ FIELD_PREP(DIS_REM_CC, 0));
794
+ SERDES_DBG_CHIP("%s: enable %s remote i2c of linkA and linkB\n", __func__,
795
+ serdes->chip_data->name);
796
+ }
797
+
798
+ return 0;
799
+}
800
+
801
+static int max96745_deselect(struct serdes *serdes, int chan)
802
+{
803
+
804
+ if (chan == DUAL_LINK) {
805
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
806
+ FIELD_PREP(DIS_REM_CC, 1));
807
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
808
+ FIELD_PREP(DIS_REM_CC, 1));
809
+ SERDES_DBG_CHIP("%s: disable %s remote i2c of linkA and linkB\n", __func__,
810
+ serdes->chip_data->name);
811
+ } else if (chan == LINKA) {
812
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
813
+ FIELD_PREP(DIS_REM_CC, 1));
814
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
815
+ FIELD_PREP(DIS_REM_CC, 0));
816
+ SERDES_DBG_CHIP("%s: only disable %s remote i2c of linkA\n", __func__,
817
+ serdes->chip_data->name);
818
+ } else if (chan == LINKB) {
819
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
820
+ FIELD_PREP(DIS_REM_CC, 0));
821
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
822
+ FIELD_PREP(DIS_REM_CC, 1));
823
+ SERDES_DBG_CHIP("%s: only disable %s remote i2c of linkB\n", __func__,
824
+ serdes->chip_data->name);
825
+ } else if (chan == SPLITTER_MODE) {
826
+ serdes_set_bits(serdes, 0x0076, DIS_REM_CC,
827
+ FIELD_PREP(DIS_REM_CC, 1));
828
+ serdes_set_bits(serdes, 0x0086, DIS_REM_CC,
829
+ FIELD_PREP(DIS_REM_CC, 1));
830
+ SERDES_DBG_CHIP("%s: disable %s remote i2c of linkA and linkB\n", __func__,
831
+ serdes->chip_data->name);
832
+ }
833
+
834
+ return 0;
835
+}
836
+
837
+
838
+static struct serdes_chip_split_ops max96745_split_ops = {
839
+ .select = max96745_select,
840
+ .deselect = max96745_deselect,
841
+};
842
+
736843 static int max96745_pm_suspend(struct serdes *serdes)
737844 {
738845 return 0;
....@@ -773,6 +880,7 @@
773880 .bridge_ops = &max96745_bridge_ops,
774881 .pinctrl_ops = &max96745_pinctrl_ops,
775882 .gpio_ops = &max96745_gpio_ops,
883
+ .split_ops = &max96745_split_ops,
776884 .pm_ops = &max96745_pm_ops,
777885 .irq_ops = &max96745_irq_ops,
778886 };