19 #include <linux/module.h>
20 #include <linux/kernel.h>
21 #include <linux/errno.h>
22 #include <linux/string.h>
24 #include <linux/slab.h>
31 #include <linux/list.h>
56 .sdcfg = (100 | (1 << 8) | (1 << 9)),
62 .lendlbegin = (100 << 8) | 4,
68 .sdcfg = (67 | (0 << 8) | (0 << 9) | (0 << 10) | (0 << 12)),
74 .lendlbegin = (80 << 8) | 20,
80 .sdcfg = (100 | (1 << 8) | (1 << 9) | (0 << 10) | (0 << 12)),
86 .lendlbegin = (60 << 8) | 10,
101 .line_length =
DPY_W,
108 .xres_virtual =
DPY_W,
109 .yres_virtual =
DPY_H,
113 .green = { 0, 4, 0 },
115 .transp = { 0, 0, 0 },
122 par->
board->set_hdb(par, data);
129 broadsheet_gpio_issue_data(par, data);
134 par->
board->wait_for_rdy(par);
137 broadsheet_gpio_issue_cmd(par, data);
147 par->
board->wait_for_rdy(par);
150 broadsheet_gpio_issue_cmd(par, cmd);
153 for (i = 0; i <
argc; i++)
154 broadsheet_gpio_issue_data(par, argv[i]);
165 for (i = 0; i <
argc; i++)
171 if (par->
board->mmio_write)
174 broadsheet_gpio_send_command(par, data);
180 if (par->
board->mmio_write)
181 broadsheet_mmio_send_cmdargs(par, cmd, argc, argv);
183 broadsheet_gpio_send_cmdargs(par, cmd, argc, argv);
195 for (i = 0; i <
size; i++) {
197 tmp = (data[
i] & 0x0F) << 4;
198 tmp |= (data[
i] & 0x0F00) << 4;
199 par->
board->set_hdb(par, tmp);
206 static void broadsheet_mmio_burst_write(
struct broadsheetfb_par *par,
int size,
212 for (i = 0; i <
size; i++) {
213 tmp = (data[
i] & 0x0F) << 4;
214 tmp |= (data[
i] & 0x0F00) << 4;
223 if (par->
board->mmio_write)
224 broadsheet_mmio_burst_write(par, size, data);
226 broadsheet_gpio_burst_write(par, size, data);
233 par->
board->wait_for_rdy(par);
240 res = par->
board->get_hdb(par);
252 if (par->
board->mmio_read)
253 return par->
board->mmio_read(par);
255 return broadsheet_gpio_get_data(par);
262 par->
board->wait_for_rdy(par);
271 broadsheet_gpio_issue_data(par, reg);
272 broadsheet_gpio_issue_data(par, data);
289 if (par->
board->mmio_write)
290 broadsheet_mmio_write_reg(par, reg, data);
292 broadsheet_gpio_write_reg(par, reg, data);
298 broadsheet_write_reg(par, reg,
cpu_to_le32(data) & 0xFFFF);
299 broadsheet_write_reg(par, reg + 2, (
cpu_to_le32(data) >> 16) & 0xFFFF);
306 par->
board->wait_for_rdy(par);
307 return broadsheet_get_data(par);
313 return broadsheet_read_reg(par, 0x000A) & 0x0001;
322 broadsheet_write_reg(par, 0x0006, 0x0000);
324 broadsheet_write_reg(par, 0x0010, 0x0004);
325 broadsheet_write_reg(par, 0x0012, 0x5949);
326 broadsheet_write_reg(par, 0x0014, 0x0040);
327 broadsheet_write_reg(par, 0x0016, 0x0000);
330 if (retry_count++ > 100)
333 }
while (!is_broadsheet_pll_locked(par));
335 tmp = broadsheet_read_reg(par, 0x0006);
337 broadsheet_write_reg(par, 0x0006, tmp);
345 broadsheet_write_reg(par, 0x0204, ((3 << 3) | 1));
346 broadsheet_write_reg(par, 0x0208, 0x0001);
355 *orig_sfmcd = broadsheet_read_reg(par, 0x0204);
356 broadsheet_write_reg(par, 0x0208, 0);
357 broadsheet_write_reg(par, 0x0204, 0);
358 broadsheet_write_reg(par, 0x0204, ((3 << 3) | 1));
364 u16 reg,
int bitnum,
int val,
370 tmp = broadsheet_read_reg(par, reg);
371 if (((tmp >> bitnum) & 1) == val)
381 broadsheet_write_reg(par, 0x0202, (data | 0x100));
383 return broadsheet_spiflash_wait_for_bit(par, 0x0206, 3, 0, 100);
391 broadsheet_write_reg(par, 0x0202, 0);
393 err = broadsheet_spiflash_wait_for_bit(par, 0x0206, 3, 0, 100);
397 tmp = broadsheet_read_reg(par, 0x200);
404 static int broadsheet_spiflash_wait_for_status(
struct broadsheetfb_par *par,
411 broadsheet_write_reg(par, 0x0208, 1);
413 err = broadsheet_spiflash_write_byte(par, 0x05);
417 err = broadsheet_spiflash_read_byte(par, &tmp);
421 broadsheet_write_reg(par, 0x0208, 0);
429 dev_err(par->
info->device,
"Timed out waiting for spiflash status\n");
433 broadsheet_write_reg(par, 0x0208, 0);
444 broadsheet_write_reg(par, 0x0208, 1);
446 err = broadsheet_spiflash_write_byte(par, op);
450 for (i = 2; i >= 0; i--) {
451 tmp = ((addr >> (i * 8)) & 0xFF);
452 err = broadsheet_spiflash_write_byte(par, tmp);
466 err = broadsheet_spiflash_op_on_address(par, 0xAB, 0x00000000);
470 err = broadsheet_spiflash_read_byte(par, &sig);
474 if ((sig != 0x10) && (sig != 0x11)) {
475 dev_err(par->
info->device,
"Unexpected flash type\n");
483 broadsheet_write_reg(par, 0x0208, 0);
488 u16 *initial_sfmcd,
int *flash_type)
493 err = broadsheet_setup_plls(par);
497 broadsheet_write_reg(par, 0x0106, 0x0203);
499 err = broadsheet_setup_spi(par);
503 err = broadsheet_setup_spiflash(par, initial_sfmcd);
507 return broadsheet_verify_spiflash(par, flash_type);
515 broadsheet_write_reg(par, 0x0208, 1);
517 err = broadsheet_spiflash_write_byte(par, 0x06);
519 err = broadsheet_spiflash_write_byte(par, 0x04);
521 broadsheet_write_reg(par, 0x0208, 0);
530 broadsheet_spiflash_write_control(par, 1);
532 err = broadsheet_spiflash_op_on_address(par, 0xD8, addr);
534 broadsheet_write_reg(par, 0x0208, 0);
539 err = broadsheet_spiflash_wait_for_status(par, 1000);
545 int addr,
int size,
char *data)
550 err = broadsheet_spiflash_op_on_address(par, 0x03, addr);
554 for (i = 0; i <
size; i++) {
555 err = broadsheet_spiflash_read_byte(par, &data[i]);
561 broadsheet_write_reg(par, 0x0208, 0);
565 #define BS_SPIFLASH_PAGE_SIZE 256
567 int addr,
const char *data)
572 broadsheet_spiflash_write_control(par, 1);
574 err = broadsheet_spiflash_op_on_address(par, 0x02, addr);
579 err = broadsheet_spiflash_write_byte(par, data[i]);
584 broadsheet_write_reg(par, 0x0208, 0);
586 err = broadsheet_spiflash_wait_for_status(par, 100);
599 err = broadsheet_spiflash_write_page(par, addr + i, &data[i]);
612 int sector_size,
int data_start_addr,
618 int start_sector_addr;
620 sector_buffer = kzalloc(
sizeof(
char)*sector_size,
GFP_KERNEL);
625 start_sector_addr = (data_start_addr /
sector_size) * sector_size;
631 if (data_start_addr != start_sector_addr) {
636 err = broadsheet_spiflash_read_range(par, start_sector_addr,
637 data_start_addr, sector_buffer);
643 memcpy(sector_buffer + data_start_addr, data, data_len);
649 tail_start_addr = (data_start_addr +
data_len) % sector_size;
651 if (tail_start_addr) {
654 tail_len = sector_size - tail_start_addr;
657 err = broadsheet_spiflash_read_range(par, tail_start_addr,
658 tail_len, sector_buffer + tail_start_addr);
666 err = broadsheet_spiflash_erase_sector(par, start_sector_addr);
671 err = broadsheet_spiflash_write_sector(par, start_sector_addr,
672 sector_buffer, sector_size);
677 const u8 *wfm,
int bytecount,
int flash_type)
686 switch (flash_type) {
688 sector_size = 32*1024;
692 sector_size = 64*1024;
697 cur_addr = wfm_addr +
offset;
698 maxlen =
roundup(cur_addr, sector_size) - cur_addr;
699 writecount =
min(bytecount, maxlen);
701 err = broadsheet_spiflash_rewrite_sector(par, sector_size,
702 cur_addr, writecount, wfm + offset);
706 offset += writecount;
707 bytecount -= writecount;
713 static int broadsheet_store_waveform_to_spiflash(
struct broadsheetfb_par *par,
714 const u8 *wfm,
size_t wfm_size)
717 u16 initial_sfmcd = 0;
720 err = broadsheet_setup_for_wfm_write(par, &initial_sfmcd, &flash_type);
724 err = broadsheet_write_spiflash(par, 0x886, wfm, wfm_size, flash_type);
727 broadsheet_write_reg(par, 0x0204, initial_sfmcd);
733 const char *
buf,
size_t len)
745 dev_err(dev,
"Failed to get broadsheet waveform\n");
750 if ((fw_entry->
size < 8*1024) || (fw_entry->
size > 64*1024)) {
751 dev_err(dev,
"Invalid waveform\n");
757 err = broadsheet_store_waveform_to_spiflash(par, fw_entry->
data,
762 dev_err(dev,
"Failed to store broadsheet waveform\n");
766 dev_info(dev,
"Stored broadsheet waveform, size %zd\n", fw_entry->
size);
774 broadsheet_loadstore_waveform);
780 int xres = par->
info->var.xres;
781 int yres = par->
info->var.yres;
800 broadsheet_write_reg32(par, 0x310, xres*yres*2);
811 broadsheet_write_reg(par, 0x330, 0x84);
815 args[0] = (0x3 << 4);
821 broadsheet_burst_write(par, (panel_table[par->
panel_index].
w *
823 (
u16 *) par->
info->screen_base);
834 par->
board->wait_for_rdy(par);
844 dev_info(dev,
"Broadsheet Rev 0x%x, Product Code 0x%x\n", rev, prc);
847 dev_warn(dev,
"Unrecognized Broadsheet Product Code\n");
849 dev_warn(dev,
"Unrecognized Broadsheet Revision\n");
857 broadsheet_init_display(par);
864 unsigned char *buf = (
unsigned char *)par->
info->screen_base;
882 buf += y1 * par->
info->var.xres;
883 broadsheet_burst_write(par, ((1 + y2 - y1) * par->
info->var.xres)/2,
895 par->
board->wait_for_rdy(par);
910 broadsheet_burst_write(par, (panel_table[par->
panel_index].
w *
912 (
u16 *) par->
info->screen_base);
923 par->
board->wait_for_rdy(par);
928 static void broadsheetfb_dpy_deferred_io(
struct fb_info *info,
934 struct fb_deferred_io *fbdefio = info->fbdefio;
936 u16 yres = info->
var.yres;
937 u16 xres = info->
var.xres;
944 if (prev_index < 0) {
948 }
else if ((prev_index + 1) == cur->
index) {
953 broadsheetfb_dpy_update_pages(info->
par, y1, y1 +
h);
958 prev_index = cur->
index;
964 broadsheetfb_dpy_update(info->
par);
966 broadsheetfb_dpy_update_pages(info->
par, y1,
971 static void broadsheetfb_fillrect(
struct fb_info *info,
978 broadsheetfb_dpy_update(par);
981 static void broadsheetfb_copyarea(
struct fb_info *info,
988 broadsheetfb_dpy_update(par);
991 static void broadsheetfb_imageblit(
struct fb_info *info,
998 broadsheetfb_dpy_update(par);
1005 static ssize_t broadsheetfb_write(
struct fb_info *info,
const char __user *buf,
1006 size_t count, loff_t *ppos)
1009 unsigned long p = *ppos;
1017 total_size = info->
fix.smem_len;
1022 if (count > total_size) {
1027 if (count + p > total_size) {
1031 count = total_size -
p;
1042 broadsheetfb_dpy_update(par);
1044 return (err) ? err :
count;
1047 static struct fb_ops broadsheetfb_ops = {
1050 .fb_write = broadsheetfb_write,
1051 .fb_fillrect = broadsheetfb_fillrect,
1052 .fb_copyarea = broadsheetfb_copyarea,
1053 .fb_imageblit = broadsheetfb_imageblit,
1056 static struct fb_deferred_io broadsheetfb_defio = {
1058 .deferred_io = broadsheetfb_dpy_deferred_io,
1066 int videomemorysize;
1067 unsigned char *videomemory;
1074 board = dev->
dev.platform_data;
1079 if (!try_module_get(board->
owner))
1104 videomemory =
vzalloc(videomemorysize);
1109 info->
fbops = &broadsheetfb_ops;
1111 broadsheetfb_var.xres = dpyw;
1112 broadsheetfb_var.yres = dpyh;
1113 broadsheetfb_var.xres_virtual = dpyw;
1114 broadsheetfb_var.yres_virtual = dpyh;
1115 info->
var = broadsheetfb_var;
1117 broadsheetfb_fix.line_length = dpyw;
1118 info->
fix = broadsheetfb_fix;
1119 info->
fix.smem_len = videomemorysize;
1125 par->
read_reg = broadsheet_read_reg;
1132 info->fbdefio = &broadsheetfb_defio;
1137 dev_err(&dev->
dev,
"Failed to allocate colormap\n");
1142 for (i = 0; i < 16; i++)
1143 info->
cmap.red[i] = (((2*i)+1)*(0xFFFF))/32;
1147 retval = par->
board->setup_irq(info);
1152 retval = board->
init(par);
1156 broadsheet_identify(par);
1158 broadsheet_init(par);
1164 platform_set_drvdata(dev, info);
1171 "fb%d: Broadsheet frame buffer, using %dK of video memory\n",
1172 info->
node, videomemorysize >> 10);
1188 module_put(board->
owner);
1195 struct fb_info *info = platform_get_drvdata(dev);
1203 par->
board->cleanup(par);
1206 module_put(par->
board->owner);
1213 .probe = broadsheetfb_probe,
1217 .name =
"broadsheetfb",
1221 static int __init broadsheetfb_init(
void)
1226 static void __exit broadsheetfb_exit(
void)