static int exynos_dp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *panel_node; struct exynos_dp_device *dp; int ret; ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR, exynos_dp_display.type); if (ret) return ret; dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device), GFP_KERNEL); if (!dp) return -ENOMEM; panel_node = of_parse_phandle(dev->of_node, "panel", 0); if (panel_node) { dp->panel = of_drm_find_panel(panel_node); of_node_put(panel_node); if (!dp->panel) return -EPROBE_DEFER; } exynos_dp_display.ctx = dp; ret = component_add(&pdev->dev, &exynos_dp_ops); if (ret) exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR); return ret; }
static void msm_hdmi_register_audio_driver(struct hdmi *hdmi, struct device *dev) { struct hdmi_codec_pdata codec_data = { .ops = &msm_hdmi_audio_codec_ops, .max_i2s_channels = 2, .i2s = 1, }; //struct platform_device *pdev; hdmi->audio_pdev = platform_device_register_data(dev, HDMI_CODEC_DRV_NAME, PLATFORM_DEVID_AUTO, &codec_data, sizeof(codec_data)); if (IS_ERR(hdmi->audio_pdev)) return; DRM_INFO("%s driver bound to HDMI\n", HDMI_CODEC_DRV_NAME); } static int hdmi_dev_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &hdmi_ops); } static int hdmi_dev_remove(struct platform_device *pdev) { component_del(&pdev->dev, &hdmi_ops); return 0; }
static int ipu_drm_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct ipu_client_platformdata *pdata = dev->platform_data; int ret; if (!dev->platform_data) return -EINVAL; if (!dev->of_node) { /* Associate crtc device with the corresponding DI port node */ dev->of_node = ipu_drm_get_port_by_id(dev->parent->of_node, pdata->di + 2); if (!dev->of_node) { dev_err(dev, "missing port@%d node in %s\n", pdata->di + 2, dev->parent->of_node->full_name); return -ENODEV; } } ret = dma_set_coherent_mask(dev, DMA_BIT_MASK(32)); if (ret) return ret; return component_add(dev, &ipu_crtc_ops); }
static int vop_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; if (!dev->of_node) { dev_err(dev, "can't find vop devices\n"); return -ENODEV; } return component_add(dev, &vop_component_ops); }
static int exynos_dp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = NULL, *endpoint = NULL; struct exynos_dp_device *dp; dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device), GFP_KERNEL); if (!dp) return -ENOMEM; /* * We just use the drvdata until driver run into component * add function, and then we would set drvdata to null, so * that analogix dp driver would take charge of the drvdata. */ platform_set_drvdata(pdev, dp); /* This is for the backward compatibility. */ np = of_parse_phandle(dev->of_node, "panel", 0); if (np) { dp->plat_data.panel = of_drm_find_panel(np); of_node_put(np); if (!dp->plat_data.panel) return -EPROBE_DEFER; goto out; } endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); if (endpoint) { np = of_graph_get_remote_port_parent(endpoint); if (np) { /* The remote port can be either a panel or a bridge */ dp->plat_data.panel = of_drm_find_panel(np); if (!dp->plat_data.panel) { dp->ptn_bridge = of_drm_find_bridge(np); if (!dp->ptn_bridge) { of_node_put(np); return -EPROBE_DEFER; } } of_node_put(np); } else { DRM_ERROR("no remote endpoint device node found.\n"); return -EINVAL; } } else { DRM_ERROR("no port endpoint subnode found.\n"); return -EINVAL; } out: return component_add(&pdev->dev, &exynos_dp_ops); }
static int rockchip_dp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *panel_node, *port, *endpoint; struct rockchip_dp_device *dp; struct drm_panel *panel; port = of_graph_get_port_by_id(dev->of_node, 1); if (!port) { dev_err(dev, "can't find output port\n"); return -EINVAL; } endpoint = of_get_child_by_name(port, "endpoint"); of_node_put(port); if (!endpoint) { dev_err(dev, "no output endpoint found\n"); return -EINVAL; } panel_node = of_graph_get_remote_port_parent(endpoint); of_node_put(endpoint); if (!panel_node) { dev_err(dev, "no output node found\n"); return -EINVAL; } panel = of_drm_find_panel(panel_node); if (!panel) { DRM_ERROR("failed to find panel\n"); of_node_put(panel_node); return -EPROBE_DEFER; } of_node_put(panel_node); dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL); if (!dp) return -ENOMEM; dp->dev = dev; dp->plat_data.panel = panel; /* * We just use the drvdata until driver run into component * add function, and then we would set drvdata to null, so * that analogix dp driver could take charge of the drvdata. */ platform_set_drvdata(pdev, dp); return component_add(dev, &rockchip_dp_component_ops); }
static int sti_tvout_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; struct sti_tvout *tvout; struct resource *res; struct device_node *child_np; struct component_match *match = NULL; DRM_INFO("%s\n", __func__); if (!node) return -ENODEV; tvout = devm_kzalloc(dev, sizeof(*tvout), GFP_KERNEL); if (!tvout) return -ENOMEM; tvout->dev = dev; /* get Memory ressources */ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tvout-reg"); if (!res) { DRM_ERROR("Invalid glue resource\n"); return -ENOMEM; } tvout->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); if (!tvout->regs) return -ENOMEM; /* get reset resources */ tvout->reset = devm_reset_control_get(dev, "tvout"); /* take tvout out of reset */ if (!IS_ERR(tvout->reset)) reset_control_deassert(tvout->reset); platform_set_drvdata(pdev, tvout); of_platform_populate(node, NULL, NULL, dev); child_np = of_get_next_available_child(node, NULL); while (child_np) { component_match_add(dev, &match, compare_of, child_np); of_node_put(child_np); child_np = of_get_next_available_child(node, child_np); } component_master_add_with_match(dev, &sti_tvout_master_ops, match); return component_add(dev, &sti_tvout_ops); }
void init() { // Add backgound object background = gameobject_create(); background->size_x = 320; background->size_y = 240; background->size_x = 0; background->size_y = 0; component_add(background, component_sprite, space); engine_gameobject_add(background); // Add object player1 = gameobject_create(); player1->size_x = 32; player1->size_y = 32; player1->pos_x = SCREEN_WIDTH/2 + 10; player1->pos_y = 200; player1->size_x = 32; player1->size_y = 32; player1->type = TYPE_PLAYER1; player1->hp = player1->size_x; component_shoot_data shoot_data = { .rate = PLAYER_BULLET_RATE, .speed_x = 0, .speed_y = -PLAYER_BULLET_SPEED, .damage = PLAYER_BULLET_DAMAGE, .target_type = TYPE_ENEMY, .sprite = bullet, }; component_add(player1, component_player_control, (void*)0); component_add(player1, component_sprite, rabby); component_add(player1, component_shoot, &shoot_data); component_add(player1, component_hpbar,(int[]) {player1->hp, 4}) ; component_add(player1, component_death, &player_death); engine_gameobject_add(player1); // Add object player2 = gameobject_create(); player2->size_x = 32; player2->size_y = 32; player2->pos_x = SCREEN_WIDTH/2 - player2->size_x - 10; player2->pos_y = 200; player2->type = TYPE_PLAYER2; player2->size_x = 32; player2->size_y = 32; player2->hp = player2->size_x; component_add(player2, component_player_control, (void*)1); component_add(player2, component_sprite, rabby); component_add(player2, component_shoot, &shoot_data); component_add(player2, component_hpbar, (int[]) {player2->hp, 4}) ;
static int ipu_drm_probe(struct platform_device *pdev) { int ret; if (!pdev->dev.platform_data) return -EINVAL; ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); if (ret) return ret; return component_add(&pdev->dev, &ipu_crtc_ops); }
static int sti_hqvdp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *vtg_np; struct sti_hqvdp *hqvdp; struct resource *res; DRM_DEBUG_DRIVER("\n"); hqvdp = devm_kzalloc(dev, sizeof(*hqvdp), GFP_KERNEL); if (!hqvdp) { DRM_ERROR("Failed to allocate HQVDP context\n"); return -ENOMEM; } hqvdp->dev = dev; /* Get Memory resources */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { DRM_ERROR("Get memory resource failed\n"); return -ENXIO; } hqvdp->regs = devm_ioremap(dev, res->start, resource_size(res)); if (hqvdp->regs == NULL) { DRM_ERROR("Register mapping failed\n"); return -ENXIO; } /* Get clock resources */ hqvdp->clk = devm_clk_get(dev, "hqvdp"); hqvdp->clk_pix_main = devm_clk_get(dev, "pix_main"); if (IS_ERR(hqvdp->clk) || IS_ERR(hqvdp->clk_pix_main)) { DRM_ERROR("Cannot get clocks\n"); return -ENXIO; } /* Get reset resources */ hqvdp->reset = devm_reset_control_get(dev, "hqvdp"); if (!IS_ERR(hqvdp->reset)) reset_control_deassert(hqvdp->reset); vtg_np = of_parse_phandle(pdev->dev.of_node, "st,vtg", 0); if (vtg_np) hqvdp->vtg = of_vtg_find(vtg_np); of_node_put(vtg_np); platform_set_drvdata(pdev, hqvdp); return component_add(&pdev->dev, &sti_hqvdp_ops); }
static int disp_manager_dev_probe(struct platform_device *pdev) { struct display_manager *disp_m; int rc = 0; if (!pdev || !pdev->dev.of_node) { pr_err("pdev not found\n"); return -ENODEV; } disp_m = devm_kzalloc(&pdev->dev, sizeof(*disp_m), GFP_KERNEL); if (!disp_m) return -ENOMEM; disp_m->name = "qcom,display-manager"; of_platform_populate(pdev->dev.of_node, displays_dt_match, NULL, &pdev->dev); disp_m->display_count = _dm_cache_active_displays(disp_m); if (!disp_m->display_count) { rc = -ENODEV; pr_err("no displays found, rc=%d\n", rc); goto error_free_disp_m; } rc = _dm_init_active_displays(disp_m); if (rc) { pr_err("failed to initialize displays, rc=%d\n", rc); goto error_remove_displays; } rc = component_add(&pdev->dev, &disp_manager_comp_ops); if (rc) { pr_err("failed to add component, rc=%d\n", rc); goto error_deinit_displays; } mutex_init(&disp_m->lock); platform_set_drvdata(pdev, disp_m); return rc; error_deinit_displays: _dm_deinit_active_displays(disp_m); error_remove_displays: of_platform_depopulate(&pdev->dev); error_free_disp_m: devm_kfree(&pdev->dev, disp_m); return rc; }
static int mtk_disp_rdma_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct mtk_disp_rdma *priv; int comp_id; int irq; int ret; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; irq = platform_get_irq(pdev, 0); if (irq < 0) return irq; comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_RDMA); if (comp_id < 0) { dev_err(dev, "Failed to identify by alias: %d\n", comp_id); return comp_id; } ret = mtk_ddp_comp_init(dev, dev->of_node, &priv->ddp_comp, comp_id, &mtk_disp_rdma_funcs); if (ret) { dev_err(dev, "Failed to initialize component: %d\n", ret); return ret; } /* Disable and clear pending interrupts */ writel(0x0, priv->ddp_comp.regs + DISP_REG_RDMA_INT_ENABLE); writel(0x0, priv->ddp_comp.regs + DISP_REG_RDMA_INT_STATUS); ret = devm_request_irq(dev, irq, mtk_disp_rdma_irq_handler, IRQF_TRIGGER_NONE, dev_name(dev), priv); if (ret < 0) { dev_err(dev, "Failed to request irq %d: %d\n", irq, ret); return ret; } platform_set_drvdata(pdev, priv); ret = component_add(dev, &mtk_disp_rdma_component_ops); if (ret) dev_err(dev, "Failed to add component: %d\n", ret); return ret; }
static int exynos_dp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *panel_node, *bridge_node, *endpoint; struct exynos_dp_device *dp; int ret; dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device), GFP_KERNEL); if (!dp) return -ENOMEM; dp->display.type = EXYNOS_DISPLAY_TYPE_LCD; dp->display.ops = &exynos_dp_display_ops; platform_set_drvdata(pdev, dp); ret = exynos_drm_component_add(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR, dp->display.type); if (ret) return ret; panel_node = of_parse_phandle(dev->of_node, "panel", 0); if (panel_node) { dp->panel = of_drm_find_panel(panel_node); of_node_put(panel_node); if (!dp->panel) return -EPROBE_DEFER; } endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); if (endpoint) { bridge_node = of_graph_get_remote_port_parent(endpoint); if (bridge_node) { dp->bridge = of_drm_find_bridge(bridge_node); of_node_put(bridge_node); if (!dp->bridge) return -EPROBE_DEFER; } else return -EPROBE_DEFER; } ret = component_add(&pdev->dev, &exynos_dp_ops); if (ret) exynos_drm_component_del(&pdev->dev, EXYNOS_DEVICE_TYPE_CONNECTOR); return ret; }
static int exynos_dp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np; struct exynos_dp_device *dp; struct drm_panel *panel; struct drm_bridge *bridge; int ret; dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device), GFP_KERNEL); if (!dp) return -ENOMEM; /* * We just use the drvdata until driver run into component * add function, and then we would set drvdata to null, so * that analogix dp driver would take charge of the drvdata. */ platform_set_drvdata(pdev, dp); /* This is for the backward compatibility. */ np = of_parse_phandle(dev->of_node, "panel", 0); if (np) { dp->plat_data.panel = of_drm_find_panel(np); of_node_put(np); if (IS_ERR(dp->plat_data.panel)) return PTR_ERR(dp->plat_data.panel); goto out; } ret = drm_of_find_panel_or_bridge(dev->of_node, 0, 0, &panel, &bridge); if (ret) return ret; /* The remote port can be either a panel or a bridge */ dp->plat_data.panel = panel; dp->plat_data.skip_connector = !!bridge; dp->ptn_bridge = bridge; out: return component_add(&pdev->dev, &exynos_dp_ops); }
static int mtk_disp_ovl_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct mtk_disp_ovl *priv; int comp_id; int irq; int ret; priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (!priv) return -ENOMEM; irq = platform_get_irq(pdev, 0); if (irq < 0) return irq; comp_id = mtk_ddp_comp_get_id(dev->of_node, MTK_DISP_OVL); if (comp_id < 0) { dev_err(dev, "Failed to identify by alias: %d\n", comp_id); return comp_id; } ret = mtk_ddp_comp_init(dev, dev->of_node, &priv->ddp_comp, comp_id, &mtk_disp_ovl_funcs); if (ret) { dev_err(dev, "Failed to initialize component: %d\n", ret); return ret; } platform_set_drvdata(pdev, priv); ret = devm_request_irq(dev, irq, mtk_disp_ovl_irq_handler, IRQF_TRIGGER_NONE, dev_name(dev), priv); if (ret < 0) { dev_err(dev, "Failed to request irq %d: %d\n", irq, ret); return ret; } ret = component_add(dev, &mtk_disp_ovl_component_ops); if (ret) dev_err(dev, "Failed to add component: %d\n", ret); return ret; }
static int sti_tvout_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *node = dev->of_node; struct sti_tvout *tvout; struct resource *res; DRM_INFO("%s\n", __func__); if (!node) return -ENODEV; tvout = devm_kzalloc(dev, sizeof(*tvout), GFP_KERNEL); if (!tvout) return -ENOMEM; tvout->dev = dev; /* get memory resources */ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tvout-reg"); if (!res) { DRM_ERROR("Invalid glue resource\n"); return -ENOMEM; } tvout->regs = devm_ioremap_nocache(dev, res->start, resource_size(res)); if (!tvout->regs) return -ENOMEM; /* get reset resources */ tvout->reset = devm_reset_control_get(dev, "tvout"); /* take tvout out of reset */ if (!IS_ERR(tvout->reset)) reset_control_deassert(tvout->reset); platform_set_drvdata(pdev, tvout); return component_add(dev, &sti_tvout_ops); }
void GGLAssembler::build_blending( component_t& temp, // incomming fragment / output const pixel_t& pixel, // framebuffer int component, Scratch& regs) { if (!mInfo[component].blend) return; int fs = component==GGLFormat::ALPHA ? mBlendSrcA : mBlendSrc; int fd = component==GGLFormat::ALPHA ? mBlendDstA : mBlendDst; if (fs==GGL_SRC_ALPHA_SATURATE && component==GGLFormat::ALPHA) fs = GGL_ONE; const int blending = blending_codes(fs, fd); if (!temp.size()) { // here, blending will produce something which doesn't depend on // that component (eg: GL_ZERO:GL_*), so the register has not been // allocated yet. Will never be used as a source. temp = component_t(regs.obtain(), CORRUPTIBLE); } // we are doing real blending... // fb: extracted dst // fragment: extracted src // temp: component_t(fragment) and result // scoped register allocator Scratch scratches(registerFile()); comment("blending"); // we can optimize these cases a bit... // (1) saturation is not needed // (2) we can use only one multiply instead of 2 // (3) we can reduce the register pressure // R = S*f + D*(1-f) = (S-D)*f + D // R = S*(1-f) + D*f = (D-S)*f + S const bool same_factor_opt1 = (fs==GGL_DST_COLOR && fd==GGL_ONE_MINUS_DST_COLOR) || (fs==GGL_SRC_COLOR && fd==GGL_ONE_MINUS_SRC_COLOR) || (fs==GGL_DST_ALPHA && fd==GGL_ONE_MINUS_DST_ALPHA) || (fs==GGL_SRC_ALPHA && fd==GGL_ONE_MINUS_SRC_ALPHA); const bool same_factor_opt2 = (fs==GGL_ONE_MINUS_DST_COLOR && fd==GGL_DST_COLOR) || (fs==GGL_ONE_MINUS_SRC_COLOR && fd==GGL_SRC_COLOR) || (fs==GGL_ONE_MINUS_DST_ALPHA && fd==GGL_DST_ALPHA) || (fs==GGL_ONE_MINUS_SRC_ALPHA && fd==GGL_SRC_ALPHA); // XXX: we could also optimize these cases: // R = S*f + D*f = (S+D)*f // R = S*(1-f) + D*(1-f) = (S+D)*(1-f) // R = S*D + D*S = 2*S*D // see if we need to extract 'component' from the destination (fb) integer_t fb; if (blending & (BLEND_DST|FACTOR_DST)) { fb.setTo(scratches.obtain(), 32); extract(fb, pixel, component); if (mDithering) { // XXX: maybe what we should do instead, is simply // expand fb -or- fragment to the larger of the two if (fb.size() < temp.size()) { // for now we expand 'fb' to min(fragment, 8) int new_size = temp.size() < 8 ? temp.size() : 8; expand(fb, fb, new_size); } } } // convert input fragment to integer_t if (temp.l && (temp.flags & CORRUPTIBLE)) { MOV(AL, 0, temp.reg, reg_imm(temp.reg, LSR, temp.l)); temp.h -= temp.l; temp.l = 0; } integer_t fragment(temp.reg, temp.size(), temp.flags); // if not done yet, convert input fragment to integer_t if (temp.l) { // here we know temp is not CORRUPTIBLE fragment.reg = scratches.obtain(); MOV(AL, 0, fragment.reg, reg_imm(temp.reg, LSR, temp.l)); fragment.flags |= CORRUPTIBLE; } if (!(temp.flags & CORRUPTIBLE)) { // temp is not corruptible, but since it's the destination it // will be modified, so we need to allocate a new register. temp.reg = regs.obtain(); temp.flags &= ~CORRUPTIBLE; fragment.flags &= ~CORRUPTIBLE; } if ((blending & BLEND_SRC) && !same_factor_opt1) { // source (fragment) is needed for the blending stage // so it's not CORRUPTIBLE (unless we're doing same_factor_opt1) fragment.flags &= ~CORRUPTIBLE; } if (same_factor_opt1) { // R = S*f + D*(1-f) = (S-D)*f + D integer_t factor; build_blend_factor(factor, fs, component, pixel, fragment, fb, scratches); // fb is always corruptible from this point fb.flags |= CORRUPTIBLE; build_blendFOneMinusF(temp, factor, fragment, fb); } else if (same_factor_opt2) { // R = S*(1-f) + D*f = (D-S)*f + S integer_t factor; // fb is always corrruptible here fb.flags |= CORRUPTIBLE; build_blend_factor(factor, fd, component, pixel, fragment, fb, scratches); build_blendOneMinusFF(temp, factor, fragment, fb); } else { integer_t src_factor; integer_t dst_factor; // if destination (fb) is not needed for the blending stage, // then it can be marked as CORRUPTIBLE if (!(blending & BLEND_DST)) { fb.flags |= CORRUPTIBLE; } // XXX: try to mark some registers as CORRUPTIBLE // in most case we could make those corruptible // when we're processing the last component // but not always, for instance // when fragment is constant and not reloaded // when fb is needed for logic-ops or masking // when a register is aliased (for instance with mAlphaSource) // blend away... if (fs==GGL_ZERO) { if (fd==GGL_ZERO) { // R = 0 // already taken care of } else if (fd==GGL_ONE) { // R = D // already taken care of } else { // R = D*fd // compute fd build_blend_factor(dst_factor, fd, component, pixel, fragment, fb, scratches); mul_factor(temp, fb, dst_factor); } } else if (fs==GGL_ONE) { if (fd==GGL_ZERO) { // R = S // NOP, taken care of } else if (fd==GGL_ONE) { // R = S + D component_add(temp, fb, fragment); // args order matters component_sat(temp); } else { // R = S + D*fd // compute fd build_blend_factor(dst_factor, fd, component, pixel, fragment, fb, scratches); mul_factor_add(temp, fb, dst_factor, component_t(fragment)); component_sat(temp); } } else { // compute fs build_blend_factor(src_factor, fs, component, pixel, fragment, fb, scratches); if (fd==GGL_ZERO) { // R = S*fs mul_factor(temp, fragment, src_factor); } else if (fd==GGL_ONE) { // R = S*fs + D mul_factor_add(temp, fragment, src_factor, component_t(fb)); component_sat(temp); } else { // R = S*fs + D*fd mul_factor(temp, fragment, src_factor); if (scratches.isUsed(src_factor.reg)) scratches.recycle(src_factor.reg); // compute fd build_blend_factor(dst_factor, fd, component, pixel, fragment, fb, scratches); mul_factor_add(temp, fb, dst_factor, temp); if (!same_factor_opt1 && !same_factor_opt2) { component_sat(temp); } } } } // now we can be corrupted (it's the dest) temp.flags |= CORRUPTIBLE; }
static int imx_ldb_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &imx_ldb_ops); }
static int exynos_dp_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = NULL, *endpoint = NULL; struct exynos_dp_device *dp; int ret; dp = devm_kzalloc(&pdev->dev, sizeof(struct exynos_dp_device), GFP_KERNEL); if (!dp) return -ENOMEM; platform_set_drvdata(pdev, dp); /* This is for the backward compatibility. */ np = of_parse_phandle(dev->of_node, "panel", 0); if (np) { dp->panel = of_drm_find_panel(np); of_node_put(np); if (!dp->panel) return -EPROBE_DEFER; goto out; } endpoint = of_graph_get_next_endpoint(dev->of_node, NULL); if (endpoint) { np = of_graph_get_remote_port_parent(endpoint); if (np) { /* The remote port can be either a panel or a bridge */ dp->panel = of_drm_find_panel(np); if (!dp->panel) { dp->ptn_bridge = of_drm_find_bridge(np); if (!dp->ptn_bridge) { of_node_put(np); return -EPROBE_DEFER; } } of_node_put(np); } else { DRM_ERROR("no remote endpoint device node found.\n"); return -EINVAL; } } else { DRM_ERROR("no port endpoint subnode found.\n"); return -EINVAL; } out: pm_runtime_enable(dev); ret = component_add(&pdev->dev, &exynos_dp_ops); if (ret) goto err_disable_pm_runtime; return ret; err_disable_pm_runtime: pm_runtime_disable(dev); return ret; }
static int dsi_dev_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &dsi_ops); }
static int dw_hdmi_rockchip_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &dw_hdmi_rockchip_ops); }
static int rfbi_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &rfbi_component_ops); }
static int mdp5_dev_probe(struct platform_device *pdev) { DBG(""); return component_add(&pdev->dev, &mdp5_ops); }
static int adreno_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &a3xx_ops); }
static int sun8i_mixer_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &sun8i_mixer_ops); }
static int sun4i_hdmi_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &sun4i_hdmi_ops); }
static int sti_compositor_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct device_node *np = dev->of_node; struct device_node *vtg_np; struct sti_compositor *compo; struct resource *res; compo = devm_kzalloc(dev, sizeof(*compo), GFP_KERNEL); if (!compo) { DRM_ERROR("Failed to allocate compositor context\n"); return -ENOMEM; } compo->dev = dev; compo->vtg_vblank_nb.notifier_call = sti_crtc_vblank_cb; /* populate data structure depending on compatibility */ BUG_ON(!of_match_node(compositor_of_match, np)->data); memcpy(&compo->data, of_match_node(compositor_of_match, np)->data, sizeof(struct sti_compositor_data)); /* Get Memory ressources */ res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (res == NULL) { DRM_ERROR("Get memory resource failed\n"); return -ENXIO; } compo->regs = devm_ioremap(dev, res->start, resource_size(res)); if (compo->regs == NULL) { DRM_ERROR("Register mapping failed\n"); return -ENXIO; } /* Get clock resources */ compo->clk_compo_main = devm_clk_get(dev, "compo_main"); if (IS_ERR(compo->clk_compo_main)) { DRM_ERROR("Cannot get compo_main clock\n"); return PTR_ERR(compo->clk_compo_main); } compo->clk_compo_aux = devm_clk_get(dev, "compo_aux"); if (IS_ERR(compo->clk_compo_aux)) { DRM_ERROR("Cannot get compo_aux clock\n"); return PTR_ERR(compo->clk_compo_aux); } compo->clk_pix_main = devm_clk_get(dev, "pix_main"); if (IS_ERR(compo->clk_pix_main)) { DRM_ERROR("Cannot get pix_main clock\n"); return PTR_ERR(compo->clk_pix_main); } compo->clk_pix_aux = devm_clk_get(dev, "pix_aux"); if (IS_ERR(compo->clk_pix_aux)) { DRM_ERROR("Cannot get pix_aux clock\n"); return PTR_ERR(compo->clk_pix_aux); } /* Get reset resources */ compo->rst_main = devm_reset_control_get(dev, "compo-main"); /* Take compo main out of reset */ if (!IS_ERR(compo->rst_main)) reset_control_deassert(compo->rst_main); compo->rst_aux = devm_reset_control_get(dev, "compo-aux"); /* Take compo aux out of reset */ if (!IS_ERR(compo->rst_aux)) reset_control_deassert(compo->rst_aux); vtg_np = of_parse_phandle(pdev->dev.of_node, "st,vtg", 0); if (vtg_np) compo->vtg_main = of_vtg_find(vtg_np); vtg_np = of_parse_phandle(pdev->dev.of_node, "st,vtg", 1); if (vtg_np) compo->vtg_aux = of_vtg_find(vtg_np); platform_set_drvdata(pdev, compo); return component_add(&pdev->dev, &sti_compositor_ops); }
static int exynos5433_decon_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct decon_context *ctx; struct resource *res; int ret; int i; ctx = devm_kzalloc(dev, sizeof(*ctx), GFP_KERNEL); if (!ctx) return -ENOMEM; ctx->default_win = 0; ctx->suspended = true; ctx->dev = dev; if (of_get_child_by_name(dev->of_node, "i80-if-timings")) ctx->i80_if = true; for (i = 0; i < ARRAY_SIZE(decon_clks_name); i++) { struct clk *clk; clk = devm_clk_get(ctx->dev, decon_clks_name[i]); if (IS_ERR(clk)) return PTR_ERR(clk); ctx->clks[i] = clk; } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!res) { dev_err(dev, "cannot find IO resource\n"); return -ENXIO; } ctx->addr = devm_ioremap_resource(dev, res); if (IS_ERR(ctx->addr)) { dev_err(dev, "ioremap failed\n"); return PTR_ERR(ctx->addr); } res = platform_get_resource_byname(pdev, IORESOURCE_IRQ, ctx->i80_if ? "lcd_sys" : "vsync"); if (!res) { dev_err(dev, "cannot find IRQ resource\n"); return -ENXIO; } ret = devm_request_irq(dev, res->start, ctx->i80_if ? decon_lcd_sys_irq_handler : decon_vsync_irq_handler, 0, "drm_decon", ctx); if (ret < 0) { dev_err(dev, "lcd_sys irq request failed\n"); return ret; } platform_set_drvdata(pdev, ctx); pm_runtime_enable(dev); ret = component_add(dev, &decon_component_ops); if (ret) goto err_disable_pm_runtime; return 0; err_disable_pm_runtime: pm_runtime_disable(dev); return ret; }
static int hdmi_audio_register(struct device *dev) { struct omap_hdmi_audio_pdata pdata = { .dev = dev, .dss_version = omapdss_get_version(), .audio_dma_addr = hdmi_wp_get_audio_dma_addr(&hdmi.wp), .ops = &hdmi_audio_ops, }; hdmi.audio_pdev = platform_device_register_data( dev, "omap-hdmi-audio", PLATFORM_DEVID_AUTO, &pdata, sizeof(pdata)); if (IS_ERR(hdmi.audio_pdev)) return PTR_ERR(hdmi.audio_pdev); hdmi_runtime_get(); hdmi.wp_idlemode = REG_GET(hdmi.wp.base, HDMI_WP_SYSCONFIG, 3, 2); hdmi_runtime_put(); return 0; } /* HDMI HW IP initialisation */ static int hdmi5_bind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); int r; int irq; hdmi.pdev = pdev; dev_set_drvdata(&pdev->dev, &hdmi); mutex_init(&hdmi.lock); spin_lock_init(&hdmi.audio_playing_lock); if (pdev->dev.of_node) { r = hdmi_probe_of(pdev); if (r) return r; } r = hdmi_wp_init(pdev, &hdmi.wp); if (r) return r; r = hdmi_pll_init(pdev, &hdmi.pll, &hdmi.wp); if (r) return r; r = hdmi_phy_init(pdev, &hdmi.phy); if (r) goto err; r = hdmi5_core_init(pdev, &hdmi.core); if (r) goto err; irq = platform_get_irq(pdev, 0); if (irq < 0) { DSSERR("platform_get_irq failed\n"); r = -ENODEV; goto err; } r = devm_request_threaded_irq(&pdev->dev, irq, NULL, hdmi_irq_handler, IRQF_ONESHOT, "OMAP HDMI", &hdmi.wp); if (r) { DSSERR("HDMI IRQ request failed\n"); goto err; } pm_runtime_enable(&pdev->dev); hdmi_init_output(pdev); r = hdmi_audio_register(&pdev->dev); if (r) { DSSERR("Registering HDMI audio failed %d\n", r); hdmi_uninit_output(pdev); pm_runtime_disable(&pdev->dev); return r; } dss_debugfs_create_file("hdmi", hdmi_dump_regs); return 0; err: hdmi_pll_uninit(&hdmi.pll); return r; } static void hdmi5_unbind(struct device *dev, struct device *master, void *data) { struct platform_device *pdev = to_platform_device(dev); if (hdmi.audio_pdev) platform_device_unregister(hdmi.audio_pdev); hdmi_uninit_output(pdev); hdmi_pll_uninit(&hdmi.pll); pm_runtime_disable(&pdev->dev); } static const struct component_ops hdmi5_component_ops = { .bind = hdmi5_bind, .unbind = hdmi5_unbind, }; static int hdmi5_probe(struct platform_device *pdev) { return component_add(&pdev->dev, &hdmi5_component_ops); } static int hdmi5_remove(struct platform_device *pdev) { component_del(&pdev->dev, &hdmi5_component_ops); return 0; }
static int zynqmp_dpsub_probe(struct platform_device *pdev) { struct zynqmp_dpsub *dpsub; int ret; dpsub = devm_kzalloc(&pdev->dev, sizeof(*dpsub), GFP_KERNEL); if (!dpsub) return -ENOMEM; /* Sub-driver will access dpsub from drvdata */ platform_set_drvdata(pdev, dpsub); pm_runtime_enable(&pdev->dev); /* * DP should be probed first so that the zynqmp_disp can set the output * format accordingly. */ ret = zynqmp_dp_probe(pdev); if (ret) goto err_pm; ret = zynqmp_disp_probe(pdev); if (ret) goto err_dp; ret = component_add(&pdev->dev, &zynqmp_dpsub_component_ops); if (ret) goto err_disp; /* Try the reserved memory. Proceed if there's none */ of_reserved_mem_device_init(&pdev->dev); /* Populate the sound child nodes */ ret = of_platform_populate(pdev->dev.of_node, NULL, NULL, &pdev->dev); if (ret) { dev_err(&pdev->dev, "failed to populate child nodes\n"); goto err_rmem; } dpsub->master = xlnx_drm_pipeline_init(pdev); if (IS_ERR(dpsub->master)) { dev_err(&pdev->dev, "failed to initialize the drm pipeline\n"); goto err_populate; } dev_info(&pdev->dev, "ZynqMP DisplayPort Subsystem driver probed"); return 0; err_populate: of_platform_depopulate(&pdev->dev); err_rmem: of_reserved_mem_device_release(&pdev->dev); component_del(&pdev->dev, &zynqmp_dpsub_component_ops); err_disp: zynqmp_disp_remove(pdev); err_dp: zynqmp_dp_remove(pdev); err_pm: pm_runtime_disable(&pdev->dev); return ret; }