Lines Matching +full:1 +full:- +full:sd
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * adv7170 - adv7170, adv7171 video encoder driver version 0.0.1
12 * - some corrections for Pinnacle Systems Inc. DC10plus card.
15 * - moved over to linux>=2.4.x i2c protocol (1/1/2003)
25 #include <media/v4l2-device.h>
34 MODULE_PARM_DESC(debug, "Debug level (0-1)");
36 /* ----------------------------------------------------------------------- */
39 struct v4l2_subdev sd; member
46 static inline struct adv7170 *to_adv7170(struct v4l2_subdev *sd) in to_adv7170() argument
48 return container_of(sd, struct adv7170, sd); in to_adv7170()
58 /* ----------------------------------------------------------------------- */
60 static inline int adv7170_write(struct v4l2_subdev *sd, u8 reg, u8 value) in adv7170_write() argument
62 struct i2c_client *client = v4l2_get_subdevdata(sd); in adv7170_write()
63 struct adv7170 *encoder = to_adv7170(sd); in adv7170_write()
65 encoder->reg[reg] = value; in adv7170_write()
69 static inline int adv7170_read(struct v4l2_subdev *sd, u8 reg) in adv7170_read() argument
71 struct i2c_client *client = v4l2_get_subdevdata(sd); in adv7170_read()
76 static int adv7170_write_block(struct v4l2_subdev *sd, in adv7170_write_block() argument
79 struct i2c_client *client = v4l2_get_subdevdata(sd); in adv7170_write_block()
80 struct adv7170 *encoder = to_adv7170(sd); in adv7170_write_block()
81 int ret = -1; in adv7170_write_block()
86 if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { in adv7170_write_block()
96 encoder->reg[reg++] = data[1]; in adv7170_write_block()
97 len -= 2; in adv7170_write_block()
108 ret = adv7170_write(sd, reg, *data++); in adv7170_write_block()
111 len -= 2; in adv7170_write_block()
117 /* ----------------------------------------------------------------------- */
128 0x02, 0x0e, /* MR2 RTC control: bits 2 and 1 */
141 0x0f, 0x00, /* Closed Capt. Ext 1 */
143 0x11, 0x00, /* Closed Capt. 1 */
145 0x13, 0x00, /* Pedestal Ctl 1 */
157 0x02, 0x0e, /* MR2 RTC control: bits 2 and 1 */
170 0x0f, 0x00, /* Closed Capt. Ext 1 */
172 0x11, 0x00, /* Closed Capt. 1 */
174 0x13, 0x00, /* Pedestal Ctl 1 */
184 static int adv7170_s_std_output(struct v4l2_subdev *sd, v4l2_std_id std) in adv7170_s_std_output() argument
186 struct adv7170 *encoder = to_adv7170(sd); in adv7170_s_std_output()
188 v4l2_dbg(1, debug, sd, "set norm %llx\n", (unsigned long long)std); in adv7170_s_std_output()
191 adv7170_write_block(sd, init_NTSC, sizeof(init_NTSC)); in adv7170_s_std_output()
192 if (encoder->input == 0) in adv7170_s_std_output()
193 adv7170_write(sd, 0x02, 0x0e); /* Enable genlock */ in adv7170_s_std_output()
194 adv7170_write(sd, 0x07, TR0MODE | TR0RST); in adv7170_s_std_output()
195 adv7170_write(sd, 0x07, TR0MODE); in adv7170_s_std_output()
197 adv7170_write_block(sd, init_PAL, sizeof(init_PAL)); in adv7170_s_std_output()
198 if (encoder->input == 0) in adv7170_s_std_output()
199 adv7170_write(sd, 0x02, 0x0e); /* Enable genlock */ in adv7170_s_std_output()
200 adv7170_write(sd, 0x07, TR0MODE | TR0RST); in adv7170_s_std_output()
201 adv7170_write(sd, 0x07, TR0MODE); in adv7170_s_std_output()
203 v4l2_dbg(1, debug, sd, "illegal norm: %llx\n", in adv7170_s_std_output()
205 return -EINVAL; in adv7170_s_std_output()
207 v4l2_dbg(1, debug, sd, "switched to %llx\n", (unsigned long long)std); in adv7170_s_std_output()
208 encoder->norm = std; in adv7170_s_std_output()
212 static int adv7170_s_routing(struct v4l2_subdev *sd, in adv7170_s_routing() argument
215 struct adv7170 *encoder = to_adv7170(sd); in adv7170_s_routing()
218 input = 1: input is from ZR36060 in adv7170_s_routing()
221 v4l2_dbg(1, debug, sd, "set input from %s\n", in adv7170_s_routing()
226 adv7170_write(sd, 0x01, 0x20); in adv7170_s_routing()
227 adv7170_write(sd, 0x08, TR1CAPT); /* TR1 */ in adv7170_s_routing()
228 adv7170_write(sd, 0x02, 0x0e); /* Enable genlock */ in adv7170_s_routing()
229 adv7170_write(sd, 0x07, TR0MODE | TR0RST); in adv7170_s_routing()
230 adv7170_write(sd, 0x07, TR0MODE); in adv7170_s_routing()
234 case 1: in adv7170_s_routing()
235 adv7170_write(sd, 0x01, 0x00); in adv7170_s_routing()
236 adv7170_write(sd, 0x08, TR1PLAY); /* TR1 */ in adv7170_s_routing()
237 adv7170_write(sd, 0x02, 0x08); in adv7170_s_routing()
238 adv7170_write(sd, 0x07, TR0MODE | TR0RST); in adv7170_s_routing()
239 adv7170_write(sd, 0x07, TR0MODE); in adv7170_s_routing()
244 v4l2_dbg(1, debug, sd, "illegal input: %d\n", input); in adv7170_s_routing()
245 return -EINVAL; in adv7170_s_routing()
247 v4l2_dbg(1, debug, sd, "switched to %s\n", inputs[input]); in adv7170_s_routing()
248 encoder->input = input; in adv7170_s_routing()
252 static int adv7170_enum_mbus_code(struct v4l2_subdev *sd, in adv7170_enum_mbus_code() argument
256 if (code->pad || code->index >= ARRAY_SIZE(adv7170_codes)) in adv7170_enum_mbus_code()
257 return -EINVAL; in adv7170_enum_mbus_code()
259 code->code = adv7170_codes[code->index]; in adv7170_enum_mbus_code()
263 static int adv7170_get_fmt(struct v4l2_subdev *sd, in adv7170_get_fmt() argument
267 struct v4l2_mbus_framefmt *mf = &format->format; in adv7170_get_fmt()
268 u8 val = adv7170_read(sd, 0x7); in adv7170_get_fmt()
270 if (format->pad) in adv7170_get_fmt()
271 return -EINVAL; in adv7170_get_fmt()
273 if ((val & 0x40) == (1 << 6)) in adv7170_get_fmt()
274 mf->code = MEDIA_BUS_FMT_UYVY8_1X16; in adv7170_get_fmt()
276 mf->code = MEDIA_BUS_FMT_UYVY8_2X8; in adv7170_get_fmt()
278 mf->colorspace = V4L2_COLORSPACE_SMPTE170M; in adv7170_get_fmt()
279 mf->width = 0; in adv7170_get_fmt()
280 mf->height = 0; in adv7170_get_fmt()
281 mf->field = V4L2_FIELD_ANY; in adv7170_get_fmt()
286 static int adv7170_set_fmt(struct v4l2_subdev *sd, in adv7170_set_fmt() argument
290 struct v4l2_mbus_framefmt *mf = &format->format; in adv7170_set_fmt()
291 u8 val = adv7170_read(sd, 0x7); in adv7170_set_fmt()
293 if (format->pad) in adv7170_set_fmt()
294 return -EINVAL; in adv7170_set_fmt()
296 switch (mf->code) { in adv7170_set_fmt()
306 v4l2_dbg(1, debug, sd, in adv7170_set_fmt()
307 "illegal v4l2_mbus_framefmt code: %d\n", mf->code); in adv7170_set_fmt()
308 return -EINVAL; in adv7170_set_fmt()
311 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) in adv7170_set_fmt()
312 return adv7170_write(sd, 0x7, val); in adv7170_set_fmt()
317 /* ----------------------------------------------------------------------- */
335 /* ----------------------------------------------------------------------- */
340 struct v4l2_subdev *sd; in adv7170_probe() local
344 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) in adv7170_probe()
345 return -ENODEV; in adv7170_probe()
348 client->addr << 1, client->adapter->name); in adv7170_probe()
350 encoder = devm_kzalloc(&client->dev, sizeof(*encoder), GFP_KERNEL); in adv7170_probe()
352 return -ENOMEM; in adv7170_probe()
353 sd = &encoder->sd; in adv7170_probe()
354 v4l2_i2c_subdev_init(sd, client, &adv7170_ops); in adv7170_probe()
355 encoder->norm = V4L2_STD_NTSC; in adv7170_probe()
356 encoder->input = 0; in adv7170_probe()
358 i = adv7170_write_block(sd, init_NTSC, sizeof(init_NTSC)); in adv7170_probe()
360 i = adv7170_write(sd, 0x07, TR0MODE | TR0RST); in adv7170_probe()
361 i = adv7170_write(sd, 0x07, TR0MODE); in adv7170_probe()
362 i = adv7170_read(sd, 0x12); in adv7170_probe()
363 v4l2_dbg(1, debug, sd, "revision %d\n", i & 1); in adv7170_probe()
366 v4l2_dbg(1, debug, sd, "init error 0x%x\n", i); in adv7170_probe()
372 struct v4l2_subdev *sd = i2c_get_clientdata(client); in adv7170_remove() local
374 v4l2_device_unregister_subdev(sd); in adv7170_remove()
377 /* ----------------------------------------------------------------------- */