mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 14:43:58 +08:00
fd534e9b5f
Based on 1 normalized pattern(s): this program is free software you can redistribute it and or modify it under the terms of the gnu general public license as published by the free software foundation either version 2 of the license or at your option any later version this program is distributed in the hope that it will be useful but without any warranty without even the implied warranty of merchantability or fitness for a particular purpose see the gnu general public license for more details you should have received a copy of the gnu general public license along with this program if not write to the free software foundation inc 51 franklin st fifth floor boston ma 02110 1301 usa extracted by the scancode license scanner the SPDX license identifier GPL-2.0-or-later has been chosen to replace the boilerplate/reference in 50 file(s). Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Kate Stewart <kstewart@linuxfoundation.org> Reviewed-by: Allison Randal <allison@lohutok.net> Reviewed-by: Richard Fontana <rfontana@redhat.com> Cc: linux-spdx@vger.kernel.org Link: https://lkml.kernel.org/r/20190523091649.499889647@linutronix.de Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
150 lines
3.2 KiB
C
150 lines
3.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/*
|
|
* Copyright (C) 2006, 2007 Eugene Konev <ejka@openwrt.org>
|
|
*/
|
|
|
|
#ifndef __VLYNQ_H__
|
|
#define __VLYNQ_H__
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/types.h>
|
|
|
|
struct module;
|
|
|
|
#define VLYNQ_NUM_IRQS 32
|
|
|
|
struct vlynq_mapping {
|
|
u32 size;
|
|
u32 offset;
|
|
};
|
|
|
|
enum vlynq_divisor {
|
|
vlynq_div_auto = 0,
|
|
vlynq_ldiv1,
|
|
vlynq_ldiv2,
|
|
vlynq_ldiv3,
|
|
vlynq_ldiv4,
|
|
vlynq_ldiv5,
|
|
vlynq_ldiv6,
|
|
vlynq_ldiv7,
|
|
vlynq_ldiv8,
|
|
vlynq_rdiv1,
|
|
vlynq_rdiv2,
|
|
vlynq_rdiv3,
|
|
vlynq_rdiv4,
|
|
vlynq_rdiv5,
|
|
vlynq_rdiv6,
|
|
vlynq_rdiv7,
|
|
vlynq_rdiv8,
|
|
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, dev_id;
|
|
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;
|
|
int irq;
|
|
int enabled;
|
|
struct vlynq_regs *local;
|
|
struct vlynq_regs *remote;
|
|
struct device dev;
|
|
};
|
|
|
|
struct vlynq_driver {
|
|
char *name;
|
|
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;
|
|
};
|
|
|
|
struct plat_vlynq_ops {
|
|
int (*on)(struct vlynq_device *dev);
|
|
void (*off)(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;
|
|
|
|
extern int __vlynq_register_driver(struct vlynq_driver *driver,
|
|
struct module *owner);
|
|
|
|
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_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 int vlynq_set_local_irq(struct vlynq_device *dev, int virq);
|
|
extern int vlynq_set_remote_irq(struct vlynq_device *dev, int virq);
|
|
|
|
#endif /* __VLYNQ_H__ */
|