static int s5ptvfb_blank(int blank_mode, struct fb_info *fb) { struct s5ptvfb_window *win = fb->par; dev_dbg(s5ptv_status.dev_fb, "change blank mode\n"); switch (blank_mode) { case FB_BLANK_UNBLANK: if (fb->fix.smem_start) { s5ptvfb_display_on(&s5ptv_status); s5ptvfb_enable_window(win->id); } else dev_info(s5ptv_status.dev_fb, "[fb%d] no allocated memory for unblank\n", win->id); break; case FB_BLANK_POWERDOWN: s5ptvfb_display_off(&s5ptv_status); s5ptvfb_disable_window(win->id); break; default: dev_dbg(s5ptv_status.dev_fb, "unsupported blank mode\n"); /* return -EINVAL; */ } return 0; }
/* * Resume */ int s5p_tv_late_resume(struct platform_device *dev) { BASEPRINTK("(hpd_status = %d)++\n", s5ptv_status.hpd_status); mutex_lock(mutex_for_fo); s5ptv_status.suspend_status = false; if(!(s5ptv_status.hpd_status)) { mutex_unlock(mutex_for_fo); return 0; } else { #if 0 #ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_MAX_FREQ_1GHZ // 2010.3.9. s5pc110_lock_dvfs_high_level(DVFS_LOCK_TOKEN_4, 3); #else s5pc110_lock_dvfs_high_level(DVFS_LOCK_TOKEN_4, 2); #endif #endif #endif #ifdef CONFIG_PM_PWR_GATING /* clk & power on */ s5p_tv_clk_gate( true ); if(s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB) tv_phy_power( true ); #endif /* tv on */ if ( s5ptv_status.tvout_output_enable ) { _s5p_tv_if_start(); } /* video layer start */ if ( s5ptv_status.vp_layer_enable ) _s5p_vlayer_start(); /* grp0 layer start */ if ( s5ptv_status.grp_layer_enable[0] ) _s5p_grp_start(VM_GPR0_LAYER); /* grp1 layer start */ if ( s5ptv_status.grp_layer_enable[1] ) _s5p_grp_start(VM_GPR1_LAYER); #ifdef CONFIG_TV_FB if ( s5ptv_status.tvout_output_enable ) { s5ptvfb_display_on(&s5ptv_status); s5ptvfb_set_par(s5ptv_status.fb); } #endif } mutex_unlock(mutex_for_fo); BASEPRINTK("()--\n"); return 0; }
/* * Resume */ int s5p_tv_late_resume(struct platform_device *dev) { BASEPRINTK("(hpd_status = %d)++\n", s5ptv_status.hpd_status); mutex_lock(mutex_for_fo); s5ptv_status.suspend_status = false; if(s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_DVI) s5p_handle_cable(); if(!(s5ptv_status.hpd_status)) { mutex_unlock(mutex_for_fo); return 0; } else { #ifdef CONFIG_CPU_FREQ_S5PV210 s5pv210_set_cpufreq_level(RESTRICT_TABLE); #endif /* CONFIG_CPU_FREQ_S5PV210 */ /* clk & power on */ s5p_tv_clk_gate( true ); if(s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_DVI) tv_phy_power( true ); /* tv on */ if (s5ptv_status.tvout_output_enable) { _s5p_tv_if_start(); } /* video layer start */ if (s5ptv_status.vp_layer_enable) _s5p_vlayer_start(); /* grp0 layer start */ if (s5ptv_status.grp_layer_enable[0]) _s5p_grp_start(VM_GPR0_LAYER); /* grp1 layer start */ if (s5ptv_status.grp_layer_enable[1]) _s5p_grp_start(VM_GPR1_LAYER); #ifdef CONFIG_TV_FB if (s5ptv_status.tvout_output_enable) { s5ptvfb_display_on(&s5ptv_status); s5ptvfb_set_par(s5ptv_status.fb); } #endif } mutex_unlock(mutex_for_fo); BASEPRINTK("()--\n"); return 0; }
/* * Resume */ void s5p_tv_late_resume(struct early_suspend *h) { BASEPRINTK("%s----------------start \n", __func__); mutex_lock(mutex_for_fo); s5ptv_status.suspend_status = false; if (!(s5ptv_status.hpd_status)) { printk(KERN_INFO "(hpd_status = %d)++\n", \ s5ptv_status.hpd_status); mutex_unlock(mutex_for_fo); return ; } else { #ifdef CONFIG_CPU_FREQ_S5PV210 s5pv210_set_cpufreq_level(RESTRICT_TABLE); #endif /* CONFIG_CPU_FREQ_S5PV210 */ /* clk & power on */ s5p_tv_clk_gate(true); if ((s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI) ||\ (s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB)) tv_phy_power(true); /* tv on */ if (s5ptv_status.tvout_output_enable) _s5p_tv_if_start(); /* video layer start */ if (s5ptv_status.vp_layer_enable) _s5p_vlayer_start(); /* grp0 layer start */ if (s5ptv_status.grp_layer_enable[0]) _s5p_grp_start(VM_GPR0_LAYER); /* grp1 layer start */ if (s5ptv_status.grp_layer_enable[1]) _s5p_grp_start(VM_GPR1_LAYER); #ifdef CONFIG_TV_FB if (s5ptv_status.tvout_output_enable) { s5ptvfb_display_on(&s5ptv_status); s5ptvfb_set_par(s5ptv_status.fb); } #endif } mutex_unlock(mutex_for_fo); BASEPRINTK("()--\n"); return ; }
static int s5ptvfb_open(struct fb_info *fb, int user) { struct s5ptvfb_window *win = fb->par; int ret = 0; ret = s5p_tv_clk_gate(true); if (ret < 0) { printk(KERN_ERR "[Error]Cannot open it\n"); return -1; } tv_phy_power(true); _s5p_tv_if_init_param(); s5p_tv_v4l2_init_param(); /* s5ptv_status.tvout_param.disp_mode = TVOUT_720P_60; */ s5ptv_status.tvout_param.out_mode = TVOUT_OUTPUT_HDMI_RGB; _s5p_tv_if_set_disp(); #ifndef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&s5ptv_status); s5ptvfb_enable_window(0); #endif mutex_lock(&s5ptv_status.fb_lock); if (atomic_read(&win->in_use)) { dev_dbg(s5ptv_status.dev_fb, "do not allow multiple open " "for window\n"); ret = -EBUSY; } else atomic_inc(&win->in_use); mutex_unlock(&s5ptv_status.fb_lock); return ret; }
void s5p_tv_late_resume(struct early_suspend *h) { BASEPRINTK("(hpd_status = %d)++\n", g_s5ptv_status.hpd_status); mutex_lock(g_mutex_for_fo); g_s5ptv_status.suspend_status = false; if (g_s5ptv_status.hpd_status == true) { /* clk & power on */ s5p_tv_base_clk_gate(true); if (g_s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI || g_s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB) s5p_tv_base_phy_power(true); /* tv on */ if (g_s5ptv_status.tvout_output_enable) s5p_tv_if_start(); /* video layer start */ if (g_s5ptv_status.vp_layer_enable) s5p_vlayer_start(); /* grp0 layer start */ if (g_s5ptv_status.grp_layer_enable[VM_GPR0_LAYER]) s5p_grp_start(VM_GPR0_LAYER); /* grp1 layer start */ if (g_s5ptv_status.grp_layer_enable[VM_GPR1_LAYER]) s5p_grp_start(VM_GPR1_LAYER); #ifdef CONFIG_TV_FB if (g_s5ptv_status.tvout_output_enable) { s5ptvfb_display_on(&g_s5ptv_status); s5ptvfb_set_par(g_s5ptv_status.fb); } #endif } mutex_unlock(g_mutex_for_fo); BASEPRINTK("()--\n"); return; }
static int __devinit s5p_tv_probe(struct platform_device *pdev) { int irq_num; int ret; int i,retval; s5ptv_status.dev_fb = &pdev->dev; //enable power max8998_ldo3_8_control(1,LDO_TV_OUT); //ldo 3,8 on printk("%s: LDO3_8 is enabled by TV \n", __func__); __s5p_sdout_probe(pdev, 0); __s5p_vp_probe(pdev, 1); __s5p_mixer_probe(pdev, 2); #ifdef CONFIG_CPU_S5PC100 __s5p_hdmi_probe(pdev, 3); __s5p_tvclk_probe(pdev, 4); #endif #ifdef CONFIG_CPU_S5PV210 tv_clk_get(pdev, &s5ptv_status); s5p_tv_clk_gate( true ); #endif #ifdef CONFIG_CPU_S5PV210 __s5p_hdmi_probe(pdev, 3, 4); __s5p_hdcp_init( ); #endif #ifdef FIX_27M_UNSTABLE_ISSUE /* for smdkc100 pop */ writel(0x1, S5PC1XX_GPA0_BASE + 0x56c); #endif #ifdef I2C_BASE /* for dev_dbg err. */ spin_lock_init(&slock_hpd); /* for bh */ INIT_WORK(&ws_hpd, (void *)set_ddc_port); #endif /* check EINT init state */ #ifdef CONFIG_CPU_S5PC100 s3c_gpio_cfgpin(S5PC1XX_GPH0(5), S3C_GPIO_SFN(2)); s3c_gpio_setpull(S5PC1XX_GPH0(5), S3C_GPIO_PULL_UP); s5ptv_status.hpd_status = gpio_get_value(S5PC1XX_GPH0(5)) ? false:true; #endif #ifdef CONFIG_CPU_S5PV210 #ifdef CONFIG_HDMI_HPD if(0 == gpio_get_value(GPIO_ACCESSORY_INT)) //docking station attached s5ptv_status.hpd_status= s5p_hpd_get_state(); else s5ptv_status.hpd_status= 0; #else s5ptv_status.hpd_status= 0; #endif #endif dev_info(&pdev->dev, "hpd status is cable %s\n", s5ptv_status.hpd_status ? "inserted":"removed"); /* interrupt */ TVOUT_IRQ_INIT(irq_num, ret, pdev, 0, out, __s5p_mixer_irq, "mixer"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 1, out_hdmi_irq, __s5p_hdmi_irq , "hdmi"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 2, out_tvenc_irq, s5p_tvenc_irq, "tvenc"); #ifdef CONFIG_CPU_S5PC100 TVOUT_IRQ_INIT(irq_num, ret, pdev, 3, out_hpd_irq, __s5p_hpd_irq, "hpd"); set_irq_type(IRQ_EINT5, IRQ_TYPE_LEVEL_LOW); #endif /* v4l2 video device registration */ for (i = 0; i < S5P_TVMAX_CTRLS; i++) { s5ptv_status.video_dev[i] = &s5p_tvout[i]; if (video_register_device(s5ptv_status.video_dev[i], VFL_TYPE_GRABBER, s5p_tvout[i].minor) != 0) { dev_err(&pdev->dev, "Couldn't register tvout driver.\n"); return 0; } } #ifdef CONFIG_TV_FB mutex_init(&s5ptv_status.fb_lock); /* for default start up */ _s5p_tv_if_init_param(); s5ptv_status.tvout_param.disp_mode = TVOUT_720P_60; s5ptv_status.tvout_param.out_mode = TVOUT_OUTPUT_HDMI; #ifndef CONFIG_USER_ALLOC_TVOUT s5p_tv_clk_gate(true); if(s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_DVI) tv_phy_power(true); _s5p_tv_if_set_disp(); #endif s5ptvfb_set_lcd_info(&s5ptv_status); /* prepare memory */ if (s5ptvfb_alloc_framebuffer()) goto err_alloc; if (s5ptvfb_register_framebuffer()) goto err_alloc; #ifndef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&s5ptv_status); #endif #endif mutex_for_fo = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (mutex_for_fo == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); goto out; } #ifdef I2C_BASE mutex_for_i2c = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (mutex_for_i2c == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); goto out; } mutex_init(mutex_for_i2c); #endif mutex_init(mutex_for_fo); #ifdef CONFIG_CPU_S5PV210 /* added for phy cut off when boot up */ clk_enable(s5ptv_status.i2c_phy_clk); __s5p_hdmi_phy_power(false); clk_disable(s5ptv_status.i2c_phy_clk); s5p_tv_clk_gate( false ); #endif //disable power max8998_ldo3_8_control(0,LDO_TV_OUT); //ldo 3,8 off printk("%s: LDO3_8 is disabled by TV \n", __func__); return 0; #ifdef CONFIG_TV_FB err_alloc: #endif #ifdef CONFIG_CPU_S5PC100 out_hpd_irq: free_irq(IRQ_TVENC, pdev); #endif out_tvenc_irq: free_irq(IRQ_HDMI, pdev); out_hdmi_irq: free_irq(IRQ_MIXER, pdev); out: printk(KERN_ERR "not found (%d). \n", ret); return ret; }
static int __devinit s5p_tv_probe(struct platform_device *pdev) { int irq_num; int ret = 0; int i; g_s5ptv_status.dev_fb = &pdev->dev; g_clks_enabled = 0; ret = s5p_sdout_probe(pdev, 0); if (ret != 0) { pr_err("%s::s5p_sdout_probe() fail\n", __func__); goto err_s5p_sdout_probe; } ret = s5p_vp_probe(pdev, 1); if (ret != 0) { pr_err("%s::s5p_vmixer_probe() fail\n", __func__); goto err_s5p_vp_probe; } ret = s5p_vmixer_probe(pdev, 2); if (ret != 0) { pr_err("%s::s5p_vmixer_probe() fail\n", __func__); goto err_s5p_vmixer_probe; } tv_clk_get(pdev, &g_s5ptv_status); s5p_tv_base_clk_gate(true); ret = s5p_hdmi_probe(pdev, 3, 4); if (ret != 0) { pr_err("%s::s5p_hdmi_probe() fail\n", __func__); goto err_s5p_hdmi_probe; } s5p_hdcp_init(); #ifdef CONFIG_HDMI_HPD g_s5ptv_status.hpd_status = s5p_hpd_get_state(); #else g_s5ptv_status.hpd_status = 0; #endif dev_info(&pdev->dev, "hpd status is cable %s\n", g_s5ptv_status.hpd_status ? "inserted" : "removed"); /* interrupt */ TVOUT_IRQ_INIT(irq_num, ret, pdev, 0, err_vm_irq, s5p_vmixer_irq, "mixer"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 1, err_hdmi_irq, s5p_hdmi_irq , "hdmi"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 2, err_tvenc_irq, s5p_tvenc_irq, "tvenc"); /* v4l2 video device registration */ for (i = 0; i < S5P_TVMAX_CTRLS; i++) { g_s5ptv_status.video_dev[i] = &s5p_tvout[i]; if (video_register_device(g_s5ptv_status.video_dev[i], VFL_TYPE_GRABBER, s5p_tvout[i].minor) != 0) { dev_err(&pdev->dev, "Couldn't register tvout driver.\n"); ret = -EBUSY; goto err_video_register_device; } } #ifdef CONFIG_TV_FB mutex_init(&g_s5ptv_status.fb_lock); /* for default start up */ s5p_tv_if_init_param(); g_s5ptv_status.tvout_param.disp_mode = TVOUT_720P_60; g_s5ptv_status.tvout_param.out_mode = TVOUT_OUTPUT_HDMI; #ifndef CONFIG_USER_ALLOC_TVOUT s5p_tv_base_clk_gate(true); s5p_tv_base_phy_power(true); s5p_tv_if_set_disp(); #endif s5ptvfb_set_lcd_info(&g_s5ptv_status); /* prepare memory */ if (s5ptvfb_alloc_framebuffer()) { ret = -ENOMEM; goto err_alloc_fb; } if (s5ptvfb_register_framebuffer()) { ret = -EBUSY; goto err_register_fb; } #ifndef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&g_s5ptv_status); #endif #endif g_mutex_for_fo = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (g_mutex_for_fo == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); ret = -ENOMEM; goto err_mutex_alloc; } mutex_init(g_mutex_for_fo); /* added for phy cut off when boot up */ clk_enable(g_s5ptv_status.i2c_phy_clk); s5p_hdmi_phy_power(false); clk_disable(g_s5ptv_status.i2c_phy_clk); s5p_tv_base_clk_gate(false); return 0; err_mutex_alloc: #ifdef CONFIG_TV_FB err_register_fb: s5ptvfb_free_framebuffer(); err_alloc_fb: #endif err_video_register_device: free_irq(IRQ_TVENC, pdev); err_tvenc_irq: free_irq(IRQ_HDMI, pdev); err_hdmi_irq: free_irq(IRQ_MIXER, pdev); err_vm_irq: s5p_hdmi_release(pdev); err_s5p_hdmi_probe: s5p_vmixer_release(pdev); err_s5p_vmixer_probe: s5p_vp_release(pdev); err_s5p_vp_probe: s5p_sdout_release(pdev); err_s5p_sdout_probe: pr_err("%s::not found (%d).\n", __func__, ret); return ret; }
static int __devinit s5p_tv_probe(struct platform_device *pdev) { int irq_num; int ret; int i, retval; /* Get csis power domain regulator */ s5ptv_status.tv_regulator = regulator_get(&pdev->dev, "pd"); if (IS_ERR(s5ptv_status.tv_regulator)) { printk(KERN_ERR "%s %d: failed to get resource %s\n", __func__, __LINE__, "s3c-tv20 pd"); return PTR_ERR(s5ptv_status.tv_regulator); } s5ptv_status.tv_tvout = regulator_get(NULL, "tvout"); if (IS_ERR(s5ptv_status.tv_tvout)) { printk(KERN_ERR "%s %d: failed to get resource %s\n", __func__, __LINE__, "s3c-tv20 tvout"); return PTR_ERR(s5ptv_status.tv_tvout); } #ifdef CONFIG_MACH_P1 s5ptv_status.tv_tv = regulator_get(NULL, "tv"); if (IS_ERR(s5ptv_status.tv_tv)) { printk(KERN_ERR "%s %d: failed to get resource %s\n", __func__, __LINE__, "s3c-tv20 tv"); return PTR_ERR(s5ptv_status.tv_tv); } regulator_enable(s5ptv_status.tv_tv); #endif s5ptv_status.dev_fb = &pdev->dev; __s5p_sdout_probe(pdev, 0); __s5p_vp_probe(pdev, 1); __s5p_mixer_probe(pdev, 2); #ifdef CONFIG_CPU_S5PC100 __s5p_hdmi_probe(pdev, 3); __s5p_tvclk_probe(pdev, 4); #endif #ifdef CONFIG_CPU_S5PV210 tv_clk_get(pdev, &s5ptv_status); s5p_tv_clk_gate(true); __s5p_hdmi_probe(pdev, 3, 4); __s5p_hdcp_init(); #endif #if defined(CONFIG_MACH_P1) retval = i2c_add_driver(&SII9234A_i2c_driver); if (retval != 0) printk(KERN_ERR "[MHL SII9234A] can't add i2c driver"); retval = i2c_add_driver(&SII9234B_i2c_driver); if (retval != 0) printk(KERN_ERR "[MHL SII9234B] can't add i2c driver"); retval = i2c_add_driver(&SII9234C_i2c_driver); if (retval != 0) printk(KERN_ERR "[MHL SII9234C] can't add i2c driver"); retval = i2c_add_driver(&SII9234_i2c_driver); if (retval != 0) printk(KERN_ERR "[MHL SII9234] can't add i2c driver"); #endif #ifdef FIX_27M_UNSTABLE_ISSUE /* for smdkc100 pop */ writel(0x1, S5PC1XX_GPA0_BASE + 0x56c); #endif #ifdef I2C_BASE /* for dev_dbg err. */ spin_lock_init(&slock_hpd); /* for bh */ INIT_WORK(&ws_hpd, (void *)set_ddc_port); #endif /* check EINT init state */ #ifdef CONFIG_CPU_S5PC100 s3c_gpio_cfgpin(S5PC1XX_GPH0(5), S3C_GPIO_SFN(2)); s3c_gpio_setpull(S5PC1XX_GPH0(5), S3C_GPIO_PULL_UP); s5ptv_status.hpd_status = gpio_get_value(S5PC1XX_GPH0(5)) ? \ false : true; #endif #ifdef CONFIG_CPU_S5PV210 #ifdef CONFIG_HDMI_HPD s5ptv_status.hpd_status = 0; #else s5ptv_status.hpd_status = 0; #endif #endif dev_info(&pdev->dev, "hpd status: cable %s\n",\ s5ptv_status.hpd_status ? "inserted":"removed/not connected"); /* Interrupt */ TVOUT_IRQ_INIT(irq_num, ret, pdev, 0, out, __s5p_mixer_irq, "mixer"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 1, out_hdmi_irq, __s5p_hdmi_irq , \ "hdmi"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 2, out_tvenc_irq, s5p_tvenc_irq, \ "tvenc"); #ifdef CONFIG_CPU_S5PC100 TVOUT_IRQ_INIT(irq_num, ret, pdev, 3, out_hpd_irq, __s5p_hpd_irq, \ "hpd"); set_irq_type(IRQ_EINT5, IRQ_TYPE_LEVEL_LOW); #endif /* v4l2 video device registration */ for (i = 0; i < S5P_TVMAX_CTRLS; i++) { s5ptv_status.video_dev[i] = &s5p_tvout[i]; if (video_register_device(s5ptv_status.video_dev[i], VFL_TYPE_GRABBER, s5p_tvout[i].minor) != 0) { dev_err(&pdev->dev, "Couldn't register tvout driver.\n"); return 0; } } #ifdef CONFIG_TV_FB mutex_init(&s5ptv_status.fb_lock); /* for default start up */ _s5p_tv_if_init_param(); s5ptv_status.tvout_param.disp_mode = TVOUT_720P_60; s5ptv_status.tvout_param.out_mode = TVOUT_OUTPUT_HDMI; #ifndef CONFIG_USER_ALLOC_TVOUT s5p_tv_clk_gate(true); /* if ((s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI) || (s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB)) */ tv_phy_power(true); _s5p_tv_if_set_disp(); #endif s5ptvfb_set_lcd_info(&s5ptv_status); /* prepare memory */ if (s5ptvfb_alloc_framebuffer()) goto err_alloc; if (s5ptvfb_register_framebuffer()) goto err_alloc; #ifndef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&s5ptv_status); #endif #endif mutex_for_fo = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (mutex_for_fo == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); goto out; } #ifdef I2C_BASE mutex_for_i2c = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (mutex_for_i2c == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); goto out; } mutex_init(mutex_for_i2c); #endif mutex_init(mutex_for_fo); #ifdef CONFIG_CPU_S5PV210 /* added for phy cut off when boot up */ clk_enable(s5ptv_status.i2c_phy_clk); __s5p_hdmi_phy_power(false); clk_disable(s5ptv_status.i2c_phy_clk); s5p_tv_clk_gate(false); #endif printk(KERN_INFO "%s TV Probing is done\n", __func__); return 0; #ifdef CONFIG_TV_FB err_alloc: #endif #ifdef CONFIG_CPU_S5PC100 out_hpd_irq: free_irq(IRQ_TVENC, pdev); #endif out_tvenc_irq: free_irq(IRQ_HDMI, pdev); out_hdmi_irq: free_irq(IRQ_MIXER, pdev); out: printk(KERN_ERR "not found (%d). \n", ret); return ret; }
int s5ptvfb_direct_ioctl(int id, unsigned int cmd, unsigned long arg) { struct fb_info *fb = s5ptv_status.fb; struct fb_fix_screeninfo *fix = &fb->fix; struct s5ptvfb_window *win = fb->par; void *argp = (void *) arg; int ret = 0; switch (cmd) { case FBIO_ALLOC: win->path = (enum s5ptvfb_data_path_t) argp; break; case FBIOGET_FSCREENINFO: ret = memcpy(argp, &fb->fix, sizeof(fb->fix)) ? 0 : -EFAULT; break; case FBIOGET_VSCREENINFO: ret = memcpy(argp, &fb->var, sizeof(fb->var)) ? 0 : -EFAULT; break; case FBIOPUT_VSCREENINFO: ret = s5ptvfb_check_var((struct fb_var_screeninfo *) argp, fb); if (ret) { dev_err(s5ptv_status.dev_fb, "invalid vscreeninfo\n"); break; } ret = memcpy(&fb->var, (struct fb_var_screeninfo *) argp, sizeof(fb->var)) ? 0 : -EFAULT; if (ret) { dev_err(s5ptv_status.dev_fb, "failed to put new vscreeninfo\n"); break; } ret = s5ptvfb_set_par(fb); break; case S5PTVFB_SET_WIN_ON: #ifdef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&s5ptv_status); s5ptvfb_enable_window(0); #endif break; case S5PTVFB_SET_WIN_OFF: #ifdef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_off(&s5ptv_status); s5ptvfb_disable_window(0); #endif break; case S5PTVFB_POWER_ON: s5p_tv_clk_gate(true); tv_phy_power(true); _s5p_tv_if_init_param(); s5p_tv_v4l2_init_param(); /* s5ptv_status.tvout_param.disp_mode = TVOUT_720P_60; */ s5ptv_status.tvout_param.out_mode = TVOUT_OUTPUT_HDMI; _s5p_tv_if_set_disp(); break; case S5PTVFB_POWER_OFF: _s5p_vlayer_stop(); _s5p_tv_if_stop(); s5p_tv_clk_gate(false); tv_phy_power(false); break; case S5PTVFB_WIN_SET_ADDR: fix->smem_start = (unsigned long)argp; s5ptvfb_set_buffer_address(&s5ptv_status, win->id); break; default: ret = s5ptvfb_ioctl(fb, cmd, arg); break; } return ret; }
static int s5ptvfb_ioctl(struct fb_info *fb, unsigned int cmd, unsigned long arg) { struct fb_var_screeninfo *var = &fb->var; struct s5ptvfb_window *win = fb->par; struct s5ptvfb_lcd *lcd = s5ptv_status.lcd; int ret = 0; void *argp = (void *) arg; union { struct s5ptvfb_user_window user_window; struct s5ptvfb_user_plane_alpha user_alpha; struct s5ptvfb_user_chroma user_chroma; int vsync; } p; switch (cmd) { case FBIO_ALLOC: win->path = (enum s5ptvfb_data_path_t) argp; break; case FBIOGET_FSCREENINFO: ret = memcpy(argp, &fb->fix, sizeof(fb->fix)) ? 0 : -EFAULT; break; case FBIOGET_VSCREENINFO: ret = memcpy(argp, &fb->var, sizeof(fb->var)) ? 0 : -EFAULT; break; case FBIOPUT_VSCREENINFO: ret = s5ptvfb_check_var((struct fb_var_screeninfo *) argp, fb); if (ret) { dev_err(s5ptv_status.dev_fb, "invalid vscreeninfo\n"); break; } ret = memcpy(&fb->var, (struct fb_var_screeninfo *) argp, sizeof(fb->var)) ? 0 : -EFAULT; if (ret) { dev_err(s5ptv_status.dev_fb, "failed to put new vscreeninfo\n"); break; } ret = s5ptvfb_set_par(fb); break; case S5PTVFB_WIN_POSITION: if (copy_from_user(&p.user_window, (struct s5ptvfb_user_window __user *) arg, sizeof(p.user_window))) ret = -EFAULT; else { if (p.user_window.x < 0) p.user_window.x = 0; if (p.user_window.y < 0) p.user_window.y = 0; if (p.user_window.x + var->xres > lcd->width) win->x = lcd->width - var->xres; else win->x = p.user_window.x; if (p.user_window.y + var->yres > lcd->height) win->y = lcd->height - var->yres; else win->y = p.user_window.y; s5ptvfb_set_window_position(&s5ptv_status, win->id); } break; case S5PTVFB_WIN_SET_PLANE_ALPHA: if (copy_from_user(&p.user_alpha, (struct s5ptvfb_user_plane_alpha __user *) arg, sizeof(p.user_alpha))) ret = -EFAULT; else { win->alpha.mode = PLANE_BLENDING; win->alpha.channel = p.user_alpha.channel; win->alpha.value = S5PTVFB_AVALUE(p.user_alpha.red, p.user_alpha.green, p.user_alpha.blue); s5ptvfb_set_alpha_blending(&s5ptv_status, win->id); } break; case S5PTVFB_WIN_SET_CHROMA: if (copy_from_user(&p.user_chroma, (struct s5ptvfb_user_chroma __user *) arg, sizeof(p.user_chroma))) ret = -EFAULT; else { win->chroma.enabled = p.user_chroma.enabled; win->chroma.key = S5PTVFB_CHROMA(p.user_chroma.red, p.user_chroma.green, p.user_chroma.blue); s5ptvfb_set_chroma_key(&s5ptv_status, win->id); } break; case S5PTVFB_WIN_SET_ADDR: fb->fix.smem_start = (unsigned long)argp; s5ptvfb_set_buffer_address(&s5ptv_status, win->id); break; case S5PTVFB_SET_WIN_ON: #ifdef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&s5ptv_status); s5ptvfb_enable_window(0); #endif break; case S5PTVFB_SET_WIN_OFF: #ifdef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_off(&s5ptv_status); s5ptvfb_disable_window(0); #endif break; } return 0; }
static int __devinit s5p_tv_probe(struct platform_device *pdev) { int irq_num; int ret; int i; s5ptv_status.dev_fb = &pdev->dev; suspend_resume_sync = 0; is_tv_clk_on = false; is_tv_phy_enable = false; //enable power /* Get csis power domain regulator */ s5ptv_status.tv_regulator = regulator_get(&pdev->dev, "pd"); if (IS_ERR(s5ptv_status.tv_regulator)) { printk(KERN_ERR "%s %d: failed to get resource %s\n", __func__, __LINE__, "s3c-tv20 pd"); return PTR_ERR(s5ptv_status.tv_regulator); } s5ptv_status.tv_tvout = regulator_get(NULL, "tvout"); if (IS_ERR(s5ptv_status.tv_tvout)) { printk(KERN_ERR "%s %d: failed to get resource %s\n", __func__, __LINE__, "s3c-tv20 tvout"); return PTR_ERR(s5ptv_status.tv_tvout); } s5ptv_status.tv_tv = regulator_get(NULL, "hdmi"); if (IS_ERR(s5ptv_status.tv_tv)) { printk(KERN_ERR "%s %d: failed to get resource %s\n", __func__, __LINE__, "s3c-tv20 tv"); return PTR_ERR(s5ptv_status.tv_tv); } regulator_enable(s5ptv_status.tv_tv); regulator_enable(s5ptv_status.tv_tvout); s5ptv_status.dev_fb = &pdev->dev; __s5p_sdout_probe(pdev, 0); __s5p_vp_probe(pdev, 1); __s5p_mixer_probe(pdev, 2); #ifdef CONFIG_CPU_S5PV210 tv_clk_get(pdev, &s5ptv_status); s5p_tv_clk_gate(true); #endif #ifdef CONFIG_CPU_S5PV210 __s5p_hdmi_probe(pdev, 3, 4); __s5p_hdcp_init(); #endif #ifdef FIX_27M_UNSTABLE_ISSUE /* for smdkc100 pop */ writel(0x1, S5PC1XX_GPA0_BASE + 0x56c); #endif #ifdef I2C_BASE /* for dev_dbg err. */ spin_lock_init(&slock_hpd); /* for bh */ INIT_WORK(&ws_hpd, (void *)set_ddc_port); #endif /* check EINT init state */ #ifdef CONFIG_MACH_STEALTHV gpio_set_value(GPIO_HDMI_EN1, 1); #endif s5ptv_status.hpd_status= 0; dev_info(&pdev->dev, "hpd status is cable %s\n", s5ptv_status.hpd_status ? "inserted":"removed"); /* interrupt */ TVOUT_IRQ_INIT(irq_num, ret, pdev, 0, out, __s5p_mixer_irq, "mixer"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 1, out_hdmi_irq, __s5p_hdmi_irq , "hdmi"); TVOUT_IRQ_INIT(irq_num, ret, pdev, 2, out_tvenc_irq, s5p_tvenc_irq, "tvenc"); /* v4l2 video device registration */ for (i = 0; i < S5P_TVMAX_CTRLS; i++) { s5ptv_status.video_dev[i] = &s5p_tvout[i]; if (video_register_device(s5ptv_status.video_dev[i], VFL_TYPE_GRABBER, s5p_tvout[i].minor) != 0) { dev_err(&pdev->dev, "Couldn't register tvout driver.\n"); return 0; } } #ifdef CONFIG_TV_FB mutex_init(&s5ptv_status.fb_lock); /* for default start up */ _s5p_tv_if_init_param(); s5ptv_status.tvout_param.disp_mode = TVOUT_720P_60; s5ptv_status.tvout_param.out_mode = TVOUT_OUTPUT_HDMI; #ifndef CONFIG_USER_ALLOC_TVOUT s5p_tv_clk_gate(true); if(s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_HDMI_RGB || s5ptv_status.tvout_param.out_mode == TVOUT_OUTPUT_DVI) tv_phy_power(true); _s5p_tv_if_set_disp(); #endif s5ptvfb_set_lcd_info(&s5ptv_status); /* prepare memory */ if (s5ptvfb_alloc_framebuffer()) goto err_alloc; if (s5ptvfb_register_framebuffer()) goto err_alloc; #ifndef CONFIG_USER_ALLOC_TVOUT s5ptvfb_display_on(&s5ptv_status); #endif #endif mutex_for_fo = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (mutex_for_fo == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); goto out; } #ifdef I2C_BASE mutex_for_i2c = kmalloc(sizeof(struct mutex), GFP_KERNEL); if (mutex_for_i2c == NULL) { dev_err(&pdev->dev, "failed to create mutex handle\n"); goto out; } mutex_init(mutex_for_i2c); #endif mutex_init(mutex_for_fo); #ifdef CONFIG_CPU_S5PV210 /* added for phy cut off when boot up */ clk_enable(s5ptv_status.i2c_phy_clk); __s5p_hdmi_phy_power(false); clk_disable(s5ptv_status.i2c_phy_clk); s5p_tv_clk_gate(false); #endif regulator_disable(s5ptv_status.tv_tv); regulator_disable(s5ptv_status.tv_tvout); printk("tv_base_probe is successfully\n"); return 0; #ifdef CONFIG_TV_FB err_alloc: #endif out_tvenc_irq: free_irq(IRQ_HDMI, pdev); out_hdmi_irq: free_irq(IRQ_MIXER, pdev); out: printk(KERN_ERR "not found (%d). \n", ret); return ret; }