xref: /openbmc/linux/include/linux/vlynq.h (revision fd534e9b)
1fd534e9bSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
255e331cfSFlorian Fainelli /*
355e331cfSFlorian Fainelli  * Copyright (C) 2006, 2007 Eugene Konev <ejka@openwrt.org>
455e331cfSFlorian Fainelli  */
555e331cfSFlorian Fainelli 
655e331cfSFlorian Fainelli #ifndef __VLYNQ_H__
755e331cfSFlorian Fainelli #define __VLYNQ_H__
855e331cfSFlorian Fainelli 
955e331cfSFlorian Fainelli #include <linux/device.h>
1055e331cfSFlorian Fainelli #include <linux/types.h>
1155e331cfSFlorian Fainelli 
12de477254SPaul Gortmaker struct module;
13de477254SPaul Gortmaker 
1455e331cfSFlorian Fainelli #define VLYNQ_NUM_IRQS 32
1555e331cfSFlorian Fainelli 
1655e331cfSFlorian Fainelli struct vlynq_mapping {
1755e331cfSFlorian Fainelli 	u32 size;
1855e331cfSFlorian Fainelli 	u32 offset;
1955e331cfSFlorian Fainelli };
2055e331cfSFlorian Fainelli 
2155e331cfSFlorian Fainelli enum vlynq_divisor {
2255e331cfSFlorian Fainelli 	vlynq_div_auto = 0,
2355e331cfSFlorian Fainelli 	vlynq_ldiv1,
2455e331cfSFlorian Fainelli 	vlynq_ldiv2,
2555e331cfSFlorian Fainelli 	vlynq_ldiv3,
2655e331cfSFlorian Fainelli 	vlynq_ldiv4,
2755e331cfSFlorian Fainelli 	vlynq_ldiv5,
2855e331cfSFlorian Fainelli 	vlynq_ldiv6,
2955e331cfSFlorian Fainelli 	vlynq_ldiv7,
3055e331cfSFlorian Fainelli 	vlynq_ldiv8,
3155e331cfSFlorian Fainelli 	vlynq_rdiv1,
3255e331cfSFlorian Fainelli 	vlynq_rdiv2,
3355e331cfSFlorian Fainelli 	vlynq_rdiv3,
3455e331cfSFlorian Fainelli 	vlynq_rdiv4,
3555e331cfSFlorian Fainelli 	vlynq_rdiv5,
3655e331cfSFlorian Fainelli 	vlynq_rdiv6,
3755e331cfSFlorian Fainelli 	vlynq_rdiv7,
3855e331cfSFlorian Fainelli 	vlynq_rdiv8,
3955e331cfSFlorian Fainelli 	vlynq_div_external
4055e331cfSFlorian Fainelli };
4155e331cfSFlorian Fainelli 
4255e331cfSFlorian Fainelli struct vlynq_device_id {
4355e331cfSFlorian Fainelli 	u32 id;
4455e331cfSFlorian Fainelli 	enum vlynq_divisor divisor;
4555e331cfSFlorian Fainelli 	unsigned long driver_data;
4655e331cfSFlorian Fainelli };
4755e331cfSFlorian Fainelli 
4855e331cfSFlorian Fainelli struct vlynq_regs;
4955e331cfSFlorian Fainelli struct vlynq_device {
5055e331cfSFlorian Fainelli 	u32 id, dev_id;
5155e331cfSFlorian Fainelli 	int local_irq;
5255e331cfSFlorian Fainelli 	int remote_irq;
5355e331cfSFlorian Fainelli 	enum vlynq_divisor divisor;
5455e331cfSFlorian Fainelli 	u32 regs_start, regs_end;
5555e331cfSFlorian Fainelli 	u32 mem_start, mem_end;
5655e331cfSFlorian Fainelli 	u32 irq_start, irq_end;
5755e331cfSFlorian Fainelli 	int irq;
5855e331cfSFlorian Fainelli 	int enabled;
5955e331cfSFlorian Fainelli 	struct vlynq_regs *local;
6055e331cfSFlorian Fainelli 	struct vlynq_regs *remote;
6155e331cfSFlorian Fainelli 	struct device dev;
6255e331cfSFlorian Fainelli };
6355e331cfSFlorian Fainelli 
6455e331cfSFlorian Fainelli struct vlynq_driver {
6555e331cfSFlorian Fainelli 	char *name;
6655e331cfSFlorian Fainelli 	struct vlynq_device_id *id_table;
6755e331cfSFlorian Fainelli 	int (*probe)(struct vlynq_device *dev, struct vlynq_device_id *id);
6855e331cfSFlorian Fainelli 	void (*remove)(struct vlynq_device *dev);
6955e331cfSFlorian Fainelli 	struct device_driver driver;
7055e331cfSFlorian Fainelli };
7155e331cfSFlorian Fainelli 
7255e331cfSFlorian Fainelli struct plat_vlynq_ops {
7355e331cfSFlorian Fainelli 	int (*on)(struct vlynq_device *dev);
7455e331cfSFlorian Fainelli 	void (*off)(struct vlynq_device *dev);
7555e331cfSFlorian Fainelli };
7655e331cfSFlorian Fainelli 
to_vlynq_driver(struct device_driver * drv)7755e331cfSFlorian Fainelli static inline struct vlynq_driver *to_vlynq_driver(struct device_driver *drv)
7855e331cfSFlorian Fainelli {
7955e331cfSFlorian Fainelli 	return container_of(drv, struct vlynq_driver, driver);
8055e331cfSFlorian Fainelli }
8155e331cfSFlorian Fainelli 
to_vlynq_device(struct device * device)8255e331cfSFlorian Fainelli static inline struct vlynq_device *to_vlynq_device(struct device *device)
8355e331cfSFlorian Fainelli {
8455e331cfSFlorian Fainelli 	return container_of(device, struct vlynq_device, dev);
8555e331cfSFlorian Fainelli }
8655e331cfSFlorian Fainelli 
8755e331cfSFlorian Fainelli extern struct bus_type vlynq_bus_type;
8855e331cfSFlorian Fainelli 
8955e331cfSFlorian Fainelli extern int __vlynq_register_driver(struct vlynq_driver *driver,
9055e331cfSFlorian Fainelli 				   struct module *owner);
9155e331cfSFlorian Fainelli 
vlynq_register_driver(struct vlynq_driver * driver)9255e331cfSFlorian Fainelli static inline int vlynq_register_driver(struct vlynq_driver *driver)
9355e331cfSFlorian Fainelli {
9455e331cfSFlorian Fainelli 	return __vlynq_register_driver(driver, THIS_MODULE);
9555e331cfSFlorian Fainelli }
9655e331cfSFlorian Fainelli 
vlynq_get_drvdata(struct vlynq_device * dev)9755e331cfSFlorian Fainelli static inline void *vlynq_get_drvdata(struct vlynq_device *dev)
9855e331cfSFlorian Fainelli {
9955e331cfSFlorian Fainelli 	return dev_get_drvdata(&dev->dev);
10055e331cfSFlorian Fainelli }
10155e331cfSFlorian Fainelli 
vlynq_set_drvdata(struct vlynq_device * dev,void * data)10255e331cfSFlorian Fainelli static inline void vlynq_set_drvdata(struct vlynq_device *dev, void *data)
10355e331cfSFlorian Fainelli {
10455e331cfSFlorian Fainelli 	dev_set_drvdata(&dev->dev, data);
10555e331cfSFlorian Fainelli }
10655e331cfSFlorian Fainelli 
vlynq_mem_start(struct vlynq_device * dev)10755e331cfSFlorian Fainelli static inline u32 vlynq_mem_start(struct vlynq_device *dev)
10855e331cfSFlorian Fainelli {
10955e331cfSFlorian Fainelli 	return dev->mem_start;
11055e331cfSFlorian Fainelli }
11155e331cfSFlorian Fainelli 
vlynq_mem_end(struct vlynq_device * dev)11255e331cfSFlorian Fainelli static inline u32 vlynq_mem_end(struct vlynq_device *dev)
11355e331cfSFlorian Fainelli {
11455e331cfSFlorian Fainelli 	return dev->mem_end;
11555e331cfSFlorian Fainelli }
11655e331cfSFlorian Fainelli 
vlynq_mem_len(struct vlynq_device * dev)11755e331cfSFlorian Fainelli static inline u32 vlynq_mem_len(struct vlynq_device *dev)
11855e331cfSFlorian Fainelli {
11955e331cfSFlorian Fainelli 	return dev->mem_end - dev->mem_start + 1;
12055e331cfSFlorian Fainelli }
12155e331cfSFlorian Fainelli 
vlynq_virq_to_irq(struct vlynq_device * dev,int virq)12255e331cfSFlorian Fainelli static inline int vlynq_virq_to_irq(struct vlynq_device *dev, int virq)
12355e331cfSFlorian Fainelli {
12455e331cfSFlorian Fainelli 	int irq = dev->irq_start + virq;
12555e331cfSFlorian Fainelli 	if ((irq < dev->irq_start) || (irq > dev->irq_end))
12655e331cfSFlorian Fainelli 		return -EINVAL;
12755e331cfSFlorian Fainelli 
12855e331cfSFlorian Fainelli 	return irq;
12955e331cfSFlorian Fainelli }
13055e331cfSFlorian Fainelli 
vlynq_irq_to_virq(struct vlynq_device * dev,int irq)13155e331cfSFlorian Fainelli static inline int vlynq_irq_to_virq(struct vlynq_device *dev, int irq)
13255e331cfSFlorian Fainelli {
13355e331cfSFlorian Fainelli 	if ((irq < dev->irq_start) || (irq > dev->irq_end))
13455e331cfSFlorian Fainelli 		return -EINVAL;
13555e331cfSFlorian Fainelli 
13655e331cfSFlorian Fainelli 	return irq - dev->irq_start;
13755e331cfSFlorian Fainelli }
13855e331cfSFlorian Fainelli 
13955e331cfSFlorian Fainelli extern void vlynq_unregister_driver(struct vlynq_driver *driver);
14055e331cfSFlorian Fainelli extern int vlynq_enable_device(struct vlynq_device *dev);
14155e331cfSFlorian Fainelli extern void vlynq_disable_device(struct vlynq_device *dev);
14255e331cfSFlorian Fainelli extern int vlynq_set_local_mapping(struct vlynq_device *dev, u32 tx_offset,
14355e331cfSFlorian Fainelli 				   struct vlynq_mapping *mapping);
14455e331cfSFlorian Fainelli extern int vlynq_set_remote_mapping(struct vlynq_device *dev, u32 tx_offset,
14555e331cfSFlorian Fainelli 				    struct vlynq_mapping *mapping);
14655e331cfSFlorian Fainelli extern int vlynq_set_local_irq(struct vlynq_device *dev, int virq);
14755e331cfSFlorian Fainelli extern int vlynq_set_remote_irq(struct vlynq_device *dev, int virq);
14855e331cfSFlorian Fainelli 
14955e331cfSFlorian Fainelli #endif /* __VLYNQ_H__ */
150