int api_init_complete2(void) { int status = 0; struct cfg_devnode *dev_node; struct dev_object *hdev_obj; struct drv_data *drv_datap; u8 dev_type; for (hdev_obj = dev_get_first(); hdev_obj != NULL; hdev_obj = dev_get_next(hdev_obj)) { if (dev_get_dev_node(hdev_obj, &dev_node)) continue; if (dev_get_dev_type(hdev_obj, &dev_type)) continue; if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT)) { drv_datap = dev_get_drvdata(bridge); if (drv_datap && drv_datap->base_img) proc_auto_start(dev_node, hdev_obj); } } return status; }
/* * ======== api_init_complete2 ======== * Purpose: * Perform any required bridge initialization which cannot * be performed in api_init() or dev_start_device() due * to the fact that some services are not yet * completely initialized. * Parameters: * Returns: * 0: Allow this device to load * -EPERM: Failure. * Requires: * Bridge API initialized. * Ensures: */ int api_init_complete2(void) { int status = 0; struct cfg_devnode *dev_node; struct dev_object *hdev_obj; struct drv_data *drv_datap; u8 dev_type; /* Walk the list of DevObjects, get each devnode, and attempting to * autostart the board. Note that this requires COF loading, which * requires KFILE. */ for (hdev_obj = dev_get_first(); hdev_obj != NULL; hdev_obj = dev_get_next(hdev_obj)) { if (dev_get_dev_node(hdev_obj, &dev_node)) continue; if (dev_get_dev_type(hdev_obj, &dev_type)) continue; if ((dev_type == DSP_UNIT) || (dev_type == IVA_UNIT)) { drv_datap = dev_get_drvdata(bridge); if (drv_datap && drv_datap->base_img) proc_auto_start(dev_node, hdev_obj); } } return status; }
static void bridge_recover(struct work_struct *work) { struct dev_object *dev; struct cfg_devnode *dev_node; if (atomic_read(&bridge_cref)) { INIT_COMPLETION(bridge_comp); while (!wait_for_completion_timeout(&bridge_comp, msecs_to_jiffies(REC_TIMEOUT))) pr_info("%s:%d handle(s) still opened\n", __func__, atomic_read(&bridge_cref)); } dev = dev_get_first(); dev_get_dev_node(dev, &dev_node); if (!dev_node || proc_auto_start(dev_node, dev)) pr_err("DSP could not be restarted\n"); recover = false; complete_all(&bridge_open_comp); }