Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

usb: typec: ucsi: Enable debugfs for message_out data structure

Add debugfs entry for writing message_out data structure to handle
UCSI 2.1 and 3.0 commands through debugfs interface.

Users writing to the message_out debugfs file should ensure the input
data adheres to the following format:
1. Input must be a non-empty valid hexadecimal string.
2. Input length of hexadecimal string must not exceed 256 bytes of
length to be in alignment with the message out data structure size
as per the UCSI specification v2.1.
3. If the input string length is odd, then user needs to prepend a
'0' to the first character for proper hex conversion.

Below are examples of valid hex strings. Note that these values are
just examples. The exact values depend on specific command use case.

#echo 1A2B3C4D > message_out
#echo 01234567 > message_out

Reviewed-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Pooja Katiyar <pooja.katiyar@intel.com>
Link: https://patch.msgid.link/0a81c2209eb299c1af191cd7ce758a92d5adf81b.1761773881.git.pooja.katiyar@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Pooja Katiyar and committed by
Greg Kroah-Hartman
775fae52 db002863

+26
+26
drivers/usb/typec/ucsi/debugfs.c
··· 110 110 } 111 111 DEFINE_SHOW_ATTRIBUTE(ucsi_vbus_volt); 112 112 113 + static ssize_t ucsi_message_out_write(struct file *file, 114 + const char __user *data, size_t count, loff_t *ppos) 115 + { 116 + struct ucsi *ucsi = file->private_data; 117 + int ret; 118 + 119 + char *buf __free(kfree) = memdup_user_nul(data, count); 120 + if (IS_ERR(buf)) 121 + return PTR_ERR(buf); 122 + 123 + ucsi->message_out_size = min(count / 2, UCSI_MAX_MESSAGE_OUT_LENGTH); 124 + ret = hex2bin(ucsi->message_out, buf, ucsi->message_out_size); 125 + if (ret) 126 + return ret; 127 + 128 + return count; 129 + } 130 + 131 + static const struct file_operations ucsi_message_out_fops = { 132 + .open = simple_open, 133 + .write = ucsi_message_out_write, 134 + .llseek = generic_file_llseek, 135 + }; 136 + 113 137 void ucsi_debugfs_register(struct ucsi *ucsi) 114 138 { 115 139 ucsi->debugfs = kzalloc(sizeof(*ucsi->debugfs), GFP_KERNEL); ··· 146 122 debugfs_create_file("peak_current", 0400, ucsi->debugfs->dentry, ucsi, &ucsi_peak_curr_fops); 147 123 debugfs_create_file("avg_current", 0400, ucsi->debugfs->dentry, ucsi, &ucsi_avg_curr_fops); 148 124 debugfs_create_file("vbus_voltage", 0400, ucsi->debugfs->dentry, ucsi, &ucsi_vbus_volt_fops); 125 + debugfs_create_file("message_out", 0200, ucsi->debugfs->dentry, ucsi, 126 + &ucsi_message_out_fops); 149 127 } 150 128 151 129 void ucsi_debugfs_unregister(struct ucsi *ucsi)