Commit b6cb95e8 authored by Alexandre Bounine's avatar Alexandre Bounine Committed by Linus Torvalds

rapidio: move rio_pw_enable into core code

Make rio_pw_enable() routine available to other RapidIO drivers.
Signed-off-by: default avatarAlexandre Bounine <alexandre.bounine@idt.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Aurelien Jacquiot <a-jacquiot@ti.com>
Cc: Andre van Herk <andre.van.herk@prodrive-technologies.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 5024622f
...@@ -973,17 +973,6 @@ static void rio_init_em(struct rio_dev *rdev) ...@@ -973,17 +973,6 @@ static void rio_init_em(struct rio_dev *rdev)
} }
} }
/**
* rio_pw_enable - Enables/disables port-write handling by a master port
* @port: Master port associated with port-write handling
* @enable: 1=enable, 0=disable
*/
static void rio_pw_enable(struct rio_mport *port, int enable)
{
if (port->ops->pwenable)
port->ops->pwenable(port, enable);
}
/** /**
* rio_enum_mport- Start enumeration through a master port * rio_enum_mport- Start enumeration through a master port
* @mport: Master port to send transactions * @mport: Master port to send transactions
......
...@@ -559,6 +559,24 @@ int rio_release_inb_pwrite(struct rio_dev *rdev) ...@@ -559,6 +559,24 @@ int rio_release_inb_pwrite(struct rio_dev *rdev)
} }
EXPORT_SYMBOL_GPL(rio_release_inb_pwrite); EXPORT_SYMBOL_GPL(rio_release_inb_pwrite);
/**
* rio_pw_enable - Enables/disables port-write handling by a master port
* @mport: Master port associated with port-write handling
* @enable: 1=enable, 0=disable
*/
void rio_pw_enable(struct rio_mport *mport, int enable)
{
if (mport->ops->pwenable) {
mutex_lock(&mport->lock);
if ((enable && ++mport->pwe_refcnt == 1) ||
(!enable && mport->pwe_refcnt && --mport->pwe_refcnt == 0))
mport->ops->pwenable(mport, enable);
mutex_unlock(&mport->lock);
}
}
EXPORT_SYMBOL_GPL(rio_pw_enable);
/** /**
* rio_map_inb_region -- Map inbound memory region. * rio_map_inb_region -- Map inbound memory region.
* @mport: Master port. * @mport: Master port.
...@@ -2041,6 +2059,7 @@ int rio_mport_initialize(struct rio_mport *mport) ...@@ -2041,6 +2059,7 @@ int rio_mport_initialize(struct rio_mport *mport)
mport->host_deviceid = rio_get_hdid(mport->id); mport->host_deviceid = rio_get_hdid(mport->id);
mport->nscan = NULL; mport->nscan = NULL;
mutex_init(&mport->lock); mutex_init(&mport->lock);
mport->pwe_refcnt = 0;
return 0; return 0;
} }
......
...@@ -266,6 +266,7 @@ enum rio_phy_type { ...@@ -266,6 +266,7 @@ enum rio_phy_type {
* @dma: DMA device associated with mport * @dma: DMA device associated with mport
* @nscan: RapidIO network enumeration/discovery operations * @nscan: RapidIO network enumeration/discovery operations
* @state: mport device state * @state: mport device state
* @pwe_refcnt: port-write enable ref counter to track enable/disable requests
*/ */
struct rio_mport { struct rio_mport {
struct list_head dbells; /* list of doorbell events */ struct list_head dbells; /* list of doorbell events */
...@@ -296,6 +297,7 @@ struct rio_mport { ...@@ -296,6 +297,7 @@ struct rio_mport {
#endif #endif
struct rio_scan *nscan; struct rio_scan *nscan;
atomic_t state; atomic_t state;
unsigned int pwe_refcnt;
}; };
static inline int rio_mport_is_running(struct rio_mport *mport) static inline int rio_mport_is_running(struct rio_mport *mport)
......
...@@ -375,6 +375,7 @@ extern int rio_request_inb_pwrite(struct rio_dev *, ...@@ -375,6 +375,7 @@ extern int rio_request_inb_pwrite(struct rio_dev *,
int (*)(struct rio_dev *, union rio_pw_msg*, int)); int (*)(struct rio_dev *, union rio_pw_msg*, int));
extern int rio_release_inb_pwrite(struct rio_dev *); extern int rio_release_inb_pwrite(struct rio_dev *);
extern int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg); extern int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg);
extern void rio_pw_enable(struct rio_mport *mport, int enable);
/* LDM support */ /* LDM support */
int rio_register_driver(struct rio_driver *); int rio_register_driver(struct rio_driver *);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment