@@ -2663,13 +2663,71 @@ static const struct adv7604_chip_info adv7604_chip_info[] = {
2663
2663
},
2664
2664
};
2665
2665
2666
+ static struct i2c_device_id adv7604_i2c_id [] = {
2667
+ { "adv7604" , (kernel_ulong_t )& adv7604_chip_info [ADV7604 ] },
2668
+ { "adv7611" , (kernel_ulong_t )& adv7604_chip_info [ADV7611 ] },
2669
+ { }
2670
+ };
2671
+ MODULE_DEVICE_TABLE (i2c , adv7604_i2c_id );
2672
+
2673
+ static struct of_device_id adv7604_of_id [] = {
2674
+ { .compatible = "adi,adv7604" , .data = & adv7604_chip_info [ADV7604 ] },
2675
+ { .compatible = "adi,adv7611" , .data = & adv7604_chip_info [ADV7611 ] },
2676
+ { }
2677
+ };
2678
+ MODULE_DEVICE_TABLE (of , adv7604_of_id );
2679
+
2680
+ static int adv7604_parse_dt (struct adv7604_state * state )
2681
+ {
2682
+ struct device_node * np ;
2683
+ int ret ;
2684
+
2685
+ np = state -> i2c_clients [ADV7604_PAGE_IO ]-> dev .of_node ;
2686
+
2687
+ state -> pdata .disable_pwrdnb =
2688
+ of_property_read_bool (np , "adi,disable-power-down" );
2689
+ state -> pdata .disable_cable_det_rst =
2690
+ of_property_read_bool (np , "adi,disable-cable-reset" );
2691
+
2692
+ ret = of_property_read_u32 (np , "adi,default-input" ,
2693
+ & state -> pdata .default_input );
2694
+ if (ret < 0 )
2695
+ state -> pdata .default_input = -1 ;
2696
+
2697
+ /* Disable the interrupt for now as no DT-based board uses it. */
2698
+ state -> pdata .int1_config = ADV7604_INT1_CONFIG_DISABLED ;
2699
+
2700
+ /* Use the default I2C addresses. */
2701
+ state -> pdata .i2c_addresses [ADV7604_PAGE_AVLINK ] = 0x42 ;
2702
+ state -> pdata .i2c_addresses [ADV7604_PAGE_CEC ] = 0x40 ;
2703
+ state -> pdata .i2c_addresses [ADV7604_PAGE_INFOFRAME ] = 0x3e ;
2704
+ state -> pdata .i2c_addresses [ADV7604_PAGE_ESDP ] = 0x38 ;
2705
+ state -> pdata .i2c_addresses [ADV7604_PAGE_DPP ] = 0x3c ;
2706
+ state -> pdata .i2c_addresses [ADV7604_PAGE_AFE ] = 0x26 ;
2707
+ state -> pdata .i2c_addresses [ADV7604_PAGE_REP ] = 0x32 ;
2708
+ state -> pdata .i2c_addresses [ADV7604_PAGE_EDID ] = 0x36 ;
2709
+ state -> pdata .i2c_addresses [ADV7604_PAGE_HDMI ] = 0x34 ;
2710
+ state -> pdata .i2c_addresses [ADV7604_PAGE_TEST ] = 0x30 ;
2711
+ state -> pdata .i2c_addresses [ADV7604_PAGE_CP ] = 0x22 ;
2712
+ state -> pdata .i2c_addresses [ADV7604_PAGE_VDP ] = 0x24 ;
2713
+
2714
+ /* HACK: Hardcode the remaining platform data fields. */
2715
+ state -> pdata .blank_data = 1 ;
2716
+ state -> pdata .op_656_range = 1 ;
2717
+ state -> pdata .alt_data_sat = 1 ;
2718
+ state -> pdata .insert_av_codes = 1 ;
2719
+ state -> pdata .op_format_mode_sel = ADV7604_OP_FORMAT_MODE0 ;
2720
+ state -> pdata .bus_order = ADV7604_BUS_ORDER_RGB ;
2721
+
2722
+ return 0 ;
2723
+ }
2724
+
2666
2725
static int adv7604_probe (struct i2c_client * client ,
2667
2726
const struct i2c_device_id * id )
2668
2727
{
2669
2728
static const struct v4l2_dv_timings cea640x480 =
2670
2729
V4L2_DV_BT_CEA_640X480P59_94 ;
2671
2730
struct adv7604_state * state ;
2672
- struct adv7604_platform_data * pdata = client -> dev .platform_data ;
2673
2731
struct v4l2_ctrl_handler * hdl ;
2674
2732
struct v4l2_subdev * sd ;
2675
2733
unsigned int i ;
@@ -2688,19 +2746,32 @@ static int adv7604_probe(struct i2c_client *client,
2688
2746
return - ENOMEM ;
2689
2747
}
2690
2748
2691
- state -> info = & adv7604_chip_info [id -> driver_data ];
2692
2749
state -> i2c_clients [ADV7604_PAGE_IO ] = client ;
2693
2750
2694
2751
/* initialize variables */
2695
2752
state -> restart_stdi_once = true;
2696
2753
state -> selected_input = ~0 ;
2697
2754
2698
- /* platform data */
2699
- if (!pdata ) {
2755
+ if (IS_ENABLED (CONFIG_OF ) && client -> dev .of_node ) {
2756
+ const struct of_device_id * oid ;
2757
+
2758
+ oid = of_match_node (adv7604_of_id , client -> dev .of_node );
2759
+ state -> info = oid -> data ;
2760
+
2761
+ err = adv7604_parse_dt (state );
2762
+ if (err < 0 ) {
2763
+ v4l_err (client , "DT parsing error\n" );
2764
+ return err ;
2765
+ }
2766
+ } else if (client -> dev .platform_data ) {
2767
+ struct adv7604_platform_data * pdata = client -> dev .platform_data ;
2768
+
2769
+ state -> info = (const struct adv7604_chip_info * )id -> driver_data ;
2770
+ state -> pdata = * pdata ;
2771
+ } else {
2700
2772
v4l_err (client , "No platform data!\n" );
2701
2773
return - ENODEV ;
2702
2774
}
2703
- state -> pdata = * pdata ;
2704
2775
2705
2776
/* Request GPIOs. */
2706
2777
for (i = 0 ; i < state -> info -> num_dv_ports ; ++ i ) {
@@ -2799,7 +2870,7 @@ static int adv7604_probe(struct i2c_client *client,
2799
2870
continue ;
2800
2871
2801
2872
state -> i2c_clients [i ] =
2802
- adv7604_dummy_client (sd , pdata -> i2c_addresses [i ],
2873
+ adv7604_dummy_client (sd , state -> pdata . i2c_addresses [i ],
2803
2874
0xf2 + i );
2804
2875
if (state -> i2c_clients [i ] == NULL ) {
2805
2876
err = - ENOMEM ;
@@ -2873,21 +2944,15 @@ static int adv7604_remove(struct i2c_client *client)
2873
2944
2874
2945
/* ----------------------------------------------------------------------- */
2875
2946
2876
- static struct i2c_device_id adv7604_id [] = {
2877
- { "adv7604" , ADV7604 },
2878
- { "adv7611" , ADV7611 },
2879
- { }
2880
- };
2881
- MODULE_DEVICE_TABLE (i2c , adv7604_id );
2882
-
2883
2947
static struct i2c_driver adv7604_driver = {
2884
2948
.driver = {
2885
2949
.owner = THIS_MODULE ,
2886
2950
.name = "adv7604" ,
2951
+ .of_match_table = of_match_ptr (adv7604_of_id ),
2887
2952
},
2888
2953
.probe = adv7604_probe ,
2889
2954
.remove = adv7604_remove ,
2890
- .id_table = adv7604_id ,
2955
+ .id_table = adv7604_i2c_id ,
2891
2956
};
2892
2957
2893
2958
module_i2c_driver (adv7604_driver );
0 commit comments