47 /****************************************************************************/ |
47 /****************************************************************************/ |
48 |
48 |
49 /** Context structure for an open RTDM file handle. |
49 /** Context structure for an open RTDM file handle. |
50 */ |
50 */ |
51 typedef struct { |
51 typedef struct { |
52 rtdm_user_info_t *user_info; /**< RTDM user data. */ |
52 struct rtdm_fd *fd; /**< RTDM user data. */ |
53 ec_ioctl_context_t ioctl_ctx; /**< Context structure. */ |
53 ec_ioctl_context_t ioctl_ctx; /**< Context structure. */ |
54 } ec_rtdm_context_t; |
54 } ec_rtdm_context_t; |
55 |
55 |
56 /****************************************************************************/ |
56 /****************************************************************************/ |
57 |
57 |
58 int ec_rtdm_open(struct rtdm_dev_context *, rtdm_user_info_t *, int); |
58 int ec_rtdm_open(struct rtdm_dev_context *, struct rtdm_fd *, int); |
59 int ec_rtdm_close(struct rtdm_dev_context *, rtdm_user_info_t *); |
59 int ec_rtdm_close(struct rtdm_dev_context *, struct rtdm_fd *); |
60 int ec_rtdm_ioctl(struct rtdm_dev_context *, rtdm_user_info_t *, |
60 int ec_rtdm_ioctl(struct rtdm_dev_context *, struct rtdm_fd *, |
61 unsigned int, void __user *); |
61 unsigned int, void __user *); |
62 |
62 |
63 /****************************************************************************/ |
63 /****************************************************************************/ |
64 |
64 |
65 static struct rtdm_driver ec_rtdm_driver = { |
65 static struct rtdm_driver ec_rtdm_driver = { |
67 RTDM_CLASS_EXPERIMENTAL, |
67 RTDM_CLASS_EXPERIMENTAL, |
68 222, |
68 222, |
69 1), |
69 1), |
70 .device_flags = RTDM_NAMED_DEVICE, |
70 .device_flags = RTDM_NAMED_DEVICE, |
71 .device_count = 1, |
71 .device_count = 1, |
72 .context_size = sizeof(ec_rtdm_context_t). |
72 .context_size = sizeof(ec_rtdm_context_t), |
73 .ops = { |
73 .ops = { |
74 .open = ec_rtdm_open; |
74 .open = ec_rtdm_open; |
75 .close_nrt = ec_rtdm_close, |
75 .close_nrt = ec_rtdm_close, |
76 .ioctl_rt = ec_rtdm_ioctl, |
76 .ioctl_rt = ec_rtdm_ioctl, |
77 .ioctl_nrt = ec_rtdm_ioctl |
77 .ioctl_nrt = ec_rtdm_ioctl |
154 * |
154 * |
155 * \return Always zero (success). |
155 * \return Always zero (success). |
156 */ |
156 */ |
157 int ec_rtdm_open( |
157 int ec_rtdm_open( |
158 struct rtdm_dev_context *context, /**< Context. */ |
158 struct rtdm_dev_context *context, /**< Context. */ |
159 rtdm_user_info_t *user_info, /**< User data. */ |
159 struct rtdm_fd *fd, /**< User data. */ |
160 int oflags /**< Open flags. */ |
160 int oflags /**< Open flags. */ |
161 ) |
161 ) |
162 { |
162 { |
163 ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private; |
163 ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private; |
164 #if DEBUG |
164 #if DEBUG |
165 ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data; |
165 ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data; |
166 #endif |
166 #endif |
167 |
167 |
168 ctx->user_info = user_info; |
168 ctx->fd = fd; |
169 ctx->ioctl_ctx.writable = oflags & O_WRONLY || oflags & O_RDWR; |
169 ctx->ioctl_ctx.writable = oflags & O_WRONLY || oflags & O_RDWR; |
170 ctx->ioctl_ctx.requested = 0; |
170 ctx->ioctl_ctx.requested = 0; |
171 ctx->ioctl_ctx.process_data = NULL; |
171 ctx->ioctl_ctx.process_data = NULL; |
172 ctx->ioctl_ctx.process_data_size = 0; |
172 ctx->ioctl_ctx.process_data_size = 0; |
173 |
173 |
184 * |
184 * |
185 * \return Always zero (success). |
185 * \return Always zero (success). |
186 */ |
186 */ |
187 int ec_rtdm_close( |
187 int ec_rtdm_close( |
188 struct rtdm_dev_context *context, /**< Context. */ |
188 struct rtdm_dev_context *context, /**< Context. */ |
189 rtdm_user_info_t *user_info /**< User data. */ |
189 struct rtdm_fd *fd /**< User data. */ |
190 ) |
190 ) |
191 { |
191 { |
192 ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private; |
192 ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private; |
193 ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data; |
193 ec_rtdm_dev_t *rtdm_dev = (ec_rtdm_dev_t *) context->device->device_data; |
194 |
194 |
209 * |
209 * |
210 * \return ioctl() return code. |
210 * \return ioctl() return code. |
211 */ |
211 */ |
212 int ec_rtdm_ioctl( |
212 int ec_rtdm_ioctl( |
213 struct rtdm_dev_context *context, /**< Context. */ |
213 struct rtdm_dev_context *context, /**< Context. */ |
214 rtdm_user_info_t *user_info, /**< User data. */ |
214 struct rtdm_fd *fd, /**< User data. */ |
215 unsigned int request, /**< Request. */ |
215 unsigned int request, /**< Request. */ |
216 void __user *arg /**< Argument. */ |
216 void __user *arg /**< Argument. */ |
217 ) |
217 ) |
218 { |
218 { |
219 ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private; |
219 ec_rtdm_context_t *ctx = (ec_rtdm_context_t *) context->dev_private; |
240 { |
240 { |
241 ec_rtdm_context_t *ctx = |
241 ec_rtdm_context_t *ctx = |
242 container_of(ioctl_ctx, ec_rtdm_context_t, ioctl_ctx); |
242 container_of(ioctl_ctx, ec_rtdm_context_t, ioctl_ctx); |
243 int ret; |
243 int ret; |
244 |
244 |
245 ret = rtdm_mmap_to_user(ctx->user_info, |
245 ret = rtdm_mmap_to_user(ctx->fd, |
246 ioctl_ctx->process_data, ioctl_ctx->process_data_size, |
246 ioctl_ctx->process_data, ioctl_ctx->process_data_size, |
247 PROT_READ | PROT_WRITE, |
247 PROT_READ | PROT_WRITE, |
248 user_address, |
248 user_address, |
249 NULL, NULL); |
249 NULL, NULL); |
250 if (ret < 0) { |
250 if (ret < 0) { |