0001
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 };