diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/spi/spi_mpc8xxx.c | 56 |
1 files changed, 24 insertions, 32 deletions
diff --git a/drivers/spi/spi_mpc8xxx.c b/drivers/spi/spi_mpc8xxx.c index 518671b8afe5..4b119eaf4e6b 100644 --- a/drivers/spi/spi_mpc8xxx.c +++ b/drivers/spi/spi_mpc8xxx.c | |||
@@ -155,6 +155,26 @@ MPC83XX_SPI_TX_BUF(u8) | |||
155 | MPC83XX_SPI_TX_BUF(u16) | 155 | MPC83XX_SPI_TX_BUF(u16) |
156 | MPC83XX_SPI_TX_BUF(u32) | 156 | MPC83XX_SPI_TX_BUF(u32) |
157 | 157 | ||
158 | static void mpc8xxx_spi_change_mode(struct spi_device *spi) | ||
159 | { | ||
160 | struct mpc8xxx_spi *mspi = spi_master_get_devdata(spi->master); | ||
161 | struct spi_mpc8xxx_cs *cs = spi->controller_state; | ||
162 | __be32 __iomem *mode = &mspi->base->mode; | ||
163 | unsigned long flags; | ||
164 | |||
165 | if (cs->hw_mode == mpc8xxx_spi_read_reg(mode)) | ||
166 | return; | ||
167 | |||
168 | /* Turn off IRQs locally to minimize time that SPI is disabled. */ | ||
169 | local_irq_save(flags); | ||
170 | |||
171 | /* Turn off SPI unit prior changing mode */ | ||
172 | mpc8xxx_spi_write_reg(mode, cs->hw_mode & ~SPMODE_ENABLE); | ||
173 | mpc8xxx_spi_write_reg(mode, cs->hw_mode); | ||
174 | |||
175 | local_irq_restore(flags); | ||
176 | } | ||
177 | |||
158 | static void mpc8xxx_spi_chipselect(struct spi_device *spi, int value) | 178 | static void mpc8xxx_spi_chipselect(struct spi_device *spi, int value) |
159 | { | 179 | { |
160 | struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); | 180 | struct mpc8xxx_spi *mpc8xxx_spi = spi_master_get_devdata(spi->master); |
@@ -168,27 +188,13 @@ static void mpc8xxx_spi_chipselect(struct spi_device *spi, int value) | |||
168 | } | 188 | } |
169 | 189 | ||
170 | if (value == BITBANG_CS_ACTIVE) { | 190 | if (value == BITBANG_CS_ACTIVE) { |
171 | u32 regval = mpc8xxx_spi_read_reg(&mpc8xxx_spi->base->mode); | ||
172 | |||
173 | mpc8xxx_spi->rx_shift = cs->rx_shift; | 191 | mpc8xxx_spi->rx_shift = cs->rx_shift; |
174 | mpc8xxx_spi->tx_shift = cs->tx_shift; | 192 | mpc8xxx_spi->tx_shift = cs->tx_shift; |
175 | mpc8xxx_spi->get_rx = cs->get_rx; | 193 | mpc8xxx_spi->get_rx = cs->get_rx; |
176 | mpc8xxx_spi->get_tx = cs->get_tx; | 194 | mpc8xxx_spi->get_tx = cs->get_tx; |
177 | 195 | ||
178 | if (cs->hw_mode != regval) { | 196 | mpc8xxx_spi_change_mode(spi); |
179 | unsigned long flags; | 197 | |
180 | __be32 __iomem *mode = &mpc8xxx_spi->base->mode; | ||
181 | |||
182 | regval = cs->hw_mode; | ||
183 | /* Turn off IRQs locally to minimize time that | ||
184 | * SPI is disabled | ||
185 | */ | ||
186 | local_irq_save(flags); | ||
187 | /* Turn off SPI unit prior changing mode */ | ||
188 | mpc8xxx_spi_write_reg(mode, regval & ~SPMODE_ENABLE); | ||
189 | mpc8xxx_spi_write_reg(mode, regval); | ||
190 | local_irq_restore(flags); | ||
191 | } | ||
192 | if (pdata->cs_control) | 198 | if (pdata->cs_control) |
193 | pdata->cs_control(spi, pol); | 199 | pdata->cs_control(spi, pol); |
194 | } | 200 | } |
@@ -198,7 +204,6 @@ static | |||
198 | int mpc8xxx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | 204 | int mpc8xxx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) |
199 | { | 205 | { |
200 | struct mpc8xxx_spi *mpc8xxx_spi; | 206 | struct mpc8xxx_spi *mpc8xxx_spi; |
201 | u32 regval; | ||
202 | u8 bits_per_word, pm; | 207 | u8 bits_per_word, pm; |
203 | u32 hz; | 208 | u32 hz; |
204 | struct spi_mpc8xxx_cs *cs = spi->controller_state; | 209 | struct spi_mpc8xxx_cs *cs = spi->controller_state; |
@@ -286,21 +291,8 @@ int mpc8xxx_spi_setup_transfer(struct spi_device *spi, struct spi_transfer *t) | |||
286 | pm--; | 291 | pm--; |
287 | 292 | ||
288 | cs->hw_mode |= SPMODE_PM(pm); | 293 | cs->hw_mode |= SPMODE_PM(pm); |
289 | regval = mpc8xxx_spi_read_reg(&mpc8xxx_spi->base->mode); | 294 | |
290 | if (cs->hw_mode != regval) { | 295 | mpc8xxx_spi_change_mode(spi); |
291 | unsigned long flags; | ||
292 | __be32 __iomem *mode = &mpc8xxx_spi->base->mode; | ||
293 | |||
294 | regval = cs->hw_mode; | ||
295 | /* Turn off IRQs locally to minimize time | ||
296 | * that SPI is disabled | ||
297 | */ | ||
298 | local_irq_save(flags); | ||
299 | /* Turn off SPI unit prior changing mode */ | ||
300 | mpc8xxx_spi_write_reg(mode, regval & ~SPMODE_ENABLE); | ||
301 | mpc8xxx_spi_write_reg(mode, regval); | ||
302 | local_irq_restore(flags); | ||
303 | } | ||
304 | return 0; | 296 | return 0; |
305 | } | 297 | } |
306 | 298 | ||