4 * Author: Robin van der Gracht <robin@protonic.nl>
6 * Copyright: (C) 2016 Protonic Holland.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
18 #include <linux/kernel.h>
19 #include <linux/module.h>
20 #include <linux/interrupt.h>
21 #include <linux/i2c.h>
24 #include <linux/slab.h>
25 #include <linux/backlight.h>
26 #include <linux/input.h>
27 #include <linux/input/matrix_keypad.h>
28 #include <linux/workqueue.h>
32 #define REG_SYSTEM_SETUP 0x20
33 #define REG_SYSTEM_SETUP_OSC_ON BIT(0)
35 #define REG_DISPLAY_SETUP 0x80
36 #define REG_DISPLAY_SETUP_ON BIT(0)
38 #define REG_ROWINT_SET 0xA0
39 #define REG_ROWINT_SET_INT_EN BIT(0)
40 #define REG_ROWINT_SET_INT_ACT_HIGH BIT(1)
42 #define REG_BRIGHTNESS 0xE0
45 #define DRIVER_NAME "ht16k33"
47 #define MIN_BRIGHTNESS 0x1
48 #define MAX_BRIGHTNESS 0x10
50 #define HT16K33_MATRIX_LED_MAX_COLS 8
51 #define HT16K33_MATRIX_LED_MAX_ROWS 16
52 #define HT16K33_MATRIX_KEYPAD_MAX_COLS 3
53 #define HT16K33_MATRIX_KEYPAD_MAX_ROWS 12
55 #define BYTES_PER_ROW (HT16K33_MATRIX_LED_MAX_ROWS / 8)
56 #define HT16K33_FB_SIZE (HT16K33_MATRIX_LED_MAX_COLS * BYTES_PER_ROW)
58 struct ht16k33_keypad
{
59 struct input_dev
*dev
;
61 struct delayed_work work
;
66 uint16_t last_key_state
[HT16K33_MATRIX_KEYPAD_MAX_COLS
];
69 struct ht16k33_fbdev
{
71 uint32_t refresh_rate
;
74 struct delayed_work work
;
78 struct i2c_client
*client
;
79 struct ht16k33_keypad keypad
;
80 struct ht16k33_fbdev fbdev
;
81 struct workqueue_struct
*workqueue
;
84 static struct fb_fix_screeninfo ht16k33_fb_fix
= {
86 .type
= FB_TYPE_PACKED_PIXELS
,
87 .visual
= FB_VISUAL_MONO10
,
91 .line_length
= HT16K33_MATRIX_LED_MAX_ROWS
,
92 .accel
= FB_ACCEL_NONE
,
95 static struct fb_var_screeninfo ht16k33_fb_var
= {
96 .xres
= HT16K33_MATRIX_LED_MAX_ROWS
,
97 .yres
= HT16K33_MATRIX_LED_MAX_COLS
,
98 .xres_virtual
= HT16K33_MATRIX_LED_MAX_ROWS
,
99 .yres_virtual
= HT16K33_MATRIX_LED_MAX_COLS
,
102 .green
= { 0, 1, 0 },
108 .vmode
= FB_VMODE_NONINTERLACED
,
111 static int ht16k33_display_on(struct ht16k33_priv
*priv
)
113 uint8_t data
= REG_DISPLAY_SETUP
| REG_DISPLAY_SETUP_ON
;
115 return i2c_smbus_write_byte(priv
->client
, data
);
118 static int ht16k33_display_off(struct ht16k33_priv
*priv
)
120 return i2c_smbus_write_byte(priv
->client
, REG_DISPLAY_SETUP
);
123 static void ht16k33_fb_queue(struct ht16k33_priv
*priv
)
125 struct ht16k33_fbdev
*fbdev
= &priv
->fbdev
;
127 queue_delayed_work(priv
->workqueue
, &fbdev
->work
,
128 msecs_to_jiffies(HZ
/ fbdev
->refresh_rate
));
131 static void ht16k33_keypad_queue(struct ht16k33_priv
*priv
)
133 struct ht16k33_keypad
*keypad
= &priv
->keypad
;
135 queue_delayed_work(priv
->workqueue
, &keypad
->work
,
136 msecs_to_jiffies(keypad
->debounce_ms
));
140 * This gets the fb data from cache and copies it to ht16k33 display RAM
142 static void ht16k33_fb_update(struct work_struct
*work
)
144 struct ht16k33_fbdev
*fbdev
=
145 container_of(work
, struct ht16k33_fbdev
, work
.work
);
146 struct ht16k33_priv
*priv
=
147 container_of(fbdev
, struct ht16k33_priv
, fbdev
);
150 int len
, pos
= 0, first
= -1;
155 /* Search for the first byte with changes */
156 while (pos
< HT16K33_FB_SIZE
&& first
< 0) {
157 if (*(p1
++) - *(p2
++))
162 /* No changes found */
166 len
= HT16K33_FB_SIZE
- first
;
167 p1
= fbdev
->cache
+ HT16K33_FB_SIZE
- 1;
168 p2
= fbdev
->buffer
+ HT16K33_FB_SIZE
- 1;
170 /* Determine i2c transfer length */
172 if (*(p1
--) - *(p2
--))
177 p1
= fbdev
->cache
+ first
;
178 p2
= fbdev
->buffer
+ first
;
179 if (!i2c_smbus_write_i2c_block_data(priv
->client
, first
, len
, p2
))
182 ht16k33_fb_queue(priv
);
185 static int ht16k33_keypad_start(struct input_dev
*dev
)
187 struct ht16k33_priv
*priv
= input_get_drvdata(dev
);
188 struct ht16k33_keypad
*keypad
= &priv
->keypad
;
191 * Schedule an immediate key scan to capture current key state;
192 * columns will be activated and IRQs be enabled after the scan.
194 queue_delayed_work(priv
->workqueue
, &keypad
->work
, 0);
198 static void ht16k33_keypad_stop(struct input_dev
*dev
)
200 struct ht16k33_priv
*priv
= input_get_drvdata(dev
);
201 struct ht16k33_keypad
*keypad
= &priv
->keypad
;
203 cancel_delayed_work(&keypad
->work
);
205 * ht16k33_keypad_scan() will leave IRQs enabled;
206 * we should disable them now.
208 disable_irq_nosync(priv
->client
->irq
);
211 static int ht16k33_initialize(struct ht16k33_priv
*priv
)
215 uint8_t data
[HT16K33_MATRIX_LED_MAX_COLS
* 2];
217 /* Clear RAM (8 * 16 bits) */
218 memset(data
, 0, sizeof(data
));
219 err
= i2c_smbus_write_block_data(priv
->client
, 0, sizeof(data
), data
);
223 /* Turn on internal oscillator */
224 byte
= REG_SYSTEM_SETUP_OSC_ON
| REG_SYSTEM_SETUP
;
225 err
= i2c_smbus_write_byte(priv
->client
, byte
);
229 /* Configure INT pin */
230 byte
= REG_ROWINT_SET
| REG_ROWINT_SET_INT_ACT_HIGH
;
231 if (priv
->client
->irq
> 0)
232 byte
|= REG_ROWINT_SET_INT_EN
;
233 return i2c_smbus_write_byte(priv
->client
, byte
);
237 * This gets the keys from keypad and reports it to input subsystem
239 static void ht16k33_keypad_scan(struct work_struct
*work
)
241 struct ht16k33_keypad
*keypad
=
242 container_of(work
, struct ht16k33_keypad
, work
.work
);
243 struct ht16k33_priv
*priv
=
244 container_of(keypad
, struct ht16k33_priv
, keypad
);
245 const unsigned short *keycodes
= keypad
->dev
->keycode
;
246 uint16_t bits_changed
, new_state
[HT16K33_MATRIX_KEYPAD_MAX_COLS
];
247 uint8_t data
[HT16K33_MATRIX_KEYPAD_MAX_COLS
* 2];
249 bool reschedule
= false;
251 if (i2c_smbus_read_i2c_block_data(priv
->client
, 0x40, 6, data
) != 6) {
252 dev_err(&priv
->client
->dev
, "Failed to read key data\n");
256 for (col
= 0; col
< keypad
->cols
; col
++) {
257 new_state
[col
] = (data
[col
* 2 + 1] << 8) | data
[col
* 2];
260 bits_changed
= keypad
->last_key_state
[col
] ^ new_state
[col
];
262 while (bits_changed
) {
263 row
= ffs(bits_changed
) - 1;
264 code
= MATRIX_SCAN_CODE(row
, col
, keypad
->row_shift
);
265 input_event(keypad
->dev
, EV_MSC
, MSC_SCAN
, code
);
266 input_report_key(keypad
->dev
, keycodes
[code
],
267 new_state
[col
] & BIT(row
));
268 bits_changed
&= ~BIT(row
);
271 input_sync(keypad
->dev
);
272 memcpy(keypad
->last_key_state
, new_state
, sizeof(new_state
));
276 ht16k33_keypad_queue(priv
);
278 enable_irq(priv
->client
->irq
);
281 static irqreturn_t
ht16k33_irq_thread(int irq
, void *dev
)
283 struct ht16k33_priv
*priv
= dev
;
285 disable_irq_nosync(priv
->client
->irq
);
286 ht16k33_keypad_queue(priv
);
291 static int ht16k33_bl_update_status(struct backlight_device
*bl
)
293 int brightness
= bl
->props
.brightness
;
294 struct ht16k33_priv
*priv
= bl_get_data(bl
);
296 if (bl
->props
.power
!= FB_BLANK_UNBLANK
||
297 bl
->props
.fb_blank
!= FB_BLANK_UNBLANK
||
298 bl
->props
.state
& BL_CORE_FBBLANK
|| brightness
== 0) {
299 return ht16k33_display_off(priv
);
302 ht16k33_display_on(priv
);
303 return i2c_smbus_write_byte(priv
->client
,
304 REG_BRIGHTNESS
| (brightness
- 1));
307 static int ht16k33_bl_check_fb(struct backlight_device
*bl
, struct fb_info
*fi
)
309 struct ht16k33_priv
*priv
= bl_get_data(bl
);
311 return (fi
== NULL
) || (fi
->par
== priv
);
314 static const struct backlight_ops ht16k33_bl_ops
= {
315 .update_status
= ht16k33_bl_update_status
,
316 .check_fb
= ht16k33_bl_check_fb
,
319 static int ht16k33_mmap(struct fb_info
*info
, struct vm_area_struct
*vma
)
321 struct ht16k33_priv
*priv
= info
->par
;
323 return vm_insert_page(vma
, vma
->vm_start
,
324 virt_to_page(priv
->fbdev
.buffer
));
327 static struct fb_ops ht16k33_fb_ops
= {
328 .owner
= THIS_MODULE
,
329 .fb_read
= fb_sys_read
,
330 .fb_write
= fb_sys_write
,
331 .fb_fillrect
= sys_fillrect
,
332 .fb_copyarea
= sys_copyarea
,
333 .fb_imageblit
= sys_imageblit
,
334 .fb_mmap
= ht16k33_mmap
,
337 static int ht16k33_probe(struct i2c_client
*client
,
338 const struct i2c_device_id
*id
)
341 uint32_t rows
, cols
, dft_brightness
;
342 struct backlight_device
*bl
;
343 struct backlight_properties bl_props
;
344 struct ht16k33_priv
*priv
;
345 struct ht16k33_keypad
*keypad
;
346 struct ht16k33_fbdev
*fbdev
;
347 struct device_node
*node
= client
->dev
.of_node
;
349 if (!i2c_check_functionality(client
->adapter
, I2C_FUNC_I2C
)) {
350 dev_err(&client
->dev
, "i2c_check_functionality error\n");
354 if (client
->irq
<= 0) {
355 dev_err(&client
->dev
, "No IRQ specified\n");
359 priv
= devm_kzalloc(&client
->dev
, sizeof(*priv
), GFP_KERNEL
);
363 priv
->client
= client
;
364 i2c_set_clientdata(client
, priv
);
365 fbdev
= &priv
->fbdev
;
366 keypad
= &priv
->keypad
;
368 priv
->workqueue
= create_singlethread_workqueue(DRIVER_NAME
"-wq");
369 if (priv
->workqueue
== NULL
)
372 err
= ht16k33_initialize(priv
);
376 /* Framebuffer (2 bytes per column) */
377 BUILD_BUG_ON(PAGE_SIZE
< HT16K33_FB_SIZE
);
378 fbdev
->buffer
= (unsigned char *) get_zeroed_page(GFP_KERNEL
);
379 if (!fbdev
->buffer
) {
384 fbdev
->cache
= devm_kmalloc(&client
->dev
, HT16K33_FB_SIZE
, GFP_KERNEL
);
387 goto err_fbdev_buffer
;
390 fbdev
->info
= framebuffer_alloc(0, &client
->dev
);
393 goto err_fbdev_buffer
;
396 err
= of_property_read_u32(node
, "refresh-rate-hz",
397 &fbdev
->refresh_rate
);
399 dev_err(&client
->dev
, "refresh rate not specified\n");
402 fb_bl_default_curve(fbdev
->info
, 0, MIN_BRIGHTNESS
, MAX_BRIGHTNESS
);
404 INIT_DELAYED_WORK(&fbdev
->work
, ht16k33_fb_update
);
405 fbdev
->info
->fbops
= &ht16k33_fb_ops
;
406 fbdev
->info
->screen_base
= (char __iomem
*) fbdev
->buffer
;
407 fbdev
->info
->screen_size
= HT16K33_FB_SIZE
;
408 fbdev
->info
->fix
= ht16k33_fb_fix
;
409 fbdev
->info
->var
= ht16k33_fb_var
;
410 fbdev
->info
->pseudo_palette
= NULL
;
411 fbdev
->info
->flags
= FBINFO_FLAG_DEFAULT
;
412 fbdev
->info
->par
= priv
;
414 err
= register_framebuffer(fbdev
->info
);
419 keypad
->dev
= devm_input_allocate_device(&client
->dev
);
422 goto err_fbdev_unregister
;
425 keypad
->dev
->name
= DRIVER_NAME
"-keypad";
426 keypad
->dev
->id
.bustype
= BUS_I2C
;
427 keypad
->dev
->open
= ht16k33_keypad_start
;
428 keypad
->dev
->close
= ht16k33_keypad_stop
;
430 if (!of_get_property(node
, "linux,no-autorepeat", NULL
))
431 __set_bit(EV_REP
, keypad
->dev
->evbit
);
433 err
= of_property_read_u32(node
, "debounce-delay-ms",
434 &keypad
->debounce_ms
);
436 dev_err(&client
->dev
, "key debounce delay not specified\n");
437 goto err_fbdev_unregister
;
440 err
= devm_request_threaded_irq(&client
->dev
, client
->irq
, NULL
,
442 IRQF_TRIGGER_RISING
| IRQF_ONESHOT
,
445 dev_err(&client
->dev
, "irq request failed %d, error %d\n",
447 goto err_fbdev_unregister
;
450 disable_irq_nosync(client
->irq
);
451 rows
= HT16K33_MATRIX_KEYPAD_MAX_ROWS
;
452 cols
= HT16K33_MATRIX_KEYPAD_MAX_COLS
;
453 err
= matrix_keypad_parse_of_params(&client
->dev
, &rows
, &cols
);
455 goto err_fbdev_unregister
;
457 err
= matrix_keypad_build_keymap(NULL
, NULL
, rows
, cols
, NULL
,
460 dev_err(&client
->dev
, "failed to build keymap\n");
461 goto err_fbdev_unregister
;
464 input_set_drvdata(keypad
->dev
, priv
);
467 keypad
->row_shift
= get_count_order(cols
);
468 INIT_DELAYED_WORK(&keypad
->work
, ht16k33_keypad_scan
);
470 err
= input_register_device(keypad
->dev
);
472 goto err_fbdev_unregister
;
475 memset(&bl_props
, 0, sizeof(struct backlight_properties
));
476 bl_props
.type
= BACKLIGHT_RAW
;
477 bl_props
.max_brightness
= MAX_BRIGHTNESS
;
479 bl
= devm_backlight_device_register(&client
->dev
, DRIVER_NAME
"-bl",
481 &ht16k33_bl_ops
, &bl_props
);
483 dev_err(&client
->dev
, "failed to register backlight\n");
485 goto err_keypad_unregister
;
488 err
= of_property_read_u32(node
, "default-brightness-level",
491 dft_brightness
= MAX_BRIGHTNESS
;
492 } else if (dft_brightness
> MAX_BRIGHTNESS
) {
493 dev_warn(&client
->dev
,
494 "invalid default brightness level: %u, using %u\n",
495 dft_brightness
, MAX_BRIGHTNESS
);
496 dft_brightness
= MAX_BRIGHTNESS
;
499 bl
->props
.brightness
= dft_brightness
;
500 ht16k33_bl_update_status(bl
);
502 ht16k33_fb_queue(priv
);
505 err_keypad_unregister
:
506 input_unregister_device(keypad
->dev
);
507 err_fbdev_unregister
:
508 unregister_framebuffer(fbdev
->info
);
510 framebuffer_release(fbdev
->info
);
512 free_page((unsigned long) fbdev
->buffer
);
516 destroy_workqueue(priv
->workqueue
);
521 static int ht16k33_remove(struct i2c_client
*client
)
523 struct ht16k33_priv
*priv
= i2c_get_clientdata(client
);
524 struct ht16k33_keypad
*keypad
= &priv
->keypad
;
525 struct ht16k33_fbdev
*fbdev
= &priv
->fbdev
;
527 ht16k33_keypad_stop(keypad
->dev
);
529 cancel_delayed_work(&fbdev
->work
);
530 unregister_framebuffer(fbdev
->info
);
531 framebuffer_release(fbdev
->info
);
532 free_page((unsigned long) fbdev
->buffer
);
534 destroy_workqueue(priv
->workqueue
);
538 static const struct i2c_device_id ht16k33_i2c_match
[] = {
542 MODULE_DEVICE_TABLE(i2c
, ht16k33_i2c_match
);
544 static const struct of_device_id ht16k33_of_match
[] = {
545 { .compatible
= "holtek,ht16k33", },
548 MODULE_DEVICE_TABLE(of
, ht16k33_of_match
);
550 static struct i2c_driver ht16k33_driver
= {
551 .probe
= ht16k33_probe
,
552 .remove
= ht16k33_remove
,
555 .of_match_table
= of_match_ptr(ht16k33_of_match
),
557 .id_table
= ht16k33_i2c_match
,
559 module_i2c_driver(ht16k33_driver
);
561 MODULE_DESCRIPTION("Holtek HT16K33 driver");
562 MODULE_LICENSE("GPL");
563 MODULE_AUTHOR("Robin van der Gracht <robin@protonic.nl>");