1 // SPDX-License-Identifier: GPL-2.0
5 * Author: Robin van der Gracht <robin@protonic.nl>
7 * Copyright: (C) 2016 Protonic Holland.
8 * Copyright (C) 2021 Glider bv
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/interrupt.h>
14 #include <linux/i2c.h>
15 #include <linux/property.h>
17 #include <linux/backlight.h>
18 #include <linux/container_of.h>
19 #include <linux/input.h>
20 #include <linux/input/matrix_keypad.h>
21 #include <linux/leds.h>
22 #include <linux/workqueue.h>
25 #include <linux/map_to_7segment.h>
26 #include <linux/map_to_14segment.h>
28 #include <linux/unaligned.h>
30 #include "line-display.h"
33 #define REG_SYSTEM_SETUP 0x20
34 #define REG_SYSTEM_SETUP_OSC_ON BIT(0)
36 #define REG_DISPLAY_SETUP 0x80
37 #define REG_DISPLAY_SETUP_ON BIT(0)
38 #define REG_DISPLAY_SETUP_BLINK_OFF (0 << 1)
39 #define REG_DISPLAY_SETUP_BLINK_2HZ (1 << 1)
40 #define REG_DISPLAY_SETUP_BLINK_1HZ (2 << 1)
41 #define REG_DISPLAY_SETUP_BLINK_0HZ5 (3 << 1)
43 #define REG_ROWINT_SET 0xA0
44 #define REG_ROWINT_SET_INT_EN BIT(0)
45 #define REG_ROWINT_SET_INT_ACT_HIGH BIT(1)
47 #define REG_BRIGHTNESS 0xE0
50 #define DRIVER_NAME "ht16k33"
52 #define MIN_BRIGHTNESS 0x1
53 #define MAX_BRIGHTNESS 0x10
55 #define HT16K33_MATRIX_LED_MAX_COLS 8
56 #define HT16K33_MATRIX_LED_MAX_ROWS 16
57 #define HT16K33_MATRIX_KEYPAD_MAX_COLS 3
58 #define HT16K33_MATRIX_KEYPAD_MAX_ROWS 12
60 #define BYTES_PER_ROW (HT16K33_MATRIX_LED_MAX_ROWS / 8)
61 #define HT16K33_FB_SIZE (HT16K33_MATRIX_LED_MAX_COLS * BYTES_PER_ROW)
69 struct ht16k33_keypad
{
70 struct i2c_client
*client
;
71 struct input_dev
*dev
;
76 uint16_t last_key_state
[HT16K33_MATRIX_KEYPAD_MAX_COLS
];
78 wait_queue_head_t wait
;
82 struct ht16k33_fbdev
{
84 uint32_t refresh_rate
;
90 struct i2c_client
*client
;
91 struct delayed_work work
;
92 struct led_classdev led
;
93 struct ht16k33_keypad keypad
;
95 struct ht16k33_fbdev fbdev
;
96 struct linedisp linedisp
;
98 enum display_type type
;
102 #define ht16k33_work_to_priv(p) \
103 container_of(p, struct ht16k33_priv, work.work)
105 #define ht16k33_led_to_priv(p) \
106 container_of(p, struct ht16k33_priv, led)
108 #define ht16k33_linedisp_to_priv(p) \
109 container_of(p, struct ht16k33_priv, linedisp)
111 static const struct fb_fix_screeninfo ht16k33_fb_fix
= {
113 .type
= FB_TYPE_PACKED_PIXELS
,
114 .visual
= FB_VISUAL_MONO10
,
118 .line_length
= HT16K33_MATRIX_LED_MAX_ROWS
,
119 .accel
= FB_ACCEL_NONE
,
122 static const struct fb_var_screeninfo ht16k33_fb_var
= {
123 .xres
= HT16K33_MATRIX_LED_MAX_ROWS
,
124 .yres
= HT16K33_MATRIX_LED_MAX_COLS
,
125 .xres_virtual
= HT16K33_MATRIX_LED_MAX_ROWS
,
126 .yres_virtual
= HT16K33_MATRIX_LED_MAX_COLS
,
129 .green
= { 0, 1, 0 },
135 .vmode
= FB_VMODE_NONINTERLACED
,
138 static int ht16k33_display_on(struct ht16k33_priv
*priv
)
140 uint8_t data
= REG_DISPLAY_SETUP
| REG_DISPLAY_SETUP_ON
| priv
->blink
;
142 return i2c_smbus_write_byte(priv
->client
, data
);
145 static int ht16k33_display_off(struct ht16k33_priv
*priv
)
147 return i2c_smbus_write_byte(priv
->client
, REG_DISPLAY_SETUP
);
150 static int ht16k33_brightness_set(struct ht16k33_priv
*priv
,
151 unsigned int brightness
)
155 if (brightness
== 0) {
156 priv
->blink
= REG_DISPLAY_SETUP_BLINK_OFF
;
157 return ht16k33_display_off(priv
);
160 err
= ht16k33_display_on(priv
);
164 return i2c_smbus_write_byte(priv
->client
,
165 REG_BRIGHTNESS
| (brightness
- 1));
168 static int ht16k33_brightness_set_blocking(struct led_classdev
*led_cdev
,
169 enum led_brightness brightness
)
171 struct ht16k33_priv
*priv
= ht16k33_led_to_priv(led_cdev
);
173 return ht16k33_brightness_set(priv
, brightness
);
176 static int ht16k33_blink_set(struct led_classdev
*led_cdev
,
177 unsigned long *delay_on
, unsigned long *delay_off
)
179 struct ht16k33_priv
*priv
= ht16k33_led_to_priv(led_cdev
);
184 if (!*delay_on
&& !*delay_off
) {
185 blink
= REG_DISPLAY_SETUP_BLINK_1HZ
;
187 } else if (*delay_on
<= 750) {
188 blink
= REG_DISPLAY_SETUP_BLINK_2HZ
;
190 } else if (*delay_on
<= 1500) {
191 blink
= REG_DISPLAY_SETUP_BLINK_1HZ
;
194 blink
= REG_DISPLAY_SETUP_BLINK_0HZ5
;
198 err
= i2c_smbus_write_byte(priv
->client
,
199 REG_DISPLAY_SETUP
| REG_DISPLAY_SETUP_ON
|
205 *delay_on
= *delay_off
= delay
;
209 static void ht16k33_fb_queue(struct ht16k33_priv
*priv
)
211 struct ht16k33_fbdev
*fbdev
= &priv
->fbdev
;
213 schedule_delayed_work(&priv
->work
, HZ
/ fbdev
->refresh_rate
);
217 * This gets the fb data from cache and copies it to ht16k33 display RAM
219 static void ht16k33_fb_update(struct work_struct
*work
)
221 struct ht16k33_priv
*priv
= ht16k33_work_to_priv(work
);
222 struct ht16k33_fbdev
*fbdev
= &priv
->fbdev
;
225 int len
, pos
= 0, first
= -1;
230 /* Search for the first byte with changes */
231 while (pos
< HT16K33_FB_SIZE
&& first
< 0) {
232 if (*(p1
++) - *(p2
++))
237 /* No changes found */
241 len
= HT16K33_FB_SIZE
- first
;
242 p1
= fbdev
->cache
+ HT16K33_FB_SIZE
- 1;
243 p2
= fbdev
->buffer
+ HT16K33_FB_SIZE
- 1;
245 /* Determine i2c transfer length */
247 if (*(p1
--) - *(p2
--))
252 p1
= fbdev
->cache
+ first
;
253 p2
= fbdev
->buffer
+ first
;
254 if (!i2c_smbus_write_i2c_block_data(priv
->client
, first
, len
, p2
))
257 ht16k33_fb_queue(priv
);
260 static int ht16k33_initialize(struct ht16k33_priv
*priv
)
262 uint8_t data
[HT16K33_FB_SIZE
];
266 /* Clear RAM (8 * 16 bits) */
267 memset(data
, 0, sizeof(data
));
268 err
= i2c_smbus_write_block_data(priv
->client
, 0, sizeof(data
), data
);
272 /* Turn on internal oscillator */
273 byte
= REG_SYSTEM_SETUP_OSC_ON
| REG_SYSTEM_SETUP
;
274 err
= i2c_smbus_write_byte(priv
->client
, byte
);
278 /* Configure INT pin */
279 byte
= REG_ROWINT_SET
| REG_ROWINT_SET_INT_ACT_HIGH
;
280 if (priv
->client
->irq
> 0)
281 byte
|= REG_ROWINT_SET_INT_EN
;
282 return i2c_smbus_write_byte(priv
->client
, byte
);
285 static int ht16k33_bl_update_status(struct backlight_device
*bl
)
287 const int brightness
= backlight_get_brightness(bl
);
288 struct ht16k33_priv
*priv
= bl_get_data(bl
);
290 return ht16k33_brightness_set(priv
, brightness
);
293 static const struct backlight_ops ht16k33_bl_ops
= {
294 .update_status
= ht16k33_bl_update_status
,
298 * Blank events will be passed to the actual device handling the backlight when
299 * we return zero here.
301 static int ht16k33_blank(int blank
, struct fb_info
*info
)
306 static int ht16k33_mmap(struct fb_info
*info
, struct vm_area_struct
*vma
)
308 struct ht16k33_priv
*priv
= info
->par
;
309 struct page
*pages
= virt_to_page(priv
->fbdev
.buffer
);
311 vma
->vm_page_prot
= pgprot_decrypted(vma
->vm_page_prot
);
313 return vm_map_pages_zero(vma
, &pages
, 1);
316 static const struct fb_ops ht16k33_fb_ops
= {
317 .owner
= THIS_MODULE
,
318 __FB_DEFAULT_SYSMEM_OPS_RDWR
,
319 .fb_blank
= ht16k33_blank
,
320 __FB_DEFAULT_SYSMEM_OPS_DRAW
,
321 .fb_mmap
= ht16k33_mmap
,
325 * This gets the keys from keypad and reports it to input subsystem.
326 * Returns true if a key is pressed.
328 static bool ht16k33_keypad_scan(struct ht16k33_keypad
*keypad
)
330 const unsigned short *keycodes
= keypad
->dev
->keycode
;
331 u16 new_state
[HT16K33_MATRIX_KEYPAD_MAX_COLS
];
332 __le16 data
[HT16K33_MATRIX_KEYPAD_MAX_COLS
];
333 unsigned long bits_changed
;
336 bool pressed
= false;
338 rc
= i2c_smbus_read_i2c_block_data(keypad
->client
, 0x40,
339 sizeof(data
), (u8
*)data
);
340 if (rc
!= sizeof(data
)) {
341 dev_err(&keypad
->client
->dev
,
342 "Failed to read key data, rc=%d\n", rc
);
346 for (col
= 0; col
< keypad
->cols
; col
++) {
347 new_state
[col
] = le16_to_cpu(data
[col
]);
350 bits_changed
= keypad
->last_key_state
[col
] ^ new_state
[col
];
352 for_each_set_bit(row
, &bits_changed
, BITS_PER_LONG
) {
353 code
= MATRIX_SCAN_CODE(row
, col
, keypad
->row_shift
);
354 input_event(keypad
->dev
, EV_MSC
, MSC_SCAN
, code
);
355 input_report_key(keypad
->dev
, keycodes
[code
],
356 new_state
[col
] & BIT(row
));
359 input_sync(keypad
->dev
);
360 memcpy(keypad
->last_key_state
, new_state
, sizeof(u16
) * keypad
->cols
);
365 static irqreturn_t
ht16k33_keypad_irq_thread(int irq
, void *dev
)
367 struct ht16k33_keypad
*keypad
= dev
;
370 wait_event_timeout(keypad
->wait
, keypad
->stopped
,
371 msecs_to_jiffies(keypad
->debounce_ms
));
374 } while (ht16k33_keypad_scan(keypad
));
379 static int ht16k33_keypad_start(struct input_dev
*dev
)
381 struct ht16k33_keypad
*keypad
= input_get_drvdata(dev
);
383 keypad
->stopped
= false;
385 enable_irq(keypad
->client
->irq
);
390 static void ht16k33_keypad_stop(struct input_dev
*dev
)
392 struct ht16k33_keypad
*keypad
= input_get_drvdata(dev
);
394 keypad
->stopped
= true;
396 wake_up(&keypad
->wait
);
397 disable_irq(keypad
->client
->irq
);
400 static void ht16k33_seg7_update(struct work_struct
*work
)
402 struct ht16k33_priv
*priv
= ht16k33_work_to_priv(work
);
403 struct linedisp_map
*map
= priv
->linedisp
.map
;
404 char *s
= priv
->linedisp
.buf
;
407 buf
[0] = map_to_seg7(&map
->map
.seg7
, *s
++);
409 buf
[2] = map_to_seg7(&map
->map
.seg7
, *s
++);
413 buf
[6] = map_to_seg7(&map
->map
.seg7
, *s
++);
415 buf
[8] = map_to_seg7(&map
->map
.seg7
, *s
++);
417 i2c_smbus_write_i2c_block_data(priv
->client
, 0, ARRAY_SIZE(buf
), buf
);
420 static void ht16k33_seg14_update(struct work_struct
*work
)
422 struct ht16k33_priv
*priv
= ht16k33_work_to_priv(work
);
423 struct linedisp_map
*map
= priv
->linedisp
.map
;
424 char *s
= priv
->linedisp
.buf
;
427 put_unaligned_le16(map_to_seg14(&map
->map
.seg14
, *s
++), buf
+ 0);
428 put_unaligned_le16(map_to_seg14(&map
->map
.seg14
, *s
++), buf
+ 2);
429 put_unaligned_le16(map_to_seg14(&map
->map
.seg14
, *s
++), buf
+ 4);
430 put_unaligned_le16(map_to_seg14(&map
->map
.seg14
, *s
++), buf
+ 6);
432 i2c_smbus_write_i2c_block_data(priv
->client
, 0, ARRAY_SIZE(buf
), buf
);
435 static int ht16k33_linedisp_get_map_type(struct linedisp
*linedisp
)
437 struct ht16k33_priv
*priv
= ht16k33_linedisp_to_priv(linedisp
);
439 switch (priv
->type
) {
441 INIT_DELAYED_WORK(&priv
->work
, ht16k33_seg7_update
);
442 return LINEDISP_MAP_SEG7
;
444 case DISP_QUAD_14SEG
:
445 INIT_DELAYED_WORK(&priv
->work
, ht16k33_seg14_update
);
446 return LINEDISP_MAP_SEG14
;
453 static void ht16k33_linedisp_update(struct linedisp
*linedisp
)
455 struct ht16k33_priv
*priv
= ht16k33_linedisp_to_priv(linedisp
);
457 schedule_delayed_work(&priv
->work
, 0);
460 static const struct linedisp_ops ht16k33_linedisp_ops
= {
461 .get_map_type
= ht16k33_linedisp_get_map_type
,
462 .update
= ht16k33_linedisp_update
,
465 static int ht16k33_led_probe(struct device
*dev
, struct led_classdev
*led
,
466 unsigned int brightness
)
468 struct led_init_data init_data
= {};
471 /* The LED is optional */
472 init_data
.fwnode
= device_get_named_child_node(dev
, "led");
473 if (!init_data
.fwnode
)
476 init_data
.devicename
= "auxdisplay";
477 init_data
.devname_mandatory
= true;
479 led
->brightness_set_blocking
= ht16k33_brightness_set_blocking
;
480 led
->blink_set
= ht16k33_blink_set
;
481 led
->flags
= LED_CORE_SUSPENDRESUME
;
482 led
->brightness
= brightness
;
483 led
->max_brightness
= MAX_BRIGHTNESS
;
485 err
= devm_led_classdev_register_ext(dev
, led
, &init_data
);
486 fwnode_handle_put(init_data
.fwnode
);
488 dev_err(dev
, "Failed to register LED\n");
493 static int ht16k33_keypad_probe(struct i2c_client
*client
,
494 struct ht16k33_keypad
*keypad
)
496 struct device
*dev
= &client
->dev
;
497 u32 rows
= HT16K33_MATRIX_KEYPAD_MAX_ROWS
;
498 u32 cols
= HT16K33_MATRIX_KEYPAD_MAX_COLS
;
501 keypad
->client
= client
;
502 init_waitqueue_head(&keypad
->wait
);
504 keypad
->dev
= devm_input_allocate_device(dev
);
508 input_set_drvdata(keypad
->dev
, keypad
);
510 keypad
->dev
->name
= DRIVER_NAME
"-keypad";
511 keypad
->dev
->id
.bustype
= BUS_I2C
;
512 keypad
->dev
->open
= ht16k33_keypad_start
;
513 keypad
->dev
->close
= ht16k33_keypad_stop
;
515 if (!device_property_read_bool(dev
, "linux,no-autorepeat"))
516 __set_bit(EV_REP
, keypad
->dev
->evbit
);
518 err
= device_property_read_u32(dev
, "debounce-delay-ms",
519 &keypad
->debounce_ms
);
521 dev_err(dev
, "key debounce delay not specified\n");
525 err
= matrix_keypad_parse_properties(dev
, &rows
, &cols
);
528 if (rows
> HT16K33_MATRIX_KEYPAD_MAX_ROWS
||
529 cols
> HT16K33_MATRIX_KEYPAD_MAX_COLS
) {
530 dev_err(dev
, "%u rows or %u cols out of range in DT\n", rows
,
537 keypad
->row_shift
= get_count_order(cols
);
539 err
= matrix_keypad_build_keymap(NULL
, NULL
, rows
, cols
, NULL
,
542 dev_err(dev
, "failed to build keymap\n");
546 err
= devm_request_threaded_irq(dev
, client
->irq
, NULL
,
547 ht16k33_keypad_irq_thread
,
548 IRQF_TRIGGER_HIGH
| IRQF_ONESHOT
,
549 DRIVER_NAME
, keypad
);
551 dev_err(dev
, "irq request failed %d, error %d\n", client
->irq
,
556 ht16k33_keypad_stop(keypad
->dev
);
558 return input_register_device(keypad
->dev
);
561 static int ht16k33_fbdev_probe(struct device
*dev
, struct ht16k33_priv
*priv
,
564 struct ht16k33_fbdev
*fbdev
= &priv
->fbdev
;
565 struct backlight_device
*bl
= NULL
;
569 err
= ht16k33_brightness_set(priv
, brightness
);
573 /* backwards compatibility with DT lacking an led subnode */
574 struct backlight_properties bl_props
;
576 memset(&bl_props
, 0, sizeof(struct backlight_properties
));
577 bl_props
.type
= BACKLIGHT_RAW
;
578 bl_props
.max_brightness
= MAX_BRIGHTNESS
;
580 bl
= devm_backlight_device_register(dev
, DRIVER_NAME
"-bl", dev
,
581 priv
, &ht16k33_bl_ops
,
584 dev_err(dev
, "failed to register backlight\n");
588 bl
->props
.brightness
= brightness
;
589 ht16k33_bl_update_status(bl
);
592 /* Framebuffer (2 bytes per column) */
593 BUILD_BUG_ON(PAGE_SIZE
< HT16K33_FB_SIZE
);
594 fbdev
->buffer
= (unsigned char *) get_zeroed_page(GFP_KERNEL
);
598 fbdev
->cache
= devm_kmalloc(dev
, HT16K33_FB_SIZE
, GFP_KERNEL
);
601 goto err_fbdev_buffer
;
604 fbdev
->info
= framebuffer_alloc(0, dev
);
607 goto err_fbdev_buffer
;
610 err
= device_property_read_u32(dev
, "refresh-rate-hz",
611 &fbdev
->refresh_rate
);
613 dev_err(dev
, "refresh rate not specified\n");
616 fb_bl_default_curve(fbdev
->info
, 0, MIN_BRIGHTNESS
, MAX_BRIGHTNESS
);
618 INIT_DELAYED_WORK(&priv
->work
, ht16k33_fb_update
);
619 fbdev
->info
->fbops
= &ht16k33_fb_ops
;
620 fbdev
->info
->flags
|= FBINFO_VIRTFB
;
621 fbdev
->info
->screen_buffer
= fbdev
->buffer
;
622 fbdev
->info
->screen_size
= HT16K33_FB_SIZE
;
623 fbdev
->info
->fix
= ht16k33_fb_fix
;
624 fbdev
->info
->var
= ht16k33_fb_var
;
625 fbdev
->info
->bl_dev
= bl
;
626 fbdev
->info
->pseudo_palette
= NULL
;
627 fbdev
->info
->par
= priv
;
629 err
= register_framebuffer(fbdev
->info
);
633 ht16k33_fb_queue(priv
);
637 framebuffer_release(fbdev
->info
);
639 free_page((unsigned long) fbdev
->buffer
);
644 static int ht16k33_seg_probe(struct device
*dev
, struct ht16k33_priv
*priv
,
647 struct linedisp
*linedisp
= &priv
->linedisp
;
650 err
= ht16k33_brightness_set(priv
, brightness
);
654 return linedisp_register(linedisp
, dev
, 4, &ht16k33_linedisp_ops
);
657 static int ht16k33_probe(struct i2c_client
*client
)
659 struct device
*dev
= &client
->dev
;
660 struct ht16k33_priv
*priv
;
661 uint32_t dft_brightness
;
664 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
)) {
665 dev_err(dev
, "i2c_check_functionality error\n");
669 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
673 priv
->client
= client
;
674 priv
->type
= (uintptr_t)i2c_get_match_data(client
);
676 i2c_set_clientdata(client
, priv
);
678 err
= ht16k33_initialize(priv
);
682 err
= device_property_read_u32(dev
, "default-brightness-level",
685 dft_brightness
= MAX_BRIGHTNESS
;
686 } else if (dft_brightness
> MAX_BRIGHTNESS
) {
688 "invalid default brightness level: %u, using %u\n",
689 dft_brightness
, MAX_BRIGHTNESS
);
690 dft_brightness
= MAX_BRIGHTNESS
;
694 err
= ht16k33_led_probe(dev
, &priv
->led
, dft_brightness
);
699 if (client
->irq
> 0) {
700 err
= ht16k33_keypad_probe(client
, &priv
->keypad
);
705 switch (priv
->type
) {
707 /* Frame Buffer Display */
708 err
= ht16k33_fbdev_probe(dev
, priv
, dft_brightness
);
712 case DISP_QUAD_14SEG
:
713 /* Segment Display */
714 err
= ht16k33_seg_probe(dev
, priv
, dft_brightness
);
723 static void ht16k33_remove(struct i2c_client
*client
)
725 struct ht16k33_priv
*priv
= i2c_get_clientdata(client
);
726 struct ht16k33_fbdev
*fbdev
= &priv
->fbdev
;
728 cancel_delayed_work_sync(&priv
->work
);
730 switch (priv
->type
) {
732 unregister_framebuffer(fbdev
->info
);
733 framebuffer_release(fbdev
->info
);
734 free_page((unsigned long)fbdev
->buffer
);
738 case DISP_QUAD_14SEG
:
739 linedisp_unregister(&priv
->linedisp
);
747 static const struct i2c_device_id ht16k33_i2c_match
[] = {
748 { "3108", DISP_QUAD_7SEG
},
749 { "3130", DISP_QUAD_14SEG
},
750 { "ht16k33", DISP_MATRIX
},
753 MODULE_DEVICE_TABLE(i2c
, ht16k33_i2c_match
);
755 static const struct of_device_id ht16k33_of_match
[] = {
757 /* 0.56" 4-Digit 7-Segment FeatherWing Display (Red) */
758 .compatible
= "adafruit,3108", .data
= (void *)DISP_QUAD_7SEG
,
760 /* 0.54" Quad Alphanumeric FeatherWing Display (Red) */
761 .compatible
= "adafruit,3130", .data
= (void *)DISP_QUAD_14SEG
,
763 /* Generic, assumed Dot-Matrix Display */
764 .compatible
= "holtek,ht16k33", .data
= (void *)DISP_MATRIX
,
768 MODULE_DEVICE_TABLE(of
, ht16k33_of_match
);
770 static struct i2c_driver ht16k33_driver
= {
771 .probe
= ht16k33_probe
,
772 .remove
= ht16k33_remove
,
775 .of_match_table
= ht16k33_of_match
,
777 .id_table
= ht16k33_i2c_match
,
779 module_i2c_driver(ht16k33_driver
);
781 MODULE_DESCRIPTION("Holtek HT16K33 driver");
782 MODULE_LICENSE("GPL");
783 MODULE_IMPORT_NS(LINEDISP
);
784 MODULE_AUTHOR("Robin van der Gracht <robin@protonic.nl>");