1 | /* SPDX-License-Identifier: GPL-2.0 */ |
2 | /* |
3 | */ |
4 | |
5 | #ifndef MSP3400_DRIVER_H |
6 | #define MSP3400_DRIVER_H |
7 | |
8 | #include <media/drv-intf/msp3400.h> |
9 | #include <media/v4l2-device.h> |
10 | #include <media/v4l2-ctrls.h> |
11 | #include <media/v4l2-mc.h> |
12 | |
13 | /* ---------------------------------------------------------------------- */ |
14 | |
15 | /* This macro is allowed for *constants* only, gcc must calculate it |
16 | at compile time. Remember -- no floats in kernel mode */ |
17 | #define MSP_CARRIER(freq) ((int)((float)(freq / 18.432) * (1 << 24))) |
18 | |
19 | #define MSP_MODE_AM_DETECT 0 |
20 | #define MSP_MODE_FM_RADIO 2 |
21 | #define MSP_MODE_FM_TERRA 3 |
22 | #define MSP_MODE_FM_SAT 4 |
23 | #define MSP_MODE_FM_NICAM1 5 |
24 | #define MSP_MODE_FM_NICAM2 6 |
25 | #define MSP_MODE_AM_NICAM 7 |
26 | #define MSP_MODE_BTSC 8 |
27 | #define MSP_MODE_EXTERN 9 |
28 | |
29 | #define SCART_IN1 0 |
30 | #define SCART_IN2 1 |
31 | #define SCART_IN3 2 |
32 | #define SCART_IN4 3 |
33 | #define SCART_IN1_DA 4 |
34 | #define SCART_IN2_DA 5 |
35 | #define SCART_MONO 6 |
36 | #define SCART_MUTE 7 |
37 | |
38 | #define SCART_DSP_IN 0 |
39 | #define SCART1_OUT 1 |
40 | #define SCART2_OUT 2 |
41 | |
42 | #define OPMODE_AUTO -1 |
43 | #define OPMODE_MANUAL 0 |
44 | #define OPMODE_AUTODETECT 1 /* use autodetect (>= msp3410 only) */ |
45 | #define OPMODE_AUTOSELECT 2 /* use autodetect & autoselect (>= msp34xxG) */ |
46 | |
47 | /* module parameters */ |
48 | extern int msp_debug; |
49 | extern bool msp_once; |
50 | extern bool msp_amsound; |
51 | extern int msp_standard; |
52 | extern bool msp_dolby; |
53 | extern int msp_stereo_thresh; |
54 | |
55 | enum msp3400_pads { |
56 | MSP3400_PAD_IF_INPUT, |
57 | MSP3400_PAD_OUT, |
58 | MSP3400_NUM_PADS |
59 | }; |
60 | |
61 | struct msp_state { |
62 | struct v4l2_subdev sd; |
63 | struct v4l2_ctrl_handler hdl; |
64 | int rev1, rev2; |
65 | int ident; |
66 | u8 has_nicam; |
67 | u8 has_radio; |
68 | u8 has_headphones; |
69 | u8 has_ntsc_jp_d_k3; |
70 | u8 has_scart2; |
71 | u8 has_scart3; |
72 | u8 has_scart4; |
73 | u8 has_scart2_out; |
74 | u8 has_scart2_out_volume; |
75 | u8 has_i2s_conf; |
76 | u8 has_subwoofer; |
77 | u8 has_sound_processing; |
78 | u8 has_virtual_dolby_surround; |
79 | u8 has_dolby_pro_logic; |
80 | u8 force_btsc; |
81 | |
82 | int radio; |
83 | int opmode; |
84 | int std; |
85 | int mode; |
86 | v4l2_std_id v4l2_std, detected_std; |
87 | int nicam_on; |
88 | int acb; |
89 | int in_scart; |
90 | int i2s_mode; |
91 | int main, second; /* sound carrier */ |
92 | int input; |
93 | u32 route_in; |
94 | u32 route_out; |
95 | |
96 | /* v4l2 */ |
97 | int audmode; |
98 | int rxsubchans; |
99 | |
100 | struct { |
101 | /* volume cluster */ |
102 | struct v4l2_ctrl *volume; |
103 | struct v4l2_ctrl *muted; |
104 | }; |
105 | |
106 | int scan_in_progress; |
107 | |
108 | /* thread */ |
109 | struct task_struct *kthread; |
110 | wait_queue_head_t wq; |
111 | unsigned int restart:1; |
112 | unsigned int watch_stereo:1; |
113 | |
114 | #if IS_ENABLED(CONFIG_MEDIA_CONTROLLER) |
115 | struct media_pad pads[MSP3400_NUM_PADS]; |
116 | #endif |
117 | }; |
118 | |
119 | static inline struct msp_state *to_state(struct v4l2_subdev *sd) |
120 | { |
121 | return container_of(sd, struct msp_state, sd); |
122 | } |
123 | |
124 | static inline struct msp_state *ctrl_to_state(struct v4l2_ctrl *ctrl) |
125 | { |
126 | return container_of(ctrl->handler, struct msp_state, hdl); |
127 | } |
128 | |
129 | /* msp3400-driver.c */ |
130 | int msp_write_dem(struct i2c_client *client, int addr, int val); |
131 | int msp_write_dsp(struct i2c_client *client, int addr, int val); |
132 | int msp_read_dem(struct i2c_client *client, int addr); |
133 | int msp_read_dsp(struct i2c_client *client, int addr); |
134 | int msp_reset(struct i2c_client *client); |
135 | void msp_set_scart(struct i2c_client *client, int in, int out); |
136 | void msp_update_volume(struct msp_state *state); |
137 | int msp_sleep(struct msp_state *state, int msec); |
138 | |
139 | /* msp3400-kthreads.c */ |
140 | const char *msp_standard_std_name(int std); |
141 | void msp_set_audmode(struct i2c_client *client); |
142 | int msp_detect_stereo(struct i2c_client *client); |
143 | int msp3400c_thread(void *data); |
144 | int msp3410d_thread(void *data); |
145 | int msp34xxg_thread(void *data); |
146 | void msp3400c_set_mode(struct i2c_client *client, int mode); |
147 | void msp3400c_set_carrier(struct i2c_client *client, int cdo1, int cdo2); |
148 | |
149 | #endif /* MSP3400_DRIVER_H */ |
150 | |