diff options
Diffstat (limited to 'drivers/video/mx3fb.c')
| -rw-r--r-- | drivers/video/mx3fb.c | 86 |
1 files changed, 56 insertions, 30 deletions
diff --git a/drivers/video/mx3fb.c b/drivers/video/mx3fb.c index f8778cde2183..054ef29be479 100644 --- a/drivers/video/mx3fb.c +++ b/drivers/video/mx3fb.c | |||
| @@ -669,7 +669,8 @@ static uint32_t bpp_to_pixfmt(int bpp) | |||
| 669 | } | 669 | } |
| 670 | 670 | ||
| 671 | static int mx3fb_blank(int blank, struct fb_info *fbi); | 671 | static int mx3fb_blank(int blank, struct fb_info *fbi); |
| 672 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len); | 672 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len, |
| 673 | bool lock); | ||
| 673 | static int mx3fb_unmap_video_memory(struct fb_info *fbi); | 674 | static int mx3fb_unmap_video_memory(struct fb_info *fbi); |
| 674 | 675 | ||
| 675 | /** | 676 | /** |
| @@ -711,12 +712,7 @@ static void mx3fb_dma_done(void *arg) | |||
| 711 | complete(&mx3_fbi->flip_cmpl); | 712 | complete(&mx3_fbi->flip_cmpl); |
| 712 | } | 713 | } |
| 713 | 714 | ||
| 714 | /** | 715 | static int __set_par(struct fb_info *fbi, bool lock) |
| 715 | * mx3fb_set_par() - set framebuffer parameters and change the operating mode. | ||
| 716 | * @fbi: framebuffer information pointer. | ||
| 717 | * @return: 0 on success or negative error code on failure. | ||
| 718 | */ | ||
| 719 | static int mx3fb_set_par(struct fb_info *fbi) | ||
| 720 | { | 716 | { |
| 721 | u32 mem_len; | 717 | u32 mem_len; |
| 722 | struct ipu_di_signal_cfg sig_cfg; | 718 | struct ipu_di_signal_cfg sig_cfg; |
| @@ -727,10 +723,6 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 727 | struct idmac_video_param *video = &ichan->params.video; | 723 | struct idmac_video_param *video = &ichan->params.video; |
| 728 | struct scatterlist *sg = mx3_fbi->sg; | 724 | struct scatterlist *sg = mx3_fbi->sg; |
| 729 | 725 | ||
| 730 | dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+'); | ||
| 731 | |||
| 732 | mutex_lock(&mx3_fbi->mutex); | ||
| 733 | |||
| 734 | /* Total cleanup */ | 726 | /* Total cleanup */ |
| 735 | if (mx3_fbi->txd) | 727 | if (mx3_fbi->txd) |
| 736 | sdc_disable_channel(mx3_fbi); | 728 | sdc_disable_channel(mx3_fbi); |
| @@ -742,10 +734,8 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 742 | if (fbi->fix.smem_start) | 734 | if (fbi->fix.smem_start) |
| 743 | mx3fb_unmap_video_memory(fbi); | 735 | mx3fb_unmap_video_memory(fbi); |
| 744 | 736 | ||
| 745 | if (mx3fb_map_video_memory(fbi, mem_len) < 0) { | 737 | if (mx3fb_map_video_memory(fbi, mem_len, lock) < 0) |
| 746 | mutex_unlock(&mx3_fbi->mutex); | ||
| 747 | return -ENOMEM; | 738 | return -ENOMEM; |
| 748 | } | ||
| 749 | } | 739 | } |
| 750 | 740 | ||
| 751 | sg_init_table(&sg[0], 1); | 741 | sg_init_table(&sg[0], 1); |
| @@ -791,7 +781,6 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 791 | fbi->var.vsync_len, | 781 | fbi->var.vsync_len, |
| 792 | fbi->var.lower_margin + | 782 | fbi->var.lower_margin + |
| 793 | fbi->var.vsync_len, sig_cfg) != 0) { | 783 | fbi->var.vsync_len, sig_cfg) != 0) { |
| 794 | mutex_unlock(&mx3_fbi->mutex); | ||
| 795 | dev_err(fbi->device, | 784 | dev_err(fbi->device, |
| 796 | "mx3fb: Error initializing panel.\n"); | 785 | "mx3fb: Error initializing panel.\n"); |
| 797 | return -EINVAL; | 786 | return -EINVAL; |
| @@ -810,9 +799,30 @@ static int mx3fb_set_par(struct fb_info *fbi) | |||
| 810 | if (mx3_fbi->blank == FB_BLANK_UNBLANK) | 799 | if (mx3_fbi->blank == FB_BLANK_UNBLANK) |
| 811 | sdc_enable_channel(mx3_fbi); | 800 | sdc_enable_channel(mx3_fbi); |
| 812 | 801 | ||
| 802 | return 0; | ||
| 803 | } | ||
| 804 | |||
| 805 | /** | ||
| 806 | * mx3fb_set_par() - set framebuffer parameters and change the operating mode. | ||
| 807 | * @fbi: framebuffer information pointer. | ||
| 808 | * @return: 0 on success or negative error code on failure. | ||
| 809 | */ | ||
| 810 | static int mx3fb_set_par(struct fb_info *fbi) | ||
| 811 | { | ||
| 812 | struct mx3fb_info *mx3_fbi = fbi->par; | ||
| 813 | struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; | ||
| 814 | struct idmac_channel *ichan = mx3_fbi->idmac_channel; | ||
| 815 | int ret; | ||
| 816 | |||
| 817 | dev_dbg(mx3fb->dev, "%s [%c]\n", __func__, list_empty(&ichan->queue) ? '-' : '+'); | ||
| 818 | |||
| 819 | mutex_lock(&mx3_fbi->mutex); | ||
| 820 | |||
| 821 | ret = __set_par(fbi, true); | ||
| 822 | |||
| 813 | mutex_unlock(&mx3_fbi->mutex); | 823 | mutex_unlock(&mx3_fbi->mutex); |
| 814 | 824 | ||
| 815 | return 0; | 825 | return ret; |
| 816 | } | 826 | } |
| 817 | 827 | ||
| 818 | /** | 828 | /** |
| @@ -966,21 +976,11 @@ static int mx3fb_setcolreg(unsigned int regno, unsigned int red, | |||
| 966 | return ret; | 976 | return ret; |
| 967 | } | 977 | } |
| 968 | 978 | ||
| 969 | /** | 979 | static void __blank(int blank, struct fb_info *fbi) |
| 970 | * mx3fb_blank() - blank the display. | ||
| 971 | */ | ||
| 972 | static int mx3fb_blank(int blank, struct fb_info *fbi) | ||
| 973 | { | 980 | { |
| 974 | struct mx3fb_info *mx3_fbi = fbi->par; | 981 | struct mx3fb_info *mx3_fbi = fbi->par; |
| 975 | struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; | 982 | struct mx3fb_data *mx3fb = mx3_fbi->mx3fb; |
| 976 | 983 | ||
| 977 | dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__, | ||
| 978 | blank, fbi->screen_base, fbi->fix.smem_len); | ||
| 979 | |||
| 980 | if (mx3_fbi->blank == blank) | ||
| 981 | return 0; | ||
| 982 | |||
| 983 | mutex_lock(&mx3_fbi->mutex); | ||
| 984 | mx3_fbi->blank = blank; | 984 | mx3_fbi->blank = blank; |
| 985 | 985 | ||
| 986 | switch (blank) { | 986 | switch (blank) { |
| @@ -999,6 +999,23 @@ static int mx3fb_blank(int blank, struct fb_info *fbi) | |||
| 999 | sdc_set_brightness(mx3fb, mx3fb->backlight_level); | 999 | sdc_set_brightness(mx3fb, mx3fb->backlight_level); |
| 1000 | break; | 1000 | break; |
| 1001 | } | 1001 | } |
| 1002 | } | ||
| 1003 | |||
| 1004 | /** | ||
| 1005 | * mx3fb_blank() - blank the display. | ||
| 1006 | */ | ||
| 1007 | static int mx3fb_blank(int blank, struct fb_info *fbi) | ||
| 1008 | { | ||
| 1009 | struct mx3fb_info *mx3_fbi = fbi->par; | ||
| 1010 | |||
| 1011 | dev_dbg(fbi->device, "%s, blank = %d, base %p, len %u\n", __func__, | ||
| 1012 | blank, fbi->screen_base, fbi->fix.smem_len); | ||
| 1013 | |||
| 1014 | if (mx3_fbi->blank == blank) | ||
| 1015 | return 0; | ||
| 1016 | |||
| 1017 | mutex_lock(&mx3_fbi->mutex); | ||
| 1018 | __blank(blank, fbi); | ||
| 1002 | mutex_unlock(&mx3_fbi->mutex); | 1019 | mutex_unlock(&mx3_fbi->mutex); |
| 1003 | 1020 | ||
| 1004 | return 0; | 1021 | return 0; |
| @@ -1198,6 +1215,7 @@ static int mx3fb_resume(struct platform_device *pdev) | |||
| 1198 | * mx3fb_map_video_memory() - allocates the DRAM memory for the frame buffer. | 1215 | * mx3fb_map_video_memory() - allocates the DRAM memory for the frame buffer. |
| 1199 | * @fbi: framebuffer information pointer | 1216 | * @fbi: framebuffer information pointer |
| 1200 | * @mem_len: length of mapped memory | 1217 | * @mem_len: length of mapped memory |
| 1218 | * @lock: do not lock during initialisation | ||
| 1201 | * @return: Error code indicating success or failure | 1219 | * @return: Error code indicating success or failure |
| 1202 | * | 1220 | * |
| 1203 | * This buffer is remapped into a non-cached, non-buffered, memory region to | 1221 | * This buffer is remapped into a non-cached, non-buffered, memory region to |
| @@ -1205,7 +1223,8 @@ static int mx3fb_resume(struct platform_device *pdev) | |||
| 1205 | * area is remapped, all virtual memory access to the video memory should occur | 1223 | * area is remapped, all virtual memory access to the video memory should occur |
| 1206 | * at the new region. | 1224 | * at the new region. |
| 1207 | */ | 1225 | */ |
| 1208 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len) | 1226 | static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len, |
| 1227 | bool lock) | ||
| 1209 | { | 1228 | { |
| 1210 | int retval = 0; | 1229 | int retval = 0; |
| 1211 | dma_addr_t addr; | 1230 | dma_addr_t addr; |
| @@ -1221,10 +1240,12 @@ static int mx3fb_map_video_memory(struct fb_info *fbi, unsigned int mem_len) | |||
| 1221 | goto err0; | 1240 | goto err0; |
| 1222 | } | 1241 | } |
| 1223 | 1242 | ||
| 1224 | mutex_lock(&fbi->mm_lock); | 1243 | if (lock) |
| 1244 | mutex_lock(&fbi->mm_lock); | ||
| 1225 | fbi->fix.smem_start = addr; | 1245 | fbi->fix.smem_start = addr; |
| 1226 | fbi->fix.smem_len = mem_len; | 1246 | fbi->fix.smem_len = mem_len; |
| 1227 | mutex_unlock(&fbi->mm_lock); | 1247 | if (lock) |
| 1248 | mutex_unlock(&fbi->mm_lock); | ||
| 1228 | 1249 | ||
| 1229 | dev_dbg(fbi->device, "allocated fb @ p=0x%08x, v=0x%p, size=%d.\n", | 1250 | dev_dbg(fbi->device, "allocated fb @ p=0x%08x, v=0x%p, size=%d.\n", |
| 1230 | (uint32_t) fbi->fix.smem_start, fbi->screen_base, fbi->fix.smem_len); | 1251 | (uint32_t) fbi->fix.smem_start, fbi->screen_base, fbi->fix.smem_len); |
| @@ -1365,6 +1386,11 @@ static int init_fb_chan(struct mx3fb_data *mx3fb, struct idmac_channel *ichan) | |||
| 1365 | init_completion(&mx3fbi->flip_cmpl); | 1386 | init_completion(&mx3fbi->flip_cmpl); |
| 1366 | disable_irq(ichan->eof_irq); | 1387 | disable_irq(ichan->eof_irq); |
| 1367 | dev_dbg(mx3fb->dev, "disabling irq %d\n", ichan->eof_irq); | 1388 | dev_dbg(mx3fb->dev, "disabling irq %d\n", ichan->eof_irq); |
| 1389 | ret = __set_par(fbi, false); | ||
| 1390 | if (ret < 0) | ||
| 1391 | goto esetpar; | ||
| 1392 | |||
| 1393 | __blank(FB_BLANK_UNBLANK, fbi); | ||
| 1368 | 1394 | ||
| 1369 | dev_info(dev, "registered, using mode %s\n", fb_mode); | 1395 | dev_info(dev, "registered, using mode %s\n", fb_mode); |
| 1370 | 1396 | ||
