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; #ifdef CONFIG_FB_MSM_PANEL_ECO_MODE struct platform_device *fb_pdev; #endif 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; } #ifdef CONFIG_FB_MSM_PANEL_ECO_MODE fb_pdev = msm_fb_add_device(pdev); eco_mode_sysfs_register(&fb_pdev->dev); #else msm_fb_add_device(pdev); #endif #ifdef CONFIG_DEBUG_FS mipi_dsi_debugfs_init(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 __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; }