diff options
Diffstat (limited to 'target/linux/ar7/files/include')
-rw-r--r-- | target/linux/ar7/files/include/linux/vlynq.h (renamed from target/linux/ar7/files/include/asm-mips/ar7/vlynq.h) | 90 |
1 files changed, 69 insertions, 21 deletions
diff --git a/target/linux/ar7/files/include/asm-mips/ar7/vlynq.h b/target/linux/ar7/files/include/linux/vlynq.h index e2cfe87..b3f2474 100644 --- a/target/linux/ar7/files/include/asm-mips/ar7/vlynq.h +++ b/target/linux/ar7/files/include/linux/vlynq.h @@ -23,13 +23,11 @@ #include <linux/module.h> #include <linux/types.h> +#define VLYNQ_NUM_IRQS 32 + struct vlynq_mapping { u32 size; u32 offset; -} __attribute__ ((packed)); - -struct vlynq_device_id { - u32 id; }; enum vlynq_divisor { @@ -53,17 +51,23 @@ enum vlynq_divisor { vlynq_div_external }; +struct vlynq_device_id { + u32 id; + enum vlynq_divisor divisor; + unsigned long driver_data; +}; + struct vlynq_regs; struct vlynq_device { u32 id; - int irq; int local_irq; int remote_irq; enum vlynq_divisor divisor; u32 regs_start, regs_end; u32 mem_start, mem_end; u32 irq_start, irq_end; - void *priv; + int irq; + int enabled; struct vlynq_regs *local; struct vlynq_regs *remote; struct device dev; @@ -71,19 +75,26 @@ struct vlynq_device { struct vlynq_driver { char *name; - int (*probe)(struct vlynq_device *dev); - int (*remove)(struct vlynq_device *dev); + struct vlynq_device_id *id_table; + int (*probe)(struct vlynq_device *dev, struct vlynq_device_id *id); + void (*remove)(struct vlynq_device *dev); struct device_driver driver; }; -#define to_vlynq_driver(drv) container_of(drv, struct vlynq_driver, driver) - struct plat_vlynq_ops { int (*on)(struct vlynq_device *dev); void (*off)(struct vlynq_device *dev); }; -#define to_vlynq_device(device) container_of(device, struct vlynq_device, dev) +static inline struct vlynq_driver *to_vlynq_driver(struct device_driver *drv) +{ + return container_of(drv, struct vlynq_driver, driver); +} + +static inline struct vlynq_device *to_vlynq_device(struct device *device) +{ + return container_of(device, struct vlynq_device, dev); +} extern struct bus_type vlynq_bus_type; @@ -95,18 +106,55 @@ static inline int vlynq_register_driver(struct vlynq_driver *driver) return __vlynq_register_driver(driver, THIS_MODULE); } +static inline void *vlynq_get_drvdata(struct vlynq_device *dev) +{ + return dev_get_drvdata(&dev->dev); +} + +static inline void vlynq_set_drvdata(struct vlynq_device *dev, void *data) +{ + dev_set_drvdata(&dev->dev, data); +} + +static inline u32 vlynq_mem_start(struct vlynq_device *dev) +{ + return dev->mem_start; +} + +static inline u32 vlynq_mem_end(struct vlynq_device *dev) +{ + return dev->mem_end; +} + +static inline u32 vlynq_mem_len(struct vlynq_device *dev) +{ + return dev->mem_end - dev->mem_start + 1; +} + +static inline int vlynq_virq_to_irq(struct vlynq_device *dev, int virq) +{ + int irq = dev->irq_start + virq; + if ((irq < dev->irq_start) || (irq > dev->irq_end)) + return -EINVAL; + + return irq; +} + +static inline int vlynq_irq_to_virq(struct vlynq_device *dev, int irq) +{ + if ((irq < dev->irq_start) || (irq > dev->irq_end)) + return -EINVAL; + + return irq - dev->irq_start; +} + extern void vlynq_unregister_driver(struct vlynq_driver *driver); -extern int vlynq_device_enable(struct vlynq_device *dev); -extern void vlynq_device_disable(struct vlynq_device *dev); -extern u32 vlynq_remote_id(struct vlynq_device *dev); -extern void vlynq_set_local_mapping(struct vlynq_device *dev, - u32 tx_offset, +extern int vlynq_enable_device(struct vlynq_device *dev); +extern void vlynq_disable_device(struct vlynq_device *dev); +extern int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset, + struct vlynq_mapping *mapping); +extern int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset, struct vlynq_mapping *mapping); -extern void vlynq_set_remote_mapping(struct vlynq_device *dev, - u32 tx_offset, - struct vlynq_mapping *mapping); -extern int vlynq_virq_to_irq(struct vlynq_device *dev, int virq); -extern int vlynq_irq_to_virq(struct vlynq_device *dev, int irq); extern int vlynq_set_local_irq(struct vlynq_device *dev, int virq); extern int vlynq_set_remote_irq(struct vlynq_device *dev, int virq); |