mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
[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
5 changed files with 534 additions and 418 deletions
|
@ -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
|
||||||
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,
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
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.
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -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 {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
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);
|
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(
|
static inline struct ps3_system_bus_device *ps3_vuart_work_to_system_bus_dev(
|
||||||
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(
|
|
||||||
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(
|
||||||
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);
|
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);
|
unsigned int bytes);
|
||||||
int ps3_vuart_read_async(struct ps3_vuart_port_device *dev, work_func_t func,
|
int ps3_vuart_read_async(struct ps3_system_bus_device *dev, unsigned int bytes);
|
||||||
unsigned int bytes);
|
void ps3_vuart_cancel_async(struct ps3_system_bus_device *dev);
|
||||||
void ps3_vuart_cancel_async(struct ps3_vuart_port_device *dev);
|
void ps3_vuart_clear_rx_bytes(struct ps3_system_bus_device *dev,
|
||||||
void ps3_vuart_clear_rx_bytes(struct ps3_vuart_port_device *dev,
|
|
||||||
unsigned int bytes);
|
unsigned int bytes);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue