59
59
#define MIPI_CAL_CONFIG_DSID_CLK 0x1d
60
60
#define MIPI_CAL_CONFIG_CSIE_CLK 0x1d
61
61
62
+ /* T30 DSI V0 controller */
63
+ #define CSI_CIL_PAD_CONFIG0 0x09
64
+ #define CSI_CILA_MIPI_CAL_CONFIG 0x0a
65
+ #define CSI_CILB_MIPI_CAL_CONFIG 0x0b
66
+ #define CSI_DSI_MIPI_CAL_CONFIG 0x14
67
+ #define CSI_MIPIBIAS_PAD_CONFIG0 0x15
68
+
62
69
/* for data and clock lanes */
63
70
#define MIPI_CAL_CONFIG_SELECT (1 << 21)
64
71
@@ -90,6 +97,8 @@ struct tegra_mipi_pad {
90
97
};
91
98
92
99
struct tegra_mipi_soc {
100
+ bool dsi_v0 ;
101
+
93
102
bool has_clk_lane ;
94
103
const struct tegra_mipi_pad * pads ;
95
104
unsigned int num_pads ;
@@ -120,6 +129,7 @@ struct tegra_mipi {
120
129
void __iomem * regs ;
121
130
struct mutex lock ;
122
131
struct clk * clk ;
132
+ struct clk * csi_clk ;
123
133
124
134
unsigned long usage_count ;
125
135
};
@@ -263,6 +273,9 @@ int tegra_mipi_enable(struct tegra_mipi_device *dev)
263
273
{
264
274
int err = 0 ;
265
275
276
+ if (dev -> mipi -> soc -> dsi_v0 )
277
+ return err ;
278
+
266
279
mutex_lock (& dev -> mipi -> lock );
267
280
268
281
if (dev -> mipi -> usage_count ++ == 0 )
@@ -279,6 +292,9 @@ int tegra_mipi_disable(struct tegra_mipi_device *dev)
279
292
{
280
293
int err = 0 ;
281
294
295
+ if (dev -> mipi -> soc -> dsi_v0 )
296
+ return err ;
297
+
282
298
mutex_lock (& dev -> mipi -> lock );
283
299
284
300
if (-- dev -> mipi -> usage_count == 0 )
@@ -298,6 +314,9 @@ int tegra_mipi_finish_calibration(struct tegra_mipi_device *device)
298
314
u32 value ;
299
315
int err ;
300
316
317
+ if (mipi -> soc -> dsi_v0 )
318
+ return 0 ;
319
+
301
320
err = readl_relaxed_poll_timeout (status_reg , value ,
302
321
!(value & MIPI_CAL_STATUS_ACTIVE ) &&
303
322
(value & MIPI_CAL_STATUS_DONE ), 50 ,
@@ -309,6 +328,43 @@ int tegra_mipi_finish_calibration(struct tegra_mipi_device *device)
309
328
}
310
329
EXPORT_SYMBOL (tegra_mipi_finish_calibration );
311
330
331
+ static int tegra30_mipi_calibration (struct tegra_mipi_device * device )
332
+ {
333
+ struct tegra_mipi * mipi = device -> mipi ;
334
+ const struct tegra_mipi_soc * soc = mipi -> soc ;
335
+ u32 value ;
336
+ int err ;
337
+
338
+ err = clk_enable (device -> mipi -> csi_clk );
339
+ if (err < 0 )
340
+ return err ;
341
+
342
+ mutex_lock (& device -> mipi -> lock );
343
+
344
+ value = MIPI_CAL_CONFIG_TERMOS (soc -> termos );
345
+ tegra_mipi_writel (device -> mipi , value , CSI_CILA_MIPI_CAL_CONFIG );
346
+
347
+ value = MIPI_CAL_CONFIG_TERMOS (soc -> termos );
348
+ tegra_mipi_writel (device -> mipi , value , CSI_CILB_MIPI_CAL_CONFIG );
349
+
350
+ value = MIPI_CAL_CONFIG_HSPDOS (soc -> hspdos ) |
351
+ MIPI_CAL_CONFIG_HSPUOS (soc -> hspuos );
352
+ tegra_mipi_writel (device -> mipi , value , CSI_DSI_MIPI_CAL_CONFIG );
353
+
354
+ value = MIPI_CAL_BIAS_PAD_DRV_DN_REF (soc -> pad_drive_down_ref ) |
355
+ MIPI_CAL_BIAS_PAD_DRV_UP_REF (soc -> pad_drive_up_ref );
356
+ tegra_mipi_writel (device -> mipi , value , CSI_MIPIBIAS_PAD_CONFIG0 );
357
+
358
+ tegra_mipi_writel (device -> mipi , 0x0 , CSI_CIL_PAD_CONFIG0 );
359
+
360
+ mutex_unlock (& device -> mipi -> lock );
361
+
362
+ clk_disable (device -> mipi -> csi_clk );
363
+ clk_disable (device -> mipi -> clk );
364
+
365
+ return 0 ;
366
+ }
367
+
312
368
int tegra_mipi_start_calibration (struct tegra_mipi_device * device )
313
369
{
314
370
const struct tegra_mipi_soc * soc = device -> mipi -> soc ;
@@ -320,6 +376,9 @@ int tegra_mipi_start_calibration(struct tegra_mipi_device *device)
320
376
if (err < 0 )
321
377
return err ;
322
378
379
+ if (device -> mipi -> soc -> dsi_v0 )
380
+ return tegra30_mipi_calibration (device );
381
+
323
382
mutex_lock (& device -> mipi -> lock );
324
383
325
384
value = MIPI_CAL_BIAS_PAD_DRV_DN_REF (soc -> pad_drive_down_ref ) |
@@ -384,6 +443,15 @@ int tegra_mipi_start_calibration(struct tegra_mipi_device *device)
384
443
}
385
444
EXPORT_SYMBOL (tegra_mipi_start_calibration );
386
445
446
+ static const struct tegra_mipi_soc tegra30_mipi_soc = {
447
+ .dsi_v0 = true,
448
+ .pad_drive_down_ref = 0x5 ,
449
+ .pad_drive_up_ref = 0x7 ,
450
+ .hspdos = 0x4 ,
451
+ .hspuos = 0x3 ,
452
+ .termos = 0x4 ,
453
+ };
454
+
387
455
static const struct tegra_mipi_pad tegra114_mipi_pads [] = {
388
456
{ .data = MIPI_CAL_CONFIG_CSIA },
389
457
{ .data = MIPI_CAL_CONFIG_CSIB },
@@ -397,6 +465,7 @@ static const struct tegra_mipi_pad tegra114_mipi_pads[] = {
397
465
};
398
466
399
467
static const struct tegra_mipi_soc tegra114_mipi_soc = {
468
+ .dsi_v0 = false,
400
469
.has_clk_lane = false,
401
470
.pads = tegra114_mipi_pads ,
402
471
.num_pads = ARRAY_SIZE (tegra114_mipi_pads ),
@@ -424,6 +493,7 @@ static const struct tegra_mipi_pad tegra124_mipi_pads[] = {
424
493
};
425
494
426
495
static const struct tegra_mipi_soc tegra124_mipi_soc = {
496
+ .dsi_v0 = false,
427
497
.has_clk_lane = true,
428
498
.pads = tegra124_mipi_pads ,
429
499
.num_pads = ARRAY_SIZE (tegra124_mipi_pads ),
@@ -441,6 +511,7 @@ static const struct tegra_mipi_soc tegra124_mipi_soc = {
441
511
};
442
512
443
513
static const struct tegra_mipi_soc tegra132_mipi_soc = {
514
+ .dsi_v0 = false,
444
515
.has_clk_lane = true,
445
516
.pads = tegra124_mipi_pads ,
446
517
.num_pads = ARRAY_SIZE (tegra124_mipi_pads ),
@@ -471,6 +542,7 @@ static const struct tegra_mipi_pad tegra210_mipi_pads[] = {
471
542
};
472
543
473
544
static const struct tegra_mipi_soc tegra210_mipi_soc = {
545
+ .dsi_v0 = false,
474
546
.has_clk_lane = true,
475
547
.pads = tegra210_mipi_pads ,
476
548
.num_pads = ARRAY_SIZE (tegra210_mipi_pads ),
@@ -488,6 +560,7 @@ static const struct tegra_mipi_soc tegra210_mipi_soc = {
488
560
};
489
561
490
562
static const struct of_device_id tegra_mipi_of_match [] = {
563
+ { .compatible = "nvidia,tegra30-mipi" , .data = & tegra30_mipi_soc },
491
564
{ .compatible = "nvidia,tegra114-mipi" , .data = & tegra114_mipi_soc },
492
565
{ .compatible = "nvidia,tegra124-mipi" , .data = & tegra124_mipi_soc },
493
566
{ .compatible = "nvidia,tegra132-mipi" , .data = & tegra132_mipi_soc },
@@ -530,6 +603,18 @@ static int tegra_mipi_probe(struct platform_device *pdev)
530
603
if (err < 0 )
531
604
return err ;
532
605
606
+ if (mipi -> soc -> dsi_v0 ) {
607
+ mipi -> csi_clk = devm_clk_get (& pdev -> dev , "csi" );
608
+ if (IS_ERR (mipi -> csi_clk )) {
609
+ dev_err (& pdev -> dev , "failed to get CSI clock\n" );
610
+ return PTR_ERR (mipi -> csi_clk );
611
+ }
612
+
613
+ err = clk_prepare (mipi -> csi_clk );
614
+ if (err < 0 )
615
+ return err ;
616
+ }
617
+
533
618
platform_set_drvdata (pdev , mipi );
534
619
535
620
return 0 ;
@@ -541,6 +626,9 @@ static int tegra_mipi_remove(struct platform_device *pdev)
541
626
542
627
clk_unprepare (mipi -> clk );
543
628
629
+ if (mipi -> soc -> dsi_v0 )
630
+ clk_unprepare (mipi -> csi_clk );
631
+
544
632
return 0 ;
545
633
}
546
634
0 commit comments