Explorar o código

firmware: memconsole: Probe via coreboot bus

Remove the ad-hoc coreboot table search. Now the driver will only be
probed when the necessary coreboot table entry has already been found.

Signed-off-by: Samuel Holland <samuel@sholland.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Samuel Holland %!s(int64=7) %!d(string=hai) anos
pai
achega
294b2a9087
Modificáronse 1 ficheiros con 17 adicións e 32 borrados
  1. 17 32
      drivers/firmware/google/memconsole-coreboot.c

+ 17 - 32
drivers/firmware/google/memconsole-coreboot.c

@@ -15,9 +15,9 @@
  * GNU General Public License for more details.
  * GNU General Public License for more details.
  */
  */
 
 
+#include <linux/device.h>
 #include <linux/kernel.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/module.h>
-#include <linux/platform_device.h>
 
 
 #include "memconsole.h"
 #include "memconsole.h"
 #include "coreboot_table.h"
 #include "coreboot_table.h"
@@ -73,18 +73,19 @@ static ssize_t memconsole_coreboot_read(char *buf, loff_t pos, size_t count)
 	return done;
 	return done;
 }
 }
 
 
-static int memconsole_coreboot_init(phys_addr_t physaddr)
+static int memconsole_probe(struct coreboot_device *dev)
 {
 {
 	struct cbmem_cons __iomem *tmp_cbmc;
 	struct cbmem_cons __iomem *tmp_cbmc;
 
 
-	tmp_cbmc = memremap(physaddr, sizeof(*tmp_cbmc), MEMREMAP_WB);
+	tmp_cbmc = memremap(dev->cbmem_ref.cbmem_addr,
+			    sizeof(*tmp_cbmc), MEMREMAP_WB);
 
 
 	if (!tmp_cbmc)
 	if (!tmp_cbmc)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	/* Read size only once to prevent overrun attack through /dev/mem. */
 	/* Read size only once to prevent overrun attack through /dev/mem. */
 	cbmem_console_size = tmp_cbmc->size_dont_access_after_boot;
 	cbmem_console_size = tmp_cbmc->size_dont_access_after_boot;
-	cbmem_console = memremap(physaddr,
+	cbmem_console = memremap(dev->cbmem_ref.cbmem_addr,
 				 cbmem_console_size + sizeof(*cbmem_console),
 				 cbmem_console_size + sizeof(*cbmem_console),
 				 MEMREMAP_WB);
 				 MEMREMAP_WB);
 	memunmap(tmp_cbmc);
 	memunmap(tmp_cbmc);
@@ -93,26 +94,11 @@ static int memconsole_coreboot_init(phys_addr_t physaddr)
 		return -ENOMEM;
 		return -ENOMEM;
 
 
 	memconsole_setup(memconsole_coreboot_read);
 	memconsole_setup(memconsole_coreboot_read);
-	return 0;
-}
-
-static int memconsole_probe(struct platform_device *pdev)
-{
-	int ret;
-	struct lb_cbmem_ref entry;
-
-	ret = coreboot_table_find(CB_TAG_CBMEM_CONSOLE, &entry, sizeof(entry));
-	if (ret)
-		return ret;
-
-	ret = memconsole_coreboot_init(entry.cbmem_addr);
-	if (ret)
-		return ret;
 
 
 	return memconsole_sysfs_init();
 	return memconsole_sysfs_init();
 }
 }
 
 
-static int memconsole_remove(struct platform_device *pdev)
+static int memconsole_remove(struct coreboot_device *dev)
 {
 {
 	memconsole_exit();
 	memconsole_exit();
 
 
@@ -122,28 +108,27 @@ static int memconsole_remove(struct platform_device *pdev)
 	return 0;
 	return 0;
 }
 }
 
 
-static struct platform_driver memconsole_driver = {
+static struct coreboot_driver memconsole_driver = {
 	.probe = memconsole_probe,
 	.probe = memconsole_probe,
 	.remove = memconsole_remove,
 	.remove = memconsole_remove,
-	.driver = {
+	.drv = {
 		.name = "memconsole",
 		.name = "memconsole",
 	},
 	},
+	.tag = CB_TAG_CBMEM_CONSOLE,
 };
 };
 
 
-static int __init platform_memconsole_init(void)
+static void coreboot_memconsole_exit(void)
 {
 {
-	struct platform_device *pdev;
-
-	pdev = platform_device_register_simple("memconsole", -1, NULL, 0);
-	if (IS_ERR(pdev))
-		return PTR_ERR(pdev);
-
-	platform_driver_register(&memconsole_driver);
+	coreboot_driver_unregister(&memconsole_driver);
+}
 
 
-	return 0;
+static int __init coreboot_memconsole_init(void)
+{
+	return coreboot_driver_register(&memconsole_driver);
 }
 }
 
 
-module_init(platform_memconsole_init);
+module_exit(coreboot_memconsole_exit);
+module_init(coreboot_memconsole_init);
 
 
 MODULE_AUTHOR("Google, Inc.");
 MODULE_AUTHOR("Google, Inc.");
 MODULE_LICENSE("GPL");
 MODULE_LICENSE("GPL");