diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-06-30 18:07:09 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2010-06-30 18:07:09 -0400 |
commit | 08fa16b6b75005c120b59d00ae42a0b7cc68db45 (patch) | |
tree | c5f22412467f72dd0c7291bbb958a9485e894f02 /drivers/video | |
parent | 1796b983cc4cbbed5e9e478b03591609a2c21987 (diff) | |
parent | 7e27d6e778cd87b6f2415515d7127eba53fe5d02 (diff) |
Merge commit 'v2.6.35-rc3' into next
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/Kconfig | 6 | ||||
-rw-r--r-- | drivers/video/aty/mach64_accel.c | 9 | ||||
-rw-r--r-- | drivers/video/backlight/adp8860_bl.c | 2 | ||||
-rw-r--r-- | drivers/video/backlight/tosa_bl.c | 2 | ||||
-rw-r--r-- | drivers/video/bw2.c | 2 | ||||
-rw-r--r-- | drivers/video/cg14.c | 2 | ||||
-rw-r--r-- | drivers/video/cg3.c | 2 | ||||
-rw-r--r-- | drivers/video/fb_defio.c | 52 | ||||
-rw-r--r-- | drivers/video/leo.c | 2 | ||||
-rw-r--r-- | drivers/video/mb862xx/mb862xxfb.c | 2 | ||||
-rw-r--r-- | drivers/video/p9100.c | 2 | ||||
-rw-r--r-- | drivers/video/sh_mobile_lcdcfb.c | 6 | ||||
-rw-r--r-- | drivers/video/tcx.c | 2 |
13 files changed, 38 insertions, 53 deletions
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig index 1e6fec487973..3d94a1471724 100644 --- a/drivers/video/Kconfig +++ b/drivers/video/Kconfig | |||
@@ -8,6 +8,9 @@ menu "Graphics support" | |||
8 | config HAVE_FB_ATMEL | 8 | config HAVE_FB_ATMEL |
9 | bool | 9 | bool |
10 | 10 | ||
11 | config HAVE_FB_IMX | ||
12 | bool | ||
13 | |||
11 | source "drivers/char/agp/Kconfig" | 14 | source "drivers/char/agp/Kconfig" |
12 | 15 | ||
13 | source "drivers/gpu/vga/Kconfig" | 16 | source "drivers/gpu/vga/Kconfig" |
@@ -400,9 +403,6 @@ config FB_SA1100 | |||
400 | If you plan to use the LCD display with your SA-1100 system, say | 403 | If you plan to use the LCD display with your SA-1100 system, say |
401 | Y here. | 404 | Y here. |
402 | 405 | ||
403 | config HAVE_FB_IMX | ||
404 | bool | ||
405 | |||
406 | config FB_IMX | 406 | config FB_IMX |
407 | tristate "Motorola i.MX LCD support" | 407 | tristate "Motorola i.MX LCD support" |
408 | depends on FB && (HAVE_FB_IMX || ARCH_MX1 || ARCH_MX2) | 408 | depends on FB && (HAVE_FB_IMX || ARCH_MX1 || ARCH_MX2) |
diff --git a/drivers/video/aty/mach64_accel.c b/drivers/video/aty/mach64_accel.c index 51fcc0a2c94a..e45833ce975b 100644 --- a/drivers/video/aty/mach64_accel.c +++ b/drivers/video/aty/mach64_accel.c | |||
@@ -242,7 +242,7 @@ void atyfb_copyarea(struct fb_info *info, const struct fb_copyarea *area) | |||
242 | void atyfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | 242 | void atyfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) |
243 | { | 243 | { |
244 | struct atyfb_par *par = (struct atyfb_par *) info->par; | 244 | struct atyfb_par *par = (struct atyfb_par *) info->par; |
245 | u32 color = rect->color, dx = rect->dx, width = rect->width, rotation = 0; | 245 | u32 color, dx = rect->dx, width = rect->width, rotation = 0; |
246 | 246 | ||
247 | if (par->asleep) | 247 | if (par->asleep) |
248 | return; | 248 | return; |
@@ -253,8 +253,11 @@ void atyfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) | |||
253 | return; | 253 | return; |
254 | } | 254 | } |
255 | 255 | ||
256 | color |= (rect->color << 8); | 256 | if (info->fix.visual == FB_VISUAL_TRUECOLOR || |
257 | color |= (rect->color << 16); | 257 | info->fix.visual == FB_VISUAL_DIRECTCOLOR) |
258 | color = ((u32 *)(info->pseudo_palette))[rect->color]; | ||
259 | else | ||
260 | color = rect->color; | ||
258 | 261 | ||
259 | if (info->var.bits_per_pixel == 24) { | 262 | if (info->var.bits_per_pixel == 24) { |
260 | /* In 24 bpp, the engine is in 8 bpp - this requires that all */ | 263 | /* In 24 bpp, the engine is in 8 bpp - this requires that all */ |
diff --git a/drivers/video/backlight/adp8860_bl.c b/drivers/video/backlight/adp8860_bl.c index 921ca37398f3..3ec24609151e 100644 --- a/drivers/video/backlight/adp8860_bl.c +++ b/drivers/video/backlight/adp8860_bl.c | |||
@@ -756,7 +756,6 @@ out: | |||
756 | out1: | 756 | out1: |
757 | backlight_device_unregister(bl); | 757 | backlight_device_unregister(bl); |
758 | out2: | 758 | out2: |
759 | i2c_set_clientdata(client, NULL); | ||
760 | kfree(data); | 759 | kfree(data); |
761 | 760 | ||
762 | return ret; | 761 | return ret; |
@@ -776,7 +775,6 @@ static int __devexit adp8860_remove(struct i2c_client *client) | |||
776 | &adp8860_bl_attr_group); | 775 | &adp8860_bl_attr_group); |
777 | 776 | ||
778 | backlight_device_unregister(data->bl); | 777 | backlight_device_unregister(data->bl); |
779 | i2c_set_clientdata(client, NULL); | ||
780 | kfree(data); | 778 | kfree(data); |
781 | 779 | ||
782 | return 0; | 780 | return 0; |
diff --git a/drivers/video/backlight/tosa_bl.c b/drivers/video/backlight/tosa_bl.c index e03e60bbfd85..2a04b382ec48 100644 --- a/drivers/video/backlight/tosa_bl.c +++ b/drivers/video/backlight/tosa_bl.c | |||
@@ -119,7 +119,6 @@ static int __devinit tosa_bl_probe(struct i2c_client *client, | |||
119 | 119 | ||
120 | err_reg: | 120 | err_reg: |
121 | data->bl = NULL; | 121 | data->bl = NULL; |
122 | i2c_set_clientdata(client, NULL); | ||
123 | err_gpio_dir: | 122 | err_gpio_dir: |
124 | gpio_free(TOSA_GPIO_BL_C20MA); | 123 | gpio_free(TOSA_GPIO_BL_C20MA); |
125 | err_gpio_bl: | 124 | err_gpio_bl: |
@@ -133,7 +132,6 @@ static int __devexit tosa_bl_remove(struct i2c_client *client) | |||
133 | 132 | ||
134 | backlight_device_unregister(data->bl); | 133 | backlight_device_unregister(data->bl); |
135 | data->bl = NULL; | 134 | data->bl = NULL; |
136 | i2c_set_clientdata(client, NULL); | ||
137 | 135 | ||
138 | gpio_free(TOSA_GPIO_BL_C20MA); | 136 | gpio_free(TOSA_GPIO_BL_C20MA); |
139 | 137 | ||
diff --git a/drivers/video/bw2.c b/drivers/video/bw2.c index 2c371c07f0da..09f1b9b462f4 100644 --- a/drivers/video/bw2.c +++ b/drivers/video/bw2.c | |||
@@ -275,7 +275,7 @@ static int __devinit bw2_do_default_mode(struct bw2_par *par, | |||
275 | 275 | ||
276 | static int __devinit bw2_probe(struct of_device *op, const struct of_device_id *match) | 276 | static int __devinit bw2_probe(struct of_device *op, const struct of_device_id *match) |
277 | { | 277 | { |
278 | struct device_node *dp = op->node; | 278 | struct device_node *dp = op->dev.of_node; |
279 | struct fb_info *info; | 279 | struct fb_info *info; |
280 | struct bw2_par *par; | 280 | struct bw2_par *par; |
281 | int linebytes, err; | 281 | int linebytes, err; |
diff --git a/drivers/video/cg14.c b/drivers/video/cg14.c index d12e05b6e63f..e5dc2241194f 100644 --- a/drivers/video/cg14.c +++ b/drivers/video/cg14.c | |||
@@ -465,7 +465,7 @@ static void cg14_unmap_regs(struct of_device *op, struct fb_info *info, | |||
465 | 465 | ||
466 | static int __devinit cg14_probe(struct of_device *op, const struct of_device_id *match) | 466 | static int __devinit cg14_probe(struct of_device *op, const struct of_device_id *match) |
467 | { | 467 | { |
468 | struct device_node *dp = op->node; | 468 | struct device_node *dp = op->dev.of_node; |
469 | struct fb_info *info; | 469 | struct fb_info *info; |
470 | struct cg14_par *par; | 470 | struct cg14_par *par; |
471 | int is_8mb, linebytes, i, err; | 471 | int is_8mb, linebytes, i, err; |
diff --git a/drivers/video/cg3.c b/drivers/video/cg3.c index b98f93f7f663..558d73a948a0 100644 --- a/drivers/video/cg3.c +++ b/drivers/video/cg3.c | |||
@@ -349,7 +349,7 @@ static int __devinit cg3_do_default_mode(struct cg3_par *par) | |||
349 | static int __devinit cg3_probe(struct of_device *op, | 349 | static int __devinit cg3_probe(struct of_device *op, |
350 | const struct of_device_id *match) | 350 | const struct of_device_id *match) |
351 | { | 351 | { |
352 | struct device_node *dp = op->node; | 352 | struct device_node *dp = op->dev.of_node; |
353 | struct fb_info *info; | 353 | struct fb_info *info; |
354 | struct cg3_par *par; | 354 | struct cg3_par *par; |
355 | int linebytes, err; | 355 | int linebytes, err; |
diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c index 073c9b408cf7..6b93ef93cb12 100644 --- a/drivers/video/fb_defio.c +++ b/drivers/video/fb_defio.c | |||
@@ -100,6 +100,16 @@ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma, | |||
100 | /* protect against the workqueue changing the page list */ | 100 | /* protect against the workqueue changing the page list */ |
101 | mutex_lock(&fbdefio->lock); | 101 | mutex_lock(&fbdefio->lock); |
102 | 102 | ||
103 | /* | ||
104 | * We want the page to remain locked from ->page_mkwrite until | ||
105 | * the PTE is marked dirty to avoid page_mkclean() being called | ||
106 | * before the PTE is updated, which would leave the page ignored | ||
107 | * by defio. | ||
108 | * Do this by locking the page here and informing the caller | ||
109 | * about it with VM_FAULT_LOCKED. | ||
110 | */ | ||
111 | lock_page(page); | ||
112 | |||
103 | /* we loop through the pagelist before adding in order | 113 | /* we loop through the pagelist before adding in order |
104 | to keep the pagelist sorted */ | 114 | to keep the pagelist sorted */ |
105 | list_for_each_entry(cur, &fbdefio->pagelist, lru) { | 115 | list_for_each_entry(cur, &fbdefio->pagelist, lru) { |
@@ -121,7 +131,7 @@ page_already_added: | |||
121 | 131 | ||
122 | /* come back after delay to process the deferred IO */ | 132 | /* come back after delay to process the deferred IO */ |
123 | schedule_delayed_work(&info->deferred_work, fbdefio->delay); | 133 | schedule_delayed_work(&info->deferred_work, fbdefio->delay); |
124 | return 0; | 134 | return VM_FAULT_LOCKED; |
125 | } | 135 | } |
126 | 136 | ||
127 | static const struct vm_operations_struct fb_deferred_io_vm_ops = { | 137 | static const struct vm_operations_struct fb_deferred_io_vm_ops = { |
@@ -155,41 +165,25 @@ static void fb_deferred_io_work(struct work_struct *work) | |||
155 | { | 165 | { |
156 | struct fb_info *info = container_of(work, struct fb_info, | 166 | struct fb_info *info = container_of(work, struct fb_info, |
157 | deferred_work.work); | 167 | deferred_work.work); |
168 | struct list_head *node, *next; | ||
169 | struct page *cur; | ||
158 | struct fb_deferred_io *fbdefio = info->fbdefio; | 170 | struct fb_deferred_io *fbdefio = info->fbdefio; |
159 | struct page *page, *tmp_page; | ||
160 | struct list_head *node, *tmp_node; | ||
161 | struct list_head non_dirty; | ||
162 | |||
163 | INIT_LIST_HEAD(&non_dirty); | ||
164 | 171 | ||
165 | /* here we mkclean the pages, then do all deferred IO */ | 172 | /* here we mkclean the pages, then do all deferred IO */ |
166 | mutex_lock(&fbdefio->lock); | 173 | mutex_lock(&fbdefio->lock); |
167 | list_for_each_entry_safe(page, tmp_page, &fbdefio->pagelist, lru) { | 174 | list_for_each_entry(cur, &fbdefio->pagelist, lru) { |
168 | lock_page(page); | 175 | lock_page(cur); |
169 | /* | 176 | page_mkclean(cur); |
170 | * The workqueue callback can be triggered after a | 177 | unlock_page(cur); |
171 | * ->page_mkwrite() call but before the PTE has been marked | ||
172 | * dirty. In this case page_mkclean() won't "rearm" the page. | ||
173 | * | ||
174 | * To avoid this, remove those "non-dirty" pages from the | ||
175 | * pagelist before calling the driver's callback, then add | ||
176 | * them back to get processed on the next work iteration. | ||
177 | * At that time, their PTEs will hopefully be dirty for real. | ||
178 | */ | ||
179 | if (!page_mkclean(page)) | ||
180 | list_move_tail(&page->lru, &non_dirty); | ||
181 | unlock_page(page); | ||
182 | } | 178 | } |
183 | 179 | ||
184 | /* driver's callback with pagelist */ | 180 | /* driver's callback with pagelist */ |
185 | fbdefio->deferred_io(info, &fbdefio->pagelist); | 181 | fbdefio->deferred_io(info, &fbdefio->pagelist); |
186 | 182 | ||
187 | /* clear the list... */ | 183 | /* clear the list */ |
188 | list_for_each_safe(node, tmp_node, &fbdefio->pagelist) { | 184 | list_for_each_safe(node, next, &fbdefio->pagelist) { |
189 | list_del(node); | 185 | list_del(node); |
190 | } | 186 | } |
191 | /* ... and add back the "non-dirty" pages to the list */ | ||
192 | list_splice_tail(&non_dirty, &fbdefio->pagelist); | ||
193 | mutex_unlock(&fbdefio->lock); | 187 | mutex_unlock(&fbdefio->lock); |
194 | } | 188 | } |
195 | 189 | ||
@@ -218,7 +212,6 @@ EXPORT_SYMBOL_GPL(fb_deferred_io_open); | |||
218 | void fb_deferred_io_cleanup(struct fb_info *info) | 212 | void fb_deferred_io_cleanup(struct fb_info *info) |
219 | { | 213 | { |
220 | struct fb_deferred_io *fbdefio = info->fbdefio; | 214 | struct fb_deferred_io *fbdefio = info->fbdefio; |
221 | struct list_head *node, *tmp_node; | ||
222 | struct page *page; | 215 | struct page *page; |
223 | int i; | 216 | int i; |
224 | 217 | ||
@@ -226,13 +219,6 @@ void fb_deferred_io_cleanup(struct fb_info *info) | |||
226 | cancel_delayed_work(&info->deferred_work); | 219 | cancel_delayed_work(&info->deferred_work); |
227 | flush_scheduled_work(); | 220 | flush_scheduled_work(); |
228 | 221 | ||
229 | /* the list may have still some non-dirty pages at this point */ | ||
230 | mutex_lock(&fbdefio->lock); | ||
231 | list_for_each_safe(node, tmp_node, &fbdefio->pagelist) { | ||
232 | list_del(node); | ||
233 | } | ||
234 | mutex_unlock(&fbdefio->lock); | ||
235 | |||
236 | /* clear out the mapping that we setup */ | 222 | /* clear out the mapping that we setup */ |
237 | for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) { | 223 | for (i = 0 ; i < info->fix.smem_len; i += PAGE_SIZE) { |
238 | page = fb_deferred_io_page(info, i); | 224 | page = fb_deferred_io_page(info, i); |
diff --git a/drivers/video/leo.c b/drivers/video/leo.c index 3d7895316eaf..9e8bf7d5e249 100644 --- a/drivers/video/leo.c +++ b/drivers/video/leo.c | |||
@@ -550,7 +550,7 @@ static void leo_unmap_regs(struct of_device *op, struct fb_info *info, | |||
550 | static int __devinit leo_probe(struct of_device *op, | 550 | static int __devinit leo_probe(struct of_device *op, |
551 | const struct of_device_id *match) | 551 | const struct of_device_id *match) |
552 | { | 552 | { |
553 | struct device_node *dp = op->node; | 553 | struct device_node *dp = op->dev.of_node; |
554 | struct fb_info *info; | 554 | struct fb_info *info; |
555 | struct leo_par *par; | 555 | struct leo_par *par; |
556 | int linebytes, err; | 556 | int linebytes, err; |
diff --git a/drivers/video/mb862xx/mb862xxfb.c b/drivers/video/mb862xx/mb862xxfb.c index 0540de4f5cb4..4e2b8cc3d460 100644 --- a/drivers/video/mb862xx/mb862xxfb.c +++ b/drivers/video/mb862xx/mb862xxfb.c | |||
@@ -553,7 +553,7 @@ static int mb862xx_gdc_init(struct mb862xxfb_par *par) | |||
553 | static int __devinit of_platform_mb862xx_probe(struct of_device *ofdev, | 553 | static int __devinit of_platform_mb862xx_probe(struct of_device *ofdev, |
554 | const struct of_device_id *id) | 554 | const struct of_device_id *id) |
555 | { | 555 | { |
556 | struct device_node *np = ofdev->node; | 556 | struct device_node *np = ofdev->dev.of_node; |
557 | struct device *dev = &ofdev->dev; | 557 | struct device *dev = &ofdev->dev; |
558 | struct mb862xxfb_par *par; | 558 | struct mb862xxfb_par *par; |
559 | struct fb_info *info; | 559 | struct fb_info *info; |
diff --git a/drivers/video/p9100.c b/drivers/video/p9100.c index c85dd408a9b8..6552751e81aa 100644 --- a/drivers/video/p9100.c +++ b/drivers/video/p9100.c | |||
@@ -251,7 +251,7 @@ static void p9100_init_fix(struct fb_info *info, int linebytes, struct device_no | |||
251 | 251 | ||
252 | static int __devinit p9100_probe(struct of_device *op, const struct of_device_id *match) | 252 | static int __devinit p9100_probe(struct of_device *op, const struct of_device_id *match) |
253 | { | 253 | { |
254 | struct device_node *dp = op->node; | 254 | struct device_node *dp = op->dev.of_node; |
255 | struct fb_info *info; | 255 | struct fb_info *info; |
256 | struct p9100_par *par; | 256 | struct p9100_par *par; |
257 | int linebytes, err; | 257 | int linebytes, err; |
diff --git a/drivers/video/sh_mobile_lcdcfb.c b/drivers/video/sh_mobile_lcdcfb.c index e8c769944812..12c451a711e9 100644 --- a/drivers/video/sh_mobile_lcdcfb.c +++ b/drivers/video/sh_mobile_lcdcfb.c | |||
@@ -991,13 +991,13 @@ static int __devinit sh_mobile_lcdc_probe(struct platform_device *pdev) | |||
991 | priv->ch[j].lcdc = priv; | 991 | priv->ch[j].lcdc = priv; |
992 | memcpy(&priv->ch[j].cfg, &pdata->ch[i], sizeof(pdata->ch[i])); | 992 | memcpy(&priv->ch[j].cfg, &pdata->ch[i], sizeof(pdata->ch[i])); |
993 | 993 | ||
994 | error = sh_mobile_lcdc_check_interface(&priv->ch[i]); | 994 | error = sh_mobile_lcdc_check_interface(&priv->ch[j]); |
995 | if (error) { | 995 | if (error) { |
996 | dev_err(&pdev->dev, "unsupported interface type\n"); | 996 | dev_err(&pdev->dev, "unsupported interface type\n"); |
997 | goto err1; | 997 | goto err1; |
998 | } | 998 | } |
999 | init_waitqueue_head(&priv->ch[i].frame_end_wait); | 999 | init_waitqueue_head(&priv->ch[j].frame_end_wait); |
1000 | init_completion(&priv->ch[i].vsync_completion); | 1000 | init_completion(&priv->ch[j].vsync_completion); |
1001 | priv->ch[j].pan_offset = 0; | 1001 | priv->ch[j].pan_offset = 0; |
1002 | 1002 | ||
1003 | switch (pdata->ch[i].chan) { | 1003 | switch (pdata->ch[i].chan) { |
diff --git a/drivers/video/tcx.c b/drivers/video/tcx.c index ef7a7bd8b503..cc039b33d2d8 100644 --- a/drivers/video/tcx.c +++ b/drivers/video/tcx.c | |||
@@ -365,7 +365,7 @@ static void tcx_unmap_regs(struct of_device *op, struct fb_info *info, | |||
365 | static int __devinit tcx_probe(struct of_device *op, | 365 | static int __devinit tcx_probe(struct of_device *op, |
366 | const struct of_device_id *match) | 366 | const struct of_device_id *match) |
367 | { | 367 | { |
368 | struct device_node *dp = op->node; | 368 | struct device_node *dp = op->dev.of_node; |
369 | struct fb_info *info; | 369 | struct fb_info *info; |
370 | struct tcx_par *par; | 370 | struct tcx_par *par; |
371 | int linebytes, i, err; | 371 | int linebytes, i, err; |