[PATCH] ARM: integrator: add MMCI device to IM-PD1

Alexandre Courbot gnurou at gmail.com
Tue Apr 15 23:41:28 PDT 2014


On Tue, Apr 15, 2014 at 5:33 PM, Linus Walleij <linus.walleij at linaro.org> wrote:
> The IM-PD1 logic module daughterboard holds an MMCI block, which
> we can now provide using platform resources such as proper GPIO
> lines etc. We add the GPIO table dynamically and using the new
> GPIO descriptor mechanism. Tested and hey, it works:

Wow, what do you know! ;)

>
> root at integrator:/ mount /dev/mmcblk0p1 /mnt/
> root at integrator:/ ls /mnt/
> ARM          U-BOOT.EXE   u-boot.bin   u-boot.srec  u-pad.bin
>
> Cc: Alexandre Courbot <gnurou at gmail.com>
> Signed-off-by: Linus Walleij <linus.walleij at linaro.org>
> ---
>  arch/arm/mach-integrator/impd1.c | 48 ++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 48 insertions(+)
>
> diff --git a/arch/arm/mach-integrator/impd1.c b/arch/arm/mach-integrator/impd1.c
> index 0e870ea818c4..29767cfc98bc 100644
> --- a/arch/arm/mach-integrator/impd1.c
> +++ b/arch/arm/mach-integrator/impd1.c
> @@ -20,10 +20,13 @@
>  #include <linux/mm.h>
>  #include <linux/amba/bus.h>
>  #include <linux/amba/clcd.h>
> +#include <linux/amba/mmci.h>
> +#include <linux/amba/pl061.h>
>  #include <linux/io.h>
>  #include <linux/platform_data/clk-integrator.h>
>  #include <linux/slab.h>
>  #include <linux/irqchip/arm-vic.h>
> +#include <linux/gpio/driver.h>
>
>  #include <asm/sizes.h>
>  #include "lm.h"
> @@ -52,6 +55,14 @@ void impd1_tweak_control(struct device *dev, u32 mask, u32 val)
>  EXPORT_SYMBOL(impd1_tweak_control);
>
>  /*
> + * MMC support
> + */
> +static struct mmci_platform_data mmc_data = {
> +       .ocr_mask       = MMC_VDD_32_33|MMC_VDD_33_34,
> +       .cd_invert      = 1,
> +};
> +
> +/*
>   * CLCD support
>   */
>  #define PANEL          PROSPECTOR
> @@ -291,6 +302,7 @@ static struct impd1_device impd1_devs[] = {
>                 .offset = 0x00700000,
>                 .irq    = { 7, 8 },
>                 .id     = 0x00041181,
> +               .platform_data = &mmc_data,

How is this first part connected to the rest of the patch? I also do
not see any mention to it in the commit message.

>         }, {
>                 .offset = 0x00800000,
>                 .irq    = { 9 },
> @@ -367,6 +379,42 @@ static int __init impd1_probe(struct lm_device *dev)
>
>                 pc_base = dev->resource.start + idev->offset;
>                 snprintf(devname, 32, "lm%x:%5.5lx", dev->id, idev->offset >> 12);
> +
> +               /* Add GPIO descriptor lookup table for the PL061 block */
> +               if (idev->offset == 0x00400000) {
> +                       struct gpiod_lookup_table *lookup;
> +                       char *chipname;
> +                       char *mmciname;
> +
> +                       lookup = devm_kzalloc(&dev->dev,
> +                                             sizeof(*lookup) + 3 * sizeof(struct gpiod_lookup),
> +                                             GFP_KERNEL);
> +                       chipname = devm_kstrdup(&dev->dev, devname, GFP_KERNEL);
> +                       mmciname = kasprintf(GFP_KERNEL, "lm%x:00700", dev->id);
> +                       lookup->dev_id = mmciname;
> +                       /*
> +                        * Offsets on GPIO block 1:
> +                        * 3 = MMC WP (write protect)
> +                        * 4 = MMC CD (card detect)
> +                        *
> +                        * Offsets on GPIO block 2:
> +                        * 0 = Up key
> +                        * 1 = Down key
> +                        * 2 = Left key
> +                        * 3 = Right key
> +                        * 4 = Key lower left
> +                        * 5 = Key lower right
> +                        */
> +                       /* We need the two MMCI GPIO entries */
> +                       lookup->table[0].chip_label = chipname;
> +                       lookup->table[0].chip_hwnum = 3;
> +                       lookup->table[0].con_id = "wp";
> +                       lookup->table[1].chip_label = chipname;
> +                       lookup->table[1].chip_hwnum = 4;
> +                       lookup->table[1].con_id = "cd";
> +                       gpiod_add_lookup_table(lookup);
> +               }
> +

Reviewed-by: Alexandre Courbot <acourbot at nvidia.com>

For the GPIO lookup table part.



More information about the linux-arm-kernel mailing list