summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx31/spi-imx31.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2011-12-26 15:30:51 +0000
committerMichael Sevakis <jethead71@rockbox.org>2011-12-26 15:30:51 +0000
commitd56daa1f7e4e9d6e9fc16e65864b671971708009 (patch)
treeafafa546f315c75b1372fddf5838c225166d3bdc /firmware/target/arm/imx31/spi-imx31.c
parent0726b17667e55455e8af868c687fe11286cccaa2 (diff)
downloadrockbox-d56daa1f7e4e9d6e9fc16e65864b671971708009.tar.gz
rockbox-d56daa1f7e4e9d6e9fc16e65864b671971708009.zip
i.MX31: Silly little change to enable/disable a SPI
Unify spi_enable/disable_module into one spi_enable_module call for API consistency's sake with I2C driver. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@31441 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/imx31/spi-imx31.c')
-rw-r--r--firmware/target/arm/imx31/spi-imx31.c59
1 files changed, 29 insertions, 30 deletions
diff --git a/firmware/target/arm/imx31/spi-imx31.c b/firmware/target/arm/imx31/spi-imx31.c
index ea3d2f8d77..076ce7cd7b 100644
--- a/firmware/target/arm/imx31/spi-imx31.c
+++ b/firmware/target/arm/imx31/spi-imx31.c
@@ -55,7 +55,7 @@ static struct spi_module_desc
55 const struct spi_node *last_node; /* Last node used for module */ 55 const struct spi_node *last_node; /* Last node used for module */
56 void (* const handler)(void); /* Interrupt handler */ 56 void (* const handler)(void); /* Interrupt handler */
57 int rxcount; /* Independent copy of txcount */ 57 int rxcount; /* Independent copy of txcount */
58 int8_t enab; /* Enable count */ 58 int8_t enable; /* Enable count */
59 int8_t byte_size; /* Size of transfers in bytes */ 59 int8_t byte_size; /* Size of transfers in bytes */
60 const int8_t cg; /* Clock-gating value */ 60 const int8_t cg; /* Clock-gating value */
61 const int8_t ints; /* AVIC vector number */ 61 const int8_t ints; /* AVIC vector number */
@@ -102,7 +102,7 @@ static bool spi_set_context(struct spi_module_desc *desc,
102 const struct spi_node * const node = xfer->node; 102 const struct spi_node * const node = xfer->node;
103 volatile unsigned long * const base = desc->base; 103 volatile unsigned long * const base = desc->base;
104 104
105 if (desc->enab == 0) 105 if (desc->enable == 0)
106 return false; 106 return false;
107 107
108 if (node == desc->last_node) 108 if (node == desc->last_node)
@@ -354,43 +354,42 @@ void INIT_ATTR spi_init(void)
354 } 354 }
355} 355}
356 356
357/* Enable the specified module for the node */ 357/* Enable or disable the specified module for the node */
358void spi_enable_module(const struct spi_node *node) 358void spi_enable_module(const struct spi_node *node, bool enable)
359{ 359{
360 struct spi_module_desc * const desc = &spi_descs[node->num]; 360 struct spi_module_desc * const desc = &spi_descs[node->num];
361 361
362 if (++desc->enab == 1) 362 if (enable)
363 { 363 {
364 /* Enable clock-gating register */ 364 if (++desc->enable == 1)
365 ccm_module_clock_gating(desc->cg, CGM_ON_RUN_WAIT); 365 {
366 /* Reset */ 366 /* Enable clock-gating register */
367 spi_reset(desc); 367 ccm_module_clock_gating(desc->cg, CGM_ON_RUN_WAIT);
368 desc->last_node = NULL; 368 /* Reset */
369 /* Enable interrupt at controller level */ 369 spi_reset(desc);
370 avic_enable_int(desc->ints, INT_TYPE_IRQ, INT_PRIO_DEFAULT, 370 desc->last_node = NULL;
371 desc->handler); 371 /* Enable interrupt at controller level */
372 avic_enable_int(desc->ints, INT_TYPE_IRQ, INT_PRIO_DEFAULT,
373 desc->handler);
374 }
372 } 375 }
373} 376 else
374
375/* Disable the specified module for the node */
376void spi_disable_module(const struct spi_node *node)
377{
378 struct spi_module_desc * const desc = &spi_descs[node->num];
379
380 if (desc->enab > 0 && --desc->enab == 0)
381 { 377 {
382 /* Last enable for this module */ 378 if (desc->enable > 0 && --desc->enable == 0)
383 /* Wait for outstanding transactions */ 379 {
384 while (*(void ** volatile)&desc->head != NULL); 380 /* Last enable for this module */
381 /* Wait for outstanding transactions */
382 while (*(void ** volatile)&desc->head != NULL);
385 383
386 /* Disable interrupt at controller level */ 384 /* Disable interrupt at controller level */
387 avic_disable_int(desc->ints); 385 avic_disable_int(desc->ints);
388 386
389 /* Disable interface */ 387 /* Disable interface */
390 desc->base[CONREG] &= ~CSPI_CONREG_EN; 388 desc->base[CONREG] &= ~CSPI_CONREG_EN;
391 389
392 /* Disable interface clock */ 390 /* Disable interface clock */
393 ccm_module_clock_gating(desc->cg, CGM_OFF); 391 ccm_module_clock_gating(desc->cg, CGM_OFF);
392 }
394 } 393 }
395} 394}
396 395