read/write chromeos vbc with sysfs
authorThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Thu, 15 Sep 2016 10:14:51 +0000 (10:14 +0000)
committerThadeu Lima de Souza Cascardo <cascardo@cascardo.eti.br>
Thu, 15 Sep 2016 10:14:51 +0000 (10:14 +0000)
drivers/platform/chromeos.c
drivers/platform/chromeos_ec-fw.c
include/linux/chromeos_platform.h

index 199ad97..e317da0 100644 (file)
@@ -28,7 +28,6 @@
 
 static struct chromeos_vbc *chromeos_vbc_ptr;
 
-static int vbc_read(u8 *buf, int buf_size);
 static int vbc_write_byte(unsigned offset, u8 value);
 
 /* the following defines are copied from
@@ -72,6 +71,11 @@ static u8 crc8(const u8 *data, int len)
        return (u8)(crc >> 8);
 }
 
+int chromeos_vbc_write(const u8 *buf, ssize_t size)
+{
+       return chromeos_vbc_ptr->write(buf, size);
+}
+
 static int vbc_write_byte(unsigned offset, u8 value)
 {
        u8 buf[MAX_VBOOT_CONTEXT_BUFFER_SIZE];
@@ -80,7 +84,7 @@ static int vbc_write_byte(unsigned offset, u8 value)
        if (!chromeos_vbc_ptr)
                return -ENOSYS;
 
-       size = vbc_read(buf, sizeof(buf));
+       size = chromeos_vbc_read(buf, sizeof(buf));
        if (size <= 0)
                return -EINVAL;
 
@@ -101,7 +105,7 @@ static int vbc_write_byte(unsigned offset, u8 value)
  * of bytes in the vboot context buffer, -1 on any error (uninitialized
  * subsystem, corrupted crc8 value, not enough room in the buffer, etc.).
  */
-static int vbc_read(u8 *buf, int buf_size)
+int chromeos_vbc_read(u8 *buf, int buf_size)
 {
        ssize_t size;
 
index 7b34c98..d2c0da2 100644 (file)
@@ -80,23 +80,39 @@ static ssize_t ec_dev_usb_store(struct device *dev,
                                 struct device_attribute *attr,
                                 const char *buf, size_t count)
 {
-        int err;
-        err = chromeos_set_dev_usb();
-        if (err)
-                return err;
-        return count;
+       int err;
+       err = chromeos_set_dev_usb();
+       if (err)
+               return err;
+       return count;
+}
+
+static ssize_t ec_vbnv_store(struct device *dev,
+                            struct device_attribute *attr,
+                            const char *buf, size_t count)
+{
+       return chromeos_vbc_write(buf, count);
+}
+
+static ssize_t ec_vbnv_show(struct device *dev,
+                           struct device_attribute *attr,
+                           char *buf)
+{
+       return chromeos_vbc_read(buf, 16);
 }
 
 static DEVICE_ATTR(fw_version, S_IRUGO, ec_fw_version_show, NULL);
 static DEVICE_ATTR(build_info, S_IRUGO, ec_build_info_show, NULL);
 static DEVICE_ATTR(chip_info, S_IRUGO, ec_chip_info_show, NULL);
 static DEVICE_ATTR(dev_usb, S_IWUGO, NULL, ec_dev_usb_store);
+static DEVICE_ATTR(vbnv, S_IRUGO | S_IWUGO, ec_vbnv_show, ec_vbnv_store);
 
 static struct attribute *ec_fw_attrs[] = {
        &dev_attr_fw_version.attr,
        &dev_attr_build_info.attr,
        &dev_attr_chip_info.attr,
        &dev_attr_dev_usb.attr,
+       &dev_attr_vbnv.attr,
        NULL
 };
 
index c02e5fd..3474c6a 100644 (file)
@@ -16,6 +16,8 @@
  */
 extern int chromeos_set_need_recovery(void);
 extern int chromeos_set_dev_usb(void);
+int chromeos_vbc_read(u8 *buf, int buf_size);
+int chromeos_vbc_write(const u8 *buf, int buf_size);
 
 #else
 
@@ -28,6 +30,16 @@ static inline int chromeos_set_dev_usb(void)
 {
        return -ENODEV;
 }
+static inline int chromeos_vbc_read(u8 *buf, int buf_size)
+{
+       return -ENODEV;
+}
+
+static inline int chromeos_vbc_write(const u8 *buf, int buf_size)
+{
+       return -ENODEV;
+}
+
 #endif /* CONFIG_CHROMEOS */
 
 #endif /* _LINUX_CHROMEOS_PLATFORM_H */