|
@@ -286,36 +286,12 @@ static void mpc8xxx_spi_chipselect(struct spi_device *spi, int value)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static
|
|
|
-int mpc8xxx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
|
|
|
+static int
|
|
|
+mspi_apply_cpu_mode_quirks(struct spi_mpc8xxx_cs *cs,
|
|
|
+ struct spi_device *spi,
|
|
|
+ struct mpc8xxx_spi *mpc8xxx_spi,
|
|
|
+ int bits_per_word)
|
|
|
{
|
|
|
- struct mpc8xxx_spi *mpc8xxx_spi;
|
|
|
- u8 bits_per_word, pm;
|
|
|
- u32 hz;
|
|
|
- struct spi_mpc8xxx_cs *cs = spi->controller_state;
|
|
|
-
|
|
|
- mpc8xxx_spi = spi_master_get_devdata(spi->master);
|
|
|
-
|
|
|
- if (t) {
|
|
|
- bits_per_word = t->bits_per_word;
|
|
|
- hz = t->speed_hz;
|
|
|
- } else {
|
|
|
- bits_per_word = 0;
|
|
|
- hz = 0;
|
|
|
- }
|
|
|
-
|
|
|
- /* spi_transfer level calls that work per-word */
|
|
|
- if (!bits_per_word)
|
|
|
- bits_per_word = spi->bits_per_word;
|
|
|
-
|
|
|
- /* Make sure its a bit width we support [4..16, 32] */
|
|
|
- if ((bits_per_word < 4)
|
|
|
- || ((bits_per_word > 16) && (bits_per_word != 32)))
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- if (!hz)
|
|
|
- hz = spi->max_speed_hz;
|
|
|
-
|
|
|
cs->rx_shift = 0;
|
|
|
cs->tx_shift = 0;
|
|
|
if (bits_per_word <= 8) {
|
|
@@ -339,19 +315,82 @@ int mpc8xxx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
|
|
|
return -EINVAL;
|
|
|
|
|
|
if (mpc8xxx_spi->flags & SPI_QE_CPU_MODE &&
|
|
|
- spi->mode & SPI_LSB_FIRST) {
|
|
|
+ spi->mode & SPI_LSB_FIRST) {
|
|
|
cs->tx_shift = 0;
|
|
|
if (bits_per_word <= 8)
|
|
|
cs->rx_shift = 8;
|
|
|
else
|
|
|
cs->rx_shift = 0;
|
|
|
}
|
|
|
-
|
|
|
mpc8xxx_spi->rx_shift = cs->rx_shift;
|
|
|
mpc8xxx_spi->tx_shift = cs->tx_shift;
|
|
|
mpc8xxx_spi->get_rx = cs->get_rx;
|
|
|
mpc8xxx_spi->get_tx = cs->get_tx;
|
|
|
|
|
|
+ return bits_per_word;
|
|
|
+}
|
|
|
+
|
|
|
+static int
|
|
|
+mspi_apply_qe_mode_quirks(struct spi_mpc8xxx_cs *cs,
|
|
|
+ struct spi_device *spi,
|
|
|
+ int bits_per_word)
|
|
|
+{
|
|
|
+ /* QE uses Little Endian for words > 8
|
|
|
+ * so transform all words > 8 into 8 bits
|
|
|
+ * Unfortnatly that doesn't work for LSB so
|
|
|
+ * reject these for now */
|
|
|
+ /* Note: 32 bits word, LSB works iff
|
|
|
+ * tfcr/rfcr is set to CPMFCR_GBL */
|
|
|
+ if (spi->mode & SPI_LSB_FIRST &&
|
|
|
+ bits_per_word > 8)
|
|
|
+ return -EINVAL;
|
|
|
+ if (bits_per_word > 8)
|
|
|
+ return 8; /* pretend its 8 bits */
|
|
|
+ return bits_per_word;
|
|
|
+}
|
|
|
+
|
|
|
+static
|
|
|
+int mpc8xxx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
|
|
|
+{
|
|
|
+ struct mpc8xxx_spi *mpc8xxx_spi;
|
|
|
+ int bits_per_word;
|
|
|
+ u8 pm;
|
|
|
+ u32 hz;
|
|
|
+ struct spi_mpc8xxx_cs *cs = spi->controller_state;
|
|
|
+
|
|
|
+ mpc8xxx_spi = spi_master_get_devdata(spi->master);
|
|
|
+
|
|
|
+ if (t) {
|
|
|
+ bits_per_word = t->bits_per_word;
|
|
|
+ hz = t->speed_hz;
|
|
|
+ } else {
|
|
|
+ bits_per_word = 0;
|
|
|
+ hz = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* spi_transfer level calls that work per-word */
|
|
|
+ if (!bits_per_word)
|
|
|
+ bits_per_word = spi->bits_per_word;
|
|
|
+
|
|
|
+ /* Make sure its a bit width we support [4..16, 32] */
|
|
|
+ if ((bits_per_word < 4)
|
|
|
+ || ((bits_per_word > 16) && (bits_per_word != 32)))
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ if (!hz)
|
|
|
+ hz = spi->max_speed_hz;
|
|
|
+
|
|
|
+ if (!(mpc8xxx_spi->flags & SPI_CPM_MODE))
|
|
|
+ bits_per_word = mspi_apply_cpu_mode_quirks(cs, spi,
|
|
|
+ mpc8xxx_spi,
|
|
|
+ bits_per_word);
|
|
|
+ else if (mpc8xxx_spi->flags & SPI_QE)
|
|
|
+ bits_per_word = mspi_apply_qe_mode_quirks(cs, spi,
|
|
|
+ bits_per_word);
|
|
|
+
|
|
|
+ if (bits_per_word < 0)
|
|
|
+ return bits_per_word;
|
|
|
+
|
|
|
if (bits_per_word == 32)
|
|
|
bits_per_word = 0;
|
|
|
else
|