@@ -30,7 +30,6 @@ struct ws_panel {
3030 struct i2c_client * i2c ;
3131 const struct drm_display_mode * mode ;
3232 enum drm_panel_orientation orientation ;
33- int lanes ;
3433};
3534
3635struct ws_panel_data {
@@ -349,30 +348,6 @@ static const struct ws_panel_data ws_panel_7_0_h_data = {
349348/* 10.1inch DSI LCD (E)
350349 * https://www.waveshare.com/10.1inch-dsi-lcd-e.htm
351350 */
352- static const struct drm_display_mode ws_panel_1200x1920_60fps_mode = {
353- .clock = 166666 ,
354- .hdisplay = 1200 ,
355- .hsync_start = 1200 + 28 ,
356- .hsync_end = 1200 + 28 + 10 ,
357- .htotal = 1200 + 28 + 10 + 30 ,
358- .vdisplay = 1920 ,
359- .vsync_start = 1920 + 238 ,
360- .vsync_end = 1920 + 238 + 4 ,
361- .vtotal = 1920 + 238 + 4 + 28 ,
362- };
363-
364- static const struct drm_display_mode ws_panel_1200x1920_30fps_mode = {
365- .clock = 83333 ,
366- .hdisplay = 1200 ,
367- .hsync_start = 1200 + 28 ,
368- .hsync_end = 1200 + 28 + 10 ,
369- .htotal = 1200 + 28 + 10 + 30 ,
370- .vdisplay = 1920 ,
371- .vsync_start = 1920 + 238 ,
372- .vsync_end = 1920 + 238 + 4 ,
373- .vtotal = 1920 + 238 + 4 + 28 ,
374- };
375-
376351static const struct drm_display_mode ws_panel_1920x1200_60fps_mode = {
377352 .clock = 166666 ,
378353 .hdisplay = 1920 ,
@@ -397,9 +372,15 @@ static const struct drm_display_mode ws_panel_1920x1200_30fps_mode = {
397372 .vtotal = 1200 + 28 + 10 + 30 ,
398373};
399374
400- static const struct ws_panel_data ws_panel_automatic_data = {
401- .mode = NULL ,
402- .lanes = 0 ,
375+ static const struct ws_panel_data ws_panel_10_1_e_4lane_data = {
376+ .mode = & ws_panel_1920x1200_60fps_mode ,
377+ .lanes = 4 ,
378+ .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS ,
379+ };
380+
381+ static const struct ws_panel_data ws_panel_10_1_e_2lane_data = {
382+ .mode = & ws_panel_1920x1200_30fps_mode ,
383+ .lanes = 2 ,
403384 .mode_flags = MIPI_DSI_MODE_VIDEO_HSE | MIPI_DSI_MODE_VIDEO | MIPI_DSI_CLOCK_NON_CONTINUOUS ,
404385};
405386
@@ -417,68 +398,6 @@ static void ws_panel_i2c_write(struct ws_panel *ts, u8 reg, u8 val)
417398 dev_err (& ts -> i2c -> dev , "I2C write failed: %d\n" , ret );
418399}
419400
420- static int ws_panel_i2c_read (struct ws_panel * ts , u8 reg )
421- {
422- int ret ;
423-
424- ret = i2c_smbus_read_byte_data (ts -> i2c , reg );
425- if (ret < 0 )
426- dev_err (& ts -> i2c -> dev , "read reg 0x%02x failed %d\n" , reg , ret );
427- return ret ;
428- }
429-
430- static int ws_panel_auto_detect (struct ws_panel * ts )
431- {
432- int screen_type ;
433- int rotate ;
434- int fps ;
435-
436- fps = ws_panel_i2c_read (ts , 0xd0 );
437- if (fps < 0 )
438- return fps ;
439-
440- rotate = ws_panel_i2c_read (ts , 0xd1 );
441- if (rotate < 0 )
442- return rotate ;
443-
444- screen_type = ws_panel_i2c_read (ts , 0xd3 );
445- if (screen_type < 0 )
446- return screen_type ;
447-
448- dev_info (& ts -> i2c -> dev ,
449- "automatic panel detect screen_type=0x%x rotate=0x%x fps=0x%x\n" ,
450- screen_type , rotate , fps );
451-
452- if (screen_type == 0x01 ) {
453- switch (rotate ) {
454- case 0 :
455- case 2 :
456- dev_info (& ts -> i2c -> dev , "select 1200x1920 panel\n" );
457- ts -> mode = fps == 60 ?
458- & ws_panel_1200x1920_60fps_mode :
459- & ws_panel_1200x1920_30fps_mode ;
460- break ;
461- case 1 :
462- case 3 :
463- dev_info (& ts -> i2c -> dev , "select 1920x1200 panel\n" );
464- ts -> mode = fps == 60 ?
465- & ws_panel_1920x1200_60fps_mode :
466- & ws_panel_1920x1200_30fps_mode ;
467- break ;
468- default :
469- dev_err (& ts -> i2c -> dev , "unknown rotate value %d\n" , rotate );
470- return - EINVAL ;
471- }
472- if (fps == 60 )
473- ts -> lanes = 4 ;
474- else
475- ts -> lanes = 2 ;
476- return 0 ;
477- }
478- dev_err (& ts -> i2c -> dev , "unsupported panel D3=0x%x\n" , screen_type );
479- return - EINVAL ;
480- }
481-
482401static int ws_panel_disable (struct drm_panel * panel )
483402{
484403 struct ws_panel * ts = panel_to_ts (panel );
@@ -603,6 +522,8 @@ static int ws_panel_probe(struct i2c_client *i2c)
603522 };
604523 const struct ws_panel_data * _ws_panel_data ;
605524 int ret ;
525+ bool is_10_1_e_4lane = false;
526+ bool is_10_1_e_2lane = false;
606527
607528 ts = devm_kzalloc (dev , sizeof (* ts ), GFP_KERNEL );
608529 if (!ts )
@@ -612,24 +533,21 @@ static int ws_panel_probe(struct i2c_client *i2c)
612533 if (!_ws_panel_data )
613534 return - EINVAL ;
614535
615- ts -> i2c = i2c ;
616- i2c_set_clientdata (i2c , ts );
617- ts -> lanes = _ws_panel_data -> lanes ;
618-
619- /* For automatic detection panels, mode is NULL - detect via I2C */
620- if (!_ws_panel_data -> mode ) {
621- ret = ws_panel_auto_detect (ts );
622- if (ret ) {
623- dev_err (dev , "panel auto detect failed\n" );
624- return ret ;
625- }
626- } else {
627- ts -> mode = _ws_panel_data -> mode ;
628- }
536+ ts -> mode = _ws_panel_data -> mode ;
629537
630538 if (!ts -> mode )
631539 return - EINVAL ;
632540
541+ i2c_set_clientdata (i2c , ts );
542+
543+ ts -> i2c = i2c ;
544+ is_10_1_e_4lane = of_device_is_compatible (dev -> of_node ,
545+ "waveshare,10.1inch-e-4lane-panel" );
546+ is_10_1_e_2lane = of_device_is_compatible (dev -> of_node ,
547+ "waveshare,10.1inch-e-2lane-panel" );
548+ if (is_10_1_e_4lane || is_10_1_e_2lane )
549+ ws_panel_i2c_write (ts , 0xd0 , is_10_1_e_4lane ? 60 : 30 );
550+
633551 ws_panel_i2c_write (ts , 0xc0 , 0x01 );
634552 ws_panel_i2c_write (ts , 0xc2 , 0x01 );
635553 ws_panel_i2c_write (ts , 0xac , 0x01 );
@@ -686,7 +604,7 @@ static int ws_panel_probe(struct i2c_client *i2c)
686604
687605 ts -> dsi -> mode_flags = _ws_panel_data -> mode_flags ;
688606 ts -> dsi -> format = MIPI_DSI_FMT_RGB888 ;
689- ts -> dsi -> lanes = ts -> lanes ;
607+ ts -> dsi -> lanes = _ws_panel_data -> lanes ;
690608
691609 ret = devm_mipi_dsi_attach (dev , ts -> dsi );
692610
@@ -775,8 +693,11 @@ static const struct of_device_id ws_panel_of_ids[] = {
775693 .compatible = "waveshare,7.0inch-h-panel" ,
776694 .data = & ws_panel_7_0_h_data ,
777695 }, {
778- .compatible = "waveshare,automatic-detection-panel" ,
779- .data = & ws_panel_automatic_data ,
696+ .compatible = "waveshare,10.1inch-e-4lane-panel" ,
697+ .data = & ws_panel_10_1_e_4lane_data ,
698+ }, {
699+ .compatible = "waveshare,10.1inch-e-2lane-panel" ,
700+ .data = & ws_panel_10_1_e_2lane_data ,
780701 }, {
781702 /* sentinel */
782703 }
0 commit comments