From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1761452AbYETHvY (ORCPT ); Tue, 20 May 2008 03:51:24 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1755585AbYETHvQ (ORCPT ); Tue, 20 May 2008 03:51:16 -0400 Received: from yw-out-2324.google.com ([74.125.46.30]:36137 "EHLO yw-out-2324.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755062AbYETHvP (ORCPT ); Tue, 20 May 2008 03:51:15 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=message-id:date:from:sender:to:subject:cc:in-reply-to:mime-version:content-type:content-transfer-encoding:content-disposition:references:x-google-sender-auth; b=QH09H8Nfv54ztPZ3estuCnpV8uhwQP1kg0EdzxitJSffTLiN+cMVF4TZVr3ovBnSlzLT3LNouK5jX8mOjyPXgjnjpsWMWCQ2WkNTaFEnRQfGki13a9AKyKPu74FYcJmWTa0umg5BCFuNYdg2xmf/M2wHGxW/nLLDMo8VvJ+m+PU= Message-ID: <386072610805200051tcbf2d1bpcb981749c16879b6@mail.gmail.com> Date: Tue, 20 May 2008 15:51:13 +0800 From: "Bryan Wu" To: akpm@linux-foundation.org Subject: Re: + pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2.patch added to -mm tree Cc: linux-kernel@vger.kernel.org, michael.hennerich@analog.com In-Reply-To: <200805200608.m4K68d0N008092@imap1.linux-foundation.org> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <200805200608.m4K68d0N008092@imap1.linux-foundation.org> X-Google-Sender-Auth: ebedfccefba1ce87 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Thanks Andrew, Need I resend out the a new patch which fold these 3 patches together. it is easier for you to maintain. Regards, -Bryan On Tue, May 20, 2008 at 2:08 PM, wrote: > > The patch titled > PCMCIA: add support the CF PCMCIA driver for Blackfin > has been added to the -mm tree. Its filename is > pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2.patch > > Before you just go and hit "reply", please: > a) Consider who else should be cc'ed > b) Prefer to cc a suitable mailing list as well > c) Ideally: find the original patch on the mailing list and do a > reply-to-all to that, adding suitable additional cc's > > *** Remember to use Documentation/SubmitChecklist when testing your code *** > > See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find > out what to do about this > > The current -mm tree may be found at http://userweb.kernel.org/~akpm/mmotm/ > > ------------------------------------------------------ > Subject: PCMCIA: add support the CF PCMCIA driver for Blackfin > From: Michael Hennerich > > Signed-off-by: Michael Hennerich > Signed-off-by: Bryan Wu > Signed-off-by: Andrew Morton > --- > > drivers/pcmcia/Kconfig | 7 > drivers/pcmcia/Makefile | 1 > drivers/pcmcia/bfin_cf_pcmcia.c | 341 ++++++++++++++++++++++++++++++ > include/pcmcia/cs_types.h | 2 > 4 files changed, 350 insertions(+), 1 deletion(-) > > diff -puN drivers/pcmcia/Kconfig~pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2 drivers/pcmcia/Kconfig > --- a/drivers/pcmcia/Kconfig~pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2 > +++ a/drivers/pcmcia/Kconfig > @@ -263,6 +263,13 @@ config OMAP_CF > Say Y here to support the CompactFlash controller on OMAP. > Note that this doesn't support "True IDE" mode. > > +config BFIN_CFPCMCIA > + tristate "Blackfin CompactFlash PCMCIA Driver" > + depends on PCMCIA && BLACKFIN > + help > + Say Y here to support the CompactFlash PCMCIA driver for Blackfin. > + > + > config AT91_CF > tristate "AT91 CompactFlash Controller" > depends on PCMCIA && ARCH_AT91RM9200 > diff -puN drivers/pcmcia/Makefile~pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2 drivers/pcmcia/Makefile > --- a/drivers/pcmcia/Makefile~pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2 > +++ a/drivers/pcmcia/Makefile > @@ -36,6 +36,7 @@ obj-$(CONFIG_PCMCIA_AU1X00) += au1x00_ > obj-$(CONFIG_PCMCIA_VRC4171) += vrc4171_card.o > obj-$(CONFIG_PCMCIA_VRC4173) += vrc4173_cardu.o > obj-$(CONFIG_OMAP_CF) += omap_cf.o > +obj-$(CONFIG_BFIN_CFPCMCIA) += bfin_cf_pcmcia.o > obj-$(CONFIG_AT91_CF) += at91_cf.o > obj-$(CONFIG_ELECTRA_CF) += electra_cf.o > > diff -puN /dev/null drivers/pcmcia/bfin_cf_pcmcia.c > --- /dev/null > +++ a/drivers/pcmcia/bfin_cf_pcmcia.c > @@ -0,0 +1,341 @@ > +/* > + * file: drivers/pcmcia/bfin_cf.c > + * author: Michael Hennerich (hennerich@blackfin.uclinux.org) > + * > + * based on: drivers/pcmcia/omap_cf.c > + * omap_cf.c -- OMAP 16xx CompactFlash controller driver > + * > + * Copyright (c) 2005 David Brownell > + * Copyright (c) 2006-2008 Michael Hennerich Analog Devices Inc. > + * > + * bugs: enter bugs at http://blackfin.uclinux.org/ > + * > + * this program is free software; you can redistribute it and/or modify > + * it under the terms of the gnu general public license as published by > + * the free software foundation; either version 2, or (at your option) > + * any later version. > + * > + * this program is distributed in the hope that it will be useful, > + * but without any warranty; without even the implied warranty of > + * merchantability or fitness for a particular purpose. see the > + * gnu general public license for more details. > + * > + * you should have received a copy of the gnu general public license > + * along with this program; see the file copying. > + * if not, write to the free software foundation, > + * 59 temple place - suite 330, boston, ma 02111-1307, usa. > + */ > + > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > +#include > + > +#include > +#include > +#include > +#include > + > +#define SZ_1K 0x00000400 > +#define SZ_8K 0x00002000 > +#define SZ_2K (2 * SZ_1K) > + > +#define POLL_INTERVAL (2 * HZ) > + > +#define CF_ATASEL_ENA 0x20311802 /* Inverts RESET */ > +#define CF_ATASEL_DIS 0x20311800 > + > +#define bfin_cf_present(pfx) (gpio_get_value(pfx)) > + > +/*--------------------------------------------------------------------------*/ > + > +static const char driver_name[] = "bfin_cf_pcmcia"; > + > +struct bfin_cf_socket { > + struct pcmcia_socket socket; > + > + struct timer_list timer; > + unsigned present:1; > + unsigned active:1; > + > + struct platform_device *pdev; > + unsigned long phys_cf_io; > + unsigned long phys_cf_attr; > + u_int irq; > + u_short cd_pfx; > +}; > + > +/*--------------------------------------------------------------------------*/ > +static int bfin_cf_reset(void) > +{ > + outw(0, CF_ATASEL_ENA); > + mdelay(200); > + outw(0, CF_ATASEL_DIS); > + > + return 0; > +} > + > +static int bfin_cf_ss_init(struct pcmcia_socket *s) > +{ > + return 0; > +} > + > +/* the timer is primarily to kick this socket's pccardd */ > +static void bfin_cf_timer(unsigned long _cf) > +{ > + struct bfin_cf_socket *cf = (void *)_cf; > + unsigned short present = bfin_cf_present(cf->cd_pfx); > + > + if (present != cf->present) { > + cf->present = present; > + pr_debug("%s: card %s\n", driver_name, > + present ? "present" : "gone"); > + pcmcia_parse_events(&cf->socket, SS_DETECT); > + } > + > + if (cf->active) > + mod_timer(&cf->timer, jiffies + POLL_INTERVAL); > +} > + > +static int bfin_cf_get_status(struct pcmcia_socket *s, u_int * sp) > +{ > + struct bfin_cf_socket *cf; > + > + if (!sp) > + return -EINVAL; > + > + cf = container_of(s, struct bfin_cf_socket, socket); > + > + if (bfin_cf_present(cf->cd_pfx)) { > + *sp = SS_READY | SS_DETECT | SS_POWERON | SS_3VCARD; > + s->irq.AssignedIRQ = 0; > + s->pci_irq = cf->irq; > + > + } else > + *sp = 0; > + return 0; > +} > + > +static int > +bfin_cf_set_socket(struct pcmcia_socket *sock, struct socket_state_t *s) > +{ > + > + struct bfin_cf_socket *cf; > + cf = container_of(sock, struct bfin_cf_socket, socket); > + > + switch (s->Vcc) { > + case 0: > + case 33: > + break; > + case 50: > + break; > + default: > + return -EINVAL; > + } > + > + if (s->flags & SS_RESET) { > + disable_irq(cf->irq); > + bfin_cf_reset(); > + enable_irq(cf->irq); > + } > + > + pr_debug("%s: Vcc %d, io_irq %d, flags %04x csc %04x\n", > + driver_name, s->Vcc, s->io_irq, s->flags, s->csc_mask); > + > + return 0; > +} > + > +static int bfin_cf_ss_suspend(struct pcmcia_socket *s) > +{ > + pr_debug("%s: %s\n", driver_name, __FUNCTION__); > + return bfin_cf_set_socket(s, &dead_socket); > +} > + > +/* regions are 2K each: mem, attrib, io (and reserved-for-ide) */ > + > +static int bfin_cf_set_io_map(struct pcmcia_socket *s, struct pccard_io_map *io) > +{ > + struct bfin_cf_socket *cf; > + > + cf = container_of(s, struct bfin_cf_socket, socket); > + io->flags &= MAP_ACTIVE | MAP_ATTRIB | MAP_16BIT; > + io->start = cf->phys_cf_io; > + io->stop = io->start + SZ_2K - 1; > + return 0; > +} > + > +static int > +bfin_cf_set_mem_map(struct pcmcia_socket *s, struct pccard_mem_map *map) > +{ > + struct bfin_cf_socket *cf; > + > + if (map->card_start) > + return -EINVAL; > + cf = container_of(s, struct bfin_cf_socket, socket); > + map->static_start = cf->phys_cf_io; > + map->flags &= MAP_ACTIVE | MAP_ATTRIB | MAP_16BIT; > + if (map->flags & MAP_ATTRIB) > + map->static_start = cf->phys_cf_attr; > + > + return 0; > +} > + > +static struct pccard_operations bfin_cf_ops = { > + .init = bfin_cf_ss_init, > + .suspend = bfin_cf_ss_suspend, > + .get_status = bfin_cf_get_status, > + .set_socket = bfin_cf_set_socket, > + .set_io_map = bfin_cf_set_io_map, > + .set_mem_map = bfin_cf_set_mem_map, > +}; > + > +/*--------------------------------------------------------------------------*/ > + > +static int __init bfin_cf_probe(struct platform_device *pdev) > +{ > + struct bfin_cf_socket *cf; > + struct resource *io_mem, *attr_mem; > + int irq; > + unsigned short cd_pfx; > + int status = 0; > + > + printk(KERN_INFO "Blackfin CompactFlash/PCMCIA Socket Driver\n"); > + > + irq = platform_get_irq(pdev, 0); > + if (!irq) > + return -EINVAL; > + > + cd_pfx = platform_get_irq(pdev, 1); /*Card Detect GPIO PIN */ > + if (cd_pfx > MAX_BLACKFIN_GPIOS) > + return -EINVAL; > + > + if (gpio_request(cd_pfx, "pcmcia: CD")) { > + printk(KERN_ERR > + "BF5xx flash: Failed ro request Card Detect GPIO_%d\n", > + cd_pfx); > + return -EBUSY; > + } > + gpio_direction_input(cd_pfx); > + > + cf = kzalloc(sizeof *cf, GFP_KERNEL); > + if (!cf) > + return -ENOMEM; > + > + cf->cd_pfx = cd_pfx; > + > + init_timer(&cf->timer); > + cf->timer.function = bfin_cf_timer; > + cf->timer.data = (unsigned long)cf; > + > + cf->pdev = pdev; > + platform_set_drvdata(pdev, cf); > + > + cf->irq = irq; > + cf->socket.pci_irq = irq; > + > + set_irq_type(irq, IRQF_TRIGGER_LOW); > + > + io_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); > + attr_mem = platform_get_resource(pdev, IORESOURCE_MEM, 1); > + > + if (!io_mem || !attr_mem) > + goto fail0; > + > + cf->phys_cf_io = io_mem->start; > + cf->phys_cf_attr = attr_mem->start; > + > + /* pcmcia layer only remaps "real" memory */ > + cf->socket.io_offset = (unsigned long) > + ioremap(cf->phys_cf_io, SZ_2K); > + > + if (!cf->socket.io_offset) > + goto fail0; > + > + pr_info("%s: on irq %d\n", driver_name, irq); > + > + pr_debug("%s: %s\n", driver_name, > + bfin_cf_present(cf->cd_pfx) ? "present" : "(not present)"); > + > + cf->socket.owner = THIS_MODULE; > + cf->socket.dev.parent = &pdev->dev; > + cf->socket.ops = &bfin_cf_ops; > + cf->socket.resource_ops = &pccard_static_ops; > + cf->socket.features = SS_CAP_PCCARD | SS_CAP_STATIC_MAP > + | SS_CAP_MEM_ALIGN; > + cf->socket.map_size = SZ_2K; > + > + status = pcmcia_register_socket(&cf->socket); > + if (status < 0) > + goto fail2; > + > + cf->active = 1; > + mod_timer(&cf->timer, jiffies + POLL_INTERVAL); > + return 0; > + > +fail2: > + iounmap((void __iomem *)cf->socket.io_offset); > + release_mem_region(cf->phys_cf_io, SZ_8K); > + > +fail0: > + kfree(cf); > + platform_set_drvdata(pdev, NULL); > + > + return status; > +} > + > +static int __devexit bfin_cf_remove(struct platform_device *pdev) > +{ > + struct bfin_cf_socket *cf = platform_get_drvdata(pdev); > + > + gpio_free(cf->cd_pfx); > + cf->active = 0; > + pcmcia_unregister_socket(&cf->socket); > + del_timer_sync(&cf->timer); > + iounmap((void __iomem *)cf->socket.io_offset); > + release_mem_region(cf->phys_cf_io, SZ_8K); > + platform_set_drvdata(pdev, NULL); > + kfree(cf); > + return 0; > +} > + > +static int bfin_cf_suspend(struct platform_device *pdev, pm_message_t mesg) > +{ > + return pcmcia_socket_dev_suspend(&pdev->dev, mesg); > +} > + > +static int bfin_cf_resume(struct platform_device *pdev) > +{ > + return pcmcia_socket_dev_resume(&pdev->dev); > +} > + > +static struct platform_driver bfin_cf_driver = { > + .driver = { > + .name = (char *)driver_name, > + .owner = THIS_MODULE, > + }, > + .probe = bfin_cf_probe, > + .remove = __devexit_p(bfin_cf_remove), > + .suspend = bfin_cf_suspend, > + .resume = bfin_cf_resume, > +}; > + > +static int __init bfin_cf_init(void) > +{ > + return platform_driver_register(&bfin_cf_driver); > +} > + > +static void __exit bfin_cf_exit(void) > +{ > + platform_driver_unregister(&bfin_cf_driver); > +} > + > +module_init(bfin_cf_init); > +module_exit(bfin_cf_exit); > + > +MODULE_DESCRIPTION("BFIN CF/PCMCIA Driver"); > +MODULE_LICENSE("GPL"); > diff -puN include/pcmcia/cs_types.h~pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2 include/pcmcia/cs_types.h > --- a/include/pcmcia/cs_types.h~pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2 > +++ a/include/pcmcia/cs_types.h > @@ -21,7 +21,7 @@ > #include > #endif > > -#if defined(__arm__) || defined(__mips__) || defined(__avr32__) > +#if defined(__arm__) || defined(__mips__) || defined(__avr32__) || defined(bfin) > /* This (ioaddr_t) is exposed to userspace & hence cannot be changed. */ > typedef u_int ioaddr_t; > #else > _ > > Patches currently in -mm which might be from michael.hennerich@analog.com are > > input-touchscreen-driver-add-support-ad7877-touchscreen-driver.patch > pcmcia-add-support-the-cf-pcmcia-driver-for-blackfin-try-2.patch > mtd-m25p80-fix-bug-atmel-spi-flash-fails-to-be-copied-to.patch > >