2 /* òÅÄÁËÃÉÑ ÆÁÊÌÁ mpv.h:
3 CAM - 09.12.08; home - 08.11.08.
9 #include <linux/mcst/mpv_io.h>
11 #define MPV_NAME "mpv"
12 #define MPV_CARD_DEVID 0x4360
13 #define MPV_KPI2_DEVID 0x8014
14 #define MPV4_DEVID 0x8023
18 #define MAX_MPV_INSTANCES 16
23 #define MPV_MINOR(i, io, n) ((i) << 7 | (io) << 5 | (n))
24 #define MPV_BUS(d) (MINOR(d) & 0x1f)
25 #define MPV_INST(d) (MINOR(d) >> 7)
26 #define MPV_INOUT(d) ((MINOR(d) >> 5) & 3)
27 #define MPV_IN(d) (MPV_INOUT(d) == MPV_IO_IN)
28 #define MPV_OUT(d) (MPV_INOUT(d) == MPV_IO_OUT)
29 #define MPV_OS(d) (MPV_INOUT(d) == MPV_IO_OS)
31 /* max mpv known non_iohub2 mpv version number */
32 #define MAX_MPV_VER 100
33 /* rev. MPV in driver for iohub2 POVOZKA-2 */
34 #define IOHUB2 (MAX_MPV_VER + 1)
35 /* max mpv known non_iohub2 mpv version number */
36 #define MAX_IOH2_VER 100
37 #define GPIO_MPV_SW 0x40 /* Enable MPV but not GPIO in POVOZKA-2 */
38 #define IOHUB2_IRQ1 0x6 /* irq for line 0 in POVOZKA-2 */
39 #define IOHUB2_IRQ2 0x9 /* irq for lines 1,2 in POVOZKA-2 */
41 #define MPV_REG_SIZE 0x80
43 #define MPV_REG_MASK 0x04
44 #define MPV_REG_POLARITY 0x08
45 #define MPV_REG_OUT_STAT 0x0C
46 #define MPV_REG_INTR_NULL 0x10
47 #define MPV_REG_BASE_CNT 0x18
48 #define MPV_REG_OUT_INTR 0x1C
49 #define MPV_REG_CHECK 0x14 /* for mpv card rev. 1,2 */
51 #define MPV_RESET_V2 0x20
52 #define MPV_RESET_IOHUB2 0x10
53 #define MPV_NOISE_GUARD_TIME 0x24 /* for MPVm rev.2 */
54 #define MPV_NOISE_GUARD_MPV4 0x3fc /* for MPV4 */
55 #define MPV_REG_NULL_INTR 0x60
56 #define MPV_REG_CONFIG_INTR 0x64
57 #define MPV_SBUS_VER 0xd8 /* sbus-mpv version (sbus-mpv ver.5 ~ */
58 /* revID 2 of pci-mpv)*/
59 #define MPV_RAW_IN 0x6c /* for MPVm rev.2 only */
60 #define MASK_RAW_IN 0x300000
61 #define RAW_AFTER_2 0x0
62 #define RAW_AFTER_1 0x1
63 #define RAW_AFTER_0 0x2
65 /* Noise mode register */
66 #define MPV_NOISE_MODE 0x78
67 #define USE_AFTER_2 0x0
68 #define USE_AFTER_1 0x1
69 #define USE_AFTER_0 0x2
71 #define MPV_IN_MASK 0xfffff
72 #define MPV_CPU_INTR 0x3 /* cpu interrupt number for sbus-mpv by default */
74 /* reg. number 0 1 2 3 4 5 6 7 8 9 */
75 unsigned char corr_cnt_reg_v2
[10] = { /* correct counter */
76 0x18, 0x28, 0x38, 0x48, 0x58, 0x88, 0x98, 0xa8, 0xb8, 0xc8};
77 unsigned char corr_cnt_reg_v0
[4] = { /* correct counter */
78 0x18, 0x38, 0x58, 0x78};
79 unsigned char gen_period_reg_v2
[10] = {
80 0x7c, 0x2c, 0x3c, 0x4c, 0x5c, 0x8c, 0x9c, 0xac, 0xbc, 0xcc};
81 unsigned char intpts_cnt_reg_v2
[10] = {
82 0x80, 0x30, 0x40, 0x50, 0x70, 0x90, 0xa0, 0xb0, 0xc0, 0xd0};
83 unsigned char prev_time_reg_v2
[10] = {
84 0x84, 0x34, 0x44, 0x54, 0x74, 0x94, 0xa4, 0xb4, 0xc4, 0xd4};
85 unsigned char corr_cnt_reg_new
[4] = {0x1c, 0x30, 0x44, 0x58};
86 unsigned char gen_period_reg_new
[4] = {0x20, 0x34, 0x48, 0x5c};
87 unsigned char intpts_cnt_reg_new
[4] = {0x24, 0x38, 0x4c, 0x60};
88 unsigned char prev_time_reg_new
[4] = {0x28, 0x3c, 0x50, 0x64};
89 /* basic counter copy*/
90 unsigned char mpv_time_reg_new
[4] = {0x2c, 0x40, 0x54, 0x68};
91 /* mpv or mpv_ioh2 version 0 1 2 3 */
92 /* number of corr. time regs */
93 unsigned char num_time_regs_v2
[MAX_MPV_VER
+ 1] = {4, 5, 10, 10};
94 unsigned char num_time_regs_ioh2
[MAX_IOH2_VER
+ 1] = {3};
95 /* number of inputs */
96 unsigned char num_inputs_v2
[MAX_MPV_VER
+ 1] = {20, 20, 20, 20};
97 unsigned char num_inputs_ioh2
[MAX_IOH2_VER
+ 1] = {3};
98 /* enable generetor mask */
99 unsigned char gen_mode_reg_v2
[MAX_MPV_VER
+ 1] = {0xff, 0xff, 0x68, 0x68};
100 unsigned char gen_mode_reg_ioh2
[MAX_IOH2_VER
+ 1] = {0x14};
102 typedef struct __raw_wqueue
{
103 struct task_struct
*task
;
104 struct list_head task_list
;
107 typedef struct mpv_intrk
109 /* limit time wating for interrupt (mcs) */
111 /* number of got interrupts by driver */
113 /* time from sinal appear to driver enter (ns) */
114 int correct_counter_nsec
;
115 /* ns timeofday when interrupt was appear in controler */
116 long long intr_appear_nsec
;
117 /* The time when driver have sent interrupt (ns) */
118 long long time_get_comm
;
119 /* time_of_day when interrupt was sent (mcs) */
120 long long time_generation_intr
;
121 /* clock source value when interrupt was got by driver */
122 long long intr_appear_clk
;
123 /* previous correct counter register value */
125 /* common number of interrupts register value */
127 /* monotonic time when interrupt was appear in controler */
128 struct timespec intr_appear_raw
;
129 /* real time when interrupt was appear in controler */
130 struct timespec intr_appear_real
;
131 /* interval of interrupts genarated by MPV */
132 long long interv_gen_ns
;
133 /* don't leave cpu < wait_on_cpu mcs*/
135 /* if it is set some timer intrrupts are perfomed by mpv */
137 /* timeout for read(), ioctl(MPVIO_WAIT_INTR) for return ETIME */
138 long long timeout_ns
;
139 /* driver enter minus OS enter time */
140 long long irq_enter_clks
;
141 /* interrupt appear time as basic mpv counter */
142 unsigned int mpv_time
;
144 struct list_head wait1_task_list
;
147 typedef struct mpv_state_struct
{
148 raw_spinlock_t mpv_lock
;
149 /* registers numbers for current mpv version */
150 unsigned char num_in_bus
;
151 unsigned char num_time_regs
;
152 unsigned char gen_mode_reg
;
153 unsigned char mpv_time_reg
[10];
154 unsigned char corr_cnt_reg
[10];
155 unsigned char gen_period_reg
[10];
156 unsigned char intpts_cnt_reg
[10];
157 unsigned char prev_time_reg
[10];
159 int oncpu_irq
; /* irq to be on cpu */
160 int psecs_per_corr_clck
;
162 mpv_intrk_t kdata_intr
[MPV_NUM_IN_INTR
];
163 struct list_head any_in_task_list
;
164 struct pci_dev
*pdev
;
165 struct of_device
*op
;
167 /* mpv_new=1 mpv KPI-2 (ioh2) or mpv_new=2 for MPV4m */
172 int open_in_count
[MPV_NUM_IN_INTR
];
173 int stv_in_number
;/* mpv-in which adjusts time */
174 int stv_intr_got
; /* STV interrupt is got*/
175 int non_oncpu_irq
; /* irq to be in handler*/
185 wait_queue_head_t pollhead
;
190 /* The time when interrupt was sent by MPV */
191 long long time_gener_intr
;
192 int dev_type
; /* sbus, pci */
195 /* listen alive and mask input on interrupt */