static int msm_fb_detect_panel(const char *name) { int ret = -ENODEV; if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { if (!strncmp(name, "lcdc_toshiba_fwvga_pt", 21) || !strncmp(name, "mipi_cmd_renesas_fwvga", 22)) ret = 0; } else if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() || machine_is_msm8625_ffa()) { if (!strncmp(name, "mipi_cmd_renesas_fwvga", 22)) ret = 0; } else if (machine_is_msm7627a_qrd1()) { if (!strncmp(name, "mipi_video_truly_wvga", 21)) ret = 0; } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { if (!strncmp(name, "lcdc_truly_hvga_ips3p2335_pt", 28)) ret = 0; } else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_evt()) { if (!strncmp(name, "mipi_cmd_nt35510_wvga", 21)) ret = 0; } #if !defined(CONFIG_FB_MSM_LCDC_AUTO_DETECT) && \ !defined(CONFIG_FB_MSM_MIPI_PANEL_AUTO_DETECT) && \ !defined(CONFIG_FB_MSM_LCDC_MIPI_PANEL_AUTO_DETECT) if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { if (!strncmp(name, LCDC_TOSHIBA_FWVGA_PANEL_NAME, strnlen(LCDC_TOSHIBA_FWVGA_PANEL_NAME, PANEL_NAME_MAX_LEN))) return 0; } #endif return ret; }
void __init msm_fb_add_devices(void) { /* Using continuous splash or not */ if (machine_is_msm8625_qrd7() || machine_is_msm8625_evb() || machine_is_msm8625_qrd5()) { if (cont_splash_enabled) { /* increase ref count of ext power */ qrd_lcd_splash_power_vote(1); mdp_pdata.cont_splash_enabled = 1; /* FIXME: Need these flags to indicate backlight driver the initial backlight level */ mipi_NT35510_pdata.cont_splash_enabled = 1; mipi_NT35510_alaska_pdata.cont_splash_enabled = 1; mipi_himax_pdata.cont_splash_enabled = 1; } } /* default is NT35510 */ if (machine_is_msm8625_skua() && skua_panel_is_himax()) { skua_fb_devices[1] = &mipi_dsi_himax_panel_device; skua_backlight_device.dev.platform_data = &mipi_himax_pdata; } msm7x27a_set_display_params(prim_panel_name); if (machine_is_msm8225_cellon()) platform_add_devices(c8680_fb_devices, ARRAY_SIZE(c8680_fb_devices)); else if (machine_is_msm7627a_qrd1()) platform_add_devices(qrd_fb_devices, ARRAY_SIZE(qrd_fb_devices)); else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_qrd5() || machine_is_msm7x27a_qrd5a() || machine_is_msm8625_evt()) { platform_add_devices(evb_fb_devices, ARRAY_SIZE(evb_fb_devices)); } else if (machine_is_msm8625_skua()) platform_add_devices(skua_fb_devices, ARRAY_SIZE(skua_fb_devices)); else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { platform_add_devices(qrd3_fb_devices, ARRAY_SIZE(qrd3_fb_devices)); } else platform_add_devices(msm_fb_devices, ARRAY_SIZE(msm_fb_devices)); msm_fb_register_device("mdp", &mdp_pdata); if (machine_is_msm7625a_surf() || machine_is_msm7x27a_surf() || machine_is_msm8625_surf() || machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) msm_fb_register_device("lcdc", &lcdc_pdata); #ifdef CONFIG_FB_MSM_MIPI_DSI msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); #endif }
static void __init register_i2c_devices(void) { if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) sx150x_data[SX150X_CORE].io_open_drain_ena = 0xe0f0; core_exp_i2c_info[0].platform_data = &sx150x_data[SX150X_CORE]; i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, core_exp_i2c_info, ARRAY_SIZE(core_exp_i2c_info)); }
static int msm_fb_get_lane_config(void) { /* For MSM7627A SURF/FFA and QRD */ int rc = DSI_TWO_LANES; if (machine_is_msm8225_cellon()) { pr_info("DSI_TWO_LANES\n"); } else if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { rc = DSI_SINGLE_LANE; pr_info("DSI_SINGLE_LANES\n"); } else { pr_info("DSI_TWO_LANES\n"); } return rc; }
static void __init register_i2c_devices(void) { /* LGE_CHANGE : [email protected] - add LGE specific machine name */ if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf() || machine_is_msm7x27a_u0() ) sx150x_data[SX150X_CORE].io_open_drain_ena = 0xe0f0; core_exp_i2c_info[0].platform_data = &sx150x_data[SX150X_CORE]; i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, core_exp_i2c_info, ARRAY_SIZE(core_exp_i2c_info)); }
static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM_PMEM_ADSP_SIZE; } #ifdef CONFIG_ION_MSM msm_ion_camera_size = pmem_adsp_size; msm_ion_audio_size = (MSM_PMEM_AUDIO_SIZE + PMEM_KERNEL_EBI1_SIZE); msm_ion_sf_size = pmem_mdp_size; #endif }
static void __init msm_msm7x2x_allocate_memory_regions(void) { void *addr; unsigned long size; if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) fb_size = MSM7x25A_MSM_FB_SIZE; else fb_size = MSM_FB_SIZE; size = fb_size; addr = alloc_bootmem_align(size, 0x1000); msm_fb_resources[0].start = __pa(addr); msm_fb_resources[0].end = msm_fb_resources[0].start + size - 1; pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", size, addr, __pa(addr)); }
static void __init size_pmem_devices(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM_PMEM_ADSP_SIZE; } #ifdef CONFIG_ANDROID_PMEM android_pmem_adsp_pdata.size = pmem_adsp_size; android_pmem_pdata.size = pmem_mdp_size; android_pmem_audio_pdata.size = pmem_audio_size; #endif }
void __init msm7627a_add_io_devices(void) { /* touchscreen */ #ifndef CONFIG_HUAWEI_KERNEL if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { atmel_ts_pdata.min_x = 0; atmel_ts_pdata.max_x = 480; atmel_ts_pdata.min_y = 0; atmel_ts_pdata.max_y = 320; } i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, atmel_ts_i2c_info, ARRAY_SIZE(atmel_ts_i2c_info)); #else i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, huawei_i2c_board_info, ARRAY_SIZE(huawei_i2c_board_info)); #endif #ifndef CONFIG_HUAWEI_GPIO_KEYPAD /* keypad */ platform_device_register(&kp_pdev); #else platform_device_register(&keypad_device_default); #endif /* headset */ platform_device_register(&hs_pdev); /* LED: configure it as a pdm function */ if (gpio_tlmm_config(GPIO_CFG(LED_GPIO_PDM, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), GPIO_CFG_ENABLE)) pr_err("%s: gpio_tlmm_config for %d failed\n", __func__, LED_GPIO_PDM); else platform_device_register(&led_pdev); /* Vibrator */ #ifndef CONFIG_HUAWEI_KERNEL if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() || machine_is_msm8625_ffa()) #endif msm_init_pmic_vibrator(); }
static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { reserve_mdp_size = MSM7x25A_MSM_RESERVE_MDP_SIZE; reserve_adsp_size = MSM7x25A_MSM_RESERVE_ADSP_SIZE; } else { reserve_mdp_size = MSM_RESERVE_MDP_SIZE; reserve_adsp_size = MSM_RESERVE_ADSP_SIZE; } if (get_ddr_size() > SZ_512M) reserve_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_camera_size = reserve_adsp_size; msm_ion_audio_size = (MSM_RESERVE_AUDIO_SIZE + RESERVE_KERNEL_EBI1_SIZE); msm_ion_sf_size = reserve_mdp_size; #endif }
static int config_i2s(int mode) { int pin, rc = 0; if (mode == FM_I2S_ON) { if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) config_pcm_i2s_mode(0); pr_err("%s mode = FM_I2S_ON", __func__); rc = switch_pcm_i2s_reg_mode(0); if (rc) { pr_err("switch mode failed"); return rc; } for (pin = 0; pin < ARRAY_SIZE(fm_i2s_config_power_on); pin++) { rc = gpio_tlmm_config( fm_i2s_config_power_on[pin], GPIO_CFG_ENABLE ); if (rc < 0) return rc; } } else if (mode == FM_I2S_OFF) { pr_err("%s mode = FM_I2S_OFF", __func__); rc = switch_pcm_i2s_reg_mode(1); if (rc) { pr_err("switch mode failed"); return rc; } for (pin = 0; pin < ARRAY_SIZE(fm_i2s_config_power_off); pin++) { rc = gpio_tlmm_config( fm_i2s_config_power_off[pin], GPIO_CFG_ENABLE ); if (rc < 0) return rc; } } return rc; }
static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = get_pmem_adsp_size(); printk("pmem_adsp_size=%08x\n",pmem_adsp_size); } if (get_ddr_size() > SZ_512M) pmem_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_camera_size = pmem_adsp_size; msm_ion_audio_size = (MSM_PMEM_AUDIO_SIZE + PMEM_KERNEL_EBI1_SIZE); msm_ion_sf_size = pmem_mdp_size; #endif }
static void __init size_pmem_devices(void) { #ifdef CONFIG_ANDROID_PMEM unsigned int i; unsigned int reusable_count = 0; if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM_PMEM_ADSP_SIZE; } android_pmem_adsp_pdata.size = pmem_adsp_size; android_pmem_pdata.size = pmem_mdp_size; android_pmem_audio_pdata.size = pmem_audio_size; fmem_pdata.size = 0; fmem_pdata.align = PAGE_SIZE; /* Find pmem devices that should use FMEM (reusable) memory. */ for (i = 0; i < ARRAY_SIZE(pmem_pdata_array); ++i) { struct android_pmem_platform_data *pdata = pmem_pdata_array[i]; if (!reusable_count && pdata->reusable) fmem_pdata.size += pdata->size; reusable_count += (pdata->reusable) ? 1 : 0; if (pdata->reusable && reusable_count > 1) { pr_err("%s: Too many PMEM devices specified as reusable. PMEM device %s was not configured as reusable.\n", __func__, pdata->name); pdata->reusable = 0; } } #endif }
static void fix_sizes(void) { if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { pmem_mdp_size = MSM7x25A_MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM7x25A_MSM_PMEM_ADSP_SIZE; } else { pmem_mdp_size = MSM_PMEM_MDP_SIZE; pmem_adsp_size = MSM_PMEM_ADSP_SIZE; } if (get_ddr_size() > SZ_512M) pmem_adsp_size = CAMERA_ZSL_SIZE; #ifdef CONFIG_ION_MSM msm_ion_camera_size = pmem_adsp_size; msm_ion_audio_size = MSM_PMEM_AUDIO_SIZE; msm_ion_sf_size = pmem_mdp_size; #ifdef CONFIG_CMA msm_ion_camera_size_carving = 0; #else msm_ion_camera_size_carving = msm_ion_camera_size; #endif #endif }
void __init msm_msm7627a_allocate_memory_regions(void) { /*Add 4 framebuffer and delete the mem adapter strategy*/ void *addr; unsigned long fb_size; #ifndef CONFIG_HUAWEI_KERNEL if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) fb_size = MSM7x25A_MSM_FB_SIZE; else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_evt() || machine_is_qrd_skud_prime()) fb_size = MSM8x25_MSM_FB_SIZE; else if (machine_is_msm8625q_evbd() || machine_is_msm8625q_skud()) fb_size = MSM8x25Q_MSM_FB_SIZE; else fb_size = MSM_FB_SIZE; #else fb_size = get_framebuffer_size(); #endif addr = alloc_bootmem_align(fb_size, 0x1000); msm_fb_resources[0].start = __pa(addr); msm_fb_resources[0].end = msm_fb_resources[0].start + fb_size - 1; pr_info("allocating %lu bytes at %p (%lx physical) for fb\n", fb_size, addr, __pa(addr)); #ifdef CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE fb_size = MSM_V4L2_VIDEO_OVERLAY_BUF_SIZE; addr = alloc_bootmem_align(fb_size, 0x1000); msm_v4l2_video_overlay_resources[0].start = __pa(addr); msm_v4l2_video_overlay_resources[0].end = msm_v4l2_video_overlay_resources[0].start + fb_size - 1; pr_debug("allocating %lu bytes at %p (%lx physical) for v4l2\n", fb_size, addr, __pa(addr)); #endif }
static void __init msm7x2x_init(void) { msm7x2x_misc_init(); /* Initialize regulators first so that other devices can use them */ msm7x27a_init_regulators(); /* Common functions for SURF/FFA/RUMI3 */ msm_device_i2c_init(); msm7x27a_init_ebi2(); msm7x27a_cfg_uart2dm_serial(); #ifdef CONFIG_SERIAL_MSM_HS msm_uart_dm1_pdata.wakeup_irq = gpio_to_irq(UART1DM_RX_GPIO); msm_device_uart_dm1.dev.platform_data = &msm_uart_dm1_pdata; #endif #ifdef CONFIG_USB_MSM_OTG_72K msm_otg_pdata.swfi_latency = msm7x27a_pm_data [MSM_PM_SLEEP_MODE_RAMP_DOWN_AND_WAIT_FOR_INTERRUPT].latency; msm_device_otg.dev.platform_data = &msm_otg_pdata; #endif msm_device_gadget_peripheral.dev.platform_data = &msm_gadget_pdata; msm7x27a_cfg_smsc911x(); platform_add_devices(msm_footswitch_devices, msm_num_footswitch_devices); platform_add_devices(surf_ffa_devices, ARRAY_SIZE(surf_ffa_devices)); /* Ensure ar6000pm device is registered before MMC/SDC */ msm7x27a_init_ar6000pm(); #ifdef CONFIG_MMC_MSM msm7627a_init_mmc(); #endif msm_fb_add_devices(); #ifdef CONFIG_USB_EHCI_MSM_72K msm7x2x_init_host(); #endif msm_pm_set_platform_data(msm7x27a_pm_data, ARRAY_SIZE(msm7x27a_pm_data)); BUG_ON(msm_pm_boot_init(&msm_pm_boot_pdata)); #if defined(CONFIG_I2C) && defined(CONFIG_GPIO_SX150X) register_i2c_devices(); #endif #if defined(CONFIG_BT) && defined(CONFIG_MARIMBA_CORE) msm7627a_bt_power_init(); #endif if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { atmel_ts_pdata.min_x = 0; atmel_ts_pdata.max_x = 480; atmel_ts_pdata.min_y = 0; atmel_ts_pdata.max_y = 320; } i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, atmel_ts_i2c_info, ARRAY_SIZE(atmel_ts_i2c_info)); #if defined(CONFIG_MSM_CAMERA) msm7627a_camera_init(); #endif platform_device_register(&kp_pdev); platform_device_register(&hs_pdev); /* configure it as a pdm function*/ if (gpio_tlmm_config(GPIO_CFG(LED_GPIO_PDM, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), GPIO_CFG_ENABLE)) pr_err("%s: gpio_tlmm_config for %d failed\n", __func__, LED_GPIO_PDM); else platform_device_register(&led_pdev); #ifdef CONFIG_MSM_RPC_VIBRATOR if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa()) msm_init_pmic_vibrator(); #endif /*7x25a kgsl initializations*/ msm7x25a_kgsl_3d0_init(); }
static int mipi_dsi_panel_power(int on) { int rc = 0; uint32_t lcdc_reset_cfg; /* I2C-controlled GPIO Expander -init of the GPIOs very late */ if (unlikely(!dsi_gpio_initialized)) { pmapp_disp_backlight_init(); rc = gpio_request(GPIO_DISPLAY_PWR_EN, "gpio_disp_pwr"); if (rc < 0) { pr_err("failed to request gpio_disp_pwr\n"); return rc; } if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf()) { rc = gpio_direction_output(GPIO_DISPLAY_PWR_EN, 1); if (rc < 0) { pr_err("failed to enable display pwr\n"); goto fail_gpio1; } rc = gpio_request(GPIO_BACKLIGHT_EN, "gpio_bkl_en"); if (rc < 0) { pr_err("failed to request gpio_bkl_en\n"); goto fail_gpio1; } rc = gpio_direction_output(GPIO_BACKLIGHT_EN, 1); if (rc < 0) { pr_err("failed to enable backlight\n"); goto fail_gpio2; } } rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) { pr_err("%s: could not get regulators: %d\n", __func__, rc); goto fail_gpio2; } rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) { pr_err("%s: could not set voltages: %d\n", __func__, rc); goto fail_vreg; } if (pmapp_disp_backlight_set_brightness(100)) pr_err("backlight set brightness failed\n"); dsi_gpio_initialized = 1; } if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf()) { gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, on); gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, on); } else if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa()) { if (on) { /* This line drives an active low pin on FFA */ rc = gpio_direction_output(GPIO_DISPLAY_PWR_EN, !on); if (rc < 0) pr_err("failed to set direction for " "display pwr\n"); } else { gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, !on); rc = gpio_direction_input(GPIO_DISPLAY_PWR_EN); if (rc < 0) pr_err("failed to set direction for " "display pwr\n"); } } if (on) { gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 0); if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf()) { lcdc_reset_cfg = readl_relaxed(lcdc_reset_ptr); rmb(); lcdc_reset_cfg &= ~1; writel_relaxed(lcdc_reset_cfg, lcdc_reset_ptr); msleep(20); wmb(); lcdc_reset_cfg |= 1; writel_relaxed(lcdc_reset_cfg, lcdc_reset_ptr); } else { gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 0); msleep(20); gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1); } } else { gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 1); } rc = on ? regulator_bulk_enable(ARRAY_SIZE(regs_dsi), regs_dsi) : regulator_bulk_disable(ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) pr_err("%s: could not %sable regulators: %d\n", __func__, on ? "en" : "dis", rc); return rc; fail_vreg: regulator_bulk_free(ARRAY_SIZE(regs_dsi), regs_dsi); fail_gpio2: gpio_free(GPIO_BACKLIGHT_EN); fail_gpio1: gpio_free(GPIO_DISPLAY_PWR_EN); dsi_gpio_initialized = 0; return rc; }
static int mipi_dsi_panel_msm_power(int on) { /*++ Huize - 20120927 Modify for identifying what the code is used by customization ++*/ #ifdef DISPLAY_CUSTOMIZATION int rc = 0; if (unlikely(!dsi_gpio_initialized)) { pr_emerg("%s\n", __func__); #ifndef CONFIG_LEDS_CHIP_LM3533 rc = gpio_request(GPIO_BACKLIGHT_EN, "gpio_bl_en"); if (rc < 0) { pr_err("failed to request gpio_bl_en\n"); return rc; } rc = gpio_tlmm_config( GPIO_CFG(GPIO_BACKLIGHT_EN,0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); #endif if (rc) { pr_err("Failed to enable gpio_bl_en\n"); goto fail_gpio1; } rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) { pr_err("%s: could not get regulators: %d\n", __func__, rc); goto fail_gpio2; } rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) { pr_err("%s: could not set voltages: %d\n", __func__, rc); goto fail_vreg; } dsi_gpio_initialized = 1; } #else int rc = 0; uint32_t lcdc_reset_cfg; /* I2C-controlled GPIO Expander -init of the GPIOs very late */ if (unlikely(!dsi_gpio_initialized)) { pmapp_disp_backlight_init(); rc = gpio_request(GPIO_DISPLAY_PWR_EN, "gpio_disp_pwr"); if (rc < 0) { pr_err("failed to request gpio_disp_pwr\n"); return rc; } if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { rc = gpio_direction_output(GPIO_DISPLAY_PWR_EN, 1); if (rc < 0) { pr_err("failed to enable display pwr\n"); goto fail_gpio1; } rc = gpio_request(GPIO_BACKLIGHT_EN, "gpio_bkl_en"); if (rc < 0) { pr_err("failed to request gpio_bkl_en\n"); goto fail_gpio1; } rc = gpio_direction_output(GPIO_BACKLIGHT_EN, 1); if (rc < 0) { pr_err("failed to enable backlight\n"); goto fail_gpio2; } } rc = regulator_bulk_get(NULL, ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) { pr_err("%s: could not get regulators: %d\n", __func__, rc); goto fail_gpio2; } rc = regulator_bulk_set_voltage(ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) { pr_err("%s: could not set voltages: %d\n", __func__, rc); goto fail_vreg; } if (pmapp_disp_backlight_set_brightness(100)) pr_err("backlight set brightness failed\n"); dsi_gpio_initialized = 1; } if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, on); gpio_set_value_cansleep(GPIO_BACKLIGHT_EN, on); } else if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() || machine_is_msm8625_ffa()) { if (on) { /* This line drives an active low pin on FFA */ rc = gpio_direction_output(GPIO_DISPLAY_PWR_EN, !on); if (rc < 0) pr_err("failed to set direction for " "display pwr\n"); } else { gpio_set_value_cansleep(GPIO_DISPLAY_PWR_EN, !on); rc = gpio_direction_input(GPIO_DISPLAY_PWR_EN); if (rc < 0) pr_err("failed to set direction for " "display pwr\n"); } } if (on) { gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 0); if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { lcdc_reset_cfg = readl_relaxed(lcdc_reset_ptr); rmb(); lcdc_reset_cfg &= ~1; writel_relaxed(lcdc_reset_cfg, lcdc_reset_ptr); msleep(20); wmb(); lcdc_reset_cfg |= 1; writel_relaxed(lcdc_reset_cfg, lcdc_reset_ptr); } else { gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 0); msleep(20); gpio_set_value_cansleep(GPIO_LCDC_BRDG_RESET_N, 1); } } else { gpio_set_value_cansleep(GPIO_LCDC_BRDG_PD, 1); } #endif /*-- Huize - 20120927 Modify for identifying what the code is used by customization --*/ rc = on ? regulator_bulk_enable(ARRAY_SIZE(regs_dsi), regs_dsi) : regulator_bulk_disable(ARRAY_SIZE(regs_dsi), regs_dsi); if (rc) pr_err("%s: could not %sable regulators: %d\n", __func__, on ? "en" : "dis", rc); return rc; fail_vreg: regulator_bulk_free(ARRAY_SIZE(regs_dsi), regs_dsi); fail_gpio2: gpio_free(GPIO_BACKLIGHT_EN); fail_gpio1: //Jordan-20111230 , remove // gpio_free(GPIO_DISPLAY_PWR_EN); dsi_gpio_initialized = 0; return rc; }
static int msm_fb_detect_panel(const char *name) { int ret = -ENODEV; if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { if (!strncmp(name, "lcdc_toshiba_fwvga_pt", 21) || !strncmp(name, "mipi_cmd_renesas_fwvga", 22)) ret = 0; } else if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() || machine_is_msm8625_ffa()) { if (!strncmp(name, "mipi_cmd_renesas_fwvga", 22)) ret = 0; } else if (machine_is_msm7627a_qrd1()) { if (!strncmp(name, "mipi_video_truly_wvga", 21)) ret = 0; } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { if (!strncmp(name, "lcdc_truly_hvga_ips3p2335_pt", 28)) ret = 0; } else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_qrd5() || machine_is_msm7x27a_qrd5a()) { if (cont_splash_enabled == 1) { #if defined CONFIG_FB_MSM_MIPI_TCL_TD_TNFW4602_2_VIDEO_MODE if (!strncmp(name, LCD_MODULE_NAME, strlen(LCD_MODULE_NAME))) #else if (!strncmp(name, "mipi_cmd_nt35510_wvga", 21)) #endif ret = 0; } else if (cont_splash_enabled == 2) { #if defined CONFIG_FB_MSM_MIPI_TCL_TD_TNFW4602_2_VIDEO_MODE if (!strncmp(name, LCD_MODULE_NAME, strlen(LCD_MODULE_NAME))) #else if (!strncmp(name, "mipi_cmd_nt35510_wvga", 21)) #endif ret = 0; } else { #if defined CONFIG_FB_MSM_MIPI_TCL_TD_TNFW4602_2_VIDEO_MODE if (!strncmp(name, LCD_MODULE_NAME, strlen(LCD_MODULE_NAME))) #else if (!strncmp(name, "mipi_cmd_nt35510_wvga", 21)) #endif ret = 0; } } else if (machine_is_msm8625_skua()) { if (!strncmp(name, "mipi_video_himax_wvga", 21) && skua_panel_is_himax()) ret = 0; else if (!strncmp(name, "mipi_cmd_nt35510_alaska_wvga", 28) && !skua_panel_is_himax()) ret = 0; } else if (machine_is_msm8625_evt()) { if (!strncmp(name, "mipi_video_nt35510_wvga", 23)) ret = 0; } #if !defined(CONFIG_FB_MSM_LCDC_AUTO_DETECT) && \ !defined(CONFIG_FB_MSM_MIPI_PANEL_AUTO_DETECT) && \ !defined(CONFIG_FB_MSM_LCDC_MIPI_PANEL_AUTO_DETECT) if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { if (!strncmp(name, LCDC_TOSHIBA_FWVGA_PANEL_NAME, strnlen(LCDC_TOSHIBA_FWVGA_PANEL_NAME, PANEL_NAME_MAX_LEN))) return 0; } #endif return ret; }
void __init msm_fb_add_devices(void) { int rc = 0; #if 1 // #suwg. printk("xxx %s \n",__func__); printk("machine_is_msm7627a_qrd1 %d\n",machine_is_msm7627a_qrd1()); printk("machine_is_msm8625q_skud %d\n",machine_is_msm8625q_skud()); printk("machine_is_msm7x27a_qrd5a %d\n",machine_is_msm7x27a_qrd5a()); printk("machine_is_msm8625_qrd5 %d\n",machine_is_msm8625_qrd5()); printk("disable_splash %d\n",disable_splash); msm7x27a_set_display_params(prim_panel_name); if (disable_splash) mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(odmm_fb_devices, ARRAY_SIZE(odmm_fb_devices)); msm_fb_register_device("mdp", &mdp_pdata); //#ifdef CONFIG_FB_MSM_MIPI_DSI msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); //#endif return; #endif msm7x27a_set_display_params(prim_panel_name); if (machine_is_msm7627a_qrd1()) platform_add_devices(qrd_fb_devices, ARRAY_SIZE(qrd_fb_devices)); else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_qrd5() || machine_is_msm7x27a_qrd5a()) { mipi_NT35510_pdata.bl_lock = 1; mipi_NT35516_pdata.bl_lock = 1; if (disable_splash) mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(evb_fb_devices, ARRAY_SIZE(evb_fb_devices)); } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { sku3_lcdc_lcd_camera_power_init(); mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(qrd3_fb_devices, ARRAY_SIZE(qrd3_fb_devices)); } else if (machine_is_msm8625q_skud() || machine_is_msm8625q_evbd()) { if (disable_splash) mdp_pdata.cont_splash_enabled = 0x0; /* SKUD and SKUD' use different lane connection */ if (cpu_is_msm8625q()){ if(!strncmp((char *)prim_panel_name, "mipi_video_hx8392a_720p", 23)) mipi_dsi_pdata.dlane_swap = 3; else mipi_dsi_pdata.dlane_swap = 0; pr_info("[DISP] The prim panel name is %s, Swap lane is %d\n", prim_panel_name,mipi_dsi_pdata.dlane_swap); } platform_add_devices(skud_fb_devices, ARRAY_SIZE(skud_fb_devices)); } else if (machine_is_msm8625q_skue()) { if (disable_splash) mdp_pdata.cont_splash_enabled = 0x0; /* SKUE and SKUE' use different lane connection */ if (cpu_is_msm8625q()) mipi_dsi_pdata.dlane_swap = 0; platform_add_devices(skue_fb_devices, ARRAY_SIZE(skue_fb_devices)); } else { mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(msm_fb_devices, ARRAY_SIZE(msm_fb_devices)); } msm_fb_register_device("mdp", &mdp_pdata); if (machine_is_msm7625a_surf() || machine_is_msm7x27a_surf() || machine_is_msm8625_surf() || machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) msm_fb_register_device("lcdc", &lcdc_pdata); #ifdef CONFIG_FB_MSM_MIPI_DSI msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); #endif if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_qrd5() || machine_is_msm7x27a_qrd5a() || machine_is_msm8625q_evbd()) { gpio_reg_2p85v = regulator_get(&mipi_dsi_device.dev, "lcd_vdd"); if (IS_ERR(gpio_reg_2p85v)) pr_err("%s:ext_2p85v regulator get failed", __func__); gpio_reg_1p8v = regulator_get(&mipi_dsi_device.dev, "lcd_vddi"); if (IS_ERR(gpio_reg_1p8v)) pr_err("%s:ext_1p8v regulator get failed", __func__); if (mdp_pdata.cont_splash_enabled) { /*Enable EXT_2.85 and 1.8 regulators*/ rc = regulator_enable(gpio_reg_2p85v); if (rc < 0) pr_err("%s: reg enable failed\n", __func__); rc = regulator_enable(gpio_reg_1p8v); if (rc < 0) pr_err("%s: reg enable failed\n", __func__); } } }
void __init msm_fb_add_devices(void) { int rc = 0; msm7x27a_set_display_params(prim_panel_name); if (machine_is_msm7627a_qrd1()) platform_add_devices(qrd_fb_devices, ARRAY_SIZE(qrd_fb_devices)); else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_evt()) { mipi_NT35510_pdata.bl_lock = 1; mipi_NT35516_pdata.bl_lock = 1; if (disable_splash) mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(evb_fb_devices, ARRAY_SIZE(evb_fb_devices)); } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { sku3_lcdc_lcd_camera_power_init(); mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(qrd3_fb_devices, ARRAY_SIZE(qrd3_fb_devices)); } else { /* mipi video mode need setting for support continuous splash */ if (get_hw_lcd_interface_type() == LCD_IS_MIPI_VIDEO) { mdp_pdata.cont_splash_enabled = 0x1; } else { mdp_pdata.cont_splash_enabled = 0x0; } platform_add_devices(msm_fb_devices, ARRAY_SIZE(msm_fb_devices)); } msm_fb_register_device("mdp", &mdp_pdata); if (machine_is_msm7625a_surf() || machine_is_msm7x27a_surf() || machine_is_msm8625_surf() || machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) msm_fb_register_device("lcdc", &lcdc_pdata); #ifdef CONFIG_FB_MSM_MIPI_DSI msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); #endif if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_evt()) { gpio_reg_2p85v = regulator_get(&mipi_dsi_device.dev, "lcd_vdd"); if (IS_ERR(gpio_reg_2p85v)) pr_err("%s:ext_2p85v regulator get failed", __func__); gpio_reg_1p8v = regulator_get(&mipi_dsi_device.dev, "lcd_vddi"); if (IS_ERR(gpio_reg_1p8v)) pr_err("%s:ext_1p8v regulator get failed", __func__); if (mdp_pdata.cont_splash_enabled) { /*Enable EXT_2.85 and 1.8 regulators*/ rc = regulator_enable(gpio_reg_2p85v); if (rc < 0) pr_err("%s: reg enable failed\n", __func__); rc = regulator_enable(gpio_reg_1p8v); if (rc < 0) pr_err("%s: reg enable failed\n", __func__); } } }
void __init msm_fb_add_devices(void) { int rc = 0; msm7x27a_set_display_params(prim_panel_name); if (machine_is_msm7627a_qrd1()) { platform_add_devices(qrd_fb_devices, ARRAY_SIZE(qrd_fb_devices)); } else if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_evt() || machine_is_qrd_skud_prime()) { mipi_NT35510_pdata.bl_lock = 1; mipi_NT35516_pdata.bl_lock = 1; if (disable_splash) mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(evb_fb_devices, ARRAY_SIZE(evb_fb_devices)); } else if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) { if (machine_is_msm7627a_qrd3()) mdp_pdata.cont_splash_enabled = 0x0; else mdp_pdata.cont_splash_enabled = 0x1; platform_add_devices(qrd3_fb_devices, ARRAY_SIZE(qrd3_fb_devices)); } else { mdp_pdata.cont_splash_enabled = 0x0; platform_add_devices(msm_fb_devices, ARRAY_SIZE(msm_fb_devices)); } msm_fb_register_device("mdp", &mdp_pdata); if (machine_is_msm7625a_surf() || machine_is_msm7x27a_surf() || machine_is_msm8625_surf() || machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) msm_fb_register_device("lcdc", &lcdc_pdata); if (machine_is_msm7627a_qrd3() || machine_is_msm8625_qrd7()) sku3_lcdc_power_init(); #ifdef CONFIG_FB_MSM_MIPI_DSI msm_fb_register_device("mipi_dsi", &mipi_dsi_pdata); #endif if (machine_is_msm7627a_evb() || machine_is_msm8625_evb() || machine_is_msm8625_evt() || machine_is_qrd_skud_prime()) { gpio_reg_2p85v = regulator_get(&mipi_dsi_device.dev, "lcd_vdd"); if (IS_ERR(gpio_reg_2p85v)) pr_err("%s:ext_2p85v regulator get failed", __func__); gpio_reg_1p8v = regulator_get(&mipi_dsi_device.dev, "lcd_vddi"); if (IS_ERR(gpio_reg_1p8v)) pr_err("%s:ext_1p8v regulator get failed", __func__); if (mdp_pdata.cont_splash_enabled) { /* */ rc = regulator_enable(gpio_reg_2p85v); if (rc < 0) pr_err("%s: reg enable failed\n", __func__); rc = regulator_enable(gpio_reg_1p8v); if (rc < 0) pr_err("%s: reg enable failed\n", __func__); } } }
/* FIH-SW-MM-VH-DISPLAY-JB00*[ */ static int msm_fb_dsi_client_msm_reset(int hold) { int rc = 0; static int dsi_reset_initialized = 0; printk(KERN_INFO "[DISPLAY]%s: E, hold <%d>\n", __func__, hold); if (dsi_reset_initialized == 0) { rc = gpio_request(GPIO_LCM_RESET, "gpio_disp_pwr"); if (rc < 0) { pr_err("[DISPLAY] %s: Failed to request lcm_reset, rc <%d>\n", __func__, rc); //return rc; } rc = gpio_tlmm_config(GPIO_CFG(GPIO_LCM_RESET, 0, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); if (unlikely(fih_get_product_phase() < Phase_SP2)) { printk(KERN_ALERT "[DISPLAY]%s: <%d> < SP2\n", __func__, fih_get_product_phase()); rc = gpio_request(GPIO_LCM_BKL_EN, "lcm_bkl_en"); if (rc < 0) { pr_err("[DISPLAY] %s: Failed to request lcm_bkl_en\n", __func__); //goto gpio_error; } rc = gpio_tlmm_config(GPIO_CFG(GPIO_LCM_BKL_EN, 0, GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA), GPIO_CFG_ENABLE); if (rc < 0) { pr_err("[DISPLAY] %s: Failed lcm_bkl_en enable\n", __func__); //goto gpio_error2; } } dsi_reset_initialized = 1; } if (hold) { gpio_direction_output(GPIO_LCM_RESET, 0); } else { #ifdef CONFIG_FIH_HR_MSLEEP rc |= gpio_direction_output(GPIO_LCM_RESET, 1); hr_msleep(5); rc |= gpio_direction_output(GPIO_LCM_RESET, 0); hr_msleep(5); rc |= gpio_direction_output(GPIO_LCM_RESET, 1); #else rc |= gpio_direction_output(GPIO_LCM_RESET, 1); msleep(5); rc |= gpio_direction_output(GPIO_LCM_RESET, 0); msleep(5); rc |= gpio_direction_output(GPIO_LCM_RESET, 1); #endif } #ifdef CONFIG_FIH_HR_MSLEEP hr_msleep(150); #else msleep(150); #endif #if 0 if (!rc) { if (machine_is_msm7x27a_surf() || machine_is_msm7625a_surf() || machine_is_msm8625_surf()) { lcdc_reset_ptr = ioremap_nocache(LCDC_RESET_PHYS, sizeof(uint32_t)); printk(KERN_ERR "[DISPLAY]%s: surf\n", __func__); if (!lcdc_reset_ptr) return 0; } printk(KERN_ERR "[DISPLAY]%s: X, rc <%d>\n", __func__, rc); return rc; } else { //goto gpio_error; } #endif #if 0 gpio_error2: pr_err("Failed GPIO bridge pd\n"); gpio_free(GPIO_LCDC_BRDG_PD); gpio_error: pr_err("Failed GPIO bridge reset\n"); gpio_free(GPIO_LCDC_BRDG_RESET_N); #endif printk(KERN_INFO "[DISPLAY]%s: X, rc <%d>\n", __func__, rc); return rc; }
void __init msm7627a_add_io_devices(void) { /* touchscreen */ #ifdef CONFIG_TOUCHSCREEN_ATMEL_MAXTOUCH if (machine_is_msm7625a_surf() || machine_is_msm7625a_ffa()) { atmel_ts_pdata.min_x = 0; atmel_ts_pdata.max_x = 480; atmel_ts_pdata.min_y = 0; atmel_ts_pdata.max_y = 320; } i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, atmel_ts_i2c_info, ARRAY_SIZE(atmel_ts_i2c_info)); #endif //>>MelChang,[Harry] Add ELAN eKTF2040 and ILITEK ILI2013t touch panel IC #if defined(CONFIG_TOUCHSCREEN_ELAN_EKTF2040) || defined(CONFIG_TOUCHSCREEN_ILITEK_2103T) || defined(CONFIG_TOUCHSCREEN_CYPRESS_CY8CTMA340) gpio_tlmm_config(GPIO_CFG(CAP_TOUCH_DETECT, 0, GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA), GPIO_CFG_ENABLE); mdelay(10); if(gpio_get_value(CAP_TOUCH_DETECT)) { #if defined(CONFIG_TOUCHSCREEN_CYPRESS_CY8CTMA340) pr_info("-- CAP_TOUCH_DETECT is Cypress IC + Jtouch Panel --\n"); i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, i2c_touch_devices_cypress_tma340, ARRAY_SIZE(i2c_touch_devices_cypress_tma340)); #else pr_info("-- CAP_TOUCH_DETECT High - Fail --\n"); #endif } else { #if defined(CONFIG_TOUCHSCREEN_ELAN_EKTF2040) pr_info("-- CAP_TOUCH_DETECT is ELAN IC --\n"); elan_ktf2k_ts_power(1); i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, i2c_touch_devices_harry_elan, ARRAY_SIZE(i2c_touch_devices_harry_elan)); #elif defined(CONFIG_TOUCHSCREEN_CYPRESS_CY8CTMA340) pr_info("-- CAP_TOUCH_DETECT is Cypress IC + Second Source Panel --\n"); i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, i2c_touch_devices_cypress_tma340, ARRAY_SIZE(i2c_touch_devices_cypress_tma340)); #else pr_info("-- CAP_TOUCH_DETECT Low - Fail --\n"); #endif } #endif //>>MelChang,[Harry] Add ELAN eKTF2040 and ILITEK ILI2013t touch panel IC /*++ Huize - 20110914 Register sensor device ++*/ i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, Sensor_devices_info, ARRAY_SIZE(Sensor_devices_info)); /*-- Huize - 20110914 Register sensor device --*/ /* keypad */ //Mel, 2012/4/18, Enable Key GPIO. ++ #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE) platform_device_register(&NanHu_button_device); #endif //Mel, 2012/4/18, Enable Key GPIO. -- //Mel, 2012/4/18, Disable Key Matrix. ++ #if 0 platform_device_register(&kp_pdev); #endif //Mel, 2012/4/18, Disable Key Matrix. -- /* headset */ platform_device_register(&hs_pdev); /* LED: configure it as a pdm function */ if (gpio_tlmm_config(GPIO_CFG(LED_GPIO_PDM, 3, GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA), GPIO_CFG_ENABLE)) pr_err("%s: gpio_tlmm_config for %d failed\n", __func__, LED_GPIO_PDM); else platform_device_register(&led_pdev); /* ++ Edison add led device ++ */ #ifdef CONFIG_LEDS_CHIP_LM3533 led_lm3533_hw_init(); i2c_register_board_info(MSM_GSBI1_QUP_I2C_BUS_ID, i2c_led_devices_LM3533, ARRAY_SIZE(i2c_led_devices_LM3533)); #endif /* -- Edison add led device -- */ /* Vibrator */ //<<Skies, 2011/10/12 enable vibrator function //if (machine_is_msm7x27a_ffa() || machine_is_msm7625a_ffa() // || machine_is_msm8625_ffa()) //>>Skies, 2011/10/12 msm_init_pmic_vibrator(); }