mirror of
				https://github.com/Telecominfraproject/wlan-ap.git
				synced 2025-10-31 02:17:58 +00:00 
			
		
		
		
	Compare commits
	
		
			1 Commits
		
	
	
		
			v4.1.1
			...
			wifi-14697
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | da2399e065 | 
							
								
								
									
										25
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| include $(TOPDIR)/rules.mk | ||||
| include $(INCLUDE_DIR)/kernel.mk | ||||
|  | ||||
| PKG_NAME:=cig-poe-judgment | ||||
| PKG_RELEASE:=1 | ||||
| PKG_LICENSE:=GPL-2.0 | ||||
|  | ||||
| include $(INCLUDE_DIR)/package.mk | ||||
|  | ||||
| define KernelPackage/cig-poe-judgment | ||||
|   SUBMENU:=Other modules | ||||
|   TITLE:=CIG POE judgment | ||||
|   FILES:=$(PKG_BUILD_DIR)/cig_poe_judgment.ko | ||||
|   AUTOLOAD:=$(call AutoLoad,99,cig_poe_judgment) | ||||
| endef | ||||
|  | ||||
| define KernelPackage/cig-poe-judgment/description | ||||
|   Find POE type | ||||
| endef | ||||
|  | ||||
| define Build/Compile | ||||
| 	$(KERNEL_MAKE) M="$(PKG_BUILD_DIR)" modules | ||||
| endef | ||||
|  | ||||
| $(eval $(call KernelPackage,cig-poe-judgment)) | ||||
| @@ -0,0 +1 @@ | ||||
| obj-m += cig_poe_judgment.o | ||||
| @@ -0,0 +1,252 @@ | ||||
| #include <linux/module.h> | ||||
| #include <linux/device.h> | ||||
| #include <linux/proc_fs.h> | ||||
| #include <linux/kthread.h> | ||||
| #include <linux/of.h> | ||||
| #include <linux/of_address.h> | ||||
| #include <linux/irqreturn.h> | ||||
| #include <linux/of_gpio.h> | ||||
| #include <linux/err.h> | ||||
| #include <linux/types.h> | ||||
| #include <linux/interrupt.h> | ||||
| #include <linux/of_irq.h> | ||||
| #include <linux/of_platform.h> | ||||
| #include <asm/uaccess.h> | ||||
|  | ||||
| #define GPIO_MAX 		8  | ||||
| #define INT_MODE_MASK 		0xf0 | ||||
| #define DETECT_MODE1	 	0x3 | ||||
| #define DETECT_MODE2	 	0x4 | ||||
|  | ||||
| enum POE_TYPE { | ||||
| 	POE_TYPE_AT = 1, | ||||
| 	POE_TYPE_AF, | ||||
| 	POE_TYPE_BT, | ||||
| 	POE_TYPE_DC, | ||||
| 	POE_TYPE_MAX | ||||
| }; | ||||
|  | ||||
| struct poe_irq_data | ||||
| { | ||||
| 	struct device *dev; | ||||
| 	int irq; | ||||
| 	struct tasklet_struct tasklet; | ||||
| 	int poe_type; | ||||
| }; | ||||
|  | ||||
| static void  *poe_gpio_base; | ||||
| static void  *pse_gpio_base; | ||||
| struct poe_irq_data *data = NULL; | ||||
| u32 mode; | ||||
|  | ||||
| static const struct of_device_id my_of_ids[] = { | ||||
| 	{.compatible = "poe-judge"}, | ||||
| 	{}, | ||||
| }; | ||||
|  | ||||
| MODULE_DEVICE_TABLE(of,my_of_ids); | ||||
|  | ||||
| static int poe_info_proc_show(struct seq_file *m, void *v) | ||||
| { | ||||
| 	const char *type_str = "invalid"; | ||||
|  | ||||
| 	switch (data->poe_type) { | ||||
| 		case POE_TYPE_AT:  | ||||
| 			type_str = "AT";  | ||||
| 			break; | ||||
| 		case POE_TYPE_AF:  | ||||
| 			type_str = "AF";  | ||||
| 			break; | ||||
| 		case POE_TYPE_BT:  | ||||
| 			type_str = "BT";  | ||||
| 			break; | ||||
| 		case POE_TYPE_DC:  | ||||
| 			type_str = "DC";  | ||||
| 			break; | ||||
| 	} | ||||
|  | ||||
| 	seq_printf(m, "%s\n", type_str); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static void poe_tasklet_func(unsigned long data) | ||||
| { | ||||
| 	struct poe_irq_data *irq_data = (struct poe_irq_data *)data; | ||||
|  | ||||
| 	writel(0x3, pse_gpio_base+4); | ||||
| 	irq_data->poe_type = POE_TYPE_BT; | ||||
|  | ||||
| 	return; | ||||
| } | ||||
|  | ||||
| static irqreturn_t gpio_key1_irq_handler(int irq, void *dev_id) | ||||
| { | ||||
| 	struct poe_irq_data *data = (struct poe_irq_data *)dev_id; | ||||
|  | ||||
| 	disable_irq_nosync(data->irq); | ||||
| 	tasklet_schedule(&data->tasklet); | ||||
|  | ||||
| 	return IRQ_HANDLED; | ||||
| } | ||||
|  | ||||
| static int poe_info_proc_open(struct inode *inode, struct file *file) | ||||
| { | ||||
| 	return single_open(file, poe_info_proc_show, NULL); | ||||
| } | ||||
|  | ||||
| static const struct proc_ops poe_info_proc_fops = { | ||||
| 	.proc_open = poe_info_proc_open, | ||||
| 	.proc_read = seq_read, | ||||
| 	.proc_lseek = seq_lseek, | ||||
| 	.proc_release = single_release, | ||||
| }; | ||||
|  | ||||
| static int gpio_key_probe(struct platform_device *dev) | ||||
| { | ||||
| 	int ret = 0; | ||||
| 	int irq = (-1); | ||||
| 	int val = 0; | ||||
| 	int gpio_id = 0; | ||||
| 	int gpio[GPIO_MAX] = {0}, gpio_val[GPIO_MAX] = {0}; | ||||
| 	int num; | ||||
| 	char name[16]; | ||||
| 	struct device_node *np = dev->dev.of_node; | ||||
|  | ||||
| 	if (of_property_read_u32(np, "detect-mode", &mode)) { | ||||
| 		pr_err("Failed to read detect mode\n"); | ||||
| 		return -EINVAL; | ||||
| 	} | ||||
|  | ||||
| 	data = devm_kzalloc(&dev->dev, sizeof(struct poe_irq_data), GFP_KERNEL); | ||||
| 	if (!data) | ||||
| 	{ | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	if (mode & INT_MODE_MASK) { | ||||
| 		poe_gpio_base = ioremap(0x1017004, 8); | ||||
| 		pse_gpio_base = ioremap(0x1026000, 8); | ||||
|  | ||||
| 		writel(0x2c1, pse_gpio_base); | ||||
| 		writel(0x0, pse_gpio_base+4); | ||||
|  | ||||
|  | ||||
| 		data->dev = &dev->dev; | ||||
| 		dev_set_drvdata(&dev->dev, data); | ||||
|  | ||||
| 		gpio_id = of_get_named_gpio(dev->dev.of_node, "detect_gpio", 0); | ||||
| 		if (gpio_id < 0) | ||||
| 		{ | ||||
| 			return -EINVAL; | ||||
| 		} | ||||
|  | ||||
| 		tasklet_init(&data->tasklet, poe_tasklet_func, (unsigned long)data); | ||||
|  | ||||
| 		ret = devm_gpio_request_one(&dev->dev, gpio_id, GPIOF_IN, "poe_judge"); | ||||
| 		if(ret) | ||||
| 		{ | ||||
| 			pr_err("GPIO23 request failed, ret:%d\n", ret); | ||||
| 			return ret; | ||||
| 		} | ||||
|  | ||||
| 		val = readl(poe_gpio_base); | ||||
| 		if(val == 1) | ||||
| 		{ | ||||
| 			pr_info("poe type is af or bt,close pse first\n"); | ||||
| 			data->poe_type = POE_TYPE_AF; | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			data->poe_type = POE_TYPE_AT; | ||||
| 		} | ||||
|  | ||||
| 		irq = gpio_to_irq(gpio_id); | ||||
| 		data->irq = irq; | ||||
|  | ||||
| 		ret = devm_request_any_context_irq(&dev->dev, data->irq,  | ||||
| 				gpio_key1_irq_handler,  | ||||
| 				IRQF_TRIGGER_FALLING,  | ||||
| 				"poe_judge", data); | ||||
| 		if (ret) | ||||
| 		{ | ||||
| 			pr_err("Request irq fail %d\n", ret); | ||||
| 			return ret; | ||||
| 		} | ||||
| 	} else { | ||||
| 		if (mode == DETECT_MODE1 || mode == DETECT_MODE2) { | ||||
| 			num = 3; | ||||
| 		} else { | ||||
| 			pr_err("Wrong poe detect mode\n"); | ||||
| 			return -ENOMEM; | ||||
| 		} | ||||
|  | ||||
| 		for (int i = 0; i < num; i++) { | ||||
| 			sprintf(name, "detect-gpio%d", i+1); | ||||
| 			gpio[i] = of_get_named_gpio(np, name, 0); 	 | ||||
| 			ret = gpio_request(gpio[i], name); | ||||
| 			if (ret) { | ||||
| 				pr_err("Can not request gpio %d\n", i+1); | ||||
| 				return ret; | ||||
| 			} | ||||
| 			gpio_direction_input(gpio[i]); | ||||
| 			gpio_val[i] = gpio_get_value_cansleep(gpio[i]); | ||||
| 		} | ||||
| 		 | ||||
| 		if (mode == DETECT_MODE1){ | ||||
| 			if (gpio_val[0] > 0) { | ||||
| 				data->poe_type = POE_TYPE_DC; | ||||
| 			} else if (gpio_val[1] > 0){ | ||||
| 				if (gpio_val[2] == 0) { | ||||
| 					data->poe_type = POE_TYPE_AT; | ||||
| 				} else { | ||||
| 					data->poe_type = POE_TYPE_AF; | ||||
| 				} | ||||
| 			} | ||||
| 		}else if (mode == DETECT_MODE2){ | ||||
| 			switch (gpio_val[0] | (gpio_val[1] << 1) | (gpio_val[2] << 2)) { | ||||
| 				case 3: | ||||
| 					data->poe_type = POE_TYPE_AT; | ||||
| 					break; | ||||
| 				case 4: | ||||
| 					data->poe_type = POE_TYPE_BT; | ||||
| 					break; | ||||
| 				case 7: | ||||
| 					data->poe_type = POE_TYPE_AF; | ||||
| 					break; | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 	} | ||||
|  | ||||
| 	if (!proc_create("poe_info", 0444, NULL, &poe_info_proc_fops)) { | ||||
| 		pr_err("Failed to create proc entry for poe_info\n"); | ||||
| 		return -ENOMEM; | ||||
| 	} | ||||
|  | ||||
| 	return ret; | ||||
| } | ||||
|  | ||||
| static int gpio_key_remove(struct platform_device *dev) | ||||
| { | ||||
| 	remove_proc_entry("poe_info", NULL); | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| static struct platform_driver poe_judge_driver = | ||||
| { | ||||
| 	.driver = { | ||||
| 		.name = "poe_judge", | ||||
| 		.of_match_table = my_of_ids, | ||||
| 		.owner = THIS_MODULE, | ||||
| 	}, | ||||
| 	.probe = gpio_key_probe, | ||||
| 	.remove = gpio_key_remove, | ||||
| }; | ||||
|  | ||||
| module_platform_driver(poe_judge_driver); | ||||
|  | ||||
| MODULE_LICENSE("GPL"); | ||||
| MODULE_DESCRIPTION("Poe type judgment driver"); | ||||
| MODULE_AUTHOR("huangyunxiang<huangyunxiang@cigtech.com>"); | ||||
| @@ -236,6 +236,15 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
| 			compatible = "poe-judge"; | ||||
| 			detect-mode = <0x3>; | ||||
| 			detect-gpio1 = <&tlmm 25 GPIO_ACTIVE_HIGH>; | ||||
| 			detect-gpio2 = <&tlmm 43 GPIO_ACTIVE_HIGH>; | ||||
| 			detect-gpio3 = <&tlmm 29 GPIO_ACTIVE_HIGH>; | ||||
| 			status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		wsi: wsi { | ||||
| 			id = <0>; | ||||
| 			num_chip = <2>; | ||||
|   | ||||
| @@ -298,6 +298,13 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
|                         compatible = "poe-judge"; | ||||
| 			detect-mode = <0x11>; | ||||
|                         detect_gpio = <&tlmm 0x17 0>; | ||||
|                         status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		ess-instance { | ||||
| 			num_devices = <0x2>; | ||||
|  | ||||
|   | ||||
| @@ -298,6 +298,13 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
|                         compatible = "poe-judge"; | ||||
| 			detect-mode = <0x11>; | ||||
|                         detect_gpio = <&tlmm 0x17 0>; | ||||
|                         status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		ess-instance { | ||||
| 			num_devices = <0x2>; | ||||
|  | ||||
|   | ||||
| @@ -234,6 +234,15 @@ | ||||
| 			}; | ||||
| 		}; | ||||
|  | ||||
| 		poe { | ||||
| 			compatible = "poe-judge"; | ||||
| 			detect-mode = <0x4>; | ||||
| 			detect-gpio1 = <&extgpio 0 0>; | ||||
| 			detect-gpio2 = <&extgpio 1 0>; | ||||
| 			detect-gpio3 = <&extgpio 2 0>; | ||||
| 			status = "ok"; | ||||
|                 }; | ||||
|  | ||||
| 		wsi: wsi { | ||||
| 			id = <0>; | ||||
| 			num_chip = <2>; | ||||
| @@ -538,7 +547,6 @@ | ||||
| 	pinctrl-0 = <&pwm_pins>; | ||||
| 	pinctrl-names = "default"; | ||||
| 	dft-pwm-status = <0>, <0>, <1>, <0>; | ||||
|         poe_type_pin = <&extgpio 0 0 &extgpio 1 0 &extgpio 2 0>; | ||||
| 	status = "okay"; | ||||
| }; | ||||
|  | ||||
|   | ||||
| @@ -13,3 +13,4 @@ packages: | ||||
|   - ipq53xx | ||||
|   - ftm | ||||
|   - qca-ssdk-shell | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
| @@ -12,3 +12,4 @@ include: | ||||
| packages: | ||||
|   - ipq53xx | ||||
|   - qca-ssdk-shell | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
| @@ -12,3 +12,4 @@ include: | ||||
| packages: | ||||
|   - ipq53xx | ||||
|   - qca-ssdk-shell | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
| @@ -21,3 +21,4 @@ packages: | ||||
|   - kmod-gpio-pca953x | ||||
|   - kmod-hwmon-tmp103 | ||||
|   - kmod-iio-ilps22qs | ||||
|   - kmod-cig-poe-judgment  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user