From da2399e065e6d019bc56751a51a84894fc5f5b63 Mon Sep 17 00:00:00 2001 From: "Justin.Guo" Date: Thu, 26 Jun 2025 13:19:14 +0800 Subject: [PATCH] WIFI-14697 add cig poe judgment pkg Support reading WAN PoE type from /proc/poe_info for WF189/WF189W/WF189H/WF672A Signed-off-by: Justin.Guo --- .../cig-poe-judgment/Makefile | 25 ++ .../cig-poe-judgment/src/Makefile | 1 + .../cig-poe-judgment/src/cig_poe_judgment.c | 252 ++++++++++++++++++ .../cig-wifi-mode-sw/Makefile | 0 .../cig-wifi-mode-sw/files/cig_wifi_mode_sw | 0 .../cig-wifi-mode-sw/src/Makefile | 0 .../cig-wifi-mode-sw/src/cig_rf_switch.c | 0 .../ipq53xx/dts/ipq5332-cig-wf189.dts | 9 + .../ipq53xx/dts/ipq5332-cig-wf189h.dts | 7 + .../ipq53xx/dts/ipq5332-cig-wf189w.dts | 7 + .../ipq53xx/dts/ipq5332-cig-wf672.dts | 10 +- profiles/cig_wf189.yml | 1 + profiles/cig_wf189h.yml | 1 + profiles/cig_wf189w.yml | 1 + profiles/cig_wf672.yml | 1 + 15 files changed, 314 insertions(+), 1 deletion(-) create mode 100644 feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile create mode 100644 feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/Makefile create mode 100644 feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/cig_poe_judgment.c rename feeds/qca-wifi-7/{ => cig-platform-pkg}/cig-wifi-mode-sw/Makefile (100%) rename feeds/qca-wifi-7/{ => cig-platform-pkg}/cig-wifi-mode-sw/files/cig_wifi_mode_sw (100%) rename feeds/qca-wifi-7/{ => cig-platform-pkg}/cig-wifi-mode-sw/src/Makefile (100%) rename feeds/qca-wifi-7/{ => cig-platform-pkg}/cig-wifi-mode-sw/src/cig_rf_switch.c (100%) diff --git a/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile b/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile new file mode 100644 index 000000000..b9ce046bb --- /dev/null +++ b/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/Makefile @@ -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)) diff --git a/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/Makefile b/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/Makefile new file mode 100644 index 000000000..e28c921f4 --- /dev/null +++ b/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/Makefile @@ -0,0 +1 @@ +obj-m += cig_poe_judgment.o diff --git a/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/cig_poe_judgment.c b/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/cig_poe_judgment.c new file mode 100644 index 000000000..8eb0f025f --- /dev/null +++ b/feeds/qca-wifi-7/cig-platform-pkg/cig-poe-judgment/src/cig_poe_judgment.c @@ -0,0 +1,252 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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"); diff --git a/feeds/qca-wifi-7/cig-wifi-mode-sw/Makefile b/feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/Makefile similarity index 100% rename from feeds/qca-wifi-7/cig-wifi-mode-sw/Makefile rename to feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/Makefile diff --git a/feeds/qca-wifi-7/cig-wifi-mode-sw/files/cig_wifi_mode_sw b/feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/files/cig_wifi_mode_sw similarity index 100% rename from feeds/qca-wifi-7/cig-wifi-mode-sw/files/cig_wifi_mode_sw rename to feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/files/cig_wifi_mode_sw diff --git a/feeds/qca-wifi-7/cig-wifi-mode-sw/src/Makefile b/feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/src/Makefile similarity index 100% rename from feeds/qca-wifi-7/cig-wifi-mode-sw/src/Makefile rename to feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/src/Makefile diff --git a/feeds/qca-wifi-7/cig-wifi-mode-sw/src/cig_rf_switch.c b/feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/src/cig_rf_switch.c similarity index 100% rename from feeds/qca-wifi-7/cig-wifi-mode-sw/src/cig_rf_switch.c rename to feeds/qca-wifi-7/cig-platform-pkg/cig-wifi-mode-sw/src/cig_rf_switch.c diff --git a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189.dts b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189.dts index 872a599b4..82b30172a 100644 --- a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189.dts +++ b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189.dts @@ -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>; diff --git a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189h.dts b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189h.dts index ce673d787..fce302f0a 100644 --- a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189h.dts +++ b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189h.dts @@ -298,6 +298,13 @@ }; }; + poe { + compatible = "poe-judge"; + detect-mode = <0x11>; + detect_gpio = <&tlmm 0x17 0>; + status = "ok"; + }; + ess-instance { num_devices = <0x2>; diff --git a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189w.dts b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189w.dts index f49528a1b..5f3c853a9 100644 --- a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189w.dts +++ b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf189w.dts @@ -298,6 +298,13 @@ }; }; + poe { + compatible = "poe-judge"; + detect-mode = <0x11>; + detect_gpio = <&tlmm 0x17 0>; + status = "ok"; + }; + ess-instance { num_devices = <0x2>; diff --git a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf672.dts b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf672.dts index 7756e42ce..98c777e0e 100644 --- a/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf672.dts +++ b/feeds/qca-wifi-7/ipq53xx/dts/ipq5332-cig-wf672.dts @@ -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"; }; diff --git a/profiles/cig_wf189.yml b/profiles/cig_wf189.yml index 4418ce151..6a74638ee 100644 --- a/profiles/cig_wf189.yml +++ b/profiles/cig_wf189.yml @@ -13,3 +13,4 @@ packages: - ipq53xx - ftm - qca-ssdk-shell + - kmod-cig-poe-judgment diff --git a/profiles/cig_wf189h.yml b/profiles/cig_wf189h.yml index 61d9eaa36..9c3ae8427 100644 --- a/profiles/cig_wf189h.yml +++ b/profiles/cig_wf189h.yml @@ -12,3 +12,4 @@ include: packages: - ipq53xx - qca-ssdk-shell + - kmod-cig-poe-judgment diff --git a/profiles/cig_wf189w.yml b/profiles/cig_wf189w.yml index 4c7f9f463..5126af012 100644 --- a/profiles/cig_wf189w.yml +++ b/profiles/cig_wf189w.yml @@ -12,3 +12,4 @@ include: packages: - ipq53xx - qca-ssdk-shell + - kmod-cig-poe-judgment diff --git a/profiles/cig_wf672.yml b/profiles/cig_wf672.yml index d34183c06..1ceb548cc 100644 --- a/profiles/cig_wf672.yml +++ b/profiles/cig_wf672.yml @@ -21,3 +21,4 @@ packages: - kmod-gpio-pca953x - kmod-hwmon-tmp103 - kmod-iio-ilps22qs + - kmod-cig-poe-judgment