|
@@ -813,6 +813,38 @@ void dfl_fpga_feature_devs_remove(struct dfl_fpga_cdev *cdev)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(dfl_fpga_feature_devs_remove);
|
|
|
|
|
|
+/**
|
|
|
+ * __dfl_fpga_cdev_find_port - find a port under given container device
|
|
|
+ *
|
|
|
+ * @cdev: container device
|
|
|
+ * @data: data passed to match function
|
|
|
+ * @match: match function used to find specific port from the port device list
|
|
|
+ *
|
|
|
+ * Find a port device under container device. This function needs to be
|
|
|
+ * invoked with lock held.
|
|
|
+ *
|
|
|
+ * Return: pointer to port's platform device if successful, NULL otherwise.
|
|
|
+ *
|
|
|
+ * NOTE: you will need to drop the device reference with put_device() after use.
|
|
|
+ */
|
|
|
+struct platform_device *
|
|
|
+__dfl_fpga_cdev_find_port(struct dfl_fpga_cdev *cdev, void *data,
|
|
|
+ int (*match)(struct platform_device *, void *))
|
|
|
+{
|
|
|
+ struct dfl_feature_platform_data *pdata;
|
|
|
+ struct platform_device *port_dev;
|
|
|
+
|
|
|
+ list_for_each_entry(pdata, &cdev->port_dev_list, node) {
|
|
|
+ port_dev = pdata->dev;
|
|
|
+
|
|
|
+ if (match(port_dev, data) && get_device(&port_dev->dev))
|
|
|
+ return port_dev;
|
|
|
+ }
|
|
|
+
|
|
|
+ return NULL;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(__dfl_fpga_cdev_find_port);
|
|
|
+
|
|
|
static int __init dfl_fpga_init(void)
|
|
|
{
|
|
|
int ret;
|