From 81ba127ee153c1f1565fbb33a65ed36ad13c52bd Mon Sep 17 00:00:00 2001 From: CrazyCat Date: Sat, 13 Jan 2024 19:18:11 +0200 Subject: [PATCH] media: dvb-frontends/gx1133: PLS support. --- drivers/media/dvb-frontends/gx1133.c | 342 ++++++++++++++++++++++++++- 1 file changed, 338 insertions(+), 4 deletions(-) diff --git a/drivers/media/dvb-frontends/gx1133.c b/drivers/media/dvb-frontends/gx1133.c index 54053cc91e94..b4209716fad0 100644 --- a/drivers/media/dvb-frontends/gx1133.c +++ b/drivers/media/dvb-frontends/gx1133.c @@ -744,7 +744,6 @@ static int gx1133_i2c_select(struct i2c_adapter *adap, struct gx1133_priv *priv = mux_priv; #endif int ret; - u8 temp; u8 buf[3]; struct i2c_msg msg_wr = { .addr = priv->cfg->i2c_address, @@ -1115,6 +1114,333 @@ static int gx1133_sleep(struct dvb_frontend *fe) return 0; } +static u32 root_2_gold(u32 root) +{ + int i; + + for ( i = 0; i < 4096; i++ ) + { + if ( root == 133647 ) + return 16384 - i; + if ( root > 133647 ) + { + if ( root == 187706 ) + return 77824 - i; + if ( root > 187706 ) + { + if ( root == 201999 ) + return 188416 - i; + if ( root > 201999 ) + { + if ( root == 241848 ) + return 237568 - i; + if ( root > 241848 ) + { + if ( root == 250156 ) + return 143360 - i; + if ( root > 250156 ) + { + if ( root == 252451 ) + return 249856 - i; + if ( root == 255652 ) + return 135168 - i; + } + else if ( root == 250024 ) + { + return 180224 - i; + } + } + else + { + switch ( root ) + { + case 218494: + return 4096 - i; + case 220394: + return 118784 - i; + case 204289: + return 221184 - i; + } + } + } + else + { + if ( root == 191286 ) + return 151552 - i; + if ( root > 191286 ) + { + switch ( root ) + { + case 200200: + return 28672 - i; + case 200201: + return 73728 - i; + case 194133: + return 176128 - i; + } + } + else + { + switch ( root ) + { + case 190045: + return 102400 - i; + case 190773: + return 122880 - i; + case 189090: + return 208896 - i; + } + } + } + } + else + { + if ( root == 160570 ) + return 8192 - i; + if ( root > 160570 ) + { + if ( root == 173108 ) + return 20480 - i; + if ( root > 173108 ) + { + switch ( root ) + { + case 177342: + return 192512 - i; + case 181283: + return 172032 - i; + case 176922: + return 155648 - i; + } + } + else + { + switch ( root ) + { + case 165152: + return 53248 - i; + case 167995: + return 94208 - i; + case 164627: + return 184320 - i; + } + } + } + else + { + if ( root == 151579 ) + return 139264 - i; + if ( root > 151579 ) + { + switch ( root ) + { + case 153836: + return 90112 - i; + case 155666: + return 81920 - i; + case 153128: + return 200704 - i; + } + } + else + { + switch ( root ) + { + case 141589: + return 212992 - i; + case 141681: + return 233472 - i; + case 139537: + return 98304 - i; + } + } + } + } + } + else + { + if ( root == 52291 ) + return 12288 - i; + if ( root > 52291 ) + { + if ( root == 80798 ) + return 225280 - i; + if ( root > 80798 ) + { + if ( root == 125012 ) + return 147456 - i; + if ( root > 125012 ) + { + switch ( root ) + { + case 127037: + return 69632 - i; + case 129117: + return 86016 - i; + case 125013: + return 57344 - i; + } + } + else + { + switch ( root ) + { + case 100420: + return 32768 - i; + case 114248: + return 61440 - i; + case 81022: + return 159744 - i; + } + } + } + else + { + if ( root == 70927 ) + return 217088 - i; + if ( root > 70927 ) + { + switch ( root ) + { + case 78346: + return 253952 - i; + case 78878: + return 40960 - i; + case 76918: + return 204800 - i; + } + } + else + { + switch ( root ) + { + case 58674: + return 126976 - i; + case 66566: + return 163840 - i; + case 54024: + return 110592 - i; + } + } + } + } + else + { + if ( root == 21219 ) + return 45056 - i; + if ( root > 21219 ) + { + if ( root == 42033 ) + return 24576 - i; + if ( root > 42033 ) + { + switch ( root ) + { + case 49184: + return 65536 - i; + case 50211: + return 114688 - i; + case 43526: + return 258048 - i; + } + } + else + { + switch ( root ) + { + case 31501: + return 241664 - i; + case 37387: + return 245760 - i; + case 30990: + return 167936 - i; + } + } + } + else + { + if ( root == 4904 ) + return 36864 - i; + if ( root > 4904 ) + { + switch ( root ) + { + case 13327: + return 49152 - i; + case 13836: + return 106496 - i; + case 12297: + return 229376 - i; + } + } + else + { + switch ( root ) + { + case 515: + return 196608 - i; + case 4104: + return 131072 - i; + case 1: + return (262143 - i) % 262143; + } + } + } + } + } + root = (((((root & 0x80) != 0) + (root & 1)) & 1) << 17) | (root >> 1); + } + return i; +} + +static int gx1133_set_pls_n(struct gx1133_priv *priv, u32 n) +{ + int i, nx, ny; + int shift=131072; + unsigned int scram_0x=1; + unsigned int scram_1x=0x8050; + unsigned int scram_1y=0; + unsigned int xx_18,xx_7; + u8 tmp; + + nx = n+shift; + ny = shift; + + gx1133_rd(priv,DVB_S2,GX1133_SCRAM_1X1Y0X_H,&tmp); + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X1Y0X_H,tmp & 0xbf); + + for ( i=0; i> 18; + xx_7 = (scram_0x & 0x80) ^ (xx_18 << 7); + scram_0x = (scram_0x & 0x7ff7f) | xx_18 | xx_7; + + scram_1x = scram_1x<<1; + xx_18 = (scram_1x & 0x40000) >> 18; + xx_7 = (scram_1x & 0x80) ^ (xx_18 << 7); + scram_1x = (scram_1x & 0x7ff7f) | xx_18 | xx_7; + } + scram_1y = 0xff60; + + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_0X_L,scram_0x&0xff); + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_0X_M,(scram_0x>>8)&0xff); + + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X_L,scram_1x&0xff); + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X_M,(scram_1x>>8)&0xff); + + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1Y_L,scram_1y&0xff); + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1Y_M,(scram_1y>>8)&0xff); + + gx1133_wr(priv,DVB_S2,GX1133_SCRAM_1X1Y0X_H,(((scram_1x>>16)&0x03)<<4)|(((scram_1y>>16)&0x03)<<2)|((scram_0x>>16)&0x03)); + + //printk("scrm_0x = %x\n",scram_0x); + //printk("scrm_1x = %x\n",scram_1x); + //printk("scrm_1y = %x\n",scram_1y); + + return 0; +} + static int gx1133_set_frontend(struct dvb_frontend *fe) { struct gx1133_priv *priv = fe->demodulator_priv; @@ -1144,7 +1470,6 @@ static int gx1133_set_frontend(struct dvb_frontend *fe) dev_dbg(&priv->i2c->dev, "%s()\n", __func__); - printk("set frontends\n"); /* do some basic parameter validation */ switch (c->delivery_system) { case SYS_DVBS: @@ -1167,6 +1492,15 @@ static int gx1133_set_frontend(struct dvb_frontend *fe) return -EINVAL; } + /* Set PLS before search */ + dev_dbg(&priv->i2c->dev, "%s: set pls_mode %d, pls_code %d !\n", __func__, pls_mode, pls_code); + gx1133_set_pls_n(priv, pls_mode ? pls_code : root_2_gold(pls_code)); + + /* Reset ISI filter */ + gx1133_rd(priv,DVB_S2,GX1133_LDPC_TSID_CTRL,&temp); + temp&=0xfe; + gx1133_wr(priv,DVB_S2,GX1133_LDPC_TSID_CTRL,temp); + gx1133_rd(priv,DVB_S2,GX1133_AUTO_RST,&temp); temp|=0x01; gx1133_wr(priv,DVB_S2,GX1133_AUTO_RST,temp); @@ -1194,6 +1528,7 @@ static int gx1133_set_frontend(struct dvb_frontend *fe) buf[2] = 0; buf[3] = 0; ret = gx1133_wrm(priv, buf, 4); + if (ret) return ret; @@ -1209,7 +1544,6 @@ static int gx1133_set_frontend(struct dvb_frontend *fe) #endif } - gx1133_rd(priv,DVB_S2,GX1133_RST,&temp); temp|=0x01; gx1133_wr(priv,DVB_S2,GX1133_RST,temp); @@ -1220,7 +1554,7 @@ static int gx1133_set_frontend(struct dvb_frontend *fe) ret = gx1133_read_status(fe, &tunerstat); if (tunerstat & FE_HAS_LOCK) { - /* Setup MIS filtering */ + /* Setup ISI filtering */ if (c->delivery_system == SYS_DVBS2) { gx1133_rd(priv,DVB_S2,GX1133_LDPC_TSID_CTRL,&temp);