diff mbox

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

Message ID 3935244.Dm2HkZj2Bg@wuerfel (mailing list archive)
State New, archived
Headers show

Commit Message

Arnd Bergmann Nov. 27, 2014, 11:12 p.m. UTC
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@arndb.de>

Comments

Boris BREZILLON Nov. 27, 2014, 11:39 p.m. UTC | #1
Hi Arnd,

On Fri, 28 Nov 2014 00:12:25 +0100
Arnd Bergmann <arnd@arndb.de> wrote:

> 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?

Actually, there's some work in progress to support the EBI/SMC blocks
as a memory controller driver ;-):

http://thread.gmane.org/gmane.linux.kernel/1822096

I'll post a new version soon.

> 
> 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

The matrix block is containing several system configuration registers.
Most of them are related to AHB/APB bus config (master <-> slave
priority, burst and some other configs I don't remember).
Another register is here to define which HW logic is attached to an
external device connected through the EBI (External Bus Interface):
NAND, SDRAM, CompactFlash, ...
And, as you pointed out, there's a register to configure the pullup of
the UDC device.

As you can see, the matrix registers might be accessed by different
drivers (include the EBI/SMC driver), hence I proposed to expose them as
a syscon device (see the EBI/SMC series).

Best Regards,

Boris
Arnd Bergmann Nov. 27, 2014, 11:41 p.m. UTC | #2
On Friday 28 November 2014 00:39:38 Boris Brezillon wrote:
> Hi Arnd,
> 
> On Fri, 28 Nov 2014 00:12:25 +0100
> Arnd Bergmann <arnd@arndb.de> wrote:
> 
> > 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?
> 
> Actually, there's some work in progress to support the EBI/SMC blocks
> as a memory controller driver ;-):
> 
> http://thread.gmane.org/gmane.linux.kernel/1822096
> 
> I'll post a new version soon.

Ok, cool.

> > 
> > 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
> 
> The matrix block is containing several system configuration registers.
> Most of them are related to AHB/APB bus config (master <-> slave
> priority, burst and some other configs I don't remember).
> Another register is here to define which HW logic is attached to an
> external device connected through the EBI (External Bus Interface):
> NAND, SDRAM, CompactFlash, ...
> And, as you pointed out, there's a register to configure the pullup of
> the UDC device.
> 
> As you can see, the matrix registers might be accessed by different
> drivers (include the EBI/SMC driver), hence I proposed to expose them as
> a syscon device (see the EBI/SMC series).
> 

Sounds good.

	Arnd
Alexandre Belloni Nov. 28, 2014, 12:28 a.m. UTC | #3
On 28/11/2014 at 00:12:25 +0100, Arnd Bergmann wrote :
> 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 ;-)

Yeah, my main goal was to test multiplatform on sama5d3 and it was
actually quite easy. The worst still being rm9200 ;)

> 
> >  - 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.
> 

Actually, some work was done but we never saw an other version of the
series. Alexander, are you still interested? Else we can take the patch
below.

http://lists.infradead.org/pipermail/linux-arm-kernel/2014-April/246679.html

> >  - 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.
> 

Yeah, the new plan is to merge the watchdog with at91rm9200_time.c and
move it either to drivers/clocksource or make an mfd. I believe the
former would be easier.

> 	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@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);
>
Alexander Stein Nov. 28, 2014, 8:27 a.m. UTC | #4
Hi Alexandre,

On Friday 28 November 2014, 01:28:22 wrote Alexandre Belloni:
> > >  - 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.
> > 
> 
> Actually, some work was done but we never saw an other version of the
> series. Alexander, are you still interested? Else we can take the patch
> below.
> 
> http://lists.infradead.org/pipermail/linux-arm-kernel/2014-April/246679.html

Well, I tried to get a ac97c driver based on alsa soc framework as suggested 
by Takashi. But I failed so far, I could not get my head around those 
architecture.
When keeping my DT support on the current driver, the only thing which is open 
that the bindings should be modifed that they are like soc-ac97link bindings.
I could work on that, but I currently don't know when I can get access again 
to that hardware for testing.

Best regards,
Alexander
diff mbox

Patch

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);