Lines Matching +full:address +full:- +full:data

1 // SPDX-License-Identifier: GPL-2.0-or-later
23 /* Reg offset to specify Address for MM assisted accesses */
27 /* Reg offset to MM SPARE 0 used specify Address[7:0] */
29 /* Reg offset to MM SPARE 3 used specify Data Byte 0 */
46 #define ARIES_MAIN_MICRO_FW_INFO (96 * 1024 - 128)
63 /* Each client has this additional data */
78 * Write multiple data bytes to Aries over I2C
80 static int pt5161l_write_block_data(struct pt5161l_data *data, u32 address, in pt5161l_write_block_data() argument
83 struct i2c_client *client = data->client; in pt5161l_write_block_data()
89 u8 config = 0x40; /* [6]:cfg_type, [4:1]:burst_len, [0]:address bit16 */ in pt5161l_write_block_data()
94 remain_len -= 4; in pt5161l_write_block_data()
100 buf[0] = config | (curr_len - 1) << 1 | ((address >> 16) & 0x1); in pt5161l_write_block_data()
101 buf[1] = (address >> 8) & 0xff; in pt5161l_write_block_data()
102 buf[2] = address & 0xff; in pt5161l_write_block_data()
111 address += curr_len; in pt5161l_write_block_data()
118 * Read multiple data bytes from Aries over I2C
120 static int pt5161l_read_block_data(struct pt5161l_data *data, u32 address, in pt5161l_read_block_data() argument
123 struct i2c_client *client = data->client; in pt5161l_read_block_data()
129 u8 config = 0x00; /* [6]:cfg_type, [4:1]:burst_len, [0]:address bit16 */ in pt5161l_read_block_data()
134 remain_len -= 16; in pt5161l_read_block_data()
140 wbuf[0] = config | (curr_len - 1) << 1 | in pt5161l_read_block_data()
141 ((address >> 16) & 0x1); in pt5161l_read_block_data()
142 wbuf[1] = (address >> 8) & 0xff; in pt5161l_read_block_data()
143 wbuf[2] = address & 0xff; in pt5161l_read_block_data()
161 address += curr_len; in pt5161l_read_block_data()
167 static int pt5161l_read_wide_reg(struct pt5161l_data *data, u32 address, in pt5161l_read_wide_reg() argument
179 if (data->mm_wide_reg_access) { in pt5161l_read_wide_reg()
180 buf[0] = address & 0xff; in pt5161l_read_wide_reg()
181 buf[1] = (address >> 8) & 0xff; in pt5161l_read_wide_reg()
182 buf[2] = (address >> 16) & 0x1; in pt5161l_read_wide_reg()
183 ret = pt5161l_write_block_data(data, in pt5161l_read_wide_reg()
204 return -EINVAL; in pt5161l_read_wide_reg()
206 ret = pt5161l_write_block_data(data, ARIES_MM_ASSIST_CMD_OFFSET, in pt5161l_read_wide_reg()
213 ret = pt5161l_read_block_data(data, in pt5161l_read_wide_reg()
226 return -ETIMEDOUT; in pt5161l_read_wide_reg()
228 ret = pt5161l_read_block_data(data, in pt5161l_read_wide_reg()
234 return pt5161l_read_block_data(data, address, width, val); in pt5161l_read_wide_reg()
241 * Read multiple (up to eight) data bytes from micro SRAM over I2C
244 pt5161l_read_block_data_main_micro_indirect(struct pt5161l_data *data, in pt5161l_read_block_data_main_micro_indirect() argument
245 u32 address, u8 len, u8 *val) in pt5161l_read_block_data_main_micro_indirect() argument
253 /* No multi-byte indirect support here. Hence read a byte at a time */ in pt5161l_read_block_data_main_micro_indirect()
254 eeprom_base = address - AL_MAIN_SRAM_DMEM_OFFSET; in pt5161l_read_block_data_main_micro_indirect()
260 ret = pt5161l_write_block_data(data, uind_offs, 3, buf); in pt5161l_read_block_data_main_micro_indirect()
265 ret = pt5161l_write_block_data(data, uind_offs + 4, 1, buf); in pt5161l_read_block_data_main_micro_indirect()
271 ret = pt5161l_read_block_data(data, uind_offs + 4, 1, in pt5161l_read_block_data_main_micro_indirect()
280 return -ETIMEDOUT; in pt5161l_read_block_data_main_micro_indirect()
282 ret = pt5161l_read_block_data(data, uind_offs + 3, 1, buf); in pt5161l_read_block_data_main_micro_indirect()
295 static int pt5161l_fw_load_check(struct pt5161l_data *data) in pt5161l_fw_load_check() argument
300 ret = pt5161l_read_block_data(data, ARIES_CODE_LOAD_REG, 1, buf); in pt5161l_fw_load_check()
305 dev_dbg(&data->client->dev, in pt5161l_fw_load_check()
308 data->code_load_okay = false; in pt5161l_fw_load_check()
310 data->code_load_okay = true; in pt5161l_fw_load_check()
319 static int pt5161l_heartbeat_check(struct pt5161l_data *data) in pt5161l_heartbeat_check() argument
326 ret = pt5161l_read_block_data(data, ARIES_MM_HEARTBEAT_ADDR, 1, buf); in pt5161l_heartbeat_check()
332 ret = pt5161l_read_block_data(data, ARIES_MM_HEARTBEAT_ADDR, 1, in pt5161l_heartbeat_check()
342 data->mm_heartbeat_okay = hb_changed; in pt5161l_heartbeat_check()
350 static int pt5161l_fwsts_check(struct pt5161l_data *data) in pt5161l_fwsts_check() argument
357 ret = pt5161l_fw_load_check(data); in pt5161l_fwsts_check()
361 ret = pt5161l_heartbeat_check(data); in pt5161l_fwsts_check()
365 if (data->code_load_okay && data->mm_heartbeat_okay) { in pt5161l_fwsts_check()
366 ret = pt5161l_read_block_data_main_micro_indirect(data, ARIES_MAIN_MICRO_FW_INFO + in pt5161l_fwsts_check()
372 ret = pt5161l_read_block_data_main_micro_indirect(data, ARIES_MAIN_MICRO_FW_INFO + in pt5161l_fwsts_check()
378 ret = pt5161l_read_block_data_main_micro_indirect(data, ARIES_MAIN_MICRO_FW_INFO + in pt5161l_fwsts_check()
385 data->fw_ver.major = major; in pt5161l_fwsts_check()
386 data->fw_ver.minor = minor; in pt5161l_fwsts_check()
387 data->fw_ver.build = build; in pt5161l_fwsts_check()
392 static int pt5161l_fw_is_at_least(struct pt5161l_data *data, u8 major, u8 minor, in pt5161l_fw_is_at_least() argument
396 u32 curr_ver = data->fw_ver.major << 24 | data->fw_ver.minor << 16 | in pt5161l_fw_is_at_least()
397 data->fw_ver.build; in pt5161l_fw_is_at_least()
405 static int pt5161l_init_dev(struct pt5161l_data *data) in pt5161l_init_dev() argument
409 mutex_lock(&data->lock); in pt5161l_init_dev()
410 ret = pt5161l_fwsts_check(data); in pt5161l_init_dev()
411 mutex_unlock(&data->lock); in pt5161l_init_dev()
416 if (pt5161l_fw_is_at_least(data, 2, 2, 0)) in pt5161l_init_dev()
417 data->mm_wide_reg_access = true; in pt5161l_init_dev()
419 data->init_done = true; in pt5161l_init_dev()
427 struct pt5161l_data *data = dev_get_drvdata(dev); in pt5161l_read() local
434 if (!data->init_done) { in pt5161l_read()
435 ret = pt5161l_init_dev(data); in pt5161l_read()
440 mutex_lock(&data->lock); in pt5161l_read()
441 ret = pt5161l_read_wide_reg(data, in pt5161l_read()
444 mutex_unlock(&data->lock); in pt5161l_read()
453 return -EIO; in pt5161l_read()
457 ((adc_code - (ARIES_TEMP_CAL_CODE_DEFAULT + 250)) * in pt5161l_read()
458 -320); in pt5161l_read()
461 return -EOPNOTSUPP; in pt5161l_read()
467 static umode_t pt5161l_is_visible(const void *data, in pt5161l_is_visible() argument
499 struct pt5161l_data *data = file->private_data; in pt5161l_debugfs_read_fw_ver() local
503 mutex_lock(&data->lock); in pt5161l_debugfs_read_fw_ver()
504 ret = pt5161l_fwsts_check(data); in pt5161l_debugfs_read_fw_ver()
505 mutex_unlock(&data->lock); in pt5161l_debugfs_read_fw_ver()
509 ret = snprintf(ver, sizeof(ver), "%u.%u.%u\n", data->fw_ver.major, in pt5161l_debugfs_read_fw_ver()
510 data->fw_ver.minor, data->fw_ver.build); in pt5161l_debugfs_read_fw_ver()
524 struct pt5161l_data *data = file->private_data; in pt5161l_debugfs_read_fw_load_sts() local
529 mutex_lock(&data->lock); in pt5161l_debugfs_read_fw_load_sts()
530 ret = pt5161l_fw_load_check(data); in pt5161l_debugfs_read_fw_load_sts()
531 mutex_unlock(&data->lock); in pt5161l_debugfs_read_fw_load_sts()
533 status = data->code_load_okay; in pt5161l_debugfs_read_fw_load_sts()
549 struct pt5161l_data *data = file->private_data; in pt5161l_debugfs_read_hb_sts() local
554 mutex_lock(&data->lock); in pt5161l_debugfs_read_hb_sts()
555 ret = pt5161l_heartbeat_check(data); in pt5161l_debugfs_read_hb_sts()
556 mutex_unlock(&data->lock); in pt5161l_debugfs_read_hb_sts()
558 status = data->mm_heartbeat_okay; in pt5161l_debugfs_read_hb_sts()
571 static int pt5161l_init_debugfs(struct pt5161l_data *data) in pt5161l_init_debugfs() argument
573 data->debugfs = debugfs_create_dir(dev_name(&data->client->dev), in pt5161l_init_debugfs()
576 debugfs_create_file("fw_ver", 0444, data->debugfs, data, in pt5161l_init_debugfs()
579 debugfs_create_file("fw_load_status", 0444, data->debugfs, data, in pt5161l_init_debugfs()
582 debugfs_create_file("heartbeat_status", 0444, data->debugfs, data, in pt5161l_init_debugfs()
590 struct device *dev = &client->dev; in pt5161l_probe()
592 struct pt5161l_data *data; in pt5161l_probe() local
594 data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); in pt5161l_probe()
595 if (!data) in pt5161l_probe()
596 return -ENOMEM; in pt5161l_probe()
598 data->client = client; in pt5161l_probe()
599 mutex_init(&data->lock); in pt5161l_probe()
600 pt5161l_init_dev(data); in pt5161l_probe()
601 dev_set_drvdata(dev, data); in pt5161l_probe()
603 hwmon_dev = devm_hwmon_device_register_with_info(dev, client->name, in pt5161l_probe()
604 data, in pt5161l_probe()
608 pt5161l_init_debugfs(data); in pt5161l_probe()
615 struct pt5161l_data *data = i2c_get_clientdata(client); in pt5161l_remove() local
617 debugfs_remove_recursive(data->debugfs); in pt5161l_remove()