m68knommu: fix problems with SPI/GPIO on ColdFire 520x
The problem has its root in the calculation of the set-port offsets (macro MCFGPIO_SETR() in arch/m68k/include/asm/gpio.h), this assumes that all ports have the same offset from the base port address (MCFGPIO_SETR) which is defined in mcf520xsim.h as an alias of MCFGIO_PSETR_BUSCTL. Because the BUSCTL and BE port do not have a set-register (see MCF5208 Reference Manual Page 13-10, Table 13-3) the offset calculations went wrong. Because the BE and BUSCTL port do not seem useful in these parts, as they lack a set register, I removed them and adapted the gpio chip bases which are also used for the offset-calculations. Now both setting and resetting the chip selects works as expected from userland and from the kernelspace. Signed-off-by: Peter Turczak <peter@turczak.de> Signed-off-by: Greg Ungerer <gerg@uclinux.org>
Este commit está contenido en:

cometido por
Greg Ungerer

padre
f230e80b42
commit
89127ed381
@@ -91,9 +91,9 @@ static struct resource m520x_qspi_resources[] = {
|
||||
},
|
||||
};
|
||||
|
||||
#define MCFQSPI_CS0 62
|
||||
#define MCFQSPI_CS1 63
|
||||
#define MCFQSPI_CS2 44
|
||||
#define MCFQSPI_CS0 46
|
||||
#define MCFQSPI_CS1 47
|
||||
#define MCFQSPI_CS2 27
|
||||
|
||||
static int m520x_cs_setup(struct mcfqspi_cs_control *cs_control)
|
||||
{
|
||||
|
@@ -36,42 +36,6 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.podr = (void __iomem *) MCFEPORT_EPDR,
|
||||
.ppdr = (void __iomem *) MCFEPORT_EPPDR,
|
||||
},
|
||||
{
|
||||
.gpio_chip = {
|
||||
.label = "BUSCTL",
|
||||
.request = mcf_gpio_request,
|
||||
.free = mcf_gpio_free,
|
||||
.direction_input = mcf_gpio_direction_input,
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 8,
|
||||
.ngpio = 4,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BUSCTL,
|
||||
.podr = (void __iomem *) MCFGPIO_PODR_BUSCTL,
|
||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BUSCTL,
|
||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BUSCTL,
|
||||
},
|
||||
{
|
||||
.gpio_chip = {
|
||||
.label = "BE",
|
||||
.request = mcf_gpio_request,
|
||||
.free = mcf_gpio_free,
|
||||
.direction_input = mcf_gpio_direction_input,
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 16,
|
||||
.ngpio = 4,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_BE,
|
||||
.podr = (void __iomem *) MCFGPIO_PODR_BE,
|
||||
.ppdr = (void __iomem *) MCFGPIO_PPDSDR_BE,
|
||||
.setr = (void __iomem *) MCFGPIO_PPDSDR_BE,
|
||||
.clrr = (void __iomem *) MCFGPIO_PCLRR_BE,
|
||||
},
|
||||
{
|
||||
.gpio_chip = {
|
||||
.label = "CS",
|
||||
@@ -81,7 +45,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 25,
|
||||
.base = 9,
|
||||
.ngpio = 3,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_CS,
|
||||
@@ -99,7 +63,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 32,
|
||||
.base = 16,
|
||||
.ngpio = 4,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECI2C,
|
||||
@@ -117,7 +81,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 40,
|
||||
.base = 24,
|
||||
.ngpio = 4,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_QSPI,
|
||||
@@ -135,7 +99,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 48,
|
||||
.base = 32,
|
||||
.ngpio = 4,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_TIMER,
|
||||
@@ -153,7 +117,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 56,
|
||||
.base = 40,
|
||||
.ngpio = 8,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_UART,
|
||||
@@ -171,7 +135,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 64,
|
||||
.base = 48,
|
||||
.ngpio = 8,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECH,
|
||||
@@ -189,7 +153,7 @@ static struct mcf_gpio_chip mcf_gpio_chips[] = {
|
||||
.direction_output = mcf_gpio_direction_output,
|
||||
.get = mcf_gpio_get_value,
|
||||
.set = mcf_gpio_set_value_fast,
|
||||
.base = 72,
|
||||
.base = 56,
|
||||
.ngpio = 8,
|
||||
},
|
||||
.pddr = (void __iomem *) MCFGPIO_PDDR_FECL,
|
||||
|
Referencia en una nueva incidencia
Block a user