Lines Matching +full:1 +full:- +full:sd

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * adv7175 - adv7175a video encoder driver version 0.0.3
8 * - some corrections for Pinnacle Systems Inc. DC10plus card.
11 * - moved over to linux>=2.4.x i2c protocol (9/9/2002)
21 #include <media/v4l2-device.h>
33 MODULE_PARM_DESC(debug, "Debug level (0-1)");
35 /* ----------------------------------------------------------------------- */
38 struct v4l2_subdev sd; member
43 static inline struct adv7175 *to_adv7175(struct v4l2_subdev *sd) in to_adv7175() argument
45 return container_of(sd, struct adv7175, sd); in to_adv7175()
55 /* ----------------------------------------------------------------------- */
57 static inline int adv7175_write(struct v4l2_subdev *sd, u8 reg, u8 value) in adv7175_write() argument
59 struct i2c_client *client = v4l2_get_subdevdata(sd); in adv7175_write()
64 static inline int adv7175_read(struct v4l2_subdev *sd, u8 reg) in adv7175_read() argument
66 struct i2c_client *client = v4l2_get_subdevdata(sd); in adv7175_read()
71 static int adv7175_write_block(struct v4l2_subdev *sd, in adv7175_write_block() argument
74 struct i2c_client *client = v4l2_get_subdevdata(sd); in adv7175_write_block()
75 int ret = -1; in adv7175_write_block()
80 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in adv7175_write_block()
89 block_data[block_len++] = data[1]; in adv7175_write_block()
91 len -= 2; in adv7175_write_block()
102 ret = adv7175_write(sd, reg, *data++); in adv7175_write_block()
105 len -= 2; in adv7175_write_block()
112 static void set_subcarrier_freq(struct v4l2_subdev *sd, int pass_through) in set_subcarrier_freq() argument
115 * a different sub-carrier freq to remain stable. */ in set_subcarrier_freq()
117 adv7175_write(sd, 0x02, 0x00); in set_subcarrier_freq()
119 adv7175_write(sd, 0x02, 0x55); in set_subcarrier_freq()
121 adv7175_write(sd, 0x03, 0x55); in set_subcarrier_freq()
122 adv7175_write(sd, 0x04, 0x55); in set_subcarrier_freq()
123 adv7175_write(sd, 0x05, 0x25); in set_subcarrier_freq()
126 /* ----------------------------------------------------------------------- */
127 /* Output filter: S-Video Composite */
132 /* ----------------------------------------------------------------------- */
183 static int adv7175_init(struct v4l2_subdev *sd, u32 val) in adv7175_init() argument
186 adv7175_write_block(sd, init_common, sizeof(init_common)); in adv7175_init()
187 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_init()
188 adv7175_write(sd, 0x07, TR0MODE); in adv7175_init()
192 static int adv7175_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std) in adv7175_s_std_output() argument
194 struct adv7175 *encoder = to_adv7175(sd); in adv7175_s_std_output()
197 adv7175_write_block(sd, init_ntsc, sizeof(init_ntsc)); in adv7175_s_std_output()
198 if (encoder->input == 0) in adv7175_s_std_output()
199 adv7175_write(sd, 0x0d, 0x4f); /* Enable genlock */ in adv7175_s_std_output()
200 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_s_std_output()
201 adv7175_write(sd, 0x07, TR0MODE); in adv7175_s_std_output()
203 adv7175_write_block(sd, init_pal, sizeof(init_pal)); in adv7175_s_std_output()
204 if (encoder->input == 0) in adv7175_s_std_output()
205 adv7175_write(sd, 0x0d, 0x4f); /* Enable genlock */ in adv7175_s_std_output()
206 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_s_std_output()
207 adv7175_write(sd, 0x07, TR0MODE); in adv7175_s_std_output()
210 * SECAM->PAL (typically it does not work in adv7175_s_std_output()
215 adv7175_write_block(sd, init_pal, sizeof(init_pal)); in adv7175_s_std_output()
216 if (encoder->input == 0) in adv7175_s_std_output()
217 adv7175_write(sd, 0x0d, 0x49); /* Disable genlock */ in adv7175_s_std_output()
218 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_s_std_output()
219 adv7175_write(sd, 0x07, TR0MODE); in adv7175_s_std_output()
221 v4l2_dbg(1, debug, sd, "illegal norm: %llx\n", in adv7175_s_std_output()
223 return -EINVAL; in adv7175_s_std_output()
225 v4l2_dbg(1, debug, sd, "switched to %llx\n", (unsigned long long)std); in adv7175_s_std_output()
226 encoder->norm = std; in adv7175_s_std_output()
230 static int adv7175_s_routing(struct v4l2_subdev *sd, in adv7175_s_routing() argument
233 struct adv7175 *encoder = to_adv7175(sd); in adv7175_s_routing()
236 input = 1: input is from ZR36060 in adv7175_s_routing()
241 adv7175_write(sd, 0x01, 0x00); in adv7175_s_routing()
243 if (encoder->norm & V4L2_STD_NTSC) in adv7175_s_routing()
244 set_subcarrier_freq(sd, 1); in adv7175_s_routing()
246 adv7175_write(sd, 0x0c, TR1CAPT); /* TR1 */ in adv7175_s_routing()
247 if (encoder->norm & V4L2_STD_SECAM) in adv7175_s_routing()
248 adv7175_write(sd, 0x0d, 0x49); /* Disable genlock */ in adv7175_s_routing()
250 adv7175_write(sd, 0x0d, 0x4f); /* Enable genlock */ in adv7175_s_routing()
251 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_s_routing()
252 adv7175_write(sd, 0x07, TR0MODE); in adv7175_s_routing()
256 case 1: in adv7175_s_routing()
257 adv7175_write(sd, 0x01, 0x00); in adv7175_s_routing()
259 if (encoder->norm & V4L2_STD_NTSC) in adv7175_s_routing()
260 set_subcarrier_freq(sd, 0); in adv7175_s_routing()
262 adv7175_write(sd, 0x0c, TR1PLAY); /* TR1 */ in adv7175_s_routing()
263 adv7175_write(sd, 0x0d, 0x49); in adv7175_s_routing()
264 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_s_routing()
265 adv7175_write(sd, 0x07, TR0MODE); in adv7175_s_routing()
270 adv7175_write(sd, 0x01, 0x80); in adv7175_s_routing()
272 if (encoder->norm & V4L2_STD_NTSC) in adv7175_s_routing()
273 set_subcarrier_freq(sd, 0); in adv7175_s_routing()
275 adv7175_write(sd, 0x0d, 0x49); in adv7175_s_routing()
276 adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_s_routing()
277 adv7175_write(sd, 0x07, TR0MODE); in adv7175_s_routing()
282 v4l2_dbg(1, debug, sd, "illegal input: %d\n", input); in adv7175_s_routing()
283 return -EINVAL; in adv7175_s_routing()
285 v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]); in adv7175_s_routing()
286 encoder->input = input; in adv7175_s_routing()
290 static int adv7175_enum_mbus_code(struct v4l2_subdev *sd, in adv7175_enum_mbus_code() argument
294 if (code->pad || code->index >= ARRAY_SIZE(adv7175_codes)) in adv7175_enum_mbus_code()
295 return -EINVAL; in adv7175_enum_mbus_code()
297 code->code = adv7175_codes[code->index]; in adv7175_enum_mbus_code()
301 static int adv7175_get_fmt(struct v4l2_subdev *sd, in adv7175_get_fmt() argument
305 struct v4l2_mbus_framefmt *mf = &format->format; in adv7175_get_fmt()
306 u8 val = adv7175_read(sd, 0x7); in adv7175_get_fmt()
308 if (format->pad) in adv7175_get_fmt()
309 return -EINVAL; in adv7175_get_fmt()
311 if ((val & 0x40) == (1 << 6)) in adv7175_get_fmt()
312 mf->code = MEDIA_BUS_FMT_UYVY8_1X16; in adv7175_get_fmt()
314 mf->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7175_get_fmt()
316 mf->colorspace = V4L2_COLORSPACE_SMPTE170M; in adv7175_get_fmt()
317 mf->width = 0; in adv7175_get_fmt()
318 mf->height = 0; in adv7175_get_fmt()
319 mf->field = V4L2_FIELD_ANY; in adv7175_get_fmt()
324 static int adv7175_set_fmt(struct v4l2_subdev *sd, in adv7175_set_fmt() argument
328 struct v4l2_mbus_framefmt *mf = &format->format; in adv7175_set_fmt()
329 u8 val = adv7175_read(sd, 0x7); in adv7175_set_fmt()
332 if (format->pad) in adv7175_set_fmt()
333 return -EINVAL; in adv7175_set_fmt()
335 switch (mf->code) { in adv7175_set_fmt()
345 v4l2_dbg(1, debug, sd, in adv7175_set_fmt()
346 "illegal v4l2_mbus_framefmt code: %d\n", mf->code); in adv7175_set_fmt()
347 return -EINVAL; in adv7175_set_fmt()
350 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) in adv7175_set_fmt()
351 ret = adv7175_write(sd, 0x7, val); in adv7175_set_fmt()
356 static int adv7175_s_power(struct v4l2_subdev *sd, int on) in adv7175_s_power() argument
359 adv7175_write(sd, 0x01, 0x00); in adv7175_s_power()
361 adv7175_write(sd, 0x01, 0x78); in adv7175_s_power()
366 /* ----------------------------------------------------------------------- */
390 /* ----------------------------------------------------------------------- */
396 struct v4l2_subdev *sd; in adv7175_probe() local
399 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adv7175_probe()
400 return -ENODEV; in adv7175_probe()
403 client->addr << 1, client->adapter->name); in adv7175_probe()
405 encoder = devm_kzalloc(&client->dev, sizeof(*encoder), GFP_KERNEL); in adv7175_probe()
407 return -ENOMEM; in adv7175_probe()
408 sd = &encoder->sd; in adv7175_probe()
409 v4l2_i2c_subdev_init(sd, client, &adv7175_ops); in adv7175_probe()
410 encoder->norm = V4L2_STD_NTSC; in adv7175_probe()
411 encoder->input = 0; in adv7175_probe()
413 i = adv7175_write_block(sd, init_common, sizeof(init_common)); in adv7175_probe()
415 i = adv7175_write(sd, 0x07, TR0MODE | TR0RST); in adv7175_probe()
416 i = adv7175_write(sd, 0x07, TR0MODE); in adv7175_probe()
417 i = adv7175_read(sd, 0x12); in adv7175_probe()
418 v4l2_dbg(1, debug, sd, "revision %d\n", i & 1); in adv7175_probe()
421 v4l2_dbg(1, debug, sd, "init error 0x%x\n", i); in adv7175_probe()
427 struct v4l2_subdev *sd = i2c_get_clientdata(client); in adv7175_remove() local
429 v4l2_device_unregister_subdev(sd); in adv7175_remove()
432 /* ----------------------------------------------------------------------- */