[PATCH 00/11] ARM: at91: remove !DT support for at91rm9200

Arnd Bergmann arnd at arndb.de
Thu Nov 27 15:12:25 PST 2014


On Thursday 27 November 2014 18:12:43 Alexandre Belloni wrote:
> 
> As discussed some weeks ago, I prepared patches to switch sama5d[3-4] to
> multiplatform. We are still missing the SMC and matrix drivers to switch
> sam9 and rm9200.

I just looked at the drivers because I got curious, and to see if
there are still any low-hanging fruit, but I guess you already picked
them all ;-)

> The currently affected drivers are:
>  - drivers/ata/pata_at91.c (SMC)
>  - drivers/pcmcia/at91_cf.c (SMC)

I guess the SMC should live in drivers/memory with an interface
similar to mvebu-devbus.c?

Seems doable but nontrivial.

>  - drivers/usb/gadget/udc/at91_udc.c (Matrix, this is the only one
>    for sam9)

Is at91_matrix a pin controller? With the board files removed, the udc
driver has the only two remaining calls to at91_matrix_{read,write}
for setting the pullup, so that could be modeled as a trivial pinctrl
driver

>  - sound/atmel/ac97c.c (that one is still not converted to DT anyway...)

This one seems fairly straightforward to do, including a DT binding,
but the result is still ugly as it supports the at32 chips that
do things very differently.

The patch below gets it to compile and should be enough as a replacement
once a compatible string gets added.

>  - drivers/watchdog/at91rm9200_wdt.c (WIP, will be converted properly to
>    an MFD)

I think we discussed this one before. Remind me why we can't just convert
it to use watchdog_register() for simplification and then move whatever
remains into the arch/arm/mach-at91/at91rm9200_time.c file, or both
into drivers/clocksource.

	Arnd

8<----
ASoC: atmel/ac97c: remove platform_data dependency

As at91 gets changed to multiplatform, we can't use the mach/cpu.h
header any more, but this is ok as it only gets used to check for
cpu_is_at32ap7000(), which arch/avr32.

In order to make the driver work without platform_data, this also
changes the reset gpio line handling so it can look up the gpio
descriptor from DT. It is still missing a compatible string and
a binding that describes the valid DT properties.

Signed-off-by: Arnd Bergmann <arnd at arndb.de>

diff --git a/sound/atmel/ac97c.c b/sound/atmel/ac97c.c
index b59427d5a697..4eec216b7f92 100644
--- a/sound/atmel/ac97c.c
+++ b/sound/atmel/ac97c.c
@@ -34,10 +34,10 @@
 #include <linux/platform_data/dma-dw.h>
 #include <linux/dma/dw.h>
 
+#ifdef CONFIG_AVR32
 #include <mach/cpu.h>
-
-#ifdef CONFIG_ARCH_AT91
-#include <mach/hardware.h>
+#else
+#define cpu_is_at32ap7000() (0)
 #endif
 
 #include "ac97c.h"
@@ -78,7 +78,7 @@ struct atmel_ac97c {
 	void __iomem			*regs;
 	int				irq;
 	int				opened;
-	int				reset_pin;
+	struct gpio_desc		*reset_pin;
 };
 
 #define get_chip(card) ((struct atmel_ac97c *)(card)->private_data)
@@ -890,11 +890,11 @@ static void atmel_ac97c_reset(struct atmel_ac97c *chip)
 	ac97c_writel(chip, CAMR, 0);
 	ac97c_writel(chip, COMR, 0);
 
-	if (gpio_is_valid(chip->reset_pin)) {
-		gpio_set_value(chip->reset_pin, 0);
+	if (chip->reset_pin) {
+		gpiod_set_value(chip->reset_pin, 0);
 		/* AC97 v2.2 specifications says minimum 1 us. */
 		udelay(2);
-		gpio_set_value(chip->reset_pin, 1);
+		gpiod_set_value(chip->reset_pin, 1);
 	} else {
 		ac97c_writel(chip, MR, AC97C_MR_WRST | AC97C_MR_ENA);
 		udelay(2);
@@ -923,7 +923,7 @@ static int atmel_ac97c_probe(struct platform_device *pdev)
 	}
 
 	pdata = pdev->dev.platform_data;
-	if (!pdata) {
+	if (cpu_is_at32ap7000() && !pdata) {
 		dev_dbg(&pdev->dev, "no platform data\n");
 		return -ENXIO;
 	}
@@ -980,16 +980,18 @@ static int atmel_ac97c_probe(struct platform_device *pdev)
 		goto err_ioremap;
 	}
 
-	if (gpio_is_valid(pdata->reset_pin)) {
-		if (gpio_request(pdata->reset_pin, "reset_pin")) {
+	if (pdata && gpio_is_valid(pdata->reset_pin)) {
+		if (devm_gpio_request(&pdev->dev, pdata->reset_pin, "reset")) {
 			dev_dbg(&pdev->dev, "reset pin not available\n");
-			chip->reset_pin = -ENODEV;
+			chip->reset_pin = NULL;
 		} else {
 			gpio_direction_output(pdata->reset_pin, 1);
-			chip->reset_pin = pdata->reset_pin;
+			chip->reset_pin = gpio_to_desc(pdata->reset_pin);
 		}
 	} else {
-		chip->reset_pin = -EINVAL;
+		chip->reset_pin = devm_gpiod_get(&pdev->dev, "reset", 0);
+		if (IS_ERR(chip->reset_pin))
+			chip->reset_pin = NULL;
 	}
 
 	atmel_ac97c_reset(chip);
@@ -1113,9 +1115,6 @@ err_dma:
 		chip->dma.tx_chan = NULL;
 	}
 err_ac97_bus:
-	if (gpio_is_valid(chip->reset_pin))
-		gpio_free(chip->reset_pin);
-
 	iounmap(chip->regs);
 err_ioremap:
 	free_irq(irq, chip);
@@ -1170,9 +1169,6 @@ static int atmel_ac97c_remove(struct platform_device *pdev)
 	struct snd_card *card = platform_get_drvdata(pdev);
 	struct atmel_ac97c *chip = get_chip(card);
 
-	if (gpio_is_valid(chip->reset_pin))
-		gpio_free(chip->reset_pin);
-
 	ac97c_writel(chip, CAMR, 0);
 	ac97c_writel(chip, COMR, 0);
 	ac97c_writel(chip, MR,   0);




More information about the linux-arm-kernel mailing list