Lines Matching +full:fpd +full:- +full:link
1 // SPDX-License-Identifier: GPL-2.0
12 #include <linux/clk-provider.h>
17 #include <linux/i2c-atr.h>
25 #include <media/v4l2-fwnode.h>
26 #include <media/v4l2-mediabus.h>
27 #include <media/v4l2-subdev.h>
103 /* Only RAW10 with 8-bit payload is supported at the moment */
127 ret = regmap_read(priv->regmap, reg, &v); in ub913_read()
129 dev_err(&priv->client->dev, in ub913_read()
142 ret = regmap_write(priv->regmap, reg, val); in ub913_write()
144 dev_err(&priv->client->dev, in ub913_write()
155 ret = regmap_update_bits(priv->regmap, reg, mask, val); in ub913_update_bits()
157 dev_err(&priv->client->dev, in ub913_update_bits()
178 return regmap_update_bits(priv->regmap, UB913_REG_GPIO_CFG(reg_idx), in ub913_gpio_direction_out()
195 *flags = gpiospec->args[1]; in ub913_gpio_of_xlate()
197 return gpiospec->args[0]; in ub913_gpio_of_xlate()
202 struct device *dev = &priv->client->dev; in ub913_gpiochip_probe()
203 struct gpio_chip *gc = &priv->gpio_chip; in ub913_gpiochip_probe()
206 /* Initialize GPIOs 0 and 1 to local control, tri-state */ in ub913_gpiochip_probe()
209 gc->label = dev_name(dev); in ub913_gpiochip_probe()
210 gc->parent = dev; in ub913_gpiochip_probe()
211 gc->owner = THIS_MODULE; in ub913_gpiochip_probe()
212 gc->base = -1; in ub913_gpiochip_probe()
213 gc->can_sleep = true; in ub913_gpiochip_probe()
214 gc->ngpio = UB913_NUM_GPIOS; in ub913_gpiochip_probe()
215 gc->get_direction = ub913_gpio_get_direction; in ub913_gpiochip_probe()
216 gc->direction_output = ub913_gpio_direction_out; in ub913_gpiochip_probe()
217 gc->set = ub913_gpio_set; in ub913_gpiochip_probe()
218 gc->of_xlate = ub913_gpio_of_xlate; in ub913_gpiochip_probe()
219 gc->of_gpio_n_cells = 2; in ub913_gpiochip_probe()
232 gpiochip_remove(&priv->gpio_chip); in ub913_gpiochip_remove()
259 ret = v4l2_subdev_enable_streams(priv->source_sd, priv->source_sd_pad, in ub913_enable_streams()
264 priv->enabled_source_streams |= streams_mask; in ub913_enable_streams()
281 ret = v4l2_subdev_disable_streams(priv->source_sd, priv->source_sd_pad, in ub913_disable_streams()
286 priv->enabled_source_streams &= ~streams_mask; in ub913_disable_streams()
324 if (routing->num_routes > V4L2_FRAME_DESC_ENTRY_MAX) in _ub913_set_routing()
325 return -EINVAL; in _ub913_set_routing()
336 stream_configs = &state->stream_configs; in _ub913_set_routing()
338 for (i = 0; i < stream_configs->num_configs; i++) { in _ub913_set_routing()
339 if (stream_configs->configs[i].pad == UB913_PAD_SINK) in _ub913_set_routing()
340 stream_configs->configs[i].fmt = in_format; in _ub913_set_routing()
342 stream_configs->configs[i].fmt = out_format; in _ub913_set_routing()
355 if (which == V4L2_SUBDEV_FORMAT_ACTIVE && priv->enabled_source_streams) in ub913_set_routing()
356 return -EBUSY; in ub913_set_routing()
372 return -EINVAL; in ub913_get_frame_desc()
374 ret = v4l2_subdev_call(priv->source_sd, pad, get_frame_desc, in ub913_get_frame_desc()
375 priv->source_sd_pad, &source_fd); in ub913_get_frame_desc()
381 fd->type = V4L2_MBUS_FRAME_DESC_TYPE_PARALLEL; in ub913_get_frame_desc()
385 routing = &state->routing; in ub913_get_frame_desc()
390 if (route->source_pad != pad) in ub913_get_frame_desc()
394 if (source_fd.entry[i].stream == route->sink_stream) in ub913_get_frame_desc()
399 dev_err(&priv->client->dev, in ub913_get_frame_desc()
401 ret = -EPIPE; in ub913_get_frame_desc()
405 fd->entry[fd->num_entries].stream = route->source_stream; in ub913_get_frame_desc()
406 fd->entry[fd->num_entries].flags = source_fd.entry[i].flags; in ub913_get_frame_desc()
407 fd->entry[fd->num_entries].length = source_fd.entry[i].length; in ub913_get_frame_desc()
408 fd->entry[fd->num_entries].pixelcode = in ub913_get_frame_desc()
411 fd->num_entries++; in ub913_get_frame_desc()
428 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE && in ub913_set_fmt()
429 priv->enabled_source_streams) in ub913_set_fmt()
430 return -EBUSY; in ub913_set_fmt()
433 if (format->pad == UB913_PAD_SOURCE) in ub913_set_fmt()
436 finfo = ub913_find_format(format->format.code); in ub913_set_fmt()
439 format->format.code = finfo->incode; in ub913_set_fmt()
443 fmt = v4l2_subdev_state_get_stream_format(state, format->pad, in ub913_set_fmt()
444 format->stream); in ub913_set_fmt()
446 return -EINVAL; in ub913_set_fmt()
448 *fmt = format->format; in ub913_set_fmt()
451 fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad, in ub913_set_fmt()
452 format->stream); in ub913_set_fmt()
454 return -EINVAL; in ub913_set_fmt()
456 format->format.code = finfo->outcode; in ub913_set_fmt()
458 *fmt = format->format; in ub913_set_fmt()
487 struct device *dev = &priv->client->dev; in ub913_log_status()
539 struct ub913_data *priv = sd_to_ub913(notifier->sd); in ub913_notify_bound()
540 struct device *dev = &priv->client->dev; in ub913_notify_bound()
543 ret = media_entity_get_fwnode_pad(&source_subdev->entity, in ub913_notify_bound()
544 source_subdev->fwnode, in ub913_notify_bound()
548 source_subdev->name); in ub913_notify_bound()
552 priv->source_sd = source_subdev; in ub913_notify_bound()
553 priv->source_sd_pad = ret; in ub913_notify_bound()
555 ret = media_create_pad_link(&source_subdev->entity, priv->source_sd_pad, in ub913_notify_bound()
556 &priv->sd.entity, UB913_PAD_SINK, in ub913_notify_bound()
560 dev_err(dev, "Unable to link %s:%u -> %s:0\n", in ub913_notify_bound()
561 source_subdev->name, priv->source_sd_pad, in ub913_notify_bound()
562 priv->sd.name); in ub913_notify_bound()
575 struct device *dev = &priv->client->dev; in ub913_v4l2_notifier_register()
584 return -ENODEV; in ub913_v4l2_notifier_register()
587 v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd); in ub913_v4l2_notifier_register()
589 asd = v4l2_async_nf_add_fwnode_remote(&priv->notifier, ep_fwnode, in ub913_v4l2_notifier_register()
596 v4l2_async_nf_cleanup(&priv->notifier); in ub913_v4l2_notifier_register()
600 priv->notifier.ops = &ub913_notify_ops; in ub913_v4l2_notifier_register()
602 ret = v4l2_async_nf_register(&priv->notifier); in ub913_v4l2_notifier_register()
605 v4l2_async_nf_cleanup(&priv->notifier); in ub913_v4l2_notifier_register()
614 v4l2_async_nf_unregister(&priv->notifier); in ub913_v4l2_nf_unregister()
615 v4l2_async_nf_cleanup(&priv->notifier); in ub913_v4l2_nf_unregister()
620 struct device *dev = &priv->client->dev; in ub913_register_clkout()
626 return -ENOMEM; in ub913_register_clkout()
628 priv->clkout_clk_hw = devm_clk_hw_register_fixed_factor(dev, name, in ub913_register_clkout()
629 __clk_get_name(priv->clkin), 0, 1, 2); in ub913_register_clkout()
633 if (IS_ERR(priv->clkout_clk_hw)) in ub913_register_clkout()
634 return dev_err_probe(dev, PTR_ERR(priv->clkout_clk_hw), in ub913_register_clkout()
638 priv->clkout_clk_hw); in ub913_register_clkout()
654 ref = clk_get_rate(priv->clkin) / 2; in ub913_i2c_master_init()
672 struct device *dev = &priv->client->dev; in ub913_add_i2c_adapter()
680 ret = i2c_atr_add_adapter(priv->plat_data->atr, priv->plat_data->port, in ub913_add_i2c_adapter()
693 struct device *dev = &priv->client->dev; in ub913_parse_dt()
703 return dev_err_probe(dev, -ENOENT, "No sink endpoint\n"); in ub913_parse_dt()
714 priv->pclk_polarity_rising = true; in ub913_parse_dt()
716 priv->pclk_polarity_rising = false; in ub913_parse_dt()
718 return dev_err_probe(dev, -EINVAL, in ub913_parse_dt()
719 "bad value for 'pclk-sample'\n"); in ub913_parse_dt()
726 struct device *dev = &priv->client->dev; in ub913_hw_init()
737 return dev_err_probe(dev, -ENODEV, in ub913_hw_init()
753 priv->pclk_polarity_rising)); in ub913_hw_init()
763 struct device *dev = &priv->client->dev; in ub913_subdev_init()
766 v4l2_i2c_subdev_init(&priv->sd, priv->client, &ub913_subdev_ops); in ub913_subdev_init()
767 priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS; in ub913_subdev_init()
768 priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE; in ub913_subdev_init()
769 priv->sd.entity.ops = &ub913_entity_ops; in ub913_subdev_init()
771 priv->pads[0].flags = MEDIA_PAD_FL_SINK; in ub913_subdev_init()
772 priv->pads[1].flags = MEDIA_PAD_FL_SOURCE; in ub913_subdev_init()
774 ret = media_entity_pads_init(&priv->sd.entity, 2, priv->pads); in ub913_subdev_init()
778 ret = v4l2_subdev_init_finalize(&priv->sd); in ub913_subdev_init()
789 ret = v4l2_async_register_subdev(&priv->sd); in ub913_subdev_init()
800 v4l2_subdev_cleanup(&priv->sd); in ub913_subdev_init()
802 media_entity_cleanup(&priv->sd.entity); in ub913_subdev_init()
809 v4l2_async_unregister_subdev(&priv->sd); in ub913_subdev_uninit()
811 v4l2_subdev_cleanup(&priv->sd); in ub913_subdev_uninit()
812 media_entity_cleanup(&priv->sd.entity); in ub913_subdev_uninit()
817 struct device *dev = &client->dev; in ub913_probe()
823 return -ENOMEM; in ub913_probe()
825 priv->client = client; in ub913_probe()
827 priv->plat_data = dev_get_platdata(&client->dev); in ub913_probe()
828 if (!priv->plat_data) in ub913_probe()
829 return dev_err_probe(dev, -ENODEV, "Platform data missing\n"); in ub913_probe()
831 priv->regmap = devm_regmap_init_i2c(client, &ub913_regmap_config); in ub913_probe()
832 if (IS_ERR(priv->regmap)) in ub913_probe()
833 return dev_err_probe(dev, PTR_ERR(priv->regmap), in ub913_probe()
840 priv->clkin = devm_clk_get(dev, "clkin"); in ub913_probe()
841 if (IS_ERR(priv->clkin)) in ub913_probe()
842 return dev_err_probe(dev, PTR_ERR(priv->clkin), in ub913_probe()
888 i2c_atr_del_adapter(priv->plat_data->atr, priv->plat_data->port); in ub913_remove()
895 static const struct i2c_device_id ub913_id[] = { { "ds90ub913a-q1", 0 }, {} };
899 { .compatible = "ti,ds90ub913a-q1" },
916 MODULE_DESCRIPTION("Texas Instruments DS90UB913 FPD-Link III Serializer Driver");