#define RTC_IO_EXTENT 0x10 /*Only really two ports, but... */
-#include <linux/config.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/miscdevice.h>
#include "lcd.h"
+static DEFINE_SPINLOCK(lcd_lock);
+
static int lcd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg);
-static int lcd_present = 1;
+static unsigned int lcd_present = 1;
+/* used in arch/mips/cobalt/reset.c */
int led_state = 0;
#if defined(CONFIG_TULIP) && 0
{
struct lcd_display button_display;
unsigned long address, a;
- int index;
switch (cmd) {
case LCD_On:
case LCD_Write:{
struct lcd_display display;
+ unsigned int index;
if (copy_from_user
// set only bit led_display.leds
case LED_Bit_Set:{
- int i;
+ unsigned int i;
int bit = 1;
struct lcd_display led_display;
// clear only bit led_display.leds
case LED_Bit_Clear:{
- int i;
+ unsigned int i;
int bit = 1;
struct lcd_display led_display;
int ctr = 0;
+ if ( !capable(CAP_SYS_ADMIN) ) return -EPERM;
+
+ pr_info(LCD "Erasing Flash\n");
+
// Chip Erase Sequence
WRITE_FLASH(kFlash_Addr1, kFlash_Data1);
WRITE_FLASH(kFlash_Addr2, kFlash_Data2);
WRITE_FLASH(kFlash_Addr2, kFlash_Data2);
WRITE_FLASH(kFlash_Addr1, kFlash_Erase6);
- printk("Erasing Flash.\n");
-
while ((!dqpoll(0x00000000, 0xFF))
&& (!timeout(0x00000000))) {
ctr++;
}
- printk("\n");
- printk("\n");
- printk("\n");
-
if (READ_FLASH(0x07FFF0) == 0xFF) {
- printk("Erase Successful\r\n");
+ pr_info(LCD "Erase Successful\n");
} else if (timeout) {
- printk("Erase Timed Out\r\n");
+ pr_info(LCD "Erase Timed Out\n");
}
break;
volatile unsigned long burn_addr;
unsigned long flags;
- int i;
+ unsigned int i, index;
unsigned char *rom;
struct lcd_display display;
+ if ( !capable(CAP_SYS_ADMIN) ) return -EPERM;
+
if (copy_from_user
(&display, (struct lcd_display *) arg,
sizeof(struct lcd_display)))
return -EFAULT;
- rom = (unsigned char *) kmalloc((128), GFP_ATOMIC);
+ rom = kmalloc((128), GFP_ATOMIC);
if (rom == NULL) {
- printk("broken\n");
- return 1;
+ printk(KERN_ERR LCD "kmalloc() failed in %s\n",
+ __FUNCTION__);
+ return -ENOMEM;
}
- printk("Churning and Burning -");
- save_flags(flags);
+ pr_info(LCD "Starting Flash burn\n");
for (i = 0; i < FLASH_SIZE; i = i + 128) {
if (copy_from_user
- (rom, display.RomImage + i, 128))
+ (rom, display.RomImage + i, 128)) {
+ kfree(rom);
return -EFAULT;
+ }
burn_addr = kFlashBase + i;
- cli();
+ spin_lock_irqsave(&lcd_lock, flags);
for (index = 0; index < (128); index++) {
WRITE_FLASH(kFlash_Addr1,
kFlash_Data2);
WRITE_FLASH(kFlash_Addr1,
kFlash_Prog);
- *((volatile unsigned char *)
- burn_addr) =
- (volatile unsigned char) rom[index];
-
- while ((!dqpoll
- (burn_addr,
- (volatile unsigned char)
- rom[index]))
- && (!timeout(burn_addr))) {
- }
+ *((volatile unsigned char *)burn_addr) =
+ (volatile unsigned char) rom[index];
+
+ while ((!dqpoll (burn_addr,
+ (volatile unsigned char)
+ rom[index])) &&
+ (!timeout(burn_addr))) { }
burn_addr++;
}
- restore_flags(flags);
- if (*
- ((volatile unsigned char *) (burn_addr
- - 1)) ==
- (volatile unsigned char) rom[index -
- 1]) {
+ spin_unlock_irqrestore(&lcd_lock, flags);
+ if (* ((volatile unsigned char *)
+ (burn_addr - 1)) ==
+ (volatile unsigned char)
+ rom[index - 1]) {
} else if (timeout) {
- printk("Program timed out\r\n");
+ pr_info(LCD "Flash burn timed out\n");
}
}
kfree(rom);
+ pr_info(LCD "Flash successfully burned\n");
+
break;
}
unsigned char *user_bytes;
volatile unsigned long read_addr;
- int i;
+ unsigned int i;
user_bytes =
&(((struct lcd_display *) arg)->RomImage[0]);
(VERIFY_WRITE, user_bytes, FLASH_SIZE))
return -EFAULT;
- printk("Reading Flash");
+ pr_info(LCD "Reading Flash");
for (i = 0; i < FLASH_SIZE; i++) {
unsigned char tmp_byte;
read_addr = kFlashBase + i;
}
default:
- return 0;
- break;
+ return -EINVAL;
}
static int lcd_waiters = 0;
-static long lcd_read(struct inode *inode, struct file *file, char *buf,
- unsigned long count)
+static ssize_t lcd_read(struct file *file, char *buf,
+ size_t count, loff_t *ofs)
{
long buttons_now;
* The various file operations we support.
*/
-static struct file_operations lcd_fops = {
+static const struct file_operations lcd_fops = {
.read = lcd_read,
.ioctl = lcd_ioctl,
.open = lcd_open,
static int lcd_init(void)
{
+ int ret;
unsigned long data;
- printk("%s\n", LCD_DRIVER);
- misc_register(&lcd_dev);
+ pr_info("%s\n", LCD_DRIVER);
+ ret = misc_register(&lcd_dev);
+ if (ret) {
+ printk(KERN_WARNING LCD "Unable to register misc device.\n");
+ return ret;
+ }
/* Check region? Naaah! Just snarf it up. */
/* request_region(RTC_PORT(0), RTC_IO_EXTENT, "lcd");*/
data = LCDReadData;
if ((data & 0x000000FF) == (0x00)) {
lcd_present = 0;
- printk("LCD Not Present\n");
+ pr_info(LCD "LCD Not Present\n");
} else {
lcd_present = 1;
WRITE_GAL(kGal_DevBank2PReg, kGal_DevBank2Cfg);