]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
PCI/VPD: Move VPD sysfs code to vpd.c
authorBjorn Helgaas <bhelgaas@google.com>
Mon, 19 Mar 2018 18:06:17 +0000 (13:06 -0500)
committerBjorn Helgaas <helgaas@kernel.org>
Mon, 19 Mar 2018 18:06:17 +0000 (13:06 -0500)
Move the VPD-related sysfs code from pci-sysfs.c to vpd.c.  This follows
the pattern of pcie_aspm_create_sysfs_dev_files().  The goal is to
encapsulate all the VPD code and structures in vpd.c.

No functional change intended.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/pci-sysfs.c
drivers/pci/pci.h
drivers/pci/vpd.c

index eb6bee8724cc1c9243213ab446666bac6c9395eb..4415e624cf7e3f5a4f82970477bb335a25bb2a0d 100644 (file)
@@ -982,38 +982,6 @@ static ssize_t pci_write_config(struct file *filp, struct kobject *kobj,
        return count;
 }
 
-static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
-                            struct bin_attribute *bin_attr, char *buf,
-                            loff_t off, size_t count)
-{
-       struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
-
-       if (bin_attr->size > 0) {
-               if (off > bin_attr->size)
-                       count = 0;
-               else if (count > bin_attr->size - off)
-                       count = bin_attr->size - off;
-       }
-
-       return pci_read_vpd(dev, off, count, buf);
-}
-
-static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
-                             struct bin_attribute *bin_attr, char *buf,
-                             loff_t off, size_t count)
-{
-       struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
-
-       if (bin_attr->size > 0) {
-               if (off > bin_attr->size)
-                       count = 0;
-               else if (count > bin_attr->size - off)
-                       count = bin_attr->size - off;
-       }
-
-       return pci_write_vpd(dev, off, count, buf);
-}
-
 #ifdef HAVE_PCI_LEGACY
 /**
  * pci_read_legacy_io - read byte(s) from legacy I/O port space
@@ -1517,29 +1485,8 @@ static struct device_attribute reset_attr = __ATTR(reset, 0200, NULL, reset_stor
 static int pci_create_capabilities_sysfs(struct pci_dev *dev)
 {
        int retval;
-       struct bin_attribute *attr;
-
-       /* If the device has VPD, try to expose it in sysfs. */
-       if (dev->vpd) {
-               attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
-               if (!attr)
-                       return -ENOMEM;
 
-               sysfs_bin_attr_init(attr);
-               attr->size = 0;
-               attr->attr.name = "vpd";
-               attr->attr.mode = S_IRUSR | S_IWUSR;
-               attr->read = read_vpd_attr;
-               attr->write = write_vpd_attr;
-               retval = sysfs_create_bin_file(&dev->dev.kobj, attr);
-               if (retval) {
-                       kfree(attr);
-                       return retval;
-               }
-               dev->vpd->attr = attr;
-       }
-
-       /* Active State Power Management */
+       pcie_vpd_create_sysfs_dev_files(dev);
        pcie_aspm_create_sysfs_dev_files(dev);
 
        if (!pci_probe_reset_function(dev)) {
@@ -1552,11 +1499,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev)
 
 error:
        pcie_aspm_remove_sysfs_dev_files(dev);
-       if (dev->vpd && dev->vpd->attr) {
-               sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
-               kfree(dev->vpd->attr);
-       }
-
+       pcie_vpd_remove_sysfs_dev_files(dev);
        return retval;
 }
 
@@ -1630,11 +1573,7 @@ err:
 
 static void pci_remove_capabilities_sysfs(struct pci_dev *dev)
 {
-       if (dev->vpd && dev->vpd->attr) {
-               sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
-               kfree(dev->vpd->attr);
-       }
-
+       pcie_vpd_remove_sysfs_dev_files(dev);
        pcie_aspm_remove_sysfs_dev_files(dev);
        if (dev->reset_fn) {
                device_remove_file(&dev->dev, &reset_attr);
index fcd81911b1278486572a2845a2cdbe9829d1ad99..1191320a44d5983f2422bc8fad72a90acd1fa35f 100644 (file)
@@ -123,6 +123,8 @@ struct pci_vpd {
 
 int pci_vpd_init(struct pci_dev *dev);
 void pci_vpd_release(struct pci_dev *dev);
+void pcie_vpd_create_sysfs_dev_files(struct pci_dev *dev);
+void pcie_vpd_remove_sysfs_dev_files(struct pci_dev *dev);
 
 /* PCI /proc functions */
 #ifdef CONFIG_PROC_FS
index 4596452d58bf3b236c496a27a40de08dbc00371c..55477f24d8b9074f8e15af6741ed3c0af6efccb7 100644 (file)
@@ -378,6 +378,73 @@ void pci_vpd_release(struct pci_dev *dev)
        kfree(dev->vpd);
 }
 
+static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
+                            struct bin_attribute *bin_attr, char *buf,
+                            loff_t off, size_t count)
+{
+       struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
+
+       if (bin_attr->size > 0) {
+               if (off > bin_attr->size)
+                       count = 0;
+               else if (count > bin_attr->size - off)
+                       count = bin_attr->size - off;
+       }
+
+       return pci_read_vpd(dev, off, count, buf);
+}
+
+static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
+                             struct bin_attribute *bin_attr, char *buf,
+                             loff_t off, size_t count)
+{
+       struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
+
+       if (bin_attr->size > 0) {
+               if (off > bin_attr->size)
+                       count = 0;
+               else if (count > bin_attr->size - off)
+                       count = bin_attr->size - off;
+       }
+
+       return pci_write_vpd(dev, off, count, buf);
+}
+
+void pcie_vpd_create_sysfs_dev_files(struct pci_dev *dev)
+{
+       int retval;
+       struct bin_attribute *attr;
+
+       if (!dev->vpd)
+               return;
+
+       attr = kzalloc(sizeof(*attr), GFP_ATOMIC);
+       if (!attr)
+               return;
+
+       sysfs_bin_attr_init(attr);
+       attr->size = 0;
+       attr->attr.name = "vpd";
+       attr->attr.mode = S_IRUSR | S_IWUSR;
+       attr->read = read_vpd_attr;
+       attr->write = write_vpd_attr;
+       retval = sysfs_create_bin_file(&dev->dev.kobj, attr);
+       if (retval) {
+               kfree(attr);
+               return;
+       }
+
+       dev->vpd->attr = attr;
+}
+
+void pcie_vpd_remove_sysfs_dev_files(struct pci_dev *dev)
+{
+       if (dev->vpd && dev->vpd->attr) {
+               sysfs_remove_bin_file(&dev->dev.kobj, dev->vpd->attr);
+               kfree(dev->vpd->attr);
+       }
+}
+
 int pci_vpd_find_tag(const u8 *buf, unsigned int off, unsigned int len, u8 rdt)
 {
        int i;