| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Vinod Koul <vkoul@kernel.org> |
| Date: Mon, 13 Jan 2020 14:10:05 +0530 |
| Subject: FROMLIST: usb: xhci: provide a debugfs hook for erasing rom |
| |
| run "echo 1 > /sys/kernel/debug/renesas-usb/rom_erase" to erase firmware |
| when driver is loaded. |
| |
| Subsequent init of driver shall reload the firmware |
| |
| Signed-off-by: Vinod Koul <vkoul@kernel.org> |
| Signed-off-by: John Stultz <john.stultz@linaro.org> |
| Bug: 146449535 |
| Change-Id: Id00beb2430efb8e735b6b98e5055cd2574f579b3 |
| Link: https://lore.kernel.org/linux-arm-msm/20200113084005.849071-6-vkoul@kernel.org/ |
| --- |
| drivers/usb/host/xhci-pci-renesas.c | 35 +++++++++++++++++++++++++++++ |
| 1 file changed, 35 insertions(+) |
| |
| diff --git a/drivers/usb/host/xhci-pci-renesas.c b/drivers/usb/host/xhci-pci-renesas.c |
| index fe95487ca888..be2e7eff492f 100644 |
| --- a/drivers/usb/host/xhci-pci-renesas.c |
| +++ b/drivers/usb/host/xhci-pci-renesas.c |
| @@ -2,6 +2,7 @@ |
| /* Copyright (C) 2019-2020 Linaro Limited */ |
| |
| #include <linux/acpi.h> |
| +#include <linux/debugfs.h> |
| #include <linux/firmware.h> |
| #include <linux/module.h> |
| #include <linux/pci.h> |
| @@ -229,6 +230,9 @@ static int renesas_fw_verify(struct pci_dev *dev, |
| |
| return 0; |
| } |
| + |
| +static void debugfs_init(struct pci_dev *pdev); |
| + |
| static int renesas_check_rom_state(struct pci_dev *pdev) |
| { |
| const struct renesas_fw_entry *entry; |
| @@ -252,6 +256,7 @@ static int renesas_check_rom_state(struct pci_dev *pdev) |
| if (version == entry->expected_version) { |
| dev_dbg(&pdev->dev, "Detected valid ROM version..\n"); |
| valid_version = true; |
| + debugfs_init(pdev); |
| } |
| } |
| if (valid_version == false) |
| @@ -536,6 +541,34 @@ static void renesas_rom_erase(struct pci_dev *pdev) |
| dev_dbg(&pdev->dev, "ROM Erase... Done success\n"); |
| } |
| |
| +static int debugfs_rom_erase(void *data, u64 value) |
| +{ |
| + struct pci_dev *pdev = data; |
| + |
| + if (value == 1) { |
| + dev_dbg(&pdev->dev, "Userspace requested ROM erase\n"); |
| + renesas_rom_erase(pdev); |
| + return 0; |
| + } |
| + return -EINVAL; |
| +} |
| +DEFINE_DEBUGFS_ATTRIBUTE(rom_erase_ops, NULL, debugfs_rom_erase, "%llu\n"); |
| + |
| +static struct dentry *debugfs_root; |
| + |
| +static void debugfs_init(struct pci_dev *pdev) |
| +{ |
| + debugfs_root = debugfs_create_dir("renesas-usb", NULL); |
| + |
| + debugfs_create_file("rom_erase", 0200, debugfs_root, |
| + pdev, &rom_erase_ops); |
| +} |
| + |
| +static void debugfs_exit(void) |
| +{ |
| + debugfs_remove_recursive(debugfs_root); |
| +} |
| + |
| static bool renesas_download_rom(struct pci_dev *pdev, |
| const u32 *fw, size_t step) |
| { |
| @@ -889,6 +922,8 @@ static int renesas_xhci_pci_probe(struct pci_dev *dev, |
| |
| static void renesas_xhci_pci_remove(struct pci_dev *dev) |
| { |
| + debugfs_exit(); |
| + |
| if (renesas_fw_alive_check(dev)) { |
| /* |
| * bail out early, if this was a renesas device w/o FW. |