Linux Audio

Check our new training course

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