static int lm3630_probe(struct i2c_client *i2c_dev, const struct i2c_device_id *id) { struct backlight_platform_data *pdata; struct lm3630_device *dev; struct backlight_device *bl_dev; struct backlight_properties props; int err; pr_info("[LCD][DEBUG] %s: i2c probe start\n", __func__); #ifdef CONFIG_OF if (&i2c_dev->dev.of_node) { pdata = devm_kzalloc(&i2c_dev->dev, sizeof(struct backlight_platform_data), GFP_KERNEL); if (!pdata) { pr_err("%s: Failed to allocate memory\n", __func__); return -ENOMEM; } err = lm3630_parse_dt(&i2c_dev->dev, pdata); if (err != 0) return err; } else { pdata = i2c_dev->dev.platform_data; } #else pdata = i2c_dev->dev.platform_data; #endif pr_debug("[LCD][DEBUG] %s: gpio = %d\n", __func__,pdata->gpio); if (pdata->gpio && gpio_request(pdata->gpio, "lm3630 reset") != 0) { return -ENODEV; } lm3630_i2c_client = i2c_dev; dev = kzalloc(sizeof(struct lm3630_device), GFP_KERNEL); if (dev == NULL) { dev_err(&i2c_dev->dev, "fail alloc for lm3630_device\n"); return 0; } main_lm3630_dev = dev; memset(&props, 0, sizeof(struct backlight_properties)); props.type = BACKLIGHT_RAW; props.max_brightness = MAX_BRIGHTNESS_LM3630; bl_dev = backlight_device_register(I2C_BL_NAME, &i2c_dev->dev, NULL, &lm3630_bl_ops, &props); bl_dev->props.max_brightness = MAX_BRIGHTNESS_LM3630; bl_dev->props.brightness = DEFAULT_BRIGHTNESS; bl_dev->props.power = FB_BLANK_UNBLANK; dev->bl_dev = bl_dev; dev->client = i2c_dev; dev->gpio = pdata->gpio; dev->max_current = pdata->max_current; dev->min_brightness = pdata->min_brightness; dev->default_brightness = pdata->default_brightness; dev->max_brightness = pdata->max_brightness; dev->blmap_size = pdata->blmap_size; if (dev->blmap_size) { dev->blmap = kzalloc(sizeof(char) * dev->blmap_size, GFP_KERNEL); if (!dev->blmap) { pr_err("%s: Failed to allocate memory\n", __func__); return -ENOMEM; } memcpy(dev->blmap, pdata->blmap, dev->blmap_size); } else { dev->blmap = NULL; } if (gpio_get_value(dev->gpio)) backlight_status = BL_ON; else backlight_status = BL_OFF; i2c_set_clientdata(i2c_dev, dev); mutex_init(&dev->bl_mutex); err = device_create_file(&i2c_dev->dev, &dev_attr_lm3630_level); err = device_create_file(&i2c_dev->dev, &dev_attr_lm3630_backlight_on_off); err = device_create_file(&i2c_dev->dev, &dev_attr_lm3630_exp_min_value); #if defined(CONFIG_BACKLIGHT_CABC_DEBUG_ENABLE) err = device_create_file(&i2c_dev->dev, &dev_attr_lm3630_pwm); #endif #if defined(CONFIG_MACH_LGE) && !defined(CONFIG_MACH_MSM8974_VU3_KR) && !defined(CONFIG_MACH_MSM8974_Z_KR) && !defined(CONFIG_MACH_MSM8974_Z_US) && !defined(CONFIG_OLED_SUPPORT) if (!lge_get_cont_splash_enabled()) lm3630_lcd_backlight_set_level(0); #endif return 0; }
int dsi_panel_device_register(struct platform_device *pdev, struct mdss_panel_common_pdata *panel_data) { struct mipi_panel_info *mipi; int rc; u8 lanes = 0, bpp; u32 h_period, v_period, dsi_pclk_rate; struct mdss_dsi_ctrl_pdata *ctrl_pdata; struct device_node *dsi_ctrl_np = NULL; struct platform_device *ctrl_pdev = NULL; bool broadcast; bool cont_splash_enabled = false; h_period = ((panel_data->panel_info.lcdc.h_pulse_width) + (panel_data->panel_info.lcdc.h_back_porch) + (panel_data->panel_info.xres) + (panel_data->panel_info.lcdc.h_front_porch)); #ifdef CONFIG_OLED_SUPPORT v_period = ((panel_data->panel_info.lcdc.v_pulse_width) + (panel_data->panel_info.lcdc.v_back_porch) + (panel_data->panel_info.yres) + (panel_data->panel_info.lcdc.yres_margin) + (panel_data->panel_info.lcdc.v_front_porch)); #else v_period = ((panel_data->panel_info.lcdc.v_pulse_width) + (panel_data->panel_info.lcdc.v_back_porch) + (panel_data->panel_info.yres) + (panel_data->panel_info.lcdc.v_front_porch)); #endif mipi = &panel_data->panel_info.mipi; panel_data->panel_info.type = ((mipi->mode == DSI_VIDEO_MODE) ? MIPI_VIDEO_PANEL : MIPI_CMD_PANEL); if (mipi->data_lane3) lanes += 1; if (mipi->data_lane2) lanes += 1; if (mipi->data_lane1) lanes += 1; if (mipi->data_lane0) lanes += 1; if ((mipi->dst_format == DSI_CMD_DST_FORMAT_RGB888) || (mipi->dst_format == DSI_VIDEO_DST_FORMAT_RGB888) || (mipi->dst_format == DSI_VIDEO_DST_FORMAT_RGB666_LOOSE)) bpp = 3; else if ((mipi->dst_format == DSI_CMD_DST_FORMAT_RGB565) || (mipi->dst_format == DSI_VIDEO_DST_FORMAT_RGB565)) bpp = 2; else bpp = 3; /* Default format set to RGB888 */ if (!panel_data->panel_info.clk_rate) { h_period += panel_data->panel_info.lcdc.xres_pad; v_period += panel_data->panel_info.lcdc.yres_pad; if (lanes > 0) { panel_data->panel_info.clk_rate = ((h_period * v_period * (mipi->frame_rate) * bpp * 8) / lanes); } else { pr_err("%s: forcing mdss_dsi lanes to 1\n", __func__); panel_data->panel_info.clk_rate = (h_period * v_period * (mipi->frame_rate) * bpp * 8); } #ifdef CONFIG_MACH_LGE rc = of_property_read_u32(pdev->dev.of_node, "lge,mdss-dsi-bit-rate", &mdss_dsi_bit_rate); if (rc == 0) panel_data->panel_info.clk_rate = mdss_dsi_bit_rate; pr_info("%s: DSI data rate:%u\n", __func__, panel_data->panel_info.clk_rate); #endif } pll_divider_config.clk_rate = panel_data->panel_info.clk_rate; rc = mdss_dsi_clk_div_config(bpp, lanes, &dsi_pclk_rate); if (rc) { pr_err("%s: unable to initialize the clk dividers\n", __func__); return rc; } if ((dsi_pclk_rate < 3300000) || (dsi_pclk_rate > 250000000)) dsi_pclk_rate = 35000000; mipi->dsi_pclk_rate = dsi_pclk_rate; dsi_ctrl_np = of_parse_phandle(pdev->dev.of_node, "qcom,dsi-ctrl-phandle", 0); if (!dsi_ctrl_np) { pr_err("%s: Dsi controller node not initialized\n", __func__); return -EPROBE_DEFER; } ctrl_pdev = of_find_device_by_node(dsi_ctrl_np); #ifdef CONFIG_MACH_LGE if (!ctrl_pdev) return -ENODEV; #endif ctrl_pdata = platform_get_drvdata(ctrl_pdev); if (!ctrl_pdata) { pr_err("%s: no dsi ctrl driver data\n", __func__); return -EINVAL; } rc = mdss_dsi_regulator_init(ctrl_pdev); if (rc) { dev_err(&pdev->dev, "%s: failed to init regulator, rc=%d\n", __func__, rc); return rc; } broadcast = of_property_read_bool(pdev->dev.of_node, "qcom,mdss-pan-broadcast-mode"); if (broadcast) ctrl_pdata->shared_pdata.broadcast_enable = 1; ctrl_pdata->disp_en_gpio = of_get_named_gpio(pdev->dev.of_node, "qcom,enable-gpio", 0); if (!gpio_is_valid(ctrl_pdata->disp_en_gpio)) { pr_err("%s:%d, Disp_en gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->disp_en_gpio, "disp_enable"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } ctrl_pdata->disp_te_gpio = of_get_named_gpio(pdev->dev.of_node, "qcom,te-gpio", 0); if (!gpio_is_valid(ctrl_pdata->disp_te_gpio)) { pr_err("%s:%d, Disp_te gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->disp_te_gpio, "disp_te"); if (rc) { pr_err("request TE gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } rc = gpio_tlmm_config(GPIO_CFG( ctrl_pdata->disp_te_gpio, 1, GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE); if (rc) { pr_err("%s: unable to config tlmm = %d\n", __func__, ctrl_pdata->disp_te_gpio); gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } rc = gpio_direction_input(ctrl_pdata->disp_te_gpio); if (rc) { pr_err("set_direction for disp_en gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->disp_te_gpio); return -ENODEV; } pr_debug("%s: te_gpio=%d\n", __func__, ctrl_pdata->disp_te_gpio); } ctrl_pdata->rst_gpio = of_get_named_gpio(pdev->dev.of_node, "qcom,rst-gpio", 0); if (!gpio_is_valid(ctrl_pdata->rst_gpio)) { pr_err("%s:%d, reset gpio not specified\n", __func__, __LINE__); } else { rc = gpio_request(ctrl_pdata->rst_gpio, "disp_rst_n"); if (rc) { pr_err("request reset gpio failed, rc=%d\n", rc); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); return -ENODEV; } } if (mdss_dsi_clk_init(ctrl_pdev, ctrl_pdata)) { pr_err("%s: unable to initialize Dsi ctrl clks\n", __func__); return -EPERM; } if (mdss_dsi_retrieve_ctrl_resources(ctrl_pdev, panel_data->panel_info.pdest, ctrl_pdata)) { pr_err("%s: unable to get Dsi controller res\n", __func__); return -EPERM; } ctrl_pdata->panel_data.event_handler = mdss_dsi_event_handler; ctrl_pdata->on_cmds = panel_data->on_cmds; ctrl_pdata->off_cmds = panel_data->off_cmds; memcpy(&((ctrl_pdata->panel_data).panel_info), &(panel_data->panel_info), sizeof(struct mdss_panel_info)); #ifdef CONFIG_MACH_LGE ctrl_pdata->on = panel_data->on; ctrl_pdata->off = panel_data->off; #endif ctrl_pdata->panel_data.set_backlight = panel_data->bl_fnc; ctrl_pdata->bklt_ctrl = panel_data->panel_info.bklt_ctrl; ctrl_pdata->pwm_pmic_gpio = panel_data->panel_info.pwm_pmic_gpio; ctrl_pdata->pwm_period = panel_data->panel_info.pwm_period; ctrl_pdata->pwm_lpg_chan = panel_data->panel_info.pwm_lpg_chan; ctrl_pdata->bklt_max = panel_data->panel_info.bl_max; #ifdef CONFIG_OLED_SUPPORT ctrl_pdata->panel_data.panel_info.blmap_size = panel_data->panel_info.blmap_size; ctrl_pdata->panel_data.panel_info.blmap = panel_data->panel_info.blmap; #endif if (ctrl_pdata->bklt_ctrl == BL_PWM) mdss_dsi_panel_pwm_cfg(ctrl_pdata); mdss_dsi_ctrl_init(ctrl_pdata); /* * register in mdp driver */ ctrl_pdata->pclk_rate = dsi_pclk_rate; ctrl_pdata->byte_clk_rate = panel_data->panel_info.clk_rate / 8; pr_debug("%s: pclk=%d, bclk=%d\n", __func__, ctrl_pdata->pclk_rate, ctrl_pdata->byte_clk_rate); ctrl_pdata->ctrl_state = CTRL_STATE_UNKNOWN; #ifdef CONFIG_MACH_LGE cont_splash_enabled = lge_get_cont_splash_enabled(); #else cont_splash_enabled = of_property_read_bool(pdev->dev.of_node, "qcom,cont-splash-enabled"); #endif if (!cont_splash_enabled) { pr_info("%s:%d Continuous splash flag not found.\n", __func__, __LINE__); ctrl_pdata->panel_data.panel_info.cont_splash_enabled = 0; ctrl_pdata->panel_data.panel_info.panel_power_on = 0; } else { pr_info("%s:%d Continuous splash flag enabled.\n", __func__, __LINE__); ctrl_pdata->panel_data.panel_info.cont_splash_enabled = 1; ctrl_pdata->panel_data.panel_info.panel_power_on = 1; rc = mdss_dsi_panel_power_on(&(ctrl_pdata->panel_data), 1); if (rc) { pr_err("%s: Panel power on failed\n", __func__); return rc; } mdss_dsi_clk_ctrl(ctrl_pdata, 1); ctrl_pdata->ctrl_state |= (CTRL_STATE_PANEL_INIT | CTRL_STATE_MDP_ACTIVE); } rc = mdss_register_panel(ctrl_pdev, &(ctrl_pdata->panel_data)); if (rc) { dev_err(&pdev->dev, "unable to register MIPI DSI panel\n"); if (ctrl_pdata->rst_gpio) gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->disp_en_gpio)) gpio_free(ctrl_pdata->disp_en_gpio); return rc; } #ifndef CONFIG_MACH_LGE ctrl_pdata->on = panel_data->on; ctrl_pdata->off = panel_data->off; #endif if (panel_data->panel_info.pdest == DISPLAY_1) { mdss_debug_register_base("dsi0", ctrl_pdata->ctrl_base, ctrl_pdata->reg_size); ctrl_pdata->ndx = 0; } else { mdss_debug_register_base("dsi1", ctrl_pdata->ctrl_base, ctrl_pdata->reg_size); ctrl_pdata->ndx = 1; } pr_debug("%s: Panal data initialized\n", __func__); return 0; }