1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
|
From 164a97c4370a29ee27145c5d1c44fe03ec2ce7b1 Mon Sep 17 00:00:00 2001
From: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
Date: Wed, 20 Nov 2019 16:41:12 +0300
Subject: [PATCH] media: i2c: max9286: parse crossbard from cmdline
This allows to change crossbar by command line parameter
Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
---
drivers/media/i2c/soc_camera/max9286.c | 93 +++++++++++++++++++---------------
1 file changed, 51 insertions(+), 42 deletions(-)
diff --git a/drivers/media/i2c/soc_camera/max9286.c b/drivers/media/i2c/soc_camera/max9286.c
index 3184ff1..b185566 100644
--- a/drivers/media/i2c/soc_camera/max9286.c
+++ b/drivers/media/i2c/soc_camera/max9286.c
@@ -56,6 +56,7 @@ struct max9286_priv {
int dbl;
int dt;
int hsgen;
+ char cb[16];
int hts;
int vts;
int hts_delay;
@@ -140,6 +141,10 @@ static int switchin = 0;
module_param(switchin, int, 0644);
MODULE_PARM_DESC(switchin, " COAX SWITCH IN+ and IN- (default: 0 - not switched)");
+static long crossbar = 0xba9876543210;
+module_param(crossbar, long, 0644);
+MODULE_PARM_DESC(crossbar, " Crossbar setup (default: ba9876543210 - reversed)");
+
enum {
RGB888_DT = 0,
RGB565_DT,
@@ -421,54 +426,53 @@ static void max9286_gmsl_link_setup(struct i2c_client *client, int idx)
switch (priv->dt) {
case YUV8_DT:
/* setup crossbar for YUV8/RAW8: reverse DVP bus */
- reg8_write(client, 0x20, 7);
- reg8_write(client, 0x21, 6);
- reg8_write(client, 0x22, 5);
- reg8_write(client, 0x23, 4);
- reg8_write(client, 0x24, 3);
- reg8_write(client, 0x25, 2);
- reg8_write(client, 0x26, 1);
- reg8_write(client, 0x27, 0);
+ reg8_write(client, 0x20, priv->cb[7]);
+ reg8_write(client, 0x21, priv->cb[6]);
+ reg8_write(client, 0x22, priv->cb[5]);
+ reg8_write(client, 0x23, priv->cb[4]);
+ reg8_write(client, 0x24, priv->cb[3]);
+ reg8_write(client, 0x25, priv->cb[2]);
+ reg8_write(client, 0x26, priv->cb[1]);
+ reg8_write(client, 0x27, priv->cb[0]);
/* this is second byte if DBL=1 */
- reg8_write(client, 0x30, 23);
- reg8_write(client, 0x31, 22);
- reg8_write(client, 0x32, 21);
- reg8_write(client, 0x33, 20);
- reg8_write(client, 0x34, 19);
- reg8_write(client, 0x35, 18);
- reg8_write(client, 0x36, 17);
- reg8_write(client, 0x37, 16);
-
+ reg8_write(client, 0x30, priv->cb[7] + 16);
+ reg8_write(client, 0x31, priv->cb[6] + 16);
+ reg8_write(client, 0x32, priv->cb[5] + 16);
+ reg8_write(client, 0x33, priv->cb[4] + 16);
+ reg8_write(client, 0x34, priv->cb[3] + 16);
+ reg8_write(client, 0x35, priv->cb[2] + 16);
+ reg8_write(client, 0x36, priv->cb[1] + 16);
+ reg8_write(client, 0x37, priv->cb[0] + 16);
break;
case RAW12_DT:
/* setup crossbar for RAW12: reverse DVP bus */
- reg8_write(client, 0x20, 11);
- reg8_write(client, 0x21, 10);
- reg8_write(client, 0x22, 9);
- reg8_write(client, 0x23, 8);
- reg8_write(client, 0x24, 7);
- reg8_write(client, 0x25, 6);
- reg8_write(client, 0x26, 5);
- reg8_write(client, 0x27, 4);
- reg8_write(client, 0x28, 3);
- reg8_write(client, 0x29, 2);
- reg8_write(client, 0x2a, 1);
- reg8_write(client, 0x2b, 0);
+ reg8_write(client, 0x20, priv->cb[11]);
+ reg8_write(client, 0x21, priv->cb[10]);
+ reg8_write(client, 0x22, priv->cb[9]);
+ reg8_write(client, 0x23, priv->cb[8]);
+ reg8_write(client, 0x24, priv->cb[7]);
+ reg8_write(client, 0x25, priv->cb[6]);
+ reg8_write(client, 0x26, priv->cb[5]);
+ reg8_write(client, 0x27, priv->cb[4]);
+ reg8_write(client, 0x28, priv->cb[3]);
+ reg8_write(client, 0x29, priv->cb[2]);
+ reg8_write(client, 0x2a, priv->cb[1]);
+ reg8_write(client, 0x2b, priv->cb[0]);
/* this is second byte if DBL=1 */
- reg8_write(client, 0x30, 27);
- reg8_write(client, 0x31, 26);
- reg8_write(client, 0x32, 25);
- reg8_write(client, 0x33, 24);
- reg8_write(client, 0x34, 23);
- reg8_write(client, 0x35, 22);
- reg8_write(client, 0x36, 21);
- reg8_write(client, 0x37, 20);
- reg8_write(client, 0x38, 19);
- reg8_write(client, 0x39, 18);
- reg8_write(client, 0x3a, 17);
- reg8_write(client, 0x3b, 16);
+ reg8_write(client, 0x30, priv->cb[11] + 16);
+ reg8_write(client, 0x31, priv->cb[10] + 16);
+ reg8_write(client, 0x32, priv->cb[9] + 16);
+ reg8_write(client, 0x33, priv->cb[8] + 16);
+ reg8_write(client, 0x34, priv->cb[7] + 16);
+ reg8_write(client, 0x35, priv->cb[6] + 16);
+ reg8_write(client, 0x36, priv->cb[5] + 16);
+ reg8_write(client, 0x37, priv->cb[4] + 16);
+ reg8_write(client, 0x38, priv->cb[3] + 16);
+ reg8_write(client, 0x39, priv->cb[2] + 16);
+ reg8_write(client, 0x3a, priv->cb[1] + 16);
+ reg8_write(client, 0x3b, priv->cb[0] + 16);
if (!priv->bws && priv->dbl)
dev_err(&client->dev, " BWS must be 27/32-bit for RAW12 in DBL mode\n");
@@ -733,7 +737,6 @@ static int max9286_parse_dt(struct i2c_client *client)
if (of_property_read_u32(np, "maxim,switchin", &priv->switchin))
priv->switchin = 0;
-
/* module params override dts */
if (him)
priv->him = him;
@@ -766,6 +769,12 @@ static int max9286_parse_dt(struct i2c_client *client)
if (switchin)
priv->switchin = switchin;
+ /* parse crossbar setup */
+ for (i = 0; i < 16; i++) {
+ priv->cb[i] = crossbar % 16;
+ crossbar /= 16;
+ }
+
for (i = 0; i < priv->links; i++) {
endpoint = of_graph_get_next_endpoint(np, endpoint);
if (!endpoint)
--
2.7.4
|