.. | .. |
---|
14 | 14 | #include <linux/property.h> |
---|
15 | 15 | #include <linux/slab.h> |
---|
16 | 16 | |
---|
17 | | -#include <misc/charlcd.h> |
---|
18 | | - |
---|
| 17 | +#include "charlcd.h" |
---|
19 | 18 | |
---|
20 | 19 | enum hd44780_pin { |
---|
21 | 20 | /* Order does matter due to writing to GPIO array subsets! */ |
---|
.. | .. |
---|
62 | 61 | /* write to an LCD panel register in 8 bit GPIO mode */ |
---|
63 | 62 | static void hd44780_write_gpio8(struct hd44780 *hd, u8 val, unsigned int rs) |
---|
64 | 63 | { |
---|
65 | | - int values[10]; /* for DATA[0-7], RS, RW */ |
---|
66 | | - unsigned int i, n; |
---|
| 64 | + DECLARE_BITMAP(values, 10); /* for DATA[0-7], RS, RW */ |
---|
| 65 | + unsigned int n; |
---|
67 | 66 | |
---|
68 | | - for (i = 0; i < 8; i++) |
---|
69 | | - values[PIN_DATA0 + i] = !!(val & BIT(i)); |
---|
70 | | - values[PIN_CTRL_RS] = rs; |
---|
71 | | - n = 9; |
---|
72 | | - if (hd->pins[PIN_CTRL_RW]) { |
---|
73 | | - values[PIN_CTRL_RW] = 0; |
---|
74 | | - n++; |
---|
75 | | - } |
---|
| 67 | + values[0] = val; |
---|
| 68 | + __assign_bit(8, values, rs); |
---|
| 69 | + n = hd->pins[PIN_CTRL_RW] ? 10 : 9; |
---|
76 | 70 | |
---|
77 | 71 | /* Present the data to the port */ |
---|
78 | | - gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA0], values); |
---|
| 72 | + gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA0], NULL, values); |
---|
79 | 73 | |
---|
80 | 74 | hd44780_strobe_gpio(hd); |
---|
81 | 75 | } |
---|
.. | .. |
---|
83 | 77 | /* write to an LCD panel register in 4 bit GPIO mode */ |
---|
84 | 78 | static void hd44780_write_gpio4(struct hd44780 *hd, u8 val, unsigned int rs) |
---|
85 | 79 | { |
---|
86 | | - int values[10]; /* for DATA[0-7], RS, RW, but DATA[0-3] is unused */ |
---|
87 | | - unsigned int i, n; |
---|
| 80 | + DECLARE_BITMAP(values, 6); /* for DATA[4-7], RS, RW */ |
---|
| 81 | + unsigned int n; |
---|
88 | 82 | |
---|
89 | 83 | /* High nibble + RS, RW */ |
---|
90 | | - for (i = 4; i < 8; i++) |
---|
91 | | - values[PIN_DATA0 + i] = !!(val & BIT(i)); |
---|
92 | | - values[PIN_CTRL_RS] = rs; |
---|
93 | | - n = 5; |
---|
94 | | - if (hd->pins[PIN_CTRL_RW]) { |
---|
95 | | - values[PIN_CTRL_RW] = 0; |
---|
96 | | - n++; |
---|
97 | | - } |
---|
| 84 | + values[0] = val >> 4; |
---|
| 85 | + __assign_bit(4, values, rs); |
---|
| 86 | + n = hd->pins[PIN_CTRL_RW] ? 6 : 5; |
---|
98 | 87 | |
---|
99 | 88 | /* Present the data to the port */ |
---|
100 | | - gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], |
---|
101 | | - &values[PIN_DATA4]); |
---|
| 89 | + gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], NULL, values); |
---|
102 | 90 | |
---|
103 | 91 | hd44780_strobe_gpio(hd); |
---|
104 | 92 | |
---|
105 | 93 | /* Low nibble */ |
---|
106 | | - for (i = 0; i < 4; i++) |
---|
107 | | - values[PIN_DATA4 + i] = !!(val & BIT(i)); |
---|
| 94 | + values[0] &= ~0x0fUL; |
---|
| 95 | + values[0] |= val & 0x0f; |
---|
108 | 96 | |
---|
109 | 97 | /* Present the data to the port */ |
---|
110 | | - gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], |
---|
111 | | - &values[PIN_DATA4]); |
---|
| 98 | + gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], NULL, values); |
---|
112 | 99 | |
---|
113 | 100 | hd44780_strobe_gpio(hd); |
---|
114 | 101 | } |
---|
.. | .. |
---|
155 | 142 | /* Send 4-bits of a command to the LCD panel in raw 4 bit GPIO mode */ |
---|
156 | 143 | static void hd44780_write_cmd_raw_gpio4(struct charlcd *lcd, int cmd) |
---|
157 | 144 | { |
---|
158 | | - int values[10]; /* for DATA[0-7], RS, RW, but DATA[0-3] is unused */ |
---|
| 145 | + DECLARE_BITMAP(values, 6); /* for DATA[4-7], RS, RW */ |
---|
159 | 146 | struct hd44780 *hd = lcd->drvdata; |
---|
160 | | - unsigned int i, n; |
---|
| 147 | + unsigned int n; |
---|
161 | 148 | |
---|
162 | 149 | /* Command nibble + RS, RW */ |
---|
163 | | - for (i = 0; i < 4; i++) |
---|
164 | | - values[PIN_DATA4 + i] = !!(cmd & BIT(i)); |
---|
165 | | - values[PIN_CTRL_RS] = 0; |
---|
166 | | - n = 5; |
---|
167 | | - if (hd->pins[PIN_CTRL_RW]) { |
---|
168 | | - values[PIN_CTRL_RW] = 0; |
---|
169 | | - n++; |
---|
170 | | - } |
---|
| 150 | + values[0] = cmd & 0x0f; |
---|
| 151 | + n = hd->pins[PIN_CTRL_RW] ? 6 : 5; |
---|
171 | 152 | |
---|
172 | 153 | /* Present the data to the port */ |
---|
173 | | - gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], |
---|
174 | | - &values[PIN_DATA4]); |
---|
| 154 | + gpiod_set_array_value_cansleep(n, &hd->pins[PIN_DATA4], NULL, values); |
---|
175 | 155 | |
---|
176 | 156 | hd44780_strobe_gpio(hd); |
---|
177 | 157 | } |
---|
.. | .. |
---|
290 | 270 | return 0; |
---|
291 | 271 | |
---|
292 | 272 | fail: |
---|
293 | | - kfree(lcd); |
---|
| 273 | + charlcd_free(lcd); |
---|
294 | 274 | return ret; |
---|
295 | 275 | } |
---|
296 | 276 | |
---|
.. | .. |
---|
300 | 280 | |
---|
301 | 281 | charlcd_unregister(lcd); |
---|
302 | 282 | |
---|
303 | | - kfree(lcd); |
---|
| 283 | + charlcd_free(lcd); |
---|
304 | 284 | return 0; |
---|
305 | 285 | } |
---|
306 | 286 | |
---|