drivers/wifi: Adapt generic wifi driver into a chip driver

Re-organize the existing generic wifi driver into a generic wifi chip
driver. This allows generic wifi chip information to be added to the
devicetree.

BUG=None
TEST=./util/abuild/abuild

Change-Id: I63f957a008ecf4a6a810c2a135ed62ea81a79fe0
Signed-off-by: Karthikeyan Ramasubramanian <kramasub@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/43768
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
diff --git a/src/drivers/intel/wifi/Kconfig b/src/drivers/intel/wifi/Kconfig
index fb60c6f..83df822 100644
--- a/src/drivers/intel/wifi/Kconfig
+++ b/src/drivers/intel/wifi/Kconfig
@@ -2,7 +2,7 @@
 	bool "Support Intel PCI-e WiFi adapters"
 	depends on PCI
 	default y if PCIEXP_PLUGIN_SUPPORT
-	select DRIVERS_GENERIC_WIFI if HAVE_ACPI_TABLES
+	select DRIVERS_WIFI_GENERIC if HAVE_ACPI_TABLES
 	help
 	   When enabled, add identifiers in ACPI and SMBIOS tables to
 	   make OS drivers work with certain Intel PCI-e WiFi chipsets.
diff --git a/src/drivers/intel/wifi/wifi.c b/src/drivers/intel/wifi/wifi.c
index 9fcd7ba..0ad0e1c 100644
--- a/src/drivers/intel/wifi/wifi.c
+++ b/src/drivers/intel/wifi/wifi.c
@@ -8,7 +8,7 @@
 #include <smbios.h>
 #include <string.h>
 #include "chip.h"
-#include "drivers/wifi/generic_wifi.h"
+#include "drivers/wifi/generic/chip.h"
 
 #define PMCS_DR 0xcc
 #define PME_STS (1 << 15)
@@ -50,14 +50,14 @@
 static void intel_wifi_fill_ssdt(const struct device *dev)
 {
 	struct drivers_intel_wifi_config *config = dev->chip_info;
-	struct generic_wifi_config generic_config;
+	struct drivers_wifi_generic_config generic_config;
 
 	if (config) {
 		generic_config.wake = config->wake;
 		/* By default, all intel wifi chips wake from S3 */
 		generic_config.maxsleep = 3;
 	}
-	generic_wifi_fill_ssdt(dev, config ? &generic_config : NULL);
+	wifi_generic_fill_ssdt(dev, config ? &generic_config : NULL);
 }
 #endif
 
@@ -83,7 +83,7 @@
 #endif
 	.ops_pci          = &pci_dev_ops_pci,
 #if CONFIG(HAVE_ACPI_TABLES)
-	.acpi_name        = generic_wifi_acpi_name,
+	.acpi_name        = wifi_generic_acpi_name,
 	.acpi_fill_ssdt   = intel_wifi_fill_ssdt,
 #endif
 };
diff --git a/src/drivers/wifi/Makefile.inc b/src/drivers/wifi/Makefile.inc
deleted file mode 100644
index d37015c..0000000
--- a/src/drivers/wifi/Makefile.inc
+++ /dev/null
@@ -1 +0,0 @@
-ramstage-$(CONFIG_DRIVERS_GENERIC_WIFI) += generic.c
diff --git a/src/drivers/wifi/Kconfig b/src/drivers/wifi/generic/Kconfig
similarity index 93%
rename from src/drivers/wifi/Kconfig
rename to src/drivers/wifi/generic/Kconfig
index 11ac7c1..049a952 100644
--- a/src/drivers/wifi/Kconfig
+++ b/src/drivers/wifi/generic/Kconfig
@@ -1,4 +1,4 @@
-config DRIVERS_GENERIC_WIFI
+config DRIVERS_WIFI_GENERIC
 	bool
 	default n
 	depends on HAVE_ACPI_TABLES
@@ -6,7 +6,7 @@
 	  When enabled, add identifiers in ACPI tables that are common
 	  to WiFi chipsets from multiple vendors.
 
-if DRIVERS_GENERIC_WIFI
+if DRIVERS_WIFI_GENERIC
 
 config USE_SAR
 	bool
@@ -54,4 +54,4 @@
 	help
 	  There can be up to 3 optional SAR table sets.
 
-endif # DRIVERS_GENERIC_WIFI
+endif # DRIVERS_WIFI_GENERIC
diff --git a/src/drivers/wifi/generic/Makefile.inc b/src/drivers/wifi/generic/Makefile.inc
new file mode 100644
index 0000000..6240c71
--- /dev/null
+++ b/src/drivers/wifi/generic/Makefile.inc
@@ -0,0 +1 @@
+ramstage-$(CONFIG_DRIVERS_WIFI_GENERIC) += generic.c
diff --git a/src/drivers/wifi/generic/chip.h b/src/drivers/wifi/generic/chip.h
new file mode 100644
index 0000000..fe3a1d1
--- /dev/null
+++ b/src/drivers/wifi/generic/chip.h
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+
+#ifndef _WIFI_GENERIC_H_
+#define _WIFI_GENERIC_H_
+
+/**
+ * struct drivers_wifi_generic_config - Data structure to contain generic wifi config
+ * @wake: Wake pin for ACPI _PRW
+ * @maxsleep: Maximum sleep state to wake from
+ */
+struct drivers_wifi_generic_config {
+	unsigned int wake;
+	unsigned int maxsleep;
+};
+
+/**
+ * wifi_generic_fill_ssdt() - Fill ACPI SSDT table for WiFi controller
+ * @dev: Device structure corresponding to WiFi controller.
+ * @config: Generic wifi config required to fill ACPI SSDT table.
+ *
+ * This function implements common device operation to help fill ACPI SSDT
+ * table for WiFi controller.
+ */
+void wifi_generic_fill_ssdt(const struct device *dev,
+			    const struct drivers_wifi_generic_config *config);
+
+/**
+ * wifi_generic_acpi_name() - Get ACPI name for WiFi controller
+ * @dev: Device structure corresponding to WiFi controller.
+ *
+ * This function implements common device operation to get the ACPI name for
+ * WiFi controller.
+ *
+ * Return: string representing the ACPI name for WiFi controller.
+ */
+const char *wifi_generic_acpi_name(const struct device *dev);
+
+#endif /* _GENERIC_WIFI_H_ */
diff --git a/src/drivers/wifi/generic.c b/src/drivers/wifi/generic/generic.c
similarity index 88%
rename from src/drivers/wifi/generic.c
rename to src/drivers/wifi/generic/generic.c
index 8858fab..00a2f58 100644
--- a/src/drivers/wifi/generic.c
+++ b/src/drivers/wifi/generic/generic.c
@@ -8,7 +8,7 @@
 #include <sar.h>
 #include <string.h>
 #include <wrdd.h>
-#include "generic_wifi.h"
+#include "chip.h"
 
 /* WRDS Spec Revision */
 #define WRDS_REVISION 0x0
@@ -159,8 +159,8 @@
 	acpigen_pop_len();
 }
 
-void generic_wifi_fill_ssdt(const struct device *dev,
-			    const struct generic_wifi_config *config)
+void wifi_generic_fill_ssdt(const struct device *dev,
+			    const struct drivers_wifi_generic_config *config)
 {
 	const char *path;
 	u32 address;
@@ -222,7 +222,7 @@
 	       dev->chip_ops ? dev->chip_ops->name : "", dev_path(dev));
 }
 
-const char *generic_wifi_acpi_name(const struct device *dev)
+const char *wifi_generic_acpi_name(const struct device *dev)
 {
 	static char wifi_acpi_name[WIFI_ACPI_NAME_MAX_LEN];
 
@@ -231,3 +231,30 @@
 		 (dev_path_encode(dev) & 0xff));
 	return wifi_acpi_name;
 }
+
+static void wifi_generic_fill_ssdt_generator(const struct device *dev)
+{
+	wifi_generic_fill_ssdt(dev, dev->chip_info);
+}
+
+static struct device_operations wifi_generic_ops = {
+	.read_resources		= noop_read_resources,
+	.set_resources		= noop_set_resources,
+	.acpi_name		= wifi_generic_acpi_name,
+	.acpi_fill_ssdt		= wifi_generic_fill_ssdt_generator,
+};
+
+static void wifi_generic_enable(struct device *dev)
+{
+	struct drivers_wifi_generic_config *config = dev ? dev->chip_info : NULL;
+
+	if (!config)
+		return;
+
+	dev->ops = &wifi_generic_ops;
+}
+
+struct chip_operations drivers_wifi_generic_ops = {
+	CHIP_NAME("WIFI Device")
+	.enable_dev = wifi_generic_enable
+};
diff --git a/src/drivers/wifi/generic_wifi.h b/src/drivers/wifi/generic_wifi.h
deleted file mode 100644
index 57209e9..0000000
--- a/src/drivers/wifi/generic_wifi.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-
-#ifndef _GENERIC_WIFI_H_
-#define _GENERIC_WIFI_H_
-
-/**
- * struct generic_wifi_config - Data structure to contain common wifi config
- * @wake: Wake pin for ACPI _PRW
- * @maxsleep: Maximum sleep state to wake from
- */
-struct generic_wifi_config {
-	unsigned int wake;
-	unsigned int maxsleep;
-};
-
-/**
- * wifi_fill_ssdt() - Fill ACPI SSDT table for WiFi controller
- * @dev: Device structure corresponding to WiFi controller.
- * @config: Common wifi config required to fill ACPI SSDT table.
- *
- * This function implements common device operation to help fill ACPI SSDT
- * table for WiFi controller.
- */
-void generic_wifi_fill_ssdt(const struct device *dev,
-			    const struct generic_wifi_config *config);
-
-/**
- * wifi_acpi_name() - Get ACPI name for WiFi controller
- * @dev: Device structure corresponding to WiFi controller.
- *
- * This function implements common device operation to get the ACPI name for
- * WiFi controller.
- *
- * Return: string representing the ACPI name for WiFi controller.
- */
-const char *generic_wifi_acpi_name(const struct device *dev);
-
-#endif /* _GENERIC_WIFI_H_ */