Lines Matching refs:csi

46 	struct sun4i_csi *csi = container_of(notifier, struct sun4i_csi,
49 csi->src_subdev = subdev;
50 csi->src_pad = media_entity_get_fwnode_pad(&subdev->entity,
53 if (csi->src_pad < 0) {
54 dev_err(csi->dev, "Couldn't find output pad for subdev %s\n",
56 return csi->src_pad;
59 dev_dbg(csi->dev, "Bound %s pad: %d\n", subdev->name, csi->src_pad);
65 struct sun4i_csi *csi = container_of(notifier, struct sun4i_csi,
67 struct v4l2_subdev *subdev = &csi->subdev;
68 struct video_device *vdev = &csi->vdev;
71 ret = v4l2_device_register_subdev(&csi->v4l, subdev);
75 ret = sun4i_csi_v4l2_register(csi);
79 ret = media_device_register(&csi->mdev);
91 ret = media_create_pad_link(&csi->src_subdev->entity, csi->src_pad,
98 ret = v4l2_device_register_subdev_nodes(&csi->v4l);
105 media_device_unregister(&csi->mdev);
115 static int sun4i_csi_notifier_init(struct sun4i_csi *csi)
124 v4l2_async_nf_init(&csi->notifier, &csi->v4l);
126 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(csi->dev), 0, 0,
135 csi->bus = vep.bus.parallel;
137 asd = v4l2_async_nf_add_fwnode_remote(&csi->notifier, ep,
144 csi->notifier.ops = &sun4i_csi_notify_ops;
155 struct sun4i_csi *csi;
159 csi = devm_kzalloc(&pdev->dev, sizeof(*csi), GFP_KERNEL);
160 if (!csi)
162 platform_set_drvdata(pdev, csi);
163 csi->dev = &pdev->dev;
164 subdev = &csi->subdev;
165 vdev = &csi->vdev;
167 csi->traits = of_device_get_match_data(&pdev->dev);
168 if (!csi->traits)
171 csi->mdev.dev = csi->dev;
172 strscpy(csi->mdev.model, "Allwinner Video Capture Device",
173 sizeof(csi->mdev.model));
174 csi->mdev.hw_revision = 0;
175 media_device_init(&csi->mdev);
176 csi->v4l.mdev = &csi->mdev;
178 csi->regs = devm_platform_ioremap_resource(pdev, 0);
179 if (IS_ERR(csi->regs))
180 return PTR_ERR(csi->regs);
186 csi->bus_clk = devm_clk_get(&pdev->dev, "bus");
187 if (IS_ERR(csi->bus_clk)) {
189 return PTR_ERR(csi->bus_clk);
192 if (csi->traits->has_isp) {
193 csi->isp_clk = devm_clk_get(&pdev->dev, "isp");
194 if (IS_ERR(csi->isp_clk)) {
196 return PTR_ERR(csi->isp_clk);
200 csi->ram_clk = devm_clk_get(&pdev->dev, "ram");
201 if (IS_ERR(csi->ram_clk)) {
203 return PTR_ERR(csi->ram_clk);
206 csi->rst = devm_reset_control_get(&pdev->dev, NULL);
207 if (IS_ERR(csi->rst)) {
209 return PTR_ERR(csi->rst);
218 snprintf(subdev->name, sizeof(subdev->name), "sun4i-csi-0");
219 v4l2_set_subdevdata(subdev, csi);
221 csi->subdev_pads[CSI_SUBDEV_SINK].flags =
223 csi->subdev_pads[CSI_SUBDEV_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
225 csi->subdev_pads);
229 csi->vdev_pad.flags = MEDIA_PAD_FL_SINK | MEDIA_PAD_FL_MUST_CONNECT;
231 ret = media_entity_pads_init(&vdev->entity, 1, &csi->vdev_pad);
235 ret = sun4i_csi_dma_register(csi, irq);
239 ret = sun4i_csi_notifier_init(csi);
243 ret = v4l2_async_nf_register(&csi->notifier);
245 dev_err(csi->dev, "Couldn't register our notifier.\n");
254 media_device_unregister(&csi->mdev);
255 sun4i_csi_dma_unregister(csi);
258 media_device_cleanup(&csi->mdev);
265 struct sun4i_csi *csi = platform_get_drvdata(pdev);
268 v4l2_async_nf_unregister(&csi->notifier);
269 v4l2_async_nf_cleanup(&csi->notifier);
270 vb2_video_unregister_device(&csi->vdev);
271 media_device_unregister(&csi->mdev);
272 sun4i_csi_dma_unregister(csi);
273 media_device_cleanup(&csi->mdev);
297 struct sun4i_csi *csi = dev_get_drvdata(dev);
299 reset_control_deassert(csi->rst);
300 clk_prepare_enable(csi->bus_clk);
301 clk_prepare_enable(csi->ram_clk);
302 clk_set_rate(csi->isp_clk, 80000000);
303 clk_prepare_enable(csi->isp_clk);
305 writel(1, csi->regs + CSI_EN_REG);
312 struct sun4i_csi *csi = dev_get_drvdata(dev);
314 clk_disable_unprepare(csi->isp_clk);
315 clk_disable_unprepare(csi->ram_clk);
316 clk_disable_unprepare(csi->bus_clk);
318 reset_control_assert(csi->rst);
333 .name = "sun4i-csi",