1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef OLPC_DCON_H_
3 #define OLPC_DCON_H_
4 
5 #include <linux/notifier.h>
6 #include <linux/workqueue.h>
7 
8 /* DCON registers */
9 
10 #define DCON_REG_ID		 0
11 #define DCON_REG_MODE		 1
12 
13 #define MODE_PASSTHRU	BIT(0)
14 #define MODE_SLEEP	BIT(1)
15 #define MODE_SLEEP_AUTO	BIT(2)
16 #define MODE_BL_ENABLE	BIT(3)
17 #define MODE_BLANK	BIT(4)
18 #define MODE_CSWIZZLE	BIT(5)
19 #define MODE_COL_AA	BIT(6)
20 #define MODE_MONO_LUMA	BIT(7)
21 #define MODE_SCAN_INT	BIT(8)
22 #define MODE_CLOCKDIV	BIT(9)
23 #define MODE_DEBUG	BIT(14)
24 #define MODE_SELFTEST	BIT(15)
25 
26 #define DCON_REG_HRES		0x2
27 #define DCON_REG_HTOTAL		0x3
28 #define DCON_REG_HSYNC_WIDTH	0x4
29 #define DCON_REG_VRES		0x5
30 #define DCON_REG_VTOTAL		0x6
31 #define DCON_REG_VSYNC_WIDTH	0x7
32 #define DCON_REG_TIMEOUT	0x8
33 #define DCON_REG_SCAN_INT	0x9
34 #define DCON_REG_BRIGHT		0xa
35 #define DCON_REG_MEM_OPT_A	0x41
36 #define DCON_REG_MEM_OPT_B	0x42
37 
38 /* Load Delay Locked Loop (DLL) settings for clock delay */
39 #define MEM_DLL_CLOCK_DELAY	BIT(0)
40 /* Memory controller power down function */
41 #define MEM_POWER_DOWN		BIT(8)
42 /* Memory controller software reset */
43 #define MEM_SOFT_RESET		BIT(0)
44 
45 /* Status values */
46 
47 #define DCONSTAT_SCANINT	0
48 #define DCONSTAT_SCANINT_DCON	1
49 #define DCONSTAT_DISPLAYLOAD	2
50 #define DCONSTAT_MISSED		3
51 
52 /* Source values */
53 
54 #define DCON_SOURCE_DCON        0
55 #define DCON_SOURCE_CPU         1
56 
57 /* Interrupt */
58 #define DCON_IRQ                6
59 
60 struct dcon_priv {
61 	struct i2c_client *client;
62 	struct fb_info *fbinfo;
63 	struct backlight_device *bl_dev;
64 
65 	wait_queue_head_t waitq;
66 	struct work_struct switch_source;
67 	struct notifier_block reboot_nb;
68 
69 	/* Shadow register for the DCON_REG_MODE register */
70 	u8 disp_mode;
71 
72 	/* The current backlight value - this saves us some smbus traffic */
73 	u8 bl_val;
74 
75 	/* Current source, initialized at probe time */
76 	int curr_src;
77 
78 	/* Desired source */
79 	int pending_src;
80 
81 	/* Variables used during switches */
82 	bool switched;
83 	ktime_t irq_time;
84 	ktime_t load_time;
85 
86 	/* Current output type; true == mono, false == color */
87 	bool mono;
88 	bool asleep;
89 	/* This get set while controlling fb blank state from the driver */
90 	bool ignore_fb_events;
91 };
92 
93 struct dcon_platform_data {
94 	int (*init)(struct dcon_priv *dcon);
95 	void (*bus_stabilize_wiggle)(void);
96 	void (*set_dconload)(int load);
97 	int (*read_status)(u8 *status);
98 };
99 
100 struct dcon_gpio {
101 	const char *name;
102 	unsigned long flags;
103 };
104 
105 #include <linux/interrupt.h>
106 
107 irqreturn_t dcon_interrupt(int irq, void *id);
108 
109 extern struct dcon_platform_data dcon_pdata_xo_1;
110 extern struct dcon_platform_data dcon_pdata_xo_1_5;
111 
112 #endif
113