ckfwq/linux-3.0.4/drivers/char/jzq_yxinfo.c

143 lines
3.3 KiB
C
Raw Permalink Normal View History

2024-12-30 10:53:50 +08:00
/*
* GSC3280 GW-JZQ YX Driver
*
* Copyright (C) 2013 BLX IC Design Corp.,Ltd.
* Author: Fei Lu, Lufei@china-cpu.com
*
* 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.
*
*/
#include <linux/types.h>
#include <linux/delay.h>
#include <linux/module.h>
#include <linux/interrupt.h>
#include <linux/ioport.h>
#include <linux/init.h>
#include <linux/err.h>
#include <linux/rcupdate.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/slab.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/completion.h>
#include <asm/io.h>
#include <linux/fs.h>
#include <linux/fcntl.h>
#include <asm/uaccess.h>
#include <linux/gpio.h>
#include <gsc3280/gpio.h>
enum {
YX1 = 0,
YX2,
YX3,
YX4,
DOOR,
MAX_PIN_NR,
};
struct gpio yx_gpios[MAX_PIN_NR] = {
{GSC3280_GPA(31), GPIOF_IN, "YX1"},
{GSC3280_GPA(14), GPIOF_IN, "YX2"},
{GSC3280_GPA(19), GPIOF_IN, "YX3"},
{GSC3280_GPA(20), GPIOF_IN, "YX4"},
{GSC3280_GPB(28), GPIOF_IN, "DOOR"},
};
struct jzq_yx {
struct cdev cdev;
struct class *yx_class;
dev_t dev;
};
struct jzq_yx jzq_yx_priv;
static ssize_t yx_read ( struct file * pfile , char __user * pbuf , size_t size , loff_t * ppos )
{
uint8_t buffer[5];
buffer[0] = gpio_get_value(yx_gpios[YX1].gpio);
buffer[1] = gpio_get_value(yx_gpios[YX2].gpio);
buffer[2] = gpio_get_value(yx_gpios[YX3].gpio);
buffer[3] = gpio_get_value(yx_gpios[YX4].gpio);
buffer[4] = gpio_get_value(yx_gpios[DOOR].gpio);
copy_to_user(pbuf, buffer, 5);
return 5;
}
static int yx_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int yx_release(struct inode *inode, struct file *filp)
{
return 0;
}
struct file_operations yx_fops = {
.owner = THIS_MODULE,
.read = yx_read,
.open = yx_open,
.release = yx_release,
};
static int __init jzq_yx_init(void)
{
int err,ret;
int result;
int major;
result = alloc_chrdev_region(&jzq_yx_priv.dev, 0, 0, "yx");
major = MAJOR(jzq_yx_priv.dev);
if (result < 0) {
printk(KERN_WARNING "jzq_yx: can't get major %d\n", major);
return result;
}
cdev_init(&jzq_yx_priv.cdev, &yx_fops);
jzq_yx_priv.cdev.owner = THIS_MODULE;
jzq_yx_priv.cdev.ops = &yx_fops;
err = cdev_add(&jzq_yx_priv.cdev, jzq_yx_priv.dev, 1);
if (err) {
printk(KERN_NOTICE "Error[%d] cdev_add .\n", err);
return -1;
}
jzq_yx_priv.yx_class = class_create(THIS_MODULE, "yx");
if (IS_ERR(jzq_yx_priv.yx_class)) {
printk(KERN_ERR "Failed in create yx_cdev class\n");
return -1;
}
device_create(jzq_yx_priv.yx_class, NULL, jzq_yx_priv.dev, NULL, "yx");
ret = gpio_request_array(yx_gpios, MAX_PIN_NR);
if (ret < 0)
return ret;
return 0;
}
static void __exit jzq_yx_exit(void)
{
gpio_free_array(yx_gpios, MAX_PIN_NR);
cdev_del(&jzq_yx_priv.cdev);
unregister_chrdev_region(jzq_yx_priv.dev, 1);
device_destroy(jzq_yx_priv.yx_class, jzq_yx_priv.dev);
class_destroy(jzq_yx_priv.yx_class);
}
module_init(jzq_yx_init);
module_exit(jzq_yx_exit);
MODULE_AUTHOR("lufei@china-cpu.com");
MODULE_DESCRIPTION("GSC3280 GW-JZQ YX Driver");
MODULE_LICENSE("GPL");