PowerPC: ibmebus refactoring and fixes
Subsystems (4)
cover PowerPC: ibmebus refactoring and fixes
This patchset will merge the ibmebus and of_platform bus drivers by basing a lot of ibmebus functionality on of_platform code and adding the features specific to ibmebus on top of that.
This is a repost of my previous patchset incorporating Arnd's comments.
I split the actual ibmebus rework into three patches (2/5-4/5) for easier readability. The kernel will compile during the intermediate states, and ibmebus will not crash, but not work either.
As a side-effect of patch 3/5, a problem with bus_id collisions in case of two devices sharing the same location code is resolved -- the bus_id is now determined differently.
[1/5] moves of_device allocation into of_device.[ch] [2/5] removes the old bus match/probe/remove functions [3/5] adds device creation and bus probing based on of_device [4/5] finally moves to of_device and of_platform_driver by changing
ibmebus.h and matching the eHCA and eHEA drivers
[5/5] just changes a nit in ibmebus_store_probe()
These patches should apply cleanly, in order, against 2.6.23-rc5 and against Linus' git. Please review and comment them, and queue them up for 2.6.24 if you think they're okay.
Thanks and regards,
Joachim
arch/powerpc/kernel/ibmebus.c | 267 ++++++++-----------------=
=2D---
arch/powerpc/kernel/of_device.c | 80 +++++++++ arch/powerpc/kernel/of_platform.c | 70 +-------- drivers/infiniband/hw/ehca/ehca_classes.h | 2 +- drivers/infiniband/hw/ehca/ehca_eq.c | 6 +- drivers/infiniband/hw/ehca/ehca_main.c | 32 ++-- drivers/net/ehea/ehea.h | 2 +- drivers/net/ehea/ehea_main.c | 72 ++++---- include/asm-powerpc/ibmebus.h | 38 +---- include/asm-powerpc/of_device.h | 4 + include/linux/of_device.h | 5 + 11 files changed, 228 insertions(+), 350 deletions(-)
=2D-=20
Joachim Fenkes =A0-- =A0eHCA Linux Driver Developer and Hardware Tamer IBM Deutschland Entwicklung GmbH =A0-- =A0Dept. 3627 (I/O Firmware Dev. 2) Schoenaicher Strasse 220 =A0-- =A071032 Boeblingen =A0-- =A0Germany
eMail: [email protected]
PATCH 1/5 PowerPC: Move of_device allocation into of_device.[ch]
Extract generic of_device allocation code from of_platform_device_create() and move it into of_device.[ch], called of_device_alloc(). Also, there's now of_device_free() which puts the device node.
This way, bus drivers that build on of_platform (like ibmebus will) can build upon this code instead of reinventing the wheel.
--- include/asm-powerpc/of_device.h | 4 ++ include/linux/of_device.h | 5 ++ arch/powerpc/kernel/of_device.c | 80 +++++++++++++++++++++++++++++++++++++ arch/powerpc/kernel/of_platform.c | 70 +------------------------------- 4 files changed, 91 insertions(+), 68 deletions(-)
include/asm-powerpc/of_device.h +4 -0
@@ -17,6 +17,10 @@ struct of_devicestruct device dev;/* Generic device interface */ }; +extern struct of_device *of_device_alloc (struct device_node *np, +const char *bus_id, +struct device *parent); +extern ssize_t of_device_get_modalias (struct of_device *ofdev,char *str,ssize_t len); extern int of_device_uevent(struct device *dev,
include/linux/of_device.h +5 -0
@@ -22,5 +22,10 @@ extern int of_device_register(struct of_device *ofdev);extern void of_device_unregister (struct of_device *ofdev);extern void of_release_dev (struct device *dev); +static inline void of_device_free (struct of_device *dev) +{ +of_release_dev (&dev->dev); +} +#endif /* __KERNEL__ */ #endif /* _LINUX_OF_DEVICE_H */
arch/powerpc/kernel/of_device.c +80 -0
88 lines not on this page · raw message
arch/powerpc/kernel/of_platform.c +2 -68
106 lines not on this page · raw message
Signature · 1 line
1.5.2
Re: [PATCH 1/5] PowerPC: Move of_device allocation into of_device.[ch]
Quoted 8 lines · Joachim Fenkes
Extract generic
of_deviceallocation code fromof_platform_device_create()and move it into of_device.[ch], calledof_device_alloc(). Also, there's nowof_device_free()which puts the device node.This way, bus drivers that build on
of_platform(like ibmebus will) can build upon this code instead of reinventing the wheel.Signed-off-by Joachim Fenkes <[email protected]>
PATCH 2/5 ibmebus: Remove bus match/probe/remove functions
In reply to Joachim FenkesRemove old code that will be replaced by rewritten and shorter functions in the next patch. Keep struct ibmebus_dev and struct ibmebus_driver for now, but replace ibmebus_{,un}register_driver() by dummy functions. This way, the kernel will still compile and run during the transition and git bisect will be happy.
--- arch/powerpc/kernel/ibmebus.c | 199 ++--------------------------------------- 1 files changed, 6 insertions(+), 193 deletions(-)
arch/powerpc/kernel/ibmebus.c +6 -193
@@ -41,6 +41,7 @@#include <linux/kobject.h> #include <linux/dma-mapping.h> #include <linux/interrupt.h> +#include <linux/of_platform.h> #include <asm/ibmebus.h> #include <asm/abs_addr.h>
@@ -123,183 +124,14 @@ static struct dma_mapping_ops ibmebus_dma_ops = { .dma_supported = ibmebus_dma_supported, }; -static int ibmebus_bus_probe (struct device *dev) -{ -struct ibmebus_dev *ibmebusdev =to_ibmebus_dev (dev); -struct ibmebus_driver *ibmebusdrv =to_ibmebus_driver (dev->driver); -const struct of_device_id *id; -int error = -ENODEV ; - -if (!ibmebusdrv->probe) -return error; - - id =of_match_device (ibmebusdrv->id_table, &ibmebusdev->ofdev); -if (id) { - error = ibmebusdrv->probe (ibmebusdev, id); - } - -return error; -} - -static int ibmebus_bus_remove (struct device *dev) -{ -struct ibmebus_dev *ibmebusdev =to_ibmebus_dev (dev); -struct ibmebus_driver *ibmebusdrv =to_ibmebus_driver (dev->driver); - -if (ibmebusdrv->remove) { -return ibmebusdrv->remove (ibmebusdev); - } - -return 0 ; -} - -static void __devinit ibmebus_dev_release (struct device *dev) -{ -of_node_put (to_ibmebus_dev (dev)->ofdev.node); -kfree (to_ibmebus_dev (dev)); -} - -static int __devinit ibmebus_register_device_common ( -struct ibmebus_dev *dev,const char *name) -{ -int err =0 ; - - dev->ofdev.dev.parent = &ibmebus_bus_device; - dev->ofdev.dev.bus = &ibmebus_bus_type; - dev->ofdev.dev.release = ibmebus_dev_release; - - dev->ofdev.dev.archdata.of_node = dev->ofdev.node; - dev->ofdev.dev.archdata.dma_ops = &ibmebus_dma_ops; - dev->ofdev.dev.archdata.numa_node =of_node_to_nid (dev->ofdev.node); - -/* An ibmebusdev is based on a of_device. We have to change the -* bus type to use our own DMA mapping operations. -*/ -if ((err =of_device_register (&dev->ofdev)) !=0 ) { -printk (KERN_ERR "%s: failed to register device (%d).\n" , - __FUNCTION__, err); -return -ENODEV ; - } - -return 0 ; -} - -static struct ibmebus_dev *__devinit ibmebus_register_device_node ( -struct device_node *dn) -{ -struct ibmebus_dev *dev; -int i, len, bus_len; - - dev =kzalloc (sizeof (struct ibmebus_dev ),GFP_KERNEL ); -if (!dev) -return ERR_PTR (-ENOMEM ); - - dev->ofdev.node =of_node_get (dn); - - len =strlen (dn->full_name +1 ); - bus_len =min (len,BUS_ID_SIZE -1 ); -memcpy (dev->ofdev.dev.bus_id, dn->full_name +1 - + (len - bus_len), bus_len); -for (i =0 ; i < bus_len; i++) -if (dev->ofdev.dev.bus_id[i] =='/' ) - dev->ofdev.dev.bus_id[i] ='_' ; - -/* Register with generic device framework. */ -if (ibmebus_register_device_common (dev, dn->name) !=0 ) { -kfree (dev); -return ERR_PTR (-ENODEV ); - } - -return dev; -} - -static void ibmebus_probe_of_nodes (char * name) -{ -struct device_node *dn =NULL ; - -while ((dn =of_find_node_by_name (dn, name))) { -if (IS_ERR (ibmebus_register_device_node (dn))) { -of_node_put (dn); -return ; - } - } - -of_node_put (dn); - -return ; -} - -static void ibmebus_add_devices_by_id (struct of_device_id *idt) -{ -while (strlen (idt->name) >0 ) { -ibmebus_probe_of_nodes (idt->name); - idt++; - } - -return ; -} - -static int ibmebus_match_name (struct device *dev,void *data) -{ -const struct ibmebus_dev *ebus_dev =to_ibmebus_dev (dev); -const char *name; - - name =of_get_property (ebus_dev->ofdev.node,"name" ,NULL ); - -if (name && (strcmp (data, name) ==0 )) -return 1 ; - -return 0 ; -} - -static int ibmebus_unregister_device (struct device *dev) -{ -of_device_unregister (to_of_device (dev)); - -return 0 ; -} - -static void ibmebus_remove_devices_by_id (struct of_device_id *idt) -{ -struct device *dev; - -while (strlen (idt->name) >0 ) { -while ((dev =bus_find_device (&ibmebus_bus_type,NULL , - (void *)idt->name, - ibmebus_match_name))) { -ibmebus_unregister_device (dev); - } - idt++; - } - -return ; -} -int ibmebus_register_driver (struct ibmebus_driver *drv) { -int err =0 ; - - drv->driver.name = drv->name; - drv->driver.bus = &ibmebus_bus_type; - drv->driver.probe = ibmebus_bus_probe; - drv->driver.remove = ibmebus_bus_remove; - -if ((err =driver_register (&drv->driver) !=0 )) -return err; - -/* remove all supported devices first, in case someone -* probed them manually before registering the driver */ -ibmebus_remove_devices_by_id (drv->id_table); -ibmebus_add_devices_by_id (drv->id_table); -return 0 ; }EXPORT_SYMBOL (ibmebus_register_driver);void ibmebus_unregister_driver (struct ibmebus_driver *drv) { -driver_unregister (&drv->driver); -ibmebus_remove_devices_by_id (drv->id_table); }EXPORT_SYMBOL (ibmebus_unregister_driver);
@@ -327,23 +159,6 @@ void ibmebus_free_irq(struct ibmebus_dev *dev, u32 ist, void *dev_id) }EXPORT_SYMBOL (ibmebus_free_irq); -static int ibmebus_bus_match (struct device *dev,struct device_driver *drv) -{ -const struct ibmebus_dev *ebus_dev =to_ibmebus_dev (dev); -struct ibmebus_driver *ebus_drv =to_ibmebus_driver (drv); -const struct of_device_id *ids = ebus_drv->id_table; -const struct of_device_id *found_id; - -if (!ids) -return 0 ; - - found_id =of_match_device (ids, &ebus_dev->ofdev); -if (found_id) -return 1 ; - -return 0 ; -} -static ssize_t name_show (struct device *dev,struct device_attribute *attr,char *buf) {
@@ -404,7 +219,7 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus, }if ((dn =of_find_node_by_path (path))) { - dev =ibmebus_register_device_node (dn); +/* dev = ibmebus_register_device_node(dn); */ of_node_put (dn); rc =IS_ERR (dev) ?PTR_ERR (dev) : count; }else {
@@ -430,7 +245,7 @@ static ssize_t ibmebus_store_remove(struct bus_type *bus,if ((dev =bus_find_device (&ibmebus_bus_type,NULL , path, ibmebus_match_path))) { -ibmebus_unregister_device (dev); +/* ibmebus_unregister_device(dev); */ kfree (path);return count;
@@ -450,8 +265,6 @@ static struct bus_attribute ibmebus_bus_attrs[] = { };struct bus_type ibmebus_bus_type = { - .name ="ibmebus" , - .match = ibmebus_bus_match, .dev_attrs = ibmebus_dev_attrs, .bus_attrs = ibmebus_bus_attrs };
@@ -463,9 +276,9 @@ static int __init ibmebus_bus_init(void)printk (KERN_INFO "IBM eBus Device Driver\n" ); - err =bus_register (&ibmebus_bus_type); + err =of_bus_type_init (&ibmebus_bus_type,"ibmebus" );if (err) { -printk (KERN_ERR ":%s: failed to register IBM eBus.\n" , +printk (KERN_ERR "%s: failed to register IBM eBus.\n" , __FUNCTION__);return err; }
@@ -481,4 +294,4 @@ static int __init ibmebus_bus_init(void)return 0 ; } -__initcall (ibmebus_bus_init); +postcore_initcall (ibmebus_bus_init);
Signature · 1 line
1.5.2
Re: [PATCH 2/5] ibmebus: Remove bus match/probe/remove functions
Quoted 7 lines · Joachim Fenkes
Remove old code that will be replaced by rewritten and shorter functions in the next patch. Keep struct
ibmebus_devand structibmebus_driverfor now, but replace ibmebus_{,un}register_driver() by dummy functions. This way, the kernel will still compile and run during the transition and git bisect will be happy.Signed-off-by Joachim Fenkes <[email protected]>
PATCH 3/5 ibmebus: Add device creation and bus probing based on of_device
In reply to Joachim FenkesThe devtree root is now searched for devices matching a built-in whitelist during boot, so these devices appear on the bus from the beginning. It is still possible to manually add/remove devices to/from the bus by using the probe/remove sysfs interface. Also, when a device driver registers itself, the devtree is matched against its matchlist.
--- arch/powerpc/kernel/ibmebus.c | 100 +++++++++++++++++++++++++++++++++------- 1 files changed, 82 insertions(+), 18 deletions(-)
arch/powerpc/kernel/ibmebus.c +82 -18
@@ -51,6 +51,13 @@ static struct device ibmebus_bus_device = { /* fake "parent" device */struct bus_type ibmebus_bus_type; +/* These devices will automatically be added to the bus during init */ +static struct of_device_id builtin_matches[] = { + { .compatible ="IBM,lhca" }, + { .compatible ="IBM,lhea" }, + {}, +}; + static void *ibmebus_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_handle,
@@ -124,6 +131,67 @@ static struct dma_mapping_ops ibmebus_dma_ops = { .dma_supported = ibmebus_dma_supported, }; +static int ibmebus_match_path (struct device *dev,void *data) +{ +struct device_node *dn =to_of_device (dev)->node; +return (dn->full_name && + (strcasecmp ((char *)data, dn->full_name) ==0 )); +} + +static int ibmebus_match_node (struct device *dev,void *data) +{ +return to_of_device (dev)->node == data; +} + +static int ibmebus_create_device (struct device_node *dn) +{ +struct of_device *dev; +int ret; + + dev =of_device_alloc (dn,NULL , &ibmebus_bus_device); +if (!dev) +return -ENOMEM ; + + dev->dev.bus = &ibmebus_bus_type; + dev->dev.archdata.dma_ops = &ibmebus_dma_ops; + + ret =of_device_register (dev); +if (ret) { +of_device_free (dev); +return ret; + } + +return 0 ; +} + +static int ibmebus_create_devices (const struct of_device_id *matches) +{ +struct device_node *root, *child; +int ret =0 ; + + root =of_find_node_by_path ("/" ); + +for (child =NULL ; (child =of_get_next_child (root, child)); ) { +if (!of_match_node (matches, child)) +continue ; + +if (bus_find_device (&ibmebus_bus_type,NULL , child, + ibmebus_match_node)) +continue ; + + ret =ibmebus_create_device (child); +if (ret) { +printk (KERN_ERR "%s: failed to create device (%i)" , + __FUNCTION__, ret); +of_node_put (child); +break ; + } + } + +of_node_put (root); +return ret; +} +int ibmebus_register_driver (struct ibmebus_driver *drv) {return 0 ;
@@ -172,18 +240,6 @@ static struct device_attribute ibmebus_dev_attrs[] = { __ATTR_NULL }; -static int ibmebus_match_path (struct device *dev,void *data) -{ -int rc; -struct device_node *dn = -of_node_get (to_ibmebus_dev (dev)->ofdev.node); - - rc = (dn->full_name && (strcasecmp ((char *)data, dn->full_name) ==0 )); - -of_node_put (dn); -return rc; -} -static char *ibmebus_chomp (const char *in,size_t count) {char *out = (char *)kmalloc (count +1 ,GFP_KERNEL );
@@ -202,9 +258,8 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus, const char *buf, size_t count) {struct device_node *dn =NULL ; -struct ibmebus_dev *dev;char *path; -ssize_t rc; +ssize_t rc =0 ; path =ibmebus_chomp (buf, count);if (!path)
@@ -219,9 +274,8 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus, }if ((dn =of_find_node_by_path (path))) { -/* dev = ibmebus_register_device_node(dn); */ + rc =ibmebus_create_device (dn);of_node_put (dn); - rc =IS_ERR (dev) ?PTR_ERR (dev) : count; }else {printk (KERN_WARNING "%s: no such device node: %s\n" , __FUNCTION__, path);
@@ -230,7 +284,9 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus, out:kfree (path); -return rc; +if (rc) +return rc; +return count; } static ssize_t ibmebus_store_remove(struct bus_type *bus,
@@ -245,7 +301,7 @@ static ssize_t ibmebus_store_remove(struct bus_type *bus,if ((dev =bus_find_device (&ibmebus_bus_type,NULL , path, ibmebus_match_path))) { -/* ibmebus_unregister_device(dev); */ +of_device_unregister (to_of_device (dev));kfree (path);return count;
@@ -265,6 +321,7 @@ static struct bus_attribute ibmebus_bus_attrs[] = { };struct bus_type ibmebus_bus_type = { + .uevent = of_device_uevent, .dev_attrs = ibmebus_dev_attrs, .bus_attrs = ibmebus_bus_attrs };
@@ -292,6 +349,13 @@ static int __init ibmebus_bus_init(void)return err; } + err =ibmebus_create_devices (builtin_matches); +if (err) { +device_unregister (&ibmebus_bus_device); +bus_unregister (&ibmebus_bus_type); +return err; + } +return 0 ; }postcore_initcall (ibmebus_bus_init);
Signature · 1 line
1.5.2
Re: [PATCH 3/5] ibmebus: Add device creation and bus probing based on of_device
Quoted 7 lines · Joachim Fenkes
The devtree root is now searched for devices matching a built-in whitelist during boot, so these devices appear on the bus from the beginning. It is still possible to manually add/remove devices to/from the bus by using the probe/remove sysfs interface. Also, when a device driver registers itself, the devtree is matched against its matchlist.
Signed-off-by Joachim Fenkes <[email protected]>
PATCH 4/5 ibmebus: Move to of_device and of_platform_driver, match eHCA and eHEA drivers
In reply to Joachim FenkesReplace struct ibmebus_dev and struct ibmebus_driver with struct of_device and struct of_platform_driver, respectively. Match the external ibmebus interface and drivers using it.
--- drivers/infiniband/hw/ehca/ehca_classes.h | 2 +- drivers/net/ehea/ehea.h | 2 +- include/asm-powerpc/ibmebus.h | 38 +++------------ arch/powerpc/kernel/ibmebus.c | 28 ++++++----- drivers/infiniband/hw/ehca/ehca_eq.c | 6 +- drivers/infiniband/hw/ehca/ehca_main.c | 32 ++++++------ drivers/net/ehea/ehea_main.c | 72 ++++++++++++++-------------- 7 files changed, 79 insertions(+), 101 deletions(-)
drivers/infiniband/hw/ehca/ehca_classes.h +1 -1
@@ -106,7 +106,7 @@ struct ehca_sport {struct ehca_shca {struct ib_device ib_device; -struct ibmebus_dev *ibmebus_dev; +struct of_device *ofdev;u8 num_ports;int hw_level;struct list_head shca_list;
drivers/net/ehea/ehea.h +1 -1
@@ -382,7 +382,7 @@ struct ehea_port_res {#define EHEA_MAX_PORTS 16struct ehea_adapter {u64 handle; -struct ibmebus_dev *ebus_dev; +struct of_device *ofdev;struct ehea_port *port[EHEA_MAX_PORTS ];struct ehea_eq *neq;/* notification event queue */ struct workqueue_struct *ehea_wq;
include/asm-powerpc/ibmebus.h +7 -31
@@ -43,42 +43,18 @@#include <linux/device.h> #include <linux/interrupt.h> #include <linux/mod_devicetable.h> -#include <asm/of_device.h> +#include <linux/of_device.h> +#include <linux/of_platform.h> extern struct bus_type ibmebus_bus_type; -struct ibmebus_dev { -struct of_device ofdev; -}; +int ibmebus_register_driver (struct of_platform_driver *drv); +void ibmebus_unregister_driver (struct of_platform_driver *drv); -struct ibmebus_driver { -char *name; -struct of_device_id *id_table; -int (*probe) (struct ibmebus_dev *dev,const struct of_device_id *id); -int (*remove) (struct ibmebus_dev *dev); -struct device_driver driver; -}; - -int ibmebus_register_driver (struct ibmebus_driver *drv); -void ibmebus_unregister_driver (struct ibmebus_driver *drv); - -int ibmebus_request_irq (struct ibmebus_dev *dev, -u32 ist, -irq_handler_t handler, -unsigned long irq_flags,const char * devname, +int ibmebus_request_irq (u32 ist,irq_handler_t handler, +unsigned long irq_flags,const char *devname,void *dev_id); -void ibmebus_free_irq (struct ibmebus_dev *dev,u32 ist,void *dev_id); - -static inline struct ibmebus_driver *to_ibmebus_driver (struct device_driver *drv) -{ - return container_of(drv, struct ibmebus_driver, driver); -} - -static inline struct ibmebus_dev *to_ibmebus_dev (struct device *dev) -{ - return container_of(dev, struct ibmebus_dev, ofdev.dev); -} - +void ibmebus_free_irq (u32 ist,void *dev_id);#endif /* __KERNEL__ */ #endif /* _ASM_IBMEBUS_H */
arch/powerpc/kernel/ibmebus.c +15 -13
@@ -192,21 +192,26 @@ static int ibmebus_create_devices(const struct of_device_id *matches)return ret; } -int ibmebus_register_driver (struct ibmebus_driver *drv) +int ibmebus_register_driver (struct of_platform_driver *drv) { -return 0 ; +/* If the driver uses devices that ibmebus doesn't know, add them */ +ibmebus_create_devices (drv->match_table); + + drv->driver.name = drv->name; + drv->driver.bus = &ibmebus_bus_type; + +return driver_register (&drv->driver); }EXPORT_SYMBOL (ibmebus_register_driver); -void ibmebus_unregister_driver (struct ibmebus_driver *drv) +void ibmebus_unregister_driver (struct of_platform_driver *drv) { +driver_unregister (&drv->driver); }EXPORT_SYMBOL (ibmebus_unregister_driver); -int ibmebus_request_irq (struct ibmebus_dev *dev, -u32 ist, -irq_handler_t handler, -unsigned long irq_flags,const char * devname, +int ibmebus_request_irq (u32 ist,irq_handler_t handler, +unsigned long irq_flags,const char *devname,void *dev_id) {unsigned int irq =irq_create_mapping (NULL , ist);
@@ -214,12 +219,11 @@ int ibmebus_request_irq(struct ibmebus_dev *dev,if (irq ==NO_IRQ )return -EINVAL ; -return request_irq (irq, handler, - irq_flags, devname, dev_id); +return request_irq (irq, handler, irq_flags, devname, dev_id); }EXPORT_SYMBOL (ibmebus_request_irq); -void ibmebus_free_irq (struct ibmebus_dev *dev,u32 ist,void *dev_id) +void ibmebus_free_irq (u32 ist,void *dev_id) {unsigned int irq =irq_find_mapping (NULL , ist);
@@ -230,9 +234,7 @@ EXPORT_SYMBOL(ibmebus_free_irq);static ssize_t name_show (struct device *dev,struct device_attribute *attr,char *buf) { -struct ibmebus_dev *ebus_dev =to_ibmebus_dev (dev); -const char *name =of_get_property (ebus_dev->ofdev.node,"name" ,NULL ); -return sprintf (buf,"%s\n" , name); +return sprintf (buf,"%s\n" ,to_of_device (dev)->node->name); }static struct device_attribute ibmebus_dev_attrs[] = {
drivers/infiniband/hw/ehca/ehca_eq.c +3 -3
@@ -123,7 +123,7 @@ int ehca_create_eq(struct ehca_shca *shca,/* register interrupt handlers and initialize work queues */ if (type ==EHCA_EQ ) { - ret =ibmebus_request_irq (NULL , eq->ist, ehca_interrupt_eq, + ret =ibmebus_request_irq (eq->ist, ehca_interrupt_eq,IRQF_DISABLED ,"ehca_eq" , (void *)shca);if (ret <0 )
@@ -131,7 +131,7 @@ int ehca_create_eq(struct ehca_shca *shca,tasklet_init (&eq->interrupt_task, ehca_tasklet_eq, (long )shca); }else if (type ==EHCA_NEQ ) { - ret =ibmebus_request_irq (NULL , eq->ist, ehca_interrupt_neq, + ret =ibmebus_request_irq (eq->ist, ehca_interrupt_neq,IRQF_DISABLED ,"ehca_neq" , (void *)shca);if (ret <0 )
@@ -171,7 +171,7 @@ int ehca_destroy_eq(struct ehca_shca *shca, struct ehca_eq *eq)u64 h_ret;spin_lock_irqsave (&eq->spinlock, flags); -ibmebus_free_irq (NULL , eq->ist, (void *)shca); +ibmebus_free_irq (eq->ist, (void *)shca); h_ret =hipz_h_destroy_eq (shca->ipz_hca_handle, eq);
drivers/infiniband/hw/ehca/ehca_main.c +16 -16
@@ -404,7 +404,7 @@ int ehca_init_device(struct ehca_shca *shca) shca->ib_device.node_type =RDMA_NODE_IB_CA ; shca->ib_device.phys_port_cnt = shca->num_ports; shca->ib_device.num_comp_vectors =1 ; - shca->ib_device.dma_device = &shca->ibmebus_dev->ofdev.dev; + shca->ib_device.dma_device = &shca->ofdev->dev; shca->ib_device.query_device = ehca_query_device; shca->ib_device.query_port = ehca_query_port; shca->ib_device.query_gid = ehca_query_gid;
@@ -658,7 +658,7 @@ static struct attribute_group ehca_dev_attr_grp = { .attrs = ehca_dev_attrs }; -static int __devinit ehca_probe (struct ibmebus_dev *dev, +static int __devinit ehca_probe (struct of_device *dev,const struct of_device_id *id) {struct ehca_shca *shca;
@@ -666,16 +666,16 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev,struct ib_pd *ibpd;int ret; - handle =of_get_property (dev->ofdev.node,"ibm,hca-handle" ,NULL ); + handle =of_get_property (dev->node,"ibm,hca-handle" ,NULL );if (!handle) {ehca_gen_err ("Cannot get eHCA handle for adapter: %s." , - dev->ofdev.node->full_name); + dev->node->full_name);return -ENODEV ; }if (!(*handle)) {ehca_gen_err ("Wrong eHCA handle for adapter: %s." , - dev->ofdev.node->full_name); + dev->node->full_name);return -ENODEV ; }
@@ -686,9 +686,9 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev, }mutex_init (&shca->modify_mutex); - shca->ibmebus_dev = dev; + shca->ofdev = dev; shca->ipz_hca_handle.handle = *handle; - dev->ofdev.dev.driver_data = shca; + dev->dev.driver_data = shca; ret =ehca_sense_attributes (shca);if (ret <0 ) {
@@ -764,7 +764,7 @@ static int __devinit ehca_probe(struct ibmebus_dev *dev, } } - ret =sysfs_create_group (&dev->ofdev.dev.kobj, &ehca_dev_attr_grp); + ret =sysfs_create_group (&dev->dev.kobj, &ehca_dev_attr_grp);if (ret)/* only complain; we can live without attributes */ ehca_err (&shca->ib_device,"Cannot create device attributes ret=%d" , ret);
@@ -814,12 +814,12 @@ probe1:return -EINVAL ; } -static int __devexit ehca_remove(struct ibmebus_dev *dev) +static int __devexit ehca_remove(struct of_device *dev) { -struct ehca_shca *shca = dev->ofdev.dev.driver_data; +struct ehca_shca *shca = dev->dev.driver_data;int ret; -sysfs_remove_group (&dev->ofdev.dev.kobj, &ehca_dev_attr_grp); +sysfs_remove_group (&dev->dev.kobj, &ehca_dev_attr_grp);if (ehca_open_aqp1 ==1 ) {int i;
@@ -870,11 +870,11 @@ static struct of_device_id ehca_device_table[] = {}, }; -static struct ibmebus_driver ehca_driver = { - .name ="ehca" , - .id_table = ehca_device_table, - .probe = ehca_probe, - .remove = ehca_remove, +static struct of_platform_driver ehca_driver = { + .name ="ehca" , + .match_table = ehca_device_table, + .probe = ehca_probe, + .remove = ehca_remove, };void ehca_poll_eqs (unsigned long data)
drivers/net/ehea/ehea_main.c +36 -36
230 lines not on this page · raw message
Signature · 1 line
1.5.2
Re: [PATCH 4/5] ibmebus: Move to of_device and of_platform_driver, match eHCA and eHEA drivers
Quoted 5 lines · Joachim Fenkes
Replace struct
ibmebus_devand structibmebus_driverwith structof_deviceand structof_platform_driver, respectively. Match the external ibmebus interface and drivers using it.Signed-off-by Joachim Fenkes <[email protected]>
Re: [PATCH 4/5] ibmebus: Move to of_device and of_platform_driver, match eHCA and eHEA drivers
In reply to Joachim FenkesQuoted 5 lines · Joachim Fenkes
Replace struct
ibmebus_devand structibmebus_driverwith structof_deviceand structof_platform_driver, respectively. Match the external ibmebus interface and drivers using it.Signed-off-by Joachim Fenkes <[email protected]>
Quoted 8 lines
--- drivers/infiniband/hw/ehca/ehca_classes.h | 2 +- drivers/net/ehea/ehea.h | 2 +- include/asm-powerpc/ibmebus.h | 38 +++------------ arch/powerpc/kernel/ibmebus.c | 28 ++++++----- drivers/infiniband/hw/ehca/ehca_eq.c | 6 +- drivers/infiniband/hw/ehca/ehca_main.c | 32 ++++++------ drivers/net/ehea/ehea_main.c | 72 ++++++++++++++--------------
This is somewhat difficult as this patch touches files that are the responsibility of three different maintainers. Is it possible to split the patch into three, one for each maintainer (possibly by keeping both old and new interfaces around for a little while)?
If not, then you need to get an Acked-by and an agreement that this change can go via the powerpc.git tree from Roland Dreier and Jeff Garzik.
Paul.
Roland Dreier
Acked-byRe: [PATCH 4/5] ibmebus: Move to of_device and of_platform_driver, match eHCA and eHEA drivers
Quoted 9 lines
Quoted 5 lines
Replace struct
ibmebus_devand structibmebus_driverwith structof_deviceand structof_platform_driver, respectively. Match the external ibmebus interface and drivers using it.Signed-off-by Joachim Fenkes <[email protected]>If not, then you need to get an Acked-by and an agreement that this change can go via the powerpc.git tree from Roland Dreier and Jeff Garzik.
I don't see anything objectionable in the infiniband parts of the patch -- I don't have any way to test the changes but it all looks like a straightforward conversion to a new platform API. So:
- R.
Jan-Bernd Themann
Acked-byRe: [PATCH 4/5] ibmebus: Move to of_device and of_platform_driver, match eHCA and eHEA drivers
Roland Dreier <[email protected]> wrote on 03.10.2007 20:05:44:
Quoted 3 lines
Quoted 1 line
Quoted 1 line
Replace struct
ibmebus_devand structibmebus_driverwithstruct
of_deviceQuoted 1 line
Quoted 1 line
and struct
of_platform_driver, respectively. Match the external
ibmebus
Quoted 8 lines
Quoted 7 lines
Quoted 3 lines
interface and drivers using it.
Signed-off-by Joachim Fenkes <[email protected]>If not, then you need to get an Acked-by and an agreement that this change can go via the powerpc.git tree from Roland Dreier and Jeff Garzik.
Quoted 7 lines
I don't see anything objectionable in the infiniband parts of the patch -- I don't have any way to test the changes but it all looks like a straightforward conversion to a new platform API. So:
Acked-by Roland Dreier <[email protected]>- R.
Looks good from eHEA driver perspective.
PATCH 5/5 ibmebus: More speaking error return code in ibmebus_store_probe()
In reply to Joachim Fenkes--- arch/powerpc/kernel/ibmebus.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
arch/powerpc/kernel/ibmebus.c +2 -2
@@ -268,10 +268,10 @@ static ssize_t ibmebus_store_probe(struct bus_type *bus,return -ENOMEM ;if (bus_find_device (&ibmebus_bus_type,NULL , path, - ibmebus_match_path)) { + ibmebus_match_path)) {printk (KERN_WARNING "%s: %s has already been probed\n" , __FUNCTION__, path); - rc = -EINVAL ; + rc = -EEXIST ; goto out; }
Signature · 1 line
1.5.2