From: daniel@caiaq.de (Daniel Mack)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 08/13] PXA: Colibri: Toradex Colibri PXA270 CF support
Date: Wed, 18 Aug 2010 13:43:26 +0200 [thread overview]
Message-ID: <20100818114326.GH17833@buzzloop.caiaq.de> (raw)
In-Reply-To: <1281673964-2119-8-git-send-email-marek.vasut@gmail.com>
Hi Marek,
On Fri, Aug 13, 2010 at 06:32:39AM +0200, Marek Vasut wrote:
> This driver also contains structures to eventually support PXA320. This is
> planned to be added in a later patch.
>
> Signed-off-by: Marek Vasut <marek.vasut@gmail.com>
I have currently no access to my Colibri hardware, but the changes to
the code look sane and totally make sense to me. You can add my
Acked-by: Daniel Mack <daniel@caiaq.de>
Thanks,
Daniel
> ---
> arch/arm/mach-pxa/colibri-pxa270-evalboard.c | 18 ++
> drivers/pcmcia/Kconfig | 2 +-
> drivers/pcmcia/Makefile | 1 +
> drivers/pcmcia/pxa2xx_colibri.c | 215 ++++++++++++++++++++++++++
> 4 files changed, 235 insertions(+), 1 deletions(-)
> create mode 100644 drivers/pcmcia/pxa2xx_colibri.c
>
> diff --git a/arch/arm/mach-pxa/colibri-pxa270-evalboard.c b/arch/arm/mach-pxa/colibri-pxa270-evalboard.c
> index 0f3b632..6177ff5 100644
> --- a/arch/arm/mach-pxa/colibri-pxa270-evalboard.c
> +++ b/arch/arm/mach-pxa/colibri-pxa270-evalboard.c
> @@ -51,6 +51,24 @@ static mfp_cfg_t colibri_pxa270_evalboard_pin_config[] __initdata = {
> GPIO89_USBH1_PEN,
> GPIO119_USBH2_PWR,
> GPIO120_USBH2_PEN,
> +
> + /* PCMCIA */
> + GPIO85_nPCE_1,
> + GPIO54_nPCE_2,
> + GPIO55_nPREG,
> + GPIO50_nPIOR,
> + GPIO51_nPIOW,
> + GPIO49_nPWE,
> + GPIO48_nPOE,
> + GPIO57_nIOIS16,
> + GPIO56_nPWAIT,
> + GPIO104_PSKTSEL,
> + GPIO53_GPIO, /* RESET */
> + GPIO83_GPIO, /* BVD1 */
> + GPIO82_GPIO, /* BVD2 */
> + GPIO1_GPIO, /* READY */
> + GPIO84_GPIO, /* DETECT */
> + GPIO107_GPIO, /* PPEN */
> };
>
> /******************************************************************************
> diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig
> index ef2f659..883623a 100644
> --- a/drivers/pcmcia/Kconfig
> +++ b/drivers/pcmcia/Kconfig
> @@ -215,7 +215,7 @@ config PCMCIA_PXA2XX
> depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \
> || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \
> || ARCOM_PCMCIA || ARCH_PXA_ESERIES || MACH_STARGATE2 \
> - || MACH_VPAC270 || MACH_BALLOON3)
> + || MACH_VPAC270 || MACH_BALLOON3 || MACH_COLIBRI)
> select PCMCIA_SOC_COMMON
> help
> Say Y here to include support for the PXA2xx PCMCIA controller
> diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile
> index 6a60773..0e989a1 100644
> --- a/drivers/pcmcia/Makefile
> +++ b/drivers/pcmcia/Makefile
> @@ -71,6 +71,7 @@ pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o
> pxa2xx-obj-$(CONFIG_MACH_STARGATE2) += pxa2xx_stargate2.o
> pxa2xx-obj-$(CONFIG_MACH_VPAC270) += pxa2xx_vpac270.o
> pxa2xx-obj-$(CONFIG_MACH_BALLOON3) += pxa2xx_balloon3.o
> +pxa2xx-obj-$(CONFIG_MACH_COLIBRI) += pxa2xx_colibri.o
>
> obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_base.o $(pxa2xx-obj-y)
>
> diff --git a/drivers/pcmcia/pxa2xx_colibri.c b/drivers/pcmcia/pxa2xx_colibri.c
> new file mode 100644
> index 0000000..8373816
> --- /dev/null
> +++ b/drivers/pcmcia/pxa2xx_colibri.c
> @@ -0,0 +1,215 @@
> +/*
> + * linux/drivers/pcmcia/pxa2xx_colibri.c
> + *
> + * Driver for Toradex Colibri PXA270 CF socket
> + *
> + * Copyright (C) 2010 Marek Vasut <marek.vasut@gmail.com>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2 as
> + * published by the Free Software Foundation.
> + *
> + */
> +
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/delay.h>
> +
> +#include <asm/mach-types.h>
> +
> +#include <mach/gpio.h>
> +
> +#include "soc_common.h"
> +
> +#define COLIBRI270_RESET_GPIO 53
> +#define COLIBRI270_PPEN_GPIO 107
> +#define COLIBRI270_BVD1_GPIO 83
> +#define COLIBRI270_BVD2_GPIO 82
> +#define COLIBRI270_DETECT_GPIO 84
> +#define COLIBRI270_READY_GPIO 1
> +
> +static struct {
> + int reset_gpio;
> + int ppen_gpio;
> + int bvd1_gpio;
> + int bvd2_gpio;
> + int detect_gpio;
> + int ready_gpio;
> +} colibri_pcmcia_gpio;
> +
> +static struct pcmcia_irqs colibri_irqs[] = {
> + {
> + .sock = 0,
> + .str = "PCMCIA CD"
> + },
> +};
> +
> +static int colibri_pcmcia_hw_init(struct soc_pcmcia_socket *skt)
> +{
> + int ret;
> +
> + ret = gpio_request(colibri_pcmcia_gpio.detect_gpio, "DETECT");
> + if (ret)
> + goto err1;
> + ret = gpio_direction_input(colibri_pcmcia_gpio.detect_gpio);
> + if (ret)
> + goto err2;
> +
> + ret = gpio_request(colibri_pcmcia_gpio.ready_gpio, "READY");
> + if (ret)
> + goto err2;
> + ret = gpio_direction_input(colibri_pcmcia_gpio.ready_gpio);
> + if (ret)
> + goto err3;
> +
> + ret = gpio_request(colibri_pcmcia_gpio.bvd1_gpio, "BVD1");
> + if (ret)
> + goto err3;
> + ret = gpio_direction_input(colibri_pcmcia_gpio.bvd1_gpio);
> + if (ret)
> + goto err4;
> +
> + ret = gpio_request(colibri_pcmcia_gpio.bvd2_gpio, "BVD2");
> + if (ret)
> + goto err4;
> + ret = gpio_direction_input(colibri_pcmcia_gpio.bvd2_gpio);
> + if (ret)
> + goto err5;
> +
> + ret = gpio_request(colibri_pcmcia_gpio.ppen_gpio, "PPEN");
> + if (ret)
> + goto err5;
> + ret = gpio_direction_output(colibri_pcmcia_gpio.ppen_gpio, 0);
> + if (ret)
> + goto err6;
> +
> + ret = gpio_request(colibri_pcmcia_gpio.reset_gpio, "RESET");
> + if (ret)
> + goto err6;
> + ret = gpio_direction_output(colibri_pcmcia_gpio.reset_gpio, 1);
> + if (ret)
> + goto err7;
> +
> + colibri_irqs[0].irq = gpio_to_irq(colibri_pcmcia_gpio.detect_gpio);
> + skt->socket.pci_irq = gpio_to_irq(colibri_pcmcia_gpio.ready_gpio);
> +
> + return soc_pcmcia_request_irqs(skt, colibri_irqs,
> + ARRAY_SIZE(colibri_irqs));
> +
> +err7:
> + gpio_free(colibri_pcmcia_gpio.detect_gpio);
> +err6:
> + gpio_free(colibri_pcmcia_gpio.ready_gpio);
> +err5:
> + gpio_free(colibri_pcmcia_gpio.bvd1_gpio);
> +err4:
> + gpio_free(colibri_pcmcia_gpio.bvd2_gpio);
> +err3:
> + gpio_free(colibri_pcmcia_gpio.reset_gpio);
> +err2:
> + gpio_free(colibri_pcmcia_gpio.ppen_gpio);
> +err1:
> + return ret;
> +}
> +
> +static void colibri_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt)
> +{
> + gpio_free(colibri_pcmcia_gpio.detect_gpio);
> + gpio_free(colibri_pcmcia_gpio.ready_gpio);
> + gpio_free(colibri_pcmcia_gpio.bvd1_gpio);
> + gpio_free(colibri_pcmcia_gpio.bvd2_gpio);
> + gpio_free(colibri_pcmcia_gpio.reset_gpio);
> + gpio_free(colibri_pcmcia_gpio.ppen_gpio);
> +}
> +
> +static void colibri_pcmcia_socket_state(struct soc_pcmcia_socket *skt,
> + struct pcmcia_state *state)
> +{
> +
> + state->detect = !!gpio_get_value(colibri_pcmcia_gpio.detect_gpio);
> + state->ready = !!gpio_get_value(colibri_pcmcia_gpio.ready_gpio);
> + state->bvd1 = !!gpio_get_value(colibri_pcmcia_gpio.bvd1_gpio);
> + state->bvd2 = !!gpio_get_value(colibri_pcmcia_gpio.bvd2_gpio);
> + state->wrprot = 0;
> + state->vs_3v = 1;
> + state->vs_Xv = 0;
> +}
> +
> +static int
> +colibri_pcmcia_configure_socket(struct soc_pcmcia_socket *skt,
> + const socket_state_t *state)
> +{
> + gpio_set_value(colibri_pcmcia_gpio.ppen_gpio,
> + !(state->Vcc == 33 && state->Vpp < 50));
> + gpio_set_value(colibri_pcmcia_gpio.reset_gpio, state->flags & SS_RESET);
> + return 0;
> +}
> +
> +static void colibri_pcmcia_socket_init(struct soc_pcmcia_socket *skt)
> +{
> +}
> +
> +static void colibri_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt)
> +{
> +}
> +
> +static struct pcmcia_low_level colibri_pcmcia_ops = {
> + .owner = THIS_MODULE,
> +
> + .first = 0,
> + .nr = 1,
> +
> + .hw_init = colibri_pcmcia_hw_init,
> + .hw_shutdown = colibri_pcmcia_hw_shutdown,
> +
> + .socket_state = colibri_pcmcia_socket_state,
> + .configure_socket = colibri_pcmcia_configure_socket,
> +
> + .socket_init = colibri_pcmcia_socket_init,
> + .socket_suspend = colibri_pcmcia_socket_suspend,
> +};
> +
> +static struct platform_device *colibri_pcmcia_device;
> +
> +static int __init colibri_pcmcia_init(void)
> +{
> + int ret;
> +
> + colibri_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1);
> + if (!colibri_pcmcia_device)
> + return -ENOMEM;
> +
> + /* Colibri PXA270 */
> + if (machine_is_colibri()) {
> + colibri_pcmcia_gpio.reset_gpio = COLIBRI270_RESET_GPIO;
> + colibri_pcmcia_gpio.ppen_gpio = COLIBRI270_PPEN_GPIO;
> + colibri_pcmcia_gpio.bvd1_gpio = COLIBRI270_BVD1_GPIO;
> + colibri_pcmcia_gpio.bvd2_gpio = COLIBRI270_BVD2_GPIO;
> + colibri_pcmcia_gpio.detect_gpio = COLIBRI270_DETECT_GPIO;
> + colibri_pcmcia_gpio.ready_gpio = COLIBRI270_READY_GPIO;
> + }
> +
> + ret = platform_device_add_data(colibri_pcmcia_device,
> + &colibri_pcmcia_ops, sizeof(colibri_pcmcia_ops));
> +
> + if (!ret)
> + ret = platform_device_add(colibri_pcmcia_device);
> +
> + if (ret)
> + platform_device_put(colibri_pcmcia_device);
> +
> + return ret;
> +}
> +
> +static void __exit colibri_pcmcia_exit(void)
> +{
> + platform_device_unregister(colibri_pcmcia_device);
> +}
> +
> +module_init(colibri_pcmcia_init);
> +module_exit(colibri_pcmcia_exit);
> +
> +MODULE_AUTHOR("Marek Vasut <marek.vasut@gmail.com>");
> +MODULE_DESCRIPTION("PCMCIA support for Toradex Colibri PXA270");
> +MODULE_ALIAS("platform:pxa2xx-pcmcia");
> +MODULE_LICENSE("GPL");
> --
> 1.7.1
>
next prev parent reply other threads:[~2010-08-18 11:43 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-13 4:32 [PATCH 01/13] Balloon3: Disperse MFP config Marek Vasut
2010-08-13 4:32 ` [PATCH 02/13] PXA: Vpac270: Fix gpio_power for MMC Marek Vasut
2010-08-13 4:32 ` [PATCH 03/13] PXA: PalmTC: Modularize Palm Tungsten|C Marek Vasut
2010-08-13 4:32 ` [PATCH 04/13] UCB1400: Pass ucb1400-gpio data through ac97 bus Marek Vasut
2010-08-13 4:32 ` [PATCH 05/13] PXA: Vpac270: Correct touch IRQ passing to UCB1400 Marek Vasut
2010-08-13 4:32 ` [PATCH 06/13] PXA: PalmTC: Pass GPIO offset to ucb1400-gpio Marek Vasut
2010-08-13 4:32 ` [PATCH 07/13] PXA: PalmTC: Add gpio-leds and vibrator support Marek Vasut
2010-08-13 4:32 ` [PATCH 08/13] PXA: Colibri: Toradex Colibri PXA270 CF support Marek Vasut
2010-08-18 11:43 ` Daniel Mack [this message]
2010-08-21 6:22 ` Marek Vasut
2010-08-21 9:33 ` Daniel Mack
2010-09-01 7:23 ` Russell King - ARM Linux
2010-09-01 12:39 ` Marek Vasut
2010-08-13 4:32 ` [PATCH 09/13] PXA: Colibri: Push evalboard MFP into module files Marek Vasut
2010-08-13 4:32 ` [PATCH 10/13] PXA: Colibri: Add M41T00 RTC support Marek Vasut
2010-08-13 4:32 ` [PATCH 11/13] PXA: Colibri: Rename Colibri-evalboard Marek Vasut
2010-08-13 4:32 ` [PATCH 12/13] pxa2xx/pcmcia: Prepare for pxa320 Marek Vasut
2010-08-13 4:32 ` [PATCH 13/13] PXA: Colibri PXA320 PCMCIA driver Marek Vasut
2010-08-18 4:11 ` [PATCH 01/13] Balloon3: Disperse MFP config Eric Miao
2010-08-18 5:05 ` Marek Vasut
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100818114326.GH17833@buzzloop.caiaq.de \
--to=daniel@caiaq.de \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.