2 * Common code for AUO-K190X framebuffer drivers
4 * Copyright (C) 2012 Heiko Stuebner <heiko@sntech.de>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
11 #include <linux/module.h>
12 #include <linux/kernel.h>
13 #include <linux/gpio.h>
14 #include <linux/platform_device.h>
15 #include <linux/pm_runtime.h>
17 #include <linux/delay.h>
18 #include <linux/uaccess.h>
19 #include <linux/vmalloc.h>
20 #include <linux/regulator/consumer.h>
22 #include <video/auo_k190xfb.h>
24 #include "auo_k190x.h"
31 /* table of panel specific parameters to be indexed into by the board drivers */
32 static struct panel_info panel_table
[] = {
34 [AUOK190X_RESOLUTION_800_600
] = {
39 [AUOK190X_RESOLUTION_1024_768
] = {
43 [AUOK190X_RESOLUTION_600_800
] = {
47 [AUOK190X_RESOLUTION_768_1024
] = {
54 * private I80 interface to the board driver
57 static void auok190x_issue_data(struct auok190xfb_par
*par
, u16 data
)
59 par
->board
->set_ctl(par
, AUOK190X_I80_WR
, 0);
60 par
->board
->set_hdb(par
, data
);
61 par
->board
->set_ctl(par
, AUOK190X_I80_WR
, 1);
64 static void auok190x_issue_cmd(struct auok190xfb_par
*par
, u16 data
)
66 par
->board
->set_ctl(par
, AUOK190X_I80_DC
, 0);
67 auok190x_issue_data(par
, data
);
68 par
->board
->set_ctl(par
, AUOK190X_I80_DC
, 1);
72 * Conversion of 16bit color to 4bit grayscale
73 * does roughly (0.3 * R + 0.6 G + 0.1 B) / 2
75 static inline int rgb565_to_gray4(u16 data
, struct fb_var_screeninfo
*var
)
77 return ((((data
& 0xF800) >> var
->red
.offset
) * 77 +
78 ((data
& 0x07E0) >> (var
->green
.offset
+ 1)) * 151 +
79 ((data
& 0x1F) >> var
->blue
.offset
) * 28) >> 8 >> 1);
82 static int auok190x_issue_pixels_rgb565(struct auok190xfb_par
*par
, int size
,
85 struct fb_var_screeninfo
*var
= &par
->info
->var
;
86 struct device
*dev
= par
->info
->device
;
91 dev_err(dev
, "issue_pixels: size %d must be a multiple of 8\n",
96 for (i
= 0; i
< (size
>> 2); i
++) {
97 par
->board
->set_ctl(par
, AUOK190X_I80_WR
, 0);
99 tmp
= (rgb565_to_gray4(data
[4*i
], var
) & 0x000F);
100 tmp
|= (rgb565_to_gray4(data
[4*i
+1], var
) << 4) & 0x00F0;
101 tmp
|= (rgb565_to_gray4(data
[4*i
+2], var
) << 8) & 0x0F00;
102 tmp
|= (rgb565_to_gray4(data
[4*i
+3], var
) << 12) & 0xF000;
104 par
->board
->set_hdb(par
, tmp
);
105 par
->board
->set_ctl(par
, AUOK190X_I80_WR
, 1);
111 static int auok190x_issue_pixels_gray8(struct auok190xfb_par
*par
, int size
,
114 struct device
*dev
= par
->info
->device
;
119 dev_err(dev
, "issue_pixels: size %d must be a multiple of 4\n",
124 for (i
= 0; i
< (size
>> 1); i
++) {
125 par
->board
->set_ctl(par
, AUOK190X_I80_WR
, 0);
127 /* simple reduction of 8bit staticgray to 4bit gray
128 * combines 4 * 4bit pixel values into a 16bit value
130 tmp
= (data
[2*i
] & 0xF0) >> 4;
131 tmp
|= (data
[2*i
] & 0xF000) >> 8;
132 tmp
|= (data
[2*i
+1] & 0xF0) << 4;
133 tmp
|= (data
[2*i
+1] & 0xF000);
135 par
->board
->set_hdb(par
, tmp
);
136 par
->board
->set_ctl(par
, AUOK190X_I80_WR
, 1);
142 static int auok190x_issue_pixels(struct auok190xfb_par
*par
, int size
,
145 struct fb_info
*info
= par
->info
;
146 struct device
*dev
= par
->info
->device
;
148 if (info
->var
.bits_per_pixel
== 8 && info
->var
.grayscale
)
149 auok190x_issue_pixels_gray8(par
, size
, data
);
150 else if (info
->var
.bits_per_pixel
== 16)
151 auok190x_issue_pixels_rgb565(par
, size
, data
);
153 dev_err(dev
, "unsupported color mode (bits: %d, gray: %d)\n",
154 info
->var
.bits_per_pixel
, info
->var
.grayscale
);
159 static u16
auok190x_read_data(struct auok190xfb_par
*par
)
163 par
->board
->set_ctl(par
, AUOK190X_I80_OE
, 0);
164 data
= par
->board
->get_hdb(par
);
165 par
->board
->set_ctl(par
, AUOK190X_I80_OE
, 1);
171 * Command interface for the controller drivers
174 void auok190x_send_command_nowait(struct auok190xfb_par
*par
, u16 data
)
176 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 0);
177 auok190x_issue_cmd(par
, data
);
178 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 1);
180 EXPORT_SYMBOL_GPL(auok190x_send_command_nowait
);
182 void auok190x_send_cmdargs_nowait(struct auok190xfb_par
*par
, u16 cmd
,
187 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 0);
188 auok190x_issue_cmd(par
, cmd
);
190 for (i
= 0; i
< argc
; i
++)
191 auok190x_issue_data(par
, argv
[i
]);
192 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 1);
194 EXPORT_SYMBOL_GPL(auok190x_send_cmdargs_nowait
);
196 int auok190x_send_command(struct auok190xfb_par
*par
, u16 data
)
200 ret
= par
->board
->wait_for_rdy(par
);
204 auok190x_send_command_nowait(par
, data
);
207 EXPORT_SYMBOL_GPL(auok190x_send_command
);
209 int auok190x_send_cmdargs(struct auok190xfb_par
*par
, u16 cmd
,
214 ret
= par
->board
->wait_for_rdy(par
);
218 auok190x_send_cmdargs_nowait(par
, cmd
, argc
, argv
);
221 EXPORT_SYMBOL_GPL(auok190x_send_cmdargs
);
223 int auok190x_read_cmdargs(struct auok190xfb_par
*par
, u16 cmd
,
228 ret
= par
->board
->wait_for_rdy(par
);
232 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 0);
233 auok190x_issue_cmd(par
, cmd
);
235 for (i
= 0; i
< argc
; i
++)
236 argv
[i
] = auok190x_read_data(par
);
237 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 1);
241 EXPORT_SYMBOL_GPL(auok190x_read_cmdargs
);
243 void auok190x_send_cmdargs_pixels_nowait(struct auok190xfb_par
*par
, u16 cmd
,
244 int argc
, u16
*argv
, int size
, u16
*data
)
248 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 0);
250 auok190x_issue_cmd(par
, cmd
);
252 for (i
= 0; i
< argc
; i
++)
253 auok190x_issue_data(par
, argv
[i
]);
255 auok190x_issue_pixels(par
, size
, data
);
257 par
->board
->set_ctl(par
, AUOK190X_I80_CS
, 1);
259 EXPORT_SYMBOL_GPL(auok190x_send_cmdargs_pixels_nowait
);
261 int auok190x_send_cmdargs_pixels(struct auok190xfb_par
*par
, u16 cmd
,
262 int argc
, u16
*argv
, int size
, u16
*data
)
266 ret
= par
->board
->wait_for_rdy(par
);
270 auok190x_send_cmdargs_pixels_nowait(par
, cmd
, argc
, argv
, size
, data
);
274 EXPORT_SYMBOL_GPL(auok190x_send_cmdargs_pixels
);
277 * fbdefio callbacks - common on both controllers.
280 static void auok190xfb_dpy_first_io(struct fb_info
*info
)
282 /* tell runtime-pm that we wish to use the device in a short time */
283 pm_runtime_get(info
->device
);
286 /* this is called back from the deferred io workqueue */
287 static void auok190xfb_dpy_deferred_io(struct fb_info
*info
,
288 struct list_head
*pagelist
)
290 struct fb_deferred_io
*fbdefio
= info
->fbdefio
;
291 struct auok190xfb_par
*par
= info
->par
;
292 u16 line_length
= info
->fix
.line_length
;
293 u16 yres
= info
->var
.yres
;
300 if (!list_empty(pagelist
))
301 /* the device resume should've been requested through first_io,
302 * if the resume did not finish until now, wait for it.
304 pm_runtime_barrier(info
->device
);
306 /* We reached this via the fsync or some other way.
307 * In either case the first_io function did not run,
308 * so we runtime_resume the device here synchronously.
310 pm_runtime_get_sync(info
->device
);
312 /* Do a full screen update every n updates to prevent
313 * excessive darkening of the Sipix display.
314 * If we do this, there is no need to walk the pages.
316 if (par
->need_refresh(par
)) {
317 par
->update_all(par
);
321 /* height increment is fixed per page */
322 h_inc
= DIV_ROUND_UP(PAGE_SIZE
, line_length
);
324 /* calculate number of pages from pixel height */
325 threshold
= par
->consecutive_threshold
/ h_inc
;
329 /* walk the written page list and swizzle the data */
330 list_for_each_entry(cur
, &fbdefio
->pagelist
, lru
) {
331 if (prev_index
< 0) {
332 /* just starting so assign first page */
333 y1
= (cur
->index
<< PAGE_SHIFT
) / line_length
;
335 } else if ((cur
->index
- prev_index
) <= threshold
) {
336 /* page is within our threshold for single updates */
337 h
+= h_inc
* (cur
->index
- prev_index
);
339 /* page not consecutive, issue previous update first */
340 par
->update_partial(par
, y1
, y1
+ h
);
342 /* start over with our non consecutive page */
343 y1
= (cur
->index
<< PAGE_SHIFT
) / line_length
;
346 prev_index
= cur
->index
;
349 /* if we still have any pages to update we do so now */
351 /* its a full screen update, just do it */
352 par
->update_all(par
);
354 par
->update_partial(par
, y1
, min((u16
) (y1
+ h
), yres
));
357 pm_runtime_mark_last_busy(info
->device
);
358 pm_runtime_put_autosuspend(info
->device
);
362 * framebuffer operations
366 * this is the slow path from userspace. they can seek and write to
367 * the fb. it's inefficient to do anything less than a full screen draw
369 static ssize_t
auok190xfb_write(struct fb_info
*info
, const char __user
*buf
,
370 size_t count
, loff_t
*ppos
)
372 struct auok190xfb_par
*par
= info
->par
;
373 unsigned long p
= *ppos
;
376 unsigned long total_size
;
378 if (info
->state
!= FBINFO_STATE_RUNNING
)
381 total_size
= info
->fix
.smem_len
;
386 if (count
> total_size
) {
391 if (count
+ p
> total_size
) {
395 count
= total_size
- p
;
398 dst
= (void *)(info
->screen_base
+ p
);
400 if (copy_from_user(dst
, buf
, count
))
406 par
->update_all(par
);
408 return (err
) ? err
: count
;
411 static void auok190xfb_fillrect(struct fb_info
*info
,
412 const struct fb_fillrect
*rect
)
414 struct auok190xfb_par
*par
= info
->par
;
416 sys_fillrect(info
, rect
);
418 par
->update_all(par
);
421 static void auok190xfb_copyarea(struct fb_info
*info
,
422 const struct fb_copyarea
*area
)
424 struct auok190xfb_par
*par
= info
->par
;
426 sys_copyarea(info
, area
);
428 par
->update_all(par
);
431 static void auok190xfb_imageblit(struct fb_info
*info
,
432 const struct fb_image
*image
)
434 struct auok190xfb_par
*par
= info
->par
;
436 sys_imageblit(info
, image
);
438 par
->update_all(par
);
441 static int auok190xfb_check_var(struct fb_var_screeninfo
*var
,
442 struct fb_info
*info
)
444 struct device
*dev
= info
->device
;
445 struct auok190xfb_par
*par
= info
->par
;
446 struct panel_info
*panel
= &panel_table
[par
->resolution
];
453 if (var
->bits_per_pixel
== 8 && var
->grayscale
== 1) {
455 * For 8-bit grayscale, R, G, and B offset are equal.
459 var
->red
.msb_right
= 0;
461 var
->green
.length
= 8;
462 var
->green
.offset
= 0;
463 var
->green
.msb_right
= 0;
465 var
->blue
.length
= 8;
466 var
->blue
.offset
= 0;
467 var
->blue
.msb_right
= 0;
469 var
->transp
.length
= 0;
470 var
->transp
.offset
= 0;
471 var
->transp
.msb_right
= 0;
472 } else if (var
->bits_per_pixel
== 16) {
474 var
->red
.offset
= 11;
475 var
->red
.msb_right
= 0;
477 var
->green
.length
= 6;
478 var
->green
.offset
= 5;
479 var
->green
.msb_right
= 0;
481 var
->blue
.length
= 5;
482 var
->blue
.offset
= 0;
483 var
->blue
.msb_right
= 0;
485 var
->transp
.length
= 0;
486 var
->transp
.offset
= 0;
487 var
->transp
.msb_right
= 0;
489 dev_warn(dev
, "unsupported color mode (bits: %d, grayscale: %d)\n",
490 info
->var
.bits_per_pixel
, info
->var
.grayscale
);
498 switch (var
->rotate
) {
501 var
->xres
= panel
->w
;
502 var
->yres
= panel
->h
;
506 var
->xres
= panel
->h
;
507 var
->yres
= panel
->w
;
510 dev_dbg(dev
, "Invalid rotation request\n");
514 var
->xres_virtual
= var
->xres
;
515 var
->yres_virtual
= var
->yres
;
521 size
= var
->xres_virtual
* var
->yres_virtual
* var
->bits_per_pixel
/ 8;
522 if (size
> info
->fix
.smem_len
) {
523 dev_err(dev
, "Memory limit exceeded, requested %dK\n",
531 static int auok190xfb_set_fix(struct fb_info
*info
)
533 struct fb_fix_screeninfo
*fix
= &info
->fix
;
534 struct fb_var_screeninfo
*var
= &info
->var
;
536 fix
->line_length
= var
->xres_virtual
* var
->bits_per_pixel
/ 8;
538 fix
->type
= FB_TYPE_PACKED_PIXELS
;
539 fix
->accel
= FB_ACCEL_NONE
;
540 fix
->visual
= (var
->grayscale
) ? FB_VISUAL_STATIC_PSEUDOCOLOR
541 : FB_VISUAL_TRUECOLOR
;
549 static int auok190xfb_set_par(struct fb_info
*info
)
551 struct auok190xfb_par
*par
= info
->par
;
553 par
->rotation
= info
->var
.rotate
;
554 auok190xfb_set_fix(info
);
556 /* reinit the controller to honor the rotation */
559 /* wait for init to complete */
560 par
->board
->wait_for_rdy(par
);
565 static struct fb_ops auok190xfb_ops
= {
566 .owner
= THIS_MODULE
,
567 .fb_read
= fb_sys_read
,
568 .fb_write
= auok190xfb_write
,
569 .fb_fillrect
= auok190xfb_fillrect
,
570 .fb_copyarea
= auok190xfb_copyarea
,
571 .fb_imageblit
= auok190xfb_imageblit
,
572 .fb_check_var
= auok190xfb_check_var
,
573 .fb_set_par
= auok190xfb_set_par
,
577 * Controller-functions common to both K1900 and K1901
580 static int auok190x_read_temperature(struct auok190xfb_par
*par
)
582 struct device
*dev
= par
->info
->device
;
586 pm_runtime_get_sync(dev
);
588 mutex_lock(&(par
->io_lock
));
590 auok190x_read_cmdargs(par
, AUOK190X_CMD_READ_VERSION
, 4, data
);
592 mutex_unlock(&(par
->io_lock
));
594 pm_runtime_mark_last_busy(dev
);
595 pm_runtime_put_autosuspend(dev
);
597 /* sanitize and split of half-degrees for now */
598 temp
= ((data
[0] & AUOK190X_VERSION_TEMP_MASK
) >> 1);
600 /* handle positive and negative temperatures */
602 return (255 - temp
+ 1) * (-1);
607 static void auok190x_identify(struct auok190xfb_par
*par
)
609 struct device
*dev
= par
->info
->device
;
612 pm_runtime_get_sync(dev
);
614 mutex_lock(&(par
->io_lock
));
616 auok190x_read_cmdargs(par
, AUOK190X_CMD_READ_VERSION
, 4, data
);
618 mutex_unlock(&(par
->io_lock
));
620 par
->epd_type
= data
[1] & AUOK190X_VERSION_TEMP_MASK
;
622 par
->panel_size_int
= AUOK190X_VERSION_SIZE_INT(data
[2]);
623 par
->panel_size_float
= AUOK190X_VERSION_SIZE_FLOAT(data
[2]);
624 par
->panel_model
= AUOK190X_VERSION_MODEL(data
[2]);
626 par
->tcon_version
= AUOK190X_VERSION_TCON(data
[3]);
627 par
->lut_version
= AUOK190X_VERSION_LUT(data
[3]);
629 dev_dbg(dev
, "panel %d.%din, model 0x%x, EPD 0x%x TCON-rev 0x%x, LUT-rev 0x%x",
630 par
->panel_size_int
, par
->panel_size_float
, par
->panel_model
,
631 par
->epd_type
, par
->tcon_version
, par
->lut_version
);
633 pm_runtime_mark_last_busy(dev
);
634 pm_runtime_put_autosuspend(dev
);
641 static ssize_t
update_mode_show(struct device
*dev
,
642 struct device_attribute
*attr
, char *buf
)
644 struct fb_info
*info
= dev_get_drvdata(dev
);
645 struct auok190xfb_par
*par
= info
->par
;
647 return sprintf(buf
, "%d\n", par
->update_mode
);
650 static ssize_t
update_mode_store(struct device
*dev
,
651 struct device_attribute
*attr
,
652 const char *buf
, size_t count
)
654 struct fb_info
*info
= dev_get_drvdata(dev
);
655 struct auok190xfb_par
*par
= info
->par
;
658 ret
= kstrtoint(buf
, 10, &mode
);
662 par
->update_mode
= mode
;
664 /* if we enter a better mode, do a full update */
665 if (par
->last_mode
> 1 && mode
< par
->last_mode
)
666 par
->update_all(par
);
671 static ssize_t
flash_show(struct device
*dev
, struct device_attribute
*attr
,
674 struct fb_info
*info
= dev_get_drvdata(dev
);
675 struct auok190xfb_par
*par
= info
->par
;
677 return sprintf(buf
, "%d\n", par
->flash
);
680 static ssize_t
flash_store(struct device
*dev
, struct device_attribute
*attr
,
681 const char *buf
, size_t count
)
683 struct fb_info
*info
= dev_get_drvdata(dev
);
684 struct auok190xfb_par
*par
= info
->par
;
687 ret
= kstrtoint(buf
, 10, &flash
);
699 static ssize_t
temp_show(struct device
*dev
, struct device_attribute
*attr
,
702 struct fb_info
*info
= dev_get_drvdata(dev
);
703 struct auok190xfb_par
*par
= info
->par
;
706 temp
= auok190x_read_temperature(par
);
707 return sprintf(buf
, "%d\n", temp
);
710 static DEVICE_ATTR(update_mode
, 0644, update_mode_show
, update_mode_store
);
711 static DEVICE_ATTR(flash
, 0644, flash_show
, flash_store
);
712 static DEVICE_ATTR(temp
, 0644, temp_show
, NULL
);
714 static struct attribute
*auok190x_attributes
[] = {
715 &dev_attr_update_mode
.attr
,
716 &dev_attr_flash
.attr
,
721 static const struct attribute_group auok190x_attr_group
= {
722 .attrs
= auok190x_attributes
,
725 static int auok190x_power(struct auok190xfb_par
*par
, bool on
)
727 struct auok190x_board
*board
= par
->board
;
731 /* We should maintain POWER up for at least 80ms before set
732 * RST_N and SLP_N to high (TCON spec 20100803_v35 p59)
734 ret
= regulator_enable(par
->regulator
);
739 gpio_set_value(board
->gpio_nrst
, 1);
740 gpio_set_value(board
->gpio_nsleep
, 1);
743 regulator_disable(par
->regulator
);
744 gpio_set_value(board
->gpio_nrst
, 0);
745 gpio_set_value(board
->gpio_nsleep
, 0);
752 * Recovery - powercycle the controller
755 static void auok190x_recover(struct auok190xfb_par
*par
)
757 struct device
*dev
= par
->info
->device
;
759 auok190x_power(par
, 0);
761 auok190x_power(par
, 1);
763 /* after powercycling the device, it's always active */
764 pm_runtime_set_active(dev
);
769 /* wait for init to complete */
770 par
->board
->wait_for_rdy(par
);
778 static int auok190x_runtime_suspend(struct device
*dev
)
780 struct platform_device
*pdev
= to_platform_device(dev
);
781 struct fb_info
*info
= platform_get_drvdata(pdev
);
782 struct auok190xfb_par
*par
= info
->par
;
783 struct auok190x_board
*board
= par
->board
;
786 /* take and keep the lock until we are resumed, as the controller
787 * will never reach the non-busy state when in standby mode
789 mutex_lock(&(par
->io_lock
));
792 dev_warn(dev
, "already in standby, runtime-pm pairing mismatch\n");
793 mutex_unlock(&(par
->io_lock
));
797 /* according to runtime_pm.txt runtime_suspend only means, that the
798 * device will not process data and will not communicate with the CPU
799 * As we hold the lock, this stays true even without standby
801 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
802 dev_dbg(dev
, "runtime suspend without standby\n");
804 } else if (board
->quirks
& AUOK190X_QUIRK_STANDBYPARAM
) {
805 /* for some TCON versions STANDBY expects a parameter (0) but
806 * it seems the real tcon version has to be determined yet.
808 dev_dbg(dev
, "runtime suspend with additional empty param\n");
810 auok190x_send_cmdargs(par
, AUOK190X_CMD_STANDBY
, 1,
813 dev_dbg(dev
, "runtime suspend without param\n");
814 auok190x_send_command(par
, AUOK190X_CMD_STANDBY
);
825 static int auok190x_runtime_resume(struct device
*dev
)
827 struct platform_device
*pdev
= to_platform_device(dev
);
828 struct fb_info
*info
= platform_get_drvdata(pdev
);
829 struct auok190xfb_par
*par
= info
->par
;
830 struct auok190x_board
*board
= par
->board
;
833 dev_warn(dev
, "not in standby, runtime-pm pairing mismatch\n");
837 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
838 dev_dbg(dev
, "runtime resume without standby\n");
840 /* when in standby, controller is always busy
841 * and only accepts the wakeup command
843 dev_dbg(dev
, "runtime resume from standby\n");
844 auok190x_send_command_nowait(par
, AUOK190X_CMD_WAKEUP
);
848 /* wait for the controller to be ready and release the lock */
849 board
->wait_for_rdy(par
);
854 mutex_unlock(&(par
->io_lock
));
859 static int auok190x_suspend(struct device
*dev
)
861 struct platform_device
*pdev
= to_platform_device(dev
);
862 struct fb_info
*info
= platform_get_drvdata(pdev
);
863 struct auok190xfb_par
*par
= info
->par
;
864 struct auok190x_board
*board
= par
->board
;
867 dev_dbg(dev
, "suspend\n");
868 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
869 /* suspend via powering off the ic */
870 dev_dbg(dev
, "suspend with broken standby\n");
872 auok190x_power(par
, 0);
874 dev_dbg(dev
, "suspend using sleep\n");
876 /* the sleep state can only be entered from the standby state.
877 * pm_runtime_get_noresume gets called before the suspend call.
878 * So the devices usage count is >0 but it is not necessarily
881 if (!pm_runtime_status_suspended(dev
)) {
882 ret
= auok190x_runtime_suspend(dev
);
884 dev_err(dev
, "auok190x_runtime_suspend failed with %d\n",
888 par
->manual_standby
= 1;
891 gpio_direction_output(board
->gpio_nsleep
, 0);
899 static int auok190x_resume(struct device
*dev
)
901 struct platform_device
*pdev
= to_platform_device(dev
);
902 struct fb_info
*info
= platform_get_drvdata(pdev
);
903 struct auok190xfb_par
*par
= info
->par
;
904 struct auok190x_board
*board
= par
->board
;
906 dev_dbg(dev
, "resume\n");
907 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
908 dev_dbg(dev
, "resume with broken standby\n");
910 auok190x_power(par
, 1);
914 dev_dbg(dev
, "resume from sleep\n");
916 /* device should be in runtime suspend when we were suspended
917 * and pm_runtime_put_sync gets called after this function.
918 * So there is no need to touch the standby mode here at all.
920 gpio_direction_output(board
->gpio_nsleep
, 1);
923 /* an additional init call seems to be necessary after sleep */
924 auok190x_runtime_resume(dev
);
927 /* if we were runtime-suspended before, suspend again*/
928 if (!par
->manual_standby
)
929 auok190x_runtime_suspend(dev
);
931 par
->manual_standby
= 0;
938 const struct dev_pm_ops auok190x_pm
= {
939 SET_RUNTIME_PM_OPS(auok190x_runtime_suspend
, auok190x_runtime_resume
,
941 SET_SYSTEM_SLEEP_PM_OPS(auok190x_suspend
, auok190x_resume
)
943 EXPORT_SYMBOL_GPL(auok190x_pm
);
946 * Common probe and remove code
949 int auok190x_common_probe(struct platform_device
*pdev
,
950 struct auok190x_init_data
*init
)
952 struct auok190x_board
*board
= init
->board
;
953 struct auok190xfb_par
*par
;
954 struct fb_info
*info
;
955 struct panel_info
*panel
;
956 int videomemorysize
, ret
;
957 unsigned char *videomemory
;
959 /* check board contents */
960 if (!board
->init
|| !board
->cleanup
|| !board
->wait_for_rdy
961 || !board
->set_ctl
|| !board
->set_hdb
|| !board
->get_hdb
962 || !board
->setup_irq
)
965 info
= framebuffer_alloc(sizeof(struct auok190xfb_par
), &pdev
->dev
);
972 par
->recover
= auok190x_recover
;
973 par
->update_partial
= init
->update_partial
;
974 par
->update_all
= init
->update_all
;
975 par
->need_refresh
= init
->need_refresh
;
976 par
->init
= init
->init
;
978 /* init update modes */
980 par
->update_mode
= -1;
984 par
->regulator
= regulator_get(info
->device
, "vdd");
985 if (IS_ERR(par
->regulator
)) {
986 ret
= PTR_ERR(par
->regulator
);
987 dev_err(info
->device
, "Failed to get regulator: %d\n", ret
);
991 ret
= board
->init(par
);
993 dev_err(info
->device
, "board init failed, %d\n", ret
);
997 ret
= gpio_request(board
->gpio_nsleep
, "AUOK190x sleep");
999 dev_err(info
->device
, "could not request sleep gpio, %d\n",
1004 ret
= gpio_direction_output(board
->gpio_nsleep
, 0);
1006 dev_err(info
->device
, "could not set sleep gpio, %d\n", ret
);
1010 ret
= gpio_request(board
->gpio_nrst
, "AUOK190x reset");
1012 dev_err(info
->device
, "could not request reset gpio, %d\n",
1017 ret
= gpio_direction_output(board
->gpio_nrst
, 0);
1019 dev_err(info
->device
, "could not set reset gpio, %d\n", ret
);
1023 ret
= auok190x_power(par
, 1);
1025 dev_err(info
->device
, "could not power on the device, %d\n",
1030 mutex_init(&par
->io_lock
);
1032 init_waitqueue_head(&par
->waitq
);
1034 ret
= par
->board
->setup_irq(par
->info
);
1036 dev_err(info
->device
, "could not setup ready-irq, %d\n", ret
);
1040 /* wait for init to complete */
1041 par
->board
->wait_for_rdy(par
);
1044 * From here on the controller can talk to us
1047 /* initialise fix, var, resolution and rotation */
1049 strlcpy(info
->fix
.id
, init
->id
, 16);
1050 info
->var
.bits_per_pixel
= 8;
1051 info
->var
.grayscale
= 1;
1053 panel
= &panel_table
[board
->resolution
];
1055 par
->resolution
= board
->resolution
;
1058 /* videomemory handling */
1060 videomemorysize
= roundup((panel
->w
* panel
->h
) * 2, PAGE_SIZE
);
1061 videomemory
= vmalloc(videomemorysize
);
1067 memset(videomemory
, 0, videomemorysize
);
1068 info
->screen_base
= (char *)videomemory
;
1069 info
->fix
.smem_len
= videomemorysize
;
1071 info
->flags
= FBINFO_FLAG_DEFAULT
| FBINFO_VIRTFB
;
1072 info
->fbops
= &auok190xfb_ops
;
1074 ret
= auok190xfb_check_var(&info
->var
, info
);
1078 auok190xfb_set_fix(info
);
1080 /* deferred io init */
1082 info
->fbdefio
= devm_kzalloc(info
->device
,
1083 sizeof(struct fb_deferred_io
),
1085 if (!info
->fbdefio
) {
1086 dev_err(info
->device
, "Failed to allocate memory\n");
1091 dev_dbg(info
->device
, "targeting %d frames per second\n", board
->fps
);
1092 info
->fbdefio
->delay
= HZ
/ board
->fps
;
1093 info
->fbdefio
->first_io
= auok190xfb_dpy_first_io
,
1094 info
->fbdefio
->deferred_io
= auok190xfb_dpy_deferred_io
,
1095 fb_deferred_io_init(info
);
1099 ret
= fb_alloc_cmap(&info
->cmap
, 256, 0);
1101 dev_err(info
->device
, "Failed to allocate colormap\n");
1105 /* controller init */
1107 par
->consecutive_threshold
= 100;
1109 auok190x_identify(par
);
1111 platform_set_drvdata(pdev
, info
);
1113 ret
= register_framebuffer(info
);
1117 ret
= sysfs_create_group(&info
->device
->kobj
, &auok190x_attr_group
);
1121 dev_info(info
->device
, "fb%d: %dx%d using %dK of video memory\n",
1122 info
->node
, info
->var
.xres
, info
->var
.yres
,
1123 videomemorysize
>> 10);
1125 /* increase autosuspend_delay when we use alternative methods
1128 par
->autosuspend_delay
= (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
)
1131 pm_runtime_set_active(info
->device
);
1132 pm_runtime_enable(info
->device
);
1133 pm_runtime_set_autosuspend_delay(info
->device
, par
->autosuspend_delay
);
1134 pm_runtime_use_autosuspend(info
->device
);
1139 unregister_framebuffer(info
);
1141 fb_dealloc_cmap(&info
->cmap
);
1143 fb_deferred_io_cleanup(info
);
1145 vfree((void *)info
->screen_base
);
1147 auok190x_power(par
, 0);
1149 gpio_free(board
->gpio_nrst
);
1151 gpio_free(board
->gpio_nsleep
);
1153 board
->cleanup(par
);
1155 regulator_put(par
->regulator
);
1157 framebuffer_release(info
);
1161 EXPORT_SYMBOL_GPL(auok190x_common_probe
);
1163 int auok190x_common_remove(struct platform_device
*pdev
)
1165 struct fb_info
*info
= platform_get_drvdata(pdev
);
1166 struct auok190xfb_par
*par
= info
->par
;
1167 struct auok190x_board
*board
= par
->board
;
1169 pm_runtime_disable(info
->device
);
1171 sysfs_remove_group(&info
->device
->kobj
, &auok190x_attr_group
);
1173 unregister_framebuffer(info
);
1175 fb_dealloc_cmap(&info
->cmap
);
1177 fb_deferred_io_cleanup(info
);
1179 vfree((void *)info
->screen_base
);
1181 auok190x_power(par
, 0);
1183 gpio_free(board
->gpio_nrst
);
1184 gpio_free(board
->gpio_nsleep
);
1186 board
->cleanup(par
);
1188 regulator_put(par
->regulator
);
1190 framebuffer_release(info
);
1194 EXPORT_SYMBOL_GPL(auok190x_common_remove
);
1196 MODULE_DESCRIPTION("Common code for AUO-K190X controllers");
1197 MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
1198 MODULE_LICENSE("GPL");