static int es705_slim_read(struct es705_priv *es705, void *rspn, int len)
{
	int rc = 0;
	int i;
	struct slim_device *sbdev = es705->gen0_client;

	struct slim_ele_access msg = {
		.start_offset = ES705_READ_VE_OFFSET,
		.num_bytes = ES705_READ_VE_WIDTH,
		.comp = NULL,
	};
	BUG_ON(len < 0);

	for (i = 0; i < MAX_SMB_TRIALS; i++) {
		char buf[4] = {0};

		rc = slim_request_val_element(sbdev, &msg, buf, 4);
		memcpy(rspn, buf, 4);
		if (!rc)
			break;
		usleep_range(SMB_DELAY, SMB_DELAY);
	}
	if (i == MAX_SMB_TRIALS)
		dev_err(&sbdev->dev, "%s(): reach SLIMBus read trials (%d)\n",
			__func__, MAX_SMB_TRIALS);
	return rc;
}
Example #2
0
int escore_slim_read(struct escore_priv *escore, void *buf, int len)
{
	int retry = MAX_SMB_TRIALS;
	int rc;
	struct slim_device *sbdev = escore->gen0_client;
	DECLARE_COMPLETION_ONSTACK(read_done);
	struct slim_ele_access msg = {
		.start_offset = ES_READ_VE_OFFSET,
		.num_bytes = ES_READ_VE_WIDTH,
		.comp = NULL,
	};

	rc = slim_get_logical_addr(sbdev, escore->gen0_client->e_addr,
			6, &(escore->gen0_client->laddr));
	if (rc)
		dev_err(&sbdev->dev, "%s(): get logical addr err %d\n",
							__func__, rc);

	do {
		rc = slim_request_val_element(sbdev, &msg, buf, len);
		if (rc != 0)
			dev_warn(&sbdev->dev,
				"%s: Warnning read failed rc=%d\n",
				__func__, rc);
		else
			break;
		usleep_range(SMB_DELAY, SMB_DELAY);
	} while (--retry);

	if (rc != 0)
		dev_err(&sbdev->dev,
			"%s: Error read failed rc=%d after %d retries\n",
			__func__, rc, MAX_SMB_TRIALS);

	return rc;
}