Lines Matching full:tw9900

3  * Driver for the Techwell TW9900 multi-standard video decoder.
73 struct tw9900 { struct
89 #define to_tw9900(sd) container_of(sd, struct tw9900, subdev) argument
190 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_get_fmt() local
193 mutex_lock(&tw9900->mutex); in tw9900_get_fmt()
194 tw9900_fill_fmt(tw9900->cur_mode, mbus_fmt); in tw9900_get_fmt()
195 mutex_unlock(&tw9900->mutex); in tw9900_get_fmt()
204 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_set_fmt() local
207 mutex_lock(&tw9900->mutex); in tw9900_set_fmt()
209 if (tw9900->streaming) { in tw9900_set_fmt()
210 mutex_unlock(&tw9900->mutex); in tw9900_set_fmt()
214 tw9900_fill_fmt(tw9900->cur_mode, mbus_fmt); in tw9900_set_fmt()
216 mutex_unlock(&tw9900->mutex); in tw9900_set_fmt()
235 struct tw9900 *tw9900 = container_of(ctrl->handler, struct tw9900, hdl); in tw9900_s_ctrl() local
238 if (pm_runtime_suspended(&tw9900->client->dev)) in tw9900_s_ctrl()
241 /* v4l2_ctrl_lock() locks tw9900->mutex. */ in tw9900_s_ctrl()
244 ret = tw9900_write_reg(tw9900->client, TW9900_REG_BRIGHT_CTL, in tw9900_s_ctrl()
248 ret = tw9900_write_reg(tw9900->client, TW9900_REG_CONTRAST_CTL, in tw9900_s_ctrl()
261 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_s_stream() local
262 struct i2c_client *client = tw9900->client; in tw9900_s_stream()
265 mutex_lock(&tw9900->mutex); in tw9900_s_stream()
267 if (tw9900->streaming == on) { in tw9900_s_stream()
268 mutex_unlock(&tw9900->mutex); in tw9900_s_stream()
272 mutex_unlock(&tw9900->mutex); in tw9900_s_stream()
279 mutex_lock(&tw9900->mutex); in tw9900_s_stream()
285 ret = tw9900_write_array(tw9900->client, in tw9900_s_stream()
286 tw9900->cur_mode->reg_list, in tw9900_s_stream()
287 tw9900->cur_mode->n_regs); in tw9900_s_stream()
296 tw9900->streaming = on; in tw9900_s_stream()
298 mutex_unlock(&tw9900->mutex); in tw9900_s_stream()
301 mutex_lock(&tw9900->mutex); in tw9900_s_stream()
308 tw9900->streaming = on; in tw9900_s_stream()
310 mutex_unlock(&tw9900->mutex); in tw9900_s_stream()
318 mutex_unlock(&tw9900->mutex); in tw9900_s_stream()
340 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_s_std() local
353 mutex_lock(&tw9900->mutex); in tw9900_s_std()
354 tw9900->cur_mode = mode; in tw9900_s_std()
355 mutex_unlock(&tw9900->mutex); in tw9900_s_std()
360 static int tw9900_get_stream_std(struct tw9900 *tw9900, in tw9900_get_stream_std() argument
365 lockdep_assert_held(&tw9900->mutex); in tw9900_get_stream_std()
367 ret = tw9900_read_reg(tw9900->client, TW9900_REG_STD); in tw9900_get_stream_std()
394 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_g_std() local
396 mutex_lock(&tw9900->mutex); in tw9900_g_std()
397 *std = tw9900->cur_mode->std; in tw9900_g_std()
398 mutex_unlock(&tw9900->mutex); in tw9900_g_std()
403 static int tw9900_start_autodetect(struct tw9900 *tw9900) in tw9900_start_autodetect() argument
407 lockdep_assert_held(&tw9900->mutex); in tw9900_start_autodetect()
409 ret = tw9900_write_reg(tw9900->client, TW9900_REG_STDR, in tw9900_start_autodetect()
415 ret = tw9900_write_reg(tw9900->client, TW9900_REG_STD, in tw9900_start_autodetect()
420 ret = tw9900_write_reg(tw9900->client, TW9900_REG_STDR, in tw9900_start_autodetect()
436 static int tw9900_detect_done(struct tw9900 *tw9900, bool *done) in tw9900_detect_done() argument
440 lockdep_assert_held(&tw9900->mutex); in tw9900_detect_done()
442 ret = tw9900_read_reg(tw9900->client, TW9900_REG_STD); in tw9900_detect_done()
453 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_querystd() local
457 mutex_lock(&tw9900->mutex); in tw9900_querystd()
459 if (tw9900->streaming) { in tw9900_querystd()
460 mutex_unlock(&tw9900->mutex); in tw9900_querystd()
464 mutex_unlock(&tw9900->mutex); in tw9900_querystd()
466 ret = pm_runtime_resume_and_get(&tw9900->client->dev); in tw9900_querystd()
470 mutex_lock(&tw9900->mutex); in tw9900_querystd()
472 ret = tw9900_start_autodetect(tw9900); in tw9900_querystd()
477 ret = tw9900_detect_done(tw9900, &done); in tw9900_querystd()
492 ret = tw9900_get_stream_std(tw9900, std); in tw9900_querystd()
495 mutex_unlock(&tw9900->mutex); in tw9900_querystd()
496 pm_runtime_put(&tw9900->client->dev); in tw9900_querystd()
510 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_g_input_status() local
513 mutex_lock(&tw9900->mutex); in tw9900_g_input_status()
515 if (tw9900->streaming) { in tw9900_g_input_status()
516 mutex_unlock(&tw9900->mutex); in tw9900_g_input_status()
520 mutex_unlock(&tw9900->mutex); in tw9900_g_input_status()
524 ret = pm_runtime_resume_and_get(&tw9900->client->dev); in tw9900_g_input_status()
528 mutex_lock(&tw9900->mutex); in tw9900_g_input_status()
529 ret = tw9900_read_reg(tw9900->client, TW9900_REG_CHIP_STATUS); in tw9900_g_input_status()
530 mutex_unlock(&tw9900->mutex); in tw9900_g_input_status()
532 pm_runtime_put(&tw9900->client->dev); in tw9900_g_input_status()
572 static int tw9900_check_id(struct tw9900 *tw9900, in tw9900_check_id() argument
575 struct device *dev = &tw9900->client->dev; in tw9900_check_id()
578 ret = pm_runtime_resume_and_get(&tw9900->client->dev); in tw9900_check_id()
582 mutex_lock(&tw9900->mutex); in tw9900_check_id()
584 mutex_unlock(&tw9900->mutex); in tw9900_check_id()
586 pm_runtime_put(&tw9900->client->dev); in tw9900_check_id()
603 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_runtime_resume() local
606 mutex_lock(&tw9900->mutex); in tw9900_runtime_resume()
608 if (tw9900->reset_gpio) in tw9900_runtime_resume()
609 gpiod_set_value_cansleep(tw9900->reset_gpio, 1); in tw9900_runtime_resume()
611 ret = regulator_enable(tw9900->regulator); in tw9900_runtime_resume()
613 mutex_unlock(&tw9900->mutex); in tw9900_runtime_resume()
619 if (tw9900->reset_gpio) in tw9900_runtime_resume()
620 gpiod_set_value_cansleep(tw9900->reset_gpio, 0); in tw9900_runtime_resume()
624 ret = tw9900_write_array(tw9900->client, tw9900_init_regs, in tw9900_runtime_resume()
627 mutex_unlock(&tw9900->mutex); in tw9900_runtime_resume()
639 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_runtime_suspend() local
641 mutex_lock(&tw9900->mutex); in tw9900_runtime_suspend()
643 if (tw9900->reset_gpio) in tw9900_runtime_suspend()
644 gpiod_set_value_cansleep(tw9900->reset_gpio, 1); in tw9900_runtime_suspend()
646 regulator_disable(tw9900->regulator); in tw9900_runtime_suspend()
648 mutex_unlock(&tw9900->mutex); in tw9900_runtime_suspend()
657 struct tw9900 *tw9900; in tw9900_probe() local
660 tw9900 = devm_kzalloc(dev, sizeof(*tw9900), GFP_KERNEL); in tw9900_probe()
661 if (!tw9900) in tw9900_probe()
664 tw9900->client = client; in tw9900_probe()
665 tw9900->cur_mode = &supported_modes[0]; in tw9900_probe()
667 tw9900->reset_gpio = devm_gpiod_get_optional(dev, "reset", in tw9900_probe()
669 if (IS_ERR(tw9900->reset_gpio)) in tw9900_probe()
670 return dev_err_probe(dev, PTR_ERR(tw9900->reset_gpio), in tw9900_probe()
673 tw9900->regulator = devm_regulator_get(&tw9900->client->dev, "vdd"); in tw9900_probe()
674 if (IS_ERR(tw9900->regulator)) in tw9900_probe()
675 return dev_err_probe(dev, PTR_ERR(tw9900->regulator), in tw9900_probe()
678 v4l2_i2c_subdev_init(&tw9900->subdev, client, &tw9900_subdev_ops); in tw9900_probe()
679 tw9900->subdev.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | in tw9900_probe()
682 mutex_init(&tw9900->mutex); in tw9900_probe()
684 hdl = &tw9900->hdl; in tw9900_probe()
690 hdl->lock = &tw9900->mutex; in tw9900_probe()
697 tw9900->subdev.ctrl_handler = hdl; in tw9900_probe()
703 tw9900->pad.flags = MEDIA_PAD_FL_SOURCE; in tw9900_probe()
704 tw9900->subdev.entity.function = MEDIA_ENT_F_DV_DECODER; in tw9900_probe()
706 ret = media_entity_pads_init(&tw9900->subdev.entity, 1, &tw9900->pad); in tw9900_probe()
713 ret = tw9900_check_id(tw9900, client); in tw9900_probe()
717 ret = v4l2_async_register_subdev(&tw9900->subdev); in tw9900_probe()
727 media_entity_cleanup(&tw9900->subdev.entity); in tw9900_probe()
731 mutex_destroy(&tw9900->mutex); in tw9900_probe()
739 struct tw9900 *tw9900 = to_tw9900(sd); in tw9900_remove() local
747 mutex_destroy(&tw9900->mutex); in tw9900_remove()
756 { "tw9900" },
762 { .compatible = "techwell,tw9900" },
769 .name = "tw9900",
780 MODULE_DESCRIPTION("tw9900 decoder driver");