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
);
776 static int __maybe_unused
auok190x_runtime_suspend(struct device
*dev
)
778 struct platform_device
*pdev
= to_platform_device(dev
);
779 struct fb_info
*info
= platform_get_drvdata(pdev
);
780 struct auok190xfb_par
*par
= info
->par
;
781 struct auok190x_board
*board
= par
->board
;
784 /* take and keep the lock until we are resumed, as the controller
785 * will never reach the non-busy state when in standby mode
787 mutex_lock(&(par
->io_lock
));
790 dev_warn(dev
, "already in standby, runtime-pm pairing mismatch\n");
791 mutex_unlock(&(par
->io_lock
));
795 /* according to runtime_pm.txt runtime_suspend only means, that the
796 * device will not process data and will not communicate with the CPU
797 * As we hold the lock, this stays true even without standby
799 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
800 dev_dbg(dev
, "runtime suspend without standby\n");
802 } else if (board
->quirks
& AUOK190X_QUIRK_STANDBYPARAM
) {
803 /* for some TCON versions STANDBY expects a parameter (0) but
804 * it seems the real tcon version has to be determined yet.
806 dev_dbg(dev
, "runtime suspend with additional empty param\n");
808 auok190x_send_cmdargs(par
, AUOK190X_CMD_STANDBY
, 1,
811 dev_dbg(dev
, "runtime suspend without param\n");
812 auok190x_send_command(par
, AUOK190X_CMD_STANDBY
);
823 static int __maybe_unused
auok190x_runtime_resume(struct device
*dev
)
825 struct platform_device
*pdev
= to_platform_device(dev
);
826 struct fb_info
*info
= platform_get_drvdata(pdev
);
827 struct auok190xfb_par
*par
= info
->par
;
828 struct auok190x_board
*board
= par
->board
;
831 dev_warn(dev
, "not in standby, runtime-pm pairing mismatch\n");
835 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
836 dev_dbg(dev
, "runtime resume without standby\n");
838 /* when in standby, controller is always busy
839 * and only accepts the wakeup command
841 dev_dbg(dev
, "runtime resume from standby\n");
842 auok190x_send_command_nowait(par
, AUOK190X_CMD_WAKEUP
);
846 /* wait for the controller to be ready and release the lock */
847 board
->wait_for_rdy(par
);
852 mutex_unlock(&(par
->io_lock
));
857 static int __maybe_unused
auok190x_suspend(struct device
*dev
)
859 struct platform_device
*pdev
= to_platform_device(dev
);
860 struct fb_info
*info
= platform_get_drvdata(pdev
);
861 struct auok190xfb_par
*par
= info
->par
;
862 struct auok190x_board
*board
= par
->board
;
865 dev_dbg(dev
, "suspend\n");
866 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
867 /* suspend via powering off the ic */
868 dev_dbg(dev
, "suspend with broken standby\n");
870 auok190x_power(par
, 0);
872 dev_dbg(dev
, "suspend using sleep\n");
874 /* the sleep state can only be entered from the standby state.
875 * pm_runtime_get_noresume gets called before the suspend call.
876 * So the devices usage count is >0 but it is not necessarily
879 if (!pm_runtime_status_suspended(dev
)) {
880 ret
= auok190x_runtime_suspend(dev
);
882 dev_err(dev
, "auok190x_runtime_suspend failed with %d\n",
886 par
->manual_standby
= 1;
889 gpio_direction_output(board
->gpio_nsleep
, 0);
897 static int __maybe_unused
auok190x_resume(struct device
*dev
)
899 struct platform_device
*pdev
= to_platform_device(dev
);
900 struct fb_info
*info
= platform_get_drvdata(pdev
);
901 struct auok190xfb_par
*par
= info
->par
;
902 struct auok190x_board
*board
= par
->board
;
904 dev_dbg(dev
, "resume\n");
905 if (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
) {
906 dev_dbg(dev
, "resume with broken standby\n");
908 auok190x_power(par
, 1);
912 dev_dbg(dev
, "resume from sleep\n");
914 /* device should be in runtime suspend when we were suspended
915 * and pm_runtime_put_sync gets called after this function.
916 * So there is no need to touch the standby mode here at all.
918 gpio_direction_output(board
->gpio_nsleep
, 1);
921 /* an additional init call seems to be necessary after sleep */
922 auok190x_runtime_resume(dev
);
925 /* if we were runtime-suspended before, suspend again*/
926 if (!par
->manual_standby
)
927 auok190x_runtime_suspend(dev
);
929 par
->manual_standby
= 0;
935 const struct dev_pm_ops auok190x_pm
= {
936 SET_RUNTIME_PM_OPS(auok190x_runtime_suspend
, auok190x_runtime_resume
,
938 SET_SYSTEM_SLEEP_PM_OPS(auok190x_suspend
, auok190x_resume
)
940 EXPORT_SYMBOL_GPL(auok190x_pm
);
943 * Common probe and remove code
946 int auok190x_common_probe(struct platform_device
*pdev
,
947 struct auok190x_init_data
*init
)
949 struct auok190x_board
*board
= init
->board
;
950 struct auok190xfb_par
*par
;
951 struct fb_info
*info
;
952 struct panel_info
*panel
;
953 int videomemorysize
, ret
;
954 unsigned char *videomemory
;
956 /* check board contents */
957 if (!board
->init
|| !board
->cleanup
|| !board
->wait_for_rdy
958 || !board
->set_ctl
|| !board
->set_hdb
|| !board
->get_hdb
959 || !board
->setup_irq
)
962 info
= framebuffer_alloc(sizeof(struct auok190xfb_par
), &pdev
->dev
);
969 par
->recover
= auok190x_recover
;
970 par
->update_partial
= init
->update_partial
;
971 par
->update_all
= init
->update_all
;
972 par
->need_refresh
= init
->need_refresh
;
973 par
->init
= init
->init
;
975 /* init update modes */
977 par
->update_mode
= -1;
981 par
->regulator
= regulator_get(info
->device
, "vdd");
982 if (IS_ERR(par
->regulator
)) {
983 ret
= PTR_ERR(par
->regulator
);
984 dev_err(info
->device
, "Failed to get regulator: %d\n", ret
);
988 ret
= board
->init(par
);
990 dev_err(info
->device
, "board init failed, %d\n", ret
);
994 ret
= gpio_request(board
->gpio_nsleep
, "AUOK190x sleep");
996 dev_err(info
->device
, "could not request sleep gpio, %d\n",
1001 ret
= gpio_direction_output(board
->gpio_nsleep
, 0);
1003 dev_err(info
->device
, "could not set sleep gpio, %d\n", ret
);
1007 ret
= gpio_request(board
->gpio_nrst
, "AUOK190x reset");
1009 dev_err(info
->device
, "could not request reset gpio, %d\n",
1014 ret
= gpio_direction_output(board
->gpio_nrst
, 0);
1016 dev_err(info
->device
, "could not set reset gpio, %d\n", ret
);
1020 ret
= auok190x_power(par
, 1);
1022 dev_err(info
->device
, "could not power on the device, %d\n",
1027 mutex_init(&par
->io_lock
);
1029 init_waitqueue_head(&par
->waitq
);
1031 ret
= par
->board
->setup_irq(par
->info
);
1033 dev_err(info
->device
, "could not setup ready-irq, %d\n", ret
);
1037 /* wait for init to complete */
1038 par
->board
->wait_for_rdy(par
);
1041 * From here on the controller can talk to us
1044 /* initialise fix, var, resolution and rotation */
1046 strlcpy(info
->fix
.id
, init
->id
, 16);
1047 info
->var
.bits_per_pixel
= 8;
1048 info
->var
.grayscale
= 1;
1050 panel
= &panel_table
[board
->resolution
];
1052 par
->resolution
= board
->resolution
;
1055 /* videomemory handling */
1057 videomemorysize
= roundup((panel
->w
* panel
->h
) * 2, PAGE_SIZE
);
1058 videomemory
= vmalloc(videomemorysize
);
1064 memset(videomemory
, 0, videomemorysize
);
1065 info
->screen_base
= (char *)videomemory
;
1066 info
->fix
.smem_len
= videomemorysize
;
1068 info
->flags
= FBINFO_FLAG_DEFAULT
| FBINFO_VIRTFB
;
1069 info
->fbops
= &auok190xfb_ops
;
1071 ret
= auok190xfb_check_var(&info
->var
, info
);
1075 auok190xfb_set_fix(info
);
1077 /* deferred io init */
1079 info
->fbdefio
= devm_kzalloc(info
->device
,
1080 sizeof(struct fb_deferred_io
),
1082 if (!info
->fbdefio
) {
1083 dev_err(info
->device
, "Failed to allocate memory\n");
1088 dev_dbg(info
->device
, "targeting %d frames per second\n", board
->fps
);
1089 info
->fbdefio
->delay
= HZ
/ board
->fps
;
1090 info
->fbdefio
->first_io
= auok190xfb_dpy_first_io
,
1091 info
->fbdefio
->deferred_io
= auok190xfb_dpy_deferred_io
,
1092 fb_deferred_io_init(info
);
1096 ret
= fb_alloc_cmap(&info
->cmap
, 256, 0);
1098 dev_err(info
->device
, "Failed to allocate colormap\n");
1102 /* controller init */
1104 par
->consecutive_threshold
= 100;
1106 auok190x_identify(par
);
1108 platform_set_drvdata(pdev
, info
);
1110 ret
= register_framebuffer(info
);
1114 ret
= sysfs_create_group(&info
->device
->kobj
, &auok190x_attr_group
);
1118 dev_info(info
->device
, "fb%d: %dx%d using %dK of video memory\n",
1119 info
->node
, info
->var
.xres
, info
->var
.yres
,
1120 videomemorysize
>> 10);
1122 /* increase autosuspend_delay when we use alternative methods
1125 par
->autosuspend_delay
= (board
->quirks
& AUOK190X_QUIRK_STANDBYBROKEN
)
1128 pm_runtime_set_active(info
->device
);
1129 pm_runtime_enable(info
->device
);
1130 pm_runtime_set_autosuspend_delay(info
->device
, par
->autosuspend_delay
);
1131 pm_runtime_use_autosuspend(info
->device
);
1136 unregister_framebuffer(info
);
1138 fb_dealloc_cmap(&info
->cmap
);
1140 fb_deferred_io_cleanup(info
);
1142 vfree((void *)info
->screen_base
);
1144 auok190x_power(par
, 0);
1146 gpio_free(board
->gpio_nrst
);
1148 gpio_free(board
->gpio_nsleep
);
1150 board
->cleanup(par
);
1152 regulator_put(par
->regulator
);
1154 framebuffer_release(info
);
1158 EXPORT_SYMBOL_GPL(auok190x_common_probe
);
1160 int auok190x_common_remove(struct platform_device
*pdev
)
1162 struct fb_info
*info
= platform_get_drvdata(pdev
);
1163 struct auok190xfb_par
*par
= info
->par
;
1164 struct auok190x_board
*board
= par
->board
;
1166 pm_runtime_disable(info
->device
);
1168 sysfs_remove_group(&info
->device
->kobj
, &auok190x_attr_group
);
1170 unregister_framebuffer(info
);
1172 fb_dealloc_cmap(&info
->cmap
);
1174 fb_deferred_io_cleanup(info
);
1176 vfree((void *)info
->screen_base
);
1178 auok190x_power(par
, 0);
1180 gpio_free(board
->gpio_nrst
);
1181 gpio_free(board
->gpio_nsleep
);
1183 board
->cleanup(par
);
1185 regulator_put(par
->regulator
);
1187 framebuffer_release(info
);
1191 EXPORT_SYMBOL_GPL(auok190x_common_remove
);
1193 MODULE_DESCRIPTION("Common code for AUO-K190X controllers");
1194 MODULE_AUTHOR("Heiko Stuebner <heiko@sntech.de>");
1195 MODULE_LICENSE("GPL");