Date: | 2013-04-28 12:04:29 (10 years 1 month ago) |
---|---|
Author: | Lars C. |
Commit: | 5f643f5f15e6a2532a114e67e0751c53142b1767 |
Message: | slcd: Use generic dmaengine interface |
Files: |
drivers/video/jz4740_slcd.h (2 diffs) drivers/video/jz4740_slcd_fb.c (5 diffs) |
Change Details
drivers/video/jz4740_slcd.h | ||
---|---|---|
18 | 18 | #include <linux/gpio.h> |
19 | 19 | #include <linux/mutex.h> |
20 | 20 | #include <linux/workqueue.h> |
21 | #include <linux/dmaengine.h> | |
21 | 22 | |
22 | 23 | /************************************************************************* |
23 | 24 | * SLCD (Smart LCD Controller) |
... | ... | |
98 | 99 | struct jzfb_framedesc (*framedesc)[3]; |
99 | 100 | dma_addr_t framedesc_phys; |
100 | 101 | |
101 | struct jz4740_dma_chan *dma; | |
102 | struct dma_chan *dma; | |
102 | 103 | struct completion dma_completion; |
103 | 104 | unsigned refresh_on_pan:1; |
104 | 105 |
drivers/video/jz4740_slcd_fb.c | ||
---|---|---|
224 | 224 | return 0; |
225 | 225 | } |
226 | 226 | |
227 | static void jzfb_refresh_work_complete(void *param) | |
228 | { | |
229 | struct jzfb *jzfb = param; | |
230 | complete_all(&jzfb->dma_completion); | |
231 | } | |
232 | ||
227 | 233 | static void jzfb_disable_dma(struct jzfb *jzfb) |
228 | 234 | { |
229 | jz4740_dma_disable(jzfb->dma); | |
235 | dmaengine_terminate_all(jzfb->dma); | |
230 | 236 | while (readb(jzfb->base + JZ_REG_SLCD_STATE) & SLCD_STATE_BUSY); |
231 | 237 | writeb(readb(jzfb->base + JZ_REG_SLCD_CTRL) & ~SLCD_CTRL_DMA_EN, |
232 | 238 | jzfb->base + JZ_REG_SLCD_CTRL); |
233 | 239 | } |
234 | 240 | |
235 | static struct jz4740_dma_config jzfb_slcd_dma_config = { | |
236 | .src_width = JZ4740_DMA_WIDTH_32BIT, | |
237 | .dst_width = JZ4740_DMA_WIDTH_16BIT, | |
238 | .transfer_size = JZ4740_DMA_TRANSFER_SIZE_16BYTE, | |
239 | .request_type = JZ4740_DMA_TYPE_SLCD, | |
240 | .flags = JZ4740_DMA_SRC_AUTOINC, | |
241 | .mode = JZ4740_DMA_MODE_BLOCK, | |
242 | }; | |
243 | ||
244 | 241 | static void jzfb_upload_frame_dma(struct jzfb *jzfb) |
245 | 242 | { |
246 | 243 | struct fb_info *fb = jzfb->fb; |
247 | 244 | struct fb_videomode *mode = fb->mode; |
248 | 245 | __u32 offset = fb->fix.line_length * fb->var.yoffset; |
249 | 246 | __u32 size = fb->fix.line_length * mode->yres; |
247 | struct dma_async_tx_descriptor *desc; | |
250 | 248 | |
251 | 249 | /* Ensure that the data to be uploaded is in memory. */ |
252 | 250 | dma_cache_sync(fb->device, jzfb->vidmem + offset, size, |
253 | 251 | DMA_TO_DEVICE); |
254 | 252 | |
255 | jz4740_dma_set_src_addr(jzfb->dma, jzfb->vidmem_phys + offset); | |
256 | jz4740_dma_set_dst_addr(jzfb->dma, | |
257 | CPHYSADDR(jzfb->base + JZ_REG_SLCD_FIFO)); | |
258 | jz4740_dma_set_transfer_count(jzfb->dma, size); | |
253 | desc = dmaengine_prep_slave_single(jzfb->dma, DMA_MEM_TO_DEV, | |
254 | jzfb->vidmem_phys + offset, size, DMA_PREP_INTERRUPT); | |
255 | if (!desc) | |
256 | return; | |
257 | ||
258 | desc->callback = jzfb_refresh_work_complete; | |
259 | desc->callback_param = jzfb; | |
260 | dmaengine_submit(desc); | |
259 | 261 | |
260 | 262 | while (readb(jzfb->base + JZ_REG_SLCD_STATE) & SLCD_STATE_BUSY); |
261 | 263 | writeb(readb(jzfb->base + JZ_REG_SLCD_CTRL) | SLCD_CTRL_DMA_EN, |
262 | 264 | jzfb->base + JZ_REG_SLCD_CTRL); |
263 | jz4740_dma_enable(jzfb->dma); | |
265 | dma_async_issue_pending(jzfb->dma); | |
264 | 266 | } |
265 | 267 | |
266 | 268 | static void jzfb_upload_frame_cpu(struct jzfb *jzfb) |
... | ... | |
847 | 849 | struct jzfb *jzfb; |
848 | 850 | struct fb_info *fb; |
849 | 851 | struct jz4740_fb_platform_data *pdata = pdev->dev.platform_data; |
852 | struct dma_slave_config config; | |
850 | 853 | struct resource *mem; |
854 | dma_cap_mask_t dma_mask; | |
851 | 855 | |
852 | 856 | if (!pdata) { |
853 | 857 | dev_err(&pdev->dev, "Missing platform data\n"); |
... | ... | |
881 | 885 | init_completion(&jzfb->dma_completion); |
882 | 886 | complete_all(&jzfb->dma_completion); |
883 | 887 | |
884 | jzfb->dma = jz4740_dma_request(&pdev->dev, dev_name(&pdev->dev), 0); | |
888 | dma_cap_zero(dma_mask); | |
889 | dma_cap_set(DMA_SLAVE, dma_mask); | |
890 | ||
891 | jzfb->dma = dma_request_channel(dma_mask, NULL, NULL); | |
885 | 892 | if (!jzfb->dma) { |
886 | 893 | dev_err(&pdev->dev, "Failed to get DMA channel\n"); |
887 | 894 | ret = -EBUSY; |
888 | 895 | goto err_framebuffer_release; |
889 | 896 | } |
890 | jz4740_dma_configure(jzfb->dma, &jzfb_slcd_dma_config); | |
891 | jz4740_dma_set_complete_cb(jzfb->dma, &jzfb_refresh_work_complete); | |
897 | ||
898 | config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; | |
899 | config.dst_addr_width = DMA_SLAVE_BUSWIDTH_2_BYTES; | |
900 | config.dst_maxburst = 16; | |
901 | config.slave_id = JZ4740_DMA_TYPE_SLCD; | |
902 | config.dst_addr = mem->start + JZ_REG_SLCD_FIFO; | |
903 | ||
904 | dmaengine_slave_config(jzfb->dma, &config); | |
892 | 905 | |
893 | 906 | jzfb->ldclk = clk_get(&pdev->dev, "lcd"); |
894 | 907 | if (IS_ERR(jzfb->ldclk)) { |
... | ... | |
1012 | 1025 | err_put_ldclk: |
1013 | 1026 | clk_put(jzfb->ldclk); |
1014 | 1027 | err_free_dma: |
1015 | jz4740_dma_free(jzfb->dma); | |
1028 | dma_release_channel(jzfb->dma); | |
1016 | 1029 | err_framebuffer_release: |
1017 | 1030 | framebuffer_release(fb); |
1018 | 1031 | return ret; |
... | ... | |
1037 | 1050 | |
1038 | 1051 | jzfb_free_gpio_pins(jzfb); |
1039 | 1052 | |
1040 | jz4740_dma_free(jzfb->dma); | |
1053 | dma_release_channel(jzfb->dma); | |
1041 | 1054 | |
1042 | 1055 | fb_dealloc_cmap(&jzfb->fb->cmap); |
1043 | 1056 | jzfb_free_devmem(jzfb); |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9