Lines Matching refs:linedisp

48 	struct linedisp *linedisp;  member
55 static int create_attachment(struct device *dev, struct linedisp *linedisp, bool direct) in create_attachment() argument
64 attachment->linedisp = linedisp; in create_attachment()
73 static struct linedisp *delete_attachment(struct device *dev, bool direct) in delete_attachment()
76 struct linedisp *linedisp; in delete_attachment() local
89 linedisp = attachment->linedisp; in delete_attachment()
93 return linedisp; in delete_attachment()
96 static struct linedisp *to_linedisp(struct device *dev) in to_linedisp()
110 return attachment->linedisp; in to_linedisp()
113 static inline bool should_scroll(struct linedisp *linedisp) in should_scroll() argument
115 return linedisp->message_len > linedisp->num_chars && linedisp->scroll_rate; in should_scroll()
127 struct linedisp *linedisp = timer_container_of(linedisp, t, timer); in linedisp_scroll() local
128 unsigned int i, ch = linedisp->scroll_pos; in linedisp_scroll()
129 unsigned int num_chars = linedisp->num_chars; in linedisp_scroll()
134 for (; i < num_chars && ch < linedisp->message_len; i++, ch++) in linedisp_scroll()
135 linedisp->buf[i] = linedisp->message[ch]; in linedisp_scroll()
142 linedisp->ops->update(linedisp); in linedisp_scroll()
145 linedisp->scroll_pos++; in linedisp_scroll()
146 linedisp->scroll_pos %= linedisp->message_len; in linedisp_scroll()
149 mod_timer(&linedisp->timer, jiffies + linedisp->scroll_rate); in linedisp_scroll()
164 static int linedisp_display(struct linedisp *linedisp, const char *msg, in linedisp_display() argument
170 timer_delete_sync(&linedisp->timer); in linedisp_display()
181 kfree(linedisp->message); in linedisp_display()
182 linedisp->message = NULL; in linedisp_display()
183 linedisp->message_len = 0; in linedisp_display()
184 memset(linedisp->buf, ' ', linedisp->num_chars); in linedisp_display()
185 linedisp->ops->update(linedisp); in linedisp_display()
193 kfree(linedisp->message); in linedisp_display()
195 linedisp->message = new_msg; in linedisp_display()
196 linedisp->message_len = count; in linedisp_display()
197 linedisp->scroll_pos = 0; in linedisp_display()
199 if (should_scroll(linedisp)) { in linedisp_display()
201 linedisp_scroll(&linedisp->timer); in linedisp_display()
204 memset(linedisp->buf, ' ', linedisp->num_chars); in linedisp_display()
205 memcpy(linedisp->buf, linedisp->message, in linedisp_display()
206 umin(linedisp->num_chars, linedisp->message_len)); in linedisp_display()
207 linedisp->ops->update(linedisp); in linedisp_display()
227 struct linedisp *linedisp = to_linedisp(dev); in message_show() local
229 return sysfs_emit(buf, "%s\n", linedisp->message); in message_show()
246 struct linedisp *linedisp = to_linedisp(dev); in message_store() local
249 err = linedisp_display(linedisp, buf, count); in message_store()
258 struct linedisp *linedisp = to_linedisp(dev); in num_chars_show() local
260 return sysfs_emit(buf, "%u\n", linedisp->num_chars); in num_chars_show()
268 struct linedisp *linedisp = to_linedisp(dev); in scroll_step_ms_show() local
270 return sysfs_emit(buf, "%u\n", jiffies_to_msecs(linedisp->scroll_rate)); in scroll_step_ms_show()
277 struct linedisp *linedisp = to_linedisp(dev); in scroll_step_ms_store() local
285 timer_delete_sync(&linedisp->timer); in scroll_step_ms_store()
287 linedisp->scroll_rate = msecs_to_jiffies(ms); in scroll_step_ms_store()
289 if (should_scroll(linedisp)) in scroll_step_ms_store()
290 linedisp_scroll(&linedisp->timer); in scroll_step_ms_store()
299 struct linedisp *linedisp = to_linedisp(dev); in map_seg_show() local
300 struct linedisp_map *map = linedisp->map; in map_seg_show()
309 struct linedisp *linedisp = to_linedisp(dev); in map_seg_store() local
310 struct linedisp_map *map = linedisp->map; in map_seg_store()
337 struct linedisp *linedisp = to_linedisp(dev); in linedisp_attr_is_visible() local
338 struct linedisp_map *map = linedisp->map; in linedisp_attr_is_visible()
362 __ATTRIBUTE_GROUPS(linedisp);
368 struct linedisp *linedisp = to_linedisp(dev); in linedisp_release() local
370 kfree(linedisp->map); in linedisp_release()
371 kfree(linedisp->message); in linedisp_release()
372 kfree(linedisp->buf); in linedisp_release()
373 ida_free(&linedisp_id, linedisp->id); in linedisp_release()
381 static int linedisp_init_map(struct linedisp *linedisp) in linedisp_init_map() argument
386 if (!linedisp->ops->get_map_type) in linedisp_init_map()
389 err = linedisp->ops->get_map_type(linedisp); in linedisp_init_map()
414 linedisp->map = map; in linedisp_init_map()
438 int linedisp_attach(struct linedisp *linedisp, struct device *dev, in linedisp_attach() argument
443 memset(linedisp, 0, sizeof(*linedisp)); in linedisp_attach()
444 linedisp->ops = ops; in linedisp_attach()
445 linedisp->num_chars = num_chars; in linedisp_attach()
446 linedisp->scroll_rate = DEFAULT_SCROLL_RATE; in linedisp_attach()
448 linedisp->buf = kzalloc(linedisp->num_chars, GFP_KERNEL); in linedisp_attach()
449 if (!linedisp->buf) in linedisp_attach()
453 err = linedisp_init_map(linedisp); in linedisp_attach()
458 timer_setup(&linedisp->timer, linedisp_scroll, 0); in linedisp_attach()
460 err = create_attachment(dev, linedisp, true); in linedisp_attach()
465 err = linedisp_display(linedisp, LINEDISP_INIT_TEXT, -1); in linedisp_attach()
479 timer_delete_sync(&linedisp->timer); in linedisp_attach()
481 kfree(linedisp->buf); in linedisp_attach()
493 struct linedisp *linedisp; in linedisp_detach() local
495 linedisp = delete_attachment(dev, true); in linedisp_detach()
496 if (!linedisp) in linedisp_detach()
499 timer_delete_sync(&linedisp->timer); in linedisp_detach()
503 kfree(linedisp->map); in linedisp_detach()
504 kfree(linedisp->message); in linedisp_detach()
505 kfree(linedisp->buf); in linedisp_detach()
523 int linedisp_register(struct linedisp *linedisp, struct device *parent, in linedisp_register() argument
528 memset(linedisp, 0, sizeof(*linedisp)); in linedisp_register()
529 linedisp->dev.parent = parent; in linedisp_register()
530 linedisp->dev.type = &linedisp_type; in linedisp_register()
531 linedisp->ops = ops; in linedisp_register()
532 linedisp->num_chars = num_chars; in linedisp_register()
533 linedisp->scroll_rate = DEFAULT_SCROLL_RATE; in linedisp_register()
538 linedisp->id = err; in linedisp_register()
540 device_initialize(&linedisp->dev); in linedisp_register()
541 dev_set_name(&linedisp->dev, "linedisp.%u", linedisp->id); in linedisp_register()
544 linedisp->buf = kzalloc(linedisp->num_chars, GFP_KERNEL); in linedisp_register()
545 if (!linedisp->buf) in linedisp_register()
549 err = linedisp_init_map(linedisp); in linedisp_register()
554 timer_setup(&linedisp->timer, linedisp_scroll, 0); in linedisp_register()
556 err = create_attachment(&linedisp->dev, linedisp, false); in linedisp_register()
561 err = linedisp_display(linedisp, LINEDISP_INIT_TEXT, -1); in linedisp_register()
565 err = device_add(&linedisp->dev); in linedisp_register()
572 delete_attachment(&linedisp->dev, false); in linedisp_register()
574 timer_delete_sync(&linedisp->timer); in linedisp_register()
576 put_device(&linedisp->dev); in linedisp_register()
586 void linedisp_unregister(struct linedisp *linedisp) in linedisp_unregister() argument
588 device_del(&linedisp->dev); in linedisp_unregister()
589 delete_attachment(&linedisp->dev, false); in linedisp_unregister()
590 timer_delete_sync(&linedisp->timer); in linedisp_unregister()
591 put_device(&linedisp->dev); in linedisp_unregister()