Commit 33116eb1 authored by Sakari Ailus's avatar Sakari Ailus Committed by Hans Verkuil

media: ivsc: csi: Use IPU bridge

Use IPU bridge to instantiate software nodes for IPU6 related devices. If
the IPU6 device is probed before the MEI CSI device is created, neither
will probe unless there are further devices probed successfully which
triggers re-probe of both IPU6 and MEI CSI.

This patch ensures the necessary software nodes are in place when the MEI
CSI driver is probed.
Signed-off-by: default avatarSakari Ailus <sakari.ailus@linux.intel.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent e42ae51b
...@@ -19,12 +19,15 @@ ...@@ -19,12 +19,15 @@
#include <linux/mei_cl_bus.h> #include <linux/mei_cl_bus.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/pci.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/units.h> #include <linux/units.h>
#include <linux/uuid.h> #include <linux/uuid.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <media/ipu-bridge.h>
#include <media/ipu6-pci-table.h>
#include <media/v4l2-async.h> #include <media/v4l2-async.h>
#include <media/v4l2-ctrls.h> #include <media/v4l2-ctrls.h>
#include <media/v4l2-fwnode.h> #include <media/v4l2-fwnode.h>
...@@ -661,11 +664,23 @@ static int mei_csi_probe(struct mei_cl_device *cldev, ...@@ -661,11 +664,23 @@ static int mei_csi_probe(struct mei_cl_device *cldev,
const struct mei_cl_device_id *id) const struct mei_cl_device_id *id)
{ {
struct device *dev = &cldev->dev; struct device *dev = &cldev->dev;
struct pci_dev *ipu;
struct mei_csi *csi; struct mei_csi *csi;
unsigned int i;
int ret; int ret;
if (!dev_fwnode(dev)) for (i = 0, ipu = NULL; !ipu && ipu6_pci_tbl[i].vendor; i++)
return -EPROBE_DEFER; ipu = pci_get_device(ipu6_pci_tbl[i].vendor,
ipu6_pci_tbl[i].device, NULL);
if (!ipu)
return -ENODEV;
ret = ipu_bridge_init(&ipu->dev, ipu_bridge_parse_ssdb);
if (ret < 0)
return ret;
if (WARN_ON(!dev_fwnode(dev)))
return -ENXIO;
csi = devm_kzalloc(dev, sizeof(struct mei_csi), GFP_KERNEL); csi = devm_kzalloc(dev, sizeof(struct mei_csi), GFP_KERNEL);
if (!csi) if (!csi)
...@@ -784,6 +799,7 @@ static struct mei_cl_driver mei_csi_driver = { ...@@ -784,6 +799,7 @@ static struct mei_cl_driver mei_csi_driver = {
module_mei_cl_driver(mei_csi_driver); module_mei_cl_driver(mei_csi_driver);
MODULE_IMPORT_NS(INTEL_IPU_BRIDGE);
MODULE_AUTHOR("Wentong Wu <wentong.wu@intel.com>"); MODULE_AUTHOR("Wentong Wu <wentong.wu@intel.com>");
MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>"); MODULE_AUTHOR("Zhifeng Wang <zhifeng.wang@intel.com>");
MODULE_DESCRIPTION("Device driver for IVSC CSI"); MODULE_DESCRIPTION("Device driver for IVSC CSI");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment