void omap_rfbi_write_data(const void *buf, u32 len) { rfbi_enable_clocks(1); switch (rfbi.parallelmode) { case OMAP_DSS_RFBI_PARALLELMODE_8: { const u8 *b = buf; for (; len; len--) rfbi_write_reg(RFBI_PARAM, *b++); break; } case OMAP_DSS_RFBI_PARALLELMODE_16: { const u16 *w = buf; BUG_ON(len & 1); for (; len; len -= 2) rfbi_write_reg(RFBI_PARAM, *w++); break; } case OMAP_DSS_RFBI_PARALLELMODE_9: case OMAP_DSS_RFBI_PARALLELMODE_12: default: BUG(); } rfbi_enable_clocks(0); }
static void rfbi_enable_config(int enable1, int enable2) { u32 l; int cs = 0; if (enable1) cs |= 1<<0; if (enable2) cs |= 1<<1; rfbi_enable_clocks(1); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, cs, 3, 2); l = FLD_MOD(l, 0, 1, 1); rfbi_write_reg(RFBI_CONTROL, l); l = rfbi_read_reg(RFBI_CONFIG(0)); l = FLD_MOD(l, 0, 3, 2); /* TRIGGERMODE: ITE */ /*l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ /*l |= FLD_VAL(0, 8, 7); */ /* L4FORMAT, 1pix/L4 */ l = FLD_MOD(l, 0, 16, 16); /* A0POLARITY */ l = FLD_MOD(l, 1, 20, 20); /* TE_VSYNC_POLARITY */ l = FLD_MOD(l, 1, 21, 21); /* HSYNCPOLARITY */ l = FLD_MOD(l, OMAP_DSS_RFBI_PARALLELMODE_8, 1, 0); rfbi_write_reg(RFBI_CONFIG(0), l); rfbi_enable_clocks(0); }
void omap_rfbi_read_data(void *buf, u32 len) { rfbi_enable_clocks(1); switch (rfbi.parallelmode) { case OMAP_DSS_RFBI_PARALLELMODE_8: { u8 *b = buf; for (; len; len--) { rfbi_write_reg(RFBI_READ, 0); *b++ = rfbi_read_reg(RFBI_READ); } break; } case OMAP_DSS_RFBI_PARALLELMODE_16: { u16 *w = buf; BUG_ON(len & ~1); for (; len; len -= 2) { rfbi_write_reg(RFBI_READ, 0); *w++ = rfbi_read_reg(RFBI_READ); } break; } case OMAP_DSS_RFBI_PARALLELMODE_9: case OMAP_DSS_RFBI_PARALLELMODE_12: default: BUG(); } rfbi_enable_clocks(0); }
static int rfbi_transfer_area(struct omap_dss_device *dssdev, void (*callback)(void *data), void *data) { u32 l; int r; struct omap_overlay_manager *mgr = rfbi.output.manager; u16 width = rfbi.timings.x_res; u16 height = rfbi.timings.y_res; /*BUG_ON(callback == 0);*/ BUG_ON(rfbi.framedone_callback != NULL); DSSDBG("rfbi_transfer_area %dx%d\n", width, height); dss_mgr_set_timings(mgr, &rfbi.timings); r = dss_mgr_enable(mgr); if (r) return r; rfbi.framedone_callback = callback; rfbi.framedone_callback_data = data; rfbi_write_reg(RFBI_PIXEL_CNT, width * height); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, 1, 0, 0); /* enable */ if (!rfbi.te_enabled) l = FLD_MOD(l, 1, 4, 4); /* ITE */ rfbi_write_reg(RFBI_CONTROL, l); return 0; }
static void rfbi_write_command(const void *buf, u32 len) { switch (rfbi.parallelmode) { case OMAP_DSS_RFBI_PARALLELMODE_8: { const u8 *b = buf; for (; len; len--) rfbi_write_reg(RFBI_CMD, *b++); break; } case OMAP_DSS_RFBI_PARALLELMODE_16: { const u16 *w = buf; BUG_ON(len & 1); for (; len; len -= 2) rfbi_write_reg(RFBI_CMD, *w++); break; } case OMAP_DSS_RFBI_PARALLELMODE_9: case OMAP_DSS_RFBI_PARALLELMODE_12: default: BUG(); } }
static void rfbi_transfer_area(struct omap_dss_device *dssdev, u16 width, u16 height, void (*callback)(void *data), void *data) { u32 l; /*BUG_ON(callback == 0);*/ BUG_ON(rfbi.framedone_callback != NULL); DSSDBG("rfbi_transfer_area %dx%d\n", width, height); dispc_mgr_set_lcd_size(dssdev->manager->id, width, height); dispc_mgr_enable(dssdev->manager->id, true); rfbi.framedone_callback = callback; rfbi.framedone_callback_data = data; rfbi_write_reg(RFBI_PIXEL_CNT, width * height); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, 1, 0, 0); /* enable */ if (!rfbi.te_enabled) l = FLD_MOD(l, 1, 4, 4); /* ITE */ rfbi_write_reg(RFBI_CONTROL, l); }
static void rfbi_transfer_area(struct omap_dss_device *dssdev, u16 width, u16 height, void (*callback)(void *data), void *data) { u32 l; BUG_ON(callback == 0); // printk(KERN_INFO "rfbi_transfer_area %dx%d\n", width, height); DSSDBG("rfbi_transfer_area %dx%d\n", width, height); // dispc_disable_sidle(); dss_start_update(dssdev); rfbi.framedone_callback = callback; rfbi.framedone_callback_data = data; rfbi_write_reg(RFBI_PIXEL_CNT, width * height); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, 1, 0, 0); // enable l = FLD_MOD(l, 0, 4, 4); // ITE rfbi_write_reg(RFBI_CONTROL, l); l = rfbi_read_reg(RFBI_CONTROL); if (!rfbi.te_enabled) l = FLD_MOD(l, 1, 4, 4); // ITE rfbi_write_reg(RFBI_CONTROL, l); }
void rfbi_transfer_area(u16 width, u16 height, void (callback)(void *data), void *data) { u32 l; /*BUG_ON(callback == 0);*/ BUG_ON(rfbi.framedone_callback != NULL); DSSDBG("rfbi_transfer_area %dx%d\n", width, height); dispc_set_lcd_size(width, height); dispc_enable_channel(OMAP_DSS_CHANNEL_LCD, true); rfbi.framedone_callback = callback; rfbi.framedone_callback_data = data; rfbi_enable_clocks(1); rfbi_write_reg(RFBI_PIXEL_CNT, width * height); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, 1, 0, 0); /* enable */ if (!rfbi.te_enabled) l = FLD_MOD(l, 1, 4, 4); /* ITE */ rfbi_write_reg(RFBI_CONTROL, l); }
static int rfbi_transfer_area(struct omap_dss_device *dssdev, u16 width, u16 height, void (*callback)(void *data), void *data) { u32 l; int r; struct omap_video_timings timings = { .hsw = 1, .hfp = 1, .hbp = 1, .vsw = 1, .vfp = 0, .vbp = 0, .x_res = width, .y_res = height, }; /*BUG_ON(callback == 0);*/ BUG_ON(rfbi.framedone_callback != NULL); DSSDBG("rfbi_transfer_area %dx%d\n", width, height); dss_mgr_set_timings(dssdev->manager, &timings); r = dss_mgr_enable(dssdev->manager); if (r) return r; rfbi.framedone_callback = callback; rfbi.framedone_callback_data = data; rfbi_write_reg(RFBI_PIXEL_CNT, width * height); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, 1, 0, 0); /* enable */ if (!rfbi.te_enabled) l = FLD_MOD(l, 1, 4, 4); /* ITE */ rfbi_write_reg(RFBI_CONTROL, l); return 0; } static void framedone_callback(void *data, u32 mask) { void (*callback)(void *data); DSSDBG("FRAMEDONE\n"); REG_FLD_MOD(RFBI_CONTROL, 0, 0, 0); callback = rfbi.framedone_callback; rfbi.framedone_callback = NULL; if (callback != NULL) callback(rfbi.framedone_callback_data); }
static int rfbi_init(struct omapfb_device *fbdev) { u32 l; int r; rfbi.fbdev = fbdev; rfbi.base = ioremap(RFBI_BASE, SZ_1K); if (!rfbi.base) { dev_err(fbdev->dev, "can't ioremap RFBI\n"); return -ENOMEM; } if ((r = rfbi_get_clocks()) < 0) return r; rfbi_enable_clocks(1); rfbi.l4_khz = clk_get_rate(rfbi.dss_ick) / 1000; /* Reset */ rfbi_write_reg(RFBI_SYSCONFIG, 1 << 1); while (!(rfbi_read_reg(RFBI_SYSSTATUS) & (1 << 0))); l = rfbi_read_reg(RFBI_SYSCONFIG); /* Enable autoidle and smart-idle */ l |= (1 << 0) | (2 << 3); rfbi_write_reg(RFBI_SYSCONFIG, l); /* 16-bit interface, ITE trigger mode, 16-bit data */ l = (0x03 << 0) | (0x00 << 2) | (0x01 << 5) | (0x02 << 7); l |= (0 << 9) | (1 << 20) | (1 << 21); rfbi_write_reg(RFBI_CONFIG0, l); rfbi_write_reg(RFBI_DATA_CYCLE1_0, 0x00000010); l = rfbi_read_reg(RFBI_CONTROL); /* Select CS0, clear bypass mode */ l = (0x01 << 2); rfbi_write_reg(RFBI_CONTROL, l); r = omap_dispc_request_irq(DISPC_IRQ_FRAMEMASK, rfbi_dma_callback, NULL); if (r < 0) { dev_err(fbdev->dev, "can't get DISPC irq\n"); rfbi_enable_clocks(0); return r; } l = rfbi_read_reg(RFBI_REVISION); pr_info("omapfb: RFBI version %d.%d initialized\n", (l >> 4) & 0x0f, l & 0x0f); rfbi_enable_clocks(0); return 0; }
static void rfbi_write_data(const void *buf, unsigned int len) { rfbi_enable_clocks(1); if (rfbi.bits_per_cycle == 16) { const u16 *w = buf; BUG_ON(len & 1); for (; len; len -= 2) rfbi_write_reg(RFBI_PARAM, *w++); } else { const u8 *b = buf; BUG_ON(rfbi.bits_per_cycle != 8); for (; len; len--) rfbi_write_reg(RFBI_PARAM, *b++); } rfbi_enable_clocks(0); }
static inline void _stop_transfer(void) { u32 w; w = rfbi_read_reg(RFBI_CONTROL); rfbi_write_reg(RFBI_CONTROL, w & ~(1 << 0)); rfbi_enable_clocks(0); }
static int rfbi_setup_tearsync(unsigned pin_cnt, unsigned hs_pulse_time, unsigned vs_pulse_time, int hs_pol_inv, int vs_pol_inv, int extif_div) { int hs, vs; int min; u32 l; if (pin_cnt != 1 && pin_cnt != 2) return -EINVAL; hs = ps_to_rfbi_ticks(hs_pulse_time, 1); vs = ps_to_rfbi_ticks(vs_pulse_time, 1); if (hs < 2) return -EDOM; if (pin_cnt == 2) min = 2; else min = 4; if (vs < min) return -EDOM; if (vs == hs) return -EINVAL; rfbi.tearsync_pin_cnt = pin_cnt; dev_dbg(rfbi.fbdev->dev, "setup_tearsync: pins %d hs %d vs %d hs_inv %d vs_inv %d\n", pin_cnt, hs, vs, hs_pol_inv, vs_pol_inv); rfbi_enable_clocks(1); rfbi_write_reg(RFBI_HSYNC_WIDTH, hs); rfbi_write_reg(RFBI_VSYNC_WIDTH, vs); l = rfbi_read_reg(RFBI_CONFIG0); if (hs_pol_inv) l &= ~(1 << 21); else l |= 1 << 21; if (vs_pol_inv) l &= ~(1 << 20); else l |= 1 << 20; rfbi_enable_clocks(0); return 0; }
static void rfbi_set_timings(const struct extif_timings *t) { u32 l; BUG_ON(!t->converted); rfbi_enable_clocks(1); rfbi_write_reg(RFBI_ONOFF_TIME0, t->tim[0]); rfbi_write_reg(RFBI_CYCLE_TIME0, t->tim[1]); l = rfbi_read_reg(RFBI_CONFIG0); l &= ~(1 << 4); l |= (t->tim[2] ? 1 : 0) << 4; rfbi_write_reg(RFBI_CONFIG0, l); rfbi_print_timings(); rfbi_enable_clocks(0); }
static void rfbi_read_data(void *buf, unsigned int len) { rfbi_enable_clocks(1); if (rfbi.bits_per_cycle == 16) { u16 *w = buf; BUG_ON(len & ~1); for (; len; len -= 2) { rfbi_write_reg(RFBI_READ, 0); *w++ = rfbi_read_reg(RFBI_READ); } } else { u8 *b = buf; BUG_ON(rfbi.bits_per_cycle != 8); for (; len; len--) { rfbi_write_reg(RFBI_READ, 0); *b++ = rfbi_read_reg(RFBI_READ); } } rfbi_enable_clocks(0); }
/* xxx FIX module selection missing */ static int rfbi_enable_te(bool enable, unsigned line) { u32 l; DSSDBG("te %d line %d mode %d\n", enable, line, rfbi.te_mode); if (line > (1 << 11) - 1) return -EINVAL; l = rfbi_read_reg(RFBI_CONFIG(0)); l &= ~(0x3 << 2); if (enable) { rfbi.te_enabled = 1; l |= rfbi.te_mode << 2; } else rfbi.te_enabled = 0; rfbi_write_reg(RFBI_CONFIG(0), l); rfbi_write_reg(RFBI_LINE_NUMBER, line); return 0; }
/* xxx FIX module selection missing */ int omap_rfbi_setup_te(enum omap_rfbi_te_mode mode, unsigned hs_pulse_time, unsigned vs_pulse_time, int hs_pol_inv, int vs_pol_inv, int extif_div) { int hs, vs; int min; u32 l; hs = ps_to_rfbi_ticks(hs_pulse_time, 1); vs = ps_to_rfbi_ticks(vs_pulse_time, 1); if (hs < 2) return -EDOM; if (mode == OMAP_DSS_RFBI_TE_MODE_2) min = 2; else /* OMAP_DSS_RFBI_TE_MODE_1 */ min = 4; if (vs < min) return -EDOM; if (vs == hs) return -EINVAL; rfbi.te_mode = mode; DSSDBG("setup_te: mode %d hs %d vs %d hs_inv %d vs_inv %d\n", mode, hs, vs, hs_pol_inv, vs_pol_inv); rfbi_enable_clocks(1); rfbi_write_reg(RFBI_HSYNC_WIDTH, hs); rfbi_write_reg(RFBI_VSYNC_WIDTH, vs); l = rfbi_read_reg(RFBI_CONFIG(0)); if (hs_pol_inv) l &= ~(1 << 21); else l |= 1 << 21; if (vs_pol_inv) l &= ~(1 << 20); else l |= 1 << 20; rfbi_enable_clocks(0); return 0; }
static void rfbi_set_timings(int rfbi_module, struct rfbi_timings *t) { int r; if (!t->converted) { r = calc_extif_timings(t); if (r < 0) DSSERR("Failed to calc timings\n"); } BUG_ON(!t->converted); rfbi_write_reg(RFBI_ONOFF_TIME(rfbi_module), t->tim[0]); rfbi_write_reg(RFBI_CYCLE_TIME(rfbi_module), t->tim[1]); /* TIMEGRANULARITY */ REG_FLD_MOD(RFBI_CONFIG(rfbi_module), (t->tim[2] ? 1 : 0), 4, 4); rfbi_print_timings(); }
void omap_rfbi_write_image(const u8 *p_image, u16 w, u16 h) { int col, row; int offset; for (row = 0; row < h; row++) { offset = row*w*2; for (col = 0; col < w; col++) { rfbi_write_reg(RFBI_PARAM, (p_image[offset+col*2+1] << 8) | p_image[offset+col*2]); } } }
static int rfbi_enable_tearsync(int enable, unsigned line) { u32 l; dev_dbg(rfbi.fbdev->dev, "tearsync %d line %d mode %d\n", enable, line, rfbi.tearsync_mode); if (line > (1 << 11) - 1) return -EINVAL; rfbi_enable_clocks(1); l = rfbi_read_reg(RFBI_CONFIG0); l &= ~(0x3 << 2); if (enable) { rfbi.tearsync_mode = rfbi.tearsync_pin_cnt; l |= rfbi.tearsync_mode << 2; } else rfbi.tearsync_mode = 0; rfbi_write_reg(RFBI_CONFIG0, l); rfbi_write_reg(RFBI_LINE_NUMBER, line); rfbi_enable_clocks(0); return 0; }
static void rfbi_transfer_area(int width, int height, void (callback)(void * data), void *data) { u32 w; BUG_ON(callback == NULL); rfbi_enable_clocks(1); omap_dispc_set_lcd_size(width, height); rfbi.lcdc_callback = callback; rfbi.lcdc_callback_data = data; rfbi_write_reg(RFBI_PIXEL_CNT, width * height); w = rfbi_read_reg(RFBI_CONTROL); w |= 1; /* enable */ if (!rfbi.tearsync_mode) w |= 1 << 4; /* internal trigger, reset by HW */ rfbi_write_reg(RFBI_CONTROL, w); omap_dispc_enable_lcd_out(1); }
void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, u16 x, u16 y, u16 w, u16 h) { int start_offset = scr_width * y + x; int horiz_offset = scr_width - w; int i; rfbi_enable_clocks(1); if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { const u16 __iomem *pd = buf; pd += start_offset; for (; h; --h) { for (i = 0; i < w; ++i) { const u8 __iomem *b = (const u8 __iomem *)pd; rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); ++pd; } pd += horiz_offset; } } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_24 && rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { const u32 __iomem *pd = buf; pd += start_offset; for (; h; --h) { for (i = 0; i < w; ++i) { const u8 __iomem *b = (const u8 __iomem *)pd; rfbi_write_reg(RFBI_PARAM, __raw_readb(b+2)); rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); ++pd; } pd += horiz_offset; } } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_16) { const u16 __iomem *pd = buf; pd += start_offset; for (; h; --h) { for (i = 0; i < w; ++i) { rfbi_write_reg(RFBI_PARAM, __raw_readw(pd)); ++pd; } pd += horiz_offset; } } else { BUG(); } rfbi_enable_clocks(0); }
int rfbi_init(void) { u32 rev; u32 l; spin_lock_init(&rfbi.cmd_lock); rfbi.cmd_fifo = kfifo_alloc(RFBI_CMD_FIFO_LEN_BYTES, GFP_KERNEL, &rfbi.cmd_lock); if (IS_ERR(rfbi.cmd_fifo)) return -ENOMEM; init_completion(&rfbi.cmd_done); init_completion(&rfbi.update_done); atomic_set(&rfbi.cmd_fifo_full, 0); atomic_set(&rfbi.cmd_pending, 0); rfbi.base = ioremap(RFBI_BASE, SZ_256); if (!rfbi.base) { DSSERR("can't ioremap RFBI\n"); return -ENOMEM; } rfbi_enable_clocks(1); msleep(10); rfbi.l4_khz = dss_clk_get_rate(DSS_CLK_ICK) / 1000; /* Enable autoidle and smart-idle */ l = rfbi_read_reg(RFBI_SYSCONFIG); l |= (1 << 0) | (2 << 3); rfbi_write_reg(RFBI_SYSCONFIG, l); rev = rfbi_read_reg(RFBI_REVISION); printk(KERN_INFO "OMAP RFBI rev %d.%d\n", FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); rfbi_enable_clocks(0); return 0; }
static void rfbi_set_bits_per_cycle(int bpc) { u32 l; rfbi_enable_clocks(1); l = rfbi_read_reg(RFBI_CONFIG0); l &= ~(0x03 << 0); switch (bpc) { case 8: break; case 16: l |= 3; break; default: BUG(); } rfbi_write_reg(RFBI_CONFIG0, l); rfbi.bits_per_cycle = bpc; rfbi_enable_clocks(0); }
int rfbi_configure(int rfbi_module, int bpp, int lines) { u32 l; int cycle1 = 0, cycle2 = 0, cycle3 = 0; enum omap_rfbi_cycleformat cycleformat; enum omap_rfbi_datatype datatype; enum omap_rfbi_parallelmode parallelmode; switch (bpp) { case 12: datatype = OMAP_DSS_RFBI_DATATYPE_12; break; case 16: datatype = OMAP_DSS_RFBI_DATATYPE_16; break; case 18: datatype = OMAP_DSS_RFBI_DATATYPE_18; break; case 24: datatype = OMAP_DSS_RFBI_DATATYPE_24; break; default: BUG(); return 1; } rfbi.datatype = datatype; switch (lines) { case 8: parallelmode = OMAP_DSS_RFBI_PARALLELMODE_8; break; case 9: parallelmode = OMAP_DSS_RFBI_PARALLELMODE_9; break; case 12: parallelmode = OMAP_DSS_RFBI_PARALLELMODE_12; break; case 16: parallelmode = OMAP_DSS_RFBI_PARALLELMODE_16; break; default: BUG(); return 1; } rfbi.parallelmode = parallelmode; if ((bpp % lines) == 0) { switch (bpp / lines) { case 1: cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_1_1; break; case 2: cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_2_1; break; case 3: cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_1; break; default: BUG(); return 1; } } else if ((2 * bpp % lines) == 0) { if ((2 * bpp / lines) == 3) cycleformat = OMAP_DSS_RFBI_CYCLEFORMAT_3_2; else { BUG(); return 1; } } else { BUG(); return 1; } switch (cycleformat) { case OMAP_DSS_RFBI_CYCLEFORMAT_1_1: cycle1 = lines; break; case OMAP_DSS_RFBI_CYCLEFORMAT_2_1: cycle1 = lines; cycle2 = lines; break; case OMAP_DSS_RFBI_CYCLEFORMAT_3_1: cycle1 = lines; cycle2 = lines; cycle3 = lines; break; case OMAP_DSS_RFBI_CYCLEFORMAT_3_2: cycle1 = lines; cycle2 = (lines / 2) | ((lines / 2) << 16); cycle3 = (lines << 16); break; } rfbi_enable_clocks(1); REG_FLD_MOD(RFBI_CONTROL, 0, 3, 2); /* clear CS */ l = 0; l |= FLD_VAL(parallelmode, 1, 0); l |= FLD_VAL(0, 3, 2); /* TRIGGERMODE: ITE */ l |= FLD_VAL(0, 4, 4); /* TIMEGRANULARITY */ l |= FLD_VAL(datatype, 6, 5); /* l |= FLD_VAL(2, 8, 7); */ /* L4FORMAT, 2pix/L4 */ l |= FLD_VAL(0, 8, 7); /* L4FORMAT, 1pix/L4 */ l |= FLD_VAL(cycleformat, 10, 9); l |= FLD_VAL(0, 12, 11); /* UNUSEDBITS */ l |= FLD_VAL(0, 16, 16); /* A0POLARITY */ l |= FLD_VAL(0, 17, 17); /* REPOLARITY */ l |= FLD_VAL(0, 18, 18); /* WEPOLARITY */ l |= FLD_VAL(0, 19, 19); /* CSPOLARITY */ l |= FLD_VAL(1, 20, 20); /* TE_VSYNC_POLARITY */ l |= FLD_VAL(1, 21, 21); /* HSYNCPOLARITY */ rfbi_write_reg(RFBI_CONFIG(rfbi_module), l); rfbi_write_reg(RFBI_DATA_CYCLE1(rfbi_module), cycle1); rfbi_write_reg(RFBI_DATA_CYCLE2(rfbi_module), cycle2); rfbi_write_reg(RFBI_DATA_CYCLE3(rfbi_module), cycle3); l = rfbi_read_reg(RFBI_CONTROL); l = FLD_MOD(l, rfbi_module+1, 3, 2); /* Select CSx */ l = FLD_MOD(l, 0, 1, 1); /* clear bypass */ rfbi_write_reg(RFBI_CONTROL, l); DSSDBG("RFBI config: bpp %d, lines %d, cycles: 0x%x 0x%x 0x%x\n", bpp, lines, cycle1, cycle2, cycle3); rfbi_enable_clocks(0); return 0; }
void omap_rfbi_write_pixels(const void __iomem *buf, int scr_width, u16 x, u16 y, u16 w, u16 h) { int start_offset = scr_width * y + x; int horiz_offset = scr_width - w; int i; #if TEST_IMAGE == TEST_FAKE_SCREENS int offset; #endif if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { const u16 __iomem *pd = buf; pd += start_offset; for (; h; --h) { for (i = 0; i < w; ++i) { const u8 __iomem *b = (const u8 __iomem *)pd; rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); ++pd; } pd += horiz_offset; } } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_24 && rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_8) { const u32 __iomem *pd = buf; pd += start_offset; for (; h; --h) { for (i = 0; i < w; ++i) { const u8 __iomem *b = (const u8 __iomem *)pd; rfbi_write_reg(RFBI_PARAM, __raw_readb(b+2)); rfbi_write_reg(RFBI_PARAM, __raw_readb(b+1)); rfbi_write_reg(RFBI_PARAM, __raw_readb(b+0)); ++pd; } pd += horiz_offset; } } else if (rfbi.datatype == OMAP_DSS_RFBI_DATATYPE_16 && rfbi.parallelmode == OMAP_DSS_RFBI_PARALLELMODE_16) { #if TEST_IMAGE == TEST_FAKE_SCREENS if(current_image_idx == 0) { current_image = logo_image; current_image_idx = 1; } else if(current_image_idx == 1) { current_image = dash_image; current_image_idx = 2; } else if(current_image_idx == 2) { current_image = nav_image; current_image_idx = 0; } for (; h; --h) { offset = h*w*2; for (i = 0; i < w; ++i) { rfbi_write_reg(RFBI_PARAM, (current_image[offset+i*2+1] << 8) | current_image[offset+i*2]); } } #elif TEST_IMAGE == TEST_PATTERN if(++current_image_idx > 40) current_image_idx = 0; for (; h; --h) { for (i = 0; i < w; ++i) { if((h < 10) || (h > (240-11)) || (i < 10) || (i > (428-11))) { if(current_image_idx < 10) { if(current_image_idx & 0x1) rfbi_write_reg(RFBI_PARAM, RGB565_BLUE | RGB565_GREEN); else rfbi_write_reg(RFBI_PARAM, 0x0000); } else if(current_image_idx < 20) rfbi_write_reg(RFBI_PARAM, RGB565_RED | RGB565_GREEN); else if(current_image_idx < 30) rfbi_write_reg(RFBI_PARAM, RGB565_RED | RGB565_BLUE); else rfbi_write_reg(RFBI_PARAM, RGB565_RED | RGB565_BLUE | RGB565_GREEN); } else if(i < 100) rfbi_write_reg(RFBI_PARAM, RGB565_RED); else if(i < 200) rfbi_write_reg(RFBI_PARAM, RGB565_GREEN); else if(i < 300) rfbi_write_reg(RFBI_PARAM, RGB565_BLUE); else rfbi_write_reg(RFBI_PARAM, RGB565_RED | RGB565_GREEN | RGB565_BLUE); } } #else const u16 __iomem *pd = buf; pd += start_offset; for (; h; --h) { for (i = 0; i < w; ++i) { rfbi_write_reg(RFBI_PARAM, __raw_readw(pd)); ++pd; } pd += horiz_offset; } #endif } else { BUG(); } }