Blame view

drivers/parisc/eisa_eeprom.c 2.91 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
  /* 
   *    EISA "eeprom" support routines
   *
   *    Copyright (C) 2001 Thomas Bogendoerfer <tsbogend at parisc-linux.org>
   *
   *
   *    This program is free software; you can redistribute it and/or modify
   *    it under the terms of the GNU General Public License as published by
   *    the Free Software Foundation; either version 2 of the License, or
   *    (at your option) any later version.
   *
   *    This program is distributed in the hope that it will be useful,
   *    but WITHOUT ANY WARRANTY; without even the implied warranty of
   *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   *    GNU General Public License for more details.
   *
   *    You should have received a copy of the GNU General Public License
   *    along with this program; if not, write to the Free Software
   *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/kernel.h>
  #include <linux/miscdevice.h>
  #include <linux/slab.h>
  #include <linux/fs.h>
  #include <asm/io.h>
  #include <asm/uaccess.h>
  #include <asm/eisa_eeprom.h>
  
  #define 	EISA_EEPROM_MINOR 241
  
  static loff_t eisa_eeprom_llseek(struct file *file, loff_t offset, int origin )
  {
  	switch (origin) {
  	  case 0:
  		/* nothing to do */
  		break;
  	  case 1:
  		offset += file->f_pos;
  		break;
  	  case 2:
  		offset += HPEE_MAX_LENGTH;
  		break;
  	}
  	return (offset >= 0 && offset < HPEE_MAX_LENGTH) ? (file->f_pos = offset) : -EINVAL;
  }
  
  static ssize_t eisa_eeprom_read(struct file * file,
45dbe9147   Alexey Dobriyan   [PARISC] Add __us...
51
  			      char __user *buf, size_t count, loff_t *ppos )
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
56
  {
  	unsigned char *tmp;
  	ssize_t ret;
  	int i;
  	
6b4dbcd86   Michael Buesch   parisc: isa-eepro...
57
  	if (*ppos < 0 || *ppos >= HPEE_MAX_LENGTH)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  		return 0;
  	
  	count = *ppos + count < HPEE_MAX_LENGTH ? count : HPEE_MAX_LENGTH - *ppos;
  	tmp = kmalloc(count, GFP_KERNEL);
  	if (tmp) {
  		for (i = 0; i < count; i++)
  			tmp[i] = readb(eisa_eeprom_addr+(*ppos)++);
  
  		if (copy_to_user (buf, tmp, count))
  			ret = -EFAULT;
  		else
  			ret = count;
  		kfree (tmp);
  	} else
  		ret = -ENOMEM;
  	
  	return ret;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
76
77
  static int eisa_eeprom_open(struct inode *inode, struct file *file)
  {
aeb5d7270   Al Viro   [PATCH] introduce...
78
  	if (file->f_mode & FMODE_WRITE)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
79
80
81
82
83
84
85
86
87
88
89
90
91
  		return -EINVAL;
     
  	return 0;
  }
  
  static int eisa_eeprom_release(struct inode *inode, struct file *file)
  {
  	return 0;
  }
  
  /*
   *	The various file operations we support.
   */
d54b1fdb1   Arjan van de Ven   [PATCH] mark stru...
92
  static const struct file_operations eisa_eeprom_fops = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
93
94
95
  	.owner =	THIS_MODULE,
  	.llseek =	eisa_eeprom_llseek,
  	.read =		eisa_eeprom_read,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  	.open =		eisa_eeprom_open,
  	.release =	eisa_eeprom_release,
  };
  
  static struct miscdevice eisa_eeprom_dev = {
  	EISA_EEPROM_MINOR,
  	"eisa_eeprom",
  	&eisa_eeprom_fops
  };
  
  static int __init eisa_eeprom_init(void)
  {
  	int retval;
  
  	if (!eisa_eeprom_addr)
  		return -ENODEV;
  
  	retval = misc_register(&eisa_eeprom_dev);
  	if (retval < 0) {
  		printk(KERN_ERR "EISA EEPROM: cannot register misc device.
  ");
  		return retval;
  	}
  
  	printk(KERN_INFO "EISA EEPROM at 0x%p
  ", eisa_eeprom_addr);
  	return 0;
  }
  
  MODULE_LICENSE("GPL");
  
  module_init(eisa_eeprom_init);