Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] dw2102: Prof 7500: Lock LED implemented

Code changed for dw2102, stv0900 in order to achieve that.

Signed-off-by: Igor M. Liplianin <liplianin@me.by>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>

authored by

Igor M. Liplianin and committed by
Mauro Carvalho Chehab
fa8bae10 2adc591f

+53 -1
+29
drivers/media/dvb/dvb-usb/dw2102.c
··· 70 70 #define DW2102_VOLTAGE_CTRL (0x1800) 71 71 #define SU3000_STREAM_CTRL (0x1900) 72 72 #define DW2102_RC_QUERY (0x1a00) 73 + #define DW2102_LED_CTRL (0x1b00) 73 74 74 75 #define err_str "did not find the firmware file. (%s) " \ 75 76 "Please see linux/Documentation/dvb/ for more details " \ ··· 510 509 obuf, 2, DW210X_WRITE_MSG); 511 510 break; 512 511 } 512 + case (DW2102_LED_CTRL): { 513 + u8 obuf[2]; 514 + 515 + obuf[0] = 5; 516 + obuf[1] = msg[j].buf[0]; 517 + ret = dw210x_op_rw(d->udev, 0x8a, 0, 0, 518 + obuf, 2, DW210X_WRITE_MSG); 519 + break; 520 + } 513 521 /*case 0x55: cx24116 514 522 case 0x6a: stv0903 515 523 case 0x68: ds3000, stv0903 ··· 854 844 return 0; 855 845 } 856 846 847 + static void dw210x_led_ctrl(struct dvb_frontend *fe, int offon) 848 + { 849 + static u8 led_off[] = { 0 }; 850 + static u8 led_on[] = { 1 }; 851 + struct i2c_msg msg = { 852 + .addr = DW2102_LED_CTRL, 853 + .flags = 0, 854 + .buf = led_off, 855 + .len = 1 856 + }; 857 + struct dvb_usb_adapter *udev_adap = 858 + (struct dvb_usb_adapter *)(fe->dvb->priv); 859 + 860 + if (offon) 861 + msg.buf = led_on; 862 + i2c_transfer(&udev_adap->dev->i2c_adap, &msg, 1); 863 + } 864 + 857 865 static struct stv0299_config sharp_z0194a_config = { 858 866 .demod_address = 0x68, 859 867 .inittab = sharp_z0194a_inittab, ··· 951 923 .tun1_adc = 0,/* 2 Vpp */ 952 924 .path1_mode = 3, 953 925 .tun1_type = 3, 926 + .set_lock_led = dw210x_led_ctrl, 954 927 }; 955 928 956 929 static struct ds3000_config su3000_ds3000_config = {
+2
drivers/media/dvb/frontends/stv0900.h
··· 53 53 u8 tun2_type; 54 54 /* Set device param to start dma */ 55 55 int (*set_ts_params)(struct dvb_frontend *fe, int is_punctured); 56 + /* Hook for Lock LED */ 57 + void (*set_lock_led)(struct dvb_frontend *fe, int offon); 56 58 }; 57 59 58 60 #if defined(CONFIG_DVB_STV0900) || (defined(CONFIG_DVB_STV0900_MODULE) \
+22 -1
drivers/media/dvb/frontends/stv0900_core.c
··· 1660 1660 | FE_HAS_VITERBI 1661 1661 | FE_HAS_SYNC 1662 1662 | FE_HAS_LOCK; 1663 - } else 1663 + if (state->config->set_lock_led) 1664 + state->config->set_lock_led(fe, 1); 1665 + } else { 1666 + if (state->config->set_lock_led) 1667 + state->config->set_lock_led(fe, 0); 1664 1668 dprintk("DEMOD LOCK FAIL\n"); 1669 + } 1665 1670 1666 1671 return 0; 1667 1672 } ··· 1836 1831 1837 1832 dprintk("%s\n", __func__); 1838 1833 1834 + if (state->config->set_lock_led) 1835 + state->config->set_lock_led(fe, 0); 1836 + 1839 1837 if ((--(state->internal->dmds_used)) <= 0) { 1840 1838 1841 1839 dprintk("%s: Actually removing\n", __func__); ··· 1848 1840 } 1849 1841 1850 1842 kfree(state); 1843 + } 1844 + 1845 + static int stv0900_sleep(struct dvb_frontend *fe) 1846 + { 1847 + struct stv0900_state *state = fe->demodulator_priv; 1848 + 1849 + dprintk("%s\n", __func__); 1850 + 1851 + if (state->config->set_lock_led) 1852 + state->config->set_lock_led(fe, 0); 1853 + 1854 + return 0; 1851 1855 } 1852 1856 1853 1857 static int stv0900_get_frontend(struct dvb_frontend *fe, ··· 1896 1876 .release = stv0900_release, 1897 1877 .init = stv0900_init, 1898 1878 .get_frontend = stv0900_get_frontend, 1879 + .sleep = stv0900_sleep, 1899 1880 .get_frontend_algo = stv0900_frontend_algo, 1900 1881 .i2c_gate_ctrl = stv0900_i2c_gate_ctrl, 1901 1882 .diseqc_send_master_cmd = stv0900_send_master_cmd,