static int __devinit mipi_r63306_lcd_probe(struct platform_device *pdev) { int ret; struct lcd_panel_platform_data *platform_data; struct mipi_dsi_data *dsi_data; struct platform_device *fb_pdev; platform_data = pdev->dev.platform_data; if (platform_data == NULL) return -EINVAL; dsi_data = kzalloc(sizeof(struct mipi_dsi_data), GFP_KERNEL); if (dsi_data == NULL) return -ENOMEM; dsi_data->panel_data.on = mipi_r63306_lcd_on; dsi_data->panel_data.off = mipi_r63306_lcd_off; dsi_data->default_panels = platform_data->default_panels; dsi_data->panels = platform_data->panels; dsi_data->lcd_power = platform_data->lcd_power; dsi_data->lcd_reset = platform_data->lcd_reset; dsi_data->eco_mode_switch = mipi_dsi_eco_mode_switch; if (mipi_dsi_need_detect_panel(dsi_data->panels)) { dsi_data->panel_data.panel_detect = mipi_dsi_detect_panel; dsi_data->panel_data.update_panel = mipi_dsi_update_panel; dsi_data->panel_detecting = true; } else { dev_info(&pdev->dev, "no need to detect panel\n"); } #ifdef CONFIG_FB_MSM_RECOVER_PANEL dsi_data->is_nvm_ok = mipi_r63303_is_nvm_ok; dsi_data->backup_nvm_to_ram = mipi_r63306_backup_nvm_to_ram; dsi_data->get_nvm_backup = mipi_r63303_get_nvm_backup; dsi_data->override_nvm_data = mipi_r63306_nvm_override_data; dsi_data->nvm_erase_all = mipi_r63306_nvm_erase_all; dsi_data->nvm_write_trim_area = mipi_r63306_nvm_write_trim_area; dsi_data->nvm_write_user_area = mipi_r63306_nvm_write_user_area; dsi_data->panel_nvm_ok = true; dsi_data->panel_nvm_backup_ok = false; #endif ret = mipi_dsi_buf_alloc(&dsi_data->tx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(&pdev->dev, "mipi_dsi_buf_alloc(tx) failed!\n"); goto err_dsibuf_free; } ret = mipi_dsi_buf_alloc(&dsi_data->rx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(&pdev->dev, "mipi_dsi_buf_alloc(rx) failed!\n"); goto err_txbuf_free; } platform_set_drvdata(pdev, dsi_data); mipi_dsi_set_default_panel(dsi_data); ret = platform_device_add_data(pdev, &dsi_data->panel_data, sizeof(dsi_data->panel_data)); if (ret) { dev_err(&pdev->dev, "platform_device_add_data failed!\n"); goto err_rxbuf_free; } fb_pdev = msm_fb_add_device(pdev); #ifdef CONFIG_FB_MSM_PANEL_ECO_MODE eco_mode_sysfs_register(&fb_pdev->dev); #endif #ifdef CONFIG_FB_MSM_RECOVER_PANEL create_sysfs_interfaces(&fb_pdev->dev); #endif #ifdef CONFIG_DEBUG_FS mipi_dsi_panel_create_debugfs(fb_pdev, "mipi_r63306"); #endif return 0; err_rxbuf_free: mipi_dsi_buf_release(&dsi_data->rx_buf); err_txbuf_free: mipi_dsi_buf_release(&dsi_data->tx_buf); err_dsibuf_free: kfree(dsi_data); return ret; }
static int __devinit mipi_nt35565_lcd_probe(struct platform_device *pdev) { int ret; struct lcd_panel_platform_data *platform_data; struct mipi_dsi_data *dsi_data; struct platform_device *fb_pdev; platform_data = pdev->dev.platform_data; if (platform_data == NULL) return -EINVAL; dsi_data = kzalloc(sizeof(struct mipi_dsi_data), GFP_KERNEL); if (dsi_data == NULL) return -ENOMEM; dsi_data->panel_data.on = mipi_nt35565_ic_on_lcd_off; dsi_data->panel_data.controller_on_panel_on = mipi_nt35565_ic_on_lcd_on; dsi_data->panel_data.off = mipi_nt35565_lcd_off; dsi_data->panel_data.power_on_panel_at_pan = 0; dsi_data->default_panels = platform_data->default_panels; dsi_data->panels = platform_data->panels; dsi_data->lcd_power = platform_data->lcd_power; dsi_data->lcd_reset = platform_data->lcd_reset; if (mipi_dsi_need_detect_panel(dsi_data->panels)) { dsi_data->panel_data.panel_detect = mipi_dsi_detect_panel; dsi_data->panel_data.update_panel = mipi_dsi_update_panel; dsi_data->panel_detecting = true; } else { dev_info(&pdev->dev, "no need to detect panel\n"); } ret = mipi_dsi_buf_alloc(&dsi_data->tx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(&pdev->dev, "mipi_dsi_buf_alloc(tx) failed!\n"); goto out_free; } ret = mipi_dsi_buf_alloc(&dsi_data->rx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(&pdev->dev, "mipi_dsi_buf_alloc(rx) failed!\n"); goto out_rx_release; } platform_set_drvdata(pdev, dsi_data); mipi_dsi_set_default_panel(dsi_data); ret = platform_device_add_data(pdev, &dsi_data->panel_data, sizeof(dsi_data->panel_data)); if (ret) { dev_err(&pdev->dev, "platform_device_add_data failed!\n"); goto out_tx_release; } fb_pdev = msm_fb_add_device(pdev); #ifdef CONFIG_FB_MSM_PANEL_ECO_MODE eco_mode_sysfs_register(&fb_pdev->dev); #endif #ifdef CONFIG_DEBUG_FS mipi_dsi_panel_create_debugfs(fb_pdev, "mipi_nt35565"); #endif return 0; out_tx_release: mipi_dsi_buf_release(&dsi_data->rx_buf); out_rx_release: mipi_dsi_buf_release(&dsi_data->tx_buf); out_free: kfree(dsi_data); return ret; }
static int mdss_fb_probe(struct platform_device *pdev) { struct msm_fb_data_type *mfd = NULL; struct mdss_panel_data *pdata; struct mdss_panel_common_pdata *panel_data; struct fb_info *fbi; int rc; if (fbi_list_index >= MAX_FBI_LIST) return -ENOMEM; pdata = dev_get_platdata(&pdev->dev); if (!pdata) return -EPROBE_DEFER; /* * alloc framebuffer info + par data */ fbi = framebuffer_alloc(sizeof(struct msm_fb_data_type), NULL); if (fbi == NULL) { pr_err("can't allocate framebuffer info data!\n"); return -ENOMEM; } mfd = (struct msm_fb_data_type *)fbi->par; mfd->key = MFD_KEY; mfd->fbi = fbi; mfd->panel_info = &pdata->panel_info; mfd->panel.type = pdata->panel_info.type; mfd->panel.id = mfd->index; mfd->fb_page = MDSS_FB_NUM; mfd->index = fbi_list_index; mfd->mdp_fb_page_protection = MDP_FB_PAGE_PROTECTION_WRITECOMBINE; mfd->bl_level = 0; mfd->bl_scale = 1024; mfd->bl_min_lvl = 30; mfd->fb_imgType = MDP_RGBA_8888; mfd->pdev = pdev; if (pdata->next) mfd->split_display = true; mfd->mdp = *mdp_instance; mutex_init(&mfd->lock); mutex_init(&mfd->bl_lock); fbi_list[fbi_list_index++] = fbi; platform_set_drvdata(pdev, mfd); rc = mdss_fb_register(mfd); if (rc) return rc; if (mfd->mdp.init_fnc) { rc = mfd->mdp.init_fnc(mfd); if (rc) { pr_err("init_fnc failed\n"); return rc; } } rc = pm_runtime_set_active(mfd->fbi->dev); if (rc < 0) pr_err("pm_runtime: fail to set active.\n"); pm_runtime_enable(mfd->fbi->dev); /* android supports only one lcd-backlight/lcd for now */ if (!lcd_backlight_registered) { if (led_classdev_register(&pdev->dev, &backlight_led)) pr_err("led_classdev_register failed\n"); else lcd_backlight_registered = 1; } mdss_fb_create_sysfs(mfd); mdss_fb_send_panel_event(mfd, MDSS_EVENT_FB_REGISTERED, fbi); if (mfd->timeline == NULL) { char timeline_name[16]; snprintf(timeline_name, sizeof(timeline_name), "mdss_fb_%d", mfd->index); mfd->timeline = sw_sync_timeline_create(timeline_name); if (mfd->timeline == NULL) { pr_err("%s: cannot create time line", __func__); return -ENOMEM; } else { mfd->timeline_value = 0; } } #ifdef CONFIG_DEBUG_FS if ((mfd->panel_info->type == MIPI_VIDEO_PANEL) || (mfd->panel_info->type == MIPI_CMD_PANEL)) mipi_dsi_panel_create_debugfs(mfd); #endif if (mfd->index == 0) { panel_data = dev_get_platdata(&pdata->panel_pdev->dev); if (panel_data) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); if (!ctrl) { pr_err("%s: Invalid input data\n", __func__); return -EINVAL; } if (panel_data->panel_detect) { mdss_fb_blank_sub(FB_BLANK_UNBLANK, mfd->fbi, mfd->op_enable); if (pdata->detect) pdata->detect(pdata); if (panel_data && panel_data->pcc_setup) panel_data->pcc_setup(mfd); mdss_fb_blank_sub(FB_BLANK_POWERDOWN, mfd->fbi, mfd->op_enable); if (pdata->update_panel) pdata->update_panel(pdata); } else { ctrl->spec_pdata->detected = true; } } }
static int __devinit mipi_s6d6aa0_lcd_probe(struct platform_device *pdev) { int ret = -EINVAL; struct lcd_panel_platform_data *platform_data; struct mipi_dsi_data *dsi_data; struct platform_device *fb_pdev; platform_data = pdev->dev.platform_data; if (platform_data == NULL) return -EINVAL; dsi_data = kzalloc(sizeof(struct mipi_dsi_data), GFP_KERNEL); if (dsi_data == NULL) return -ENOMEM; dsi_data->panel_data.on = mipi_s6d6aa0_lcd_on; dsi_data->panel_data.off = mipi_s6d6aa0_lcd_off; dsi_data->default_panels = platform_data->default_panels; dsi_data->panels = platform_data->panels; dsi_data->lcd_power = platform_data->lcd_power; dsi_data->lcd_reset = platform_data->lcd_reset; dsi_data->eco_mode_switch = mipi_dsi_eco_mode_switch; if (mipi_dsi_need_detect_panel(dsi_data->panels)) { dsi_data->panel_data.panel_detect = mipi_dsi_detect_panel; dsi_data->panel_data.update_panel = mipi_dsi_update_panel; dsi_data->panel_detecting = true; } else { dev_info(&pdev->dev, "no need to detect panel\n"); } ret = mipi_dsi_buf_alloc(&dsi_data->tx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(&pdev->dev, "mipi_dsi_buf_alloc(tx) failed!\n"); goto out_free; } ret = mipi_dsi_buf_alloc(&dsi_data->rx_buf, DSI_BUF_SIZE); if (ret <= 0) { dev_err(&pdev->dev, "mipi_dsi_buf_alloc(rx) failed!\n"); goto out_rx_release; } platform_set_drvdata(pdev, dsi_data); mipi_dsi_set_default_panel(dsi_data); if (dsi_data->panel->esd_failed_check) { dsi_data->esd_wq = create_singlethread_workqueue("panel_esd_check"); if (dsi_data->esd_wq == NULL) { dev_err(&pdev->dev, "can't create ESD workqueue\n"); goto out_tx_release; } INIT_DELAYED_WORK(&dsi_data->esd_work, panel_esd_check_work); dsi_data->esd_check = mipi_dsi_panel_esd_failed_check; } mutex_init(&esd_lock); ret = platform_device_add_data(pdev, &dsi_data->panel_data, sizeof(dsi_data->panel_data)); if (ret) { dev_err(&pdev->dev, "platform_device_add_data failed!\n"); goto out_wq_release; } fb_pdev = msm_fb_add_device(pdev); #ifdef CONFIG_FB_MSM_PANEL_ECO_MODE eco_mode_sysfs_register(&fb_pdev->dev); #endif #ifdef CONFIG_DEBUG_FS mipi_dsi_panel_create_debugfs(fb_pdev, "mipi_s6d6aa0"); #endif return 0; out_wq_release: if (dsi_data->panel->esd_failed_check) destroy_workqueue(dsi_data->esd_wq); out_tx_release: mipi_dsi_buf_release(&dsi_data->rx_buf); out_rx_release: mipi_dsi_buf_release(&dsi_data->tx_buf); out_free: kfree(dsi_data); return ret; }