xref: /linux/drivers/gpu/drm/xe/xe_i2c.h (revision 220994d61cebfc04f071d69049127657c7e8191b)
1f0e53aadSHeikki Krogerus /* SPDX-License-Identifier: MIT */
2f0e53aadSHeikki Krogerus #ifndef _XE_I2C_H_
3f0e53aadSHeikki Krogerus #define _XE_I2C_H_
4f0e53aadSHeikki Krogerus 
5f0e53aadSHeikki Krogerus #include <linux/bits.h>
6f0e53aadSHeikki Krogerus #include <linux/notifier.h>
7f0e53aadSHeikki Krogerus #include <linux/types.h>
8f0e53aadSHeikki Krogerus #include <linux/workqueue.h>
9f0e53aadSHeikki Krogerus 
10f0e53aadSHeikki Krogerus struct device;
11f0e53aadSHeikki Krogerus struct fwnode_handle;
12f0e53aadSHeikki Krogerus struct i2c_adapter;
13f0e53aadSHeikki Krogerus struct i2c_client;
14f0e53aadSHeikki Krogerus struct irq_domain;
15f0e53aadSHeikki Krogerus struct platform_device;
16f0e53aadSHeikki Krogerus struct xe_device;
17f0e53aadSHeikki Krogerus struct xe_mmio;
18f0e53aadSHeikki Krogerus 
19f0e53aadSHeikki Krogerus #define XE_I2C_MAX_CLIENTS		3
20f0e53aadSHeikki Krogerus 
21f0e53aadSHeikki Krogerus #define XE_I2C_EP_COOKIE_DEVICE		0xde
22f0e53aadSHeikki Krogerus 
23f0e53aadSHeikki Krogerus /* Endpoint Capabilities */
24f0e53aadSHeikki Krogerus #define XE_I2C_EP_CAP_IRQ		BIT(0)
25f0e53aadSHeikki Krogerus 
26f0e53aadSHeikki Krogerus struct xe_i2c_endpoint {
27f0e53aadSHeikki Krogerus 	u8 cookie;
28f0e53aadSHeikki Krogerus 	u8 capabilities;
29f0e53aadSHeikki Krogerus 	u16 addr[XE_I2C_MAX_CLIENTS];
30f0e53aadSHeikki Krogerus };
31f0e53aadSHeikki Krogerus 
32f0e53aadSHeikki Krogerus struct xe_i2c {
33f0e53aadSHeikki Krogerus 	struct fwnode_handle *adapter_node;
34f0e53aadSHeikki Krogerus 	struct platform_device *pdev;
35f0e53aadSHeikki Krogerus 	struct i2c_adapter *adapter;
36f0e53aadSHeikki Krogerus 	struct i2c_client *client[XE_I2C_MAX_CLIENTS];
37f0e53aadSHeikki Krogerus 
38f0e53aadSHeikki Krogerus 	struct notifier_block bus_notifier;
39f0e53aadSHeikki Krogerus 	struct work_struct work;
40f0e53aadSHeikki Krogerus 
41f0e53aadSHeikki Krogerus 	struct irq_domain *irqdomain;
42f0e53aadSHeikki Krogerus 	int adapter_irq;
43f0e53aadSHeikki Krogerus 
44f0e53aadSHeikki Krogerus 	struct xe_i2c_endpoint ep;
45f0e53aadSHeikki Krogerus 	struct device *drm_dev;
46f0e53aadSHeikki Krogerus 
47f0e53aadSHeikki Krogerus 	struct xe_mmio *mmio;
48f0e53aadSHeikki Krogerus };
49f0e53aadSHeikki Krogerus 
50f0e53aadSHeikki Krogerus #if IS_ENABLED(CONFIG_I2C)
51f0e53aadSHeikki Krogerus int xe_i2c_probe(struct xe_device *xe);
52f0e53aadSHeikki Krogerus void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl);
53*0ea07b69SRaag Jadav void xe_i2c_pm_suspend(struct xe_device *xe);
54*0ea07b69SRaag Jadav void xe_i2c_pm_resume(struct xe_device *xe, bool d3cold);
55f0e53aadSHeikki Krogerus #else
xe_i2c_probe(struct xe_device * xe)56f0e53aadSHeikki Krogerus static inline int xe_i2c_probe(struct xe_device *xe) { return 0; }
xe_i2c_irq_handler(struct xe_device * xe,u32 master_ctl)57f0e53aadSHeikki Krogerus static inline void xe_i2c_irq_handler(struct xe_device *xe, u32 master_ctl) { }
xe_i2c_pm_suspend(struct xe_device * xe)58*0ea07b69SRaag Jadav static inline void xe_i2c_pm_suspend(struct xe_device *xe) { }
xe_i2c_pm_resume(struct xe_device * xe,bool d3cold)59*0ea07b69SRaag Jadav static inline void xe_i2c_pm_resume(struct xe_device *xe, bool d3cold) { }
60f0e53aadSHeikki Krogerus #endif
61f0e53aadSHeikki Krogerus 
62f0e53aadSHeikki Krogerus #endif
63