Changeset 11887


Ignore:
Timestamp:
2008-07-20T21:34:09+02:00 (10 years ago)
Author:
mb
Message:

Update gpiommc to use configfs

Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mmc_over_gpio/Makefile

    r11864 r11887  
    1717  SUBMENU:=Other modules 
    1818  DEPENDS:=@GPIO_SUPPORT +kmod-mmc-spi +kmod-spi-gpio 
    19   KCONFIG:=CONFIG_GPIOMMC 
     19  KCONFIG:=CONFIG_GPIOMMC CONFIG_CONFIGFS_FS=y 
    2020  TITLE:=MMC/SD card over GPIO support 
    2121  FILES:=$(LINUX_DIR)/drivers/mmc/host/gpiommc.$(LINUX_KMOD_SUFFIX) 
  • trunk/package/mmc_over_gpio/files/mmc_over_gpio.init

    r11864 r11887  
    33START=90 
    44 
    5 SYSFS="/sys" 
    6 SYSFS_DRIVERDIR="$SYSFS/bus/platform/drivers/gpiommc" 
     5CONFIGFS_DIR="/config/gpiommc" 
    76 
    87# add_device(name, DI_pin, DO_pin, CLK_pin, CS_pin, mode) 
    98add_device() { 
    10         echo -n "$1" "$2" "$3" "$4" "$5" "$6" > $SYSFS_DRIVERDIR/add 
     9        local dir="$CONFIGFS_DIR/$1" 
     10 
     11        mkdir $dir 
     12        [ $? -eq 0 ] || return 1 
     13        echo $2 > $dir/gpio_data_in 
     14        [ $? -eq 0 ] || return 1 
     15        echo $3 > $dir/gpio_data_out 
     16        [ $? -eq 0 ] || return 1 
     17        echo $4 > $dir/gpio_clock 
     18        [ $? -eq 0 ] || return 1 
     19        echo $5 > $dir/gpio_chipselect 
     20        [ $? -eq 0 ] || return 1 
     21        echo $6 > $dir/spi_mode 
     22        [ $? -eq 0 ] || return 1 
     23        # XXX We have more config options available. Use defaults for now. 
     24 
     25        echo 1 > $dir/register 
     26        [ $? -eq 0 ] || return 1 
     27 
     28        return 0 
    1129} 
    1230 
    1331# remove_device(name) 
    1432remove_device() { 
    15         echo -n "$1" > $SYSFS_DRIVERDIR/remove 
     33        local dir="$CONFIGFS_DIR/$1" 
     34 
     35        rmdir $dir 
     36} 
     37 
     38mount_configfs() { 
     39        # FIXME: This should probably be done somewhere else. 
     40        mount | grep configfs 
     41        if [ $? -eq 0 ]; then 
     42                # already mounted 
     43                return 0 
     44        fi 
     45        mkdir -p /config 
     46        [ $? -eq 0 ] || return 1 
     47        mount configfs -t configfs /config 
     48        [ $? -eq 0 ] || return 1 
     49 
     50        return 0 
    1651} 
    1752 
    1853start() { 
     54        # Make sure configfs is mounted 
     55        mount_configfs 
     56        [ $? -eq 0 ] || return 1 
     57 
    1958        #FIXME we should use a config file, but I dunno how that parser works. 
    2059        add_device "default" 5 4 3 7 0 
  • trunk/target/linux/generic-2.6/patches-2.6.25/921-gpio_spi_driver.patch

    r11864 r11887  
    22=================================================================== 
    33--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4 +++ linux-2.6.25.10/include/linux/spi/spi_gpio.h        2008-07-18 18:19:56.000000000 +0200 
    5 @@ -0,0 +1,67 @@ 
     4+++ linux-2.6.25.10/include/linux/spi/spi_gpio.h        2008-07-20 20:10:21.000000000 +0200 
     5@@ -0,0 +1,73 @@ 
    66+/* 
    77+ * spi_gpio interface to platform code 
     
    2121+ 
    2222+ 
    23 +/** struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device. 
     23+/** 
     24+ * struct spi_gpio_platform_data - Data definitions for a SPI-GPIO device. 
     25+ * 
    2426+ * This structure holds information about a GPIO-based SPI device. 
    2527+ * 
     
    5759+}; 
    5860+ 
    59 +/** SPI_GPIO_PLATDEV_NAME - The platform device name string. 
     61+/** 
     62+ * SPI_GPIO_PLATDEV_NAME - The platform device name string. 
     63+ * 
    6064+ * The name string that has to be used for platform_device_alloc 
    6165+ * when allocating a spi-gpio device. 
     
    6367+#define SPI_GPIO_PLATDEV_NAME  "spi-gpio" 
    6468+ 
    65 +/** spi_gpio_next_id - Get another platform device ID number. 
     69+/** 
     70+ * spi_gpio_next_id - Get another platform device ID number. 
     71+ * 
    6672+ * This returns the next platform device ID number that has to be used 
    6773+ * for platform_device_alloc. The ID is opaque and should not be used for 
     
    7480=================================================================== 
    7581--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    76 +++ linux-2.6.25.10/drivers/spi/spi_gpio.c      2008-07-18 18:19:56.000000000 +0200 
     82+++ linux-2.6.25.10/drivers/spi/spi_gpio.c      2008-07-20 20:10:21.000000000 +0200 
    7783@@ -0,0 +1,251 @@ 
    7884+/* 
     
    329335Index: linux-2.6.25.10/drivers/spi/Kconfig 
    330336=================================================================== 
    331 --- linux-2.6.25.10.orig/drivers/spi/Kconfig    2008-07-18 18:19:43.000000000 +0200 
    332 +++ linux-2.6.25.10/drivers/spi/Kconfig 2008-07-18 18:19:56.000000000 +0200 
     337--- linux-2.6.25.10.orig/drivers/spi/Kconfig    2008-07-20 20:09:48.000000000 +0200 
     338+++ linux-2.6.25.10/drivers/spi/Kconfig 2008-07-20 20:11:48.000000000 +0200 
    333339@@ -100,6 +100,19 @@ config SPI_BUTTERFLY 
    334340          inexpensive battery powered microcontroller evaluation board. 
     
    342348+         This is a platform driver that can be used for bitbanging 
    343349+         an SPI bus over GPIO pins. 
    344 +         Select this, if you have any SPI device that is connected via 
     350+         Select this if you have any SPI device that is connected via 
    345351+         GPIO pins. 
    346352+         The module will be called spi_gpio. 
     
    353359Index: linux-2.6.25.10/drivers/spi/Makefile 
    354360=================================================================== 
    355 --- linux-2.6.25.10.orig/drivers/spi/Makefile   2008-07-18 18:19:43.000000000 +0200 
    356 +++ linux-2.6.25.10/drivers/spi/Makefile        2008-07-18 18:19:56.000000000 +0200 
     361--- linux-2.6.25.10.orig/drivers/spi/Makefile   2008-07-20 20:09:48.000000000 +0200 
     362+++ linux-2.6.25.10/drivers/spi/Makefile        2008-07-20 20:10:21.000000000 +0200 
    357363@@ -16,6 +16,7 @@ obj-$(CONFIG_SPI_BFIN)                        += spi_bfin5xx. 
    358364 obj-$(CONFIG_SPI_BITBANG)              += spi_bitbang.o 
     
    365371Index: linux-2.6.25.10/MAINTAINERS 
    366372=================================================================== 
    367 --- linux-2.6.25.10.orig/MAINTAINERS    2008-07-03 05:46:47.000000000 +0200 
    368 +++ linux-2.6.25.10/MAINTAINERS 2008-07-18 18:20:28.000000000 +0200 
     373--- linux-2.6.25.10.orig/MAINTAINERS    2008-07-20 20:09:48.000000000 +0200 
     374+++ linux-2.6.25.10/MAINTAINERS 2008-07-20 20:10:59.000000000 +0200 
    369375@@ -3685,6 +3685,11 @@ M:       dbrownell@users.sourceforge.net 
    370376 L:     spi-devel-general@lists.sourceforge.net 
  • trunk/target/linux/generic-2.6/patches-2.6.25/922-gpiommc.patch

    r11864 r11887  
    22=================================================================== 
    33--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    4 +++ linux-2.6.25.10/drivers/mmc/host/gpiommc.c  2008-07-18 22:31:00.000000000 +0200 
    5 @@ -0,0 +1,328 @@ 
     4+++ linux-2.6.25.10/drivers/mmc/host/gpiommc.c  2008-07-20 20:49:16.000000000 +0200 
     5@@ -0,0 +1,608 @@ 
    66+/* 
    77+ * Driver an MMC/SD card on a bitbanging GPIO SPI bus. 
    88+ * This module hooks up the mmc_spi and spi_gpio modules and also 
    9 + * provides a sysfs interface. 
     9+ * provides a configfs interface. 
    1010+ * 
    1111+ * Copyright 2008 Michael Buesch <mb@bu3sch.de> 
     
    1919+#include <linux/mutex.h> 
    2020+#include <linux/spi/spi_gpio.h> 
     21+#include <linux/configfs.h> 
     22+#include <linux/gpio.h> 
     23+#include <asm/atomic.h> 
    2124+ 
    2225+ 
    2326+#define PFX                            "gpio-mmc: " 
    24 +#define GPIOMMC_MAX_NAMELEN_STR                __stringify(GPIOMMC_MAX_NAMELEN) 
     27+ 
    2528+ 
    2629+struct gpiommc_device { 
     
    6366+       if (!mmc_pdata) 
    6467+               goto error; 
     68+ 
     69+#ifdef CONFIG_MMC_SPI_MODULE 
     70+       err = request_module("mmc_spi"); 
     71+       if (err) { 
     72+               printk(KERN_WARNING PFX 
     73+                      "Failed to request mmc_spi module.\n"); 
     74+       } 
     75+#endif /* CONFIG_MMC_SPI_MODULE */ 
    6576+ 
    6677+       /* Allocate the GPIO-MMC device */ 
     
    122133+ 
    123134+       platform_device_unregister(d->spi_pdev); 
    124 +       printk(KERN_INFO PFX "GPIO based MMC-Card \"%s\" removed\n", pdata->name); 
     135+       printk(KERN_INFO PFX "GPIO based MMC-Card \"%s\" removed\n", 
     136+              pdata->name); 
    125137+       platform_device_put(d->spi_pdev); 
    126138+ 
     
    128140+} 
    129141+ 
    130 +/* Wrapper for the platform data with context data for the sysfs interface. */ 
    131 +struct gpiommc_sysfs_platform_data { 
    132 +       struct gpiommc_platform_data p; /* Keep as first element */ 
    133 + 
    134 +       /* The platform device that we allocated. */ 
     142+#ifdef CONFIG_GPIOMMC_CONFIGFS 
     143+ 
     144+/* A device that was created through configfs */ 
     145+struct gpiommc_configfs_device { 
     146+       struct config_item item; 
     147+       /* The platform device, after registration. */ 
    135148+       struct platform_device *pdev; 
    136 +       /* gpiommc_sysfs_list */ 
    137 +       struct list_head list; 
    138 +}; 
    139 + 
    140 +static LIST_HEAD(gpiommc_sysfs_list); 
    141 +static DEFINE_MUTEX(gpiommc_sysfs_mutex); 
    142 + 
    143 +static struct gpiommc_sysfs_platform_data *gpiommc_sysfs_find_dev(const char *name) 
    144 +{ 
    145 +       struct gpiommc_sysfs_platform_data *pdata; 
    146 + 
    147 +       list_for_each_entry(pdata, &gpiommc_sysfs_list, list) { 
    148 +               if (strcmp(pdata->p.name, name) == 0) 
    149 +                       return pdata; 
    150 +       } 
    151 + 
    152 +       return NULL; 
    153 +} 
    154 + 
    155 +static ssize_t gpiommc_add_store(struct device_driver *drv, 
    156 +                                const char *buf, size_t count) 
    157 +{ 
    158 +       int res, err; 
    159 +       struct gpiommc_sysfs_platform_data pdata_local, *pdata; 
    160 +       struct platform_device *pdev; 
    161 +       unsigned int no_spi_delay = 0, mode = 0, csactivelow = 0; 
    162 + 
    163 +       mutex_lock(&gpiommc_sysfs_mutex); 
    164 + 
    165 +       pdata = &pdata_local; 
    166 +       memset(pdata, 0, sizeof(*pdata)); 
    167 + 
    168 +       err = -EINVAL; 
    169 +       res = sscanf(buf, "%" GPIOMMC_MAX_NAMELEN_STR "s %u %u %u %u %u %u %u %u", 
    170 +                    pdata->p.name, 
    171 +                    &pdata->p.pins.gpio_di, 
    172 +                    &pdata->p.pins.gpio_do, 
    173 +                    &pdata->p.pins.gpio_clk, 
    174 +                    &pdata->p.pins.gpio_cs, 
    175 +                    &mode, 
    176 +                    &pdata->p.max_bus_speed, 
    177 +                    &no_spi_delay, 
    178 +                    &csactivelow); 
    179 +       pdata->p.mode = mode; 
    180 +       pdata->p.no_spi_delay = !!no_spi_delay; 
    181 +       pdata->p.pins.cs_activelow = !!csactivelow; 
    182 +       if (res < 9) 
    183 +               pdata->p.pins.cs_activelow = 1; /* Default: CS = activelow */ 
    184 +       if (res < 8) 
    185 +               pdata->p.no_spi_delay = 0; /* Default: Delay turned on */ 
    186 +       if (res < 7) 
    187 +               pdata->p.max_bus_speed = 5000000; /* Default: 5Mhz */ 
    188 +       if (res < 6) 
    189 +               pdata->p.mode = 0; /* Default: SPI mode 0 */ 
    190 +       if (res < 5 || res > 9) 
    191 +               goto out; /* First 5 args are mandatory. */ 
    192 + 
    193 +       /* Convert mode so that the SPI subsystem does understand it. */ 
    194 +       switch (pdata->p.mode) { 
    195 +       case 0: 
    196 +               pdata->p.mode = SPI_MODE_0; 
    197 +               break; 
    198 +       case 1: 
    199 +               pdata->p.mode = SPI_MODE_1; 
    200 +               break; 
    201 +       case 2: 
    202 +               pdata->p.mode = SPI_MODE_2; 
    203 +               break; 
    204 +       case 3: 
    205 +               pdata->p.mode = SPI_MODE_3; 
    206 +               break; 
    207 +       default: 
    208 +               goto out; /* Invalid mode */ 
    209 +       } 
    210 + 
    211 +       err = -EEXIST; 
    212 +       if (gpiommc_sysfs_find_dev(pdata->p.name)) 
    213 +               goto out; 
    214 + 
    215 +       err = -ENOMEM; 
    216 +       pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME, gpiommc_next_id()); 
    217 +       if (!pdev) 
    218 +               goto out; 
    219 + 
    220 +       err = platform_device_add_data(pdev, pdata, sizeof(*pdata)); 
    221 +       if (err) 
    222 +               goto err_free_pdev; 
    223 +       pdata = pdev->dev.platform_data; 
    224 + 
    225 +       err = platform_device_add(pdev); 
    226 +       if (err) 
    227 +               goto err_free_pdev; 
    228 + 
    229 +       pdata->pdev = pdev; 
    230 +       INIT_LIST_HEAD(&pdata->list); 
    231 +       list_add(&pdata->list, &gpiommc_sysfs_list); 
    232 + 
    233 +       err = 0; 
     149+       /* The configuration */ 
     150+       struct gpiommc_platform_data pdata; 
     151+}; 
     152+ 
     153+#define GPIO_INVALID   -1 
     154+ 
     155+static inline bool gpiommc_is_registered(struct gpiommc_configfs_device *dev) 
     156+{ 
     157+       return (dev->pdev != NULL); 
     158+} 
     159+ 
     160+static inline struct gpiommc_configfs_device *ci_to_gpiommc(struct config_item *item) 
     161+{ 
     162+       return item ? container_of(item, struct gpiommc_configfs_device, item) : NULL; 
     163+} 
     164+ 
     165+static struct configfs_attribute gpiommc_attr_DI = { 
     166+       .ca_owner = THIS_MODULE, 
     167+       .ca_name = "gpio_data_in", 
     168+       .ca_mode = S_IRUGO | S_IWUSR, 
     169+}; 
     170+ 
     171+static struct configfs_attribute gpiommc_attr_DO = { 
     172+       .ca_owner = THIS_MODULE, 
     173+       .ca_name = "gpio_data_out", 
     174+       .ca_mode = S_IRUGO | S_IWUSR, 
     175+}; 
     176+ 
     177+static struct configfs_attribute gpiommc_attr_CLK = { 
     178+       .ca_owner = THIS_MODULE, 
     179+       .ca_name = "gpio_clock", 
     180+       .ca_mode = S_IRUGO | S_IWUSR, 
     181+}; 
     182+ 
     183+static struct configfs_attribute gpiommc_attr_CS = { 
     184+       .ca_owner = THIS_MODULE, 
     185+       .ca_name = "gpio_chipselect", 
     186+       .ca_mode = S_IRUGO | S_IWUSR, 
     187+}; 
     188+ 
     189+static struct configfs_attribute gpiommc_attr_CS_activelow = { 
     190+       .ca_owner = THIS_MODULE, 
     191+       .ca_name = "gpio_chipselect_activelow", 
     192+       .ca_mode = S_IRUGO | S_IWUSR, 
     193+}; 
     194+ 
     195+static struct configfs_attribute gpiommc_attr_spimode = { 
     196+       .ca_owner = THIS_MODULE, 
     197+       .ca_name = "spi_mode", 
     198+       .ca_mode = S_IRUGO | S_IWUSR, 
     199+}; 
     200+ 
     201+static struct configfs_attribute gpiommc_attr_spidelay = { 
     202+       .ca_owner = THIS_MODULE, 
     203+       .ca_name = "spi_delay", 
     204+       .ca_mode = S_IRUGO | S_IWUSR, 
     205+}; 
     206+ 
     207+static struct configfs_attribute gpiommc_attr_max_bus_speed = { 
     208+       .ca_owner = THIS_MODULE, 
     209+       .ca_name = "max_bus_speed", 
     210+       .ca_mode = S_IRUGO | S_IWUSR, 
     211+}; 
     212+ 
     213+static struct configfs_attribute gpiommc_attr_register = { 
     214+       .ca_owner = THIS_MODULE, 
     215+       .ca_name = "register", 
     216+       .ca_mode = S_IRUGO | S_IWUSR, 
     217+}; 
     218+ 
     219+static struct configfs_attribute *gpiommc_config_attrs[] = { 
     220+       &gpiommc_attr_DI, 
     221+       &gpiommc_attr_DO, 
     222+       &gpiommc_attr_CLK, 
     223+       &gpiommc_attr_CS, 
     224+       &gpiommc_attr_CS_activelow, 
     225+       &gpiommc_attr_spimode, 
     226+       &gpiommc_attr_spidelay, 
     227+       &gpiommc_attr_max_bus_speed, 
     228+       &gpiommc_attr_register, 
     229+       NULL, 
     230+}; 
     231+ 
     232+static ssize_t gpiommc_config_attr_show(struct config_item *item, 
     233+                                       struct configfs_attribute *attr, 
     234+                                       char *page) 
     235+{ 
     236+       struct gpiommc_configfs_device *dev = ci_to_gpiommc(item); 
     237+       ssize_t count = 0; 
     238+       unsigned int gpio; 
     239+       int err = 0; 
     240+ 
     241+       if (attr == &gpiommc_attr_DI) { 
     242+               gpio = dev->pdata.pins.gpio_di; 
     243+               if (gpio == GPIO_INVALID) 
     244+                       count = snprintf(page, PAGE_SIZE, "not configured\n"); 
     245+               else 
     246+                       count = snprintf(page, PAGE_SIZE, "%u\n", gpio); 
     247+               goto out; 
     248+       } 
     249+       if (attr == &gpiommc_attr_DO) { 
     250+               gpio = dev->pdata.pins.gpio_do; 
     251+               if (gpio == GPIO_INVALID) 
     252+                       count = snprintf(page, PAGE_SIZE, "not configured\n"); 
     253+               else 
     254+                       count = snprintf(page, PAGE_SIZE, "%u\n", gpio); 
     255+               goto out; 
     256+       } 
     257+       if (attr == &gpiommc_attr_CLK) { 
     258+               gpio = dev->pdata.pins.gpio_clk; 
     259+               if (gpio == GPIO_INVALID) 
     260+                       count = snprintf(page, PAGE_SIZE, "not configured\n"); 
     261+               else 
     262+                       count = snprintf(page, PAGE_SIZE, "%u\n", gpio); 
     263+               goto out; 
     264+       } 
     265+       if (attr == &gpiommc_attr_CS) { 
     266+               gpio = dev->pdata.pins.gpio_cs; 
     267+               if (gpio == GPIO_INVALID) 
     268+                       count = snprintf(page, PAGE_SIZE, "not configured\n"); 
     269+               else 
     270+                       count = snprintf(page, PAGE_SIZE, "%u\n", gpio); 
     271+               goto out; 
     272+       } 
     273+       if (attr == &gpiommc_attr_CS_activelow) { 
     274+               count = snprintf(page, PAGE_SIZE, "%u\n", 
     275+                                dev->pdata.pins.cs_activelow); 
     276+               goto out; 
     277+       } 
     278+       if (attr == &gpiommc_attr_spimode) { 
     279+               count = snprintf(page, PAGE_SIZE, "%u\n", 
     280+                                dev->pdata.mode); 
     281+               goto out; 
     282+       } 
     283+       if (attr == &gpiommc_attr_spidelay) { 
     284+               count = snprintf(page, PAGE_SIZE, "%u\n", 
     285+                                !dev->pdata.no_spi_delay); 
     286+               goto out; 
     287+       } 
     288+       if (attr == &gpiommc_attr_max_bus_speed) { 
     289+               count = snprintf(page, PAGE_SIZE, "%u\n", 
     290+                                dev->pdata.max_bus_speed); 
     291+               goto out; 
     292+       } 
     293+       if (attr == &gpiommc_attr_register) { 
     294+               count = snprintf(page, PAGE_SIZE, "%u\n", 
     295+                                gpiommc_is_registered(dev)); 
     296+               goto out; 
     297+       } 
     298+       WARN_ON(1); 
     299+       err = -ENOSYS; 
    234300+out: 
    235 +       mutex_unlock(&gpiommc_sysfs_mutex); 
    236 + 
    237301+       return err ? err : count; 
    238 + 
    239 +err_free_pdev: 
    240 +       platform_device_put(pdev); 
    241 +       goto out; 
    242 +} 
    243 + 
    244 +static ssize_t gpiommc_remove_store(struct device_driver *drv, 
    245 +                                   const char *buf, size_t count) 
    246 +{ 
    247 +       struct gpiommc_sysfs_platform_data *pdata; 
     302+} 
     303+ 
     304+static int gpiommc_do_register(struct gpiommc_configfs_device *dev, 
     305+                              const char *name) 
     306+{ 
    248307+       int err; 
    249308+ 
    250 +       mutex_lock(&gpiommc_sysfs_mutex); 
    251 + 
    252 +       err = -ENODEV; 
    253 +       pdata = gpiommc_sysfs_find_dev(buf); 
    254 +       if (!pdata) 
    255 +               goto out; 
    256 + 
    257 +       list_del(&pdata->list); 
    258 +       platform_device_unregister(pdata->pdev); 
    259 + 
     309+       if (gpiommc_is_registered(dev)) 
     310+               return 0; 
     311+ 
     312+       if (!gpio_is_valid(dev->pdata.pins.gpio_di) || 
     313+           !gpio_is_valid(dev->pdata.pins.gpio_do) || 
     314+           !gpio_is_valid(dev->pdata.pins.gpio_clk) || 
     315+           !gpio_is_valid(dev->pdata.pins.gpio_cs)) { 
     316+               printk(KERN_ERR PFX 
     317+                      "configfs: Invalid GPIO pin number(s)\n"); 
     318+               return -EINVAL; 
     319+       } 
     320+ 
     321+       strlcpy(dev->pdata.name, name, 
     322+               sizeof(dev->pdata.name)); 
     323+ 
     324+       dev->pdev = platform_device_alloc(GPIOMMC_PLATDEV_NAME, 
     325+                                         gpiommc_next_id()); 
     326+       if (!dev->pdev) 
     327+               return -ENOMEM; 
     328+       err = platform_device_add_data(dev->pdev, &dev->pdata, 
     329+                                      sizeof(dev->pdata)); 
     330+       if (err) { 
     331+               platform_device_put(dev->pdev); 
     332+               return err; 
     333+       } 
     334+       err = platform_device_add(dev->pdev); 
     335+       if (err) { 
     336+               platform_device_put(dev->pdev); 
     337+               return err; 
     338+       } 
     339+ 
     340+       return 0; 
     341+} 
     342+ 
     343+static void gpiommc_do_unregister(struct gpiommc_configfs_device *dev) 
     344+{ 
     345+       if (!gpiommc_is_registered(dev)) 
     346+               return; 
     347+ 
     348+       platform_device_unregister(dev->pdev); 
     349+       dev->pdev = NULL; 
     350+} 
     351+ 
     352+static ssize_t gpiommc_config_attr_store(struct config_item *item, 
     353+                                        struct configfs_attribute *attr, 
     354+                                        const char *page, size_t count) 
     355+{ 
     356+       struct gpiommc_configfs_device *dev = ci_to_gpiommc(item); 
     357+       int err = -EINVAL; 
     358+       unsigned long data; 
     359+ 
     360+       if (attr == &gpiommc_attr_register) { 
     361+               err = strict_strtoul(page, 10, &data); 
     362+               if (err) 
     363+                       goto out; 
     364+               err = -EINVAL; 
     365+               if (data == 1) 
     366+                       err = gpiommc_do_register(dev, item->ci_name); 
     367+               if (data == 0) { 
     368+                       gpiommc_do_unregister(dev); 
     369+                       err = 0; 
     370+               } 
     371+               goto out; 
     372+       } 
     373+ 
     374+       if (gpiommc_is_registered(dev)) { 
     375+               /* The rest of the config parameters can only be set 
     376+                * as long as the device is not registered, yet. */ 
     377+               err = -EBUSY; 
     378+               goto out; 
     379+       } 
     380+ 
     381+       if (attr == &gpiommc_attr_DI) { 
     382+               err = strict_strtoul(page, 10, &data); 
     383+               if (err) 
     384+                       goto out; 
     385+               err = -EINVAL; 
     386+               if (!gpio_is_valid(data)) 
     387+                       goto out; 
     388+               dev->pdata.pins.gpio_di = data; 
     389+               err = 0; 
     390+               goto out; 
     391+       } 
     392+       if (attr == &gpiommc_attr_DO) { 
     393+               err = strict_strtoul(page, 10, &data); 
     394+               if (err) 
     395+                       goto out; 
     396+               err = -EINVAL; 
     397+               if (!gpio_is_valid(data)) 
     398+                       goto out; 
     399+               dev->pdata.pins.gpio_do = data; 
     400+               err = 0; 
     401+               goto out; 
     402+       } 
     403+       if (attr == &gpiommc_attr_CLK) { 
     404+               err = strict_strtoul(page, 10, &data); 
     405+               if (err) 
     406+                       goto out; 
     407+               err = -EINVAL; 
     408+               if (!gpio_is_valid(data)) 
     409+                       goto out; 
     410+               dev->pdata.pins.gpio_clk = data; 
     411+               err = 0; 
     412+               goto out; 
     413+       } 
     414+       if (attr == &gpiommc_attr_CS) { 
     415+               err = strict_strtoul(page, 10, &data); 
     416+               if (err) 
     417+                       goto out; 
     418+               err = -EINVAL; 
     419+               if (!gpio_is_valid(data)) 
     420+                       goto out; 
     421+               dev->pdata.pins.gpio_cs = data; 
     422+               err = 0; 
     423+               goto out; 
     424+       } 
     425+       if (attr == &gpiommc_attr_CS_activelow) { 
     426+               err = strict_strtoul(page, 10, &data); 
     427+               if (err) 
     428+                       goto out; 
     429+               err = -EINVAL; 
     430+               if (data != 0 && data != 1) 
     431+                       goto out; 
     432+               dev->pdata.pins.cs_activelow = data; 
     433+               err = 0; 
     434+               goto out; 
     435+       } 
     436+       if (attr == &gpiommc_attr_spimode) { 
     437+               err = strict_strtoul(page, 10, &data); 
     438+               if (err) 
     439+                       goto out; 
     440+               err = -EINVAL; 
     441+               switch (data) { 
     442+               case 0: 
     443+                       dev->pdata.mode = SPI_MODE_0; 
     444+                       break; 
     445+               case 1: 
     446+                       dev->pdata.mode = SPI_MODE_1; 
     447+                       break; 
     448+               case 2: 
     449+                       dev->pdata.mode = SPI_MODE_2; 
     450+                       break; 
     451+               case 3: 
     452+                       dev->pdata.mode = SPI_MODE_3; 
     453+                       break; 
     454+               default: 
     455+                       goto out; 
     456+               } 
     457+               err = 0; 
     458+               goto out; 
     459+       } 
     460+       if (attr == &gpiommc_attr_spidelay) { 
     461+               err = strict_strtoul(page, 10, &data); 
     462+               if (err) 
     463+                       goto out; 
     464+               err = -EINVAL; 
     465+               if (data != 0 && data != 1) 
     466+                       goto out; 
     467+               dev->pdata.no_spi_delay = !data; 
     468+               err = 0; 
     469+               goto out; 
     470+       } 
     471+       if (attr == &gpiommc_attr_max_bus_speed) { 
     472+               err = strict_strtoul(page, 10, &data); 
     473+               if (err) 
     474+                       goto out; 
     475+               err = -EINVAL; 
     476+               if (data > UINT_MAX) 
     477+                       goto out; 
     478+               dev->pdata.max_bus_speed = data; 
     479+               err = 0; 
     480+               goto out; 
     481+       } 
     482+       WARN_ON(1); 
     483+       err = -ENOSYS; 
    260484+out: 
    261 +       mutex_unlock(&gpiommc_sysfs_mutex); 
    262 + 
    263485+       return err ? err : count; 
    264486+} 
    265487+ 
    266 +static DRIVER_ATTR(add, 0200, 
    267 +                  NULL, gpiommc_add_store); 
    268 +static DRIVER_ATTR(remove, 0200, 
    269 +                  NULL, gpiommc_remove_store); 
     488+static void gpiommc_config_item_release(struct config_item *item) 
     489+{ 
     490+       struct gpiommc_configfs_device *dev = ci_to_gpiommc(item); 
     491+ 
     492+       kfree(dev); 
     493+} 
     494+ 
     495+static struct configfs_item_operations gpiommc_config_item_ops = { 
     496+       .release                = gpiommc_config_item_release, 
     497+       .show_attribute         = gpiommc_config_attr_show, 
     498+       .store_attribute        = gpiommc_config_attr_store, 
     499+}; 
     500+ 
     501+static struct config_item_type gpiommc_dev_ci_type = { 
     502+       .ct_item_ops    = &gpiommc_config_item_ops, 
     503+       .ct_attrs       = gpiommc_config_attrs, 
     504+       .ct_owner       = THIS_MODULE, 
     505+}; 
     506+ 
     507+static struct config_item *gpiommc_make_item(struct config_group *group, 
     508+                                            const char *name) 
     509+{ 
     510+       struct gpiommc_configfs_device *dev; 
     511+ 
     512+       if (strlen(name) > GPIOMMC_MAX_NAMELEN) { 
     513+               printk(KERN_ERR PFX "configfs: device name too long\n"); 
     514+               return NULL; 
     515+       } 
     516+ 
     517+       dev = kzalloc(sizeof(*dev), GFP_KERNEL); 
     518+       if (!dev) 
     519+               return NULL; 
     520+ 
     521+       config_item_init_type_name(&dev->item, name, 
     522+                                  &gpiommc_dev_ci_type); 
     523+ 
     524+       /* Assign default configuration */ 
     525+       dev->pdata.pins.gpio_di = GPIO_INVALID; 
     526+       dev->pdata.pins.gpio_do = GPIO_INVALID; 
     527+       dev->pdata.pins.gpio_clk = GPIO_INVALID; 
     528+       dev->pdata.pins.gpio_cs = GPIO_INVALID; 
     529+       dev->pdata.pins.cs_activelow = 1; 
     530+       dev->pdata.mode = SPI_MODE_0; 
     531+       dev->pdata.no_spi_delay = 0; 
     532+       dev->pdata.max_bus_speed = 5000000; /* 5 MHz */ 
     533+ 
     534+       return &(dev->item); 
     535+} 
     536+ 
     537+static void gpiommc_drop_item(struct config_group *group, 
     538+                             struct config_item *item) 
     539+{ 
     540+       struct gpiommc_configfs_device *dev = ci_to_gpiommc(item); 
     541+ 
     542+       gpiommc_do_unregister(dev); 
     543+       kfree(dev); 
     544+} 
     545+ 
     546+static struct configfs_group_operations gpiommc_ct_group_ops = { 
     547+       .make_item      = gpiommc_make_item, 
     548+       .drop_item      = gpiommc_drop_item, 
     549+}; 
     550+ 
     551+static struct config_item_type gpiommc_ci_type = { 
     552+       .ct_group_ops   = &gpiommc_ct_group_ops, 
     553+       .ct_owner       = THIS_MODULE, 
     554+}; 
     555+ 
     556+static struct configfs_subsystem gpiommc_subsys = { 
     557+       .su_group = { 
     558+               .cg_item = { 
     559+                       .ci_namebuf = GPIOMMC_PLATDEV_NAME, 
     560+                       .ci_type = &gpiommc_ci_type, 
     561+               }, 
     562+       }, 
     563+       .su_mutex = __MUTEX_INITIALIZER(gpiommc_subsys.su_mutex), 
     564+}; 
     565+ 
     566+#endif /* CONFIG_GPIOMMC_CONFIGFS */ 
    270567+ 
    271568+static struct platform_driver gpiommc_plat_driver = { 
     
    293590+       if (err) 
    294591+               return err; 
    295 +       err = driver_create_file(&gpiommc_plat_driver.driver, 
    296 +                                &driver_attr_add); 
    297 +       if (err) 
    298 +               goto err_drv_unreg; 
    299 +       err = driver_create_file(&gpiommc_plat_driver.driver, 
    300 +                                &driver_attr_remove); 
    301 +       if (err) 
    302 +               goto err_remove_add; 
     592+ 
     593+#ifdef CONFIG_GPIOMMC_CONFIGFS 
     594+       config_group_init(&gpiommc_subsys.su_group); 
     595+       err = configfs_register_subsystem(&gpiommc_subsys); 
     596+       if (err) { 
     597+               platform_driver_unregister(&gpiommc_plat_driver); 
     598+               return err; 
     599+       } 
     600+#endif /* CONFIG_GPIOMMC_CONFIGFS */ 
    303601+ 
    304602+       return 0; 
    305 + 
    306 +err_remove_add: 
    307 +       driver_remove_file(&gpiommc_plat_driver.driver, 
    308 +                          &driver_attr_add); 
    309 +err_drv_unreg: 
    310 +       platform_driver_unregister(&gpiommc_plat_driver); 
    311 +       return err; 
    312603+} 
    313604+module_init(gpiommc_modinit); 
     
    315606+static void __exit gpiommc_modexit(void) 
    316607+{ 
    317 +       struct gpiommc_sysfs_platform_data *pdata, *pdata_tmp; 
    318 + 
    319 +       driver_remove_file(&gpiommc_plat_driver.driver, 
    320 +                          &driver_attr_remove); 
    321 +       driver_remove_file(&gpiommc_plat_driver.driver, 
    322 +                          &driver_attr_add); 
    323 + 
    324 +       mutex_lock(&gpiommc_sysfs_mutex); 
    325 +       list_for_each_entry_safe(pdata, pdata_tmp, &gpiommc_sysfs_list, list) { 
    326 +               list_del(&pdata->list); 
    327 +               platform_device_unregister(pdata->pdev); 
    328 +       } 
    329 +       mutex_unlock(&gpiommc_sysfs_mutex); 
    330 + 
     608+#ifdef CONFIG_GPIOMMC_CONFIGFS 
     609+       configfs_unregister_subsystem(&gpiommc_subsys); 
     610+#endif 
    331611+       platform_driver_unregister(&gpiommc_plat_driver); 
    332612+} 
     
    334614Index: linux-2.6.25.10/drivers/mmc/host/Kconfig 
    335615=================================================================== 
    336 --- linux-2.6.25.10.orig/drivers/mmc/host/Kconfig       2008-07-18 22:30:36.000000000 +0200 
    337 +++ linux-2.6.25.10/drivers/mmc/host/Kconfig    2008-07-18 22:31:00.000000000 +0200 
    338 @@ -130,3 +130,23 @@ config MMC_SPI 
     616--- linux-2.6.25.10.orig/drivers/mmc/host/Kconfig       2008-07-20 20:32:22.000000000 +0200 
     617+++ linux-2.6.25.10/drivers/mmc/host/Kconfig    2008-07-20 20:33:20.000000000 +0200 
     618@@ -130,3 +130,27 @@ config MMC_SPI 
    339619  
    340620          If unsure, or if your system has no SPI master driver, say N. 
     
    348628+         the SPI protocol in software. 
    349629+ 
    350 +         This driver provides a sysfs interface to dynamically create 
    351 +         and destroy GPIO-based MMC/SD card interfaces. It also provides 
     630+         This driver provides a configfs interface to dynamically create 
     631+         and destroy GPIO-based MMC/SD card devices. It also provides 
    352632+         a platform device interface API. 
    353633+         See Documentation/gpiommc.txt for details. 
     
    357637+         If unsure, say N. 
    358638+ 
    359 +config MMC_S3C 
    360 +       tristate "Samsung S3C SD/MMC Card Interface support" 
    361 +       depends on ARCH_S3C2410 && MMC 
     639+config GPIOMMC_CONFIGFS 
     640+       bool 
     641+       depends on GPIOMMC && CONFIGFS_FS 
     642+       default y 
     643+       help 
     644+         This option automatically enables configfs support for gpiommc 
     645+         if configfs is available. 
    362646Index: linux-2.6.25.10/drivers/mmc/host/Makefile 
    363647=================================================================== 
    364 --- linux-2.6.25.10.orig/drivers/mmc/host/Makefile      2008-07-18 22:30:36.000000000 +0200 
    365 +++ linux-2.6.25.10/drivers/mmc/host/Makefile   2008-07-18 22:31:20.000000000 +0200 
    366 @@ -18,3 +18,4 @@ obj-$(CONFIG_MMC_AT91)                += at91_mci.o 
     648--- linux-2.6.25.10.orig/drivers/mmc/host/Makefile      2008-07-20 20:32:22.000000000 +0200 
     649+++ linux-2.6.25.10/drivers/mmc/host/Makefile   2008-07-20 20:33:20.000000000 +0200 
     650@@ -17,4 +17,4 @@ obj-$(CONFIG_MMC_OMAP)                += omap.o 
     651 obj-$(CONFIG_MMC_AT91)         += at91_mci.o 
    367652 obj-$(CONFIG_MMC_TIFM_SD)      += tifm_sd.o 
    368653 obj-$(CONFIG_MMC_SPI)          += mmc_spi.o 
    369   
     654- 
    370655+obj-$(CONFIG_GPIOMMC)          += gpiommc.o 
    371656Index: linux-2.6.25.10/include/linux/mmc/gpiommc.h 
    372657=================================================================== 
    373658--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    374 +++ linux-2.6.25.10/include/linux/mmc/gpiommc.h 2008-07-18 22:31:00.000000000 +0200 
    375 @@ -0,0 +1,62 @@ 
     659+++ linux-2.6.25.10/include/linux/mmc/gpiommc.h 2008-07-20 20:33:20.000000000 +0200 
     660@@ -0,0 +1,71 @@ 
    376661+/* 
    377662+ * Device driver for MMC/SD cards driven over a GPIO bus. 
     
    388673+ 
    389674+#define GPIOMMC_MAX_NAMELEN            15 
    390 + 
    391 +/** struct gpiommc_pins - Hardware pin assignments 
     675+#define GPIOMMC_MAX_NAMELEN_STR                __stringify(GPIOMMC_MAX_NAMELEN) 
     676+ 
     677+/** 
     678+ * struct gpiommc_pins - Hardware pin assignments 
     679+ * 
    392680+ * @gpio_di: The GPIO number of the DATA IN pin 
    393681+ * @gpio_do: The GPIO number of the DATA OUT pin 
     
    404692+}; 
    405693+ 
    406 +/** struct gpiommc_platform_data - Platform data for a MMC-over-SPI-GPIO device. 
     694+/** 
     695+ * struct gpiommc_platform_data - Platform data for a MMC-over-SPI-GPIO device. 
     696+ * 
    407697+ * @name: The unique name string of the device. 
    408698+ * @pins: The hardware pin assignments. 
     
    422712+}; 
    423713+ 
    424 +/** GPIOMMC_PLATDEV_NAME - The platform device name string. 
     714+/** 
     715+ * GPIOMMC_PLATDEV_NAME - The platform device name string. 
     716+ * 
    425717+ * The name string that has to be used for platform_device_alloc 
    426718+ * when allocating a gpiommc device. 
     
    428720+#define GPIOMMC_PLATDEV_NAME   "gpiommc" 
    429721+ 
    430 +/** gpiommc_next_id - Get another platform device ID number. 
     722+/** 
     723+ * gpiommc_next_id - Get another platform device ID number. 
     724+ * 
    431725+ * This returns the next platform device ID number that has to be used 
    432726+ * for platform_device_alloc. The ID is opaque and should not be used for 
     
    439733=================================================================== 
    440734--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    441 +++ linux-2.6.25.10/Documentation/gpiommc.txt   2008-07-18 22:31:00.000000000 +0200 
    442 @@ -0,0 +1,96 @@ 
     735+++ linux-2.6.25.10/Documentation/gpiommc.txt   2008-07-20 20:33:20.000000000 +0200 
     736@@ -0,0 +1,97 @@ 
    443737+GPIOMMC - Driver for an MMC/SD card on a bitbanging GPIO SPI bus 
    444738+================================================================ 
     
    447741+MMC or SD card on GPIO pins. 
    448742+ 
    449 +Two interfaces for registering a new MMC/SD card device are provided. 
    450 +A static platform-device based mechanism and a dynamic sysfs based interface. 
     743+Two interfaces for registering a new MMC/SD card device are provided: 
     744+A static platform-device based mechanism and a dynamic configfs based interface. 
    451745+ 
    452746+ 
     
    458752+with MMC/SD devices statically connected to the platform GPIO bus. 
    459753+ 
    460 +The data structures are declared in <linux/mmc/gpiommc.h> 
     754+The data structures are declared in <linux/mmc/gpiommc.h>. 
    461755+ 
    462756+To register a new device, define an instance of struct gpiommc_platform_data. 
     
    475769+       err = platform_device_add_data(pdev, pdata, sizeof(struct gpiommc_platform_data)); 
    476770+ 
    477 +You may free the local instance of struct gpiommc_platform_data now. 
     771+You may free the local instance of struct gpiommc_platform_data now. (So the 
     772+struct may be allocated on the stack, too). 
    478773+Now simply register the platform device. 
    479774+ 
    480775+       err = platform_device_add(pdev); 
    481776+ 
    482 +Done. The gpiommc probe routine should be called and you should see a dmesg 
    483 +message for the added device. 
    484 + 
    485 + 
    486 +Registering devices via sysfs 
    487 +============================= 
    488 + 
    489 +MMC/SD cards connected via GPIO often are a pretty dynamic thing. For example 
     777+Done. The gpiommc probe routine will be invoked now and you should see a kernel 
     778+log message for the added device. 
     779+ 
     780+ 
     781+Registering devices via configfs 
     782+================================ 
     783+ 
     784+MMC/SD cards connected via GPIO often are a pretty dynamic thing, as for example 
    490785+selfmade hacks for soldering an MMC/SD card to standard GPIO pins on embedded 
    491786+hardware are a common situation. 
     
    493788+devices from userspace, without the need to recompile the kernel. 
    494789+ 
    495 +There are two sysfs files responsible for that: 
    496 +export ADD=/sys/bus/platform/drivers/gpiommc/add 
    497 +export REMOVE=/sys/bus/platform/drivers/gpiommc/remove 
    498 + 
    499 +To add a new device, simply echo the configuration string to the "add" file. 
    500 +The config string is composed out of the following elements: 
    501 + 
    502 +DEVNAME DIpin DOpin CLKpin CSpin SPIMODE MAXBUSSPEED NO_SPI_DELAY CSACTIVELOW 
    503 + 
    504 +DEVNAME is a unique name string for the device. 
    505 +DIpin is the SPI DI GPIO pin. 
    506 +DOpin is the SPI DO GPIO pin. 
    507 +CLKpin is the SPI CLOCK GPIO pin. 
    508 +CSpin is the SPI CHIPSELECT GPIO pin. 
    509 +SPIMODE is the hardware mode the device will run at. Can be 0-3. 
    510 +MAXBUSSPEED is the maximum bus speed in Hertz. 
    511 +NO_SPI_DELAY can be 1 or 0. If it is 1, then the lowlevel SPI delay 
    512 +will not be performed. This is not standards compliant, but may be required 
    513 +to gain reasonable speeds on embedded hardware. 
    514 +CSACTIVELOW can be 1 or 0. If it is 1, the chip is considered to be selected, if CS 
    515 +is at a logical 0. 
    516 + 
    517 +Note that the elements SPIMODE, MAXBUSSPEED and NO_SPI_DELAY are optional 
    518 +and can be omitted. 
    519 +SPIMODE will default to 0. 
    520 +MAXBUSSSPEED will default to 5Mhz. 
    521 +NO_SPI_DELAY will default to 0. 
    522 +CSACTIVELOW will default to 1. 
    523 + 
    524 +Example: 
    525 + 
    526 +       echo -n "my_device 5 4 3 7 0 1000000 1" > $ADD 
    527 + 
    528 +This will add a new device called "my_device" with the GPIO pins assigned as 
    529 +DI=5, DO=4, CLK=3, CS=7 
    530 +The hardware mode will be SPI_MODE_0. 
    531 +The maximum bus speed will be 1000000 Hz (1Mhz) 
    532 +And the explicit SPI delay at the lowlevel bitbang loop will be switched off. 
    533 + 
    534 +To remove a device, simply echo the device name string to the "remove" file. 
    535 + 
    536 +Example: 
    537 + 
    538 +       echo -n "my_device" > $REMOVE 
     790+The "gpiommc" subdirectory at the configfs mountpoint is used for handling 
     791+the dynamic configuration. 
     792+ 
     793+To create a new device, it must first be allocated with mkdir. 
     794+The following command will allocate a device named "my_mmc": 
     795+       mkdir /config/gpiommc/my_mmc 
     796+ 
     797+There are several configuration files available in the new 
     798+/config/gpiommc/my_mmc/ directory: 
     799+ 
     800+gpio_data_in                   = The SPI data-IN GPIO pin number. 
     801+gpio_data_out                  = The SPI data-OUT GPIO pin number. 
     802+gpio_clock                     = The SPI Clock GPIO pin number. 
     803+gpio_chipselect                        = The SPI Chipselect GPIO pin number. 
     804+gpio_chipselect_activelow      = Boolean. If 0, Chipselect is active-HIGH. 
     805+                                 If 1, Chipselect is active-LOW. 
     806+spi_mode                       = The SPI data mode. Can be 0-3. 
     807+spi_delay                      = Enable all delays in the lowlevel bitbanging. 
     808+max_bus_speed                  = The maximum SPI bus speed. In Hertz. 
     809+ 
     810+register                       = Not a configuration parameter. 
     811+                                 Used to register the configured card 
     812+                                 with the kernel. 
     813+ 
     814+The device must first get configured and then registered by writing "1" to 
     815+the "register" file. 
     816+The configuration parameters "gpio_data_in", "gpio_data_out", "gpio_clock" 
     817+and "gpio_chipselect" are essential and _must_ be configured before writing 
     818+"1" to the "register" file. The registration will fail, otherwise. 
     819+ 
     820+The default values for the other parameters are: 
     821+gpio_chipselect_activelow      = 1             (CS active-LOW) 
     822+spi_mode                       = 0             (SPI_MODE_0) 
     823+spi_delay                      = 1             (enabled) 
     824+max_bus_speed                  = 5000000       (5 Mhz) 
     825+ 
     826+Configuration values can not be changed after registration. To unregister 
     827+the device, write a "0" to the "register" file. The configuration can be 
     828+changed again after unregistering. 
     829+ 
     830+To completely remove the device, simply rmdir the directory 
     831+(/config/gpiommc/my_mmc in this example). 
     832+There's no need to first unregister the device before removing it. That will 
     833+be done automatically. 
    539834Index: linux-2.6.25.10/MAINTAINERS 
    540835=================================================================== 
    541 --- linux-2.6.25.10.orig/MAINTAINERS    2008-07-18 22:30:41.000000000 +0200 
    542 +++ linux-2.6.25.10/MAINTAINERS 2008-07-18 22:31:00.000000000 +0200 
     836--- linux-2.6.25.10.orig/MAINTAINERS    2008-07-20 20:33:20.000000000 +0200 
     837+++ linux-2.6.25.10/MAINTAINERS 2008-07-20 20:33:20.000000000 +0200 
    543838@@ -1736,6 +1736,11 @@ L:       gigaset307x-common@lists.sourceforge. 
    544839 W:     http://gigaset307x.sourceforge.net/ 
Note: See TracChangeset for help on using the changeset viewer.