From 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Tue, 22 Oct 2024 10:36:11 +0000
Subject: [PATCH] 修改4g拨号为QMI,需要在系统里后台执行quectel-CM
---
kernel/drivers/misc/nkio/nk_io_core.c | 889 ++++++++++++++++++++---------------------------------------
1 files changed, 300 insertions(+), 589 deletions(-)
diff --git a/kernel/drivers/misc/nkio/nk_io_core.c b/kernel/drivers/misc/nkio/nk_io_core.c
index e084fb3..c2f4ae1 100755
--- a/kernel/drivers/misc/nkio/nk_io_core.c
+++ b/kernel/drivers/misc/nkio/nk_io_core.c
@@ -1,613 +1,324 @@
-/*
- * Copyright (C) 2014 Rockchip Corporation.
- *
- * This software is licensed under the terms of the GNU General Public
- * License version 2, as published by the Free Software Foundation, and
- * may be copied, distributed, and modified under those terms.
- *
- * 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.
- *
- */
#include <linux/module.h>
-#include <linux/moduleparam.h>
-#include <linux/init.h>
-#include <linux/delay.h>
-#include <linux/pm.h>
-#include <linux/i2c.h>
-#include <linux/spi/spi.h>
-#include <linux/platform_device.h>
-#include <linux/errno.h>
#include <linux/err.h>
-#include <linux/debugfs.h>
-#include <linux/of_gpio.h>
#include <linux/gpio.h>
-#include <linux/iio/consumer.h>
-#include <linux/of.h>
-#include "nkio.h"
+#include <linux/kernel.h>
+#include <linux/of_gpio.h>
+#include <linux/of_platform.h>
+#include <linux/delay.h>
+#include <linux/input.h>
+#include <linux/proc_fs.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <asm/uaccess.h>
+#include <linux/string.h>
+#include <linux/uaccess.h>
+#include <linux/device.h>
+#include <linux/proc_fs.h>
+
+#define GPIO_FUNCTION_OUTPUT 0
+#define GPIO_FUNCTION_INPUT 1
+#define GPIO_FUNCTION_RESET 3
+#define HIGH "1"
+#define LOW "0"
-/* Debug */
-#if 1
-#define DBG(x...) printk(x)
-#else
-#define DBG(x...) do { } while (0)
-#endif
+//static int flash_flag = 0;
+
+struct ndj_gpio {
+ int gpio_num; //gpio num
+ int action; //gpio flag
+ int gpio_event; //input only
+ int send_mode; //input only
+ int gpio_function; //gpio function,i/o
+ int gpio_ctrl;
+ char *gpio_name;
+};
+
+struct ndj_gpio_data {
+ struct ndj_gpio ndj_gpio_num[20];
+ struct timer_list mytimer;
+ int gpio_dts_num;
+ unsigned int gpio_op0;
+ unsigned int gpio_op1;
+};
-struct nk_io_pdata *NKpdata_info;
-u32 op0_enable,op1_enable,op2_enable,op3_enable,op4_enable,op5_enable,mic_enable;
-u32 ip0_enable,ip1_enable,ip2_enable,ip3_enable,ip4_enable,ip5_enable;
-u32 module_enable;
-//static struct class *nk_class;
+static struct ndj_gpio_data *gpio_data = NULL;
-
-
-void Audio_SET(int i);
-
- void Audio_SET(int i)
- {
- if(i==11){
- gpio_direction_output(NKpdata_info->audio_switch_gpio, 1);
- printk("Audio_SET ENABLE------andy\n");
- }else{
- gpio_direction_output(NKpdata_info->audio_switch_gpio, 0);
- printk("Audio_SET DISABLE------andy\n");
- }
- }
- EXPORT_SYMBOL_GPL(Audio_SET);
-
-static int nk_io_control_probe(struct platform_device *pdev)
-{
- struct device_node *node = pdev->dev.of_node;
- struct nk_io_pdata *pdata;
- int gpio0, gpio1, gpio2, gpio3, reset_pin, ch342_reset;
- int ret;
- int lvds_index;
- int i=0;
- static int lvds_gpio[4] ;
-
- enum of_gpio_flags flags;
-
- printk(" #######nk_io_control_probe####### \n");
-
- pdata = kzalloc(sizeof(struct nk_io_pdata), GFP_KERNEL);
- if (pdata == NULL) {
- printk("%s failed to allocate driver data\n",__FUNCTION__);
- return -ENOMEM;
- }
- memset(pdata,0,sizeof(struct nk_io_pdata));
-
- //vcc_5v_io
- ret = of_get_named_gpio_flags(node, "vcc_5v_io", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property vcc_5v_io\n", __FUNCTION__);
- goto err;
- } else {
- pdata->vcc_5v_io = ret;
- ret = devm_gpio_request(&pdev->dev, pdata->vcc_5v_io, "vcc_5v_io");
- if(ret < 0){
- printk("%s() devm_gpio_request vcc_5v_io request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = gpio_direction_output(pdata->vcc_5v_io,1);
- if(ret < 0){
- printk("%s() gpio_direction_input vcc_5v_io set ERROR\n", __FUNCTION__);
- goto err;
- }
- }
-
- //vcc3_io_en_gpio
- ret = of_get_named_gpio_flags(node, "vcc3_io_en_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property vcc3_io_en_gpio\n", __FUNCTION__);
- goto err;
- } else {
- pdata->vcc3_io_en_gpio = ret;
- ret = devm_gpio_request(&pdev->dev, pdata->vcc3_io_en_gpio, "vcc3_io_en_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request vcc3_io_en_gpio request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = gpio_direction_output(pdata->vcc3_io_en_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_output vcc3_io_en_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- }
-
- //vcc_12v_io
- ret = of_get_named_gpio_flags(node, "vcc_12v_io", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property vcc_12v_io\n", __FUNCTION__);
- goto err;
- } else {
- pdata->vcc_12v_io = ret;
- ret = devm_gpio_request(&pdev->dev, pdata->vcc_12v_io, "vcc_12v_io");
- if(ret < 0){
- printk("%s() devm_gpio_request vcc_12v_io request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = gpio_direction_output(pdata->vcc_12v_io,1);
- if(ret < 0){
- printk("%s() gpio_direction_input vcc_12v_io set ERROR\n", __FUNCTION__);
- goto err;
- }
- }
-
-
- //hub_host2_5V_rest_gpio
- ret = of_get_named_gpio_flags(node, "hub_host2_5V_rest_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property hub_host2_5V_rest_gpio\n", __FUNCTION__);
- goto err;
- } else {
- pdata->hub_host2_5V_rest_gpio = ret;
- ret = devm_gpio_request(&pdev->dev, pdata->hub_host2_5V_rest_gpio, "hub_host2_5V_rest_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request hub_host2_5V_rest_gpio request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = gpio_direction_output(pdata->hub_host2_5V_rest_gpio,0);
- if(ret < 0){
- printk("%s() gpio_direction_input hub_host2_5V_rest_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- msleep(800);
- ret = gpio_direction_output(pdata->hub_host2_5V_rest_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_input hub_host2_5V_rest_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- }
-
- //hub_host3_5v_gpio
- ret = of_get_named_gpio_flags(node, "hub_host3_5v_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property hub_host3_5v_gpio\n", __FUNCTION__);
- goto err;
- } else {
- pdata->hub_host3_5v_gpio = ret;
- gpio_free(ret);
- ret = devm_gpio_request(&pdev->dev, pdata->hub_host3_5v_gpio, "hub_host3_5v_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request hub_host3_5v_gpio request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = gpio_direction_output(pdata->hub_host3_5v_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_input hub_host3_5v_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- }
+/* creat sysfs gpio api node*/
#if 0
- //hub_host3_5V_rest_gpio
- ret = of_get_named_gpio_flags(node, "hub_host3_5V_rest_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property hub_host3_5V_rest_gpio\n", __FUNCTION__);
- goto err;
- } else {
- pdata->hub_host3_5V_rest_gpio = ret;
- ret = devm_gpio_request(&pdev->dev, pdata->hub_host3_5V_rest_gpio, "hub_host3_5V_rest_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request hub_host3_5V_rest_gpio request ERROR\n", __FUNCTION__);
- goto err;
- }
+static ssize_t gpio_op0_show(struct class *class,struct class_attribute *attr, char *buf)
+{
+ return sprintf(buf, "%d\n", gpio_get_value(gpio_data->gpio_op0));
+}
- ret = gpio_direction_output(pdata->hub_host3_5V_rest_gpio,0);
- if(ret < 0){
- printk("%s() gpio_direction_input hub_host3_5V_rest_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- msleep(800);
- ret = gpio_direction_output(pdata->hub_host3_5V_rest_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_input hub_host3_5V_rest_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- }
+static ssize_t gpio_op0_store(struct class *class,struct class_attribute *attr, const char *buf, size_t size)
+{
+ if(!strncmp(buf, HIGH, strlen(HIGH))) {
+ gpio_set_value(gpio_data->gpio_op0, 1);
+
+ } else if(!strncmp(buf, LOW, strlen(LOW))) {
+ gpio_set_value(gpio_data->gpio_op0, 0);
+ }
+ return size;
+}
+
+static ssize_t gpio_op1_show(struct class *class,struct class_attribute *attr, char *buf)
+{
+ return sprintf(buf, "%d\n", gpio_get_value(gpio_data->gpio_op1));
+}
+
+static ssize_t gpio_op1_store(struct class *class,struct class_attribute *attr, const char *buf, size_t size)
+{
+ if(!strncmp(buf, HIGH, strlen(HIGH))) {
+ gpio_set_value(gpio_data->gpio_op1, 1);
+
+ } else if(!strncmp(buf, LOW, strlen(LOW))) {
+ gpio_set_value(gpio_data->gpio_op1, 0);
+ }
+ return size;
+}
+
+static CLASS_ATTR_RW(gpio_op0);
+static CLASS_ATTR_RW(gpio_op1);
+
+static struct attribute *ndj_gpio_attrs[] = {
+ &class_attr_gpio_op0.attr,
+ &class_attr_gpio_op1.attr,
+ NULL,
+};
+
+ATTRIBUTE_GROUPS(ndj_gpio);
+
+/** Device model classes */
+struct class ndj_io_class = {
+ .name = "io_control", //sysfs directory
+ .class_groups = ndj_gpio_groups,
+};
+
#endif
- //wake_4g_gpio
- ret = of_get_named_gpio_flags(node, "wake_4g_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property wake_4g_gpio\n", __FUNCTION__);
- } else {
- pdata->wake_4g_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->wake_4g_gpio, "wake_4g_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request wake_4g_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->wake_4g_gpio,0);
- if(ret < 0){
- printk("%s() gpio_direction_input wake_4g_gpio set ERROR\n", __FUNCTION__);
- }
- }
-
-
- //reset_4g_gpio
- ret = of_get_named_gpio_flags(node, "reset_4g_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property reset_4g_gpio\n", __FUNCTION__);
- } else {
- pdata->reset_4g_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->reset_4g_gpio, "reset_4g_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request reset_4g_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->reset_4g_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__);
- goto err;
- }
- msleep(800);
- ret = gpio_direction_output(pdata->reset_4g_gpio,0);
- if(ret < 0){
- printk("%s() gpio_direction_input reset_4g_gpio set ERROR\n", __FUNCTION__);
-
- }
- }
-
- //en_4g_gpio
- ret = of_get_named_gpio_flags(node, "en_4g_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property en_4g_gpio\n", __FUNCTION__);
- } else {
- pdata->en_4g_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->en_4g_gpio, "en_4g_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request en_4g_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->en_4g_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_output en_4g_gpio set ERROR\n", __FUNCTION__);
- }
- }
-
- //hp_en_gpio
- ret = of_get_named_gpio_flags(node, "hp_en_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property hp_en_gpio\n", __FUNCTION__);
- } else {
- pdata->hp_en_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->hp_en_gpio, "hp_en_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request hp_en_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->hp_en_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_output hp_en_gpio set ERROR\n", __FUNCTION__);
- }
- }
-
- //wifi_power_en_gpio
- ret = of_get_named_gpio_flags(node, "wifi_power_en_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property wifi_power_en_gpio\n", __FUNCTION__);
- } else {
- pdata->wifi_power_en_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->wifi_power_en_gpio, "wifi_power_en_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request wifi_power_en_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->wifi_power_en_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_output wifi_power_en_gpio set ERROR\n", __FUNCTION__);
- }
- }
-
-
- //spk_out_gpio
- ret = of_get_named_gpio_flags(node, "spk_out_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property spk_out_gpio\n", __FUNCTION__);
- } else {
- pdata->spk_out_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->spk_out_gpio, "spk_out_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request spk_out_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->spk_out_gpio,0);
- if(ret < 0){
- printk("%s() gpio_direction_output spk_out_gpio set ERROR\n", __FUNCTION__);
- }
- }
- //air_mode_4g_gpio
- ret = of_get_named_gpio_flags(node, "air_mode_4g_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property air_mode_4g_gpio\n", __FUNCTION__);
- } else {
- pdata->air_mode_4g_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->air_mode_4g_gpio, "air_mode_4g_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request air_mode_4g_gpio request ERROR\n", __FUNCTION__);
- }
- ret = gpio_direction_output(pdata->air_mode_4g_gpio,0);
- if(ret < 0){
- printk("%s() gpio_direction_input air_mode_4g_gpio set ERROR\n", __FUNCTION__);
- }
- }
-
-
-/*
- //edp_power_supply_gpio;
- ret = of_get_named_gpio_flags(node, "edp_power_supply_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property edp_power_supply_gpio\n", __FUNCTION__);
- } else {
- pdata->edp_power_supply_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->edp_power_supply_gpio, "edp_power_supply_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request edp_power_supply_gpio request ERROR\n", __FUNCTION__);
- }
-
- ret = gpio_direction_output(pdata->edp_power_supply_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_input edp_power_supply_gpio set ERROR\n", __FUNCTION__);
- }
- }
-
- //edp_enable-gpio;
- ret = of_get_named_gpio_flags(node, "edp_enable_gpio", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property edp_enable_gpio\n", __FUNCTION__);
- } else {
- pdata->edp_enable_gpio = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->edp_enable_gpio, "edp_enable_gpio");
- if(ret < 0){
- printk("%s() devm_gpio_request edp_enable_gpio request ERROR\n", __FUNCTION__);
- }
-
- ret = gpio_direction_output(pdata->edp_enable_gpio,1);
- if(ret < 0){
- printk("%s() gpio_direction_input edp_enable_gpio set ERROR\n", __FUNCTION__);
- }
- }
+//static int event_flag = 0;
+static int open_now = 0;
+static char* file_name = NULL;
+
+static int gpio_open(struct inode *inode, struct file *file)
+{
+ struct dentry* dent = file->f_path.dentry;
+ int i = 0;
+
+ file_name = (char*)(dent->d_name.name);
+
+ for (i = 0; i < gpio_data->gpio_dts_num; i++){
+ if(!strcmp(file_name,gpio_data->ndj_gpio_num[i].gpio_name)){
+ open_now = i;
+ }
+ }
+ return 0;
+}
+
+static ssize_t gpio_write(struct file *file, const char *buffer,size_t count, loff_t *data)
+{
+ char buf[2]={0};
+ char s1[]="1";
+
+ if(copy_from_user(&buf[0],buffer,1)){
+ printk("failed to copy data to kernel space\n");
+ return -EFAULT;
+ }
+
+ if(!strcmp(buf,s1)){
+ gpio_direction_output(gpio_data->ndj_gpio_num[open_now].gpio_num,1);
+ //printk("%s write 1 succeed\n",gpio_data->ndj_gpio_num[open_now].gpio_name);
+ }else{
+ gpio_direction_output(gpio_data->ndj_gpio_num[open_now].gpio_num,0);
+ //printk("%s write 0 succeed\n",gpio_data->ndj_gpio_num[open_now].gpio_name);
+ }
+ return count;
+}
+
+
+static ssize_t gpio_read(struct file *file, char __user * buffer, size_t count, loff_t *data)
+{
+ int gpio_val = 0;
+ int len = 0;
+ char s[10] = {0};
+
+ if(*data)
+ return 0;
+
+ gpio_val = gpio_get_value(gpio_data->ndj_gpio_num[open_now].gpio_num);
+ //printk("get %s value %d\n",gpio_data->ndj_gpio_num[open_now].gpio_name,gpio_val);
+
+ len = sprintf(s+len, "%d\n",gpio_val);
+
+ return simple_read_from_buffer(buffer, count, data, s, 2);
+}
+
+
+static const struct proc_ops gpio_ops = {
+ .proc_open = gpio_open,
+ .proc_write = gpio_write,
+ .proc_read = gpio_read,
+};
+
+static int ndj_gpio_probe(struct platform_device *pdev) {
+ struct device_node *np = pdev->dev.of_node;
+ struct device_node *child_np;
+ static struct proc_dir_entry *root_entry_gpio;
+ enum of_gpio_flags gpio_flags;
+ int ret = 0;
+ int gpio_cnt = 0;
+ char gpio_name_num[20];
+ int gpio_in_cnt = 0;
+
+ gpio_data = devm_kzalloc(&pdev->dev, sizeof(struct ndj_gpio_data),GFP_KERNEL);
+ if (!gpio_data) {
+ dev_err(&pdev->dev, "failed to allocate memory\n");
+ return -ENOMEM;
+ }
+
+ gpio_data->gpio_dts_num = of_get_child_count(np);
+// printk("ndj_gpio prepare build %d gpio\n",gpio_data->gpio_dts_num);
+
+ if (gpio_data->gpio_dts_num == 0){
+ dev_info(&pdev->dev, "no gpio defined\n");
+ }
- //ch342_enable-gpio;
- ret = of_get_named_gpio_flags(node, "ch342_power", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property ch342_gpio\n", __FUNCTION__);
- } else {
- pdata->ch342_power = ret;
-
- ret = devm_gpio_request(&pdev->dev, pdata->ch342_power, "ch342_power");
- if(ret < 0){
- printk("%s() devm_gpio_request ch342_power request ERROR\n", __FUNCTION__);
- }
-
- ret = gpio_direction_output(pdata->ch342_power,1);
- if(ret < 0){
- printk("%s() gpio_direction_input ch342_power set ERROR\n", __FUNCTION__);
- }
- }
-*/
-
- //edp_set_pixel-s
- ret = of_get_named_gpio_flags(node, "edp_reset", 0, &flags);
+ #if 0
+ /*gpio_op0*/
+ ret = of_get_named_gpio_flags(np, "gpio_op0", 0, &gpio_flags);
if (ret < 0) {
- printk("%s() Can not read property edp_reset\n", __FUNCTION__);
- goto err;
+ printk("%s() Can not read property gpio_op0\n", __func__);
+ return -ENODEV;
}
-
- reset_pin = ret;
-
-// enable lvds
- ret = of_get_named_gpio_flags(node, "edp_gpio0", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property edp_gpio0\n", __FUNCTION__);
- goto err;
- }
- gpio0 = ret;
-
-
-
- ret = of_get_named_gpio_flags(node, "edp_gpio1", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property edp_gpio1\n", __FUNCTION__);
- goto err;
- }
-
- gpio1 = ret;
-
- ret = of_get_named_gpio_flags(node, "edp_gpio2", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property edp_gpio2\n", __FUNCTION__);
- goto err;
- }
-
- gpio2 = ret;
-
- ret = of_get_named_gpio_flags(node, "edp_gpio3", 0, &flags);
- if (ret < 0) {
- printk("%s() Can not read property edp_gpio3\n", __FUNCTION__);
- goto err;
- }
-
- gpio3 = ret;
-
-
- ret = devm_gpio_request(&pdev->dev, reset_pin, "edp_reset");
+ gpio_data->gpio_op0 = ret;
+ ret = gpio_request(gpio_data->gpio_op0, "gpio_op0");
if(ret < 0){
- printk("%s() devm_gpio_request edp_reset request ERROR\n", __FUNCTION__);
- goto err;
- }
-
-
- ret = devm_gpio_request(&pdev->dev, gpio0, "edp_gpio0");
- if(ret < 0){
- printk("%s() devm_gpio_request edp_gpio0 request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = devm_gpio_request(&pdev->dev, gpio1, "edp_gpio1");
- if(ret < 0){
- printk("%s() devm_gpio_request edp_gpio1 request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = devm_gpio_request(&pdev->dev, gpio2, "edp_gpio2");
- if(ret < 0){
- printk("%s() devm_gpio_request edp_gpio2 request ERROR\n", __FUNCTION__);
- goto err;
- }
-
- ret = devm_gpio_request(&pdev->dev, gpio3, "edp_gpio3");
- if(ret < 0){
- printk("%s() devm_gpio_request edp_gpio3 request ERROR\n", __FUNCTION__);
- goto err;
+ printk("%s() gpio_op0 request ERROR\n", __func__);
+ return -ENODEV;
}
- ret = of_property_read_u32(node, "nodka_lvds", &lvds_index);
- if (ret < 0){
- printk("%s() Can not read property nodka_lvds\n", __FUNCTION__);
- }
+ gpio_direction_output(gpio_data->gpio_op0,!gpio_flags);
+#endif
+
+ /* create node */
+ root_entry_gpio = proc_mkdir("ndj_gpio", NULL);
+
+ for_each_child_of_node(np, child_np)
+ {
+ /* parse dts */
+ gpio_data->ndj_gpio_num[gpio_cnt].gpio_num = of_get_named_gpio_flags(child_np, "gpio_num", 0, &gpio_flags);
+ if (!gpio_is_valid(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num)){
+ return -1;
+ }
+
+ gpio_data->ndj_gpio_num[gpio_cnt].gpio_name = (char*)child_np -> name;
+ gpio_data->ndj_gpio_num[gpio_cnt].action = gpio_flags;
+ gpio_data->ndj_gpio_num[gpio_cnt].gpio_ctrl = gpio_cnt;
+ of_property_read_u32(child_np, "gpio_function", &(gpio_data->ndj_gpio_num[gpio_cnt].gpio_function));
+
+// printk("ndj_gpio request %s\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_name);
+
+
+ switch(gpio_data->ndj_gpio_num[gpio_cnt].gpio_function) {
+ case GPIO_FUNCTION_INPUT : /* init input gpio */
+ ret = gpio_request(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num, gpio_data->ndj_gpio_num[gpio_cnt].gpio_name);
+ if (ret < 0)
+ {
+ printk("gpio%d request error\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+ }else{
+ // printk("success request gpio %d in\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+
+ gpio_direction_input(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+ //gpio_direction_output(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num,!gpio_data->ndj_gpio_num[gpio_cnt].action);
+ //event_flag = gpio_flags;
+ //of_property_read_u32(child_np, "send_mode", &(gpio_data->ndj_gpio_num[gpio_cnt].send_mode));
+ //of_property_read_u32(child_np, "gpio_event", &(gpio_data->ndj_gpio_num[gpio_cnt].gpio_event));
+ gpio_in_cnt++;
+ }
+ break;
+
+ case GPIO_FUNCTION_OUTPUT : /* init output gpio */
+ ret = gpio_request(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num, gpio_data->ndj_gpio_num[gpio_cnt].gpio_name);
+ if (ret < 0){
+ printk("gpio%d request error\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+ //return ret;
+ }else{
+ gpio_direction_output(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num,!gpio_data->ndj_gpio_num[gpio_cnt].action);
+ //printk("success request gpio%d out\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+ }
+ break;
+
+ case GPIO_FUNCTION_RESET :
+ ret = gpio_request(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num, gpio_data->ndj_gpio_num[gpio_cnt].gpio_name);
+ if (ret < 0){
+ printk("gpio%d request error\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+ //return ret;
+ }else{
+ gpio_direction_output(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num,gpio_data->ndj_gpio_num[gpio_cnt].action);
+ //printk("success request gpio%d reset\n",gpio_data->ndj_gpio_num[gpio_cnt].gpio_num);
+ mdelay(200);
+ gpio_direction_output(gpio_data->ndj_gpio_num[gpio_cnt].gpio_num,!gpio_data->ndj_gpio_num[gpio_cnt].action);
+
+// gpio_cnt++;
+ }
+ break;
+ }
+
+ sprintf(gpio_name_num,gpio_data->ndj_gpio_num[gpio_cnt].gpio_name,gpio_cnt);
+ proc_create(gpio_name_num, 0666 , root_entry_gpio , &gpio_ops);
+ gpio_cnt++;
+ }
+
+ platform_set_drvdata(pdev, gpio_data);
- printk("nodka_lvds_index = %d\n",lvds_index);
-
- while ( i < 4 ){
- if ( lvds_index > 0)
- lvds_gpio[i] = lvds_index%2;
- else
- lvds_gpio[i] = 0;
- printk("lvds_gpio[%d]=%d\n",i,lvds_gpio[i]);
- lvds_index = lvds_index/2;
- i++;
- }
-
- gpio_direction_output(reset_pin, 0);
- usleep_range(80000, 100000);
- gpio_direction_output(reset_pin, 1);
- usleep_range(80000, 100000);
-
- gpio_direction_output(gpio0, lvds_gpio[0]);
- gpio_direction_output(gpio1, lvds_gpio[1]);
- gpio_direction_output(gpio2, lvds_gpio[2]);
- gpio_direction_output(gpio3, lvds_gpio[3]);
-
- printk(" #######nk_io_control_probe end####### \n");
- return 0;
-
-err:
- kfree(pdata);
- return ret;
-}
-
-
-static int nk_io_control_remove(struct platform_device *pdev)
-{
- if(NKpdata_info)
- kfree(NKpdata_info);
- return 0;
+#if 0
+ ret= class_register(&ndj_io_class);
+ if(ret < 0) {
+ return -EINVAL;
+ }
+#endif
+ return 0;
}
-
-static int nk_io_control_suspend(struct platform_device *pdev, pm_message_t state)
+
+
+static int ndj_gpio_suspend(struct platform_device *pdev, pm_message_t state)
{
- int ret;
- struct nk_io_pdata *pdata;
- printk("nk_suspend !!!!\n");
-#if 0
- ret = gpio_get_value(8);
- printk("vcc12v gpio value : %d\n",ret);
- usleep_range(80000, 100000);
- gpio_set_value(8,0);
- ret = gpio_get_value(8);
- printk("vcc12v gpio value : %d\n",ret);
-#endif
-#if 0
- ret = gpio_get_value(21);
- printk("hub_host3_5v_gpio value : %d\n",ret);
- usleep_range(80000, 100000);
- gpio_set_value(21,0);
- ret = gpio_get_value(21);
- printk("hub_host3_5v_gpio value : %d\n",ret);
- //enable = 0;
- //LED_SET(0);
-#endif
- return 0;
+// int ret;
+// struct nk_io_pdata *pdata;
+ printk("nk_suspend !!!!\n");
+ return 0;
}
-
-static int nk_io_control_resume(struct platform_device *pdev)
+
+static int ndj_gpio_resume(struct platform_device *pdev)
{
- int ret,reset_pin;
- printk("nk_io resume !!!!\n");
- ret = gpio_get_value(120);
-
-#if 0
- gpio_set_value(8,1);
- ret = gpio_get_value(8);
- printk("vcc12v gpio value : %d\n",ret);
-#endif
-#if 0
- gpio_set_value(15,1);
- ret = gpio_get_value(15);
- printk("edp_en gpio value : %d\n",ret);
- gpio_set_value(21,1);
- ret = gpio_get_value(21);
- printk("hub_host3_5v_gpio value : %d\n",ret);
-#endif
-#if 0
- usleep_range(80000, 100000);
- gpio_set_value(120,0);
-// gpio_direction_output(120, 0);
- usleep_range(80000, 100000);
- ret = gpio_get_value(120);
- printk("edp_reset gpio value : %d\n",ret);
-// gpio_direction_output(120, 1);
- gpio_set_value(120,1);
- usleep_range(80000, 100000);
- ret = gpio_get_value(120);
- printk("edp_reset gpio value : %d\n",ret);
-#endif
- //enable = 1;
- //LED_SET(11);
- return 0;
+// int ret,reset_pin;
+ printk("nk_io resume !!!!\n");
+ return 0;
}
-
-static const struct of_device_id nk_io_control_of_match[] = {
- { .compatible = "nk_io_control", },
- {},
+
+
+static int ndj_gpio_remove(struct platform_device *pdev)
+{
+// class_unregister(&ndj_io_class);
+ return 0;
+}
+
+
+static const struct of_device_id ndj_gpio_of_match[] = {
+ { .compatible = "nk_io_control" },
+ { }
};
-MODULE_DEVICE_TABLE(of, nk_io_control_of_match);
-
-static struct platform_driver nk_io_control_driver = {
- .probe = nk_io_control_probe,
- .remove = nk_io_control_remove,
- .resume = nk_io_control_resume,
- .suspend = nk_io_control_suspend,
- .driver = {
- .name = "nk_io_control",
- .owner = THIS_MODULE,
- .of_match_table = of_match_ptr(nk_io_control_of_match),
- },
+
+static struct platform_driver ndj_gpio_driver = {
+ .probe = ndj_gpio_probe,
+ .remove = ndj_gpio_remove,
+ .resume = ndj_gpio_resume,
+ .suspend = ndj_gpio_suspend,
+ .driver = {
+ .name = "nk_io_control",
+ .of_match_table = of_match_ptr(ndj_gpio_of_match),
+ },
};
-
-static int __init nk_io_control_init(void)
-{
- platform_driver_register(&nk_io_control_driver);
- return 0;
-}
-
-static void __exit nk_io_control_exit(void)
-{
- platform_driver_unregister(&nk_io_control_driver);
-}
-
-subsys_initcall(nk_io_control_init);
-
-//late_initcall(nk_io_control_init);
-MODULE_DESCRIPTION("nk io Core Driver");
+
+module_platform_driver(ndj_gpio_driver);
+MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");
--
Gitblit v1.6.2