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

Commit bb9c5687 authored by Kuninori Morimoto's avatar Kuninori Morimoto Committed by Grant Likely
Browse files

spi: sh-hspi: modify write/read method



Current sh-hspi had wrong write/read method which was not linux standard.
If spi_transfer requests tx[2], rx[2] len=2,
then, driver should run tx[0], rx[0], tx[1], rx[1].
But current sh-hspi runs tx[0], tx[1], rx[0], rx[1].
This patch fixes it up.

Signed-off-by: default avatarKuninori Morimoto <kuninori.morimoto.gx@renesas.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 49e599b8
Loading
Loading
Loading
Loading
+24 −69
Original line number Original line Diff line number Diff line
@@ -86,66 +86,6 @@ static int hspi_status_check_timeout(struct hspi_priv *hspi, u32 mask, u32 val)
	return -ETIMEDOUT;
	return -ETIMEDOUT;
}
}


static int hspi_push(struct hspi_priv *hspi, struct spi_message *msg,
		     struct spi_transfer *t)
{
	int i, ret;
	u8 *data = (u8 *)t->tx_buf;

	/*
	 * FIXME
	 * very simple, but polling transfer
	 */
	for (i = 0; i < t->len; i++) {
		/* wait remains */
		ret = hspi_status_check_timeout(hspi, 0x1, 0x0);
		if (ret < 0)
			return ret;

		hspi_write(hspi, SPTBR, (u32)data[i]);

		/* wait recive */
		ret = hspi_status_check_timeout(hspi, 0x4, 0x4);
		if (ret < 0)
			return ret;

		/* dummy read */
		hspi_read(hspi, SPRBR);
	}

	return 0;
}

static int hspi_pop(struct hspi_priv *hspi, struct spi_message *msg,
		    struct spi_transfer *t)
{
	int i, ret;
	u8 *data = (u8 *)t->rx_buf;

	/*
	 * FIXME
	 * very simple, but polling receive
	 */
	for (i = 0; i < t->len; i++) {
		/* wait remains */
		ret = hspi_status_check_timeout(hspi, 0x1, 0);
		if (ret < 0)
			return ret;

		/* dummy write */
		hspi_write(hspi, SPTBR, 0x0);

		/* wait recive */
		ret = hspi_status_check_timeout(hspi, 0x4, 0x4);
		if (ret < 0)
			return ret;

		data[i] = (u8)hspi_read(hspi, SPRBR);
	}

	return 0;
}

/*
/*
 *		spi master function
 *		spi master function
 */
 */
@@ -223,7 +163,9 @@ static int hspi_transfer_one_message(struct spi_master *master,
{
{
	struct hspi_priv *hspi = spi_master_get_devdata(master);
	struct hspi_priv *hspi = spi_master_get_devdata(master);
	struct spi_transfer *t;
	struct spi_transfer *t;
	int ret;
	u32 tx;
	u32 rx;
	int ret, i;


	dev_dbg(hspi->dev, "%s\n", __func__);
	dev_dbg(hspi->dev, "%s\n", __func__);


@@ -231,19 +173,32 @@ static int hspi_transfer_one_message(struct spi_master *master,
	list_for_each_entry(t, &msg->transfers, transfer_list) {
	list_for_each_entry(t, &msg->transfers, transfer_list) {
		hspi_hw_setup(hspi, msg, t);
		hspi_hw_setup(hspi, msg, t);


		if (t->tx_buf) {
		for (i = 0; i < t->len; i++) {
			ret = hspi_push(hspi, msg, t);

			/* wait remains */
			ret = hspi_status_check_timeout(hspi, 0x1, 0);
			if (ret < 0)
			if (ret < 0)
				goto error;
				break;
		}

		if (t->rx_buf) {
			tx = 0;
			ret = hspi_pop(hspi, msg, t);
			if (t->tx_buf)
				tx = (u32)((u8 *)t->tx_buf)[i];

			hspi_write(hspi, SPTBR, tx);

			/* wait recive */
			ret = hspi_status_check_timeout(hspi, 0x4, 0x4);
			if (ret < 0)
			if (ret < 0)
				goto error;
				break;

			rx = hspi_read(hspi, SPRBR);
			if (t->rx_buf)
				((u8 *)t->rx_buf)[i] = (u8)rx;

		}
		}

		msg->actual_length += t->len;
		msg->actual_length += t->len;
	}
	}
error:


	msg->status = ret;
	msg->status = ret;
	spi_finalize_current_message(master);
	spi_finalize_current_message(master);