Commit 7626e78d authored by Geoff Levand's avatar Geoff Levand Committed by Paul Mackerras

[POWERPC] PS3: Vuart rework

PS3 vuart updates to reflect the new PS3 unified device support.
 - Move vuart devices to the PS3 system bus.
 - Replace use of ps3_vuart_port_device with ps3_system_bus_device.
 - Make the PS3 vuart bus driver a loadable module.
 - Add remove() and shutdown() routines.
 - Move ps3_vuart_work into ps3_vuart_port_priv.tx_list.
 - Remove redundant spinlock ps3_vuart_work.lock.
 - No longer free ps3_vuart_port_device.priv on shutdown.
 - Cleanup Kconfig defs.
 - Export symbols needed for modular port drivers.
 - Arrange to use port numbers found in repository.
 - Fix bugs in ps3_vuart_read_async() and polled reading
 - Cleanup handling of shared interrupt with ps3_vuart_bus_interrupt_get()
   and ps3_vuart_bus_interrupt_put()
 - Add more comments to vuart.c.
Signed-off-by: default avatarGeoff Levand <geoffrey.levand@am.sony.com>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent a3323d1a
...@@ -73,18 +73,12 @@ config PS3_USE_LPAR_ADDR ...@@ -73,18 +73,12 @@ config PS3_USE_LPAR_ADDR
config PS3_VUART config PS3_VUART
depends on PPC_PS3 depends on PPC_PS3
bool "PS3 Virtual UART support" if PS3_ADVANCED tristate
default y
help
Include support for the PS3 Virtual UART.
This support is required for several system services
including the System Manager and AV Settings. In
general, all users will say Y.
config PS3_PS3AV config PS3_PS3AV
depends on PPC_PS3
tristate "PS3 AV settings driver" if PS3_ADVANCED tristate "PS3 AV settings driver" if PS3_ADVANCED
depends on PS3_VUART select PS3_VUART
default y default y
help help
Include support for the PS3 AV Settings driver. Include support for the PS3 AV Settings driver.
...@@ -93,13 +87,14 @@ config PS3_PS3AV ...@@ -93,13 +87,14 @@ config PS3_PS3AV
general, all users will say Y or M. general, all users will say Y or M.
config PS3_SYS_MANAGER config PS3_SYS_MANAGER
bool "PS3 System Manager driver" if PS3_ADVANCED depends on PPC_PS3
depends on PS3_VUART tristate "PS3 System Manager driver" if PS3_ADVANCED
default y select PS3_VUART
default m
help help
Include support for the PS3 System Manager. Include support for the PS3 System Manager.
This support is required for system control. In This support is required for system control. In
general, all users will say Y. general, all users will say Y or M.
endmenu endmenu
...@@ -564,6 +564,7 @@ int ps3_vuart_irq_setup(enum ps3_cpu_binding cpu, void* virt_addr_bmp, ...@@ -564,6 +564,7 @@ int ps3_vuart_irq_setup(enum ps3_cpu_binding cpu, void* virt_addr_bmp,
return result; return result;
} }
EXPORT_SYMBOL_GPL(ps3_vuart_irq_setup);
int ps3_vuart_irq_destroy(unsigned int virq) int ps3_vuart_irq_destroy(unsigned int virq)
{ {
...@@ -583,6 +584,7 @@ int ps3_vuart_irq_destroy(unsigned int virq) ...@@ -583,6 +584,7 @@ int ps3_vuart_irq_destroy(unsigned int virq)
return result; return result;
} }
EXPORT_SYMBOL_GPL(ps3_vuart_irq_destroy);
/** /**
* ps3_spe_irq_setup - Setup an spe virq. * ps3_spe_irq_setup - Setup an spe virq.
......
This diff is collapsed.
...@@ -34,29 +34,7 @@ struct ps3_vuart_stats { ...@@ -34,29 +34,7 @@ struct ps3_vuart_stats {
struct ps3_vuart_work { struct ps3_vuart_work {
struct work_struct work; struct work_struct work;
unsigned long trigger; unsigned long trigger;
spinlock_t lock; struct ps3_system_bus_device *dev; /* to convert work to device */
struct ps3_vuart_port_device* dev; /* to convert work to device */
};
/**
* struct ps3_vuart_port_priv - private vuart device data.
*/
struct ps3_vuart_port_priv {
unsigned int port_number;
u64 interrupt_mask;
struct {
spinlock_t lock;
struct list_head head;
} tx_list;
struct {
unsigned long bytes_held;
spinlock_t lock;
struct list_head head;
} rx_list;
struct ps3_vuart_stats stats;
struct ps3_vuart_work work;
}; };
/** /**
...@@ -64,32 +42,30 @@ struct ps3_vuart_port_priv { ...@@ -64,32 +42,30 @@ struct ps3_vuart_port_priv {
*/ */
struct ps3_vuart_port_driver { struct ps3_vuart_port_driver {
enum ps3_match_id match_id; struct ps3_system_bus_driver core;
struct device_driver core; int (*probe)(struct ps3_system_bus_device *);
int (*probe)(struct ps3_vuart_port_device *); int (*remove)(struct ps3_system_bus_device *);
int (*remove)(struct ps3_vuart_port_device *); void (*shutdown)(struct ps3_system_bus_device *);
void (*shutdown)(struct ps3_vuart_port_device *); void (*work)(struct ps3_system_bus_device *);
int (*tx_event)(struct ps3_vuart_port_device *dev); /* int (*tx_event)(struct ps3_system_bus_device *dev); */
int (*rx_event)(struct ps3_vuart_port_device *dev); /* int (*rx_event)(struct ps3_system_bus_device *dev); */
int (*disconnect_event)(struct ps3_vuart_port_device *dev); /* int (*disconnect_event)(struct ps3_system_bus_device *dev); */
/* int (*suspend)(struct ps3_vuart_port_device *, pm_message_t); */ /* int (*suspend)(struct ps3_system_bus_device *, pm_message_t); */
/* int (*resume)(struct ps3_vuart_port_device *); */ /* int (*resume)(struct ps3_system_bus_device *); */
}; };
int ps3_vuart_port_driver_register(struct ps3_vuart_port_driver *drv); int ps3_vuart_port_driver_register(struct ps3_vuart_port_driver *drv);
void ps3_vuart_port_driver_unregister(struct ps3_vuart_port_driver *drv); void ps3_vuart_port_driver_unregister(struct ps3_vuart_port_driver *drv);
static inline struct ps3_vuart_port_driver *to_ps3_vuart_port_driver( static inline struct ps3_vuart_port_driver *
struct device_driver *_drv) ps3_system_bus_dev_to_vuart_drv(struct ps3_system_bus_device *_dev)
{
return container_of(_drv, struct ps3_vuart_port_driver, core);
}
static inline struct ps3_vuart_port_device *to_ps3_vuart_port_device(
struct device *_dev)
{ {
return container_of(_dev, struct ps3_vuart_port_device, core); struct ps3_system_bus_driver *sbd =
ps3_system_bus_dev_to_system_bus_drv(_dev);
BUG_ON(!sbd);
return container_of(sbd, struct ps3_vuart_port_driver, core);
} }
static inline struct ps3_vuart_port_device *ps3_vuart_work_to_port_device( static inline struct ps3_system_bus_device *ps3_vuart_work_to_system_bus_dev(
struct work_struct *_work) struct work_struct *_work)
{ {
struct ps3_vuart_work *vw = container_of(_work, struct ps3_vuart_work, struct ps3_vuart_work *vw = container_of(_work, struct ps3_vuart_work,
...@@ -97,14 +73,13 @@ static inline struct ps3_vuart_port_device *ps3_vuart_work_to_port_device( ...@@ -97,14 +73,13 @@ static inline struct ps3_vuart_port_device *ps3_vuart_work_to_port_device(
return vw->dev; return vw->dev;
} }
int ps3_vuart_write(struct ps3_vuart_port_device *dev, const void* buf, int ps3_vuart_write(struct ps3_system_bus_device *dev, const void *buf,
unsigned int bytes);
int ps3_vuart_read(struct ps3_vuart_port_device *dev, void* buf,
unsigned int bytes); unsigned int bytes);
int ps3_vuart_read_async(struct ps3_vuart_port_device *dev, work_func_t func, int ps3_vuart_read(struct ps3_system_bus_device *dev, void *buf,
unsigned int bytes); unsigned int bytes);
void ps3_vuart_cancel_async(struct ps3_vuart_port_device *dev); int ps3_vuart_read_async(struct ps3_system_bus_device *dev, unsigned int bytes);
void ps3_vuart_clear_rx_bytes(struct ps3_vuart_port_device *dev, void ps3_vuart_cancel_async(struct ps3_system_bus_device *dev);
void ps3_vuart_clear_rx_bytes(struct ps3_system_bus_device *dev,
unsigned int bytes); unsigned int bytes);
#endif #endif
...@@ -407,23 +407,6 @@ static inline void *ps3_system_bus_get_driver_data( ...@@ -407,23 +407,6 @@ static inline void *ps3_system_bus_get_driver_data(
extern struct bus_type ps3_system_bus_type; extern struct bus_type ps3_system_bus_type;
/* vuart routines */
struct ps3_vuart_port_priv;
/**
* struct ps3_vuart_port_device - a device on a vuart port
*/
struct ps3_vuart_port_device {
enum ps3_match_id match_id;
struct device core;
struct ps3_vuart_port_priv* priv; /* private driver variables */
};
int ps3_vuart_port_device_register(struct ps3_vuart_port_device *dev);
/* system manager */ /* system manager */
#ifdef CONFIG_PS3_SYS_MANAGER #ifdef CONFIG_PS3_SYS_MANAGER
......
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