81 lines
1.4 KiB
C
81 lines
1.4 KiB
C
|
/*
|
||
|
* FRAM driver for MIMC200 board
|
||
|
*
|
||
|
* Copyright 2008 Mark Jackson <mpfj@mimc.co.uk>
|
||
|
*
|
||
|
* This module adds *very* simply support for the system's FRAM device.
|
||
|
* At the moment, this is hard-coded to the MIMC200 platform, and only
|
||
|
* supports mmap().
|
||
|
*/
|
||
|
|
||
|
#define FRAM_VERSION "1.0"
|
||
|
|
||
|
#include <linux/miscdevice.h>
|
||
|
#include <linux/proc_fs.h>
|
||
|
#include <linux/mm.h>
|
||
|
#include <linux/io.h>
|
||
|
|
||
|
#define FRAM_BASE 0xac000000
|
||
|
#define FRAM_SIZE 0x20000
|
||
|
|
||
|
/*
|
||
|
* The are the file operation function for user access to /dev/fram
|
||
|
*/
|
||
|
|
||
|
static int fram_mmap(struct file *filp, struct vm_area_struct *vma)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
ret = remap_pfn_range(vma,
|
||
|
vma->vm_start,
|
||
|
virt_to_phys((void *)((unsigned long)FRAM_BASE)) >> PAGE_SHIFT,
|
||
|
vma->vm_end-vma->vm_start,
|
||
|
PAGE_SHARED);
|
||
|
|
||
|
if (ret != 0)
|
||
|
return -EAGAIN;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static const struct file_operations fram_fops = {
|
||
|
.owner = THIS_MODULE,
|
||
|
.mmap = fram_mmap,
|
||
|
};
|
||
|
|
||
|
#define FRAM_MINOR 0
|
||
|
|
||
|
static struct miscdevice fram_dev = {
|
||
|
FRAM_MINOR,
|
||
|
"fram",
|
||
|
&fram_fops
|
||
|
};
|
||
|
|
||
|
static int __init
|
||
|
fram_init(void)
|
||
|
{
|
||
|
int ret;
|
||
|
|
||
|
ret = misc_register(&fram_dev);
|
||
|
if (ret) {
|
||
|
printk(KERN_ERR "fram: can't misc_register on minor=%d\n",
|
||
|
FRAM_MINOR);
|
||
|
return ret;
|
||
|
}
|
||
|
printk(KERN_INFO "FRAM memory driver v" FRAM_VERSION "\n");
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static void __exit
|
||
|
fram_cleanup_module(void)
|
||
|
{
|
||
|
misc_deregister(&fram_dev);
|
||
|
}
|
||
|
|
||
|
module_init(fram_init);
|
||
|
module_exit(fram_cleanup_module);
|
||
|
|
||
|
MODULE_LICENSE("GPL");
|
||
|
|
||
|
MODULE_ALIAS_MISCDEV(FRAM_MINOR);
|