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