... | ... | ||
---|---|---|---|
12 | 12 | ||
13 | Regards, | 13 | Regards, |
14 | Benjamin | 14 | Benjamin |
15 | 15 | ||
16 | --- | 16 | --- |
17 | Changes in v6: | ||
18 | - Use return 0 whenever possible | ||
19 | - Remove unneeded return values initializations | ||
20 | - Fix traces format | ||
21 | - Fix comment typo | ||
22 | - Link to v5: https://lore.kernel.org/r/20250404-b4-vd55g1-v5-0-98f2f02eec59@foss.st.com | ||
23 | |||
24 | Changes in v5: | ||
25 | - Include missing proprety.h header | ||
26 | - Move link_freq to device structure | ||
27 | - Update get_vblank_limits() prototype | ||
28 | - Add BUILD_BUG_ON() in vd55g1_update_patgen() | ||
29 | - Drop hdl->error check | ||
30 | - Use device_property*() instead of of_property*() | ||
31 | - Drop OF requirement | ||
32 | - Improve runtime pm usage | ||
33 | - Various syntax fixes | ||
34 | - Link to v4: https://lore.kernel.org/r/20250402-b4-vd55g1-v4-0-84b1f54c670c@foss.st.com | ||
35 | |||
36 | Changes in v4: | ||
37 | - Fix data-lanes syntax in binding | ||
38 | - Link to v3: https://lore.kernel.org/r/20250402-b4-vd55g1-v3-0-393985404759@foss.st.com | ||
39 | |||
40 | Changes in v3: | ||
41 | - Add maxItems to data-lanes in binding | ||
42 | - Drop redondant 'binding' in binding commit message | ||
43 | - Link to v2: https://lore.kernel.org/r/20250401-b4-vd55g1-v2-0-0c8ab8a48c55@foss.st.com | ||
44 | |||
17 | Changes in v2: | 45 | Changes in v2: |
18 | - Fix device tree binding mistakes | 46 | - Fix device tree binding mistakes |
19 | - Drop linux media git from MAINTAINERS file | 47 | - Drop linux media git from MAINTAINERS file |
20 | - Fix coding style mistakes | 48 | - Fix coding style mistakes |
21 | - Drop vd55g1_err_probe wrapper | 49 | - Drop vd55g1_err_probe wrapper |
22 | - Fix 32bits build | 50 | - Fix 32bits build |
23 | - Fix config symbol help paragraph being too short for checkpatch | 51 | - Fix config symbol help paragraph being too short for checkpatch |
24 | - Link to v1: https://lore.kernel.org/r/20250328-b4-vd55g1-v1-0-8d16b4a79f29@foss.st.com | 52 | - Link to v1: https://lore.kernel.org/r/20250328-b4-vd55g1-v1-0-8d16b4a79f29@foss.st.com |
25 | 53 | ||
26 | --- | 54 | --- |
27 | Benjamin Mugnier (2): | 55 | Benjamin Mugnier (2): |
28 | media: dt-bindings: Add ST VD55G1 camera sensor binding | 56 | media: dt-bindings: Add ST VD55G1 camera sensor |
29 | media: i2c: Add driver for ST VD55G1 camera sensor | 57 | media: i2c: Add driver for ST VD55G1 camera sensor |
30 | 58 | ||
31 | .../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 ++ | 59 | .../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 ++ |
32 | MAINTAINERS | 9 + | 60 | MAINTAINERS | 9 + |
33 | drivers/media/i2c/Kconfig | 11 + | 61 | drivers/media/i2c/Kconfig | 11 + |
34 | drivers/media/i2c/Makefile | 1 + | 62 | drivers/media/i2c/Makefile | 1 + |
35 | drivers/media/i2c/vd55g1.c | 1993 ++++++++++++++++++++ | 63 | drivers/media/i2c/vd55g1.c | 2006 ++++++++++++++++++++ |
36 | 5 files changed, 2146 insertions(+) | 64 | 5 files changed, 2159 insertions(+) |
37 | --- | 65 | --- |
38 | base-commit: b2c4bf0c102084e77ed1b12090d77a76469a6814 | 66 | base-commit: b2c4bf0c102084e77ed1b12090d77a76469a6814 |
39 | change-id: 20250225-b4-vd55g1-bdb90dbe39b3 | 67 | change-id: 20250225-b4-vd55g1-bdb90dbe39b3 |
40 | 68 | ||
41 | Best regards, | 69 | Best regards, |
42 | -- | 70 | -- |
43 | Benjamin Mugnier <benjamin.mugnier@foss.st.com> | 71 | Benjamin Mugnier <benjamin.mugnier@foss.st.com> | diff view generated by jsdifflib |
1 | Also update MAINTAINERS file accordingly. | 1 | Also update MAINTAINERS file accordingly. |
---|---|---|---|
2 | 2 | ||
3 | Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> | ||
3 | Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com> | 4 | Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com> |
4 | --- | 5 | --- |
5 | .../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 +++++++++++++++++++++ | 6 | .../devicetree/bindings/media/i2c/st,vd55g1.yaml | 132 +++++++++++++++++++++ |
6 | MAINTAINERS | 7 ++ | 7 | MAINTAINERS | 7 ++ |
7 | 2 files changed, 139 insertions(+) | 8 | 2 files changed, 139 insertions(+) |
... | ... | ||
81 | + unevaluatedProperties: false | 82 | + unevaluatedProperties: false |
82 | + | 83 | + |
83 | + properties: | 84 | + properties: |
84 | + data-lanes: | 85 | + data-lanes: |
85 | + items: | 86 | + items: |
86 | + const: 1 | 87 | + - const: 1 |
87 | + | 88 | + |
88 | + link-frequencies: | 89 | + link-frequencies: |
89 | + maxItems: 1 | 90 | + maxItems: 1 |
90 | + items: | 91 | + items: |
91 | + minimum: 125000000 | 92 | + minimum: 125000000 |
... | ... | diff view generated by jsdifflib |
... | ... | ||
---|---|---|---|
13 | Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com> | 13 | Signed-off-by: Benjamin Mugnier <benjamin.mugnier@foss.st.com> |
14 | --- | 14 | --- |
15 | MAINTAINERS | 2 + | 15 | MAINTAINERS | 2 + |
16 | drivers/media/i2c/Kconfig | 11 + | 16 | drivers/media/i2c/Kconfig | 11 + |
17 | drivers/media/i2c/Makefile | 1 + | 17 | drivers/media/i2c/Makefile | 1 + |
18 | drivers/media/i2c/vd55g1.c | 1993 ++++++++++++++++++++++++++++++++++++++++++++ | 18 | drivers/media/i2c/vd55g1.c | 2006 ++++++++++++++++++++++++++++++++++++++++++++ |
19 | 4 files changed, 2007 insertions(+) | 19 | 4 files changed, 2020 insertions(+) |
20 | 20 | ||
21 | diff --git a/MAINTAINERS b/MAINTAINERS | 21 | diff --git a/MAINTAINERS b/MAINTAINERS |
22 | index XXXXXXX..XXXXXXX 100644 | 22 | index XXXXXXX..XXXXXXX 100644 |
23 | --- a/MAINTAINERS | 23 | --- a/MAINTAINERS |
24 | +++ b/MAINTAINERS | 24 | +++ b/MAINTAINERS |
... | ... | ||
47 | camera sensor. | 47 | camera sensor. |
48 | 48 | ||
49 | +config VIDEO_VD55G1 | 49 | +config VIDEO_VD55G1 |
50 | + tristate "ST VD55G1 sensor support" | 50 | + tristate "ST VD55G1 sensor support" |
51 | + select V4L2_CCI_I2C | 51 | + select V4L2_CCI_I2C |
52 | + depends on OF && GPIOLIB | 52 | + depends on GPIOLIB |
53 | + help | 53 | + help |
54 | + This is a Video4Linux2 sensor driver for the ST VD55G1 | 54 | + This is a Video4Linux2 sensor driver for the ST VD55G1 |
55 | + camera sensor. | 55 | + camera sensor. |
56 | + | 56 | + |
57 | + To compile this driver as a module, choose M here: the | 57 | + To compile this driver as a module, choose M here: the |
... | ... | ||
90 | +#include <linux/gpio/consumer.h> | 90 | +#include <linux/gpio/consumer.h> |
91 | +#include <linux/i2c.h> | 91 | +#include <linux/i2c.h> |
92 | +#include <linux/iopoll.h> | 92 | +#include <linux/iopoll.h> |
93 | +#include <linux/module.h> | 93 | +#include <linux/module.h> |
94 | +#include <linux/pm_runtime.h> | 94 | +#include <linux/pm_runtime.h> |
95 | +#include <linux/property.h> | ||
95 | +#include <linux/regmap.h> | 96 | +#include <linux/regmap.h> |
96 | +#include <linux/regulator/consumer.h> | 97 | +#include <linux/regulator/consumer.h> |
97 | +#include <linux/unaligned.h> | 98 | +#include <linux/unaligned.h> |
98 | +#include <linux/units.h> | 99 | +#include <linux/units.h> |
99 | + | 100 | + |
... | ... | ||
141 | +#define VD55G1_REG_APPLIED_ANALOG_GAIN CCI_REG16_LE(0x00ea) | 142 | +#define VD55G1_REG_APPLIED_ANALOG_GAIN CCI_REG16_LE(0x00ea) |
142 | +#define VD55G1_REG_APPLIED_DIGITAL_GAIN CCI_REG16_LE(0x00ec) | 143 | +#define VD55G1_REG_APPLIED_DIGITAL_GAIN CCI_REG16_LE(0x00ec) |
143 | +#define VD55G1_REG_AE_FORCE_COLDSTART CCI_REG16_LE(0x0308) | 144 | +#define VD55G1_REG_AE_FORCE_COLDSTART CCI_REG16_LE(0x0308) |
144 | +#define VD55G1_REG_AE_COLDSTART_EXP_TIME CCI_REG32_LE(0x0374) | 145 | +#define VD55G1_REG_AE_COLDSTART_EXP_TIME CCI_REG32_LE(0x0374) |
145 | +#define VD55G1_REG_READOUT_CTRL CCI_REG8(0x052e) | 146 | +#define VD55G1_REG_READOUT_CTRL CCI_REG8(0x052e) |
146 | +#define VD55G1_REG_DARKCAL_CTRL CCI_REG8(0x032a) | ||
147 | +#define VD55G1_DARKCAL_BYPASS 0 | ||
148 | +#define VD55G1_DARKCAL_AUTO 1 | ||
149 | +#define VD55G1_REG_DUSTER_CTRL CCI_REG8(0x03ea) | 147 | +#define VD55G1_REG_DUSTER_CTRL CCI_REG8(0x03ea) |
150 | +#define VD55G1_DUSTER_ENABLE BIT(0) | 148 | +#define VD55G1_DUSTER_ENABLE BIT(0) |
151 | +#define VD55G1_DUSTER_DISABLE 0 | 149 | +#define VD55G1_DUSTER_DISABLE 0 |
152 | +#define VD55G1_DUSTER_DYN_ENABLE BIT(1) | 150 | +#define VD55G1_DUSTER_DYN_ENABLE BIT(1) |
153 | +#define VD55G1_DUSTER_RING_ENABLE BIT(4) | 151 | +#define VD55G1_DUSTER_RING_ENABLE BIT(4) |
... | ... | ||
204 | +#define VD55G1_CTX_OFFSET 0x50 | 202 | +#define VD55G1_CTX_OFFSET 0x50 |
205 | +#define VD55G1_FWPATCH_REVISION_MAJOR 2 | 203 | +#define VD55G1_FWPATCH_REVISION_MAJOR 2 |
206 | +#define VD55G1_FWPATCH_REVISION_MINOR 9 | 204 | +#define VD55G1_FWPATCH_REVISION_MINOR 9 |
207 | + | 205 | + |
208 | +static const u8 patch_array[] = { | 206 | +static const u8 patch_array[] = { |
209 | +0x44, 0x03, 0x09, 0x02, 0xe6, 0x01, 0x42, 0x00, 0xea, 0x01, 0x42, 0x00, 0xf0, | 207 | + 0x44, 0x03, 0x09, 0x02, 0xe6, 0x01, 0x42, 0x00, 0xea, 0x01, 0x42, 0x00, |
210 | +0x01, 0x42, 0x00, 0xe6, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 208 | + 0xf0, 0x01, 0x42, 0x00, 0xe6, 0x01, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, |
211 | +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 209 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
212 | +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 210 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
213 | +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 211 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
214 | +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 212 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
215 | +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, | 213 | + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
216 | +0xfa, 0x68, 0x40, 0x00, 0xe8, 0x09, 0xbe, 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, | 214 | + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x00, 0x00, 0xfa, 0x68, 0x40, 0x00, 0xe8, |
217 | +0x1c, 0x00, 0xc0, 0xe2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, 0x6b, | 215 | + 0x09, 0xbe, 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0x1c, 0x00, 0xc0, 0xe2, |
218 | +0x80, 0x98, 0x7f, 0xfc, 0xef, 0x11, 0xc1, 0x0f, 0x82, 0x69, 0xbe, 0x0f, 0xac, | 216 | + 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, 0x6b, 0x80, 0x98, 0x7f, |
219 | +0x58, 0x40, 0x00, 0xe8, 0x0c, 0x0c, 0x00, 0xf2, 0x93, 0xdd, 0x1c, 0x00, 0x40, | 217 | + 0xfc, 0xef, 0x11, 0xc1, 0x0f, 0x82, 0x69, 0xbe, 0x0f, 0xac, 0x58, 0x40, |
220 | +0xe3, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x84, 0xfa, 0x46, 0x0e, 0xe8, 0xe0, | 218 | + 0x00, 0xe8, 0x0c, 0x0c, 0x00, 0xf2, 0x93, 0xdd, 0x1c, 0x00, 0x40, 0xe3, |
221 | +0x08, 0xde, 0x4a, 0x40, 0x84, 0xe0, 0xa5, 0x86, 0xa8, 0x7d, 0xfc, 0xef, 0x6b, | 219 | + 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x84, 0xfa, 0x46, 0x0e, 0xe8, 0xe0, |
222 | +0x80, 0x01, 0xbf, 0x28, 0x77, 0x0c, 0xef, 0x0b, 0x0e, 0x21, 0x78, 0x06, 0xc0, | 220 | + 0x08, 0xde, 0x4a, 0x40, 0x84, 0xe0, 0xa5, 0x86, 0xa8, 0x7d, 0xfc, 0xef, |
223 | +0x0b, 0xa5, 0xb5, 0x84, 0x06, 0x42, 0x98, 0xe1, 0x01, 0x81, 0x01, 0x42, 0x38, | 221 | + 0x6b, 0x80, 0x01, 0xbf, 0x28, 0x77, 0x0c, 0xef, 0x0b, 0x0e, 0x21, 0x78, |
224 | +0xe0, 0x0c, 0xc4, 0x0e, 0x84, 0x46, 0x02, 0x84, 0xe0, 0x0c, 0x84, 0x11, 0x81, | 222 | + 0x06, 0xc0, 0x0b, 0xa5, 0xb5, 0x84, 0x06, 0x42, 0x98, 0xe1, 0x01, 0x81, |
225 | +0x21, 0x81, 0x31, 0x81, 0x41, 0x81, 0x51, 0x81, 0xc1, 0x81, 0x05, 0x83, 0x0c, | 223 | + 0x01, 0x42, 0x38, 0xe0, 0x0c, 0xc4, 0x0e, 0x84, 0x46, 0x02, 0x84, 0xe0, |
226 | +0x0c, 0x84, 0xf2, 0x93, 0xdd, 0x06, 0x40, 0x98, 0xe1, 0xc8, 0x80, 0x58, 0x82, | 224 | + 0x0c, 0x84, 0x11, 0x81, 0x21, 0x81, 0x31, 0x81, 0x41, 0x81, 0x51, 0x81, |
227 | +0x48, 0xc0, 0x38, 0xc2, 0x29, 0x00, 0x10, 0xe0, 0x19, 0x00, 0x14, 0xe0, 0x09, | 225 | + 0xc1, 0x81, 0x05, 0x83, 0x0c, 0x0c, 0x84, 0xf2, 0x93, 0xdd, 0x06, 0x40, |
228 | +0x00, 0x38, 0xe0, 0x5f, 0xb8, 0x5f, 0xa8, 0x5f, 0xa6, 0x5f, 0xa4, 0x5f, 0xa2, | 226 | + 0x98, 0xe1, 0xc8, 0x80, 0x58, 0x82, 0x48, 0xc0, 0x38, 0xc2, 0x29, 0x00, |
229 | +0x5f, 0xa0, 0x56, 0x41, 0x98, 0xe1, 0x18, 0x82, 0x28, 0x80, 0x38, 0xc0, 0x5f, | 227 | + 0x10, 0xe0, 0x19, 0x00, 0x14, 0xe0, 0x09, 0x00, 0x38, 0xe0, 0x5f, 0xb8, |
230 | +0xa2, 0x19, 0x00, 0x20, 0xf8, 0x5f, 0xa4, 0x28, 0xc2, 0x5f, 0xa6, 0x39, 0x00, | 228 | + 0x5f, 0xa8, 0x5f, 0xa6, 0x5f, 0xa4, 0x5f, 0xa2, 0x5f, 0xa0, 0x56, 0x41, |
231 | +0x10, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x14, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x18, | 229 | + 0x98, 0xe1, 0x18, 0x82, 0x28, 0x80, 0x38, 0xc0, 0x5f, 0xa2, 0x19, 0x00, |
232 | +0xe0, 0x5f, 0xa6, 0x39, 0x00, 0x40, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x44, 0xe0, | 230 | + 0x20, 0xf8, 0x5f, 0xa4, 0x28, 0xc2, 0x5f, 0xa6, 0x39, 0x00, 0x10, 0xe0, |
233 | +0x5f, 0xa4, 0x29, 0x00, 0x1c, 0xe0, 0x5f, 0xa6, 0x39, 0x00, 0x38, 0xe0, 0x5f, | 231 | + 0x5f, 0xa2, 0x19, 0x00, 0x14, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x18, 0xe0, |
234 | +0xa2, 0x19, 0x00, 0x20, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x24, 0xe0, 0x5f, 0xa6, | 232 | + 0x5f, 0xa6, 0x39, 0x00, 0x40, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x44, 0xe0, |
235 | +0x39, 0x00, 0x28, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x2c, 0xe0, 0x5f, 0xa4, 0x29, | 233 | + 0x5f, 0xa4, 0x29, 0x00, 0x1c, 0xe0, 0x5f, 0xa6, 0x39, 0x00, 0x38, 0xe0, |
236 | +0x00, 0x30, 0xe0, 0x5f, 0xa6, 0x09, 0x00, 0x34, 0xe0, 0x5f, 0xa2, 0x5f, 0xa4, | 234 | + 0x5f, 0xa2, 0x19, 0x00, 0x20, 0xe0, 0x5f, 0xa4, 0x29, 0x00, 0x24, 0xe0, |
237 | +0x5f, 0xa0, 0x4a, 0x0a, 0xfc, 0xfb, 0xe5, 0x82, 0x08, 0xde, 0x4a, 0x40, 0x88, | 235 | + 0x5f, 0xa6, 0x39, 0x00, 0x28, 0xe0, 0x5f, 0xa2, 0x19, 0x00, 0x2c, 0xe0, |
238 | +0xe0, 0xf6, 0x40, 0x00, 0xe0, 0x01, 0x4e, 0x99, 0x78, 0x0a, 0xc0, 0x85, 0x80, | 236 | + 0x5f, 0xa4, 0x29, 0x00, 0x30, 0xe0, 0x5f, 0xa6, 0x09, 0x00, 0x34, 0xe0, |
239 | +0x98, 0x40, 0x00, 0xe8, 0x35, 0x81, 0xa8, 0x40, 0x00, 0xe8, 0x0b, 0x8c, 0x0c, | 237 | + 0x5f, 0xa2, 0x5f, 0xa4, 0x5f, 0xa0, 0x4a, 0x0a, 0xfc, 0xfb, 0xe5, 0x82, |
240 | +0x0c, 0x84, 0xf2, 0xd5, 0xed, 0x83, 0xc1, 0x13, 0xc5, 0x93, 0xdd, 0xc3, 0xc1, | 238 | + 0x08, 0xde, 0x4a, 0x40, 0x88, 0xe0, 0xf6, 0x40, 0x00, 0xe0, 0x01, 0x4e, |
241 | +0x83, 0xc1, 0x13, 0xc3, 0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0xc6, | 239 | + 0x99, 0x78, 0x0a, 0xc0, 0x85, 0x80, 0x98, 0x40, 0x00, 0xe8, 0x35, 0x81, |
242 | +0x0f, 0x94, 0xe0, 0x19, 0x0e, 0xc9, 0x65, 0x01, 0xc0, 0x28, 0xde, 0x0a, 0x42, | 240 | + 0xa8, 0x40, 0x00, 0xe8, 0x0b, 0x8c, 0x0c, 0x0c, 0x84, 0xf2, 0xd5, 0xed, |
243 | +0x80, 0xe0, 0x24, 0x02, 0x00, 0xfc, 0x16, 0xde, 0xa5, 0x8a, 0x19, 0x00, 0xb8, | 241 | + 0x83, 0xc1, 0x13, 0xc5, 0x93, 0xdd, 0xc3, 0xc1, 0x83, 0xc1, 0x13, 0xc3, |
244 | +0xe0, 0x10, 0x02, 0x0c, 0xec, 0x1d, 0xe6, 0x14, 0x02, 0x88, 0x80, 0x4e, 0x04, | 242 | + 0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0xc6, 0x0f, 0x94, 0xe0, |
245 | +0x01, 0x00, 0x10, 0x80, 0x25, 0x02, 0x08, 0x9c, 0x86, 0x02, 0x00, 0x80, 0x08, | 243 | + 0x19, 0x0e, 0xc9, 0x65, 0x01, 0xc0, 0x28, 0xde, 0x0a, 0x42, 0x80, 0xe0, |
246 | +0x44, 0x00, 0x98, 0x55, 0x81, 0x11, 0x85, 0x45, 0x81, 0x11, 0x89, 0x25, 0x81, | 244 | + 0x24, 0x02, 0x00, 0xfc, 0x16, 0xde, 0xa5, 0x8a, 0x19, 0x00, 0xb8, 0xe0, |
247 | +0x11, 0x83, 0x2b, 0x00, 0x24, 0xe0, 0x64, 0xc2, 0x0b, 0x84, 0x08, 0x51, 0x00, | 245 | + 0x10, 0x02, 0x0c, 0xec, 0x1d, 0xe6, 0x14, 0x02, 0x88, 0x80, 0x4e, 0x04, |
248 | +0xef, 0x2b, 0x80, 0x01, 0x83, 0x1b, 0x8c, 0x38, 0x7d, 0x5c, 0xef, 0x18, 0xde, | 246 | + 0x01, 0x00, 0x10, 0x80, 0x25, 0x02, 0x08, 0x9c, 0x86, 0x02, 0x00, 0x80, |
249 | +0x0b, 0xa1, 0x25, 0x82, 0x0b, 0x0e, 0x88, 0xf9, 0x0a, 0x00, 0x00, 0xe8, 0x10, | 247 | + 0x08, 0x44, 0x00, 0x98, 0x55, 0x81, 0x11, 0x85, 0x45, 0x81, 0x11, 0x89, |
250 | +0x42, 0x04, 0x9c, 0x11, 0x4e, 0x0c, 0x80, 0x10, 0x40, 0x04, 0xf0, 0x4e, 0x05, | 248 | + 0x25, 0x81, 0x11, 0x83, 0x2b, 0x00, 0x24, 0xe0, 0x64, 0xc2, 0x0b, 0x84, |
251 | +0x01, 0x60, 0x10, 0xc0, 0x06, 0x88, 0x10, 0x40, 0xf8, 0xf3, 0x06, 0xde, 0x4c, | 249 | + 0x08, 0x51, 0x00, 0xef, 0x2b, 0x80, 0x01, 0x83, 0x1b, 0x8c, 0x38, 0x7d, |
252 | +0x0c, 0x04, 0xf2, 0x93, 0xdd, 0x0c, 0x04, 0x1c, 0xfe, 0xf6, 0x0f, 0x94, 0xe0, | 250 | + 0x5c, 0xef, 0x18, 0xde, 0x0b, 0xa1, 0x25, 0x82, 0x0b, 0x0e, 0x88, 0xf9, |
253 | +0x38, 0x9c, 0x46, 0x51, 0xfc, 0xe0, 0x46, 0x49, 0x38, 0xe2, 0x30, 0x46, 0xf8, | 251 | + 0x0a, 0x00, 0x00, 0xe8, 0x10, 0x42, 0x04, 0x9c, 0x11, 0x4e, 0x0c, 0x80, |
254 | +0xf3, 0x36, 0x9c, 0xc6, 0x46, 0x0c, 0xe1, 0x34, 0x8c, 0x94, 0xa0, 0x4e, 0xa0, | 252 | + 0x10, 0x40, 0x04, 0xf0, 0x4e, 0x05, 0x01, 0x60, 0x10, 0xc0, 0x06, 0x88, |
255 | +0x39, 0x06, 0x80, 0xe0, 0x4a, 0x46, 0x94, 0xe0, 0x05, 0x8c, 0x6a, 0x40, 0x80, | 253 | + 0x10, 0x40, 0xf8, 0xf3, 0x06, 0xde, 0x4c, 0x0c, 0x04, 0xf2, 0x93, 0xdd, |
256 | +0xe0, 0x2c, 0x0c, 0x00, 0xe2, 0x0b, 0x8c, 0xb8, 0x7c, 0x5c, 0xef, 0x0b, 0x8c, | 254 | + 0x0c, 0x04, 0x1c, 0xfe, 0xf6, 0x0f, 0x94, 0xe0, 0x38, 0x9c, 0x46, 0x51, |
257 | +0x9e, 0xa0, 0xf8, 0x40, 0x60, 0xef, 0x0b, 0xa1, 0x5a, 0x40, 0x80, 0xe0, 0x65, | 255 | + 0xfc, 0xe0, 0x46, 0x49, 0x38, 0xe2, 0x30, 0x46, 0xf8, 0xf3, 0x36, 0x9c, |
258 | +0x88, 0x28, 0x02, 0x01, 0x40, 0x00, 0x80, 0x2a, 0x42, 0x9c, 0xe1, 0x28, 0x49, | 256 | + 0xc6, 0x46, 0x0c, 0xe1, 0x34, 0x8c, 0x94, 0xa0, 0x4e, 0xa0, 0x39, 0x06, |
259 | +0x60, 0xef, 0x96, 0x4d, 0x9c, 0xe1, 0x01, 0x81, 0x06, 0x98, 0xd5, 0x81, 0x09, | 257 | + 0x80, 0xe0, 0x4a, 0x46, 0x94, 0xe0, 0x05, 0x8c, 0x6a, 0x40, 0x80, 0xe0, |
260 | +0x0e, 0xa1, 0x64, 0x01, 0xc0, 0x4a, 0x40, 0x88, 0xe0, 0x85, 0x80, 0xb8, 0x77, | 258 | + 0x2c, 0x0c, 0x00, 0xe2, 0x0b, 0x8c, 0xb8, 0x7c, 0x5c, 0xef, 0x0b, 0x8c, |
261 | +0xfc, 0xef, 0x35, 0x81, 0xc8, 0x77, 0xfc, 0xef, 0x08, 0x98, 0x4a, 0x00, 0xfc, | 259 | + 0x9e, 0xa0, 0xf8, 0x40, 0x60, 0xef, 0x0b, 0xa1, 0x5a, 0x40, 0x80, 0xe0, |
262 | +0xfb, 0x55, 0xfc, 0xe8, 0x4a, 0x60, 0xef, 0x1a, 0x44, 0x9c, 0xe1, 0x35, 0x81, | 260 | + 0x65, 0x88, 0x28, 0x02, 0x01, 0x40, 0x00, 0x80, 0x2a, 0x42, 0x9c, 0xe1, |
263 | +0x1a, 0x4e, 0x9c, 0xe9, 0x1c, 0x00, 0x00, 0xe2, 0x0c, 0x0c, 0x1c, 0xf6, 0x93, | 261 | + 0x28, 0x49, 0x60, 0xef, 0x96, 0x4d, 0x9c, 0xe1, 0x01, 0x81, 0x06, 0x98, |
264 | +0xdd, 0x0d, 0xc3, 0x1a, 0x41, 0x08, 0xe4, 0x0a, 0x40, 0x84, 0xe1, 0x0c, 0x00, | 262 | + 0xd5, 0x81, 0x09, 0x0e, 0xa1, 0x64, 0x01, 0xc0, 0x4a, 0x40, 0x88, 0xe0, |
265 | +0x00, 0xe2, 0x93, 0xdd, 0x4c, 0x04, 0x1c, 0xfa, 0x86, 0x52, 0xec, 0xe1, 0x08, | 263 | + 0x85, 0x80, 0xb8, 0x77, 0xfc, 0xef, 0x35, 0x81, 0xc8, 0x77, 0xfc, 0xef, |
266 | +0xa6, 0x65, 0x12, 0x24, 0xf8, 0x0e, 0x02, 0x99, 0x7a, 0x00, 0xc0, 0x00, 0x40, | 264 | + 0x08, 0x98, 0x4a, 0x00, 0xfc, 0xfb, 0x55, 0xfc, 0xe8, 0x4a, 0x60, 0xef, |
267 | +0xa0, 0xf3, 0x06, 0xa6, 0x0b, 0x8c, 0x08, 0x49, 0x00, 0xef, 0x85, 0x12, 0x28, | 265 | + 0x1a, 0x44, 0x9c, 0xe1, 0x35, 0x81, 0x1a, 0x4e, 0x9c, 0xe9, 0x1c, 0x00, |
268 | +0xf8, 0x02, 0x02, 0xfc, 0xed, 0xf6, 0x47, 0xfd, 0x6f, 0xe0, 0xff, 0x04, 0xe2, | 266 | + 0x00, 0xe2, 0x0c, 0x0c, 0x1c, 0xf6, 0x93, 0xdd, 0x0d, 0xc3, 0x1a, 0x41, |
269 | +0x14, 0x04, 0xc0, 0xe0, 0x0f, 0x86, 0x2f, 0xa0, 0x0b, 0x8c, 0x2e, 0xe2, 0x08, | 267 | + 0x08, 0xe4, 0x0a, 0x40, 0x84, 0xe1, 0x0c, 0x00, 0x00, 0xe2, 0x93, 0xdd, |
270 | +0x48, 0x00, 0xef, 0x86, 0x02, 0x84, 0xfe, 0x0e, 0x05, 0x09, 0x7d, 0x00, 0xc0, | 268 | + 0x4c, 0x04, 0x1c, 0xfa, 0x86, 0x52, 0xec, 0xe1, 0x08, 0xa6, 0x65, 0x12, |
271 | +0x05, 0x52, 0x08, 0xf8, 0x18, 0x7d, 0xfc, 0xef, 0x4a, 0x40, 0x80, 0xe0, 0x09, | 269 | + 0x24, 0xf8, 0x0e, 0x02, 0x99, 0x7a, 0x00, 0xc0, 0x00, 0x40, 0xa0, 0xf3, |
272 | +0x12, 0x04, 0xc0, 0x65, 0x12, 0x20, 0xf8, 0x00, 0x40, 0x40, 0xdc, 0x01, 0x52, | 270 | + 0x06, 0xa6, 0x0b, 0x8c, 0x08, 0x49, 0x00, 0xef, 0x85, 0x12, 0x28, 0xf8, |
273 | +0x04, 0xc0, 0x0e, 0x00, 0x41, 0x78, 0xf5, 0xc5, 0x6d, 0xc0, 0xb5, 0x82, 0x05, | 271 | + 0x02, 0x02, 0xfc, 0xed, 0xf6, 0x47, 0xfd, 0x6f, 0xe0, 0xff, 0x04, 0xe2, |
274 | +0x10, 0x10, 0xe0, 0x11, 0xf1, 0x0f, 0x82, 0x05, 0x50, 0x10, 0xe0, 0x05, 0x10, | 272 | + 0x14, 0x04, 0xc0, 0xe0, 0x0f, 0x86, 0x2f, 0xa0, 0x0b, 0x8c, 0x2e, 0xe2, |
275 | +0x10, 0xe0, 0xfe, 0x02, 0xf0, 0xff, 0x0f, 0x82, 0x85, 0x83, 0x15, 0x10, 0x10, | 273 | + 0x08, 0x48, 0x00, 0xef, 0x86, 0x02, 0x84, 0xfe, 0x0e, 0x05, 0x09, 0x7d, |
276 | +0xe0, 0x16, 0x00, 0x91, 0x6e, 0x69, 0xcd, 0x21, 0xf1, 0x6d, 0xc1, 0x01, 0x83, | 274 | + 0x00, 0xc0, 0x05, 0x52, 0x08, 0xf8, 0x18, 0x7d, 0xfc, 0xef, 0x4a, 0x40, |
277 | +0x2f, 0x82, 0x26, 0x00, 0x00, 0x80, 0x2f, 0xa0, 0x25, 0x50, 0x10, 0xe0, 0x05, | 275 | + 0x80, 0xe0, 0x09, 0x12, 0x04, 0xc0, 0x65, 0x12, 0x20, 0xf8, 0x00, 0x40, |
278 | +0x10, 0x10, 0xe0, 0x11, 0xa1, 0xfe, 0x04, 0xf0, 0xff, 0x06, 0x42, 0x00, 0x80, | 276 | + 0x40, 0xdc, 0x01, 0x52, 0x04, 0xc0, 0x0e, 0x00, 0x41, 0x78, 0xf5, 0xc5, |
279 | +0x0f, 0x84, 0x0f, 0xa2, 0x05, 0x50, 0x10, 0xe0, 0x16, 0x00, 0x91, 0x6e, 0x69, | 277 | + 0x6d, 0xc0, 0xb5, 0x82, 0x05, 0x10, 0x10, 0xe0, 0x11, 0xf1, 0x0f, 0x82, |
280 | +0xcd, 0x6d, 0xc1, 0x71, 0x8d, 0x16, 0x00, 0x79, 0x61, 0x2d, 0xcb, 0x86, 0x0e, | 278 | + 0x05, 0x50, 0x10, 0xe0, 0x05, 0x10, 0x10, 0xe0, 0xfe, 0x02, 0xf0, 0xff, |
281 | +0x00, 0x80, 0x6d, 0xc1, 0x56, 0x0e, 0x00, 0xc0, 0x0b, 0x8c, 0x1b, 0x8e, 0x71, | 279 | + 0x0f, 0x82, 0x85, 0x83, 0x15, 0x10, 0x10, 0xe0, 0x16, 0x00, 0x91, 0x6e, |
282 | +0x52, 0x0c, 0xf8, 0x08, 0x43, 0x00, 0xef, 0x05, 0x52, 0x14, 0xf8, 0x15, 0x10, | 280 | + 0x69, 0xcd, 0x21, 0xf1, 0x6d, 0xc1, 0x01, 0x83, 0x2f, 0x82, 0x26, 0x00, |
283 | +0x28, 0xe0, 0x70, 0x04, 0x04, 0xec, 0x31, 0xe1, 0x29, 0x9e, 0x1f, 0x86, 0x1f, | 281 | + 0x00, 0x80, 0x2f, 0xa0, 0x25, 0x50, 0x10, 0xe0, 0x05, 0x10, 0x10, 0xe0, |
284 | +0xa4, 0x15, 0x50, 0x28, 0xe0, 0x86, 0x42, 0x3c, 0xe0, 0x0e, 0x04, 0x9d, 0x64, | 282 | + 0x11, 0xa1, 0xfe, 0x04, 0xf0, 0xff, 0x06, 0x42, 0x00, 0x80, 0x0f, 0x84, |
285 | +0x9b, 0xc2, 0x05, 0x52, 0x1c, 0xf8, 0x78, 0xa6, 0x48, 0x77, 0xfc, 0xef, 0x4a, | 283 | + 0x0f, 0xa2, 0x05, 0x50, 0x10, 0xe0, 0x16, 0x00, 0x91, 0x6e, 0x69, 0xcd, |
286 | +0x40, 0x80, 0xe0, 0x70, 0x4e, 0x10, 0xdc, 0x1e, 0x00, 0x81, 0x70, 0xeb, 0xcb, | 284 | + 0x6d, 0xc1, 0x71, 0x8d, 0x16, 0x00, 0x79, 0x61, 0x2d, 0xcb, 0x86, 0x0e, |
287 | +0x70, 0x4e, 0xec, 0x93, 0x6d, 0xc1, 0x11, 0x85, 0x36, 0x02, 0x00, 0x80, 0x76, | 285 | + 0x00, 0x80, 0x6d, 0xc1, 0x56, 0x0e, 0x00, 0xc0, 0x0b, 0x8c, 0x1b, 0x8e, |
288 | +0xa6, 0x11, 0x52, 0x10, 0xf8, 0x05, 0x10, 0x40, 0xe0, 0xfe, 0x47, 0x0c, 0xff, | 286 | + 0x71, 0x52, 0x0c, 0xf8, 0x08, 0x43, 0x00, 0xef, 0x05, 0x52, 0x14, 0xf8, |
289 | +0x14, 0x04, 0xa0, 0xe0, 0x0f, 0x86, 0x0f, 0xa4, 0x05, 0x50, 0x40, 0xe0, 0x05, | 287 | + 0x15, 0x10, 0x28, 0xe0, 0x70, 0x04, 0x04, 0xec, 0x31, 0xe1, 0x29, 0x9e, |
290 | +0x10, 0x28, 0xe0, 0xfe, 0x47, 0xfd, 0x7f, 0xe3, 0xff, 0x14, 0x04, 0xd0, 0xe0, | 288 | + 0x1f, 0x86, 0x1f, 0xa4, 0x15, 0x50, 0x28, 0xe0, 0x86, 0x42, 0x3c, 0xe0, |
291 | +0x0f, 0x86, 0x2f, 0xa0, 0x20, 0x00, 0x01, 0x6c, 0x00, 0xd0, 0x05, 0x50, 0x28, | 289 | + 0x0e, 0x04, 0x9d, 0x64, 0x9b, 0xc2, 0x05, 0x52, 0x1c, 0xf8, 0x78, 0xa6, |
292 | +0xe0, 0x0b, 0x8c, 0xf8, 0x7e, 0xfc, 0xee, 0x0e, 0x03, 0x59, 0x78, 0xf5, 0xc5, | 290 | + 0x48, 0x77, 0xfc, 0xef, 0x4a, 0x40, 0x80, 0xe0, 0x70, 0x4e, 0x10, 0xdc, |
293 | +0x0d, 0xc2, 0x05, 0x52, 0x0c, 0xf8, 0x08, 0xa6, 0x46, 0x42, 0xb4, 0xe0, 0x18, | 291 | + 0x1e, 0x00, 0x81, 0x70, 0xeb, 0xcb, 0x70, 0x4e, 0xec, 0x93, 0x6d, 0xc1, |
294 | +0x84, 0x00, 0x40, 0xf4, 0x93, 0x00, 0x40, 0x08, 0xdc, 0x1b, 0xa1, 0x06, 0xa6, | 292 | + 0x11, 0x85, 0x36, 0x02, 0x00, 0x80, 0x76, 0xa6, 0x11, 0x52, 0x10, 0xf8, |
295 | +0x05, 0x10, 0x40, 0x80, 0x04, 0x00, 0x50, 0x9c, 0x65, 0x8a, 0x05, 0x10, 0x44, | 293 | + 0x05, 0x10, 0x40, 0xe0, 0xfe, 0x47, 0x0c, 0xff, 0x14, 0x04, 0xa0, 0xe0, |
296 | +0xe0, 0xf6, 0x43, 0xfd, 0x6f, 0x00, 0xf8, 0x0f, 0x82, 0x06, 0x02, 0x01, 0x60, | 294 | + 0x0f, 0x86, 0x0f, 0xa4, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x28, 0xe0, |
297 | +0x1e, 0xc0, 0x0f, 0xa2, 0x05, 0x50, 0x44, 0xe0, 0x05, 0x10, 0x44, 0xe0, 0x0e, | 295 | + 0xfe, 0x47, 0xfd, 0x7f, 0xe3, 0xff, 0x14, 0x04, 0xd0, 0xe0, 0x0f, 0x86, |
298 | +0x02, 0x00, 0xf8, 0x0f, 0x82, 0x09, 0xf6, 0x05, 0x50, 0x44, 0xe0, 0x05, 0x10, | 296 | + 0x2f, 0xa0, 0x20, 0x00, 0x01, 0x6c, 0x00, 0xd0, 0x05, 0x50, 0x28, 0xe0, |
299 | +0x40, 0xe0, 0x04, 0x00, 0x54, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, | 297 | + 0x0b, 0x8c, 0xf8, 0x7e, 0xfc, 0xee, 0x0e, 0x03, 0x59, 0x78, 0xf5, 0xc5, |
300 | +0xe0, 0x04, 0x00, 0xcc, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, | 298 | + 0x0d, 0xc2, 0x05, 0x52, 0x0c, 0xf8, 0x08, 0xa6, 0x46, 0x42, 0xb4, 0xe0, |
301 | +0x04, 0x00, 0x4c, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, | 299 | + 0x18, 0x84, 0x00, 0x40, 0xf4, 0x93, 0x00, 0x40, 0x08, 0xdc, 0x1b, 0xa1, |
302 | +0x00, 0xd0, 0xfc, 0x05, 0x50, 0x40, 0xe0, 0x4c, 0x0c, 0x1c, 0xf2, 0x93, 0xdd, | 300 | + 0x06, 0xa6, 0x05, 0x10, 0x40, 0x80, 0x04, 0x00, 0x50, 0x9c, 0x65, 0x8a, |
303 | +0xc3, 0xc1, 0xc6, 0x40, 0xfc, 0xe0, 0x04, 0x80, 0xc6, 0x44, 0x0c, 0xe1, 0x15, | 301 | + 0x05, 0x10, 0x44, 0xe0, 0xf6, 0x43, 0xfd, 0x6f, 0x00, 0xf8, 0x0f, 0x82, |
304 | +0x04, 0x0c, 0xf8, 0x0a, 0x80, 0x06, 0x07, 0x04, 0xe0, 0x03, 0x42, 0x48, 0xe1, | 302 | + 0x06, 0x02, 0x01, 0x60, 0x1e, 0xc0, 0x0f, 0xa2, 0x05, 0x50, 0x44, 0xe0, |
305 | +0x46, 0x02, 0x40, 0xe2, 0x08, 0xc6, 0x44, 0x88, 0x06, 0x46, 0x0e, 0xe0, 0x86, | 303 | + 0x05, 0x10, 0x44, 0xe0, 0x0e, 0x02, 0x00, 0xf8, 0x0f, 0x82, 0x09, 0xf6, |
306 | +0x01, 0x84, 0xe0, 0x33, 0x80, 0x39, 0x06, 0xd8, 0xef, 0x0a, 0x46, 0x80, 0xe0, | 304 | + 0x05, 0x50, 0x44, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0x54, 0xfc, |
307 | +0x31, 0xbf, 0x06, 0x06, 0x00, 0xc0, 0x31, 0x48, 0x60, 0xe0, 0x34, 0x88, 0x49, | 305 | + 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0xcc, 0xfc, |
308 | +0x06, 0x40, 0xe1, 0x40, 0x48, 0x7c, 0xf3, 0x41, 0x46, 0x40, 0xe1, 0x24, 0x8a, | 306 | + 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0x4c, 0xfc, |
309 | +0x39, 0x04, 0x10, 0xe0, 0x39, 0xc2, 0x31, 0x44, 0x10, 0xe0, 0x14, 0xc4, 0x1b, | 307 | + 0x05, 0x50, 0x40, 0xe0, 0x05, 0x10, 0x40, 0xe0, 0x04, 0x00, 0xd0, 0xfc, |
310 | +0xa5, 0x11, 0x83, 0x11, 0x40, 0x25, 0x6a, 0x01, 0xc0, 0x08, 0x5c, 0x00, 0xda, | 308 | + 0x05, 0x50, 0x40, 0xe0, 0x4c, 0x0c, 0x1c, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, |
311 | +0x15, 0x00, 0xcc, 0xe0, 0x25, 0x00, 0xf8, 0xe0, 0x1b, 0x85, 0x08, 0x5c, 0x00, | 309 | + 0xc6, 0x40, 0xfc, 0xe0, 0x04, 0x80, 0xc6, 0x44, 0x0c, 0xe1, 0x15, 0x04, |
312 | +0x9a, 0x4e, 0x03, 0x01, 0x60, 0x10, 0xc0, 0x29, 0x00, 0x1c, 0xe4, 0x18, 0x84, | 310 | + 0x0c, 0xf8, 0x0a, 0x80, 0x06, 0x07, 0x04, 0xe0, 0x03, 0x42, 0x48, 0xe1, |
313 | +0x20, 0x44, 0xf8, 0xf3, 0x2f, 0xa2, 0x21, 0x40, 0x1c, 0xe4, 0x93, 0xdd, 0x0c, | 311 | + 0x46, 0x02, 0x40, 0xe2, 0x08, 0xc6, 0x44, 0x88, 0x06, 0x46, 0x0e, 0xe0, |
314 | +0x00, 0x80, 0xfa, 0x15, 0x00, 0x3c, 0xe0, 0x21, 0x81, 0x31, 0x85, 0x21, 0x42, | 312 | + 0x86, 0x01, 0x84, 0xe0, 0x33, 0x80, 0x39, 0x06, 0xd8, 0xef, 0x0a, 0x46, |
315 | +0x60, 0xe0, 0x15, 0x00, 0x44, 0xe0, 0x31, 0x42, 0x40, 0xe1, 0x15, 0x00, 0x34, | 313 | + 0x80, 0xe0, 0x31, 0xbf, 0x06, 0x06, 0x00, 0xc0, 0x31, 0x48, 0x60, 0xe0, |
316 | +0xe0, 0x21, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0xd6, 0x04, 0x10, 0xe0, | 314 | + 0x34, 0x88, 0x49, 0x06, 0x40, 0xe1, 0x40, 0x48, 0x7c, 0xf3, 0x41, 0x46, |
317 | +0x23, 0x42, 0x30, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0x86, 0x44, 0x04, 0xe0, 0x23, | 315 | + 0x40, 0xe1, 0x24, 0x8a, 0x39, 0x04, 0x10, 0xe0, 0x39, 0xc2, 0x31, 0x44, |
318 | +0x42, 0x38, 0xe0, 0x05, 0x00, 0x30, 0xe0, 0xc6, 0x02, 0x08, 0xe0, 0x13, 0x40, | 316 | + 0x10, 0xe0, 0x14, 0xc4, 0x1b, 0xa5, 0x11, 0x83, 0x11, 0x40, 0x25, 0x6a, |
319 | +0x10, 0xe3, 0xe8, 0x56, 0x40, 0xef, 0x06, 0x40, 0x0c, 0xe1, 0x04, 0x80, 0x06, | 317 | + 0x01, 0xc0, 0x08, 0x5c, 0x00, 0xda, 0x15, 0x00, 0xcc, 0xe0, 0x25, 0x00, |
320 | +0x02, 0x94, 0xe0, 0x2b, 0x02, 0xc4, 0xea, 0x3b, 0x00, 0x78, 0xe2, 0x20, 0x44, | 318 | + 0xf8, 0xe0, 0x1b, 0x85, 0x08, 0x5c, 0x00, 0x9a, 0x4e, 0x03, 0x01, 0x60, |
321 | +0xfd, 0x73, 0x07, 0xc0, 0x30, 0x46, 0x01, 0x70, 0xf8, 0xc0, 0x3f, 0xa4, 0x33, | 319 | + 0x10, 0xc0, 0x29, 0x00, 0x1c, 0xe4, 0x18, 0x84, 0x20, 0x44, 0xf8, 0xf3, |
322 | +0x40, 0x78, 0xe2, 0x0a, 0x84, 0x0c, 0x08, 0x80, 0xf2, 0xf8, 0x3b, 0x3c, 0xff, | 320 | + 0x2f, 0xa2, 0x21, 0x40, 0x1c, 0xe4, 0x93, 0xdd, 0x0c, 0x00, 0x80, 0xfa, |
323 | +0xc3, 0xc1, 0x06, 0x40, 0x0c, 0xe1, 0x04, 0x80, 0x1b, 0x00, 0x40, 0xe4, 0x19, | 321 | + 0x15, 0x00, 0x3c, 0xe0, 0x21, 0x81, 0x31, 0x85, 0x21, 0x42, 0x60, 0xe0, |
324 | +0xc2, 0x13, 0x40, 0x40, 0xe4, 0x1b, 0x00, 0x40, 0xe4, 0x19, 0xc4, 0x13, 0x40, | 322 | + 0x15, 0x00, 0x44, 0xe0, 0x31, 0x42, 0x40, 0xe1, 0x15, 0x00, 0x34, 0xe0, |
325 | +0x40, 0xe4, 0x93, 0xdd, 0xc6, 0x43, 0xec, 0xe0, 0x46, 0x41, 0xfc, 0xe0, 0x24, | 323 | + 0x21, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0xd6, 0x04, 0x10, 0xe0, |
326 | +0x84, 0x04, 0x80, 0x31, 0x81, 0x4a, 0x44, 0x80, 0xe0, 0x86, 0x44, 0x0c, 0xe1, | 324 | + 0x23, 0x42, 0x30, 0xe0, 0x15, 0x00, 0x34, 0xe0, 0x86, 0x44, 0x04, 0xe0, |
327 | +0x09, 0x00, 0x6c, 0xe0, 0xc4, 0x8a, 0x8e, 0x47, 0xfc, 0x9f, 0x01, 0x42, 0x51, | 325 | + 0x23, 0x42, 0x38, 0xe0, 0x05, 0x00, 0x30, 0xe0, 0xc6, 0x02, 0x08, 0xe0, |
328 | +0x78, 0x0c, 0xc0, 0x31, 0x58, 0x90, 0xe0, 0x34, 0x8a, 0x41, 0xbf, 0x06, 0x08, | 326 | + 0x13, 0x40, 0x10, 0xe3, 0xe8, 0x56, 0x40, 0xef, 0x06, 0x40, 0x0c, 0xe1, |
329 | +0x00, 0xc0, 0x41, 0x46, 0xa0, 0xe0, 0x34, 0x8a, 0x51, 0x81, 0xf6, 0x0b, 0x00, | 327 | + 0x04, 0x80, 0x06, 0x02, 0x94, 0xe0, 0x2b, 0x02, 0xc4, 0xea, 0x3b, 0x00, |
330 | +0xc0, 0x51, 0x46, 0xd0, 0xe0, 0x34, 0x8a, 0x01, 0xbf, 0x51, 0x46, 0xe0, 0xe0, | 328 | + 0x78, 0xe2, 0x20, 0x44, 0xfd, 0x73, 0x07, 0xc0, 0x30, 0x46, 0x01, 0x70, |
331 | +0x44, 0x84, 0x0a, 0x48, 0x84, 0xe0, 0x75, 0x86, 0x54, 0xca, 0x49, 0x88, 0x44, | 329 | + 0xf8, 0xc0, 0x3f, 0xa4, 0x33, 0x40, 0x78, 0xe2, 0x0a, 0x84, 0x0c, 0x08, |
332 | +0x06, 0x88, 0xe1, 0x36, 0x94, 0x4a, 0x46, 0x80, 0xe0, 0x34, 0xca, 0x47, 0xc6, | 330 | + 0x80, 0xf2, 0xf8, 0x3b, 0x3c, 0xff, 0xc3, 0xc1, 0x06, 0x40, 0x0c, 0xe1, |
333 | +0x11, 0x8d, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88, 0x76, 0x02, 0x00, 0xc0, 0x06, | 331 | + 0x04, 0x80, 0x1b, 0x00, 0x40, 0xe4, 0x19, 0xc2, 0x13, 0x40, 0x40, 0xe4, |
334 | +0x00, 0x00, 0xc0, 0x16, 0x8c, 0x14, 0x88, 0x01, 0x42, 0xc0, 0xe1, 0x01, 0x42, | 332 | + 0x1b, 0x00, 0x40, 0xe4, 0x19, 0xc4, 0x13, 0x40, 0x40, 0xe4, 0x93, 0xdd, |
335 | +0xe0, 0xe1, 0x01, 0x42, 0xf0, 0xe1, 0x93, 0xdd, 0x34, 0xca, 0x41, 0x85, 0x46, | 333 | + 0xc6, 0x43, 0xec, 0xe0, 0x46, 0x41, 0xfc, 0xe0, 0x24, 0x84, 0x04, 0x80, |
336 | +0x8c, 0x34, 0xca, 0x06, 0x48, 0x00, 0xe0, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88, | 334 | + 0x31, 0x81, 0x4a, 0x44, 0x80, 0xe0, 0x86, 0x44, 0x0c, 0xe1, 0x09, 0x00, |
337 | +0x41, 0x83, 0x46, 0x8c, 0x34, 0x88, 0x01, 0x46, 0xc0, 0xe1, 0x01, 0x46, 0xe0, | 335 | + 0x6c, 0xe0, 0xc4, 0x8a, 0x8e, 0x47, 0xfc, 0x9f, 0x01, 0x42, 0x51, 0x78, |
338 | +0xe1, 0x01, 0x46, 0xf0, 0xe1, 0x09, 0x02, 0x20, 0xe0, 0x14, 0xca, 0x03, 0x42, | 336 | + 0x0c, 0xc0, 0x31, 0x58, 0x90, 0xe0, 0x34, 0x8a, 0x41, 0xbf, 0x06, 0x08, |
339 | +0x58, 0xe0, 0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0x46, 0x4e, 0x08, | 337 | + 0x00, 0xc0, 0x41, 0x46, 0xa0, 0xe0, 0x34, 0x8a, 0x51, 0x81, 0xf6, 0x0b, |
340 | +0xe1, 0x06, 0x4c, 0x0c, 0xe1, 0x0a, 0x9e, 0x14, 0x98, 0x05, 0x42, 0x44, 0xe0, | 338 | + 0x00, 0xc0, 0x51, 0x46, 0xd0, 0xe0, 0x34, 0x8a, 0x01, 0xbf, 0x51, 0x46, |
341 | +0x10, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0x78, 0x41, 0x00, 0xe8, 0x08, 0x9c, 0x0b, | 339 | + 0xe0, 0xe0, 0x44, 0x84, 0x0a, 0x48, 0x84, 0xe0, 0x75, 0x86, 0x54, 0xca, |
342 | +0xa1, 0x04, 0x98, 0x06, 0x02, 0x10, 0x80, 0x13, 0x40, 0xf8, 0x86, 0x65, 0x82, | 340 | + 0x49, 0x88, 0x44, 0x06, 0x88, 0xe1, 0x36, 0x94, 0x4a, 0x46, 0x80, 0xe0, |
343 | +0x00, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0xa8, 0x40, 0x00, 0xe8, 0x14, 0x98, 0x04, | 341 | + 0x34, 0xca, 0x47, 0xc6, 0x11, 0x8d, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88, |
344 | +0x00, 0xa0, 0xfc, 0x03, 0x42, 0x00, 0xe7, 0x4c, 0x0c, 0x04, 0xf2, 0x93, 0xdd, | 342 | + 0x76, 0x02, 0x00, 0xc0, 0x06, 0x00, 0x00, 0xc0, 0x16, 0x8c, 0x14, 0x88, |
345 | +0x0a, 0x80, 0x93, 0xdd, 0x0c, 0x04, 0x00, 0xfa, 0x06, 0x02, 0xec, 0xe1, 0x64, | 343 | + 0x01, 0x42, 0xc0, 0xe1, 0x01, 0x42, 0xe0, 0xe1, 0x01, 0x42, 0xf0, 0xe1, |
346 | +0x84, 0x15, 0x0c, 0x2c, 0xe0, 0x14, 0x02, 0xa0, 0xfc, 0x15, 0x4c, 0x2c, 0xe0, | 344 | + 0x93, 0xdd, 0x34, 0xca, 0x41, 0x85, 0x46, 0x8c, 0x34, 0xca, 0x06, 0x48, |
347 | +0xd8, 0x40, 0x00, 0xe8, 0x14, 0xd8, 0x09, 0x82, 0x14, 0x02, 0x00, 0xfc, 0x1f, | 345 | + 0x00, 0xe0, 0x41, 0x46, 0xd0, 0xe0, 0x34, 0x88, 0x41, 0x83, 0x46, 0x8c, |
348 | +0xa0, 0x1e, 0xd8, 0x01, 0x85, 0x0c, 0x0c, 0x00, 0xf2, 0xe8, 0x32, 0x2c, 0xff, | 346 | + 0x34, 0x88, 0x01, 0x46, 0xc0, 0xe1, 0x01, 0x46, 0xe0, 0xe1, 0x01, 0x46, |
349 | +0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, 0x6b, 0x80, 0xf6, 0x01, 0x94, | 347 | + 0xf0, 0xe1, 0x09, 0x02, 0x20, 0xe0, 0x14, 0xca, 0x03, 0x42, 0x58, 0xe0, |
350 | +0xe0, 0x08, 0x80, 0x4a, 0x40, 0x80, 0xe0, 0x45, 0x86, 0x06, 0x40, 0x0c, 0xe1, | 348 | + 0x93, 0xdd, 0xc3, 0xc1, 0x4c, 0x04, 0x04, 0xfa, 0x46, 0x4e, 0x08, 0xe1, |
351 | +0x04, 0x80, 0xc6, 0x02, 0x40, 0xe2, 0x09, 0x00, 0xd0, 0xe0, 0x14, 0x84, 0x1b, | 349 | + 0x06, 0x4c, 0x0c, 0xe1, 0x0a, 0x9e, 0x14, 0x98, 0x05, 0x42, 0x44, 0xe0, |
352 | +0xa5, 0x15, 0x84, 0x07, 0xc5, 0x09, 0x82, 0x18, 0x41, 0x00, 0xe8, 0x46, 0x43, | 350 | + 0x10, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0x78, 0x41, 0x00, 0xe8, 0x08, 0x9c, |
353 | +0xfc, 0xe0, 0x14, 0x84, 0x19, 0x02, 0xd8, 0xe0, 0x19, 0x82, 0x0b, 0x83, 0x16, | 351 | + 0x0b, 0xa1, 0x04, 0x98, 0x06, 0x02, 0x10, 0x80, 0x13, 0x40, 0xf8, 0x86, |
354 | +0x00, 0x00, 0xc0, 0x01, 0x4c, 0x00, 0xc0, 0x0c, 0x0c, 0x00, 0xf2, 0x93, 0xdd, | 352 | + 0x65, 0x82, 0x00, 0x00, 0xe1, 0x65, 0x03, 0xc0, 0xa8, 0x40, 0x00, 0xe8, |
355 | +0xc3, 0xc1, 0x4a, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xe2, 0x93, 0xdd, 0xc3, | 353 | + 0x14, 0x98, 0x04, 0x00, 0xa0, 0xfc, 0x03, 0x42, 0x00, 0xe7, 0x4c, 0x0c, |
356 | +0xc1, 0x46, 0x40, 0x84, 0xe0, 0x11, 0xaf, 0x13, 0x40, 0x6c, 0xec, 0x11, 0xb3, | 354 | + 0x04, 0xf2, 0x93, 0xdd, 0x0a, 0x80, 0x93, 0xdd, 0x0c, 0x04, 0x00, 0xfa, |
357 | +0x13, 0x40, 0x70, 0xec, 0xc6, 0x43, 0xf0, 0xe0, 0x13, 0x40, 0xdc, 0xec, 0xc6, | 355 | + 0x06, 0x02, 0xec, 0xe1, 0x64, 0x84, 0x15, 0x0c, 0x2c, 0xe0, 0x14, 0x02, |
358 | +0x02, 0x24, 0xe0, 0x1c, 0x80, 0x93, 0xdd, 0x4c, 0x00, 0x00, 0xfa, 0xc8, 0x60, | 356 | + 0xa0, 0xfc, 0x15, 0x4c, 0x2c, 0xe0, 0xd8, 0x40, 0x00, 0xe8, 0x14, 0xd8, |
359 | +0x7c, 0xef, 0xe8, 0x61, 0x7c, 0xef, 0x28, 0x7e, 0x80, 0xef, 0xc6, 0x40, 0x98, | 357 | + 0x09, 0x82, 0x14, 0x02, 0x00, 0xfc, 0x1f, 0xa0, 0x1e, 0xd8, 0x01, 0x85, |
360 | +0xe1, 0x11, 0x83, 0x16, 0x80, 0x46, 0x01, 0x10, 0xe1, 0x11, 0x81, 0x16, 0x80, | 358 | + 0x0c, 0x0c, 0x00, 0xf2, 0xe8, 0x32, 0x2c, 0xff, 0x93, 0xdd, 0xc3, 0xc1, |
361 | +0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x0c, 0xfa, 0x6b, | 359 | + 0x0c, 0x04, 0x00, 0xfa, 0x6b, 0x80, 0xf6, 0x01, 0x94, 0xe0, 0x08, 0x80, |
362 | +0x80, 0x04, 0x98, 0x7b, 0x82, 0x56, 0x42, 0xb4, 0xe0, 0x88, 0x84, 0x05, 0x00, | 360 | + 0x4a, 0x40, 0x80, 0xe0, 0x45, 0x86, 0x06, 0x40, 0x0c, 0xe1, 0x04, 0x80, |
363 | +0x10, 0xe0, 0x09, 0x86, 0x0b, 0xa5, 0x46, 0x02, 0x00, 0x80, 0x06, 0x05, 0x00, | 361 | + 0xc6, 0x02, 0x40, 0xe2, 0x09, 0x00, 0xd0, 0xe0, 0x14, 0x84, 0x1b, 0xa5, |
364 | +0x80, 0x25, 0x82, 0x0b, 0xa3, 0xa5, 0x80, 0x0b, 0xa1, 0x06, 0x00, 0xf4, 0xef, | 362 | + 0x15, 0x84, 0x07, 0xc5, 0x09, 0x82, 0x18, 0x41, 0x00, 0xe8, 0x46, 0x43, |
365 | +0xd5, 0x84, 0x11, 0x85, 0x21, 0x91, 0x0b, 0x8e, 0x88, 0x74, 0x10, 0xef, 0x0b, | 363 | + 0xfc, 0xe0, 0x14, 0x84, 0x19, 0x02, 0xd8, 0xe0, 0x19, 0x82, 0x0b, 0x83, |
366 | +0xa1, 0xf5, 0x82, 0x0a, 0x9e, 0x1a, 0x9c, 0x24, 0x98, 0x07, 0xe0, 0x0f, 0xa2, | 364 | + 0x16, 0x00, 0x00, 0xc0, 0x01, 0x4c, 0x00, 0xc0, 0x0c, 0x0c, 0x00, 0xf2, |
367 | +0x0e, 0xca, 0x0a, 0xde, 0x1a, 0xdc, 0x24, 0x98, 0x03, 0xb0, 0x07, 0xe0, 0x0f, | 365 | + 0x93, 0xdd, 0xc3, 0xc1, 0x4a, 0x00, 0x00, 0xe0, 0x0c, 0x00, 0x00, 0xe2, |
368 | +0xa2, 0x0e, 0xc8, 0x01, 0x81, 0x0c, 0x0c, 0x0c, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, | 366 | + 0x93, 0xdd, 0xc3, 0xc1, 0x46, 0x40, 0x84, 0xe0, 0x11, 0xaf, 0x13, 0x40, |
369 | +0x0c, 0x04, 0x7c, 0xfa, 0x46, 0x42, 0x9c, 0xe0, 0x0b, 0x02, 0x04, 0xe3, 0xf0, | 367 | + 0x6c, 0xec, 0x11, 0xb3, 0x13, 0x40, 0x70, 0xec, 0xc6, 0x43, 0xf0, 0xe0, |
370 | +0x1e, 0x30, 0xec, 0x0b, 0xa3, 0x35, 0x96, 0x8e, 0x01, 0x01, 0x60, 0x10, 0xc0, | 368 | + 0x13, 0x40, 0xdc, 0xec, 0xc6, 0x02, 0x24, 0xe0, 0x1c, 0x80, 0x93, 0xdd, |
371 | +0x0e, 0xfc, 0xc6, 0x05, 0xd0, 0xe1, 0x0b, 0x82, 0x31, 0x81, 0x10, 0x16, 0x00, | 369 | + 0x4c, 0x00, 0x00, 0xfa, 0xc8, 0x60, 0x7c, 0xef, 0xe8, 0x61, 0x7c, 0xef, |
372 | +0xe5, 0x20, 0x10, 0x20, 0xe7, 0x0e, 0xbe, 0xb5, 0x85, 0x94, 0xfc, 0xa4, 0xbe, | 370 | + 0x28, 0x7e, 0x80, 0xef, 0xc6, 0x40, 0x98, 0xe1, 0x11, 0x83, 0x16, 0x80, |
373 | +0x82, 0x4c, 0x9c, 0xf0, 0x05, 0x0c, 0x40, 0xe0, 0x11, 0x89, 0x93, 0x8e, 0xa3, | 371 | + 0x46, 0x01, 0x10, 0xe1, 0x11, 0x81, 0x16, 0x80, 0x4c, 0x08, 0x00, 0xf2, |
374 | +0x8e, 0x58, 0x44, 0x00, 0xe8, 0x15, 0x0c, 0xc0, 0xf8, 0x04, 0x0c, 0x80, 0xfb, | 372 | + 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x0c, 0xfa, 0x6b, 0x80, 0x04, 0x98, |
375 | +0x0c, 0xed, 0x0b, 0x82, 0x1b, 0x8c, 0x48, 0x44, 0x00, 0xe8, 0x15, 0x10, 0x1c, | 373 | + 0x7b, 0x82, 0x56, 0x42, 0xb4, 0xe0, 0x88, 0x84, 0x05, 0x00, 0x10, 0xe0, |
376 | +0xfc, 0x0e, 0xa8, 0x0b, 0x82, 0x1b, 0x8c, 0xd8, 0x43, 0x00, 0xe8, 0x71, 0x88, | 374 | + 0x09, 0x86, 0x0b, 0xa5, 0x46, 0x02, 0x00, 0x80, 0x06, 0x05, 0x00, 0x80, |
377 | +0x0e, 0xa4, 0x0a, 0x0e, 0x40, 0xe0, 0x35, 0xf8, 0x04, 0xbe, 0x14, 0xbc, 0x81, | 375 | + 0x25, 0x82, 0x0b, 0xa3, 0xa5, 0x80, 0x0b, 0xa1, 0x06, 0x00, 0xf4, 0xef, |
378 | +0xa0, 0x03, 0x8e, 0x0e, 0xbe, 0x04, 0xfc, 0x11, 0x82, 0x3b, 0x82, 0x03, 0x8e, | 376 | + 0xd5, 0x84, 0x11, 0x85, 0x21, 0x91, 0x0b, 0x8e, 0x88, 0x74, 0x10, 0xef, |
379 | +0x0e, 0xfc, 0x3b, 0xa9, 0x06, 0x0e, 0x00, 0xc0, 0x35, 0x5e, 0x00, 0xc0, 0xd5, | 377 | + 0x0b, 0xa1, 0xf5, 0x82, 0x0a, 0x9e, 0x1a, 0x9c, 0x24, 0x98, 0x07, 0xe0, |
380 | +0xfa, 0xc6, 0x01, 0xd0, 0xe1, 0x7b, 0x80, 0x04, 0x9e, 0x11, 0x91, 0x98, 0x41, | 378 | + 0x0f, 0xa2, 0x0e, 0xca, 0x0a, 0xde, 0x1a, 0xdc, 0x24, 0x98, 0x03, 0xb0, |
381 | +0x00, 0xe8, 0x24, 0x9c, 0x46, 0x42, 0x9c, 0xe0, 0x6b, 0x82, 0x03, 0x4c, 0xc4, | 379 | + 0x07, 0xe0, 0x0f, 0xa2, 0x0e, 0xc8, 0x01, 0x81, 0x0c, 0x0c, 0x0c, 0xf2, |
382 | +0xe0, 0x11, 0x91, 0x0b, 0x84, 0xf8, 0x40, 0x00, 0xe8, 0x19, 0x0e, 0x20, 0xe5, | 380 | + 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x7c, 0xfa, 0x46, 0x42, 0x9c, 0xe0, |
383 | +0x03, 0x4c, 0xc0, 0xe0, 0x0b, 0x82, 0x08, 0x72, 0xfc, 0xef, 0x01, 0x4c, 0x24, | 381 | + 0x0b, 0x02, 0x04, 0xe3, 0xf0, 0x1e, 0x30, 0xec, 0x0b, 0xa3, 0x35, 0x96, |
384 | +0xf9, 0xf1, 0x98, 0x0c, 0x0c, 0x7c, 0xf2, 0x93, 0xdd, 0x4c, 0x00, 0x00, 0xfa, | 382 | + 0x8e, 0x01, 0x01, 0x60, 0x10, 0xc0, 0x0e, 0xfc, 0xc6, 0x05, 0xd0, 0xe1, |
385 | +0x48, 0x65, 0x2c, 0xef, 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, | 383 | + 0x0b, 0x82, 0x31, 0x81, 0x10, 0x16, 0x00, 0xe5, 0x20, 0x10, 0x20, 0xe7, |
386 | +0x04, 0x00, 0xfa, 0x6b, 0x82, 0x78, 0x6e, 0xfc, 0xee, 0x46, 0x42, 0xec, 0xe0, | 384 | + 0x0e, 0xbe, 0xb5, 0x85, 0x94, 0xfc, 0xa4, 0xbe, 0x82, 0x4c, 0x9c, 0xf0, |
387 | +0x24, 0x84, 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x83, 0xf5, 0x82, 0x24, | 385 | + 0x05, 0x0c, 0x40, 0xe0, 0x11, 0x89, 0x93, 0x8e, 0xa3, 0x8e, 0x58, 0x44, |
388 | +0x02, 0xa0, 0xe1, 0x14, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x85, 0x15, 0x82, | 386 | + 0x00, 0xe8, 0x15, 0x0c, 0xc0, 0xf8, 0x04, 0x0c, 0x80, 0xfb, 0x0c, 0xed, |
389 | +0x27, 0xe1, 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x89, 0x86, 0x02, 0x00, | 387 | + 0x0b, 0x82, 0x1b, 0x8c, 0x48, 0x44, 0x00, 0xe8, 0x15, 0x10, 0x1c, 0xfc, |
390 | +0x80, 0x0c, 0x0c, 0x00, 0xf2, 0x18, 0x17, 0xfc, 0xfe, 0xc3, 0xc1, 0x0c, 0x04, | 388 | + 0x0e, 0xa8, 0x0b, 0x82, 0x1b, 0x8c, 0xd8, 0x43, 0x00, 0xe8, 0x71, 0x88, |
391 | +0x00, 0xfa, 0x06, 0x41, 0x8c, 0xe0, 0x1b, 0x00, 0xec, 0xe4, 0x1b, 0xa3, 0x75, | 389 | + 0x0e, 0xa4, 0x0a, 0x0e, 0x40, 0xe0, 0x35, 0xf8, 0x04, 0xbe, 0x14, 0xbc, |
392 | +0x84, 0x11, 0x81, 0x8e, 0x05, 0x01, 0x60, 0x10, 0xc0, 0x00, 0x06, 0xc0, 0xe5, | 390 | + 0x81, 0xa0, 0x03, 0x8e, 0x0e, 0xbe, 0x04, 0xfc, 0x11, 0x82, 0x3b, 0x82, |
393 | +0x95, 0x81, 0x44, 0x88, 0x1d, 0xee, 0x75, 0x80, 0x4e, 0xc1, 0x25, 0x81, 0x4e, | 391 | + 0x03, 0x8e, 0x0e, 0xfc, 0x3b, 0xa9, 0x06, 0x0e, 0x00, 0xc0, 0x35, 0x5e, |
394 | +0xcd, 0x21, 0x88, 0x11, 0x82, 0x0a, 0x02, 0x40, 0xe0, 0xd5, 0xfc, 0x56, 0x00, | 392 | + 0x00, 0xc0, 0xd5, 0xfa, 0xc6, 0x01, 0xd0, 0xe1, 0x7b, 0x80, 0x04, 0x9e, |
395 | +0x00, 0xe1, 0x18, 0x80, 0x1b, 0xa1, 0xc5, 0x84, 0x08, 0x82, 0x4a, 0x00, 0xfc, | 393 | + 0x11, 0x91, 0x98, 0x41, 0x00, 0xe8, 0x24, 0x9c, 0x46, 0x42, 0x9c, 0xe0, |
396 | +0xfb, 0x45, 0x84, 0x86, 0x4d, 0x84, 0xe1, 0x04, 0x98, 0x05, 0x00, 0x10, 0xe0, | 394 | + 0x6b, 0x82, 0x03, 0x4c, 0xc4, 0xe0, 0x11, 0x91, 0x0b, 0x84, 0xf8, 0x40, |
397 | +0x4a, 0x40, 0x80, 0xe0, 0x45, 0x82, 0x11, 0x81, 0x0b, 0x8c, 0x58, 0x76, 0x28, | 395 | + 0x00, 0xe8, 0x19, 0x0e, 0x20, 0xe5, 0x03, 0x4c, 0xc0, 0xe0, 0x0b, 0x82, |
398 | +0xef, 0x0b, 0x8c, 0x0c, 0x0c, 0x00, 0xf2, 0x88, 0x35, 0x28, 0xff, 0x0c, 0x0c, | 396 | + 0x08, 0x72, 0xfc, 0xef, 0x01, 0x4c, 0x24, 0xf9, 0xf1, 0x98, 0x0c, 0x0c, |
399 | +0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x46, 0x41, 0xfc, 0xe0, 0x04, 0x80, 0x09, | 397 | + 0x7c, 0xf2, 0x93, 0xdd, 0x4c, 0x00, 0x00, 0xfa, 0x48, 0x65, 0x2c, 0xef, |
400 | +0x00, 0x80, 0xe0, 0x09, 0x9e, 0x0b, 0xa3, 0x75, 0x82, 0x46, 0x41, 0x80, 0xe1, | 398 | + 0x4c, 0x08, 0x00, 0xf2, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x00, 0xfa, |
401 | +0x04, 0x80, 0xc6, 0x42, 0x8c, 0xe0, 0x04, 0xc2, 0x00, 0x40, 0x00, 0xf2, 0x07, | 399 | + 0x6b, 0x82, 0x78, 0x6e, 0xfc, 0xee, 0x46, 0x42, 0xec, 0xe0, 0x24, 0x84, |
402 | +0xcf, 0x06, 0x84, 0x06, 0x40, 0x84, 0xe0, 0x15, 0x00, 0x28, 0xe5, 0x1c, 0xc2, | 400 | + 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x83, 0xf5, 0x82, 0x24, 0x02, |
403 | +0x93, 0xdd, 0x0b, 0xa1, 0xc6, 0x00, 0xa0, 0xe1, 0x15, 0x00, 0x04, 0xf8, 0x05, | 401 | + 0xa0, 0xe1, 0x14, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x85, 0x15, 0x82, |
404 | +0x84, 0x21, 0x8b, 0x2c, 0x84, 0x14, 0x80, 0x2c, 0x84, 0x14, 0x82, 0x2c, 0x84, | 402 | + 0x27, 0xe1, 0x24, 0x02, 0x80, 0xfa, 0x1d, 0xcc, 0x11, 0x89, 0x86, 0x02, |
405 | +0x15, 0x00, 0x10, 0xe0, 0x21, 0xa1, 0x21, 0x42, 0x10, 0xe0, 0x05, 0x00, 0x14, | 403 | + 0x00, 0x80, 0x0c, 0x0c, 0x00, 0xf2, 0x18, 0x17, 0xfc, 0xfe, 0xc3, 0xc1, |
406 | +0xe0, 0x01, 0x88, 0x75, 0x83, 0x21, 0x85, 0x2c, 0x84, 0x14, 0x80, 0x06, 0x46, | 404 | + 0x0c, 0x04, 0x00, 0xfa, 0x06, 0x41, 0x8c, 0xe0, 0x1b, 0x00, 0xec, 0xe4, |
407 | +0x00, 0xe0, 0x2c, 0x84, 0x14, 0x82, 0x2c, 0x84, 0x14, 0xc0, 0x21, 0xa1, 0x21, | 405 | + 0x1b, 0xa3, 0x75, 0x84, 0x11, 0x81, 0x8e, 0x05, 0x01, 0x60, 0x10, 0xc0, |
408 | +0x42, 0x20, 0xe0, 0x14, 0xc2, 0x31, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x10, 0xe0, | 406 | + 0x00, 0x06, 0xc0, 0xe5, 0x95, 0x81, 0x44, 0x88, 0x1d, 0xee, 0x75, 0x80, |
409 | +0x21, 0x42, 0x20, 0xe0, 0x05, 0x00, 0x14, 0xe0, 0x01, 0x90, 0x06, 0x42, 0x00, | 407 | + 0x4e, 0xc1, 0x25, 0x81, 0x4e, 0xcd, 0x21, 0x88, 0x11, 0x82, 0x0a, 0x02, |
410 | +0xe0, 0x16, 0x80, 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x7c, 0xfa, 0x4a, 0x40, | 408 | + 0x40, 0xe0, 0xd5, 0xfc, 0x56, 0x00, 0x00, 0xe1, 0x18, 0x80, 0x1b, 0xa1, |
411 | +0x80, 0xe0, 0xf0, 0x1e, 0x30, 0xec, 0xe5, 0x82, 0xa6, 0x40, 0x00, 0xe1, 0x1a, | 409 | + 0xc5, 0x84, 0x08, 0x82, 0x4a, 0x00, 0xfc, 0xfb, 0x45, 0x84, 0x86, 0x4d, |
412 | +0x80, 0x2a, 0xc0, 0x3a, 0xc2, 0x13, 0x40, 0x10, 0xe0, 0x1a, 0x82, 0x23, 0x40, | 410 | + 0x84, 0xe1, 0x04, 0x98, 0x05, 0x00, 0x10, 0xe0, 0x4a, 0x40, 0x80, 0xe0, |
413 | +0x18, 0xe0, 0x33, 0x40, 0x1c, 0xe0, 0x13, 0x40, 0x14, 0xe0, 0xf8, 0x61, 0x68, | 411 | + 0x45, 0x82, 0x11, 0x81, 0x0b, 0x8c, 0x58, 0x76, 0x28, 0xef, 0x0b, 0x8c, |
414 | +0xef, 0xc6, 0x13, 0x00, 0xe1, 0x15, 0x12, 0x28, 0xf8, 0x0b, 0x02, 0x2c, 0xe0, | 412 | + 0x0c, 0x0c, 0x00, 0xf2, 0x88, 0x35, 0x28, 0xff, 0x0c, 0x0c, 0x00, 0xf2, |
415 | +0x1b, 0x02, 0x24, 0xe0, 0x8a, 0x00, 0xa5, 0x64, 0x03, 0xc0, 0x35, 0x82, 0x0a, | 413 | + 0x93, 0xdd, 0xc3, 0xc1, 0x46, 0x41, 0xfc, 0xe0, 0x04, 0x80, 0x09, 0x00, |
416 | +0x4e, 0x9c, 0xe1, 0x1a, 0x03, 0x11, 0x6f, 0x02, 0xc0, 0xe8, 0x13, 0x01, 0x20, | 414 | + 0x80, 0xe0, 0x09, 0x9e, 0x0b, 0xa3, 0x75, 0x82, 0x46, 0x41, 0x80, 0xe1, |
417 | +0x00, 0xc0, 0x1f, 0xa0, 0x5a, 0x42, 0x80, 0xe0, 0x0a, 0x4e, 0x9c, 0xe1, 0x68, | 415 | + 0x04, 0x80, 0xc6, 0x42, 0x8c, 0xe0, 0x04, 0xc2, 0x00, 0x40, 0x00, 0xf2, |
418 | +0x13, 0x00, 0xa0, 0x09, 0x12, 0x78, 0xf8, 0xa1, 0x81, 0xf0, 0x02, 0x10, 0xe4, | 416 | + 0x07, 0xcf, 0x06, 0x84, 0x06, 0x40, 0x84, 0xe0, 0x15, 0x00, 0x28, 0xe5, |
419 | +0x07, 0xc4, 0x0c, 0xfc, 0xf0, 0x00, 0x20, 0xe4, 0xa6, 0x91, 0xa8, 0x53, 0x74, | 417 | + 0x1c, 0xc2, 0x93, 0xdd, 0x0b, 0xa1, 0xc6, 0x00, 0xa0, 0xe1, 0x15, 0x00, |
420 | +0xef, 0x05, 0x12, 0x30, 0xf8, 0x25, 0x12, 0x28, 0xf8, 0x61, 0x87, 0x09, 0x00, | 418 | + 0x04, 0xf8, 0x05, 0x84, 0x21, 0x8b, 0x2c, 0x84, 0x14, 0x80, 0x2c, 0x84, |
421 | +0x48, 0xe0, 0x81, 0x85, 0x09, 0x86, 0x0b, 0xa7, 0x26, 0x0c, 0x00, 0xc0, 0x0b, | 419 | + 0x14, 0x82, 0x2c, 0x84, 0x15, 0x00, 0x10, 0xe0, 0x21, 0xa1, 0x21, 0x42, |
422 | +0xa1, 0x0b, 0x04, 0x28, 0xe0, 0x16, 0x0c, 0x00, 0x80, 0x03, 0x52, 0x04, 0xf8, | 420 | + 0x10, 0xe0, 0x05, 0x00, 0x14, 0xe0, 0x01, 0x88, 0x75, 0x83, 0x21, 0x85, |
423 | +0x0b, 0x04, 0x20, 0xe0, 0x0c, 0xa6, 0x1b, 0x04, 0x2c, 0xe0, 0x3b, 0x04, 0x28, | 421 | + 0x2c, 0x84, 0x14, 0x80, 0x06, 0x46, 0x00, 0xe0, 0x2c, 0x84, 0x14, 0x82, |
424 | +0xe0, 0x4b, 0x04, 0x20, 0xe0, 0x13, 0x86, 0x3b, 0x04, 0x24, 0xe0, 0x10, 0x0a, | 422 | + 0x2c, 0x84, 0x14, 0xc0, 0x21, 0xa1, 0x21, 0x42, 0x20, 0xe0, 0x14, 0xc2, |
425 | +0x04, 0xec, 0x1a, 0xfc, 0x33, 0x88, 0x30, 0x06, 0x04, 0xec, 0x12, 0x4e, 0x94, | 423 | + 0x31, 0x42, 0x20, 0xe0, 0x15, 0x00, 0x10, 0xe0, 0x21, 0x42, 0x20, 0xe0, |
426 | +0xf0, 0x32, 0x48, 0x84, 0xf0, 0x4c, 0xe4, 0x7c, 0xa4, 0xcb, 0x04, 0x28, 0xe0, | 424 | + 0x05, 0x00, 0x14, 0xe0, 0x01, 0x90, 0x06, 0x42, 0x00, 0xe0, 0x16, 0x80, |
427 | +0x14, 0x08, 0x84, 0xe1, 0xcd, 0xc9, 0xc2, 0x58, 0x90, 0x91, 0x42, 0x4e, 0x94, | 425 | + 0x93, 0xdd, 0xc3, 0xc1, 0x0c, 0x04, 0x7c, 0xfa, 0x4a, 0x40, 0x80, 0xe0, |
428 | +0x90, 0xc3, 0x52, 0x04, 0x98, 0x73, 0x52, 0x00, 0x80, 0x5b, 0x04, 0x20, 0xe0, | 426 | + 0xf0, 0x1e, 0x30, 0xec, 0xe5, 0x82, 0xa6, 0x40, 0x00, 0xe1, 0x1a, 0x80, |
429 | +0x5d, 0xc9, 0x52, 0x40, 0x90, 0x91, 0x42, 0x48, 0x8c, 0x90, 0x03, 0x52, 0x04, | 427 | + 0x2a, 0xc0, 0x3a, 0xc2, 0x13, 0x40, 0x10, 0xe0, 0x1a, 0x82, 0x23, 0x40, |
430 | +0x80, 0x43, 0x52, 0x08, 0x80, 0x3b, 0x04, 0x2c, 0xe0, 0x49, 0x04, 0xb8, 0xe0, | 428 | + 0x18, 0xe0, 0x33, 0x40, 0x1c, 0xe0, 0x13, 0x40, 0x14, 0xe0, 0xf8, 0x61, |
431 | +0x33, 0x52, 0x1c, 0xf8, 0x2b, 0x04, 0x24, 0xe0, 0x4b, 0xab, 0x23, 0x52, 0x18, | 429 | + 0x68, 0xef, 0xc6, 0x13, 0x00, 0xe1, 0x15, 0x12, 0x28, 0xf8, 0x0b, 0x02, |
432 | +0xf8, 0x65, 0x8a, 0x4b, 0xa9, 0xe5, 0x90, 0x4b, 0xa7, 0x22, 0x44, 0x84, 0xd0, | 430 | + 0x2c, 0xe0, 0x1b, 0x02, 0x24, 0xe0, 0x8a, 0x00, 0xa5, 0x64, 0x03, 0xc0, |
433 | +0x32, 0x46, 0x84, 0xd0, 0x33, 0x52, 0x1c, 0xd8, 0x23, 0x52, 0x18, 0xd8, 0x95, | 431 | + 0x35, 0x82, 0x0a, 0x4e, 0x9c, 0xe1, 0x1a, 0x03, 0x11, 0x6f, 0x02, 0xc0, |
434 | +0x96, 0x20, 0x44, 0xf9, 0x73, 0xff, 0xc0, 0x27, 0xc3, 0x23, 0x82, 0x23, 0x52, | 432 | + 0xe8, 0x13, 0x01, 0x20, 0x00, 0xc0, 0x1f, 0xa0, 0x5a, 0x42, 0x80, 0xe0, |
435 | +0x18, 0xf8, 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x58, | 433 | + 0x0a, 0x4e, 0x9c, 0xe1, 0x68, 0x13, 0x00, 0xa0, 0x09, 0x12, 0x78, 0xf8, |
436 | +0x52, 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc3, | 434 | + 0xa1, 0x81, 0xf0, 0x02, 0x10, 0xe4, 0x07, 0xc4, 0x0c, 0xfc, 0xf0, 0x00, |
437 | +0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, 0x80, | 435 | + 0x20, 0xe4, 0xa6, 0x91, 0xa8, 0x53, 0x74, 0xef, 0x05, 0x12, 0x30, 0xf8, |
438 | +0xfb, 0x2b, 0x8c, 0x68, 0x51, 0x74, 0xef, 0xc5, 0x87, 0x20, 0x44, 0xe1, 0x73, | 436 | + 0x25, 0x12, 0x28, 0xf8, 0x61, 0x87, 0x09, 0x00, 0x48, 0xe0, 0x81, 0x85, |
439 | +0xff, 0xc0, 0x27, 0xc7, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8, 0x24, 0x02, 0x80, | 437 | + 0x09, 0x86, 0x0b, 0xa7, 0x26, 0x0c, 0x00, 0xc0, 0x0b, 0xa1, 0x0b, 0x04, |
440 | +0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x78, 0x57, 0x74, 0xef, 0x1b, 0x12, | 438 | + 0x28, 0xe0, 0x16, 0x0c, 0x00, 0x80, 0x03, 0x52, 0x04, 0xf8, 0x0b, 0x04, |
441 | +0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc7, 0x13, 0x84, 0x13, 0x52, 0x1c, | 439 | + 0x20, 0xe0, 0x0c, 0xa6, 0x1b, 0x04, 0x2c, 0xe0, 0x3b, 0x04, 0x28, 0xe0, |
442 | +0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, 0x80, 0xfb, 0x2b, 0x8c, 0x88, 0x56, | 440 | + 0x4b, 0x04, 0x20, 0xe0, 0x13, 0x86, 0x3b, 0x04, 0x24, 0xe0, 0x10, 0x0a, |
443 | +0x74, 0xef, 0xe5, 0x83, 0x20, 0x44, 0xf1, 0x73, 0xff, 0xc0, 0x27, 0xc5, 0x23, | 441 | + 0x04, 0xec, 0x1a, 0xfc, 0x33, 0x88, 0x30, 0x06, 0x04, 0xec, 0x12, 0x4e, |
444 | +0x82, 0x23, 0x52, 0x18, 0xf8, 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, | 442 | + 0x94, 0xf0, 0x32, 0x48, 0x84, 0xf0, 0x4c, 0xe4, 0x7c, 0xa4, 0xcb, 0x04, |
445 | +0x2b, 0x8c, 0x18, 0x52, 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, | 443 | + 0x28, 0xe0, 0x14, 0x08, 0x84, 0xe1, 0xcd, 0xc9, 0xc2, 0x58, 0x90, 0x91, |
446 | +0xe4, 0x17, 0xc5, 0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, | 444 | + 0x42, 0x4e, 0x94, 0x90, 0xc3, 0x52, 0x04, 0x98, 0x73, 0x52, 0x00, 0x80, |
447 | +0x14, 0x02, 0x80, 0xfb, 0x2b, 0x8c, 0x28, 0x51, 0x74, 0xef, 0x7b, 0x80, 0x7c, | 445 | + 0x5b, 0x04, 0x20, 0xe0, 0x5d, 0xc9, 0x52, 0x40, 0x90, 0x91, 0x42, 0x48, |
448 | +0xa4, 0x08, 0x91, 0xa3, 0x52, 0x1c, 0xe0, 0xa3, 0x52, 0x24, 0xe0, 0x0b, 0xa1, | 446 | + 0x8c, 0x90, 0x03, 0x52, 0x04, 0x80, 0x43, 0x52, 0x08, 0x80, 0x3b, 0x04, |
449 | +0x83, 0x52, 0x1c, 0x80, 0x83, 0x52, 0x24, 0x80, 0x89, 0x12, 0x78, 0xf8, 0xf6, | 447 | + 0x2c, 0xe0, 0x49, 0x04, 0xb8, 0xe0, 0x33, 0x52, 0x1c, 0xf8, 0x2b, 0x04, |
450 | +0x57, 0xfc, 0xef, 0x6b, 0x12, 0x1c, 0xf8, 0xab, 0x12, 0x18, 0xf8, 0xd6, 0x57, | 448 | + 0x24, 0xe0, 0x4b, 0xab, 0x23, 0x52, 0x18, 0xf8, 0x65, 0x8a, 0x4b, 0xa9, |
451 | +0xfc, 0x8f, 0x8b, 0xa3, 0xa0, 0x40, 0x00, 0x9c, 0xa5, 0x86, 0x64, 0x00, 0x80, | 449 | + 0xe5, 0x90, 0x4b, 0xa7, 0x22, 0x44, 0x84, 0xd0, 0x32, 0x46, 0x84, 0xd0, |
452 | +0xfb, 0x1b, 0x90, 0xf8, 0x7d, 0xf8, 0xee, 0x6b, 0x80, 0xa4, 0x00, 0x80, 0xfb, | 450 | + 0x33, 0x52, 0x1c, 0xd8, 0x23, 0x52, 0x18, 0xd8, 0x95, 0x96, 0x20, 0x44, |
453 | +0x1b, 0x90, 0x98, 0x7d, 0xf8, 0xee, 0x15, 0x12, 0x28, 0xf8, 0x19, 0x02, 0xb8, | 451 | + 0xf9, 0x73, 0xff, 0xc0, 0x27, 0xc3, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8, |
454 | +0xe0, 0x1b, 0xad, 0x95, 0x82, 0x1a, 0xa6, 0xa0, 0x44, 0xf9, 0x73, 0xff, 0xc0, | 452 | + 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x58, 0x52, |
455 | +0x27, 0xc3, 0x13, 0x94, 0x10, 0x02, 0x08, 0xec, 0x1c, 0xe4, 0x23, 0x52, 0x18, | 453 | + 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc3, |
456 | +0xf8, 0x1b, 0x12, 0x04, 0xf8, 0x03, 0x96, 0x03, 0x52, 0x28, 0xe0, 0x1c, 0xe6, | 454 | + 0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, |
457 | +0x0a, 0xa6, 0x1a, 0xe4, 0x63, 0x96, 0x63, 0x52, 0x20, 0xe0, 0x73, 0x52, 0x10, | 455 | + 0x80, 0xfb, 0x2b, 0x8c, 0x68, 0x51, 0x74, 0xef, 0xc5, 0x87, 0x20, 0x44, |
458 | +0xe0, 0x03, 0x52, 0x14, 0xe0, 0x13, 0x52, 0x18, 0xe0, 0x98, 0x52, 0x74, 0xef, | 456 | + 0xe1, 0x73, 0xff, 0xc0, 0x27, 0xc7, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8, |
459 | +0x09, 0x12, 0x8c, 0xe0, 0x0b, 0xa1, 0x01, 0x81, 0x01, 0x52, 0x90, 0xe0, 0x65, | 457 | + 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x78, 0x57, |
460 | +0x82, 0x05, 0x12, 0x30, 0xf8, 0x09, 0x00, 0xa8, 0xe0, 0x0a, 0x00, 0x0c, 0xf8, | 458 | + 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc7, |
461 | +0x16, 0x00, 0x00, 0xc0, 0x01, 0x52, 0x90, 0xc0, 0x46, 0x41, 0x84, 0xe0, 0x0a, | 459 | + 0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, |
462 | +0x80, 0x0a, 0x4e, 0x9c, 0xe9, 0x1a, 0x00, 0x08, 0xe0, 0x38, 0x01, 0x01, 0x20, | 460 | + 0x80, 0xfb, 0x2b, 0x8c, 0x88, 0x56, 0x74, 0xef, 0xe5, 0x83, 0x20, 0x44, |
463 | +0x00, 0xc0, 0x0b, 0x12, 0x1c, 0xe0, 0x1b, 0x12, 0x24, 0xe0, 0x2b, 0x12, 0x28, | 461 | + 0xf1, 0x73, 0xff, 0xc0, 0x27, 0xc5, 0x23, 0x82, 0x23, 0x52, 0x18, 0xf8, |
464 | +0xe0, 0x03, 0x52, 0x2c, 0xe0, 0x0b, 0x12, 0x20, 0xe0, 0x13, 0x52, 0x34, 0xe0, | 462 | + 0x24, 0x02, 0x80, 0xfb, 0x04, 0x00, 0x80, 0xfb, 0x2b, 0x8c, 0x18, 0x52, |
465 | +0x23, 0x52, 0x38, 0xe0, 0x03, 0x52, 0x30, 0xe0, 0x0c, 0x00, 0x00, 0xe2, 0xf1, | 463 | + 0x74, 0xef, 0x1b, 0x12, 0x1c, 0xf8, 0x2a, 0xfc, 0x0c, 0xe4, 0x17, 0xc5, |
466 | +0x98, 0x0c, 0x0c, 0x7c, 0xf2, 0x93, 0xdd, 0x13, 0xa9, 0x00, 0x00, 0xa8, 0xc1, | 464 | + 0x13, 0x84, 0x13, 0x52, 0x1c, 0xf8, 0x0b, 0x12, 0x04, 0xf8, 0x14, 0x02, |
467 | +0x40, 0x00, 0x68, 0x04, 0xa0, 0xe0, 0x40, 0x6c, 0x40, 0x00, 0xe8, 0x34, 0xc8, | 465 | + 0x80, 0xfb, 0x2b, 0x8c, 0x28, 0x51, 0x74, 0xef, 0x7b, 0x80, 0x7c, 0xa4, |
468 | +0xe0, 0xfc, 0x91, 0x40, 0x00, 0x68, 0x1f, 0xb8, 0xe0, 0x30, 0x16, 0x41, 0x00, | 466 | + 0x08, 0x91, 0xa3, 0x52, 0x1c, 0xe0, 0xa3, 0x52, 0x24, 0xe0, 0x0b, 0xa1, |
469 | +0x28, 0x39, 0x74, 0xe0, 0xb0, 0x7e, 0x40, 0x00, 0xe8, 0x38, 0xc0, 0xe0, 0x30, | 467 | + 0x83, 0x52, 0x1c, 0x80, 0x83, 0x52, 0x24, 0x80, 0x89, 0x12, 0x78, 0xf8, |
470 | +0x04, 0x41, 0x00, 0x48, 0x1b, 0x80, 0xe0, 0x30, 0x2e, 0x40, 0x00, 0x88, 0x0c, | 468 | + 0xf6, 0x57, 0xfc, 0xef, 0x6b, 0x12, 0x1c, 0xf8, 0xab, 0x12, 0x18, 0xf8, |
471 | +0xec, 0xe0, 0x10, 0x9f, 0x40, 0x00, 0x88, 0x08, 0xb4, 0xe0, 0x10, 0x01, 0x41, | 469 | + 0xd6, 0x57, 0xfc, 0x8f, 0x8b, 0xa3, 0xa0, 0x40, 0x00, 0x9c, 0xa5, 0x86, |
472 | +0x00, 0x68, 0x01, 0x84, 0xe0, 0x54, 0xd6, 0x40, 0x00, 0xc8, 0x1a, 0x98, 0xe0, | 470 | + 0x64, 0x00, 0x80, 0xfb, 0x1b, 0x90, 0xf8, 0x7d, 0xf8, 0xee, 0x6b, 0x80, |
473 | +0xd0, 0xc8, 0x40, 0x00, 0x68, 0x08, 0xa0, 0xe0, 0x80, 0xdb, 0x40, 0x00, 0xe8, | 471 | + 0xa4, 0x00, 0x80, 0xfb, 0x1b, 0x90, 0x98, 0x7d, 0xf8, 0xee, 0x15, 0x12, |
474 | +0x35, 0x94, 0xe0, 0x74, 0xff, 0x40, 0x00, 0xa8, 0x11, 0x80, 0xe0, 0xf8, 0x89, | 472 | + 0x28, 0xf8, 0x19, 0x02, 0xb8, 0xe0, 0x1b, 0xad, 0x95, 0x82, 0x1a, 0xa6, |
475 | +0x40, 0x00, 0x88, 0x16, 0xbc, 0xe0, 0x00, 0x90, 0x40, 0x00, 0x08, 0x35, 0xb8, | 473 | + 0xa0, 0x44, 0xf9, 0x73, 0xff, 0xc0, 0x27, 0xc3, 0x13, 0x94, 0x10, 0x02, |
476 | +0xe0, 0x7c, 0x73, 0x40, 0x00, 0x88, 0x1b, 0xc8, 0xe0, 0xf4, 0xff, 0x40, 0x00, | 474 | + 0x08, 0xec, 0x1c, 0xe4, 0x23, 0x52, 0x18, 0xf8, 0x1b, 0x12, 0x04, 0xf8, |
477 | +0x68, 0x39, 0x80, 0xe0, 0xa4, 0xa4, 0x40, 0x00, 0xa8, 0x16, 0xb0, 0xe0, 0x50, | 475 | + 0x03, 0x96, 0x03, 0x52, 0x28, 0xe0, 0x1c, 0xe6, 0x0a, 0xa6, 0x1a, 0xe4, |
478 | +0xc9, 0x40, 0x00, 0x28, 0x3a, 0x98, 0xe0, 0x00, 0xb9, 0x00, 0x00, 0xb6, 0x85, | 476 | + 0x63, 0x96, 0x63, 0x52, 0x20, 0xe0, 0x73, 0x52, 0x10, 0xe0, 0x03, 0x52, |
479 | +0x00, 0x00, | 477 | + 0x14, 0xe0, 0x13, 0x52, 0x18, 0xe0, 0x98, 0x52, 0x74, 0xef, 0x09, 0x12, |
478 | + 0x8c, 0xe0, 0x0b, 0xa1, 0x01, 0x81, 0x01, 0x52, 0x90, 0xe0, 0x65, 0x82, | ||
479 | + 0x05, 0x12, 0x30, 0xf8, 0x09, 0x00, 0xa8, 0xe0, 0x0a, 0x00, 0x0c, 0xf8, | ||
480 | + 0x16, 0x00, 0x00, 0xc0, 0x01, 0x52, 0x90, 0xc0, 0x46, 0x41, 0x84, 0xe0, | ||
481 | + 0x0a, 0x80, 0x0a, 0x4e, 0x9c, 0xe9, 0x1a, 0x00, 0x08, 0xe0, 0x38, 0x01, | ||
482 | + 0x01, 0x20, 0x00, 0xc0, 0x0b, 0x12, 0x1c, 0xe0, 0x1b, 0x12, 0x24, 0xe0, | ||
483 | + 0x2b, 0x12, 0x28, 0xe0, 0x03, 0x52, 0x2c, 0xe0, 0x0b, 0x12, 0x20, 0xe0, | ||
484 | + 0x13, 0x52, 0x34, 0xe0, 0x23, 0x52, 0x38, 0xe0, 0x03, 0x52, 0x30, 0xe0, | ||
485 | + 0x0c, 0x00, 0x00, 0xe2, 0xf1, 0x98, 0x0c, 0x0c, 0x7c, 0xf2, 0x93, 0xdd, | ||
486 | + 0x13, 0xa9, 0x00, 0x00, 0xa8, 0xc1, 0x40, 0x00, 0x68, 0x04, 0xa0, 0xe0, | ||
487 | + 0x40, 0x6c, 0x40, 0x00, 0xe8, 0x34, 0xc8, 0xe0, 0xfc, 0x91, 0x40, 0x00, | ||
488 | + 0x68, 0x1f, 0xb8, 0xe0, 0x30, 0x16, 0x41, 0x00, 0x28, 0x39, 0x74, 0xe0, | ||
489 | + 0xb0, 0x7e, 0x40, 0x00, 0xe8, 0x38, 0xc0, 0xe0, 0x30, 0x04, 0x41, 0x00, | ||
490 | + 0x48, 0x1b, 0x80, 0xe0, 0x30, 0x2e, 0x40, 0x00, 0x88, 0x0c, 0xec, 0xe0, | ||
491 | + 0x10, 0x9f, 0x40, 0x00, 0x88, 0x08, 0xb4, 0xe0, 0x10, 0x01, 0x41, 0x00, | ||
492 | + 0x68, 0x01, 0x84, 0xe0, 0x54, 0xd6, 0x40, 0x00, 0xc8, 0x1a, 0x98, 0xe0, | ||
493 | + 0xd0, 0xc8, 0x40, 0x00, 0x68, 0x08, 0xa0, 0xe0, 0x80, 0xdb, 0x40, 0x00, | ||
494 | + 0xe8, 0x35, 0x94, 0xe0, 0x74, 0xff, 0x40, 0x00, 0xa8, 0x11, 0x80, 0xe0, | ||
495 | + 0xf8, 0x89, 0x40, 0x00, 0x88, 0x16, 0xbc, 0xe0, 0x00, 0x90, 0x40, 0x00, | ||
496 | + 0x08, 0x35, 0xb8, 0xe0, 0x7c, 0x73, 0x40, 0x00, 0x88, 0x1b, 0xc8, 0xe0, | ||
497 | + 0xf4, 0xff, 0x40, 0x00, 0x68, 0x39, 0x80, 0xe0, 0xa4, 0xa4, 0x40, 0x00, | ||
498 | + 0xa8, 0x16, 0xb0, 0xe0, 0x50, 0xc9, 0x40, 0x00, 0x28, 0x3a, 0x98, 0xe0, | ||
499 | + 0x00, 0xb9, 0x00, 0x00, 0xb6, 0x85, 0x00, 0x00, | ||
480 | +}; | 500 | +}; |
481 | + | 501 | + |
482 | +static const char * const vd55g1_tp_menu[] = { | 502 | +static const char * const vd55g1_tp_menu[] = { |
483 | + "Disabled", | 503 | + "Disabled", |
484 | + "Dgrey", | 504 | + "Dgrey", |
... | ... | ||
504 | +static const char * const vd55g1_supply_name[] = { | 524 | +static const char * const vd55g1_supply_name[] = { |
505 | + "vcore", | 525 | + "vcore", |
506 | + "vddio", | 526 | + "vddio", |
507 | + "vana", | 527 | + "vana", |
508 | +}; | 528 | +}; |
509 | + | ||
510 | +/* Will be filled on device tree parse */ | ||
511 | +static u64 link_freq[1]; | ||
512 | + | 529 | + |
513 | +enum vd55g1_hdr_mode { | 530 | +enum vd55g1_hdr_mode { |
514 | + VD55G1_NO_HDR, | 531 | + VD55G1_NO_HDR, |
515 | + VD55G1_HDR_SUB, | 532 | + VD55G1_HDR_SUB, |
516 | +}; | 533 | +}; |
... | ... | ||
599 | + u16 oif_ctrl; | 616 | + u16 oif_ctrl; |
600 | + enum vd55g1_gpio_mode gpios[VD55G1_NB_GPIOS]; | 617 | + enum vd55g1_gpio_mode gpios[VD55G1_NB_GPIOS]; |
601 | + unsigned long ext_leds_mask; | 618 | + unsigned long ext_leds_mask; |
602 | + int data_rate_in_mbps; | 619 | + int data_rate_in_mbps; |
603 | + u32 pixel_clock; | 620 | + u32 pixel_clock; |
621 | + u64 link_freq; | ||
604 | + struct v4l2_ctrl_handler ctrl_handler; | 622 | + struct v4l2_ctrl_handler ctrl_handler; |
605 | + struct v4l2_ctrl *pixel_rate_ctrl; | 623 | + struct v4l2_ctrl *pixel_rate_ctrl; |
606 | + struct v4l2_ctrl *vblank_ctrl; | 624 | + struct v4l2_ctrl *vblank_ctrl; |
607 | + struct v4l2_ctrl *hblank_ctrl; | 625 | + struct v4l2_ctrl *hblank_ctrl; |
608 | + struct { | 626 | + struct { |
... | ... | ||
628 | +} | 646 | +} |
629 | + | 647 | + |
630 | +static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) | 648 | +static inline struct v4l2_subdev *ctrl_to_sd(struct v4l2_ctrl *ctrl) |
631 | +{ | 649 | +{ |
632 | + return &container_of_const(ctrl->handler, struct vd55g1, | 650 | + return &container_of_const(ctrl->handler, struct vd55g1, |
633 | + ctrl_handler)->sd; | 651 | + ctrl_handler)->sd; |
634 | +} | 652 | +} |
635 | + | 653 | + |
636 | +static u8 get_bpp_by_code(struct vd55g1 *sensor, u32 code) | 654 | +static u8 get_bpp_by_code(struct vd55g1 *sensor, u32 code) |
637 | +{ | 655 | +{ |
638 | + struct i2c_client *client = sensor->i2c_client; | 656 | + struct i2c_client *client = sensor->i2c_client; |
... | ... | ||
641 | + for (i = 0; i < ARRAY_SIZE(vd55g1_mbus_codes); i++) { | 659 | + for (i = 0; i < ARRAY_SIZE(vd55g1_mbus_codes); i++) { |
642 | + if (vd55g1_mbus_codes[i].code == code) | 660 | + if (vd55g1_mbus_codes[i].code == code) |
643 | + return vd55g1_mbus_codes[i].bpp; | 661 | + return vd55g1_mbus_codes[i].bpp; |
644 | + } | 662 | + } |
645 | + /* Should never happen */ | 663 | + /* Should never happen */ |
646 | + dev_warn(&client->dev, "Unsupported code %d. default to 8 bpp", code); | 664 | + dev_warn(&client->dev, "Unsupported code %d. default to 8 bpp\n", code); |
647 | + return 8; | 665 | + return 8; |
648 | +} | 666 | +} |
649 | + | 667 | + |
650 | +static u8 get_data_type_by_code(struct vd55g1 *sensor, u32 code) | 668 | +static u8 get_data_type_by_code(struct vd55g1 *sensor, u32 code) |
651 | +{ | 669 | +{ |
... | ... | ||
655 | + for (i = 0; i < ARRAY_SIZE(vd55g1_mbus_codes); i++) { | 673 | + for (i = 0; i < ARRAY_SIZE(vd55g1_mbus_codes); i++) { |
656 | + if (vd55g1_mbus_codes[i].code == code) | 674 | + if (vd55g1_mbus_codes[i].code == code) |
657 | + return vd55g1_mbus_codes[i].data_type; | 675 | + return vd55g1_mbus_codes[i].data_type; |
658 | + } | 676 | + } |
659 | + /* Should never happen */ | 677 | + /* Should never happen */ |
660 | + dev_warn(&client->dev, "Unsupported code %d. default to MIPI_CSI2_DT_RAW8 data type", | 678 | + dev_warn(&client->dev, "Unsupported code %d. default to MIPI_CSI2_DT_RAW8 data type\n", |
661 | + code); | 679 | + code); |
662 | + return MIPI_CSI2_DT_RAW8; | 680 | + return MIPI_CSI2_DT_RAW8; |
663 | +} | 681 | +} |
664 | + | 682 | + |
665 | +static s32 get_pixel_rate(struct vd55g1 *sensor) | 683 | +static s32 get_pixel_rate(struct vd55g1 *sensor) |
... | ... | ||
709 | + const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0); | 727 | + const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0); |
710 | + | 728 | + |
711 | + return get_min_line_length(sensor) - crop->width; | 729 | + return get_min_line_length(sensor) - crop->width; |
712 | +} | 730 | +} |
713 | + | 731 | + |
714 | +static struct vblank_limits get_vblank_limits(struct vd55g1 *sensor) | 732 | +static void get_vblank_limits(struct vd55g1 *sensor, |
715 | +{ | 733 | + struct vblank_limits *limits) |
716 | + struct vblank_limits limits; | 734 | +{ |
717 | + struct v4l2_subdev_state *state = | 735 | + struct v4l2_subdev_state *state = |
718 | + v4l2_subdev_get_locked_active_state(&sensor->sd); | 736 | + v4l2_subdev_get_locked_active_state(&sensor->sd); |
719 | + const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0); | 737 | + const struct v4l2_rect *crop = v4l2_subdev_state_get_crop(state, 0); |
720 | + | 738 | + |
721 | + limits.min = VD55G1_VBLANK_MIN; | 739 | + limits->min = VD55G1_VBLANK_MIN; |
722 | + limits.def = VD55G1_FRAME_LENGTH_DEF - crop->height; | 740 | + limits->def = VD55G1_FRAME_LENGTH_DEF - crop->height; |
723 | + limits.max = VD55G1_VBLANK_MAX - crop->height; | 741 | + limits->max = VD55G1_VBLANK_MAX - crop->height; |
724 | + | ||
725 | + return limits; | ||
726 | +} | 742 | +} |
727 | + | 743 | + |
728 | +#define vd55g1_read(sensor, reg, val, err) \ | 744 | +#define vd55g1_read(sensor, reg, val, err) \ |
729 | + cci_read((sensor)->regmap, reg, val, err) | 745 | + cci_read((sensor)->regmap, reg, val, err) |
730 | + | 746 | + |
731 | +#define vd55g1_write(sensor, reg, val, err) \ | 747 | +#define vd55g1_write(sensor, reg, val, err) \ |
732 | + cci_write((sensor)->regmap, reg, (u64)val, err) | 748 | + cci_write((sensor)->regmap, reg, val, err) |
733 | + | 749 | + |
734 | +static int vd55g1_write_array(struct vd55g1 *sensor, u32 reg, unsigned int len, | 750 | +static int vd55g1_write_array(struct vd55g1 *sensor, u32 reg, unsigned int len, |
735 | + const u8 *array, int *err) | 751 | + const u8 *array, int *err) |
736 | +{ | 752 | +{ |
737 | + unsigned int chunk_sz = 1024; | 753 | + unsigned int chunk_sz = 1024; |
... | ... | ||
786 | + return vd55g1_poll_reg(sensor, VD55G1_REG_SYSTEM_FSM, state, err); | 802 | + return vd55g1_poll_reg(sensor, VD55G1_REG_SYSTEM_FSM, state, err); |
787 | +} | 803 | +} |
788 | + | 804 | + |
789 | +static int vd55g1_get_regulators(struct vd55g1 *sensor) | 805 | +static int vd55g1_get_regulators(struct vd55g1 *sensor) |
790 | +{ | 806 | +{ |
791 | + int i; | 807 | + unsigned int i; |
792 | + | 808 | + |
793 | + for (i = 0; i < ARRAY_SIZE(vd55g1_supply_name); i++) | 809 | + for (i = 0; i < ARRAY_SIZE(vd55g1_supply_name); i++) |
794 | + sensor->supplies[i].supply = vd55g1_supply_name[i]; | 810 | + sensor->supplies[i].supply = vd55g1_supply_name[i]; |
795 | + | 811 | + |
796 | + return devm_regulator_bulk_get(&sensor->i2c_client->dev, | 812 | + return devm_regulator_bulk_get(&sensor->i2c_client->dev, |
... | ... | ||
800 | + | 816 | + |
801 | +static int vd55g1_prepare_clock_tree(struct vd55g1 *sensor) | 817 | +static int vd55g1_prepare_clock_tree(struct vd55g1 *sensor) |
802 | +{ | 818 | +{ |
803 | + struct i2c_client *client = sensor->i2c_client; | 819 | + struct i2c_client *client = sensor->i2c_client; |
804 | + /* Double data rate */ | 820 | + /* Double data rate */ |
805 | + u32 mipi_freq = link_freq[0] * 2; | 821 | + u32 mipi_freq = sensor->link_freq * 2; |
806 | + u32 sys_clk, mipi_div, pixel_div; | 822 | + u32 sys_clk, mipi_div, pixel_div; |
807 | + int ret = 0; | ||
808 | + | 823 | + |
809 | + if (sensor->xclk_freq < 6 * HZ_PER_MHZ || | 824 | + if (sensor->xclk_freq < 6 * HZ_PER_MHZ || |
810 | + sensor->xclk_freq > 27 * HZ_PER_MHZ) { | 825 | + sensor->xclk_freq > 27 * HZ_PER_MHZ) { |
811 | + dev_err(&client->dev, | 826 | + dev_err(&client->dev, |
812 | + "Only 6Mhz-27Mhz clock range supported. Provided %lu MHz\n", | 827 | + "Only 6Mhz-27Mhz clock range supported. Provided %lu MHz\n", |
... | ... | ||
840 | + | 855 | + |
841 | + sensor->pixel_clock = sys_clk / pixel_div; | 856 | + sensor->pixel_clock = sys_clk / pixel_div; |
842 | + /* Frequency to data rate is 1:1 ratio for MIPI */ | 857 | + /* Frequency to data rate is 1:1 ratio for MIPI */ |
843 | + sensor->data_rate_in_mbps = mipi_freq; | 858 | + sensor->data_rate_in_mbps = mipi_freq; |
844 | + | 859 | + |
845 | + return ret; | 860 | + return 0; |
846 | +} | 861 | +} |
847 | + | 862 | + |
848 | +static int vd55g1_update_patgen(struct vd55g1 *sensor, u32 patgen_index) | 863 | +static int vd55g1_update_patgen(struct vd55g1 *sensor, u32 patgen_index) |
849 | +{ | 864 | +{ |
850 | + static const u8 index2val[] = { | 865 | + static const u8 index2val[] = { |
851 | + 0x0, 0x22, 0x28 | 866 | + 0x0, 0x22, 0x28 |
852 | + }; | 867 | + }; |
853 | + u32 pattern = index2val[patgen_index]; | 868 | + u32 pattern = index2val[patgen_index]; |
854 | + u32 reg = pattern << VD55G1_PATGEN_TYPE_SHIFT; | 869 | + u32 reg = pattern << VD55G1_PATGEN_TYPE_SHIFT; |
855 | + u8 darkcal = VD55G1_DARKCAL_AUTO; | ||
856 | + u8 duster = VD55G1_DUSTER_RING_ENABLE | VD55G1_DUSTER_DYN_ENABLE | | 870 | + u8 duster = VD55G1_DUSTER_RING_ENABLE | VD55G1_DUSTER_DYN_ENABLE | |
857 | + VD55G1_DUSTER_ENABLE; | 871 | + VD55G1_DUSTER_ENABLE; |
858 | + int ret = 0; | 872 | + int ret = 0; |
859 | + | 873 | + |
874 | + BUILD_BUG_ON(ARRAY_SIZE(index2val) != ARRAY_SIZE(vd55g1_tp_menu)); | ||
875 | + | ||
860 | + if (pattern != 0) { | 876 | + if (pattern != 0) { |
861 | + reg |= VD55G1_PATGEN_ENABLE; | 877 | + reg |= VD55G1_PATGEN_ENABLE; |
862 | + /* | 878 | + /* Take care of duster to not mess up the test pattern output */ |
863 | + * Take care of dark calibaration and duster to not mess up the | ||
864 | + * test pattern output. | ||
865 | + */ | ||
866 | + darkcal = VD55G1_DARKCAL_BYPASS; | ||
867 | + duster = VD55G1_DUSTER_DISABLE; | 879 | + duster = VD55G1_DUSTER_DISABLE; |
868 | + } | 880 | + } |
869 | + | 881 | + |
870 | + vd55g1_write(sensor, VD55G1_REG_DARKCAL_CTRL, darkcal, &ret); | ||
871 | + vd55g1_write(sensor, VD55G1_REG_DUSTER_CTRL, duster, &ret); | 882 | + vd55g1_write(sensor, VD55G1_REG_DUSTER_CTRL, duster, &ret); |
872 | + vd55g1_write(sensor, VD55G1_REG_PATGEN_CTRL, reg, &ret); | 883 | + vd55g1_write(sensor, VD55G1_REG_PATGEN_CTRL, reg, &ret); |
873 | + | 884 | + |
874 | + return ret; | 885 | + return ret; |
875 | +} | 886 | +} |
... | ... | ||
944 | +static int vd55g1_update_frame_length(struct vd55g1 *sensor, | 955 | +static int vd55g1_update_frame_length(struct vd55g1 *sensor, |
945 | + unsigned int frame_length) | 956 | + unsigned int frame_length) |
946 | +{ | 957 | +{ |
947 | + int ret = 0; | 958 | + int ret = 0; |
948 | + | 959 | + |
949 | + if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB) { | 960 | + if (sensor->hdr_ctrl->val == VD55G1_HDR_SUB) |
950 | + vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(1), frame_length, | 961 | + vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(1), frame_length, |
951 | + &ret); | 962 | + &ret); |
952 | + } | ||
953 | + vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(0), frame_length, &ret); | 963 | + vd55g1_write(sensor, VD55G1_REG_FRAME_LENGTH(0), frame_length, &ret); |
954 | + | 964 | + |
955 | + return ret; | 965 | + return ret; |
956 | +} | 966 | +} |
957 | + | 967 | + |
... | ... | ||
1149 | + struct v4l2_subdev_state *state, u32 pad, | 1159 | + struct v4l2_subdev_state *state, u32 pad, |
1150 | + u64 streams_mask) | 1160 | + u64 streams_mask) |
1151 | +{ | 1161 | +{ |
1152 | + struct vd55g1 *sensor = to_vd55g1(sd); | 1162 | + struct vd55g1 *sensor = to_vd55g1(sd); |
1153 | + struct i2c_client *client = v4l2_get_subdevdata(&sensor->sd); | 1163 | + struct i2c_client *client = v4l2_get_subdevdata(&sensor->sd); |
1154 | + int ret = 0; | 1164 | + int ret; |
1155 | + | 1165 | + |
1156 | + ret = pm_runtime_resume_and_get(&client->dev); | 1166 | + ret = pm_runtime_resume_and_get(&client->dev); |
1157 | + if (ret < 0) | 1167 | + if (ret < 0) |
1158 | + return ret; | 1168 | + return ret; |
1159 | + | 1169 | + |
... | ... | ||
1197 | + if (ret) | 1207 | + if (ret) |
1198 | + goto err_rpm_put; | 1208 | + goto err_rpm_put; |
1199 | + | 1209 | + |
1200 | + vd55g1_lock_ctrls(sensor, true); | 1210 | + vd55g1_lock_ctrls(sensor, true); |
1201 | + | 1211 | + |
1202 | + return ret; | 1212 | + return 0; |
1203 | + | 1213 | + |
1204 | +err_rpm_put: | 1214 | +err_rpm_put: |
1205 | + pm_runtime_put(&client->dev); | 1215 | + pm_runtime_put(&client->dev); |
1206 | + return ret; | 1216 | + return 0; |
1207 | +} | 1217 | +} |
1208 | + | 1218 | + |
1209 | +static int vd55g1_disable_streams(struct v4l2_subdev *sd, | 1219 | +static int vd55g1_disable_streams(struct v4l2_subdev *sd, |
1210 | + struct v4l2_subdev_state *state, u32 pad, | 1220 | + struct v4l2_subdev_state *state, u32 pad, |
1211 | + u64 streams_mask) | 1221 | + u64 streams_mask) |
... | ... | ||
1221 | + &ret); | 1231 | + &ret); |
1222 | + vd55g1_poll_reg(sensor, VD55G1_REG_STREAMING, 0, &ret); | 1232 | + vd55g1_poll_reg(sensor, VD55G1_REG_STREAMING, 0, &ret); |
1223 | + vd55g1_wait_state(sensor, VD55G1_SYSTEM_FSM_SW_STBY, &ret); | 1233 | + vd55g1_wait_state(sensor, VD55G1_SYSTEM_FSM_SW_STBY, &ret); |
1224 | + | 1234 | + |
1225 | + if (ret) | 1235 | + if (ret) |
1226 | + dev_warn(&client->dev, "Can't disable stream"); | 1236 | + dev_warn(&client->dev, "Can't disable stream\n"); |
1227 | + | 1237 | + |
1228 | + vd55g1_lock_ctrls(sensor, false); | 1238 | + vd55g1_lock_ctrls(sensor, false); |
1229 | + | 1239 | + |
1230 | + pm_runtime_mark_last_busy(&client->dev); | 1240 | + pm_runtime_mark_last_busy(&client->dev); |
1231 | + __pm_runtime_put_autosuspend(&client->dev); | 1241 | + pm_runtime_put_autosuspend(&client->dev); |
1232 | + | 1242 | + |
1233 | + return ret; | 1243 | + return ret; |
1234 | +} | 1244 | +} |
1235 | + | 1245 | + |
1236 | +static int vd55g1_patch(struct vd55g1 *sensor) | 1246 | +static int vd55g1_patch(struct vd55g1 *sensor) |
... | ... | ||
1242 | + vd55g1_write_array(sensor, VD55G1_REG_FWPATCH_START_ADDR, | 1252 | + vd55g1_write_array(sensor, VD55G1_REG_FWPATCH_START_ADDR, |
1243 | + sizeof(patch_array), patch_array, &ret); | 1253 | + sizeof(patch_array), patch_array, &ret); |
1244 | + vd55g1_write(sensor, VD55G1_REG_BOOT, VD55G1_BOOT_PATCH_SETUP, &ret); | 1254 | + vd55g1_write(sensor, VD55G1_REG_BOOT, VD55G1_BOOT_PATCH_SETUP, &ret); |
1245 | + vd55g1_poll_reg(sensor, VD55G1_REG_BOOT, 0, &ret); | 1255 | + vd55g1_poll_reg(sensor, VD55G1_REG_BOOT, 0, &ret); |
1246 | + if (ret) { | 1256 | + if (ret) { |
1247 | + dev_err(&client->dev, "Failed to apply patch"); | 1257 | + dev_err(&client->dev, "Failed to apply patch\n"); |
1248 | + return ret; | 1258 | + return ret; |
1249 | + } | 1259 | + } |
1250 | + | 1260 | + |
1251 | + vd55g1_read(sensor, VD55G1_REG_FWPATCH_REVISION, &patch, &ret); | 1261 | + vd55g1_read(sensor, VD55G1_REG_FWPATCH_REVISION, &patch, &ret); |
1252 | + if (patch != (VD55G1_FWPATCH_REVISION_MAJOR << 8) + | 1262 | + if (patch != (VD55G1_FWPATCH_REVISION_MAJOR << 8) + |
1253 | + VD55G1_FWPATCH_REVISION_MINOR) { | 1263 | + VD55G1_FWPATCH_REVISION_MINOR) { |
1254 | + dev_err(&client->dev, "Bad patch version expected %d.%d got %d.%d", | 1264 | + dev_err(&client->dev, "Bad patch version expected %d.%d got %d.%d\n", |
1255 | + VD55G1_FWPATCH_REVISION_MAJOR, | 1265 | + VD55G1_FWPATCH_REVISION_MAJOR, |
1256 | + VD55G1_FWPATCH_REVISION_MINOR, | 1266 | + VD55G1_FWPATCH_REVISION_MINOR, |
1257 | + (u8)(patch >> 8), (u8)(patch & 0xff)); | 1267 | + (u8)(patch >> 8), (u8)(patch & 0xff)); |
1258 | + return -ENODEV; | 1268 | + return -ENODEV; |
1259 | + } | 1269 | + } |
1260 | + dev_dbg(&client->dev, "patch %d.%d applied", | 1270 | + dev_dbg(&client->dev, "patch %d.%d applied\n", |
1261 | + (u8)(patch >> 8), (u8)(patch & 0xff)); | 1271 | + (u8)(patch >> 8), (u8)(patch & 0xff)); |
1262 | + | 1272 | + |
1263 | + return 0; | 1273 | + return 0; |
1264 | +} | 1274 | +} |
1265 | + | 1275 | + |
... | ... | ||
1308 | + unsigned int frame_length = 0; | 1318 | + unsigned int frame_length = 0; |
1309 | + unsigned int expo_max; | 1319 | + unsigned int expo_max; |
1310 | + int ret; | 1320 | + int ret; |
1311 | + | 1321 | + |
1312 | + /* Reset vblank and frame length to default */ | 1322 | + /* Reset vblank and frame length to default */ |
1313 | + vblank = get_vblank_limits(sensor); | 1323 | + get_vblank_limits(sensor, &vblank); |
1314 | + ret = __v4l2_ctrl_modify_range(sensor->vblank_ctrl, vblank.min, | 1324 | + ret = __v4l2_ctrl_modify_range(sensor->vblank_ctrl, vblank.min, |
1315 | + vblank.max, 1, vblank.def); | 1325 | + vblank.max, 1, vblank.def); |
1316 | + if (ret) | 1326 | + if (ret) |
1317 | + return ret; | 1327 | + return ret; |
1318 | + | 1328 | + |
... | ... | ||
1383 | + struct v4l2_subdev_state *sd_state) | 1393 | + struct v4l2_subdev_state *sd_state) |
1384 | +{ | 1394 | +{ |
1385 | + unsigned int def_mode = VD55G1_DEFAULT_MODE; | 1395 | + unsigned int def_mode = VD55G1_DEFAULT_MODE; |
1386 | + struct vd55g1 *sensor = to_vd55g1(sd); | 1396 | + struct vd55g1 *sensor = to_vd55g1(sd); |
1387 | + struct v4l2_subdev_format fmt = { 0 }; | 1397 | + struct v4l2_subdev_format fmt = { 0 }; |
1388 | + struct v4l2_subdev_route routes[] = { 0 }; | 1398 | + struct v4l2_subdev_route routes[] = { |
1399 | + { .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE } | ||
1400 | + }; | ||
1389 | + struct v4l2_subdev_krouting routing = { | 1401 | + struct v4l2_subdev_krouting routing = { |
1390 | + .num_routes = ARRAY_SIZE(routes), | 1402 | + .num_routes = ARRAY_SIZE(routes), |
1391 | + .routes = routes, | 1403 | + .routes = routes, |
1392 | + }; | 1404 | + }; |
1393 | + int ret; | 1405 | + int ret; |
1394 | + | 1406 | + |
1395 | + /* Needed by v4l2_subdev_s_stream_helper(), even with 1 stream only */ | 1407 | + /* Needed by v4l2_subdev_s_stream_helper(), even with 1 stream only */ |
1396 | + routes[0].flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE; | ||
1397 | + ret = v4l2_subdev_set_routing(sd, sd_state, &routing); | 1408 | + ret = v4l2_subdev_set_routing(sd, sd_state, &routing); |
1398 | + if (ret) | 1409 | + if (ret) |
1399 | + return ret; | 1410 | + return ret; |
1400 | + | 1411 | + |
1401 | + vd55g1_update_img_pad_format(sensor, &vd55g1_supported_modes[def_mode], | 1412 | + vd55g1_update_img_pad_format(sensor, &vd55g1_supported_modes[def_mode], |
... | ... | ||
1604 | + sensor->patgen_ctrl = | 1615 | + sensor->patgen_ctrl = |
1605 | + v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN, | 1616 | + v4l2_ctrl_new_std_menu_items(hdl, ops, V4L2_CID_TEST_PATTERN, |
1606 | + ARRAY_SIZE(vd55g1_tp_menu) - 1, 0, | 1617 | + ARRAY_SIZE(vd55g1_tp_menu) - 1, 0, |
1607 | + 0, vd55g1_tp_menu); | 1618 | + 0, vd55g1_tp_menu); |
1608 | + ctrl = v4l2_ctrl_new_int_menu(hdl, ops, V4L2_CID_LINK_FREQ, | 1619 | + ctrl = v4l2_ctrl_new_int_menu(hdl, ops, V4L2_CID_LINK_FREQ, |
1609 | + ARRAY_SIZE(link_freq) - 1, 0, link_freq); | 1620 | + 0, 0, &sensor->link_freq); |
1610 | + if (ctrl) | 1621 | + if (ctrl) |
1611 | + ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; | 1622 | + ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; |
1612 | + sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops, | 1623 | + sensor->pixel_rate_ctrl = v4l2_ctrl_new_std(hdl, ops, |
1613 | + V4L2_CID_PIXEL_RATE, 1, | 1624 | + V4L2_CID_PIXEL_RATE, 1, |
1614 | + INT_MAX, 1, | 1625 | + INT_MAX, 1, |
... | ... | ||
1631 | + hblank = get_hblank_min(sensor); | 1642 | + hblank = get_hblank_min(sensor); |
1632 | + sensor->hblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HBLANK, | 1643 | + sensor->hblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_HBLANK, |
1633 | + hblank, hblank, 1, hblank); | 1644 | + hblank, hblank, 1, hblank); |
1634 | + if (sensor->hblank_ctrl) | 1645 | + if (sensor->hblank_ctrl) |
1635 | + sensor->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; | 1646 | + sensor->hblank_ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY; |
1636 | + vblank = get_vblank_limits(sensor); | 1647 | + get_vblank_limits(sensor, &vblank); |
1637 | + sensor->vblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK, | 1648 | + sensor->vblank_ctrl = v4l2_ctrl_new_std(hdl, ops, V4L2_CID_VBLANK, |
1638 | + vblank.min, vblank.max, | 1649 | + vblank.min, vblank.max, |
1639 | + 1, vblank.def); | 1650 | + 1, vblank.def); |
1640 | + | 1651 | + |
1641 | + /* Additional controls based on device tree properties */ | 1652 | + /* Additional controls based on device tree properties */ |
... | ... | ||
1645 | + V4L2_CID_FLASH_LED_MODE, | 1656 | + V4L2_CID_FLASH_LED_MODE, |
1646 | + V4L2_FLASH_LED_MODE_FLASH, 0, | 1657 | + V4L2_FLASH_LED_MODE_FLASH, 0, |
1647 | + V4L2_FLASH_LED_MODE_NONE); | 1658 | + V4L2_FLASH_LED_MODE_NONE); |
1648 | + } | 1659 | + } |
1649 | + | 1660 | + |
1650 | + if (hdl->error) { | ||
1651 | + ret = hdl->error; | ||
1652 | + goto free_ctrls; | ||
1653 | + } | ||
1654 | + | ||
1655 | + ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &fwnode_props); | 1661 | + ret = v4l2_fwnode_device_parse(&sensor->i2c_client->dev, &fwnode_props); |
1656 | + if (ret) | 1662 | + if (ret) |
1657 | + goto free_ctrls; | 1663 | + goto free_ctrls; |
1658 | + | 1664 | + |
1659 | + ret = v4l2_ctrl_new_fwnode_properties(hdl, ops, &fwnode_props); | 1665 | + ret = v4l2_ctrl_new_fwnode_properties(hdl, ops, &fwnode_props); |
... | ... | ||
1696 | + ret = vd55g1_read(sensor, VD55G1_REG_MODEL_ID, &id, NULL); | 1702 | + ret = vd55g1_read(sensor, VD55G1_REG_MODEL_ID, &id, NULL); |
1697 | + if (ret) | 1703 | + if (ret) |
1698 | + return ret; | 1704 | + return ret; |
1699 | + | 1705 | + |
1700 | + if (id != VD55G1_MODEL_ID) { | 1706 | + if (id != VD55G1_MODEL_ID) { |
1701 | + dev_warn(&client->dev, "Unsupported sensor id %x", (u32)id); | 1707 | + dev_warn(&client->dev, "Unsupported sensor id %x\n", (u32)id); |
1702 | + return -ENODEV; | 1708 | + return -ENODEV; |
1703 | + } | 1709 | + } |
1704 | + | 1710 | + |
1705 | + return vd55g1_check_sensor_revision(sensor); | 1711 | + return vd55g1_check_sensor_revision(sensor); |
1706 | +} | 1712 | +} |
... | ... | ||
1712 | + int ret; | 1718 | + int ret; |
1713 | + | 1719 | + |
1714 | + ret = regulator_bulk_enable(ARRAY_SIZE(vd55g1_supply_name), | 1720 | + ret = regulator_bulk_enable(ARRAY_SIZE(vd55g1_supply_name), |
1715 | + sensor->supplies); | 1721 | + sensor->supplies); |
1716 | + if (ret) { | 1722 | + if (ret) { |
1717 | + dev_err(dev, "Failed to enable regulators %d", ret); | 1723 | + dev_err(dev, "Failed to enable regulators %d\n", ret); |
1718 | + return ret; | 1724 | + return ret; |
1719 | + } | 1725 | + } |
1720 | + | 1726 | + |
1721 | + ret = clk_prepare_enable(sensor->xclk); | 1727 | + ret = clk_prepare_enable(sensor->xclk); |
1722 | + if (ret) { | 1728 | + if (ret) { |
1723 | + dev_err(dev, "Failed to enable clock %d", ret); | 1729 | + dev_err(dev, "Failed to enable clock %d\n", ret); |
1724 | + goto disable_bulk; | 1730 | + goto disable_bulk; |
1725 | + } | 1731 | + } |
1726 | + | 1732 | + |
1727 | + gpiod_set_value_cansleep(sensor->reset_gpio, 0); | 1733 | + gpiod_set_value_cansleep(sensor->reset_gpio, 0); |
1728 | + usleep_range(5000, 10000); | 1734 | + usleep_range(5000, 10000); |
... | ... | ||
1732 | + goto disable_clock; | 1738 | + goto disable_clock; |
1733 | + } | 1739 | + } |
1734 | + | 1740 | + |
1735 | + ret = vd55g1_detect(sensor); | 1741 | + ret = vd55g1_detect(sensor); |
1736 | + if (ret) { | 1742 | + if (ret) { |
1737 | + dev_err(dev, "Sensor detect failed %d", ret); | 1743 | + dev_err(dev, "Sensor detect failed %d\n", ret); |
1738 | + goto disable_clock; | 1744 | + goto disable_clock; |
1739 | + } | 1745 | + } |
1740 | + | 1746 | + |
1741 | + ret = vd55g1_patch(sensor); | 1747 | + ret = vd55g1_patch(sensor); |
1742 | + if (ret) { | 1748 | + if (ret) { |
1743 | + dev_err(dev, "Sensor patch failed %d", ret); | 1749 | + dev_err(dev, "Sensor patch failed %d\n", ret); |
1744 | + goto disable_clock; | 1750 | + goto disable_clock; |
1745 | + } | 1751 | + } |
1746 | + | 1752 | + |
1747 | + ret = vd55g1_wait_state(sensor, VD55G1_SYSTEM_FSM_SW_STBY, NULL); | 1753 | + ret = vd55g1_wait_state(sensor, VD55G1_SYSTEM_FSM_SW_STBY, NULL); |
1748 | + if (ret) { | 1754 | + if (ret) { |
1749 | + dev_err(dev, "Sensor waiting after patch failed %d", | 1755 | + dev_err(dev, "Sensor waiting after patch failed %d\n", |
1750 | + ret); | 1756 | + ret); |
1751 | + goto disable_clock; | 1757 | + goto disable_clock; |
1752 | + } | 1758 | + } |
1753 | + | 1759 | + |
1754 | + return 0; | 1760 | + return 0; |
... | ... | ||
1778 | + struct fwnode_handle *endpoint) | 1784 | + struct fwnode_handle *endpoint) |
1779 | +{ | 1785 | +{ |
1780 | + struct i2c_client *client = sensor->i2c_client; | 1786 | + struct i2c_client *client = sensor->i2c_client; |
1781 | + struct v4l2_fwnode_endpoint ep = { .bus_type = V4L2_MBUS_CSI2_DPHY }; | 1787 | + struct v4l2_fwnode_endpoint ep = { .bus_type = V4L2_MBUS_CSI2_DPHY }; |
1782 | + u8 n_lanes; | 1788 | + u8 n_lanes; |
1783 | + int ret = 0; | 1789 | + int ret; |
1784 | + | 1790 | + |
1785 | + ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, &ep); | 1791 | + ret = v4l2_fwnode_endpoint_alloc_parse(endpoint, &ep); |
1786 | + if (ret) | 1792 | + if (ret) |
1787 | + return -EINVAL; | 1793 | + return -EINVAL; |
1788 | + | 1794 | + |
... | ... | ||
1815 | + if (ep.nr_of_link_frequencies != 1) { | 1821 | + if (ep.nr_of_link_frequencies != 1) { |
1816 | + dev_err(&client->dev, "Multiple link frequencies not supported\n"); | 1822 | + dev_err(&client->dev, "Multiple link frequencies not supported\n"); |
1817 | + ret = -EINVAL; | 1823 | + ret = -EINVAL; |
1818 | + goto done; | 1824 | + goto done; |
1819 | + } | 1825 | + } |
1820 | + link_freq[0] = ep.link_frequencies[0]; | 1826 | + sensor->link_freq = ep.link_frequencies[0]; |
1821 | + | 1827 | + |
1822 | +done: | 1828 | +done: |
1823 | + v4l2_fwnode_endpoint_free(&ep); | 1829 | + v4l2_fwnode_endpoint_free(&ep); |
1824 | + | 1830 | + |
1825 | + return ret; | 1831 | + return ret; |
1826 | +} | 1832 | +} |
1827 | + | 1833 | + |
1828 | +static int vd55g1_parse_dt_gpios_array(struct vd55g1 *sensor, | 1834 | +static int vd55g1_parse_dt_gpios_array(struct vd55g1 *sensor, |
1829 | + char *prop_name, u32 *array, int *nb) | 1835 | + char *prop_name, u32 *array, int *nb) |
1830 | +{ | 1836 | +{ |
1831 | + struct i2c_client *client = sensor->i2c_client; | 1837 | + struct i2c_client *client = sensor->i2c_client; |
1832 | + struct device_node *np = client->dev.of_node; | 1838 | + struct device *dev = &client->dev; |
1833 | + unsigned int i; | 1839 | + unsigned int i; |
1834 | + | 1840 | + int ret; |
1835 | + *nb = of_property_read_variable_u32_array(np, prop_name, array, 0, | 1841 | + |
1836 | + VD55G1_NB_GPIOS); | 1842 | + *nb = device_property_count_u32(dev, prop_name); |
1837 | + if (*nb == -EINVAL) { | 1843 | + if (*nb == -EINVAL) { |
1838 | + /* Property not found */ | 1844 | + /* Property not found */ |
1839 | + *nb = 0; | 1845 | + *nb = 0; |
1840 | + return 0; | 1846 | + return 0; |
1841 | + } else if (*nb < 0) { | 1847 | + } |
1848 | + | ||
1849 | + ret = device_property_read_u32_array(dev, prop_name, array, *nb); | ||
1850 | + if (ret) { | ||
1842 | + dev_err(&client->dev, "Failed to read %s prop\n", prop_name); | 1851 | + dev_err(&client->dev, "Failed to read %s prop\n", prop_name); |
1843 | + return *nb; | 1852 | + return ret; |
1844 | + } | 1853 | + } |
1845 | + | ||
1846 | + for (i = 0; i < *nb; i++) { | 1854 | + for (i = 0; i < *nb; i++) { |
1847 | + if (array[i] >= VD55G1_NB_GPIOS) { | 1855 | + if (array[i] >= VD55G1_NB_GPIOS) { |
1848 | + dev_err(&client->dev, "Invalid GPIO number %d\n", | 1856 | + dev_err(&client->dev, "Invalid GPIO number %d\n", |
1849 | + array[i]); | 1857 | + array[i]); |
1850 | + return -EINVAL; | 1858 | + return -EINVAL; |
... | ... | ||
1913 | + /* Init source pad */ | 1921 | + /* Init source pad */ |
1914 | + sensor->pad.flags = MEDIA_PAD_FL_SOURCE; | 1922 | + sensor->pad.flags = MEDIA_PAD_FL_SOURCE; |
1915 | + sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; | 1923 | + sensor->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; |
1916 | + ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); | 1924 | + ret = media_entity_pads_init(&sensor->sd.entity, 1, &sensor->pad); |
1917 | + if (ret) { | 1925 | + if (ret) { |
1918 | + dev_err(&client->dev, "Failed to init media entity : %d", ret); | 1926 | + dev_err(&client->dev, "Failed to init media entity: %d\n", |
1927 | + ret); | ||
1919 | + return ret; | 1928 | + return ret; |
1920 | + } | 1929 | + } |
1921 | + | 1930 | + |
1922 | + sensor->sd.state_lock = sensor->ctrl_handler.lock; | 1931 | + sensor->sd.state_lock = sensor->ctrl_handler.lock; |
1923 | + ret = v4l2_subdev_init_finalize(&sensor->sd); | 1932 | + ret = v4l2_subdev_init_finalize(&sensor->sd); |
1924 | + if (ret) { | 1933 | + if (ret) { |
1925 | + dev_err(&client->dev, "Subdev init error: %d", ret); | 1934 | + dev_err(&client->dev, "Subdev init error: %d\n", ret); |
1926 | + goto err_ctrls; | 1935 | + goto err_ctrls; |
1927 | + } | 1936 | + } |
1928 | + | 1937 | + |
1929 | + /* | 1938 | + /* |
1930 | + * Initiliaze controls after v4l2_subdev_init_finalize() to make sure | 1939 | + * Initialize controls after v4l2_subdev_init_finalize() to make sure |
1931 | + * default values are set. | 1940 | + * default values are set. |
1932 | + */ | 1941 | + */ |
1933 | + ret = vd55g1_init_ctrls(sensor); | 1942 | + ret = vd55g1_init_ctrls(sensor); |
1934 | + if (ret) { | 1943 | + if (ret) { |
1935 | + dev_err(&client->dev, "Controls initialization failed %d", ret); | 1944 | + dev_err(&client->dev, "Controls initialization failed %d\n", |
1945 | + ret); | ||
1936 | + goto err_media; | 1946 | + goto err_media; |
1937 | + } | 1947 | + } |
1938 | + | 1948 | + |
1939 | + return ret; | 1949 | + return 0; |
1940 | + | 1950 | + |
1941 | +err_ctrls: | 1951 | +err_ctrls: |
1942 | + v4l2_ctrl_handler_free(sensor->sd.ctrl_handler); | 1952 | + v4l2_ctrl_handler_free(sensor->sd.ctrl_handler); |
1943 | + | 1953 | + |
1944 | +err_media: | 1954 | +err_media: |
... | ... | ||
1967 | + v4l2_i2c_subdev_init(&sensor->sd, client, &vd55g1_subdev_ops); | 1977 | + v4l2_i2c_subdev_init(&sensor->sd, client, &vd55g1_subdev_ops); |
1968 | + sensor->i2c_client = client; | 1978 | + sensor->i2c_client = client; |
1969 | + | 1979 | + |
1970 | + ret = vd55g1_parse_dt(sensor); | 1980 | + ret = vd55g1_parse_dt(sensor); |
1971 | + if (ret) | 1981 | + if (ret) |
1972 | + return dev_err_probe(dev, ret, "Failed to parse Device Tree."); | 1982 | + return dev_err_probe(dev, ret, "Failed to parse Device Tree\n"); |
1973 | + | 1983 | + |
1974 | + /* Get (and check) resources : power regs, ext clock, reset gpio */ | 1984 | + /* Get (and check) resources : power regs, ext clock, reset gpio */ |
1975 | + ret = vd55g1_get_regulators(sensor); | 1985 | + ret = vd55g1_get_regulators(sensor); |
1976 | + if (ret) | 1986 | + if (ret) |
1977 | + return dev_err_probe(dev, ret, "Failed to get regulators."); | 1987 | + return dev_err_probe(dev, ret, "Failed to get regulators\n"); |
1978 | + | 1988 | + |
1979 | + sensor->xclk = devm_clk_get(dev, NULL); | 1989 | + sensor->xclk = devm_clk_get(dev, NULL); |
1980 | + if (IS_ERR(sensor->xclk)) | 1990 | + if (IS_ERR(sensor->xclk)) |
1981 | + return dev_err_probe(dev, PTR_ERR(sensor->xclk), | 1991 | + return dev_err_probe(dev, PTR_ERR(sensor->xclk), |
1982 | + "Failed to get xclk."); | 1992 | + "Failed to get xclk\n"); |
1983 | + | 1993 | + |
1984 | + sensor->xclk_freq = clk_get_rate(sensor->xclk); | 1994 | + sensor->xclk_freq = clk_get_rate(sensor->xclk); |
1985 | + ret = vd55g1_prepare_clock_tree(sensor); | 1995 | + ret = vd55g1_prepare_clock_tree(sensor); |
1986 | + if (ret) | 1996 | + if (ret) |
1987 | + return ret; | 1997 | + return ret; |
1988 | + | 1998 | + |
1989 | + sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", | 1999 | + sensor->reset_gpio = devm_gpiod_get_optional(dev, "reset", |
1990 | + GPIOD_OUT_HIGH); | 2000 | + GPIOD_OUT_HIGH); |
1991 | + if (IS_ERR(sensor->reset_gpio)) | 2001 | + if (IS_ERR(sensor->reset_gpio)) |
1992 | + return dev_err_probe(dev, PTR_ERR(sensor->reset_gpio), | 2002 | + return dev_err_probe(dev, PTR_ERR(sensor->reset_gpio), |
1993 | + "Failed to get reset gpio."); | 2003 | + "Failed to get reset gpio\n"); |
1994 | + | 2004 | + |
1995 | + sensor->regmap = devm_cci_regmap_init_i2c(client, 16); | 2005 | + sensor->regmap = devm_cci_regmap_init_i2c(client, 16); |
1996 | + if (IS_ERR(sensor->regmap)) | 2006 | + if (IS_ERR(sensor->regmap)) |
1997 | + return dev_err_probe(dev, PTR_ERR(sensor->regmap), | 2007 | + return dev_err_probe(dev, PTR_ERR(sensor->regmap), |
1998 | + "Failed to init regmap."); | 2008 | + "Failed to init regmap\n"); |
1999 | + | 2009 | + |
2000 | + /* Detect if sensor is present and if its revision is supported */ | 2010 | + /* Detect if sensor is present and if its revision is supported */ |
2001 | + ret = vd55g1_power_on(dev); | 2011 | + ret = vd55g1_power_on(dev); |
2002 | + if (ret) | 2012 | + if (ret) |
2003 | + return ret; | 2013 | + return ret; |
2004 | + | ||
2005 | + ret = vd55g1_subdev_init(sensor); | ||
2006 | + if (ret) { | ||
2007 | + dev_err(dev, "V4l2 init failed : %d", ret); | ||
2008 | + goto err_power_off; | ||
2009 | + } | ||
2010 | + | ||
2011 | + ret = v4l2_async_register_subdev(&sensor->sd); | ||
2012 | + if (ret) { | ||
2013 | + dev_err(dev, "async subdev register failed %d", ret); | ||
2014 | + goto err_subdev; | ||
2015 | + } | ||
2016 | + | 2014 | + |
2017 | + /* Enable pm_runtime and power off the sensor */ | 2015 | + /* Enable pm_runtime and power off the sensor */ |
2018 | + pm_runtime_set_active(dev); | 2016 | + pm_runtime_set_active(dev); |
2019 | + pm_runtime_get_noresume(dev); | 2017 | + pm_runtime_get_noresume(dev); |
2020 | + pm_runtime_enable(dev); | 2018 | + pm_runtime_enable(dev); |
2021 | + pm_runtime_set_autosuspend_delay(dev, 4000); | 2019 | + pm_runtime_set_autosuspend_delay(dev, 4000); |
2022 | + pm_runtime_use_autosuspend(dev); | 2020 | + pm_runtime_use_autosuspend(dev); |
2023 | + pm_runtime_mark_last_busy(dev); | 2021 | + pm_runtime_mark_last_busy(dev); |
2024 | + | 2022 | + |
2023 | + ret = vd55g1_subdev_init(sensor); | ||
2024 | + if (ret) { | ||
2025 | + dev_err(dev, "V4l2 init failed: %d\n", ret); | ||
2026 | + goto err_power_off; | ||
2027 | + } | ||
2028 | + | ||
2029 | + ret = v4l2_async_register_subdev(&sensor->sd); | ||
2030 | + if (ret) { | ||
2031 | + dev_err(dev, "async subdev register failed %d\n", ret); | ||
2032 | + goto err_subdev; | ||
2033 | + } | ||
2034 | + | ||
2025 | + return 0; | 2035 | + return 0; |
2026 | + | 2036 | + |
2027 | +err_subdev: | 2037 | +err_subdev: |
2028 | + vd55g1_subdev_cleanup(sensor); | 2038 | + vd55g1_subdev_cleanup(sensor); |
2029 | +err_power_off: | 2039 | +err_power_off: |
2040 | + pm_runtime_disable(dev); | ||
2041 | + pm_runtime_put_noidle(dev); | ||
2030 | + vd55g1_power_off(dev); | 2042 | + vd55g1_power_off(dev); |
2031 | + | 2043 | + |
2032 | + return ret; | 2044 | + return ret; |
2033 | +} | 2045 | +} |
2034 | + | 2046 | + |
... | ... | ||
2041 | + | 2053 | + |
2042 | + pm_runtime_disable(&client->dev); | 2054 | + pm_runtime_disable(&client->dev); |
2043 | + if (!pm_runtime_status_suspended(&client->dev)) | 2055 | + if (!pm_runtime_status_suspended(&client->dev)) |
2044 | + vd55g1_power_off(&client->dev); | 2056 | + vd55g1_power_off(&client->dev); |
2045 | + pm_runtime_set_suspended(&client->dev); | 2057 | + pm_runtime_set_suspended(&client->dev); |
2058 | + pm_runtime_dont_use_autosuspend(&client->dev); | ||
2046 | +} | 2059 | +} |
2047 | + | 2060 | + |
2048 | +static const struct of_device_id vd55g1_dt_ids[] = { | 2061 | +static const struct of_device_id vd55g1_dt_ids[] = { |
2049 | + { .compatible = "st,vd55g1" }, | 2062 | + { .compatible = "st,vd55g1" }, |
2050 | + { /* sentinel */ } | 2063 | + { /* sentinel */ } |
... | ... | diff view generated by jsdifflib |