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