From: Thadeu Lima de Souza Cascardo Date: Thu, 15 Sep 2016 10:14:51 +0000 (+0000) Subject: read/write chromeos vbc with sysfs X-Git-Url: http://git.cascardo.eti.br/?p=cascardo%2Flinux.git;a=commitdiff_plain;h=5ebb098d669b9a1d3b55cd73f39a45a94352c413 read/write chromeos vbc with sysfs --- diff --git a/drivers/platform/chromeos.c b/drivers/platform/chromeos.c index 199ad9714e05..e317da01fe03 100644 --- a/drivers/platform/chromeos.c +++ b/drivers/platform/chromeos.c @@ -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; diff --git a/drivers/platform/chromeos_ec-fw.c b/drivers/platform/chromeos_ec-fw.c index 7b34c984c34c..d2c0da23854f 100644 --- a/drivers/platform/chromeos_ec-fw.c +++ b/drivers/platform/chromeos_ec-fw.c @@ -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 }; diff --git a/include/linux/chromeos_platform.h b/include/linux/chromeos_platform.h index c02e5fd80be0..3474c6ae8d4c 100644 --- a/include/linux/chromeos_platform.h +++ b/include/linux/chromeos_platform.h @@ -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 */