Lines Matching +full:top +full:- +full:left
2 * linux/drivers/video/arcfb.c -- FB driver for Arc monochrome LCD board
17 * GPIO-less system, the board can be tested by connecting the respective sigs
24 * - testing with 4x4
25 * - testing with interrupt hw
28 * - User must set tuhold. It's in microseconds. According to the 108 spec,
30 * - User must set num_cols=x num_rows=y, eg: x=2 means 128
31 * - User must set arcfb_enable=1 to enable it
32 * - User must set dio_addr=0xIOADDR cio_addr=0xIOADDR
53 #define floorXres(a,xres) (a&(~(xres - 1)))
56 #define ceilXres(a,xres) (a|(xres - 1))
118 unsigned char chipselval = par->cslut[chipindex]; in ks108_writeb_ctl()
120 outb(chipselval|KS_CEHI|KS_SEL_CMD, par->cio_addr); in ks108_writeb_ctl()
121 outb(value, par->dio_addr); in ks108_writeb_ctl()
123 outb(chipselval|KS_CELO|KS_SEL_CMD, par->cio_addr); in ks108_writeb_ctl()
129 outb(value, par->cio_addr); in ks108_writeb_mainctl()
135 return inb(par->c2io_addr); in ks108_readb_ctl2()
141 unsigned char chipselval = par->cslut[chipindex]; in ks108_writeb_data()
143 outb(chipselval|KS_CEHI|KS_SEL_DATA, par->cio_addr); in ks108_writeb_data()
144 outb(value, par->dio_addr); in ks108_writeb_data()
146 outb(chipselval|KS_CELO|KS_SEL_DATA, par->cio_addr); in ks108_writeb_data()
185 struct arcfb_par *par = info->par; in arcfb_open()
187 atomic_inc(&par->ref_count); in arcfb_open()
193 struct arcfb_par *par = info->par; in arcfb_release()
194 int count = atomic_read(&par->ref_count); in arcfb_release()
197 return -EINVAL; in arcfb_release()
198 atomic_dec(&par->ref_count); in arcfb_release()
206 struct arcfb_par *par = info->par; in arcfb_pan_display()
208 if ((var->vmode & FB_VMODE_YWRAP) && (var->yoffset < 64) in arcfb_pan_display()
209 && (info->var.yres <= 64)) { in arcfb_pan_display()
211 ks108_set_start_line(par, i, var->yoffset); in arcfb_pan_display()
213 info->var.yoffset = var->yoffset; in arcfb_pan_display()
217 return -EINVAL; in arcfb_pan_display()
224 struct arcfb_par *par = info->par; in arcfb_interrupt()
233 spin_lock(&par->lock); in arcfb_interrupt()
237 spin_unlock(&par->lock); in arcfb_interrupt()
249 unsigned int left, unsigned int right, unsigned int distance) in arcfb_lcd_update_page() argument
257 xindex = left >> 6; in arcfb_lcd_update_page()
263 linesize = par->info->var.xres/8; in arcfb_lcd_update_page()
264 src = (unsigned char *)par->info->screen_buffer + (left/8) + in arcfb_lcd_update_page()
266 ks108_set_xaddr(par, chipindex, left); in arcfb_lcd_update_page()
270 while (left <= right) { in arcfb_lcd_update_page()
275 << (i - rightshift); in arcfb_lcd_update_page()
278 >> (rightshift - i); in arcfb_lcd_update_page()
282 left++; in arcfb_lcd_update_page()
296 * lcd chips. update_page uses the upper/left values to decide which
300 static void arcfb_lcd_update_vert(struct arcfb_par *par, unsigned int top, in arcfb_lcd_update_vert() argument
301 unsigned int bottom, unsigned int left, unsigned int right) in arcfb_lcd_update_vert() argument
305 distance = (bottom - top) + 1; in arcfb_lcd_update_vert()
306 upper = top; in arcfb_lcd_update_vert()
307 lower = top + 7; in arcfb_lcd_update_vert()
310 distance -= 8; in arcfb_lcd_update_vert()
311 arcfb_lcd_update_page(par, upper, left, right, 8); in arcfb_lcd_update_vert()
322 static void arcfb_lcd_update_horiz(struct arcfb_par *par, unsigned int left, in arcfb_lcd_update_horiz() argument
323 unsigned int right, unsigned int top, unsigned int h) in arcfb_lcd_update_horiz() argument
328 upper = floor8(top); in arcfb_lcd_update_horiz()
329 lower = min(upper + distance - 1, ceil64(upper)); in arcfb_lcd_update_horiz()
332 distance -= ((lower - upper) + 1 ); in arcfb_lcd_update_horiz()
333 arcfb_lcd_update_vert(par, upper, lower, left, right); in arcfb_lcd_update_horiz()
335 lower = min(upper + distance - 1, ceil64(upper)); in arcfb_lcd_update_horiz()
347 unsigned int left, right, distance, y; in arcfb_lcd_update() local
351 h += dy - y; in arcfb_lcd_update()
355 left = dx; in arcfb_lcd_update()
356 right = min(left + w - 1, ceil64(left)); in arcfb_lcd_update()
359 arcfb_lcd_update_horiz(par, left, right, y, h); in arcfb_lcd_update()
360 distance -= ((right - left) + 1); in arcfb_lcd_update()
361 left = right + 1; in arcfb_lcd_update()
362 right = min(left + distance - 1, ceil64(left)); in arcfb_lcd_update()
370 struct arcfb_par *par = info->par; in arcfb_ioctl()
378 if (!par->irq) in arcfb_ioctl()
379 return -EINVAL; in arcfb_ioctl()
383 spin_lock_irqsave(&par->lock, flags); in arcfb_ioctl()
386 spin_unlock_irqrestore(&par->lock, flags); in arcfb_ioctl()
396 ctl2 = ks108_readb_ctl2(info->par); in arcfb_ioctl()
398 return -EFAULT; in arcfb_ioctl()
402 return -EINVAL; in arcfb_ioctl()
408 struct arcfb_par *par = info->par; in arcfb_damage_range()
409 unsigned int xres = info->var.xres; in arcfb_damage_range()
416 bitcount = endpos - startpos; in arcfb_damage_range()
429 struct arcfb_par *par = info->par; in arcfb_damage_area()
453 int retval = -ENOMEM; in arcfb_probe()
462 less-flat actual paged framebuffer */ in arcfb_probe()
467 info = framebuffer_alloc(sizeof(struct arcfb_par), &dev->dev); in arcfb_probe()
471 info->flags |= FBINFO_VIRTFB; in arcfb_probe()
472 info->screen_buffer = videomemory; in arcfb_probe()
473 info->fbops = &arcfb_ops; in arcfb_probe()
475 info->var = arcfb_var; in arcfb_probe()
476 info->fix = arcfb_fix; in arcfb_probe()
477 par = info->par; in arcfb_probe()
478 par->info = info; in arcfb_probe()
484 par->dio_addr = dio_addr; in arcfb_probe()
485 par->cio_addr = cio_addr; in arcfb_probe()
486 par->c2io_addr = c2io_addr; in arcfb_probe()
487 par->cslut[0] = 0x00; in arcfb_probe()
488 par->cslut[1] = 0x06; in arcfb_probe()
489 spin_lock_init(&par->lock); in arcfb_probe()
491 par->irq = irq; in arcfb_probe()
492 if (request_irq(par->irq, &arcfb_interrupt, IRQF_SHARED, in arcfb_probe()
495 "arcfb: Failed req IRQ %d\n", par->irq); in arcfb_probe()
496 retval = -EBUSY; in arcfb_probe()
528 free_irq(par->irq, info); in arcfb_probe()
543 free_irq(((struct arcfb_par *)(info->par))->irq, info); in arcfb_remove()
544 vfree(info->screen_buffer); in arcfb_remove()
564 return -ENXIO; in arcfb_init()
572 ret = -ENOMEM; in arcfb_init()