1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0+
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Maxim MAX9286 GMSL Deserializer Driver
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (C) 2017-2019 Jacopo Mondi
6*4882a593Smuzhiyun * Copyright (C) 2017-2019 Kieran Bingham
7*4882a593Smuzhiyun * Copyright (C) 2017-2019 Laurent Pinchart
8*4882a593Smuzhiyun * Copyright (C) 2017-2019 Niklas Söderlund
9*4882a593Smuzhiyun * Copyright (C) 2016 Renesas Electronics Corporation
10*4882a593Smuzhiyun * Copyright (C) 2015 Cogent Embedded, Inc.
11*4882a593Smuzhiyun */
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun #include <linux/delay.h>
14*4882a593Smuzhiyun #include <linux/device.h>
15*4882a593Smuzhiyun #include <linux/fwnode.h>
16*4882a593Smuzhiyun #include <linux/gpio/consumer.h>
17*4882a593Smuzhiyun #include <linux/gpio/driver.h>
18*4882a593Smuzhiyun #include <linux/i2c.h>
19*4882a593Smuzhiyun #include <linux/i2c-mux.h>
20*4882a593Smuzhiyun #include <linux/module.h>
21*4882a593Smuzhiyun #include <linux/mutex.h>
22*4882a593Smuzhiyun #include <linux/of_graph.h>
23*4882a593Smuzhiyun #include <linux/regulator/consumer.h>
24*4882a593Smuzhiyun #include <linux/slab.h>
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun #include <media/v4l2-async.h>
27*4882a593Smuzhiyun #include <media/v4l2-ctrls.h>
28*4882a593Smuzhiyun #include <media/v4l2-device.h>
29*4882a593Smuzhiyun #include <media/v4l2-fwnode.h>
30*4882a593Smuzhiyun #include <media/v4l2-subdev.h>
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun /* Register 0x00 */
33*4882a593Smuzhiyun #define MAX9286_MSTLINKSEL_AUTO (7 << 5)
34*4882a593Smuzhiyun #define MAX9286_MSTLINKSEL(n) ((n) << 5)
35*4882a593Smuzhiyun #define MAX9286_EN_VS_GEN BIT(4)
36*4882a593Smuzhiyun #define MAX9286_LINKEN(n) (1 << (n))
37*4882a593Smuzhiyun /* Register 0x01 */
38*4882a593Smuzhiyun #define MAX9286_FSYNCMODE_ECU (3 << 6)
39*4882a593Smuzhiyun #define MAX9286_FSYNCMODE_EXT (2 << 6)
40*4882a593Smuzhiyun #define MAX9286_FSYNCMODE_INT_OUT (1 << 6)
41*4882a593Smuzhiyun #define MAX9286_FSYNCMODE_INT_HIZ (0 << 6)
42*4882a593Smuzhiyun #define MAX9286_GPIEN BIT(5)
43*4882a593Smuzhiyun #define MAX9286_ENLMO_RSTFSYNC BIT(2)
44*4882a593Smuzhiyun #define MAX9286_FSYNCMETH_AUTO (2 << 0)
45*4882a593Smuzhiyun #define MAX9286_FSYNCMETH_SEMI_AUTO (1 << 0)
46*4882a593Smuzhiyun #define MAX9286_FSYNCMETH_MANUAL (0 << 0)
47*4882a593Smuzhiyun #define MAX9286_REG_FSYNC_PERIOD_L 0x06
48*4882a593Smuzhiyun #define MAX9286_REG_FSYNC_PERIOD_M 0x07
49*4882a593Smuzhiyun #define MAX9286_REG_FSYNC_PERIOD_H 0x08
50*4882a593Smuzhiyun /* Register 0x0a */
51*4882a593Smuzhiyun #define MAX9286_FWDCCEN(n) (1 << ((n) + 4))
52*4882a593Smuzhiyun #define MAX9286_REVCCEN(n) (1 << (n))
53*4882a593Smuzhiyun /* Register 0x0c */
54*4882a593Smuzhiyun #define MAX9286_HVEN BIT(7)
55*4882a593Smuzhiyun #define MAX9286_EDC_6BIT_HAMMING (2 << 5)
56*4882a593Smuzhiyun #define MAX9286_EDC_6BIT_CRC (1 << 5)
57*4882a593Smuzhiyun #define MAX9286_EDC_1BIT_PARITY (0 << 5)
58*4882a593Smuzhiyun #define MAX9286_DESEL BIT(4)
59*4882a593Smuzhiyun #define MAX9286_INVVS BIT(3)
60*4882a593Smuzhiyun #define MAX9286_INVHS BIT(2)
61*4882a593Smuzhiyun #define MAX9286_HVSRC_D0 (2 << 0)
62*4882a593Smuzhiyun #define MAX9286_HVSRC_D14 (1 << 0)
63*4882a593Smuzhiyun #define MAX9286_HVSRC_D18 (0 << 0)
64*4882a593Smuzhiyun /* Register 0x0f */
65*4882a593Smuzhiyun #define MAX9286_0X0F_RESERVED BIT(3)
66*4882a593Smuzhiyun /* Register 0x12 */
67*4882a593Smuzhiyun #define MAX9286_CSILANECNT(n) (((n) - 1) << 6)
68*4882a593Smuzhiyun #define MAX9286_CSIDBL BIT(5)
69*4882a593Smuzhiyun #define MAX9286_DBL BIT(4)
70*4882a593Smuzhiyun #define MAX9286_DATATYPE_USER_8BIT (11 << 0)
71*4882a593Smuzhiyun #define MAX9286_DATATYPE_USER_YUV_12BIT (10 << 0)
72*4882a593Smuzhiyun #define MAX9286_DATATYPE_USER_24BIT (9 << 0)
73*4882a593Smuzhiyun #define MAX9286_DATATYPE_RAW14 (8 << 0)
74*4882a593Smuzhiyun #define MAX9286_DATATYPE_RAW11 (7 << 0)
75*4882a593Smuzhiyun #define MAX9286_DATATYPE_RAW10 (6 << 0)
76*4882a593Smuzhiyun #define MAX9286_DATATYPE_RAW8 (5 << 0)
77*4882a593Smuzhiyun #define MAX9286_DATATYPE_YUV422_10BIT (4 << 0)
78*4882a593Smuzhiyun #define MAX9286_DATATYPE_YUV422_8BIT (3 << 0)
79*4882a593Smuzhiyun #define MAX9286_DATATYPE_RGB555 (2 << 0)
80*4882a593Smuzhiyun #define MAX9286_DATATYPE_RGB565 (1 << 0)
81*4882a593Smuzhiyun #define MAX9286_DATATYPE_RGB888 (0 << 0)
82*4882a593Smuzhiyun /* Register 0x15 */
83*4882a593Smuzhiyun #define MAX9286_VC(n) ((n) << 5)
84*4882a593Smuzhiyun #define MAX9286_VCTYPE BIT(4)
85*4882a593Smuzhiyun #define MAX9286_CSIOUTEN BIT(3)
86*4882a593Smuzhiyun #define MAX9286_0X15_RESV (3 << 0)
87*4882a593Smuzhiyun /* Register 0x1b */
88*4882a593Smuzhiyun #define MAX9286_SWITCHIN(n) (1 << ((n) + 4))
89*4882a593Smuzhiyun #define MAX9286_ENEQ(n) (1 << (n))
90*4882a593Smuzhiyun /* Register 0x27 */
91*4882a593Smuzhiyun #define MAX9286_LOCKED BIT(7)
92*4882a593Smuzhiyun /* Register 0x31 */
93*4882a593Smuzhiyun #define MAX9286_FSYNC_LOCKED BIT(6)
94*4882a593Smuzhiyun /* Register 0x34 */
95*4882a593Smuzhiyun #define MAX9286_I2CLOCACK BIT(7)
96*4882a593Smuzhiyun #define MAX9286_I2CSLVSH_1046NS_469NS (3 << 5)
97*4882a593Smuzhiyun #define MAX9286_I2CSLVSH_938NS_352NS (2 << 5)
98*4882a593Smuzhiyun #define MAX9286_I2CSLVSH_469NS_234NS (1 << 5)
99*4882a593Smuzhiyun #define MAX9286_I2CSLVSH_352NS_117NS (0 << 5)
100*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_837KBPS (7 << 2)
101*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_533KBPS (6 << 2)
102*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_339KBPS (5 << 2)
103*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_173KBPS (4 << 2)
104*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_105KBPS (3 << 2)
105*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_84KBPS (2 << 2)
106*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_28KBPS (1 << 2)
107*4882a593Smuzhiyun #define MAX9286_I2CMSTBT_8KBPS (0 << 2)
108*4882a593Smuzhiyun #define MAX9286_I2CSLVTO_NONE (3 << 0)
109*4882a593Smuzhiyun #define MAX9286_I2CSLVTO_1024US (2 << 0)
110*4882a593Smuzhiyun #define MAX9286_I2CSLVTO_256US (1 << 0)
111*4882a593Smuzhiyun #define MAX9286_I2CSLVTO_64US (0 << 0)
112*4882a593Smuzhiyun /* Register 0x3b */
113*4882a593Smuzhiyun #define MAX9286_REV_TRF(n) ((n) << 4)
114*4882a593Smuzhiyun #define MAX9286_REV_AMP(n) ((((n) - 30) / 10) << 1) /* in mV */
115*4882a593Smuzhiyun #define MAX9286_REV_AMP_X BIT(0)
116*4882a593Smuzhiyun /* Register 0x3f */
117*4882a593Smuzhiyun #define MAX9286_EN_REV_CFG BIT(6)
118*4882a593Smuzhiyun #define MAX9286_REV_FLEN(n) ((n) - 20)
119*4882a593Smuzhiyun /* Register 0x49 */
120*4882a593Smuzhiyun #define MAX9286_VIDEO_DETECT_MASK 0x0f
121*4882a593Smuzhiyun /* Register 0x69 */
122*4882a593Smuzhiyun #define MAX9286_LFLTBMONMASKED BIT(7)
123*4882a593Smuzhiyun #define MAX9286_LOCKMONMASKED BIT(6)
124*4882a593Smuzhiyun #define MAX9286_AUTOCOMBACKEN BIT(5)
125*4882a593Smuzhiyun #define MAX9286_AUTOMASKEN BIT(4)
126*4882a593Smuzhiyun #define MAX9286_MASKLINK(n) ((n) << 0)
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun /*
129*4882a593Smuzhiyun * The sink and source pads are created to match the OF graph port numbers so
130*4882a593Smuzhiyun * that their indexes can be used interchangeably.
131*4882a593Smuzhiyun */
132*4882a593Smuzhiyun #define MAX9286_NUM_GMSL 4
133*4882a593Smuzhiyun #define MAX9286_N_SINKS 4
134*4882a593Smuzhiyun #define MAX9286_N_PADS 5
135*4882a593Smuzhiyun #define MAX9286_SRC_PAD 4
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun struct max9286_source {
138*4882a593Smuzhiyun struct v4l2_subdev *sd;
139*4882a593Smuzhiyun struct fwnode_handle *fwnode;
140*4882a593Smuzhiyun };
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun struct max9286_asd {
143*4882a593Smuzhiyun struct v4l2_async_subdev base;
144*4882a593Smuzhiyun struct max9286_source *source;
145*4882a593Smuzhiyun };
146*4882a593Smuzhiyun
to_max9286_asd(struct v4l2_async_subdev * asd)147*4882a593Smuzhiyun static inline struct max9286_asd *to_max9286_asd(struct v4l2_async_subdev *asd)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun return container_of(asd, struct max9286_asd, base);
150*4882a593Smuzhiyun }
151*4882a593Smuzhiyun
152*4882a593Smuzhiyun struct max9286_priv {
153*4882a593Smuzhiyun struct i2c_client *client;
154*4882a593Smuzhiyun struct gpio_desc *gpiod_pwdn;
155*4882a593Smuzhiyun struct v4l2_subdev sd;
156*4882a593Smuzhiyun struct media_pad pads[MAX9286_N_PADS];
157*4882a593Smuzhiyun struct regulator *regulator;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun struct gpio_chip gpio;
160*4882a593Smuzhiyun u8 gpio_state;
161*4882a593Smuzhiyun
162*4882a593Smuzhiyun struct i2c_mux_core *mux;
163*4882a593Smuzhiyun unsigned int mux_channel;
164*4882a593Smuzhiyun bool mux_open;
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun struct v4l2_ctrl_handler ctrls;
167*4882a593Smuzhiyun struct v4l2_ctrl *pixelrate;
168*4882a593Smuzhiyun
169*4882a593Smuzhiyun struct v4l2_mbus_framefmt fmt[MAX9286_N_SINKS];
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun /* Protects controls and fmt structures */
172*4882a593Smuzhiyun struct mutex mutex;
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun unsigned int nsources;
175*4882a593Smuzhiyun unsigned int source_mask;
176*4882a593Smuzhiyun unsigned int route_mask;
177*4882a593Smuzhiyun unsigned int bound_sources;
178*4882a593Smuzhiyun unsigned int csi2_data_lanes;
179*4882a593Smuzhiyun struct max9286_source sources[MAX9286_NUM_GMSL];
180*4882a593Smuzhiyun struct v4l2_async_notifier notifier;
181*4882a593Smuzhiyun };
182*4882a593Smuzhiyun
next_source(struct max9286_priv * priv,struct max9286_source * source)183*4882a593Smuzhiyun static struct max9286_source *next_source(struct max9286_priv *priv,
184*4882a593Smuzhiyun struct max9286_source *source)
185*4882a593Smuzhiyun {
186*4882a593Smuzhiyun if (!source)
187*4882a593Smuzhiyun source = &priv->sources[0];
188*4882a593Smuzhiyun else
189*4882a593Smuzhiyun source++;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun for (; source < &priv->sources[MAX9286_NUM_GMSL]; source++) {
192*4882a593Smuzhiyun if (source->fwnode)
193*4882a593Smuzhiyun return source;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun return NULL;
197*4882a593Smuzhiyun }
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun #define for_each_source(priv, source) \
200*4882a593Smuzhiyun for ((source) = NULL; ((source) = next_source((priv), (source))); )
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun #define to_index(priv, source) ((source) - &(priv)->sources[0])
203*4882a593Smuzhiyun
sd_to_max9286(struct v4l2_subdev * sd)204*4882a593Smuzhiyun static inline struct max9286_priv *sd_to_max9286(struct v4l2_subdev *sd)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun return container_of(sd, struct max9286_priv, sd);
207*4882a593Smuzhiyun }
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun /* -----------------------------------------------------------------------------
210*4882a593Smuzhiyun * I2C IO
211*4882a593Smuzhiyun */
212*4882a593Smuzhiyun
max9286_read(struct max9286_priv * priv,u8 reg)213*4882a593Smuzhiyun static int max9286_read(struct max9286_priv *priv, u8 reg)
214*4882a593Smuzhiyun {
215*4882a593Smuzhiyun int ret;
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun ret = i2c_smbus_read_byte_data(priv->client, reg);
218*4882a593Smuzhiyun if (ret < 0)
219*4882a593Smuzhiyun dev_err(&priv->client->dev,
220*4882a593Smuzhiyun "%s: register 0x%02x read failed (%d)\n",
221*4882a593Smuzhiyun __func__, reg, ret);
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun return ret;
224*4882a593Smuzhiyun }
225*4882a593Smuzhiyun
max9286_write(struct max9286_priv * priv,u8 reg,u8 val)226*4882a593Smuzhiyun static int max9286_write(struct max9286_priv *priv, u8 reg, u8 val)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun int ret;
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun ret = i2c_smbus_write_byte_data(priv->client, reg, val);
231*4882a593Smuzhiyun if (ret < 0)
232*4882a593Smuzhiyun dev_err(&priv->client->dev,
233*4882a593Smuzhiyun "%s: register 0x%02x write failed (%d)\n",
234*4882a593Smuzhiyun __func__, reg, ret);
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun return ret;
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun /* -----------------------------------------------------------------------------
240*4882a593Smuzhiyun * I2C Multiplexer
241*4882a593Smuzhiyun */
242*4882a593Smuzhiyun
max9286_i2c_mux_configure(struct max9286_priv * priv,u8 conf)243*4882a593Smuzhiyun static void max9286_i2c_mux_configure(struct max9286_priv *priv, u8 conf)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun max9286_write(priv, 0x0a, conf);
246*4882a593Smuzhiyun
247*4882a593Smuzhiyun /*
248*4882a593Smuzhiyun * We must sleep after any change to the forward or reverse channel
249*4882a593Smuzhiyun * configuration.
250*4882a593Smuzhiyun */
251*4882a593Smuzhiyun usleep_range(3000, 5000);
252*4882a593Smuzhiyun }
253*4882a593Smuzhiyun
max9286_i2c_mux_open(struct max9286_priv * priv)254*4882a593Smuzhiyun static void max9286_i2c_mux_open(struct max9286_priv *priv)
255*4882a593Smuzhiyun {
256*4882a593Smuzhiyun /* Open all channels on the MAX9286 */
257*4882a593Smuzhiyun max9286_i2c_mux_configure(priv, 0xff);
258*4882a593Smuzhiyun
259*4882a593Smuzhiyun priv->mux_open = true;
260*4882a593Smuzhiyun }
261*4882a593Smuzhiyun
max9286_i2c_mux_close(struct max9286_priv * priv)262*4882a593Smuzhiyun static void max9286_i2c_mux_close(struct max9286_priv *priv)
263*4882a593Smuzhiyun {
264*4882a593Smuzhiyun /*
265*4882a593Smuzhiyun * Ensure that both the forward and reverse channel are disabled on the
266*4882a593Smuzhiyun * mux, and that the channel ID is invalidated to ensure we reconfigure
267*4882a593Smuzhiyun * on the next max9286_i2c_mux_select() call.
268*4882a593Smuzhiyun */
269*4882a593Smuzhiyun max9286_i2c_mux_configure(priv, 0x00);
270*4882a593Smuzhiyun
271*4882a593Smuzhiyun priv->mux_open = false;
272*4882a593Smuzhiyun priv->mux_channel = -1;
273*4882a593Smuzhiyun }
274*4882a593Smuzhiyun
max9286_i2c_mux_select(struct i2c_mux_core * muxc,u32 chan)275*4882a593Smuzhiyun static int max9286_i2c_mux_select(struct i2c_mux_core *muxc, u32 chan)
276*4882a593Smuzhiyun {
277*4882a593Smuzhiyun struct max9286_priv *priv = i2c_mux_priv(muxc);
278*4882a593Smuzhiyun
279*4882a593Smuzhiyun /* Channel select is disabled when configured in the opened state. */
280*4882a593Smuzhiyun if (priv->mux_open)
281*4882a593Smuzhiyun return 0;
282*4882a593Smuzhiyun
283*4882a593Smuzhiyun if (priv->mux_channel == chan)
284*4882a593Smuzhiyun return 0;
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun priv->mux_channel = chan;
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun max9286_i2c_mux_configure(priv,
289*4882a593Smuzhiyun MAX9286_FWDCCEN(chan) |
290*4882a593Smuzhiyun MAX9286_REVCCEN(chan));
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun return 0;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun
max9286_i2c_mux_init(struct max9286_priv * priv)295*4882a593Smuzhiyun static int max9286_i2c_mux_init(struct max9286_priv *priv)
296*4882a593Smuzhiyun {
297*4882a593Smuzhiyun struct max9286_source *source;
298*4882a593Smuzhiyun int ret;
299*4882a593Smuzhiyun
300*4882a593Smuzhiyun if (!i2c_check_functionality(priv->client->adapter,
301*4882a593Smuzhiyun I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
302*4882a593Smuzhiyun return -ENODEV;
303*4882a593Smuzhiyun
304*4882a593Smuzhiyun priv->mux = i2c_mux_alloc(priv->client->adapter, &priv->client->dev,
305*4882a593Smuzhiyun priv->nsources, 0, I2C_MUX_LOCKED,
306*4882a593Smuzhiyun max9286_i2c_mux_select, NULL);
307*4882a593Smuzhiyun if (!priv->mux)
308*4882a593Smuzhiyun return -ENOMEM;
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun priv->mux->priv = priv;
311*4882a593Smuzhiyun
312*4882a593Smuzhiyun for_each_source(priv, source) {
313*4882a593Smuzhiyun unsigned int index = to_index(priv, source);
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun ret = i2c_mux_add_adapter(priv->mux, 0, index, 0);
316*4882a593Smuzhiyun if (ret < 0)
317*4882a593Smuzhiyun goto error;
318*4882a593Smuzhiyun }
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun return 0;
321*4882a593Smuzhiyun
322*4882a593Smuzhiyun error:
323*4882a593Smuzhiyun i2c_mux_del_adapters(priv->mux);
324*4882a593Smuzhiyun return ret;
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun
max9286_configure_i2c(struct max9286_priv * priv,bool localack)327*4882a593Smuzhiyun static void max9286_configure_i2c(struct max9286_priv *priv, bool localack)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun u8 config = MAX9286_I2CSLVSH_469NS_234NS | MAX9286_I2CSLVTO_1024US |
330*4882a593Smuzhiyun MAX9286_I2CMSTBT_105KBPS;
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun if (localack)
333*4882a593Smuzhiyun config |= MAX9286_I2CLOCACK;
334*4882a593Smuzhiyun
335*4882a593Smuzhiyun max9286_write(priv, 0x34, config);
336*4882a593Smuzhiyun usleep_range(3000, 5000);
337*4882a593Smuzhiyun }
338*4882a593Smuzhiyun
339*4882a593Smuzhiyun /*
340*4882a593Smuzhiyun * max9286_check_video_links() - Make sure video links are detected and locked
341*4882a593Smuzhiyun *
342*4882a593Smuzhiyun * Performs safety checks on video link status. Make sure they are detected
343*4882a593Smuzhiyun * and all enabled links are locked.
344*4882a593Smuzhiyun *
345*4882a593Smuzhiyun * Returns 0 for success, -EIO for errors.
346*4882a593Smuzhiyun */
max9286_check_video_links(struct max9286_priv * priv)347*4882a593Smuzhiyun static int max9286_check_video_links(struct max9286_priv *priv)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun unsigned int i;
350*4882a593Smuzhiyun int ret;
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun /*
353*4882a593Smuzhiyun * Make sure valid video links are detected.
354*4882a593Smuzhiyun * The delay is not characterized in de-serializer manual, wait up
355*4882a593Smuzhiyun * to 5 ms.
356*4882a593Smuzhiyun */
357*4882a593Smuzhiyun for (i = 0; i < 10; i++) {
358*4882a593Smuzhiyun ret = max9286_read(priv, 0x49);
359*4882a593Smuzhiyun if (ret < 0)
360*4882a593Smuzhiyun return -EIO;
361*4882a593Smuzhiyun
362*4882a593Smuzhiyun if ((ret & MAX9286_VIDEO_DETECT_MASK) == priv->source_mask)
363*4882a593Smuzhiyun break;
364*4882a593Smuzhiyun
365*4882a593Smuzhiyun usleep_range(350, 500);
366*4882a593Smuzhiyun }
367*4882a593Smuzhiyun
368*4882a593Smuzhiyun if (i == 10) {
369*4882a593Smuzhiyun dev_err(&priv->client->dev,
370*4882a593Smuzhiyun "Unable to detect video links: 0x%02x\n", ret);
371*4882a593Smuzhiyun return -EIO;
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun
374*4882a593Smuzhiyun /* Make sure all enabled links are locked (4ms max). */
375*4882a593Smuzhiyun for (i = 0; i < 10; i++) {
376*4882a593Smuzhiyun ret = max9286_read(priv, 0x27);
377*4882a593Smuzhiyun if (ret < 0)
378*4882a593Smuzhiyun return -EIO;
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun if (ret & MAX9286_LOCKED)
381*4882a593Smuzhiyun break;
382*4882a593Smuzhiyun
383*4882a593Smuzhiyun usleep_range(350, 450);
384*4882a593Smuzhiyun }
385*4882a593Smuzhiyun
386*4882a593Smuzhiyun if (i == 10) {
387*4882a593Smuzhiyun dev_err(&priv->client->dev, "Not all enabled links locked\n");
388*4882a593Smuzhiyun return -EIO;
389*4882a593Smuzhiyun }
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun return 0;
392*4882a593Smuzhiyun }
393*4882a593Smuzhiyun
394*4882a593Smuzhiyun /*
395*4882a593Smuzhiyun * max9286_check_config_link() - Detect and wait for configuration links
396*4882a593Smuzhiyun *
397*4882a593Smuzhiyun * Determine if the configuration channel is up and settled for a link.
398*4882a593Smuzhiyun *
399*4882a593Smuzhiyun * Returns 0 for success, -EIO for errors.
400*4882a593Smuzhiyun */
max9286_check_config_link(struct max9286_priv * priv,unsigned int source_mask)401*4882a593Smuzhiyun static int max9286_check_config_link(struct max9286_priv *priv,
402*4882a593Smuzhiyun unsigned int source_mask)
403*4882a593Smuzhiyun {
404*4882a593Smuzhiyun unsigned int conflink_mask = (source_mask & 0x0f) << 4;
405*4882a593Smuzhiyun unsigned int i;
406*4882a593Smuzhiyun int ret;
407*4882a593Smuzhiyun
408*4882a593Smuzhiyun /*
409*4882a593Smuzhiyun * Make sure requested configuration links are detected.
410*4882a593Smuzhiyun * The delay is not characterized in the chip manual: wait up
411*4882a593Smuzhiyun * to 5 milliseconds.
412*4882a593Smuzhiyun */
413*4882a593Smuzhiyun for (i = 0; i < 10; i++) {
414*4882a593Smuzhiyun ret = max9286_read(priv, 0x49);
415*4882a593Smuzhiyun if (ret < 0)
416*4882a593Smuzhiyun return -EIO;
417*4882a593Smuzhiyun
418*4882a593Smuzhiyun ret &= 0xf0;
419*4882a593Smuzhiyun if (ret == conflink_mask)
420*4882a593Smuzhiyun break;
421*4882a593Smuzhiyun
422*4882a593Smuzhiyun usleep_range(350, 500);
423*4882a593Smuzhiyun }
424*4882a593Smuzhiyun
425*4882a593Smuzhiyun if (ret != conflink_mask) {
426*4882a593Smuzhiyun dev_err(&priv->client->dev,
427*4882a593Smuzhiyun "Unable to detect configuration links: 0x%02x expected 0x%02x\n",
428*4882a593Smuzhiyun ret, conflink_mask);
429*4882a593Smuzhiyun return -EIO;
430*4882a593Smuzhiyun }
431*4882a593Smuzhiyun
432*4882a593Smuzhiyun dev_info(&priv->client->dev,
433*4882a593Smuzhiyun "Successfully detected configuration links after %u loops: 0x%02x\n",
434*4882a593Smuzhiyun i, conflink_mask);
435*4882a593Smuzhiyun
436*4882a593Smuzhiyun return 0;
437*4882a593Smuzhiyun }
438*4882a593Smuzhiyun
439*4882a593Smuzhiyun /* -----------------------------------------------------------------------------
440*4882a593Smuzhiyun * V4L2 Subdev
441*4882a593Smuzhiyun */
442*4882a593Smuzhiyun
max9286_set_pixelrate(struct max9286_priv * priv)443*4882a593Smuzhiyun static int max9286_set_pixelrate(struct max9286_priv *priv)
444*4882a593Smuzhiyun {
445*4882a593Smuzhiyun struct max9286_source *source = NULL;
446*4882a593Smuzhiyun u64 pixelrate = 0;
447*4882a593Smuzhiyun
448*4882a593Smuzhiyun for_each_source(priv, source) {
449*4882a593Smuzhiyun struct v4l2_ctrl *ctrl;
450*4882a593Smuzhiyun u64 source_rate = 0;
451*4882a593Smuzhiyun
452*4882a593Smuzhiyun /* Pixel rate is mandatory to be reported by sources. */
453*4882a593Smuzhiyun ctrl = v4l2_ctrl_find(source->sd->ctrl_handler,
454*4882a593Smuzhiyun V4L2_CID_PIXEL_RATE);
455*4882a593Smuzhiyun if (!ctrl) {
456*4882a593Smuzhiyun pixelrate = 0;
457*4882a593Smuzhiyun break;
458*4882a593Smuzhiyun }
459*4882a593Smuzhiyun
460*4882a593Smuzhiyun /* All source must report the same pixel rate. */
461*4882a593Smuzhiyun source_rate = v4l2_ctrl_g_ctrl_int64(ctrl);
462*4882a593Smuzhiyun if (!pixelrate) {
463*4882a593Smuzhiyun pixelrate = source_rate;
464*4882a593Smuzhiyun } else if (pixelrate != source_rate) {
465*4882a593Smuzhiyun dev_err(&priv->client->dev,
466*4882a593Smuzhiyun "Unable to calculate pixel rate\n");
467*4882a593Smuzhiyun return -EINVAL;
468*4882a593Smuzhiyun }
469*4882a593Smuzhiyun }
470*4882a593Smuzhiyun
471*4882a593Smuzhiyun if (!pixelrate) {
472*4882a593Smuzhiyun dev_err(&priv->client->dev,
473*4882a593Smuzhiyun "No pixel rate control available in sources\n");
474*4882a593Smuzhiyun return -EINVAL;
475*4882a593Smuzhiyun }
476*4882a593Smuzhiyun
477*4882a593Smuzhiyun /*
478*4882a593Smuzhiyun * The CSI-2 transmitter pixel rate is the single source rate multiplied
479*4882a593Smuzhiyun * by the number of available sources.
480*4882a593Smuzhiyun */
481*4882a593Smuzhiyun return v4l2_ctrl_s_ctrl_int64(priv->pixelrate,
482*4882a593Smuzhiyun pixelrate * priv->nsources);
483*4882a593Smuzhiyun }
484*4882a593Smuzhiyun
max9286_notify_bound(struct v4l2_async_notifier * notifier,struct v4l2_subdev * subdev,struct v4l2_async_subdev * asd)485*4882a593Smuzhiyun static int max9286_notify_bound(struct v4l2_async_notifier *notifier,
486*4882a593Smuzhiyun struct v4l2_subdev *subdev,
487*4882a593Smuzhiyun struct v4l2_async_subdev *asd)
488*4882a593Smuzhiyun {
489*4882a593Smuzhiyun struct max9286_priv *priv = sd_to_max9286(notifier->sd);
490*4882a593Smuzhiyun struct max9286_source *source = to_max9286_asd(asd)->source;
491*4882a593Smuzhiyun unsigned int index = to_index(priv, source);
492*4882a593Smuzhiyun unsigned int src_pad;
493*4882a593Smuzhiyun int ret;
494*4882a593Smuzhiyun
495*4882a593Smuzhiyun ret = media_entity_get_fwnode_pad(&subdev->entity,
496*4882a593Smuzhiyun source->fwnode,
497*4882a593Smuzhiyun MEDIA_PAD_FL_SOURCE);
498*4882a593Smuzhiyun if (ret < 0) {
499*4882a593Smuzhiyun dev_err(&priv->client->dev,
500*4882a593Smuzhiyun "Failed to find pad for %s\n", subdev->name);
501*4882a593Smuzhiyun return ret;
502*4882a593Smuzhiyun }
503*4882a593Smuzhiyun
504*4882a593Smuzhiyun priv->bound_sources |= BIT(index);
505*4882a593Smuzhiyun source->sd = subdev;
506*4882a593Smuzhiyun src_pad = ret;
507*4882a593Smuzhiyun
508*4882a593Smuzhiyun ret = media_create_pad_link(&source->sd->entity, src_pad,
509*4882a593Smuzhiyun &priv->sd.entity, index,
510*4882a593Smuzhiyun MEDIA_LNK_FL_ENABLED |
511*4882a593Smuzhiyun MEDIA_LNK_FL_IMMUTABLE);
512*4882a593Smuzhiyun if (ret) {
513*4882a593Smuzhiyun dev_err(&priv->client->dev,
514*4882a593Smuzhiyun "Unable to link %s:%u -> %s:%u\n",
515*4882a593Smuzhiyun source->sd->name, src_pad, priv->sd.name, index);
516*4882a593Smuzhiyun return ret;
517*4882a593Smuzhiyun }
518*4882a593Smuzhiyun
519*4882a593Smuzhiyun dev_dbg(&priv->client->dev, "Bound %s pad: %u on index %u\n",
520*4882a593Smuzhiyun subdev->name, src_pad, index);
521*4882a593Smuzhiyun
522*4882a593Smuzhiyun /*
523*4882a593Smuzhiyun * We can only register v4l2_async_notifiers, which do not provide a
524*4882a593Smuzhiyun * means to register a complete callback. bound_sources allows us to
525*4882a593Smuzhiyun * identify when all remote serializers have completed their probe.
526*4882a593Smuzhiyun */
527*4882a593Smuzhiyun if (priv->bound_sources != priv->source_mask)
528*4882a593Smuzhiyun return 0;
529*4882a593Smuzhiyun
530*4882a593Smuzhiyun /*
531*4882a593Smuzhiyun * All enabled sources have probed and enabled their reverse control
532*4882a593Smuzhiyun * channels:
533*4882a593Smuzhiyun *
534*4882a593Smuzhiyun * - Verify all configuration links are properly detected
535*4882a593Smuzhiyun * - Disable auto-ack as communication on the control channel are now
536*4882a593Smuzhiyun * stable.
537*4882a593Smuzhiyun */
538*4882a593Smuzhiyun max9286_check_config_link(priv, priv->source_mask);
539*4882a593Smuzhiyun
540*4882a593Smuzhiyun /*
541*4882a593Smuzhiyun * Re-configure I2C with local acknowledge disabled after cameras have
542*4882a593Smuzhiyun * probed.
543*4882a593Smuzhiyun */
544*4882a593Smuzhiyun max9286_configure_i2c(priv, false);
545*4882a593Smuzhiyun
546*4882a593Smuzhiyun return max9286_set_pixelrate(priv);
547*4882a593Smuzhiyun }
548*4882a593Smuzhiyun
max9286_notify_unbind(struct v4l2_async_notifier * notifier,struct v4l2_subdev * subdev,struct v4l2_async_subdev * asd)549*4882a593Smuzhiyun static void max9286_notify_unbind(struct v4l2_async_notifier *notifier,
550*4882a593Smuzhiyun struct v4l2_subdev *subdev,
551*4882a593Smuzhiyun struct v4l2_async_subdev *asd)
552*4882a593Smuzhiyun {
553*4882a593Smuzhiyun struct max9286_priv *priv = sd_to_max9286(notifier->sd);
554*4882a593Smuzhiyun struct max9286_source *source = to_max9286_asd(asd)->source;
555*4882a593Smuzhiyun unsigned int index = to_index(priv, source);
556*4882a593Smuzhiyun
557*4882a593Smuzhiyun source->sd = NULL;
558*4882a593Smuzhiyun priv->bound_sources &= ~BIT(index);
559*4882a593Smuzhiyun }
560*4882a593Smuzhiyun
561*4882a593Smuzhiyun static const struct v4l2_async_notifier_operations max9286_notify_ops = {
562*4882a593Smuzhiyun .bound = max9286_notify_bound,
563*4882a593Smuzhiyun .unbind = max9286_notify_unbind,
564*4882a593Smuzhiyun };
565*4882a593Smuzhiyun
max9286_v4l2_notifier_register(struct max9286_priv * priv)566*4882a593Smuzhiyun static int max9286_v4l2_notifier_register(struct max9286_priv *priv)
567*4882a593Smuzhiyun {
568*4882a593Smuzhiyun struct device *dev = &priv->client->dev;
569*4882a593Smuzhiyun struct max9286_source *source = NULL;
570*4882a593Smuzhiyun int ret;
571*4882a593Smuzhiyun
572*4882a593Smuzhiyun if (!priv->nsources)
573*4882a593Smuzhiyun return 0;
574*4882a593Smuzhiyun
575*4882a593Smuzhiyun v4l2_async_notifier_init(&priv->notifier);
576*4882a593Smuzhiyun
577*4882a593Smuzhiyun for_each_source(priv, source) {
578*4882a593Smuzhiyun unsigned int i = to_index(priv, source);
579*4882a593Smuzhiyun struct v4l2_async_subdev *asd;
580*4882a593Smuzhiyun
581*4882a593Smuzhiyun asd = v4l2_async_notifier_add_fwnode_subdev(&priv->notifier,
582*4882a593Smuzhiyun source->fwnode,
583*4882a593Smuzhiyun sizeof(struct max9286_asd));
584*4882a593Smuzhiyun if (IS_ERR(asd)) {
585*4882a593Smuzhiyun dev_err(dev, "Failed to add subdev for source %u: %ld",
586*4882a593Smuzhiyun i, PTR_ERR(asd));
587*4882a593Smuzhiyun v4l2_async_notifier_cleanup(&priv->notifier);
588*4882a593Smuzhiyun return PTR_ERR(asd);
589*4882a593Smuzhiyun }
590*4882a593Smuzhiyun
591*4882a593Smuzhiyun to_max9286_asd(asd)->source = source;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun priv->notifier.ops = &max9286_notify_ops;
595*4882a593Smuzhiyun
596*4882a593Smuzhiyun ret = v4l2_async_subdev_notifier_register(&priv->sd, &priv->notifier);
597*4882a593Smuzhiyun if (ret) {
598*4882a593Smuzhiyun dev_err(dev, "Failed to register subdev_notifier");
599*4882a593Smuzhiyun v4l2_async_notifier_cleanup(&priv->notifier);
600*4882a593Smuzhiyun return ret;
601*4882a593Smuzhiyun }
602*4882a593Smuzhiyun
603*4882a593Smuzhiyun return 0;
604*4882a593Smuzhiyun }
605*4882a593Smuzhiyun
max9286_v4l2_notifier_unregister(struct max9286_priv * priv)606*4882a593Smuzhiyun static void max9286_v4l2_notifier_unregister(struct max9286_priv *priv)
607*4882a593Smuzhiyun {
608*4882a593Smuzhiyun if (!priv->nsources)
609*4882a593Smuzhiyun return;
610*4882a593Smuzhiyun
611*4882a593Smuzhiyun v4l2_async_notifier_unregister(&priv->notifier);
612*4882a593Smuzhiyun v4l2_async_notifier_cleanup(&priv->notifier);
613*4882a593Smuzhiyun }
614*4882a593Smuzhiyun
max9286_s_stream(struct v4l2_subdev * sd,int enable)615*4882a593Smuzhiyun static int max9286_s_stream(struct v4l2_subdev *sd, int enable)
616*4882a593Smuzhiyun {
617*4882a593Smuzhiyun struct max9286_priv *priv = sd_to_max9286(sd);
618*4882a593Smuzhiyun struct max9286_source *source;
619*4882a593Smuzhiyun unsigned int i;
620*4882a593Smuzhiyun bool sync = false;
621*4882a593Smuzhiyun int ret;
622*4882a593Smuzhiyun
623*4882a593Smuzhiyun if (enable) {
624*4882a593Smuzhiyun /*
625*4882a593Smuzhiyun * The frame sync between cameras is transmitted across the
626*4882a593Smuzhiyun * reverse channel as GPIO. We must open all channels while
627*4882a593Smuzhiyun * streaming to allow this synchronisation signal to be shared.
628*4882a593Smuzhiyun */
629*4882a593Smuzhiyun max9286_i2c_mux_open(priv);
630*4882a593Smuzhiyun
631*4882a593Smuzhiyun /* Start all cameras. */
632*4882a593Smuzhiyun for_each_source(priv, source) {
633*4882a593Smuzhiyun ret = v4l2_subdev_call(source->sd, video, s_stream, 1);
634*4882a593Smuzhiyun if (ret)
635*4882a593Smuzhiyun return ret;
636*4882a593Smuzhiyun }
637*4882a593Smuzhiyun
638*4882a593Smuzhiyun ret = max9286_check_video_links(priv);
639*4882a593Smuzhiyun if (ret)
640*4882a593Smuzhiyun return ret;
641*4882a593Smuzhiyun
642*4882a593Smuzhiyun /*
643*4882a593Smuzhiyun * Wait until frame synchronization is locked.
644*4882a593Smuzhiyun *
645*4882a593Smuzhiyun * Manual says frame sync locking should take ~6 VTS.
646*4882a593Smuzhiyun * From practical experience at least 8 are required. Give
647*4882a593Smuzhiyun * 12 complete frames time (~400ms at 30 fps) to achieve frame
648*4882a593Smuzhiyun * locking before returning error.
649*4882a593Smuzhiyun */
650*4882a593Smuzhiyun for (i = 0; i < 40; i++) {
651*4882a593Smuzhiyun if (max9286_read(priv, 0x31) & MAX9286_FSYNC_LOCKED) {
652*4882a593Smuzhiyun sync = true;
653*4882a593Smuzhiyun break;
654*4882a593Smuzhiyun }
655*4882a593Smuzhiyun usleep_range(9000, 11000);
656*4882a593Smuzhiyun }
657*4882a593Smuzhiyun
658*4882a593Smuzhiyun if (!sync) {
659*4882a593Smuzhiyun dev_err(&priv->client->dev,
660*4882a593Smuzhiyun "Failed to get frame synchronization\n");
661*4882a593Smuzhiyun return -EXDEV; /* Invalid cross-device link */
662*4882a593Smuzhiyun }
663*4882a593Smuzhiyun
664*4882a593Smuzhiyun /*
665*4882a593Smuzhiyun * Enable CSI output, VC set according to link number.
666*4882a593Smuzhiyun * Bit 7 must be set (chip manual says it's 0 and reserved).
667*4882a593Smuzhiyun */
668*4882a593Smuzhiyun max9286_write(priv, 0x15, 0x80 | MAX9286_VCTYPE |
669*4882a593Smuzhiyun MAX9286_CSIOUTEN | MAX9286_0X15_RESV);
670*4882a593Smuzhiyun } else {
671*4882a593Smuzhiyun max9286_write(priv, 0x15, MAX9286_VCTYPE | MAX9286_0X15_RESV);
672*4882a593Smuzhiyun
673*4882a593Smuzhiyun /* Stop all cameras. */
674*4882a593Smuzhiyun for_each_source(priv, source)
675*4882a593Smuzhiyun v4l2_subdev_call(source->sd, video, s_stream, 0);
676*4882a593Smuzhiyun
677*4882a593Smuzhiyun max9286_i2c_mux_close(priv);
678*4882a593Smuzhiyun }
679*4882a593Smuzhiyun
680*4882a593Smuzhiyun return 0;
681*4882a593Smuzhiyun }
682*4882a593Smuzhiyun
max9286_enum_mbus_code(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_mbus_code_enum * code)683*4882a593Smuzhiyun static int max9286_enum_mbus_code(struct v4l2_subdev *sd,
684*4882a593Smuzhiyun struct v4l2_subdev_pad_config *cfg,
685*4882a593Smuzhiyun struct v4l2_subdev_mbus_code_enum *code)
686*4882a593Smuzhiyun {
687*4882a593Smuzhiyun if (code->pad || code->index > 0)
688*4882a593Smuzhiyun return -EINVAL;
689*4882a593Smuzhiyun
690*4882a593Smuzhiyun code->code = MEDIA_BUS_FMT_UYVY8_1X16;
691*4882a593Smuzhiyun
692*4882a593Smuzhiyun return 0;
693*4882a593Smuzhiyun }
694*4882a593Smuzhiyun
695*4882a593Smuzhiyun static struct v4l2_mbus_framefmt *
max9286_get_pad_format(struct max9286_priv * priv,struct v4l2_subdev_pad_config * cfg,unsigned int pad,u32 which)696*4882a593Smuzhiyun max9286_get_pad_format(struct max9286_priv *priv,
697*4882a593Smuzhiyun struct v4l2_subdev_pad_config *cfg,
698*4882a593Smuzhiyun unsigned int pad, u32 which)
699*4882a593Smuzhiyun {
700*4882a593Smuzhiyun switch (which) {
701*4882a593Smuzhiyun case V4L2_SUBDEV_FORMAT_TRY:
702*4882a593Smuzhiyun return v4l2_subdev_get_try_format(&priv->sd, cfg, pad);
703*4882a593Smuzhiyun case V4L2_SUBDEV_FORMAT_ACTIVE:
704*4882a593Smuzhiyun return &priv->fmt[pad];
705*4882a593Smuzhiyun default:
706*4882a593Smuzhiyun return NULL;
707*4882a593Smuzhiyun }
708*4882a593Smuzhiyun }
709*4882a593Smuzhiyun
max9286_set_fmt(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_format * format)710*4882a593Smuzhiyun static int max9286_set_fmt(struct v4l2_subdev *sd,
711*4882a593Smuzhiyun struct v4l2_subdev_pad_config *cfg,
712*4882a593Smuzhiyun struct v4l2_subdev_format *format)
713*4882a593Smuzhiyun {
714*4882a593Smuzhiyun struct max9286_priv *priv = sd_to_max9286(sd);
715*4882a593Smuzhiyun struct v4l2_mbus_framefmt *cfg_fmt;
716*4882a593Smuzhiyun
717*4882a593Smuzhiyun if (format->pad == MAX9286_SRC_PAD)
718*4882a593Smuzhiyun return -EINVAL;
719*4882a593Smuzhiyun
720*4882a593Smuzhiyun /* Refuse non YUV422 formats as we hardcode DT to 8 bit YUV422 */
721*4882a593Smuzhiyun switch (format->format.code) {
722*4882a593Smuzhiyun case MEDIA_BUS_FMT_UYVY8_1X16:
723*4882a593Smuzhiyun case MEDIA_BUS_FMT_VYUY8_1X16:
724*4882a593Smuzhiyun case MEDIA_BUS_FMT_YUYV8_1X16:
725*4882a593Smuzhiyun case MEDIA_BUS_FMT_YVYU8_1X16:
726*4882a593Smuzhiyun break;
727*4882a593Smuzhiyun default:
728*4882a593Smuzhiyun format->format.code = MEDIA_BUS_FMT_UYVY8_1X16;
729*4882a593Smuzhiyun break;
730*4882a593Smuzhiyun }
731*4882a593Smuzhiyun
732*4882a593Smuzhiyun cfg_fmt = max9286_get_pad_format(priv, cfg, format->pad, format->which);
733*4882a593Smuzhiyun if (!cfg_fmt)
734*4882a593Smuzhiyun return -EINVAL;
735*4882a593Smuzhiyun
736*4882a593Smuzhiyun mutex_lock(&priv->mutex);
737*4882a593Smuzhiyun *cfg_fmt = format->format;
738*4882a593Smuzhiyun mutex_unlock(&priv->mutex);
739*4882a593Smuzhiyun
740*4882a593Smuzhiyun return 0;
741*4882a593Smuzhiyun }
742*4882a593Smuzhiyun
max9286_get_fmt(struct v4l2_subdev * sd,struct v4l2_subdev_pad_config * cfg,struct v4l2_subdev_format * format)743*4882a593Smuzhiyun static int max9286_get_fmt(struct v4l2_subdev *sd,
744*4882a593Smuzhiyun struct v4l2_subdev_pad_config *cfg,
745*4882a593Smuzhiyun struct v4l2_subdev_format *format)
746*4882a593Smuzhiyun {
747*4882a593Smuzhiyun struct max9286_priv *priv = sd_to_max9286(sd);
748*4882a593Smuzhiyun struct v4l2_mbus_framefmt *cfg_fmt;
749*4882a593Smuzhiyun unsigned int pad = format->pad;
750*4882a593Smuzhiyun
751*4882a593Smuzhiyun /*
752*4882a593Smuzhiyun * Multiplexed Stream Support: Support link validation by returning the
753*4882a593Smuzhiyun * format of the first bound link. All links must have the same format,
754*4882a593Smuzhiyun * as we do not support mixing and matching of cameras connected to the
755*4882a593Smuzhiyun * max9286.
756*4882a593Smuzhiyun */
757*4882a593Smuzhiyun if (pad == MAX9286_SRC_PAD)
758*4882a593Smuzhiyun pad = __ffs(priv->bound_sources);
759*4882a593Smuzhiyun
760*4882a593Smuzhiyun cfg_fmt = max9286_get_pad_format(priv, cfg, pad, format->which);
761*4882a593Smuzhiyun if (!cfg_fmt)
762*4882a593Smuzhiyun return -EINVAL;
763*4882a593Smuzhiyun
764*4882a593Smuzhiyun mutex_lock(&priv->mutex);
765*4882a593Smuzhiyun format->format = *cfg_fmt;
766*4882a593Smuzhiyun mutex_unlock(&priv->mutex);
767*4882a593Smuzhiyun
768*4882a593Smuzhiyun return 0;
769*4882a593Smuzhiyun }
770*4882a593Smuzhiyun
771*4882a593Smuzhiyun static const struct v4l2_subdev_video_ops max9286_video_ops = {
772*4882a593Smuzhiyun .s_stream = max9286_s_stream,
773*4882a593Smuzhiyun };
774*4882a593Smuzhiyun
775*4882a593Smuzhiyun static const struct v4l2_subdev_pad_ops max9286_pad_ops = {
776*4882a593Smuzhiyun .enum_mbus_code = max9286_enum_mbus_code,
777*4882a593Smuzhiyun .get_fmt = max9286_get_fmt,
778*4882a593Smuzhiyun .set_fmt = max9286_set_fmt,
779*4882a593Smuzhiyun };
780*4882a593Smuzhiyun
781*4882a593Smuzhiyun static const struct v4l2_subdev_ops max9286_subdev_ops = {
782*4882a593Smuzhiyun .video = &max9286_video_ops,
783*4882a593Smuzhiyun .pad = &max9286_pad_ops,
784*4882a593Smuzhiyun };
785*4882a593Smuzhiyun
max9286_init_format(struct v4l2_mbus_framefmt * fmt)786*4882a593Smuzhiyun static void max9286_init_format(struct v4l2_mbus_framefmt *fmt)
787*4882a593Smuzhiyun {
788*4882a593Smuzhiyun fmt->width = 1280;
789*4882a593Smuzhiyun fmt->height = 800;
790*4882a593Smuzhiyun fmt->code = MEDIA_BUS_FMT_UYVY8_1X16;
791*4882a593Smuzhiyun fmt->colorspace = V4L2_COLORSPACE_SRGB;
792*4882a593Smuzhiyun fmt->field = V4L2_FIELD_NONE;
793*4882a593Smuzhiyun fmt->ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
794*4882a593Smuzhiyun fmt->quantization = V4L2_QUANTIZATION_DEFAULT;
795*4882a593Smuzhiyun fmt->xfer_func = V4L2_XFER_FUNC_DEFAULT;
796*4882a593Smuzhiyun }
797*4882a593Smuzhiyun
max9286_open(struct v4l2_subdev * subdev,struct v4l2_subdev_fh * fh)798*4882a593Smuzhiyun static int max9286_open(struct v4l2_subdev *subdev, struct v4l2_subdev_fh *fh)
799*4882a593Smuzhiyun {
800*4882a593Smuzhiyun struct v4l2_mbus_framefmt *format;
801*4882a593Smuzhiyun unsigned int i;
802*4882a593Smuzhiyun
803*4882a593Smuzhiyun for (i = 0; i < MAX9286_N_SINKS; i++) {
804*4882a593Smuzhiyun format = v4l2_subdev_get_try_format(subdev, fh->pad, i);
805*4882a593Smuzhiyun max9286_init_format(format);
806*4882a593Smuzhiyun }
807*4882a593Smuzhiyun
808*4882a593Smuzhiyun return 0;
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun
811*4882a593Smuzhiyun static const struct v4l2_subdev_internal_ops max9286_subdev_internal_ops = {
812*4882a593Smuzhiyun .open = max9286_open,
813*4882a593Smuzhiyun };
814*4882a593Smuzhiyun
max9286_s_ctrl(struct v4l2_ctrl * ctrl)815*4882a593Smuzhiyun static int max9286_s_ctrl(struct v4l2_ctrl *ctrl)
816*4882a593Smuzhiyun {
817*4882a593Smuzhiyun switch (ctrl->id) {
818*4882a593Smuzhiyun case V4L2_CID_PIXEL_RATE:
819*4882a593Smuzhiyun return 0;
820*4882a593Smuzhiyun default:
821*4882a593Smuzhiyun return -EINVAL;
822*4882a593Smuzhiyun }
823*4882a593Smuzhiyun }
824*4882a593Smuzhiyun
825*4882a593Smuzhiyun static const struct v4l2_ctrl_ops max9286_ctrl_ops = {
826*4882a593Smuzhiyun .s_ctrl = max9286_s_ctrl,
827*4882a593Smuzhiyun };
828*4882a593Smuzhiyun
max9286_v4l2_register(struct max9286_priv * priv)829*4882a593Smuzhiyun static int max9286_v4l2_register(struct max9286_priv *priv)
830*4882a593Smuzhiyun {
831*4882a593Smuzhiyun struct device *dev = &priv->client->dev;
832*4882a593Smuzhiyun struct fwnode_handle *ep;
833*4882a593Smuzhiyun int ret;
834*4882a593Smuzhiyun int i;
835*4882a593Smuzhiyun
836*4882a593Smuzhiyun /* Register v4l2 async notifiers for connected Camera subdevices */
837*4882a593Smuzhiyun ret = max9286_v4l2_notifier_register(priv);
838*4882a593Smuzhiyun if (ret) {
839*4882a593Smuzhiyun dev_err(dev, "Unable to register V4L2 async notifiers\n");
840*4882a593Smuzhiyun return ret;
841*4882a593Smuzhiyun }
842*4882a593Smuzhiyun
843*4882a593Smuzhiyun /* Configure V4L2 for the MAX9286 itself */
844*4882a593Smuzhiyun
845*4882a593Smuzhiyun for (i = 0; i < MAX9286_N_SINKS; i++)
846*4882a593Smuzhiyun max9286_init_format(&priv->fmt[i]);
847*4882a593Smuzhiyun
848*4882a593Smuzhiyun v4l2_i2c_subdev_init(&priv->sd, priv->client, &max9286_subdev_ops);
849*4882a593Smuzhiyun priv->sd.internal_ops = &max9286_subdev_internal_ops;
850*4882a593Smuzhiyun priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
851*4882a593Smuzhiyun
852*4882a593Smuzhiyun v4l2_ctrl_handler_init(&priv->ctrls, 1);
853*4882a593Smuzhiyun priv->pixelrate = v4l2_ctrl_new_std(&priv->ctrls,
854*4882a593Smuzhiyun &max9286_ctrl_ops,
855*4882a593Smuzhiyun V4L2_CID_PIXEL_RATE,
856*4882a593Smuzhiyun 1, INT_MAX, 1, 50000000);
857*4882a593Smuzhiyun
858*4882a593Smuzhiyun priv->sd.ctrl_handler = &priv->ctrls;
859*4882a593Smuzhiyun ret = priv->ctrls.error;
860*4882a593Smuzhiyun if (ret)
861*4882a593Smuzhiyun goto err_async;
862*4882a593Smuzhiyun
863*4882a593Smuzhiyun priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
864*4882a593Smuzhiyun
865*4882a593Smuzhiyun priv->pads[MAX9286_SRC_PAD].flags = MEDIA_PAD_FL_SOURCE;
866*4882a593Smuzhiyun for (i = 0; i < MAX9286_SRC_PAD; i++)
867*4882a593Smuzhiyun priv->pads[i].flags = MEDIA_PAD_FL_SINK;
868*4882a593Smuzhiyun ret = media_entity_pads_init(&priv->sd.entity, MAX9286_N_PADS,
869*4882a593Smuzhiyun priv->pads);
870*4882a593Smuzhiyun if (ret)
871*4882a593Smuzhiyun goto err_async;
872*4882a593Smuzhiyun
873*4882a593Smuzhiyun ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev), MAX9286_SRC_PAD,
874*4882a593Smuzhiyun 0, 0);
875*4882a593Smuzhiyun if (!ep) {
876*4882a593Smuzhiyun dev_err(dev, "Unable to retrieve endpoint on \"port@4\"\n");
877*4882a593Smuzhiyun ret = -ENOENT;
878*4882a593Smuzhiyun goto err_async;
879*4882a593Smuzhiyun }
880*4882a593Smuzhiyun priv->sd.fwnode = ep;
881*4882a593Smuzhiyun
882*4882a593Smuzhiyun ret = v4l2_async_register_subdev(&priv->sd);
883*4882a593Smuzhiyun if (ret < 0) {
884*4882a593Smuzhiyun dev_err(dev, "Unable to register subdevice\n");
885*4882a593Smuzhiyun goto err_put_node;
886*4882a593Smuzhiyun }
887*4882a593Smuzhiyun
888*4882a593Smuzhiyun return 0;
889*4882a593Smuzhiyun
890*4882a593Smuzhiyun err_put_node:
891*4882a593Smuzhiyun fwnode_handle_put(ep);
892*4882a593Smuzhiyun err_async:
893*4882a593Smuzhiyun max9286_v4l2_notifier_unregister(priv);
894*4882a593Smuzhiyun
895*4882a593Smuzhiyun return ret;
896*4882a593Smuzhiyun }
897*4882a593Smuzhiyun
max9286_v4l2_unregister(struct max9286_priv * priv)898*4882a593Smuzhiyun static void max9286_v4l2_unregister(struct max9286_priv *priv)
899*4882a593Smuzhiyun {
900*4882a593Smuzhiyun fwnode_handle_put(priv->sd.fwnode);
901*4882a593Smuzhiyun v4l2_async_unregister_subdev(&priv->sd);
902*4882a593Smuzhiyun max9286_v4l2_notifier_unregister(priv);
903*4882a593Smuzhiyun }
904*4882a593Smuzhiyun
905*4882a593Smuzhiyun /* -----------------------------------------------------------------------------
906*4882a593Smuzhiyun * Probe/Remove
907*4882a593Smuzhiyun */
908*4882a593Smuzhiyun
max9286_setup(struct max9286_priv * priv)909*4882a593Smuzhiyun static int max9286_setup(struct max9286_priv *priv)
910*4882a593Smuzhiyun {
911*4882a593Smuzhiyun /*
912*4882a593Smuzhiyun * Link ordering values for all enabled links combinations. Orders must
913*4882a593Smuzhiyun * be assigned sequentially from 0 to the number of enabled links
914*4882a593Smuzhiyun * without leaving any hole for disabled links. We thus assign orders to
915*4882a593Smuzhiyun * enabled links first, and use the remaining order values for disabled
916*4882a593Smuzhiyun * links are all links must have a different order value;
917*4882a593Smuzhiyun */
918*4882a593Smuzhiyun static const u8 link_order[] = {
919*4882a593Smuzhiyun (3 << 6) | (2 << 4) | (1 << 2) | (0 << 0), /* xxxx */
920*4882a593Smuzhiyun (3 << 6) | (2 << 4) | (1 << 2) | (0 << 0), /* xxx0 */
921*4882a593Smuzhiyun (3 << 6) | (2 << 4) | (0 << 2) | (1 << 0), /* xx0x */
922*4882a593Smuzhiyun (3 << 6) | (2 << 4) | (1 << 2) | (0 << 0), /* xx10 */
923*4882a593Smuzhiyun (3 << 6) | (0 << 4) | (2 << 2) | (1 << 0), /* x0xx */
924*4882a593Smuzhiyun (3 << 6) | (1 << 4) | (2 << 2) | (0 << 0), /* x1x0 */
925*4882a593Smuzhiyun (3 << 6) | (1 << 4) | (0 << 2) | (2 << 0), /* x10x */
926*4882a593Smuzhiyun (3 << 6) | (1 << 4) | (1 << 2) | (0 << 0), /* x210 */
927*4882a593Smuzhiyun (0 << 6) | (3 << 4) | (2 << 2) | (1 << 0), /* 0xxx */
928*4882a593Smuzhiyun (1 << 6) | (3 << 4) | (2 << 2) | (0 << 0), /* 1xx0 */
929*4882a593Smuzhiyun (1 << 6) | (3 << 4) | (0 << 2) | (2 << 0), /* 1x0x */
930*4882a593Smuzhiyun (2 << 6) | (3 << 4) | (1 << 2) | (0 << 0), /* 2x10 */
931*4882a593Smuzhiyun (1 << 6) | (0 << 4) | (3 << 2) | (2 << 0), /* 10xx */
932*4882a593Smuzhiyun (2 << 6) | (1 << 4) | (3 << 2) | (0 << 0), /* 21x0 */
933*4882a593Smuzhiyun (2 << 6) | (1 << 4) | (0 << 2) | (3 << 0), /* 210x */
934*4882a593Smuzhiyun (3 << 6) | (2 << 4) | (1 << 2) | (0 << 0), /* 3210 */
935*4882a593Smuzhiyun };
936*4882a593Smuzhiyun
937*4882a593Smuzhiyun /*
938*4882a593Smuzhiyun * Set the I2C bus speed.
939*4882a593Smuzhiyun *
940*4882a593Smuzhiyun * Enable I2C Local Acknowledge during the probe sequences of the camera
941*4882a593Smuzhiyun * only. This should be disabled after the mux is initialised.
942*4882a593Smuzhiyun */
943*4882a593Smuzhiyun max9286_configure_i2c(priv, true);
944*4882a593Smuzhiyun
945*4882a593Smuzhiyun /*
946*4882a593Smuzhiyun * Reverse channel setup.
947*4882a593Smuzhiyun *
948*4882a593Smuzhiyun * - Enable custom reverse channel configuration (through register 0x3f)
949*4882a593Smuzhiyun * and set the first pulse length to 35 clock cycles.
950*4882a593Smuzhiyun * - Increase the reverse channel amplitude to 170mV to accommodate the
951*4882a593Smuzhiyun * high threshold enabled by the serializer driver.
952*4882a593Smuzhiyun */
953*4882a593Smuzhiyun max9286_write(priv, 0x3f, MAX9286_EN_REV_CFG | MAX9286_REV_FLEN(35));
954*4882a593Smuzhiyun max9286_write(priv, 0x3b, MAX9286_REV_TRF(1) | MAX9286_REV_AMP(70) |
955*4882a593Smuzhiyun MAX9286_REV_AMP_X);
956*4882a593Smuzhiyun usleep_range(2000, 2500);
957*4882a593Smuzhiyun
958*4882a593Smuzhiyun /*
959*4882a593Smuzhiyun * Enable GMSL links, mask unused ones and autodetect link
960*4882a593Smuzhiyun * used as CSI clock source.
961*4882a593Smuzhiyun */
962*4882a593Smuzhiyun max9286_write(priv, 0x00, MAX9286_MSTLINKSEL_AUTO | priv->route_mask);
963*4882a593Smuzhiyun max9286_write(priv, 0x0b, link_order[priv->route_mask]);
964*4882a593Smuzhiyun max9286_write(priv, 0x69, (0xf & ~priv->route_mask));
965*4882a593Smuzhiyun
966*4882a593Smuzhiyun /*
967*4882a593Smuzhiyun * Video format setup:
968*4882a593Smuzhiyun * Disable CSI output, VC is set according to Link number.
969*4882a593Smuzhiyun */
970*4882a593Smuzhiyun max9286_write(priv, 0x15, MAX9286_VCTYPE | MAX9286_0X15_RESV);
971*4882a593Smuzhiyun
972*4882a593Smuzhiyun /* Enable CSI-2 Lane D0-D3 only, DBL mode, YUV422 8-bit. */
973*4882a593Smuzhiyun max9286_write(priv, 0x12, MAX9286_CSIDBL | MAX9286_DBL |
974*4882a593Smuzhiyun MAX9286_CSILANECNT(priv->csi2_data_lanes) |
975*4882a593Smuzhiyun MAX9286_DATATYPE_YUV422_8BIT);
976*4882a593Smuzhiyun
977*4882a593Smuzhiyun /* Automatic: FRAMESYNC taken from the slowest Link. */
978*4882a593Smuzhiyun max9286_write(priv, 0x01, MAX9286_FSYNCMODE_INT_HIZ |
979*4882a593Smuzhiyun MAX9286_FSYNCMETH_AUTO);
980*4882a593Smuzhiyun
981*4882a593Smuzhiyun /* Enable HS/VS encoding, use D14/15 for HS/VS, invert VS. */
982*4882a593Smuzhiyun max9286_write(priv, 0x0c, MAX9286_HVEN | MAX9286_INVVS |
983*4882a593Smuzhiyun MAX9286_HVSRC_D14);
984*4882a593Smuzhiyun
985*4882a593Smuzhiyun /*
986*4882a593Smuzhiyun * The overlap window seems to provide additional validation by tracking
987*4882a593Smuzhiyun * the delay between vsync and frame sync, generating an error if the
988*4882a593Smuzhiyun * delay is bigger than the programmed window, though it's not yet clear
989*4882a593Smuzhiyun * what value should be set.
990*4882a593Smuzhiyun *
991*4882a593Smuzhiyun * As it's an optional value and can be disabled, we do so by setting
992*4882a593Smuzhiyun * a 0 overlap value.
993*4882a593Smuzhiyun */
994*4882a593Smuzhiyun max9286_write(priv, 0x63, 0);
995*4882a593Smuzhiyun max9286_write(priv, 0x64, 0);
996*4882a593Smuzhiyun
997*4882a593Smuzhiyun /*
998*4882a593Smuzhiyun * Wait for 2ms to allow the link to resynchronize after the
999*4882a593Smuzhiyun * configuration change.
1000*4882a593Smuzhiyun */
1001*4882a593Smuzhiyun usleep_range(2000, 5000);
1002*4882a593Smuzhiyun
1003*4882a593Smuzhiyun return 0;
1004*4882a593Smuzhiyun }
1005*4882a593Smuzhiyun
max9286_gpio_set(struct gpio_chip * chip,unsigned int offset,int value)1006*4882a593Smuzhiyun static void max9286_gpio_set(struct gpio_chip *chip,
1007*4882a593Smuzhiyun unsigned int offset, int value)
1008*4882a593Smuzhiyun {
1009*4882a593Smuzhiyun struct max9286_priv *priv = gpiochip_get_data(chip);
1010*4882a593Smuzhiyun
1011*4882a593Smuzhiyun if (value)
1012*4882a593Smuzhiyun priv->gpio_state |= BIT(offset);
1013*4882a593Smuzhiyun else
1014*4882a593Smuzhiyun priv->gpio_state &= ~BIT(offset);
1015*4882a593Smuzhiyun
1016*4882a593Smuzhiyun max9286_write(priv, 0x0f, MAX9286_0X0F_RESERVED | priv->gpio_state);
1017*4882a593Smuzhiyun }
1018*4882a593Smuzhiyun
max9286_gpio_get(struct gpio_chip * chip,unsigned int offset)1019*4882a593Smuzhiyun static int max9286_gpio_get(struct gpio_chip *chip, unsigned int offset)
1020*4882a593Smuzhiyun {
1021*4882a593Smuzhiyun struct max9286_priv *priv = gpiochip_get_data(chip);
1022*4882a593Smuzhiyun
1023*4882a593Smuzhiyun return priv->gpio_state & BIT(offset);
1024*4882a593Smuzhiyun }
1025*4882a593Smuzhiyun
max9286_register_gpio(struct max9286_priv * priv)1026*4882a593Smuzhiyun static int max9286_register_gpio(struct max9286_priv *priv)
1027*4882a593Smuzhiyun {
1028*4882a593Smuzhiyun struct device *dev = &priv->client->dev;
1029*4882a593Smuzhiyun struct gpio_chip *gpio = &priv->gpio;
1030*4882a593Smuzhiyun int ret;
1031*4882a593Smuzhiyun
1032*4882a593Smuzhiyun /* Configure the GPIO */
1033*4882a593Smuzhiyun gpio->label = dev_name(dev);
1034*4882a593Smuzhiyun gpio->parent = dev;
1035*4882a593Smuzhiyun gpio->owner = THIS_MODULE;
1036*4882a593Smuzhiyun gpio->of_node = dev->of_node;
1037*4882a593Smuzhiyun gpio->ngpio = 2;
1038*4882a593Smuzhiyun gpio->base = -1;
1039*4882a593Smuzhiyun gpio->set = max9286_gpio_set;
1040*4882a593Smuzhiyun gpio->get = max9286_gpio_get;
1041*4882a593Smuzhiyun gpio->can_sleep = true;
1042*4882a593Smuzhiyun
1043*4882a593Smuzhiyun /* GPIO values default to high */
1044*4882a593Smuzhiyun priv->gpio_state = BIT(0) | BIT(1);
1045*4882a593Smuzhiyun
1046*4882a593Smuzhiyun ret = devm_gpiochip_add_data(dev, gpio, priv);
1047*4882a593Smuzhiyun if (ret)
1048*4882a593Smuzhiyun dev_err(dev, "Unable to create gpio_chip\n");
1049*4882a593Smuzhiyun
1050*4882a593Smuzhiyun return ret;
1051*4882a593Smuzhiyun }
1052*4882a593Smuzhiyun
max9286_init(struct device * dev)1053*4882a593Smuzhiyun static int max9286_init(struct device *dev)
1054*4882a593Smuzhiyun {
1055*4882a593Smuzhiyun struct max9286_priv *priv;
1056*4882a593Smuzhiyun struct i2c_client *client;
1057*4882a593Smuzhiyun int ret;
1058*4882a593Smuzhiyun
1059*4882a593Smuzhiyun client = to_i2c_client(dev);
1060*4882a593Smuzhiyun priv = i2c_get_clientdata(client);
1061*4882a593Smuzhiyun
1062*4882a593Smuzhiyun /* Enable the bus power. */
1063*4882a593Smuzhiyun ret = regulator_enable(priv->regulator);
1064*4882a593Smuzhiyun if (ret < 0) {
1065*4882a593Smuzhiyun dev_err(&client->dev, "Unable to turn PoC on\n");
1066*4882a593Smuzhiyun return ret;
1067*4882a593Smuzhiyun }
1068*4882a593Smuzhiyun
1069*4882a593Smuzhiyun ret = max9286_setup(priv);
1070*4882a593Smuzhiyun if (ret) {
1071*4882a593Smuzhiyun dev_err(dev, "Unable to setup max9286\n");
1072*4882a593Smuzhiyun goto err_regulator;
1073*4882a593Smuzhiyun }
1074*4882a593Smuzhiyun
1075*4882a593Smuzhiyun /*
1076*4882a593Smuzhiyun * Register all V4L2 interactions for the MAX9286 and notifiers for
1077*4882a593Smuzhiyun * any subdevices connected.
1078*4882a593Smuzhiyun */
1079*4882a593Smuzhiyun ret = max9286_v4l2_register(priv);
1080*4882a593Smuzhiyun if (ret) {
1081*4882a593Smuzhiyun dev_err(dev, "Failed to register with V4L2\n");
1082*4882a593Smuzhiyun goto err_regulator;
1083*4882a593Smuzhiyun }
1084*4882a593Smuzhiyun
1085*4882a593Smuzhiyun ret = max9286_i2c_mux_init(priv);
1086*4882a593Smuzhiyun if (ret) {
1087*4882a593Smuzhiyun dev_err(dev, "Unable to initialize I2C multiplexer\n");
1088*4882a593Smuzhiyun goto err_v4l2_register;
1089*4882a593Smuzhiyun }
1090*4882a593Smuzhiyun
1091*4882a593Smuzhiyun /* Leave the mux channels disabled until they are selected. */
1092*4882a593Smuzhiyun max9286_i2c_mux_close(priv);
1093*4882a593Smuzhiyun
1094*4882a593Smuzhiyun return 0;
1095*4882a593Smuzhiyun
1096*4882a593Smuzhiyun err_v4l2_register:
1097*4882a593Smuzhiyun max9286_v4l2_unregister(priv);
1098*4882a593Smuzhiyun err_regulator:
1099*4882a593Smuzhiyun regulator_disable(priv->regulator);
1100*4882a593Smuzhiyun
1101*4882a593Smuzhiyun return ret;
1102*4882a593Smuzhiyun }
1103*4882a593Smuzhiyun
max9286_cleanup_dt(struct max9286_priv * priv)1104*4882a593Smuzhiyun static void max9286_cleanup_dt(struct max9286_priv *priv)
1105*4882a593Smuzhiyun {
1106*4882a593Smuzhiyun struct max9286_source *source;
1107*4882a593Smuzhiyun
1108*4882a593Smuzhiyun for_each_source(priv, source) {
1109*4882a593Smuzhiyun fwnode_handle_put(source->fwnode);
1110*4882a593Smuzhiyun source->fwnode = NULL;
1111*4882a593Smuzhiyun }
1112*4882a593Smuzhiyun }
1113*4882a593Smuzhiyun
max9286_parse_dt(struct max9286_priv * priv)1114*4882a593Smuzhiyun static int max9286_parse_dt(struct max9286_priv *priv)
1115*4882a593Smuzhiyun {
1116*4882a593Smuzhiyun struct device *dev = &priv->client->dev;
1117*4882a593Smuzhiyun struct device_node *i2c_mux;
1118*4882a593Smuzhiyun struct device_node *node = NULL;
1119*4882a593Smuzhiyun unsigned int i2c_mux_mask = 0;
1120*4882a593Smuzhiyun
1121*4882a593Smuzhiyun /* Balance the of_node_put() performed by of_find_node_by_name(). */
1122*4882a593Smuzhiyun of_node_get(dev->of_node);
1123*4882a593Smuzhiyun i2c_mux = of_find_node_by_name(dev->of_node, "i2c-mux");
1124*4882a593Smuzhiyun if (!i2c_mux) {
1125*4882a593Smuzhiyun dev_err(dev, "Failed to find i2c-mux node\n");
1126*4882a593Smuzhiyun return -EINVAL;
1127*4882a593Smuzhiyun }
1128*4882a593Smuzhiyun
1129*4882a593Smuzhiyun /* Identify which i2c-mux channels are enabled */
1130*4882a593Smuzhiyun for_each_child_of_node(i2c_mux, node) {
1131*4882a593Smuzhiyun u32 id = 0;
1132*4882a593Smuzhiyun
1133*4882a593Smuzhiyun of_property_read_u32(node, "reg", &id);
1134*4882a593Smuzhiyun if (id >= MAX9286_NUM_GMSL)
1135*4882a593Smuzhiyun continue;
1136*4882a593Smuzhiyun
1137*4882a593Smuzhiyun if (!of_device_is_available(node)) {
1138*4882a593Smuzhiyun dev_dbg(dev, "Skipping disabled I2C bus port %u\n", id);
1139*4882a593Smuzhiyun continue;
1140*4882a593Smuzhiyun }
1141*4882a593Smuzhiyun
1142*4882a593Smuzhiyun i2c_mux_mask |= BIT(id);
1143*4882a593Smuzhiyun }
1144*4882a593Smuzhiyun of_node_put(node);
1145*4882a593Smuzhiyun of_node_put(i2c_mux);
1146*4882a593Smuzhiyun
1147*4882a593Smuzhiyun /* Parse the endpoints */
1148*4882a593Smuzhiyun for_each_endpoint_of_node(dev->of_node, node) {
1149*4882a593Smuzhiyun struct max9286_source *source;
1150*4882a593Smuzhiyun struct of_endpoint ep;
1151*4882a593Smuzhiyun
1152*4882a593Smuzhiyun of_graph_parse_endpoint(node, &ep);
1153*4882a593Smuzhiyun dev_dbg(dev, "Endpoint %pOF on port %d",
1154*4882a593Smuzhiyun ep.local_node, ep.port);
1155*4882a593Smuzhiyun
1156*4882a593Smuzhiyun if (ep.port > MAX9286_NUM_GMSL) {
1157*4882a593Smuzhiyun dev_err(dev, "Invalid endpoint %s on port %d",
1158*4882a593Smuzhiyun of_node_full_name(ep.local_node), ep.port);
1159*4882a593Smuzhiyun continue;
1160*4882a593Smuzhiyun }
1161*4882a593Smuzhiyun
1162*4882a593Smuzhiyun /* For the source endpoint just parse the bus configuration. */
1163*4882a593Smuzhiyun if (ep.port == MAX9286_SRC_PAD) {
1164*4882a593Smuzhiyun struct v4l2_fwnode_endpoint vep = {
1165*4882a593Smuzhiyun .bus_type = V4L2_MBUS_CSI2_DPHY
1166*4882a593Smuzhiyun };
1167*4882a593Smuzhiyun int ret;
1168*4882a593Smuzhiyun
1169*4882a593Smuzhiyun ret = v4l2_fwnode_endpoint_parse(
1170*4882a593Smuzhiyun of_fwnode_handle(node), &vep);
1171*4882a593Smuzhiyun if (ret) {
1172*4882a593Smuzhiyun of_node_put(node);
1173*4882a593Smuzhiyun return ret;
1174*4882a593Smuzhiyun }
1175*4882a593Smuzhiyun
1176*4882a593Smuzhiyun priv->csi2_data_lanes =
1177*4882a593Smuzhiyun vep.bus.mipi_csi2.num_data_lanes;
1178*4882a593Smuzhiyun
1179*4882a593Smuzhiyun continue;
1180*4882a593Smuzhiyun }
1181*4882a593Smuzhiyun
1182*4882a593Smuzhiyun /* Skip if the corresponding GMSL link is unavailable. */
1183*4882a593Smuzhiyun if (!(i2c_mux_mask & BIT(ep.port)))
1184*4882a593Smuzhiyun continue;
1185*4882a593Smuzhiyun
1186*4882a593Smuzhiyun if (priv->sources[ep.port].fwnode) {
1187*4882a593Smuzhiyun dev_err(dev,
1188*4882a593Smuzhiyun "Multiple port endpoints are not supported: %d",
1189*4882a593Smuzhiyun ep.port);
1190*4882a593Smuzhiyun
1191*4882a593Smuzhiyun continue;
1192*4882a593Smuzhiyun }
1193*4882a593Smuzhiyun
1194*4882a593Smuzhiyun source = &priv->sources[ep.port];
1195*4882a593Smuzhiyun source->fwnode = fwnode_graph_get_remote_endpoint(
1196*4882a593Smuzhiyun of_fwnode_handle(node));
1197*4882a593Smuzhiyun if (!source->fwnode) {
1198*4882a593Smuzhiyun dev_err(dev,
1199*4882a593Smuzhiyun "Endpoint %pOF has no remote endpoint connection\n",
1200*4882a593Smuzhiyun ep.local_node);
1201*4882a593Smuzhiyun
1202*4882a593Smuzhiyun continue;
1203*4882a593Smuzhiyun }
1204*4882a593Smuzhiyun
1205*4882a593Smuzhiyun priv->source_mask |= BIT(ep.port);
1206*4882a593Smuzhiyun priv->nsources++;
1207*4882a593Smuzhiyun }
1208*4882a593Smuzhiyun of_node_put(node);
1209*4882a593Smuzhiyun
1210*4882a593Smuzhiyun priv->route_mask = priv->source_mask;
1211*4882a593Smuzhiyun
1212*4882a593Smuzhiyun return 0;
1213*4882a593Smuzhiyun }
1214*4882a593Smuzhiyun
max9286_probe(struct i2c_client * client)1215*4882a593Smuzhiyun static int max9286_probe(struct i2c_client *client)
1216*4882a593Smuzhiyun {
1217*4882a593Smuzhiyun struct max9286_priv *priv;
1218*4882a593Smuzhiyun int ret;
1219*4882a593Smuzhiyun
1220*4882a593Smuzhiyun priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
1221*4882a593Smuzhiyun if (!priv)
1222*4882a593Smuzhiyun return -ENOMEM;
1223*4882a593Smuzhiyun
1224*4882a593Smuzhiyun mutex_init(&priv->mutex);
1225*4882a593Smuzhiyun
1226*4882a593Smuzhiyun priv->client = client;
1227*4882a593Smuzhiyun i2c_set_clientdata(client, priv);
1228*4882a593Smuzhiyun
1229*4882a593Smuzhiyun priv->gpiod_pwdn = devm_gpiod_get_optional(&client->dev, "enable",
1230*4882a593Smuzhiyun GPIOD_OUT_HIGH);
1231*4882a593Smuzhiyun if (IS_ERR(priv->gpiod_pwdn))
1232*4882a593Smuzhiyun return PTR_ERR(priv->gpiod_pwdn);
1233*4882a593Smuzhiyun
1234*4882a593Smuzhiyun gpiod_set_consumer_name(priv->gpiod_pwdn, "max9286-pwdn");
1235*4882a593Smuzhiyun gpiod_set_value_cansleep(priv->gpiod_pwdn, 1);
1236*4882a593Smuzhiyun
1237*4882a593Smuzhiyun /* Wait at least 4ms before the I2C lines latch to the address */
1238*4882a593Smuzhiyun if (priv->gpiod_pwdn)
1239*4882a593Smuzhiyun usleep_range(4000, 5000);
1240*4882a593Smuzhiyun
1241*4882a593Smuzhiyun /*
1242*4882a593Smuzhiyun * The MAX9286 starts by default with all ports enabled, we disable all
1243*4882a593Smuzhiyun * ports early to ensure that all channels are disabled if we error out
1244*4882a593Smuzhiyun * and keep the bus consistent.
1245*4882a593Smuzhiyun */
1246*4882a593Smuzhiyun max9286_i2c_mux_close(priv);
1247*4882a593Smuzhiyun
1248*4882a593Smuzhiyun /*
1249*4882a593Smuzhiyun * The MAX9286 initialises with auto-acknowledge enabled by default.
1250*4882a593Smuzhiyun * This can be invasive to other transactions on the same bus, so
1251*4882a593Smuzhiyun * disable it early. It will be enabled only as and when needed.
1252*4882a593Smuzhiyun */
1253*4882a593Smuzhiyun max9286_configure_i2c(priv, false);
1254*4882a593Smuzhiyun
1255*4882a593Smuzhiyun ret = max9286_register_gpio(priv);
1256*4882a593Smuzhiyun if (ret)
1257*4882a593Smuzhiyun goto err_powerdown;
1258*4882a593Smuzhiyun
1259*4882a593Smuzhiyun priv->regulator = devm_regulator_get(&client->dev, "poc");
1260*4882a593Smuzhiyun if (IS_ERR(priv->regulator)) {
1261*4882a593Smuzhiyun if (PTR_ERR(priv->regulator) != -EPROBE_DEFER)
1262*4882a593Smuzhiyun dev_err(&client->dev,
1263*4882a593Smuzhiyun "Unable to get PoC regulator (%ld)\n",
1264*4882a593Smuzhiyun PTR_ERR(priv->regulator));
1265*4882a593Smuzhiyun ret = PTR_ERR(priv->regulator);
1266*4882a593Smuzhiyun goto err_powerdown;
1267*4882a593Smuzhiyun }
1268*4882a593Smuzhiyun
1269*4882a593Smuzhiyun ret = max9286_parse_dt(priv);
1270*4882a593Smuzhiyun if (ret)
1271*4882a593Smuzhiyun goto err_powerdown;
1272*4882a593Smuzhiyun
1273*4882a593Smuzhiyun ret = max9286_init(&client->dev);
1274*4882a593Smuzhiyun if (ret < 0)
1275*4882a593Smuzhiyun goto err_cleanup_dt;
1276*4882a593Smuzhiyun
1277*4882a593Smuzhiyun return 0;
1278*4882a593Smuzhiyun
1279*4882a593Smuzhiyun err_cleanup_dt:
1280*4882a593Smuzhiyun max9286_cleanup_dt(priv);
1281*4882a593Smuzhiyun err_powerdown:
1282*4882a593Smuzhiyun gpiod_set_value_cansleep(priv->gpiod_pwdn, 0);
1283*4882a593Smuzhiyun
1284*4882a593Smuzhiyun return ret;
1285*4882a593Smuzhiyun }
1286*4882a593Smuzhiyun
max9286_remove(struct i2c_client * client)1287*4882a593Smuzhiyun static int max9286_remove(struct i2c_client *client)
1288*4882a593Smuzhiyun {
1289*4882a593Smuzhiyun struct max9286_priv *priv = i2c_get_clientdata(client);
1290*4882a593Smuzhiyun
1291*4882a593Smuzhiyun i2c_mux_del_adapters(priv->mux);
1292*4882a593Smuzhiyun
1293*4882a593Smuzhiyun max9286_v4l2_unregister(priv);
1294*4882a593Smuzhiyun
1295*4882a593Smuzhiyun regulator_disable(priv->regulator);
1296*4882a593Smuzhiyun
1297*4882a593Smuzhiyun gpiod_set_value_cansleep(priv->gpiod_pwdn, 0);
1298*4882a593Smuzhiyun
1299*4882a593Smuzhiyun max9286_cleanup_dt(priv);
1300*4882a593Smuzhiyun
1301*4882a593Smuzhiyun return 0;
1302*4882a593Smuzhiyun }
1303*4882a593Smuzhiyun
1304*4882a593Smuzhiyun static const struct of_device_id max9286_dt_ids[] = {
1305*4882a593Smuzhiyun { .compatible = "maxim,max9286" },
1306*4882a593Smuzhiyun {},
1307*4882a593Smuzhiyun };
1308*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, max9286_dt_ids);
1309*4882a593Smuzhiyun
1310*4882a593Smuzhiyun static struct i2c_driver max9286_i2c_driver = {
1311*4882a593Smuzhiyun .driver = {
1312*4882a593Smuzhiyun .name = "max9286",
1313*4882a593Smuzhiyun .of_match_table = of_match_ptr(max9286_dt_ids),
1314*4882a593Smuzhiyun },
1315*4882a593Smuzhiyun .probe_new = max9286_probe,
1316*4882a593Smuzhiyun .remove = max9286_remove,
1317*4882a593Smuzhiyun };
1318*4882a593Smuzhiyun
1319*4882a593Smuzhiyun module_i2c_driver(max9286_i2c_driver);
1320*4882a593Smuzhiyun
1321*4882a593Smuzhiyun MODULE_DESCRIPTION("Maxim MAX9286 GMSL Deserializer Driver");
1322*4882a593Smuzhiyun MODULE_AUTHOR("Jacopo Mondi, Kieran Bingham, Laurent Pinchart, Niklas Söderlund, Vladimir Barinov");
1323*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1324