[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: Geoff Levand <geoffrey.levand@am.sony.com> Signed-off-by: Paul Mackerras <paulus@samba.org>
This commit is contained in:
parent
a3323d1a52
commit
7626e78d29
|
@ -73,18 +73,12 @@ config PS3_USE_LPAR_ADDR
|
|||
|
||||
config PS3_VUART
|
||||
depends on PPC_PS3
|
||||
bool "PS3 Virtual UART support" if PS3_ADVANCED
|
||||
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.
|
||||
tristate
|
||||
|
||||
config PS3_PS3AV
|
||||
depends on PPC_PS3
|
||||
tristate "PS3 AV settings driver" if PS3_ADVANCED
|
||||
depends on PS3_VUART
|
||||
select PS3_VUART
|
||||
default y
|
||||
help
|
||||
Include support for the PS3 AV Settings driver.
|
||||
|
@ -93,13 +87,14 @@ config PS3_PS3AV
|
|||
general, all users will say Y or M.
|
||||
|
||||
config PS3_SYS_MANAGER
|
||||
bool "PS3 System Manager driver" if PS3_ADVANCED
|
||||
depends on PS3_VUART
|
||||
default y
|
||||
depends on PPC_PS3
|
||||
tristate "PS3 System Manager driver" if PS3_ADVANCED
|
||||
select PS3_VUART
|
||||
default m
|
||||
help
|
||||
Include support for the PS3 System Manager.
|
||||
|
||||
This support is required for system control. In
|
||||
general, all users will say Y.
|
||||
general, all users will say Y or M.
|
||||
|
||||
endmenu
|
||||
|
|
|
@ -564,6 +564,7 @@ int ps3_vuart_irq_setup(enum ps3_cpu_binding cpu, void* virt_addr_bmp,
|
|||
|
||||
return result;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ps3_vuart_irq_setup);
|
||||
|
||||
int ps3_vuart_irq_destroy(unsigned int virq)
|
||||
{
|
||||
|
@ -583,6 +584,7 @@ int ps3_vuart_irq_destroy(unsigned int virq)
|
|||
|
||||
return result;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ps3_vuart_irq_destroy);
|
||||
|
||||
/**
|
||||
* ps3_spe_irq_setup - Setup an spe virq.
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -34,29 +34,7 @@ struct ps3_vuart_stats {
|
|||
struct ps3_vuart_work {
|
||||
struct work_struct work;
|
||||
unsigned long trigger;
|
||||
spinlock_t lock;
|
||||
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;
|
||||
struct ps3_system_bus_device *dev; /* to convert work to device */
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -64,32 +42,30 @@ struct ps3_vuart_port_priv {
|
|||
*/
|
||||
|
||||
struct ps3_vuart_port_driver {
|
||||
enum ps3_match_id match_id;
|
||||
struct device_driver core;
|
||||
int (*probe)(struct ps3_vuart_port_device *);
|
||||
int (*remove)(struct ps3_vuart_port_device *);
|
||||
void (*shutdown)(struct ps3_vuart_port_device *);
|
||||
int (*tx_event)(struct ps3_vuart_port_device *dev);
|
||||
int (*rx_event)(struct ps3_vuart_port_device *dev);
|
||||
int (*disconnect_event)(struct ps3_vuart_port_device *dev);
|
||||
/* int (*suspend)(struct ps3_vuart_port_device *, pm_message_t); */
|
||||
/* int (*resume)(struct ps3_vuart_port_device *); */
|
||||
struct ps3_system_bus_driver core;
|
||||
int (*probe)(struct ps3_system_bus_device *);
|
||||
int (*remove)(struct ps3_system_bus_device *);
|
||||
void (*shutdown)(struct ps3_system_bus_device *);
|
||||
void (*work)(struct ps3_system_bus_device *);
|
||||
/* int (*tx_event)(struct ps3_system_bus_device *dev); */
|
||||
/* int (*rx_event)(struct ps3_system_bus_device *dev); */
|
||||
/* int (*disconnect_event)(struct ps3_system_bus_device *dev); */
|
||||
/* int (*suspend)(struct ps3_system_bus_device *, pm_message_t); */
|
||||
/* int (*resume)(struct ps3_system_bus_device *); */
|
||||
};
|
||||
|
||||
int ps3_vuart_port_driver_register(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(
|
||||
struct device_driver *_drv)
|
||||
static inline struct ps3_vuart_port_driver *
|
||||
ps3_system_bus_dev_to_vuart_drv(struct ps3_system_bus_device *_dev)
|
||||
{
|
||||
return container_of(_drv, struct ps3_vuart_port_driver, 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 *to_ps3_vuart_port_device(
|
||||
struct device *_dev)
|
||||
{
|
||||
return container_of(_dev, struct ps3_vuart_port_device, 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 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(
|
|||
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,
|
||||
int ps3_vuart_read(struct ps3_system_bus_device *dev, void *buf,
|
||||
unsigned int bytes);
|
||||
int ps3_vuart_read_async(struct ps3_vuart_port_device *dev, work_func_t func,
|
||||
unsigned int bytes);
|
||||
void ps3_vuart_cancel_async(struct ps3_vuart_port_device *dev);
|
||||
void ps3_vuart_clear_rx_bytes(struct ps3_vuart_port_device *dev,
|
||||
int ps3_vuart_read_async(struct ps3_system_bus_device *dev, unsigned int bytes);
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -407,23 +407,6 @@ static inline void *ps3_system_bus_get_driver_data(
|
|||
|
||||
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 */
|
||||
|
||||
#ifdef CONFIG_PS3_SYS_MANAGER
|
||||
|
|
Loading…
Reference in New Issue