Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e1c3f7ae authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "power: qpnp-fg: fix offset SRAM reads"

parents 6938afe9 2dfd495d
Loading
Loading
Loading
Loading
+39 −14
Original line number Diff line number Diff line
@@ -224,7 +224,7 @@ static struct fg_dbgfs dbgfs_data = {
"FG Debug-FS support\n"
"\n"
"Hierarchy schema:\n"
"/sys/kernel/debug/spmi\n"
"/sys/kernel/debug/fg_memif\n"
"       /help            -- Static help text\n"
"       /address  -- Starting register address for reads or writes\n"
"       /count    -- Number of registers to read (only used for reads)\n"
@@ -430,16 +430,23 @@ static int fg_set_ram_addr(struct fg_chip *chip, u16 *address)
	return rc;
}

#define BUF_LEN		4
static int fg_mem_read(struct fg_chip *chip, u8 *val, u16 address, int len,
		bool keep_access)
		int offset, bool keep_access)
{
	int rc = 0, user_cnt = 0;
	int rc = 0, user_cnt = 0, total_len = 0;
	u8 *rd_data = val;
	bool otp;
	char str[DEBUG_PRINT_BUFFER_SIZE];

	if (address < RAM_OFFSET)
		otp = 1;

	if (offset > 3) {
		pr_err("offset too large %d\n", offset);
		return -EINVAL;
	}

	user_cnt = atomic_add_return(1, &chip->memif_user_cnt);
	if (fg_debug_mask & FG_MEM_DEBUG_READS)
		pr_info("user_cnt %d\n", user_cnt);
@@ -459,22 +466,40 @@ static int fg_mem_read(struct fg_chip *chip, u8 *val, u16 address, int len,
		goto out;

	if (fg_debug_mask & FG_MEM_DEBUG_READS)
		pr_info("length %d addr=%02X\n", len, address);
		pr_info("length %d addr=%02X keep_access %d\n",
				len, address, keep_access);

	total_len = len;
	while (len > 0) {
		if (!offset) {
			rc = fg_read(chip, rd_data,
					chip->mem_base + MEM_INTF_RD_DATA0,
				(len > 4) ? 4 : len);
					(len > BUF_LEN) ? BUF_LEN : len);
		} else {
			rc = fg_read(chip, rd_data,
				chip->mem_base + MEM_INTF_RD_DATA0 + offset,
				BUF_LEN - offset);

			/* manually set address to allow continous reads */
			address += BUF_LEN;

			rc = fg_set_ram_addr(chip, &address);
			if (rc)
				goto out;
		}
		if (rc) {
			pr_err("spmi read failed: addr=%03x, rc=%d\n",
				chip->mem_base + MEM_INTF_RD_DATA0, rc);
			goto out;
		}
		rd_data += 4;
		if (len >= 4)
			len -= 4;
		else
			len = 0;
		rd_data += (BUF_LEN - offset);
		len -= (BUF_LEN - offset);
		offset = 0;
	}

	if (fg_debug_mask & FG_MEM_DEBUG_READS) {
		fill_string(str, DEBUG_PRINT_BUFFER_SIZE, val, total_len);
		pr_info("data: %s\n", str);
	}

out:
@@ -579,7 +604,7 @@ static int fg_mem_masked_write(struct fg_chip *chip, u16 addr,
	u8 reg[4];
	char str[DEBUG_PRINT_BUFFER_SIZE];

	rc = fg_mem_read(chip, reg, addr, 4, 1);
	rc = fg_mem_read(chip, reg, addr, 4, 0, 1);
	if (rc) {
		pr_err("spmi read failed: addr=%03X, rc=%d\n", addr, rc);
		return rc;
@@ -1261,7 +1286,7 @@ write_next_line_to_log(struct fg_trans *trans, int offset, size_t *pcnt)
		goto done;

	/* Read the desired number of "items" */
	rc = fg_mem_read(trans->chip, data, offset, items_to_read,
	rc = fg_mem_read(trans->chip, data, offset, items_to_read, 0,
				*pcnt > items_to_read ? 1 : 0);
	if (rc)
		return -EINVAL;