lkml.org 
[lkml]   [2002]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patches in this message
    /
    Date
    From
    Subject[PATCH] 2.5.31 driverfs: patch for your consideration
    Here's the patch as we discussed.

    diff -ur --new-file a/drivers/base/interface.c b/drivers/base/interface.c
    --- a/drivers/base/interface.c Wed Aug 14 17:09:28 2002
    +++ b/drivers/base/interface.c Fri Aug 16 22:03:18 2002
    @@ -88,8 +88,20 @@
    static DEVICE_ATTR(power,"power",S_IWUSR | S_IRUGO,
    device_read_power,device_write_power);

    +
    +static ssize_t device_read_driver(struct device * dev, char * buf,
    size_t count, loff_t off)
    +{
    + if (dev->driver)
    + return off ? 0 : sprintf(buf,"%s\n",dev->driver->name);
    + else
    + return 0;
    +}
    +
    +static DEVICE_ATTR(driver,"driver",S_IRUGO,device_read_driver,NULL);
    +
    struct device_attribute * device_default_files[] = {
    &dev_attr_name,
    &dev_attr_power,
    + &dev_attr_driver,
    NULL,
    };




    Also if You're interested here's the write support for "driver".

    diff -ur --new-file a/drivers/base/base.h b/drivers/base/base.h
    --- a/drivers/base/base.h Fri Aug 16 12:20:18 2002
    +++ b/drivers/base/base.h Fri Aug 16 22:17:26 2002
    @@ -26,3 +26,5 @@

    extern int driver_attach(struct device_driver * drv);
    extern void driver_detach(struct device_driver * drv);
    +extern int do_driver_detach(struct device * dev, struct device_driver *
    drv);
    +extern int do_driver_attach(struct device * dev, void * data);
    diff -ur --new-file a/drivers/base/core.c b/drivers/base/core.c
    --- a/drivers/base/core.c Wed Aug 14 17:09:28 2002
    +++ b/drivers/base/core.c Fri Aug 16 22:16:30 2002
    @@ -98,7 +98,7 @@

    static void device_detach(struct device * dev)
    {
    - struct device_driver * drv;
    + struct device_driver * drv;

    if (dev->driver) {
    lock_device(dev);
    @@ -117,7 +117,7 @@
    }
    }

    -static int do_driver_attach(struct device * dev, void * data)
    +int do_driver_attach(struct device * dev, void * data)
    {
    struct device_driver * drv = (struct device_driver *)data;
    int error = 0;
    @@ -134,7 +134,7 @@
    return bus_for_each_dev(drv->bus,drv,do_driver_attach);
    }

    -static int do_driver_detach(struct device * dev, struct device_driver *
    drv)
    +int do_driver_detach(struct device * dev, struct device_driver * drv)
    {
    lock_device(dev);
    if (dev->driver == drv) {
    diff -ur --new-file a/drivers/base/interface.c b/drivers/base/interface.c
    --- a/drivers/base/interface.c Fri Aug 16 22:06:41 2002
    +++ b/drivers/base/interface.c Fri Aug 16 22:15:29 2002
    @@ -8,6 +8,7 @@
    #include <linux/device.h>
    #include <linux/err.h>
    #include <linux/stat.h>
    +#include "base.h"

    static ssize_t device_read_name(struct device * dev, char * buf, size_t
    count, loff_t off)
    {
    @@ -97,7 +98,44 @@
    return 0;
    }

    -static DEVICE_ATTR(driver,"driver",S_IRUGO,device_read_driver,NULL);
    +struct device_driver * find_driver_by_name(struct bus_type * bus, char
    * name)
    +{
    + struct list_head * pos;
    + struct device_driver * drv;
    + list_for_each (pos, &bus->drivers)
    + {
    + drv = list_entry(pos, struct device_driver, bus_list);
    + if (!strncmp(drv->name,name,strlen(name) - 1))
    + return drv;
    +
    + }
    + return NULL;
    +
    +}
    +
    +static ssize_t device_write_driver(struct device * dev, char * buf,
    size_t count, loff_t off)
    +{
    + struct device_driver * drv = NULL;
    + int error = 0;
    + if (off)
    + return 0;
    + if (!dev->bus)
    + return count;
    + if (!dev->driver)
    + {
    + drv = find_driver_by_name(dev->bus, buf);
    + if (drv)
    + error = do_driver_attach(dev,drv);
    +
    + } else if (!strnicmp(buf,"remove",6))
    + {
    + error = do_driver_detach(dev, dev->driver);
    + }
    + return error < 0 ? error : count;
    +}
    +
    +static DEVICE_ATTR(driver,"driver",S_IWUSR | S_IRUGO,
    + device_read_driver,device_write_driver);

    struct device_attribute * device_default_files[] = {
    &dev_attr_name,


    I look forward to hearing from you.

    Thanks,
    Adam

    PS: Would you be interested in a patch that would port the pnpbios
    driver to the driver model?

    -
    To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    the body of a message to majordomo@vger.kernel.org
    More majordomo info at http://vger.kernel.org/majordomo-info.html
    Please read the FAQ at http://www.tux.org/lkml/

    \
     
     \ /
      Last update: 2005-03-22 13:28    [W:0.029 / U:146.768 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site