Skip to content

Commit

Permalink
spi/fsl_spi: fix CPM spi driver
Browse files Browse the repository at this point in the history
This patch fixes the freescale spi driver for CPM. Without this
patch SPI on CPM failed because cpm_muram_alloc_fixed tries to
allocate muram in an preserved area. The error reported was:

mpc8xxx_spi f0011a80.spi: can't allocate spi parameter ram
mpc8xxx_spi: probe of f0011a80.spi failed with error -12

Now the driver uses of_iomap to get access to this area
similar to i2c driver driver in the i2c-cpm.c which has a
similar device tree node. This is tested on a MPC8247 with CPM2.

Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
Signed-off-by: Grant Likely <grant.likely@secretlab.ca>
  • Loading branch information
Holger Brunck authored and Grant Likely committed Jul 5, 2011
1 parent c25ded1 commit fb64409
Showing 1 changed file with 11 additions and 17 deletions.
28 changes: 11 additions & 17 deletions drivers/spi/spi-fsl-spi.c
Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,7 @@ static unsigned long fsl_spi_cpm_get_pram(struct mpc8xxx_spi *mspi)
struct device_node *np = dev->of_node;
const u32 *iprop;
int size;
unsigned long spi_base_ofs;
void __iomem *spi_base;
unsigned long pram_ofs = -ENOMEM;

/* Can't use of_address_to_resource(), QE muram isn't at 0. */
Expand All @@ -702,33 +702,27 @@ static unsigned long fsl_spi_cpm_get_pram(struct mpc8xxx_spi *mspi)
return pram_ofs;
}

/* CPM1 and CPM2 pram must be at a fixed addr. */
if (!iprop || size != sizeof(*iprop) * 4)
return -ENOMEM;

spi_base_ofs = cpm_muram_alloc_fixed(iprop[2], 2);
if (IS_ERR_VALUE(spi_base_ofs))
return -ENOMEM;
spi_base = of_iomap(np, 1);
if (spi_base == NULL)
return -EINVAL;

if (mspi->flags & SPI_CPM2) {
pram_ofs = cpm_muram_alloc(SPI_PRAM_SIZE, 64);
if (!IS_ERR_VALUE(pram_ofs)) {
u16 __iomem *spi_base = cpm_muram_addr(spi_base_ofs);

out_be16(spi_base, pram_ofs);
}
out_be16(spi_base, pram_ofs);
} else {
struct spi_pram __iomem *pram = cpm_muram_addr(spi_base_ofs);
struct spi_pram __iomem *pram = spi_base;
u16 rpbase = in_be16(&pram->rpbase);

/* Microcode relocation patch applied? */
if (rpbase)
pram_ofs = rpbase;
else
return spi_base_ofs;
else {
pram_ofs = cpm_muram_alloc(SPI_PRAM_SIZE, 64);
out_be16(spi_base, pram_ofs);
}
}

cpm_muram_free(spi_base_ofs);
iounmap(spi_base);
return pram_ofs;
}

Expand Down

0 comments on commit fb64409

Please sign in to comment.