Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 
0003 #include <linux/mtd/spi-nor.h>
0004 #include <linux/spi/spi.h>
0005 #include <linux/spi/spi-mem.h>
0006 #include <linux/sysfs.h>
0007 
0008 #include "core.h"
0009 
0010 static ssize_t manufacturer_show(struct device *dev,
0011                  struct device_attribute *attr, char *buf)
0012 {
0013     struct spi_device *spi = to_spi_device(dev);
0014     struct spi_mem *spimem = spi_get_drvdata(spi);
0015     struct spi_nor *nor = spi_mem_get_drvdata(spimem);
0016 
0017     return sysfs_emit(buf, "%s\n", nor->manufacturer->name);
0018 }
0019 static DEVICE_ATTR_RO(manufacturer);
0020 
0021 static ssize_t partname_show(struct device *dev,
0022                  struct device_attribute *attr, char *buf)
0023 {
0024     struct spi_device *spi = to_spi_device(dev);
0025     struct spi_mem *spimem = spi_get_drvdata(spi);
0026     struct spi_nor *nor = spi_mem_get_drvdata(spimem);
0027 
0028     return sysfs_emit(buf, "%s\n", nor->info->name);
0029 }
0030 static DEVICE_ATTR_RO(partname);
0031 
0032 static ssize_t jedec_id_show(struct device *dev,
0033                  struct device_attribute *attr, char *buf)
0034 {
0035     struct spi_device *spi = to_spi_device(dev);
0036     struct spi_mem *spimem = spi_get_drvdata(spi);
0037     struct spi_nor *nor = spi_mem_get_drvdata(spimem);
0038 
0039     return sysfs_emit(buf, "%*phN\n", nor->info->id_len, nor->info->id);
0040 }
0041 static DEVICE_ATTR_RO(jedec_id);
0042 
0043 static struct attribute *spi_nor_sysfs_entries[] = {
0044     &dev_attr_manufacturer.attr,
0045     &dev_attr_partname.attr,
0046     &dev_attr_jedec_id.attr,
0047     NULL
0048 };
0049 
0050 static ssize_t sfdp_read(struct file *filp, struct kobject *kobj,
0051              struct bin_attribute *bin_attr, char *buf,
0052              loff_t off, size_t count)
0053 {
0054     struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
0055     struct spi_mem *spimem = spi_get_drvdata(spi);
0056     struct spi_nor *nor = spi_mem_get_drvdata(spimem);
0057     struct sfdp *sfdp = nor->sfdp;
0058     size_t sfdp_size = sfdp->num_dwords * sizeof(*sfdp->dwords);
0059 
0060     return memory_read_from_buffer(buf, count, &off, nor->sfdp->dwords,
0061                        sfdp_size);
0062 }
0063 static BIN_ATTR_RO(sfdp, 0);
0064 
0065 static struct bin_attribute *spi_nor_sysfs_bin_entries[] = {
0066     &bin_attr_sfdp,
0067     NULL
0068 };
0069 
0070 static umode_t spi_nor_sysfs_is_bin_visible(struct kobject *kobj,
0071                         struct bin_attribute *attr, int n)
0072 {
0073     struct spi_device *spi = to_spi_device(kobj_to_dev(kobj));
0074     struct spi_mem *spimem = spi_get_drvdata(spi);
0075     struct spi_nor *nor = spi_mem_get_drvdata(spimem);
0076 
0077     if (attr == &bin_attr_sfdp && nor->sfdp)
0078         return 0444;
0079 
0080     return 0;
0081 }
0082 
0083 static const struct attribute_group spi_nor_sysfs_group = {
0084     .name       = "spi-nor",
0085     .is_bin_visible = spi_nor_sysfs_is_bin_visible,
0086     .attrs      = spi_nor_sysfs_entries,
0087     .bin_attrs  = spi_nor_sysfs_bin_entries,
0088 };
0089 
0090 const struct attribute_group *spi_nor_sysfs_groups[] = {
0091     &spi_nor_sysfs_group,
0092     NULL
0093 };