2014-09-27 19:11:37 +00:00
|
|
|
From 3eae00b73609f4e5a19260bfa4ca9021f295c0af Mon Sep 17 00:00:00 2001
|
|
|
|
From: Gordon Hollingworth <gordon@holliweb.co.uk>
|
|
|
|
Date: Fri, 2 May 2014 16:13:59 +0100
|
|
|
|
Subject: [PATCH 53/54] Move GPIO setup to hw_params.
|
|
|
|
|
|
|
|
This is used to stop the I2S driver from breaking
|
|
|
|
the GPIO setup for other uses of the PCM interface
|
|
|
|
---
|
|
|
|
sound/soc/bcm/bcm2708-i2s.c | 55 +++++++++++++++++++++++----------------------
|
|
|
|
1 file changed, 28 insertions(+), 27 deletions(-)
|
|
|
|
|
|
|
|
--- a/sound/soc/bcm/bcm2708-i2s.c
|
|
|
|
+++ b/sound/soc/bcm/bcm2708-i2s.c
|
2014-12-08 12:04:25 +00:00
|
|
|
@@ -305,6 +305,31 @@ static int bcm2708_i2s_set_dai_bclk_rati
|
2014-09-27 19:11:37 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+static void bcm2708_i2s_setup_gpio(void)
|
|
|
|
+{
|
|
|
|
+ /*
|
|
|
|
+ * This is the common way to handle the GPIO pins for
|
|
|
|
+ * the Raspberry Pi.
|
|
|
|
+ * TODO Better way would be to handle
|
|
|
|
+ * this in the device tree!
|
|
|
|
+ */
|
|
|
|
+#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
|
|
|
|
+#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
|
|
|
|
+
|
|
|
|
+ unsigned int *gpio;
|
|
|
|
+ int pin;
|
|
|
|
+ gpio = ioremap(GPIO_BASE, SZ_16K);
|
|
|
|
+
|
|
|
|
+ /* SPI is on GPIO 7..11 */
|
|
|
|
+ for (pin = 28; pin <= 31; pin++) {
|
|
|
|
+ INP_GPIO(pin); /* set mode to GPIO input first */
|
|
|
|
+ SET_GPIO_ALT(pin, 2); /* set mode to ALT 0 */
|
|
|
|
+ }
|
|
|
|
+#undef INP_GPIO
|
|
|
|
+#undef SET_GPIO_ALT
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
static int bcm2708_i2s_hw_params(struct snd_pcm_substream *substream,
|
|
|
|
struct snd_pcm_hw_params *params,
|
|
|
|
struct snd_soc_dai *dai)
|
2014-12-08 12:04:25 +00:00
|
|
|
@@ -334,6 +359,9 @@ static int bcm2708_i2s_hw_params(struct
|
2014-09-27 19:11:37 +00:00
|
|
|
if (csreg & (BCM2708_I2S_TXON | BCM2708_I2S_RXON))
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
+
|
|
|
|
+ bcm2708_i2s_setup_gpio();
|
|
|
|
+
|
|
|
|
/*
|
|
|
|
* Adjust the data length according to the format.
|
|
|
|
* We prefill the half frame length with an integer
|
2014-12-08 12:04:25 +00:00
|
|
|
@@ -790,31 +818,6 @@ static const struct snd_soc_component_dr
|
2014-09-27 19:11:37 +00:00
|
|
|
.name = "bcm2708-i2s-comp",
|
|
|
|
};
|
|
|
|
|
|
|
|
-
|
|
|
|
-static void bcm2708_i2s_setup_gpio(void)
|
|
|
|
-{
|
|
|
|
- /*
|
|
|
|
- * This is the common way to handle the GPIO pins for
|
|
|
|
- * the Raspberry Pi.
|
|
|
|
- * TODO Better way would be to handle
|
|
|
|
- * this in the device tree!
|
|
|
|
- */
|
|
|
|
-#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
|
|
|
|
-#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
|
|
|
|
-
|
|
|
|
- unsigned int *gpio;
|
|
|
|
- int pin;
|
|
|
|
- gpio = ioremap(GPIO_BASE, SZ_16K);
|
|
|
|
-
|
|
|
|
- /* SPI is on GPIO 7..11 */
|
|
|
|
- for (pin = 28; pin <= 31; pin++) {
|
|
|
|
- INP_GPIO(pin); /* set mode to GPIO input first */
|
|
|
|
- SET_GPIO_ALT(pin, 2); /* set mode to ALT 0 */
|
|
|
|
- }
|
|
|
|
-#undef INP_GPIO
|
|
|
|
-#undef SET_GPIO_ALT
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
static const struct snd_pcm_hardware bcm2708_pcm_hardware = {
|
|
|
|
.info = SNDRV_PCM_INFO_INTERLEAVED |
|
|
|
|
SNDRV_PCM_INFO_JOINT_DUPLEX,
|
2014-12-08 12:04:25 +00:00
|
|
|
@@ -865,8 +868,6 @@ static int bcm2708_i2s_probe(struct plat
|
2014-09-27 19:11:37 +00:00
|
|
|
if (IS_ERR(dev))
|
|
|
|
return PTR_ERR(dev);
|
|
|
|
|
|
|
|
- bcm2708_i2s_setup_gpio();
|
|
|
|
-
|
|
|
|
dev->i2s_regmap = regmap[0];
|
|
|
|
dev->clk_regmap = regmap[1];
|
|
|
|
|