1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Character line display core support 4 * 5 * Copyright (C) 2016 Imagination Technologies 6 * Author: Paul Burton <paul.burton@mips.com> 7 * 8 * Copyright (C) 2021 Glider bv 9 */ 10 11 #ifndef _LINEDISP_H 12 #define _LINEDISP_H 13 14 #include <linux/device.h> 15 #include <linux/timer_types.h> 16 17 #include <linux/map_to_7segment.h> 18 #include <linux/map_to_14segment.h> 19 20 struct linedisp; 21 22 /** 23 * enum linedisp_map_type - type of the character mapping 24 * @LINEDISP_MAP_SEG7: Map characters to 7 segment display 25 * @LINEDISP_MAP_SEG14: Map characters to 14 segment display 26 */ 27 enum linedisp_map_type { 28 LINEDISP_MAP_SEG7, 29 LINEDISP_MAP_SEG14, 30 }; 31 32 /** 33 * struct linedisp_map - character mapping 34 * @type: type of the character mapping 35 * @map: conversion character mapping 36 * @size: size of the @map 37 */ 38 struct linedisp_map { 39 enum linedisp_map_type type; 40 union { 41 struct seg7_conversion_map seg7; 42 struct seg14_conversion_map seg14; 43 } map; 44 unsigned int size; 45 }; 46 47 /** 48 * struct linedisp_ops - character line display operations 49 * @get_map_type: Function called to get the character mapping, if required 50 * @update: Function called to update the display. This must not sleep! 51 */ 52 struct linedisp_ops { 53 int (*get_map_type)(struct linedisp *linedisp); 54 void (*update)(struct linedisp *linedisp); 55 }; 56 57 /** 58 * struct linedisp - character line display private data structure 59 * @dev: the line display device 60 * @timer: timer used to implement scrolling 61 * @ops: character line display operations 62 * @buf: pointer to the buffer for the string currently displayed 63 * @message: the full message to display or scroll on the display 64 * @num_chars: the number of characters that can be displayed 65 * @message_len: the length of the @message string 66 * @scroll_pos: index of the first character of @message currently displayed 67 * @scroll_rate: scroll interval in jiffies 68 * @id: instance id of this display 69 */ 70 struct linedisp { 71 struct device dev; 72 struct timer_list timer; 73 const struct linedisp_ops *ops; 74 struct linedisp_map *map; 75 char *buf; 76 char *message; 77 unsigned int num_chars; 78 unsigned int message_len; 79 unsigned int scroll_pos; 80 unsigned int scroll_rate; 81 unsigned int id; 82 }; 83 84 int linedisp_register(struct linedisp *linedisp, struct device *parent, 85 unsigned int num_chars, const struct linedisp_ops *ops); 86 void linedisp_unregister(struct linedisp *linedisp); 87 88 #endif /* LINEDISP_H */ 89