diff options
Diffstat (limited to 'arch/arm/plat-samsung/s3c-dma-ops.c')
-rw-r--r-- | arch/arm/plat-samsung/s3c-dma-ops.c | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/arch/arm/plat-samsung/s3c-dma-ops.c b/arch/arm/plat-samsung/s3c-dma-ops.c index 781494912827..f99448c48d30 100644 --- a/arch/arm/plat-samsung/s3c-dma-ops.c +++ b/arch/arm/plat-samsung/s3c-dma-ops.c | |||
@@ -36,30 +36,26 @@ static void s3c_dma_cb(struct s3c2410_dma_chan *channel, void *param, | |||
36 | } | 36 | } |
37 | 37 | ||
38 | static unsigned s3c_dma_request(enum dma_ch dma_ch, | 38 | static unsigned s3c_dma_request(enum dma_ch dma_ch, |
39 | struct samsung_dma_info *info) | 39 | struct samsung_dma_req *param) |
40 | { | 40 | { |
41 | struct cb_data *data; | 41 | struct cb_data *data; |
42 | 42 | ||
43 | if (s3c2410_dma_request(dma_ch, info->client, NULL) < 0) { | 43 | if (s3c2410_dma_request(dma_ch, param->client, NULL) < 0) { |
44 | s3c2410_dma_free(dma_ch, info->client); | 44 | s3c2410_dma_free(dma_ch, param->client); |
45 | return 0; | 45 | return 0; |
46 | } | 46 | } |
47 | 47 | ||
48 | if (param->cap == DMA_CYCLIC) | ||
49 | s3c2410_dma_setflags(dma_ch, S3C2410_DMAF_CIRCULAR); | ||
50 | |||
48 | data = kzalloc(sizeof(struct cb_data), GFP_KERNEL); | 51 | data = kzalloc(sizeof(struct cb_data), GFP_KERNEL); |
49 | data->ch = dma_ch; | 52 | data->ch = dma_ch; |
50 | list_add_tail(&data->node, &dma_list); | 53 | list_add_tail(&data->node, &dma_list); |
51 | 54 | ||
52 | s3c2410_dma_devconfig(dma_ch, info->direction, info->fifo); | ||
53 | |||
54 | if (info->cap == DMA_CYCLIC) | ||
55 | s3c2410_dma_setflags(dma_ch, S3C2410_DMAF_CIRCULAR); | ||
56 | |||
57 | s3c2410_dma_config(dma_ch, info->width); | ||
58 | |||
59 | return (unsigned)dma_ch; | 55 | return (unsigned)dma_ch; |
60 | } | 56 | } |
61 | 57 | ||
62 | static int s3c_dma_release(unsigned ch, struct s3c2410_dma_client *client) | 58 | static int s3c_dma_release(unsigned ch, void *param) |
63 | { | 59 | { |
64 | struct cb_data *data; | 60 | struct cb_data *data; |
65 | 61 | ||
@@ -68,16 +64,24 @@ static int s3c_dma_release(unsigned ch, struct s3c2410_dma_client *client) | |||
68 | break; | 64 | break; |
69 | list_del(&data->node); | 65 | list_del(&data->node); |
70 | 66 | ||
71 | s3c2410_dma_free(ch, client); | 67 | s3c2410_dma_free(ch, param); |
72 | kfree(data); | 68 | kfree(data); |
73 | 69 | ||
74 | return 0; | 70 | return 0; |
75 | } | 71 | } |
76 | 72 | ||
77 | static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep_info *info) | 73 | static int s3c_dma_config(unsigned ch, struct samsung_dma_config *param) |
74 | { | ||
75 | s3c2410_dma_devconfig(ch, param->direction, param->fifo); | ||
76 | s3c2410_dma_config(ch, param->width); | ||
77 | |||
78 | return 0; | ||
79 | } | ||
80 | |||
81 | static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep *param) | ||
78 | { | 82 | { |
79 | struct cb_data *data; | 83 | struct cb_data *data; |
80 | int len = (info->cap == DMA_CYCLIC) ? info->period : info->len; | 84 | int len = (param->cap == DMA_CYCLIC) ? param->period : param->len; |
81 | 85 | ||
82 | list_for_each_entry(data, &dma_list, node) | 86 | list_for_each_entry(data, &dma_list, node) |
83 | if (data->ch == ch) | 87 | if (data->ch == ch) |
@@ -85,11 +89,11 @@ static int s3c_dma_prepare(unsigned ch, struct samsung_dma_prep_info *info) | |||
85 | 89 | ||
86 | if (!data->fp) { | 90 | if (!data->fp) { |
87 | s3c2410_dma_set_buffdone_fn(ch, s3c_dma_cb); | 91 | s3c2410_dma_set_buffdone_fn(ch, s3c_dma_cb); |
88 | data->fp = info->fp; | 92 | data->fp = param->fp; |
89 | data->fp_param = info->fp_param; | 93 | data->fp_param = param->fp_param; |
90 | } | 94 | } |
91 | 95 | ||
92 | s3c2410_dma_enqueue(ch, (void *)data, info->buf, len); | 96 | s3c2410_dma_enqueue(ch, (void *)data, param->buf, len); |
93 | 97 | ||
94 | return 0; | 98 | return 0; |
95 | } | 99 | } |
@@ -117,6 +121,7 @@ static inline int s3c_dma_stop(unsigned ch) | |||
117 | static struct samsung_dma_ops s3c_dma_ops = { | 121 | static struct samsung_dma_ops s3c_dma_ops = { |
118 | .request = s3c_dma_request, | 122 | .request = s3c_dma_request, |
119 | .release = s3c_dma_release, | 123 | .release = s3c_dma_release, |
124 | .config = s3c_dma_config, | ||
120 | .prepare = s3c_dma_prepare, | 125 | .prepare = s3c_dma_prepare, |
121 | .trigger = s3c_dma_trigger, | 126 | .trigger = s3c_dma_trigger, |
122 | .started = s3c_dma_started, | 127 | .started = s3c_dma_started, |