| .. | .. |
|---|
| 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 | |
|---|