static ssize_t cobalt_lcdfb_read(struct fb_info *info, char __user *buf, size_t count, loff_t *ppos) { char src[LCD_CHARS_MAX]; unsigned long pos; int len, retval = 0; pos = *ppos; if (pos >= LCD_CHARS_MAX || count == 0) return 0; if (count > LCD_CHARS_MAX) count = LCD_CHARS_MAX; if (pos + count > LCD_CHARS_MAX) count = LCD_CHARS_MAX - pos; for (len = 0; len < count; len++) { retval = lcd_busy_wait(info); if (retval < 0) break; lcd_write_control(info, LCD_TEXT_POS(pos)); retval = lcd_busy_wait(info); if (retval < 0) break; src[len] = lcd_read_data(info); if (pos == 0x0f) pos = 0x40; else pos++; } if (retval < 0 && signal_pending(current)) return -ERESTARTSYS; if (copy_to_user(buf, src, len)) return -EFAULT; *ppos += len; return len; }
__INLINE uint16_t lcd_read_reg(uint16_t reg){ lcd_write_index(reg); return lcd_read_data(); }