1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21#include "mxl111sf-gpio.h"
22#include "mxl111sf-i2c.h"
23#include "mxl111sf.h"
24
25
26
27#define MXL_GPIO_MUX_REG_0 0x84
28#define MXL_GPIO_MUX_REG_1 0x89
29#define MXL_GPIO_MUX_REG_2 0x82
30
31#define MXL_GPIO_DIR_INPUT 0
32#define MXL_GPIO_DIR_OUTPUT 1
33
34
35static int mxl111sf_set_gpo_state(struct mxl111sf_state *state, u8 pin, u8 val)
36{
37 int ret;
38 u8 tmp;
39
40 mxl_debug_adv("(%d, %d)", pin, val);
41
42 if ((pin > 0) && (pin < 8)) {
43 ret = mxl111sf_read_reg(state, 0x19, &tmp);
44 if (mxl_fail(ret))
45 goto fail;
46 tmp &= ~(1 << (pin - 1));
47 tmp |= (val << (pin - 1));
48 ret = mxl111sf_write_reg(state, 0x19, tmp);
49 if (mxl_fail(ret))
50 goto fail;
51 } else if (pin <= 10) {
52 if (pin == 0)
53 pin += 7;
54 ret = mxl111sf_read_reg(state, 0x30, &tmp);
55 if (mxl_fail(ret))
56 goto fail;
57 tmp &= ~(1 << (pin - 3));
58 tmp |= (val << (pin - 3));
59 ret = mxl111sf_write_reg(state, 0x30, tmp);
60 if (mxl_fail(ret))
61 goto fail;
62 } else
63 ret = -EINVAL;
64fail:
65 return ret;
66}
67
68static int mxl111sf_get_gpi_state(struct mxl111sf_state *state, u8 pin, u8 *val)
69{
70 int ret;
71 u8 tmp;
72
73 mxl_debug("(0x%02x)", pin);
74
75 *val = 0;
76
77 switch (pin) {
78 case 0:
79 case 1:
80 case 2:
81 case 3:
82 ret = mxl111sf_read_reg(state, 0x23, &tmp);
83 if (mxl_fail(ret))
84 goto fail;
85 *val = (tmp >> (pin + 4)) & 0x01;
86 break;
87 case 4:
88 case 5:
89 case 6:
90 case 7:
91 ret = mxl111sf_read_reg(state, 0x2f, &tmp);
92 if (mxl_fail(ret))
93 goto fail;
94 *val = (tmp >> pin) & 0x01;
95 break;
96 case 8:
97 case 9:
98 case 10:
99 ret = mxl111sf_read_reg(state, 0x22, &tmp);
100 if (mxl_fail(ret))
101 goto fail;
102 *val = (tmp >> (pin - 3)) & 0x01;
103 break;
104 default:
105 return -EINVAL;
106 }
107fail:
108 return ret;
109}
110
111struct mxl_gpio_cfg {
112 u8 pin;
113 u8 dir;
114 u8 val;
115};
116
117static int mxl111sf_config_gpio_pins(struct mxl111sf_state *state,
118 struct mxl_gpio_cfg *gpio_cfg)
119{
120 int ret;
121 u8 tmp;
122
123 mxl_debug_adv("(%d, %d)", gpio_cfg->pin, gpio_cfg->dir);
124
125 switch (gpio_cfg->pin) {
126 case 0:
127 case 1:
128 case 2:
129 case 3:
130 ret = mxl111sf_read_reg(state, MXL_GPIO_MUX_REG_0, &tmp);
131 if (mxl_fail(ret))
132 goto fail;
133 tmp &= ~(1 << (gpio_cfg->pin + 4));
134 tmp |= (gpio_cfg->dir << (gpio_cfg->pin + 4));
135 ret = mxl111sf_write_reg(state, MXL_GPIO_MUX_REG_0, tmp);
136 if (mxl_fail(ret))
137 goto fail;
138 break;
139 case 4:
140 case 5:
141 case 6:
142 case 7:
143 ret = mxl111sf_read_reg(state, MXL_GPIO_MUX_REG_1, &tmp);
144 if (mxl_fail(ret))
145 goto fail;
146 tmp &= ~(1 << gpio_cfg->pin);
147 tmp |= (gpio_cfg->dir << gpio_cfg->pin);
148 ret = mxl111sf_write_reg(state, MXL_GPIO_MUX_REG_1, tmp);
149 if (mxl_fail(ret))
150 goto fail;
151 break;
152 case 8:
153 case 9:
154 case 10:
155 ret = mxl111sf_read_reg(state, MXL_GPIO_MUX_REG_2, &tmp);
156 if (mxl_fail(ret))
157 goto fail;
158 tmp &= ~(1 << (gpio_cfg->pin - 3));
159 tmp |= (gpio_cfg->dir << (gpio_cfg->pin - 3));
160 ret = mxl111sf_write_reg(state, MXL_GPIO_MUX_REG_2, tmp);
161 if (mxl_fail(ret))
162 goto fail;
163 break;
164 default:
165 return -EINVAL;
166 }
167
168 ret = (MXL_GPIO_DIR_OUTPUT == gpio_cfg->dir) ?
169 mxl111sf_set_gpo_state(state,
170 gpio_cfg->pin, gpio_cfg->val) :
171 mxl111sf_get_gpi_state(state,
172 gpio_cfg->pin, &gpio_cfg->val);
173 mxl_fail(ret);
174fail:
175 return ret;
176}
177
178static int mxl111sf_hw_do_set_gpio(struct mxl111sf_state *state,
179 int gpio, int direction, int val)
180{
181 struct mxl_gpio_cfg gpio_config = {
182 .pin = gpio,
183 .dir = direction,
184 .val = val,
185 };
186
187 mxl_debug("(%d, %d, %d)", gpio, direction, val);
188
189 return mxl111sf_config_gpio_pins(state, &gpio_config);
190}
191
192
193
194#define PIN_MUX_MPEG_MODE_MASK 0x40
195#define PIN_MUX_MPEG_PAR_EN_MASK 0x01
196#define PIN_MUX_MPEG_SER_EN_MASK 0x02
197#define PIN_MUX_MPG_IN_MUX_MASK 0x80
198#define PIN_MUX_BT656_ENABLE_MASK 0x04
199#define PIN_MUX_I2S_ENABLE_MASK 0x40
200#define PIN_MUX_SPI_MODE_MASK 0x10
201#define PIN_MUX_MCLK_EN_CTRL_MASK 0x10
202#define PIN_MUX_MPSYN_EN_CTRL_MASK 0x20
203#define PIN_MUX_MDVAL_EN_CTRL_MASK 0x40
204#define PIN_MUX_MPERR_EN_CTRL_MASK 0x80
205#define PIN_MUX_MDAT_EN_0_MASK 0x10
206#define PIN_MUX_MDAT_EN_1_MASK 0x20
207#define PIN_MUX_MDAT_EN_2_MASK 0x40
208#define PIN_MUX_MDAT_EN_3_MASK 0x80
209#define PIN_MUX_MDAT_EN_4_MASK 0x10
210#define PIN_MUX_MDAT_EN_5_MASK 0x20
211#define PIN_MUX_MDAT_EN_6_MASK 0x40
212#define PIN_MUX_MDAT_EN_7_MASK 0x80
213
214int mxl111sf_config_pin_mux_modes(struct mxl111sf_state *state,
215 enum mxl111sf_mux_config pin_mux_config)
216{
217 u8 r12, r15, r17, r18, r3D, r82, r84, r89;
218 int ret;
219
220 mxl_debug("(%d)", pin_mux_config);
221
222 ret = mxl111sf_read_reg(state, 0x17, &r17);
223 if (mxl_fail(ret))
224 goto fail;
225 ret = mxl111sf_read_reg(state, 0x18, &r18);
226 if (mxl_fail(ret))
227 goto fail;
228 ret = mxl111sf_read_reg(state, 0x12, &r12);
229 if (mxl_fail(ret))
230 goto fail;
231 ret = mxl111sf_read_reg(state, 0x15, &r15);
232 if (mxl_fail(ret))
233 goto fail;
234 ret = mxl111sf_read_reg(state, 0x82, &r82);
235 if (mxl_fail(ret))
236 goto fail;
237 ret = mxl111sf_read_reg(state, 0x84, &r84);
238 if (mxl_fail(ret))
239 goto fail;
240 ret = mxl111sf_read_reg(state, 0x89, &r89);
241 if (mxl_fail(ret))
242 goto fail;
243 ret = mxl111sf_read_reg(state, 0x3D, &r3D);
244 if (mxl_fail(ret))
245 goto fail;
246
247 switch (pin_mux_config) {
248 case PIN_MUX_TS_OUT_PARALLEL:
249
250 r17 |= PIN_MUX_MPEG_MODE_MASK;
251
252 r18 |= PIN_MUX_MPEG_PAR_EN_MASK;
253
254 r18 &= ~PIN_MUX_MPEG_SER_EN_MASK;
255
256 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
257
258 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
259
260 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
261
262 r3D &= ~PIN_MUX_SPI_MODE_MASK;
263
264 r82 |= PIN_MUX_MCLK_EN_CTRL_MASK;
265
266 r82 |= PIN_MUX_MPERR_EN_CTRL_MASK;
267
268 r82 |= PIN_MUX_MDVAL_EN_CTRL_MASK;
269
270 r82 |= PIN_MUX_MPSYN_EN_CTRL_MASK;
271
272 r84 |= 0xF0;
273
274 r89 |= 0xF0;
275 break;
276 case PIN_MUX_TS_OUT_SERIAL:
277
278 r17 |= PIN_MUX_MPEG_MODE_MASK;
279
280 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
281
282 r18 |= PIN_MUX_MPEG_SER_EN_MASK;
283
284 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
285
286 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
287
288 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
289
290 r3D &= ~PIN_MUX_SPI_MODE_MASK;
291
292 r82 |= PIN_MUX_MCLK_EN_CTRL_MASK;
293
294 r82 |= PIN_MUX_MPERR_EN_CTRL_MASK;
295
296 r82 |= PIN_MUX_MDVAL_EN_CTRL_MASK;
297
298 r82 |= PIN_MUX_MPSYN_EN_CTRL_MASK;
299
300 r84 |= 0xF0;
301
302 r89 |= 0xF0;
303 break;
304 case PIN_MUX_GPIO_MODE:
305
306 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
307
308 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
309
310 r18 &= ~PIN_MUX_MPEG_SER_EN_MASK;
311
312 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
313
314 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
315
316 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
317
318 r3D &= ~PIN_MUX_SPI_MODE_MASK;
319
320 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
321
322 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
323
324 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
325
326 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
327
328 r84 &= 0x0F;
329
330 r89 &= 0x0F;
331 break;
332 case PIN_MUX_TS_SERIAL_IN_MODE_0:
333
334 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
335
336 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
337
338 r18 |= PIN_MUX_MPEG_SER_EN_MASK;
339
340 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
341
342 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
343
344 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
345
346 r3D &= ~PIN_MUX_SPI_MODE_MASK;
347
348 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
349
350 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
351
352 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
353
354 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
355
356 r84 &= 0x0F;
357
358 r89 &= 0x0F;
359 break;
360 case PIN_MUX_TS_SERIAL_IN_MODE_1:
361
362 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
363
364 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
365
366 r18 |= PIN_MUX_MPEG_SER_EN_MASK;
367
368 r3D |= PIN_MUX_MPG_IN_MUX_MASK;
369
370 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
371
372 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
373
374 r3D &= ~PIN_MUX_SPI_MODE_MASK;
375
376 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
377
378 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
379
380 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
381
382 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
383
384 r84 &= 0x0F;
385
386 r89 &= 0x0F;
387 break;
388 case PIN_MUX_TS_SPI_IN_MODE_1:
389
390 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
391
392 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
393
394 r18 |= PIN_MUX_MPEG_SER_EN_MASK;
395
396 r3D |= PIN_MUX_MPG_IN_MUX_MASK;
397
398 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
399
400 r15 |= PIN_MUX_I2S_ENABLE_MASK;
401
402 r3D |= PIN_MUX_SPI_MODE_MASK;
403
404 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
405
406 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
407
408 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
409
410 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
411
412 r84 &= 0x0F;
413
414 r89 &= 0x0F;
415 break;
416 case PIN_MUX_TS_SPI_IN_MODE_0:
417
418 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
419
420 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
421
422 r18 |= PIN_MUX_MPEG_SER_EN_MASK;
423
424 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
425
426 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
427
428 r15 |= PIN_MUX_I2S_ENABLE_MASK;
429
430 r3D |= PIN_MUX_SPI_MODE_MASK;
431
432 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
433
434 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
435
436 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
437
438 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
439
440 r84 &= 0x0F;
441
442 r89 &= 0x0F;
443 break;
444 case PIN_MUX_TS_PARALLEL_IN:
445
446 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
447
448 r18 |= PIN_MUX_MPEG_PAR_EN_MASK;
449
450 r18 &= ~PIN_MUX_MPEG_SER_EN_MASK;
451
452 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
453
454 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
455
456 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
457
458 r3D &= ~PIN_MUX_SPI_MODE_MASK;
459
460 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
461
462 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
463
464 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
465
466 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
467
468 r84 &= 0x0F;
469
470 r89 &= 0x0F;
471 break;
472 case PIN_MUX_BT656_I2S_MODE:
473
474 r17 &= ~PIN_MUX_MPEG_MODE_MASK;
475
476 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
477
478 r18 &= ~PIN_MUX_MPEG_SER_EN_MASK;
479
480 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
481
482 r12 |= PIN_MUX_BT656_ENABLE_MASK;
483
484 r15 |= PIN_MUX_I2S_ENABLE_MASK;
485
486 r3D &= ~PIN_MUX_SPI_MODE_MASK;
487
488 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
489
490 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
491
492 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
493
494 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
495
496 r84 &= 0x0F;
497
498 r89 &= 0x0F;
499 break;
500 case PIN_MUX_DEFAULT:
501 default:
502
503 r17 |= PIN_MUX_MPEG_MODE_MASK;
504
505 r18 &= ~PIN_MUX_MPEG_PAR_EN_MASK;
506
507 r18 &= ~PIN_MUX_MPEG_SER_EN_MASK;
508
509 r3D &= ~PIN_MUX_MPG_IN_MUX_MASK;
510
511 r12 &= ~PIN_MUX_BT656_ENABLE_MASK;
512
513 r15 &= ~PIN_MUX_I2S_ENABLE_MASK;
514
515 r3D &= ~PIN_MUX_SPI_MODE_MASK;
516
517 r82 &= ~PIN_MUX_MCLK_EN_CTRL_MASK;
518
519 r82 &= ~PIN_MUX_MPERR_EN_CTRL_MASK;
520
521 r82 &= ~PIN_MUX_MDVAL_EN_CTRL_MASK;
522
523 r82 &= ~PIN_MUX_MPSYN_EN_CTRL_MASK;
524
525 r84 &= 0x0F;
526
527 r89 &= 0x0F;
528 break;
529 }
530
531 ret = mxl111sf_write_reg(state, 0x17, r17);
532 if (mxl_fail(ret))
533 goto fail;
534 ret = mxl111sf_write_reg(state, 0x18, r18);
535 if (mxl_fail(ret))
536 goto fail;
537 ret = mxl111sf_write_reg(state, 0x12, r12);
538 if (mxl_fail(ret))
539 goto fail;
540 ret = mxl111sf_write_reg(state, 0x15, r15);
541 if (mxl_fail(ret))
542 goto fail;
543 ret = mxl111sf_write_reg(state, 0x82, r82);
544 if (mxl_fail(ret))
545 goto fail;
546 ret = mxl111sf_write_reg(state, 0x84, r84);
547 if (mxl_fail(ret))
548 goto fail;
549 ret = mxl111sf_write_reg(state, 0x89, r89);
550 if (mxl_fail(ret))
551 goto fail;
552 ret = mxl111sf_write_reg(state, 0x3D, r3D);
553 if (mxl_fail(ret))
554 goto fail;
555fail:
556 return ret;
557}
558
559
560
561static int mxl111sf_hw_set_gpio(struct mxl111sf_state *state, int gpio, int val)
562{
563 return mxl111sf_hw_do_set_gpio(state, gpio, MXL_GPIO_DIR_OUTPUT, val);
564}
565
566static int mxl111sf_hw_gpio_initialize(struct mxl111sf_state *state)
567{
568 u8 gpioval = 0x07;
569 int i, ret;
570
571 mxl_debug("()");
572
573 for (i = 3; i < 8; i++) {
574 ret = mxl111sf_hw_set_gpio(state, i, (gpioval >> i) & 0x01);
575 if (mxl_fail(ret))
576 break;
577 }
578
579 return ret;
580}
581
582#define PCA9534_I2C_ADDR (0x40 >> 1)
583static int pca9534_set_gpio(struct mxl111sf_state *state, int gpio, int val)
584{
585 u8 w[2] = { 1, 0 };
586 u8 r = 0;
587 struct i2c_msg msg[] = {
588 { .addr = PCA9534_I2C_ADDR,
589 .flags = 0, .buf = w, .len = 1 },
590 { .addr = PCA9534_I2C_ADDR,
591 .flags = I2C_M_RD, .buf = &r, .len = 1 },
592 };
593
594 mxl_debug("(%d, %d)", gpio, val);
595
596
597 i2c_transfer(&state->d->i2c_adap, msg, 2);
598
599
600 msg[0].len = 2;
601#if 0
602 w[0] = 1;
603#endif
604 w[1] = r;
605
606
607 w[1] &= ~(1 << gpio);
608
609
610 w[1] |= ((val ? 1 : 0) << gpio);
611
612
613 i2c_transfer(&state->d->i2c_adap, &msg[0], 1);
614
615 return 0;
616}
617
618static int pca9534_init_port_expander(struct mxl111sf_state *state)
619{
620 u8 w[2] = { 1, 0x07 };
621
622 struct i2c_msg msg = {
623 .addr = PCA9534_I2C_ADDR,
624 .flags = 0, .buf = w, .len = 2
625 };
626
627 mxl_debug("()");
628
629 i2c_transfer(&state->d->i2c_adap, &msg, 1);
630
631
632 w[0] = 3;
633 w[1] = 0;
634
635 i2c_transfer(&state->d->i2c_adap, &msg, 1);
636
637 return 0;
638}
639
640int mxl111sf_set_gpio(struct mxl111sf_state *state, int gpio, int val)
641{
642 mxl_debug("(%d, %d)", gpio, val);
643
644 switch (state->gpio_port_expander) {
645 default:
646 mxl_printk(KERN_ERR,
647 "gpio_port_expander undefined, assuming PCA9534");
648
649 case mxl111sf_PCA9534:
650 return pca9534_set_gpio(state, gpio, val);
651 case mxl111sf_gpio_hw:
652 return mxl111sf_hw_set_gpio(state, gpio, val);
653 }
654}
655
656static int mxl111sf_probe_port_expander(struct mxl111sf_state *state)
657{
658 int ret;
659 u8 w = 1;
660 u8 r = 0;
661 struct i2c_msg msg[] = {
662 { .flags = 0, .buf = &w, .len = 1 },
663 { .flags = I2C_M_RD, .buf = &r, .len = 1 },
664 };
665
666 mxl_debug("()");
667
668 msg[0].addr = 0x70 >> 1;
669 msg[1].addr = 0x70 >> 1;
670
671
672 ret = i2c_transfer(&state->d->i2c_adap, msg, 2);
673 if (ret == 2) {
674 state->port_expander_addr = msg[0].addr;
675 state->gpio_port_expander = mxl111sf_PCA9534;
676 mxl_debug("found port expander at 0x%02x",
677 state->port_expander_addr);
678 return 0;
679 }
680
681 msg[0].addr = 0x40 >> 1;
682 msg[1].addr = 0x40 >> 1;
683
684 ret = i2c_transfer(&state->d->i2c_adap, msg, 2);
685 if (ret == 2) {
686 state->port_expander_addr = msg[0].addr;
687 state->gpio_port_expander = mxl111sf_PCA9534;
688 mxl_debug("found port expander at 0x%02x",
689 state->port_expander_addr);
690 return 0;
691 }
692 state->port_expander_addr = 0xff;
693 state->gpio_port_expander = mxl111sf_gpio_hw;
694 mxl_debug("using hardware gpio");
695 return 0;
696}
697
698int mxl111sf_init_port_expander(struct mxl111sf_state *state)
699{
700 mxl_debug("()");
701
702 if (0x00 == state->port_expander_addr)
703 mxl111sf_probe_port_expander(state);
704
705 switch (state->gpio_port_expander) {
706 default:
707 mxl_printk(KERN_ERR,
708 "gpio_port_expander undefined, assuming PCA9534");
709
710 case mxl111sf_PCA9534:
711 return pca9534_init_port_expander(state);
712 case mxl111sf_gpio_hw:
713 return mxl111sf_hw_gpio_initialize(state);
714 }
715}
716
717
718
719int mxl111sf_gpio_mode_switch(struct mxl111sf_state *state, unsigned int mode)
720{
721
722
723
724
725
726
727
728 mxl_debug("(%d)", mode);
729
730 switch (mode) {
731 case MXL111SF_GPIO_MOD_MH:
732 mxl111sf_set_gpio(state, 4, 0);
733 mxl111sf_set_gpio(state, 5, 0);
734 msleep(50);
735 mxl111sf_set_gpio(state, 7, 1);
736 msleep(50);
737 mxl111sf_set_gpio(state, 6, 1);
738 msleep(50);
739
740 mxl111sf_set_gpio(state, 3, 0);
741 break;
742 case MXL111SF_GPIO_MOD_ATSC:
743 mxl111sf_set_gpio(state, 6, 0);
744 mxl111sf_set_gpio(state, 7, 0);
745 msleep(50);
746 mxl111sf_set_gpio(state, 5, 1);
747 msleep(50);
748 mxl111sf_set_gpio(state, 4, 1);
749 msleep(50);
750 mxl111sf_set_gpio(state, 3, 1);
751 break;
752 default:
753 mxl111sf_init_port_expander(state);
754 break;
755 }
756 return 0;
757}
758