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

HID: wiimote: Allow direct DRM debug access

Keep track of current drm and add new debugfs file which reads or writes the
current DRM.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.cz>

authored by

David Herrmann and committed by
Jiri Kosina
43d782ae 1d3452c6

+107 -4
+2
drivers/hid/hid-wiimote-core.c
··· 238 238 cmd[1] = 0; 239 239 cmd[2] = drm; 240 240 241 + wdata->state.drm = drm; 241 242 wiiproto_keep_rumble(wdata, &cmd[1]); 242 243 wiimote_queue(wdata, cmd, sizeof(cmd)); 243 244 } ··· 1142 1141 spin_lock_init(&wdata->state.lock); 1143 1142 init_completion(&wdata->state.ready); 1144 1143 mutex_init(&wdata->state.sync); 1144 + wdata->state.drm = WIIPROTO_REQ_DRM_K; 1145 1145 1146 1146 return wdata; 1147 1147
+103 -4
drivers/hid/hid-wiimote-debug.c
··· 12 12 13 13 #include <linux/debugfs.h> 14 14 #include <linux/module.h> 15 + #include <linux/seq_file.h> 15 16 #include <linux/spinlock.h> 16 17 #include <linux/uaccess.h> 17 18 #include "hid-wiimote.h" ··· 20 19 struct wiimote_debug { 21 20 struct wiimote_data *wdata; 22 21 struct dentry *eeprom; 22 + struct dentry *drm; 23 23 }; 24 24 25 25 static int wiidebug_eeprom_open(struct inode *i, struct file *f) ··· 88 86 .llseek = generic_file_llseek, 89 87 }; 90 88 89 + static const char *wiidebug_drmmap[] = { 90 + [WIIPROTO_REQ_NULL] = "NULL", 91 + [WIIPROTO_REQ_DRM_K] = "K", 92 + [WIIPROTO_REQ_DRM_KA] = "KA", 93 + [WIIPROTO_REQ_DRM_KE] = "KE", 94 + [WIIPROTO_REQ_DRM_KAI] = "KAI", 95 + [WIIPROTO_REQ_DRM_KEE] = "KEE", 96 + [WIIPROTO_REQ_DRM_KAE] = "KAE", 97 + [WIIPROTO_REQ_DRM_KIE] = "KIE", 98 + [WIIPROTO_REQ_DRM_KAIE] = "KAIE", 99 + [WIIPROTO_REQ_DRM_E] = "E", 100 + [WIIPROTO_REQ_DRM_SKAI1] = "SKAI1", 101 + [WIIPROTO_REQ_DRM_SKAI2] = "SKAI2", 102 + [WIIPROTO_REQ_MAX] = NULL 103 + }; 104 + 105 + static int wiidebug_drm_show(struct seq_file *f, void *p) 106 + { 107 + struct wiimote_debug *dbg = f->private; 108 + const char *str = NULL; 109 + unsigned long flags; 110 + __u8 drm; 111 + 112 + spin_lock_irqsave(&dbg->wdata->state.lock, flags); 113 + drm = dbg->wdata->state.drm; 114 + spin_unlock_irqrestore(&dbg->wdata->state.lock, flags); 115 + 116 + if (drm < WIIPROTO_REQ_MAX) 117 + str = wiidebug_drmmap[drm]; 118 + if (!str) 119 + str = "unknown"; 120 + 121 + seq_printf(f, "%s\n", str); 122 + 123 + return 0; 124 + } 125 + 126 + static int wiidebug_drm_open(struct inode *i, struct file *f) 127 + { 128 + return single_open(f, wiidebug_drm_show, i->i_private); 129 + } 130 + 131 + static ssize_t wiidebug_drm_write(struct file *f, const char __user *u, 132 + size_t s, loff_t *off) 133 + { 134 + struct wiimote_debug *dbg = f->private_data; 135 + unsigned long flags; 136 + char buf[16]; 137 + ssize_t len; 138 + int i; 139 + 140 + if (s == 0) 141 + return -EINVAL; 142 + 143 + len = min((size_t) 15, s); 144 + if (copy_from_user(buf, u, len)) 145 + return -EFAULT; 146 + 147 + buf[15] = 0; 148 + 149 + for (i = 0; i < WIIPROTO_REQ_MAX; ++i) { 150 + if (!wiidebug_drmmap[i]) 151 + continue; 152 + if (!strcasecmp(buf, wiidebug_drmmap[i])) 153 + break; 154 + } 155 + 156 + if (i == WIIPROTO_REQ_MAX) 157 + i = simple_strtoul(buf, NULL, 10); 158 + 159 + spin_lock_irqsave(&dbg->wdata->state.lock, flags); 160 + wiiproto_req_drm(dbg->wdata, (__u8) i); 161 + spin_unlock_irqrestore(&dbg->wdata->state.lock, flags); 162 + 163 + return len; 164 + } 165 + 166 + static const struct file_operations wiidebug_drm_fops = { 167 + .owner = THIS_MODULE, 168 + .open = wiidebug_drm_open, 169 + .read = seq_read, 170 + .llseek = seq_lseek, 171 + .write = wiidebug_drm_write, 172 + .release = single_release, 173 + }; 174 + 91 175 int wiidebug_init(struct wiimote_data *wdata) 92 176 { 93 177 struct wiimote_debug *dbg; 94 178 unsigned long flags; 179 + int ret = -ENOMEM; 95 180 96 181 dbg = kzalloc(sizeof(*dbg), GFP_KERNEL); 97 182 if (!dbg) ··· 188 99 189 100 dbg->eeprom = debugfs_create_file("eeprom", S_IRUSR, 190 101 dbg->wdata->hdev->debug_dir, dbg, &wiidebug_eeprom_fops); 191 - if (!dbg->eeprom) { 192 - kfree(dbg); 193 - return -ENOMEM; 194 - } 102 + if (!dbg->eeprom) 103 + goto err; 104 + 105 + dbg->drm = debugfs_create_file("drm", S_IRUSR, 106 + dbg->wdata->hdev->debug_dir, dbg, &wiidebug_drm_fops); 107 + if (!dbg->drm) 108 + goto err_drm; 195 109 196 110 spin_lock_irqsave(&wdata->state.lock, flags); 197 111 wdata->debug = dbg; 198 112 spin_unlock_irqrestore(&wdata->state.lock, flags); 199 113 200 114 return 0; 115 + 116 + err_drm: 117 + debugfs_remove(dbg->eeprom); 118 + err: 119 + kfree(dbg); 120 + return ret; 201 121 } 202 122 203 123 void wiidebug_deinit(struct wiimote_data *wdata) ··· 221 123 wdata->debug = NULL; 222 124 spin_unlock_irqrestore(&wdata->state.lock, flags); 223 125 126 + debugfs_remove(dbg->drm); 224 127 debugfs_remove(dbg->eeprom); 225 128 kfree(dbg); 226 129 }
+2
drivers/hid/hid-wiimote.h
··· 52 52 spinlock_t lock; 53 53 __u8 flags; 54 54 __u8 accel_split[2]; 55 + __u8 drm; 55 56 56 57 /* synchronous cmd requests */ 57 58 struct mutex sync; ··· 110 109 WIIPROTO_REQ_DRM_E = 0x3d, 111 110 WIIPROTO_REQ_DRM_SKAI1 = 0x3e, 112 111 WIIPROTO_REQ_DRM_SKAI2 = 0x3f, 112 + WIIPROTO_REQ_MAX 113 113 }; 114 114 115 115 #define dev_to_wii(pdev) hid_get_drvdata(container_of(pdev, struct hid_device, \