Lines Matching +full:slave +full:- +full:kernel
1 // SPDX-License-Identifier: GPL-2.0-only
2 // Copyright(c) 2017-2019 Intel Corporation.
25 /* create the debugfs master-N */ in sdw_bus_debugfs_init()
26 snprintf(name, sizeof(name), "master-%d-%d", bus->controller_id, bus->link_id); in sdw_bus_debugfs_init()
27 bus->debugfs = debugfs_create_dir(name, sdw_debugfs_root); in sdw_bus_debugfs_init()
32 debugfs_remove_recursive(bus->debugfs); in sdw_bus_debugfs_exit()
37 static ssize_t sdw_sprintf(struct sdw_slave *slave, in sdw_sprintf() argument
42 value = sdw_read_no_pm(slave, reg); in sdw_sprintf()
45 return scnprintf(buf + pos, RD_BUF - pos, "%3x\tXX\n", reg); in sdw_sprintf()
47 return scnprintf(buf + pos, RD_BUF - pos, in sdw_sprintf()
53 struct sdw_slave *slave = s_file->private; in sdw_slave_reg_show() local
59 return -ENOMEM; in sdw_slave_reg_show()
61 ret = pm_runtime_get_sync(&slave->dev); in sdw_slave_reg_show()
62 if (ret < 0 && ret != -EACCES) { in sdw_slave_reg_show()
63 pm_runtime_put_noidle(&slave->dev); in sdw_slave_reg_show()
69 /* DP0 non-banked registers */ in sdw_slave_reg_show()
70 ret += scnprintf(buf + ret, RD_BUF - ret, "\nDP0\n"); in sdw_slave_reg_show()
72 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
75 ret += scnprintf(buf + ret, RD_BUF - ret, "Bank0\n"); in sdw_slave_reg_show()
76 ret += sdw_sprintf(slave, buf, ret, SDW_DP0_CHANNELEN); in sdw_slave_reg_show()
78 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
81 ret += scnprintf(buf + ret, RD_BUF - ret, "Bank1\n"); in sdw_slave_reg_show()
82 ret += sdw_sprintf(slave, buf, ret, in sdw_slave_reg_show()
86 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
89 ret += scnprintf(buf + ret, RD_BUF - ret, "\nSCP\n"); in sdw_slave_reg_show()
91 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
93 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
95 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
97 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
99 ret += sdw_sprintf(slave, buf, ret, i); in sdw_slave_reg_show()
103 * SCP Bank 0/1 registers are read-only and cannot be in sdw_slave_reg_show()
104 * retrieved from the Slave. The Master typically keeps track in sdw_slave_reg_show()
113 ret += scnprintf(buf + ret, RD_BUF - ret, "\nDP%d\n", i); in sdw_slave_reg_show()
115 ret += sdw_sprintf(slave, buf, ret, j); in sdw_slave_reg_show()
118 ret += scnprintf(buf + ret, RD_BUF - ret, "Bank0\n"); in sdw_slave_reg_show()
121 ret += sdw_sprintf(slave, buf, ret, j); in sdw_slave_reg_show()
124 ret += scnprintf(buf + ret, RD_BUF - ret, "Bank1\n"); in sdw_slave_reg_show()
127 ret += sdw_sprintf(slave, buf, ret, j); in sdw_slave_reg_show()
132 pm_runtime_mark_last_busy(&slave->dev); in sdw_slave_reg_show()
133 pm_runtime_put(&slave->dev); in sdw_slave_reg_show()
150 struct sdw_slave *slave = data; in set_command() local
153 return -EINVAL; in set_command()
155 /* Userspace changed the hardware state behind the kernel's back */ in set_command()
158 dev_dbg(&slave->dev, "command: %s\n", str_read_write(value)); in set_command()
168 struct sdw_slave *slave = data; in set_command_type() local
171 return -EINVAL; in set_command_type()
173 /* Userspace changed the hardware state behind the kernel's back */ in set_command_type()
176 dev_dbg(&slave->dev, "command type: %s\n", value ? "BRA" : "Column0"); in set_command_type()
187 struct sdw_slave *slave = data; in set_start_address() local
189 /* Userspace changed the hardware state behind the kernel's back */ in set_start_address()
192 dev_dbg(&slave->dev, "start address %#llx\n", value); in set_start_address()
203 struct sdw_slave *slave = data; in set_num_bytes() local
206 return -EINVAL; in set_num_bytes()
208 /* Userspace changed the hardware state behind the kernel's back */ in set_num_bytes()
211 dev_dbg(&slave->dev, "number of bytes %lld\n", value); in set_num_bytes()
220 static int do_bpt_sequence(struct sdw_slave *slave, bool write, u8 *buffer) in do_bpt_sequence() argument
226 msg.dev_num = slave->dev_num; in do_bpt_sequence()
233 return sdw_bpt_send_sync(slave->bus, slave, &msg); in do_bpt_sequence()
239 struct sdw_slave *slave = data; in cmd_go() local
245 return -EINVAL; in cmd_go()
250 return -EINVAL; in cmd_go()
252 ret = pm_runtime_get_sync(&slave->dev); in cmd_go()
253 if (ret < 0 && ret != -EACCES) { in cmd_go()
254 pm_runtime_put_noidle(&slave->dev); in cmd_go()
259 ret = request_firmware(&fw, firmware_file, &slave->dev); in cmd_go()
261 dev_err(&slave->dev, "firmware %s not found\n", firmware_file); in cmd_go()
264 if (fw->size < num_bytes) { in cmd_go()
265 dev_err(&slave->dev, in cmd_go()
267 firmware_file, fw->size, num_bytes); in cmd_go()
272 /* Userspace changed the hardware state behind the kernel's back */ in cmd_go()
275 dev_dbg(&slave->dev, "starting command\n"); in cmd_go()
280 ret = do_bpt_sequence(slave, true, (u8 *)fw->data); in cmd_go()
282 ret = sdw_nwrite_no_pm(slave, start_addr, num_bytes, fw->data); in cmd_go()
287 ret = do_bpt_sequence(slave, false, read_buffer); in cmd_go()
289 ret = sdw_nread_no_pm(slave, start_addr, num_bytes, read_buffer); in cmd_go()
298 pm_runtime_mark_last_busy(&slave->dev); in cmd_go()
299 pm_runtime_put(&slave->dev); in cmd_go()
301 dev_dbg(&slave->dev, "command completed, num_byte %zu status %d, time %lld ms\n", in cmd_go()
302 num_bytes, ret, div_u64(finish_t - start_t, NSEC_PER_MSEC)); in cmd_go()
317 return -EINVAL; in read_buffer_show()
329 void sdw_slave_debugfs_init(struct sdw_slave *slave) in sdw_slave_debugfs_init() argument
335 master = slave->bus->debugfs; in sdw_slave_debugfs_init()
337 /* create the debugfs slave-name */ in sdw_slave_debugfs_init()
338 snprintf(name, sizeof(name), "%s", dev_name(&slave->dev)); in sdw_slave_debugfs_init()
341 debugfs_create_file("registers", 0400, d, slave, &sdw_slave_reg_fops); in sdw_slave_debugfs_init()
344 debugfs_create_file("command", 0200, d, slave, &set_command_fops); in sdw_slave_debugfs_init()
345 debugfs_create_file("command_type", 0200, d, slave, &set_command_type_fops); in sdw_slave_debugfs_init()
346 debugfs_create_file("start_address", 0200, d, slave, &set_start_address_fops); in sdw_slave_debugfs_init()
347 debugfs_create_file("num_bytes", 0200, d, slave, &set_num_bytes_fops); in sdw_slave_debugfs_init()
348 debugfs_create_file("go", 0200, d, slave, &cmd_go_fops); in sdw_slave_debugfs_init()
350 debugfs_create_file("read_buffer", 0400, d, slave, &read_buffer_fops); in sdw_slave_debugfs_init()
354 slave->debugfs = d; in sdw_slave_debugfs_init()
357 void sdw_slave_debugfs_exit(struct sdw_slave *slave) in sdw_slave_debugfs_exit() argument
359 debugfs_remove_recursive(slave->debugfs); in sdw_slave_debugfs_exit()