From 9b7cc12ed0fb961e434fc0197f93969b4d16c485 Mon Sep 17 00:00:00 2001 From: Stefan Saraev Date: Wed, 18 Feb 2015 20:09:39 +0200 Subject: [PATCH] wetek_play: update dvb driver / dvb-s firmware this should fix freezes on hd channels (dvb-s) --- .../filesystem/lib/firmware/dvb-fe-avl6211.fw | Bin 9768 -> 4780 bytes .../filesystem/lib/modules/wetekdvb.ko | Bin 39932 -> 39392 bytes .../patches/linux/20-wetek_dvb_code.patch | 1045 ++++------------- 3 files changed, 260 insertions(+), 785 deletions(-) diff --git a/projects/WeTek_Play/filesystem/lib/firmware/dvb-fe-avl6211.fw b/projects/WeTek_Play/filesystem/lib/firmware/dvb-fe-avl6211.fw index e6fda04e41c3cdc7a46986b07f1aad826dfd95bd..02fa382330346a3ff319a78e99ef70fac636d890 100644 GIT binary patch literal 4780 zcmcIoe{5UT6+Z9z#c|wM$CQW#DWq@tVLDS{H*Mn7gw%FJF$_a;5z`1T{=&42!VxaT*i@Xxx#{xy|r*Hu*qYSurz zqouVi0i8qzqHQ87@yC7?8;fltYUm`&nKA0ZSFze{{x@ijk-vhRstMi^V}-M~H6eC-Q9Nx}%?J{`;U;sfA9j^p;p- zeB)&YmA*|B(34cjSK3P?&9oAoWbVPe21!Yl;Jw_%4AD=pAM!qT1xtzfY4(U1N4X@O zHfY()0=)|~B+z-FN`d}jkTWgN2hjYMKp$fES&pPCgL2*!s2;RIf$j(GDS-|cc9fl9zPC6EVe zpBCsYNQfQCtFg9NM_yx4zE{i|@JWL}?Xa<0pfqI11?q&2mId7gsTLZ-8vT6MRso3` zfqe7(vsGg+CvvyL zW|sOr(QnW42=UafnU(rH5sVtY8}igK>6VP=Uhq~z+K;aya?<0)D$hh-h`iwU(y?fU z$BwPoN4}uzX^!`%nft>`H2sL5k6Ml*s>rpysw<{RN6Nd%iFM*ksR~IAI^`rAP9b($ z6XdGp@nr8~IfKVY!FV;Z5B8xigWei#J%uRxnK^CFug3fLC*!?h-6B3Z9}=VW(6^J1 z&!x&ka+ywwgFS}Tb}@HVh+bwnXpfg-x1PtS!=%V5w21oB4DYRxm}NI+|7~uOaSnK$`vYgD%>@5$G8fllVusNW^NeP@WMGyEd8CJksrJ%>EnIL>)`63`eC!X8*@O=MGft;ilVT;bjDMM)jQVC zcp~VTFSuOsagTIxkGvadg1;7d&MTMk(FgVM-dzn%{=96!hgHKm! zURnq1y|VVIxy6k4CJHsLyvh-xm3&rrVyAlf9(BLGs`M(i9-30{gj)`oq~c3d;56H7EfmGq-0CZ5G%c6ZUkR6-8;Ihm3W(B>A?~O<94UceiJ}P8;gx`9=eTGxdrFe7+ zxtn58aPPCYIp-58L3tX!4la9E(DzvyvYf$Xsl`;Tm(Pz)H1#6W;*i=Y=0!GH>n@s) zu|i}xFf7yhw%YmNFClWhNo} zT6OxT^JZIha&DT>7vLarA2!;N_0Ed_R9~D;T)S0Y!0)_2YscVAG}%gd*ZAx&UW>d$ zmta#Ichr$+X3Vs_`^-!nbtvyWtrNT8ch!2_kj|8>Lb}$*ofmq9I} zB1eXb5obV)sTRfZzV9wcocWU3VZb_> zmdd8y2GgKx7o%z0G}poJ4Br2ATI-^azp2E{q)gbD;c@EMZ~_A&>+z}zJjW|#KDQRs zr0c>!3C=a}9G9MYTx7_AR(n0WAAc14Ddbl8ql>8)MdaK7m#mVTdLuuO>UFxdjpYd~ z$Cy*}$HP~7gx)_*D*SdJ;c7TW?u3Kip13#bQGe^P{-7_IJ1F!Ga(y@I?m4SAoM?c@ z(B<-;2t;gD#}oA1k|x2ff^$WEyh6-cL5qSZv(%x=?6ULRzFCY?0A zFe*i45^l4n8rr2<^xf#MC-(e*?(7Km15eLb`vJOU?MduGr)K{4(P<_Id+|=;zI7hu z?P`~`FLv8tpC_6?G(Zj<;4QgtniS1FxZkjIPVZ>h0p3@g!<^l^sdHjj3AMvI->Jvf za@oduffjGF13=h;~VI~|eKPRfVPc*QHbFk85Ic7875PD=ByJ|zlUBRYNgInQYEQW$f1 z@$Sxn2Cs<9v4z`+l)@#i2)yisl!g`03RDI(E>I!Rd4Y<6Cip#;jW~WzI9JR;3TtWt zjRTblbRMWspb4NNy%yNAY;x)9wx{MTwORQydBalME*{k+D(cR|I@z|1{5hCNTjzr6 zvI$?b#7p8lb_6wP%&fe}VUK<7mPy5LyJ9LK4|yY&7w^WGNr{J<`yFwe`M|)rRGilT2xZj;znF+5ANzpBW-;&z# z{8DXeArY9yhk9=h;VqLyejhYQ4&uB+O2L%L;{d;Z>aw;45ji$Q{&>O#@44I0rt)G3 zwsa@1fqv@}y33+-AGDv%$}NOX@h{NK+3oOgip#vW{zt=Sj~E%-62#>ts*FxQ{B z4=-*OEoh2iN1L0lXDOY;Bl}{DoyqX{cJ`Gxu>x^o_*I|$YKWg;0dr(es(?pQ?!@9d zR;Mo>wR}%+W~&*0>r~(un3`~jcaI;~VGtcb{ceXx4`unE$=WR{+}eIpwgMEgbxx~0upJ4d{ZPMSv{|)*Qt65whUC6vk zq7qzM$S+p|eucI;aNBx$wp#zMX#8AN=C1JnTGWk>{_!5$iro*IL>urukSe3d2#LRq zXg7iuX{-3##wg*TLKGbS_4Bo*?>hr`{^9ro9UX1P!yQ`7?$$Of`EaUDOYBZ+_1hv_ zv>&HhH7CU&@J;{ZZz}K&`4PFO7;f7u=s9+iTUnLGD)5mkc91& literal 9768 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 BZuI~F delta 7002 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 diff --git a/projects/WeTek_Play/patches/linux/20-wetek_dvb_code.patch b/projects/WeTek_Play/patches/linux/20-wetek_dvb_code.patch index 30d682d351..c59e925120 100644 --- a/projects/WeTek_Play/patches/linux/20-wetek_dvb_code.patch +++ b/projects/WeTek_Play/patches/linux/20-wetek_dvb_code.patch @@ -1,660 +1,3 @@ -diff -Naur a/arch/arm/plat-meson/include/plat/bt_device.h b/arch/arm/plat-meson/include/plat/bt_device.h ---- a/arch/arm/plat-meson/include/plat/bt_device.h 2015-01-25 00:36:40.000000000 +0100 -+++ b/arch/arm/plat-meson/include/plat/bt_device.h 2015-01-22 14:31:05.000000000 +0100 -@@ -1,26 +1,27 @@ --/* -- * arch/arm/plat-meson/include/plat/bt_device.h -- * -- * Copyright (C) 2010-2014 Amlogic, Inc. -- * -- * This software is licensed under the terms of the GNU General Public -- * License version 2, as published by the Free Software Foundation, and -- * may be copied, distributed, and modified under those terms. -- * -- * This program is distributed in the hope that it will be useful, -- * but WITHOUT ANY WARRANTY; without even the implied warranty of -- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- * GNU General Public License for more details. -- */ -- --#ifndef __PLAT_MESON_BT_DEVICE_H --#define __PLAT_MESON_BT_DEVICE_H -- --struct bt_dev_data { -- int gpio_reset; -- int gpio_en; -- int gpio_host_wake; -- int gpio_wake; --}; -- --#endif -+/* -+ * arch/arm/plat-meson/include/plat/bt_device.h -+ * -+ * Copyright (C) 2010-2014 Amlogic, Inc. -+ * -+ * This software is licensed under the terms of the GNU General Public -+ * License version 2, as published by the Free Software Foundation, and -+ * may be copied, distributed, and modified under those terms. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ */ -+ -+#ifndef __PLAT_MESON_BT_DEVICE_H -+#define __PLAT_MESON_BT_DEVICE_H -+ -+struct bt_dev_data { -+ int gpio_reset; -+ int gpio_en; -+ int gpio_host_wake; -+ int gpio_wake; -+ struct pinctrl *pinctrl; -+}; -+ -+#endif -diff -Naur a/drivers/amlogic/bluetooth/bt_device.c b/drivers/amlogic/bluetooth/bt_device.c ---- a/drivers/amlogic/bluetooth/bt_device.c 2015-01-25 00:36:15.000000000 +0100 -+++ b/drivers/amlogic/bluetooth/bt_device.c 2015-01-22 14:26:14.000000000 +0100 -@@ -1,295 +1,301 @@ --/* -- * -- * arch/arm/mach-meson/bcm-bt.c -- * -- * Copyright (C) 2010 AMLOGIC, INC. -- * -- * License terms: GNU General Public License (GPL) version 2 -- * Platform machine definition. -- */ -- --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#include --#ifdef CONFIG_AM_WIFI_SD_MMC --#include --#endif -- --#ifdef CONFIG_HAS_EARLYSUSPEND --#include --static struct early_suspend bt_early_suspend; --#endif -- --#define BT_RFKILL "bt_rfkill" -- --struct bt_dev_runtime_data { -- struct rfkill *bt_rfk; -- struct bt_dev_data *pdata; --}; -- --static void bt_device_init(struct bt_dev_data *pdata) --{ -- if(pdata->gpio_reset > 0 ) { -- amlogic_gpio_request(pdata->gpio_reset, BT_RFKILL); -- } -- -- if(pdata->gpio_en > 0 ) { -- amlogic_gpio_request(pdata->gpio_en, BT_RFKILL); -- } -- -- if(pdata->gpio_wake > 0 ) { -- amlogic_gpio_request(pdata->gpio_wake, BT_RFKILL); -- amlogic_gpio_direction_output(pdata->gpio_wake, 1, BT_RFKILL); -- } -- --} -- --static void bt_device_deinit(struct bt_dev_data *pdata) --{ -- if(pdata->gpio_reset > 0 ) -- amlogic_gpio_free(pdata->gpio_reset, BT_RFKILL); -- -- if(pdata->gpio_en > 0 ) -- amlogic_gpio_free(pdata->gpio_en, BT_RFKILL); -- -- if(pdata->gpio_wake > 0 ) -- amlogic_gpio_free(pdata->gpio_wake, BT_RFKILL); --} -- --static void bt_device_on(struct bt_dev_data *pdata) --{ -- if(pdata->gpio_reset > 0 ) -- amlogic_gpio_direction_output(pdata->gpio_reset, 0, BT_RFKILL); -- if(pdata->gpio_en > 0 ) -- amlogic_gpio_direction_output(pdata->gpio_en, 0, BT_RFKILL); -- msleep(20); -- if(pdata->gpio_reset > 0 ) -- amlogic_gpio_direction_output(pdata->gpio_reset, 1, BT_RFKILL); -- if(pdata->gpio_en > 0 ) -- amlogic_gpio_direction_output(pdata->gpio_en, 1, BT_RFKILL); -- msleep(20); --} -- --static void bt_device_off(struct bt_dev_data *pdata) --{ -- if(pdata->gpio_reset > 0 ) -- amlogic_gpio_direction_output(pdata->gpio_reset, 0, BT_RFKILL); -- if(pdata->gpio_en > 0 ) -- amlogic_gpio_direction_output(pdata->gpio_en, 0, BT_RFKILL); -- msleep(20); --} -- --static int bt_set_block(void *data, bool blocked) --{ -- struct bt_dev_data *pdata = data; -- pr_info("BT_RADIO going: %s\n", blocked ? "off" : "on"); -- -- if (!blocked) { -- pr_info("BCM_BT: going ON\n"); -- bt_device_on(pdata); -- } else { -- pr_info("BCM_BT: going OFF\n"); -- bt_device_off(pdata); -- } -- return 0; --} -- --static const struct rfkill_ops bt_rfkill_ops = { -- .set_block = bt_set_block, --}; --#ifdef CONFIG_HAS_EARLYSUSPEND --static void bt_earlysuspend(struct early_suspend *h) --{ -- -- return; --} -- --static void bt_lateresume(struct early_suspend *h) --{ -- -- return; --} --#endif -- --static int bt_suspend(struct platform_device *pdev, pm_message_t state) --{ -- -- return 0; --} -- --static int bt_resume(struct platform_device *pdev) --{ -- -- return 0; --} -- --static int bt_probe(struct platform_device *pdev) --{ -- int ret = 0; -- struct rfkill *bt_rfk; -- struct bt_dev_data *pdata = NULL; -- struct bt_dev_runtime_data *prdata; -- --#ifdef CONFIG_OF -- //plat = aml_get_driver_data(pdev); -- if (pdev->dev.of_node) { -- const char *str; -- -- printk(KERN_DEBUG "enter bt_probe of_node\n"); -- pdata = kzalloc(sizeof(struct bt_dev_data), GFP_KERNEL); -- ret = of_property_read_string(pdev->dev.of_node,"gpio_reset",&str); -- if(ret){ -- printk(KERN_WARNING "not get gpio_reset\n"); -- pdata->gpio_reset = 0; -- } else { -- pdata->gpio_reset = amlogic_gpio_name_map_num(str); -- } -- -- ret = of_property_read_string(pdev->dev.of_node,"gpio_en",&str); -- if(ret){ -- printk(KERN_WARNING "not get gpio_en\n"); -- pdata->gpio_en = 0; -- } else { -- pdata->gpio_en = amlogic_gpio_name_map_num(str); -- } -- -- ret = of_property_read_string(pdev->dev.of_node,"gpio_wake",&str); -- if(ret){ -- printk(KERN_WARNING "not get gpio_wake\n"); -- pdata->gpio_wake = 0; -- } else { -- pdata->gpio_wake = amlogic_gpio_name_map_num(str); -- } -- } --#else -- pdata = (struct bt_dev_data *)(pdev->dev.platform_data); --#endif -- -- bt_device_init(pdata); -- /* default to bluetooth off */ -- //rfkill_switch_all(RFKILL_TYPE_BLUETOOTH, 1); -- bt_device_off(pdata); -- -- bt_rfk = rfkill_alloc("bt-dev", &pdev->dev, RFKILL_TYPE_BLUETOOTH, -- &bt_rfkill_ops, pdata); -- -- if (!bt_rfk) { -- printk("rfk alloc fail\n"); -- ret = -ENOMEM; -- goto err_rfk_alloc; -- } -- /* if not set false, the bt_set_block will call when rfkill class resume */ -- rfkill_init_sw_state(bt_rfk, false); //we want to reset bt when system resume -- ret = rfkill_register(bt_rfk); -- if (ret){ -- printk(KERN_ERR "rfkill_register fail\n"); -- goto err_rfkill; -- } -- prdata = kmalloc(sizeof(struct bt_dev_runtime_data), GFP_KERNEL); -- if (!prdata) { -- printk(KERN_ERR "bt_dev_runtime_data alloc fail\n"); -- goto err_rfkill; -- } --#ifdef CONFIG_AM_WIFI_SD_MMC -- //setup 32k clock -- wifi_request_32k_clk(1, BT_RFKILL); -- msleep(100); --#endif -- -- prdata->bt_rfk = bt_rfk; -- prdata->pdata = pdata; -- platform_set_drvdata(pdev, prdata); --#ifdef CONFIG_HAS_EARLYSUSPEND -- bt_early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; -- bt_early_suspend.suspend = bt_earlysuspend; -- bt_early_suspend.resume = bt_lateresume; -- bt_early_suspend.param = pdev; -- register_early_suspend(&bt_early_suspend); --#endif -- -- return 0; -- --err_rfkill: -- rfkill_destroy(bt_rfk); --err_rfk_alloc: -- bt_device_deinit(pdata); -- return ret; -- --} -- --static int bt_remove(struct platform_device *pdev) --{ -- struct bt_dev_runtime_data *prdata = platform_get_drvdata(pdev); -- struct rfkill *rfk = NULL; -- struct bt_dev_data *pdata = NULL; -- -- platform_set_drvdata(pdev, NULL); --#ifdef CONFIG_AM_WIFI_SD_MMC -- wifi_request_32k_clk(0, BT_RFKILL); --#endif -- if(prdata) { -- rfk = prdata->bt_rfk; -- pdata = prdata->pdata; -- } -- -- if(pdata) { -- bt_device_deinit(pdata); -- kfree(pdata); -- } -- -- if (rfk) { -- rfkill_unregister(rfk); -- rfkill_destroy(rfk); -- } -- rfk = NULL; -- -- return 0; --} -- --#ifdef CONFIG_OF --static const struct of_device_id bt_dev_dt_match[]={ -- { .compatible = "amlogic,bt-dev", -- }, -- {}, --}; --#else --#define bt_dev_dt_match NULL --#endif -- --static struct platform_driver bt_driver = { -- .driver = { -- .name = "bt-dev", -- .of_match_table = bt_dev_dt_match, -- }, -- .probe = bt_probe, -- .remove = bt_remove, -- .suspend = bt_suspend, -- .resume = bt_resume, --}; -- --static int __init bt_init(void) --{ -- printk("amlogic rfkill init\n"); -- -- return platform_driver_register(&bt_driver); --} --static void __exit bt_exit(void) --{ -- platform_driver_unregister(&bt_driver); --} -- --module_init(bt_init); --module_exit(bt_exit); --MODULE_DESCRIPTION("bt rfkill"); --MODULE_AUTHOR(""); --MODULE_LICENSE("GPL"); -+/* -+ * -+ * arch/arm/mach-meson/bcm-bt.c -+ * -+ * Copyright (C) 2010 AMLOGIC, INC. -+ * -+ * License terms: GNU General Public License (GPL) version 2 -+ * Platform machine definition. -+ */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+#ifdef CONFIG_AM_WIFI_SD_MMC -+#include -+#endif -+ -+#ifdef CONFIG_HAS_EARLYSUSPEND -+#include -+static struct early_suspend bt_early_suspend; -+#endif -+ -+#define BT_RFKILL "bt_rfkill" -+ -+struct bt_dev_runtime_data { -+ struct rfkill *bt_rfk; -+ struct bt_dev_data *pdata; -+}; -+ -+static void bt_device_init(struct bt_dev_data *pdata) -+{ -+ if(pdata->gpio_reset > 0 ) { -+ amlogic_gpio_request(pdata->gpio_reset, BT_RFKILL); -+ } -+ -+ if(pdata->gpio_en > 0 ) { -+ amlogic_gpio_request(pdata->gpio_en, BT_RFKILL); -+ } -+ -+ if(pdata->gpio_wake > 0 ) { -+ amlogic_gpio_request(pdata->gpio_wake, BT_RFKILL); -+ amlogic_gpio_direction_output(pdata->gpio_wake, 1, BT_RFKILL); -+ } -+ -+} -+ -+static void bt_device_deinit(struct bt_dev_data *pdata) -+{ -+ if(pdata->gpio_reset > 0 ) -+ amlogic_gpio_free(pdata->gpio_reset, BT_RFKILL); -+ -+ if(pdata->gpio_en > 0 ) -+ amlogic_gpio_free(pdata->gpio_en, BT_RFKILL); -+ -+ if(pdata->gpio_wake > 0 ) -+ amlogic_gpio_free(pdata->gpio_wake, BT_RFKILL); -+} -+ -+static void bt_device_on(struct bt_dev_data *pdata) -+{ -+ if(pdata->gpio_reset > 0 ) -+ amlogic_gpio_direction_output(pdata->gpio_reset, 0, BT_RFKILL); -+ if(pdata->gpio_en > 0 ) -+ amlogic_gpio_direction_output(pdata->gpio_en, 0, BT_RFKILL); -+ msleep(20); -+ if(pdata->gpio_reset > 0 ) -+ amlogic_gpio_direction_output(pdata->gpio_reset, 1, BT_RFKILL); -+ if(pdata->gpio_en > 0 ) -+ amlogic_gpio_direction_output(pdata->gpio_en, 1, BT_RFKILL); -+ msleep(20); -+} -+ -+static void bt_device_off(struct bt_dev_data *pdata) -+{ -+ if(pdata->gpio_reset > 0 ) -+ amlogic_gpio_direction_output(pdata->gpio_reset, 0, BT_RFKILL); -+ if(pdata->gpio_en > 0 ) -+ amlogic_gpio_direction_output(pdata->gpio_en, 0, BT_RFKILL); -+ msleep(20); -+} -+ -+static int bt_set_block(void *data, bool blocked) -+{ -+ struct bt_dev_data *pdata = data; -+ pr_info("BT_RADIO going: %s\n", blocked ? "off" : "on"); -+ -+ if (!blocked) { -+ pr_info("BCM_BT: going ON\n"); -+ bt_device_on(pdata); -+ } else { -+ pr_info("BCM_BT: going OFF\n"); -+ bt_device_off(pdata); -+ } -+ return 0; -+} -+ -+static const struct rfkill_ops bt_rfkill_ops = { -+ .set_block = bt_set_block, -+}; -+#ifdef CONFIG_HAS_EARLYSUSPEND -+static void bt_earlysuspend(struct early_suspend *h) -+{ -+ -+ return; -+} -+ -+static void bt_lateresume(struct early_suspend *h) -+{ -+ -+ return; -+} -+#endif -+ -+static int bt_suspend(struct platform_device *pdev, pm_message_t state) -+{ -+ -+ return 0; -+} -+ -+static int bt_resume(struct platform_device *pdev) -+{ -+ -+ return 0; -+} -+ -+static int bt_probe(struct platform_device *pdev) -+{ -+ int ret = 0; -+ struct rfkill *bt_rfk; -+ struct bt_dev_data *pdata = NULL; -+ struct bt_dev_runtime_data *prdata; -+ -+#ifdef CONFIG_OF -+ //plat = aml_get_driver_data(pdev); -+ if (pdev->dev.of_node) { -+ const char *str; -+ -+ printk(KERN_DEBUG "enter bt_probe of_node\n"); -+ pdata = kzalloc(sizeof(struct bt_dev_data), GFP_KERNEL); -+ ret = of_property_read_string(pdev->dev.of_node,"gpio_reset",&str); -+ if(ret){ -+ printk(KERN_WARNING "not get gpio_reset\n"); -+ pdata->gpio_reset = 0; -+ } else { -+ pdata->gpio_reset = amlogic_gpio_name_map_num(str); -+ } -+ -+ ret = of_property_read_string(pdev->dev.of_node,"gpio_en",&str); -+ if(ret){ -+ printk(KERN_WARNING "not get gpio_en\n"); -+ pdata->gpio_en = 0; -+ } else { -+ pdata->gpio_en = amlogic_gpio_name_map_num(str); -+ } -+ -+ ret = of_property_read_string(pdev->dev.of_node,"gpio_wake",&str); -+ if(ret){ -+ printk(KERN_WARNING "not get gpio_wake\n"); -+ pdata->gpio_wake = 0; -+ } else { -+ pdata->gpio_wake = amlogic_gpio_name_map_num(str); -+ } -+ -+ pdata->pinctrl = devm_pinctrl_get_select_default(&pdev->dev); -+ -+ } -+#else -+ pdata = (struct bt_dev_data *)(pdev->dev.platform_data); -+#endif -+ -+ bt_device_init(pdata); -+ /* default to bluetooth off */ -+ //rfkill_switch_all(RFKILL_TYPE_BLUETOOTH, 1); -+ bt_device_off(pdata); -+ -+ bt_rfk = rfkill_alloc("bt-dev", &pdev->dev, RFKILL_TYPE_BLUETOOTH, -+ &bt_rfkill_ops, pdata); -+ -+ if (!bt_rfk) { -+ printk("rfk alloc fail\n"); -+ ret = -ENOMEM; -+ goto err_rfk_alloc; -+ } -+ /* if not set false, the bt_set_block will call when rfkill class resume */ -+ rfkill_init_sw_state(bt_rfk, false); //we want to reset bt when system resume -+ ret = rfkill_register(bt_rfk); -+ if (ret){ -+ printk(KERN_ERR "rfkill_register fail\n"); -+ goto err_rfkill; -+ } -+ prdata = kmalloc(sizeof(struct bt_dev_runtime_data), GFP_KERNEL); -+ if (!prdata) { -+ printk(KERN_ERR "bt_dev_runtime_data alloc fail\n"); -+ goto err_rfkill; -+ } -+#ifdef CONFIG_AM_WIFI_SD_MMC -+ //setup 32k clock -+ wifi_request_32k_clk(1, BT_RFKILL); -+ msleep(100); -+#endif -+ -+ prdata->bt_rfk = bt_rfk; -+ prdata->pdata = pdata; -+ platform_set_drvdata(pdev, prdata); -+#ifdef CONFIG_HAS_EARLYSUSPEND -+ bt_early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB; -+ bt_early_suspend.suspend = bt_earlysuspend; -+ bt_early_suspend.resume = bt_lateresume; -+ bt_early_suspend.param = pdev; -+ register_early_suspend(&bt_early_suspend); -+#endif -+ -+ return 0; -+ -+err_rfkill: -+ rfkill_destroy(bt_rfk); -+err_rfk_alloc: -+ bt_device_deinit(pdata); -+ return ret; -+ -+} -+ -+static int bt_remove(struct platform_device *pdev) -+{ -+ struct bt_dev_runtime_data *prdata = platform_get_drvdata(pdev); -+ struct rfkill *rfk = NULL; -+ struct bt_dev_data *pdata = NULL; -+ -+ platform_set_drvdata(pdev, NULL); -+#ifdef CONFIG_AM_WIFI_SD_MMC -+ wifi_request_32k_clk(0, BT_RFKILL); -+#endif -+ if(prdata) { -+ rfk = prdata->bt_rfk; -+ pdata = prdata->pdata; -+ } -+ -+ if(pdata) { -+ if (pdata->pinctrl) -+ devm_pinctrl_put(pdata->pinctrl); -+ -+ bt_device_deinit(pdata); -+ kfree(pdata); -+ } -+ -+ if (rfk) { -+ rfkill_unregister(rfk); -+ rfkill_destroy(rfk); -+ } -+ rfk = NULL; -+ -+ return 0; -+} -+ -+#ifdef CONFIG_OF -+static const struct of_device_id bt_dev_dt_match[]={ -+ { .compatible = "amlogic,bt-dev", -+ }, -+ {}, -+}; -+#else -+#define bt_dev_dt_match NULL -+#endif -+ -+static struct platform_driver bt_driver = { -+ .driver = { -+ .name = "bt-dev", -+ .of_match_table = bt_dev_dt_match, -+ }, -+ .probe = bt_probe, -+ .remove = bt_remove, -+ .suspend = bt_suspend, -+ .resume = bt_resume, -+}; -+ -+static int __init bt_init(void) -+{ -+ printk("amlogic rfkill init\n"); -+ -+ return platform_driver_register(&bt_driver); -+} -+static void __exit bt_exit(void) -+{ -+ platform_driver_unregister(&bt_driver); -+} -+ -+module_init(bt_init); -+module_exit(bt_exit); -+MODULE_DESCRIPTION("bt rfkill"); -+MODULE_AUTHOR(""); -+MODULE_LICENSE("GPL"); diff -Naur a/drivers/amlogic/Kconfig b/drivers/amlogic/Kconfig --- a/drivers/amlogic/Kconfig 2015-01-04 18:07:57.000000000 +0100 +++ b/drivers/amlogic/Kconfig 2015-01-01 15:31:17.000000000 +0100 @@ -680,8 +23,8 @@ diff -Naur a/drivers/amlogic/Makefile b/drivers/amlogic/Makefile diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c --- a/drivers/amlogic/wetek/avl6211.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/drivers/amlogic/wetek/avl6211.c 2015-02-12 18:17:24.000000000 +0100 -@@ -0,0 +1,1987 @@ ++++ b/drivers/amlogic/wetek/avl6211.c 2015-02-18 17:18:24.000000000 +0100 +@@ -0,0 +1,1979 @@ +/* + * Driver for the Availink AVL6211+AV2011 DVB-S/S2 demod+tuner + * @@ -1078,31 +421,6 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); + return ret; +} -+static int avl6211_cpu_halt(struct dvb_frontend* fe) -+{ -+ struct avl6211_state *state = fe->demodulator_priv; -+ int ret, i = 0; -+ -+ ret = avl6211_send_op(OP_RX_HALT, state); -+ if (ret) -+ goto err; -+ -+ while (i++ < 20) { -+ ret = avl6211_get_op_status(state); -+ if (!ret) -+ break; -+ else -+ mdelay(10); -+ } -+ if (ret) -+ goto err; -+ -+ return 0; -+ -+err: -+ dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); -+ return ret; -+} +static int avl6211_i2c_repeater_get_status(struct avl6211_state* state) +{ + int ret; @@ -1299,41 +617,6 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); + return ret; +} -+static int av2011_freq_lpf_adjustment(struct dvb_frontend* fe,u16 *AdjustFreq) -+{ -+ struct avl6211_state *state = fe->demodulator_priv; -+ int ret; -+ u32 x1; -+ u16 x2; -+ u16 minimum_LPF_100kHz; -+ u16 carrierFrequency_100kHz; -+ -+ ret = avl6211_i2c_read32(state, rc_Max_LowIf_SR_addr, &x1); -+ if (ret) -+ goto err; -+ ret = avl6211_i2c_read16(state, rc_IfOffset_addr, &x2); -+ if (ret) -+ goto err; -+ -+ if (state->symbol_rate <= x1) { -+ -+ carrierFrequency_100kHz = (u16 )((x2/10) + (state->frequency / 100)); -+ -+ minimum_LPF_100kHz = (state->symbol_rate/100000 )*135/200 + (x2/10) + 50; -+ -+ if (state->tuner_lpf < minimum_LPF_100kHz) -+ state->tuner_lpf = (u16)(minimum_LPF_100kHz); -+ } else -+ carrierFrequency_100kHz = state->frequency / 100; -+ -+ *AdjustFreq = carrierFrequency_100kHz; -+ return 0; -+ -+err: -+ *AdjustFreq = state->frequency / 100; -+ return ret; -+ -+} +static int av2011_lock(struct dvb_frontend* fe) +{ + int ret; @@ -1342,28 +625,30 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + u32 fracN; + u32 BW; + u32 BF; -+ u16 carrierFrequency_100kHz; ++ u32 freq = state->frequency / 1000; ++ u32 LPF = state->tuner_lpf * 100; + + memset(reg, 0, sizeof(reg)); -+ -+ /* Do not return on error */ -+ ret = av2011_freq_lpf_adjustment(fe, &carrierFrequency_100kHz); + + msleep(50); + -+ fracN = (((carrierFrequency_100kHz)/10) + 27/2) / 27; ++ fracN = (freq + 27/2) / 27; + if (fracN > 0xff) + fracN = 0xff; + + reg[0] = (char)(fracN & 0xff); -+ fracN = (((carrierFrequency_100kHz)/10) << 17) / 27; ++ fracN = (freq << 17) / 27; + fracN = fracN & 0x1ffff; + reg[1] = (char)((fracN >> 9) & 0xff); + reg[2] = (char)((fracN >> 1) & 0xff); + reg[3] = (char)((fracN << 7) & 0x80) | 0x50; + -+ BW = (state->tuner_lpf * 100); -+ ++ BW = (LPF * 135) / 200; ++ if (LPF < 6500) ++ BW = BW + 6000; ++ BW = BW + 2000; ++ BW = BW*108/100; ++ + if (BW < 4000) + BW = 4000; + if ( BW > 40000) @@ -1380,13 +665,7 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + goto err; + + msleep(5); -+ -+ ret = AV2011_I2C_write(0, reg, 4, state); -+ if (ret) -+ goto err; + -+ msleep(5); -+ + ret = AV2011_I2C_write(5, reg+5, 1, state); + if (ret) + goto err; @@ -2051,11 +1330,15 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + return ret; +} + -+static int avl6211_read_snr(struct dvb_frontend* fe, u16* snr) ++u8 DVBS_SNR[6] = { 12, 32, 41, 52, 58, 62 }; ++u8 DVBS2Qpsk_SNR[8] = { 10, 24, 32, 41, 47, 52, 63, 65 }; ++u8 DVBS28psk_SNR[6] = { 57, 67, 80, 95, 100, 110 }; ++static int avl6211_read_snr(struct dvb_frontend* fe, u16 *snr) +{ + struct avl6211_state *state = fe->demodulator_priv; + int ret; -+ u32 r_snr; ++ u8 SNRrefer = 0; ++ u32 r_snr, code_rate, modulation; + + *snr = 0; + @@ -2063,21 +1346,78 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + ret = avl6211_i2c_read32(state, rs_int_SNR_dB_addr, &r_snr); + if (ret) + goto err; -+ if (r_snr > 0 && r_snr <= 10000) -+ *snr = (r_snr * 0xffff) / 0x8B6; -+ ++ if (r_snr < 10000) { ++ ret = avl6211_i2c_read32(state, rs_code_rate_addr, &code_rate); ++ if (ret) ++ goto err; ++ ret = avl6211_i2c_read32(state, rs_modulation_addr, &modulation); ++ if (ret) ++ goto err; ++ ++ if (code_rate < 6) ++ SNRrefer = DVBS_SNR[code_rate]; ++ else { ++ if (modulation == 1) ++ SNRrefer = DVBS28psk_SNR[code_rate - 10]; ++ else ++ SNRrefer = DVBS2Qpsk_SNR[code_rate - 9]; ++ } ++ if ((r_snr / 10) > SNRrefer) { ++ r_snr = r_snr/10 - SNRrefer; ++ if (r_snr >= 100) ++ *snr = 99; ++ else if (r_snr >= 50) // >5.0dB ++ *snr = 80+ (r_snr - 50)*20/50; ++ else if (r_snr >= 25) // > 2.5dB ++ *snr = 50+ (r_snr - 25)*30/25; ++ else if (r_snr >= 10) // > 1dB ++ *snr = 25+ (r_snr - 10)*25/15; ++ else ++ *snr = 5 + (r_snr)*20/10; ++ ++ *snr = (*snr * 65535) / 100; ++ } ++ } + } + + return 0; +err: + dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); + return ret; -+} ++} ++struct Signal_Level ++{ ++ u16 SignalLevel; ++ short SignalDBM; ++}; ++struct Signal_Level AGC_LUT [91]= ++{ ++ {63688, 0},{62626, -1},{61840, -2},{61175, -3},{60626, -4},{60120, -5},{59647, -6},{59187, -7},{58741, -8},{58293, -9}, ++ {57822,-10},{57387,-11},{56913,-12},{56491,-13},{55755,-14},{55266,-15},{54765,-16},{54221,-17},{53710,-18},{53244,-19}, ++ {52625,-20},{52043,-21},{51468,-22},{50904,-23},{50331,-24},{49772,-25},{49260,-26},{48730,-27},{48285,-28},{47804,-29}, ++ {47333,-30},{46880,-31},{46460,-32},{46000,-33},{45539,-34},{45066,-35},{44621,-36},{44107,-37},{43611,-38},{43082,-39}, ++ {42512,-40},{41947,-41},{41284,-42},{40531,-43},{39813,-44},{38978,-45},{38153,-46},{37294,-47},{36498,-48},{35714,-49}, ++ {35010,-50},{34432,-51},{33814,-52},{33315,-53},{32989,-54},{32504,-55},{32039,-56},{31608,-57},{31141,-58},{30675,-59}, ++ {30215,-60},{29711,-61},{29218,-62},{28688,-63},{28183,-64},{27593,-65},{26978,-66},{26344,-67},{25680,-68},{24988,-69}, ++ {24121,-70},{23285,-71},{22460,-72},{21496,-73},{20495,-74},{19320,-75},{18132,-76},{16926,-77},{15564,-78},{14398,-79}, ++ {12875,-80},{11913,-81},{10514,-82},{ 9070,-83},{ 7588,-84},{ 6044,-85},{ 4613,-86},{ 3177,-87},{ 1614,-88},{ 123,-89}, ++ { 0,-90} ++}; +static int avl6211_read_signal_strength(struct dvb_frontend* fe, u16* signal_strength) +{ ++ #define Level_High_Stage 36 ++ #define Level_Low_Stage 76 ++ ++ #define Percent_Space_High 10 ++ #define Percent_Space_Mid 30 ++ #define Percent_Space_Low 60 ++ + struct avl6211_state *state = fe->demodulator_priv; + int ret; + u32 rf; ++ u16 Level; ++ int i = 0; ++ int Percent = 0; + *signal_strength = 0; + + if (state->locked == 1) { @@ -2087,8 +1427,18 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + + rf += 0x800000; + rf &= 0xffffff; -+ *signal_strength = (u16)(rf >> 8); ++ Level = (u16)(rf >> 8); + ++ while( Level < AGC_LUT[i++].SignalLevel); ++ ++ if (i <= Level_High_Stage) ++ Percent = Percent_Space_Low+Percent_Space_Mid+ (Level_High_Stage-i)*Percent_Space_High/Level_High_Stage; ++ else if(i<=Level_Low_Stage) ++ Percent = Percent_Space_Low+ (Level_Low_Stage-i)*Percent_Space_Mid/(Level_Low_Stage-Level_High_Stage); ++ else ++ Percent =(90-i)*Percent_Space_Low/(90-Level_Low_Stage); ++ ++ *signal_strength = (Percent * 65535) / 100; + } + + return 0; @@ -2191,10 +1541,7 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + ret = avl6211_i2c_write16(state, rc_lock_mode_addr, 0); + if (ret) + goto err; -+ ret = avl6211_i2c_write16(state, rc_int_carrier_freq_half_range_MHz_addr, 500); -+ if (ret) -+ goto err; -+ ++ + IQ = ((state->flags) & CI_FLAG_IQ_BIT_MASK) >> CI_FLAG_IQ_BIT; + ret = avl6211_i2c_write32(state, rc_specinv_addr, IQ); + if (ret) @@ -2261,14 +1608,11 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + dev_info(&state->i2c->dev, + "%s: delivery_system=%d frequency=%d symbol_rate=%d\n", + __func__, c->delivery_system, c->frequency, c->symbol_rate); -+ -+ /* Halt CPU to improve tuner's locking speed */ -+ ret = avl6211_cpu_halt(fe); -+ if (ret) -+ goto err; + -+ state->tuner_lpf = ((state->symbol_rate * 75) / (10000000)) + 40; -+ ++ state->tuner_lpf = (state->symbol_rate / 100000); ++ if (state->tuner_lpf > 440) ++ state->tuner_lpf = 440; ++ + ret = av2011_lock(fe); + if (ret) + goto err; @@ -2299,7 +1643,6 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + state->flags = (CI_FLAG_IQ_NO_SWAPPED) << CI_FLAG_IQ_BIT; //Normal IQ + state->flags |= (CI_FLAG_IQ_AUTO_BIT_AUTO) << CI_FLAG_IQ_AUTO_BIT; //Enable automatic IQ swap detection + state->flags |= (CI_FLAG_DVBS2_UNDEF) << CI_FLAG_DVBS2_BIT; //Enable automatic standard detection -+ state->flags |= CI_FLAG_LOCK_MODE_BIT_MASK; + + //This function should be called after tuner locked to lock the channel. + ret = avl6211_channel_lock(fe); @@ -2488,7 +1831,8 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + ret = avl6211_setup_pll(state, (const struct avl6211_pllconf * )(pll_conf + state->config->demod_refclk)); + if (ret) + goto err; -+ msleep(5); ++ ++ msleep(100); + + ret = avl6211_load_firmware(fe); + if (ret) @@ -2500,6 +1844,10 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + if (ret) + goto err; + ++ ++ ret = avl6211_i2c_write32(state, 0x263E, 50000); ++ if (ret) ++ goto err; + /* Set clk to match the PLL */ + ret = avl6211_i2c_write16(state, rc_int_dmd_clk_MHz_addr, state->demod_freq); + if (ret) @@ -2525,20 +1873,7 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c + ret = avl6211_i2c_write32(state, rc_rfagc_tri_enb, 1); + if (ret) + goto err; -+ -+ ret = avl6211_i2c_write16(state, rc_fast_reacquisition_addr, ENABLE_FAST_REACQ); -+ if (ret) -+ goto err; -+ ret = avl6211_i2c_write32(state, rc_equalizer_addr, ENABLE_CCI); -+ if (ret) -+ goto err; -+ ret = avl6211_i2c_write16(state, rc_IfOffset_addr, IF_OFFSET); -+ if (ret) -+ goto err; -+ ret = avl6211_i2c_write32(state, rc_Max_LowIf_SR_addr, MAX_LOWIF_SR); //Open the low symbol rate frequency offset -+ if (ret) -+ goto err; -+ ++ + ret = avl6211_i2c_write16(state, rc_blind_scan_tuner_spectrum_inversion_addr, (u16)state->config->tuner_spectrum); + if (ret) + goto err; @@ -2669,10 +2004,9 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.c b/drivers/amlogic/wetek/avl6211.c +MODULE_DESCRIPTION("Availink AVL6211+AV2011 demod+tuner driver"); +MODULE_AUTHOR("Sasa Savic "); +MODULE_LICENSE("GPL"); -\ No newline at end of file diff -Naur a/drivers/amlogic/wetek/avl6211.h b/drivers/amlogic/wetek/avl6211.h --- a/drivers/amlogic/wetek/avl6211.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/drivers/amlogic/wetek/avl6211.h 2015-01-26 21:34:29.000000000 +0100 ++++ b/drivers/amlogic/wetek/avl6211.h 2015-02-14 20:07:51.000000000 +0100 @@ -0,0 +1,156 @@ +/* + * Driver for the Availink AVL6211+AV2011 DVB-S/S2 demod+tuner @@ -2833,8 +2167,8 @@ diff -Naur a/drivers/amlogic/wetek/avl6211.h b/drivers/amlogic/wetek/avl6211.h \ No newline at end of file diff -Naur a/drivers/amlogic/wetek/avl6211_reg.h b/drivers/amlogic/wetek/avl6211_reg.h --- a/drivers/amlogic/wetek/avl6211_reg.h 1970-01-01 01:00:00.000000000 +0100 -+++ b/drivers/amlogic/wetek/avl6211_reg.h 2015-01-25 00:48:17.000000000 +0100 -@@ -0,0 +1,106 @@ ++++ b/drivers/amlogic/wetek/avl6211_reg.h 2015-02-18 17:14:59.000000000 +0100 +@@ -0,0 +1,101 @@ +/* + * Driver for the Availink AVL6211+AV2011 DVB-S/S2 demod+tuner + * @@ -2874,7 +2208,7 @@ diff -Naur a/drivers/amlogic/wetek/avl6211_reg.h b/drivers/amlogic/wetek/avl6211 +#define reset_register_addr 0x6C4000 + + -+#define rx_aagc_gain 0x0000261A ++#define rx_aagc_gain 0x0040004C +#define rc_rfagc_tri_enb 0x006C002C +#define rc_mpeg_bus_tri_enb 0x006C0028 + @@ -2888,14 +2222,13 @@ diff -Naur a/drivers/amlogic/wetek/avl6211_reg.h b/drivers/amlogic/wetek/avl6211 +#define rx_config_addr (0x0000043c + 0x0) +#define core_ready_word_addr (0x00000434 + 0x0) + -+ -+ -+#define rs_cust_chip_id_addr 0x006C0030 ++#define rs_cust_chip_id_addr 0x006C0034 + +#define rp_uint_BER_addr (raptor_status_addr + 0x0) +#define rc_rfagc_pol_addr (rx_config_addr + 0x0) +#define rc_equalizer_addr (rx_config_addr + 0x8) +#define rs_code_rate_addr (rx_state_addr + 0x8) ++#define rs_modulation_addr (rx_state_addr + 0xc) +#define rc_format_addr (rx_config_addr + 0x10) +#define rc_mpeg_mode_addr (rx_config_addr + 0x20) +#define rc_outpin_sel_addr (rx_config_addr + 0x24) @@ -2936,16 +2269,11 @@ diff -Naur a/drivers/amlogic/wetek/avl6211_reg.h b/drivers/amlogic/wetek/avl6211 +#define diseqc_samp_frac_d_addr 0x0070002c +#define diseqc_tx_fifo_map_addr 0x00700080 + -+#define rc_fast_reacquisition_addr 0x2622 -+#define rc_Max_LowIf_SR_addr 0x263E -+#define rc_IfOffset_addr 0x2642 -+ +#endif -\ No newline at end of file diff -Naur a/drivers/amlogic/wetek/cxd2837.c b/drivers/amlogic/wetek/cxd2837.c --- a/drivers/amlogic/wetek/cxd2837.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/drivers/amlogic/wetek/cxd2837.c 2015-02-12 20:29:11.000000000 +0100 -@@ -0,0 +1,1731 @@ ++++ b/drivers/amlogic/wetek/cxd2837.c 2015-02-14 23:42:26.000000000 +0100 +@@ -0,0 +1,1790 @@ +/* + * Sony CXD2837 DVB-T/T2/C demodulator driver + * @@ -4318,9 +3646,68 @@ diff -Naur a/drivers/amlogic/wetek/cxd2837.c b/drivers/amlogic/wetek/cxd2837.c + + return ret; +} ++static int get_ucblocksC(struct cxd_state *state, u32 *ucblocks) ++{ ++ u8 data[3]; ++ ++ readregst(state, 0x40, 0xEA, data, 3); ++ ++ if (!(data[2] & 0x01)) ++ return 0; ++ ++ *ucblocks = (data[0] << 8) | data[1]; ++ return 0; ++} ++static int get_ucblocksT(struct cxd_state *state, u32 *ucblocks) ++{ ++ u8 data[3]; ++ ++ readregst(state, 0x10, 0xEA, data, 3); ++ ++ if (!(data[2] & 0x01)) ++ return 0; ++ ++ *ucblocks = (data[0] << 8) | data[1]; ++ return 0; ++ ++} ++static int get_ucblocksT2(struct cxd_state *state, u32 *ucblocks) ++{ ++ u8 data[3]; ++ ++ readregst(state, 0x24, 0xFD, data, 3); ++ if (!(data[0] & 0x01)) ++ return 0; ++ ++ *ucblocks = ((data[1] << 0x08) | data[2]); ++ ++ return 0; ++} ++ ++ +static int read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) +{ ++ struct cxd_state *state = fe->demodulator_priv; ++ int ret = 0; + *ucblocks = 0; ++ ++ if (state->last_status != 0x1f) ++ return 0; ++ ++ switch (state->delivery_system) { ++ case SYS_DVBC_ANNEX_A: ++ ret = get_ucblocksC(state, ucblocks); ++ break; ++ case SYS_DVBT: ++ ret = get_ucblocksT(state, ucblocks); ++ break; ++ case SYS_DVBT2: ++ ret = get_ucblocksT2(state, ucblocks); ++ break; ++ default: ++ break; ++ } ++ + return 0; +} +static int get_fe_t(struct cxd_state *state) @@ -6441,7 +5828,7 @@ diff -Naur a/drivers/amlogic/wetek/mxl603.h b/drivers/amlogic/wetek/mxl603.h +#endif /* __MXL603_H__ */ diff -Naur a/drivers/amlogic/wetek/nimdetect.c b/drivers/amlogic/wetek/nimdetect.c --- a/drivers/amlogic/wetek/nimdetect.c 1970-01-01 01:00:00.000000000 +0100 -+++ b/drivers/amlogic/wetek/nimdetect.c 2015-02-12 19:54:38.000000000 +0100 ++++ b/drivers/amlogic/wetek/nimdetect.c 2015-02-18 15:33:06.000000000 +0100 @@ -0,0 +1,405 @@ +/* + * Wetek NIMs/DVB detection @@ -6538,7 +5925,7 @@ diff -Naur a/drivers/amlogic/wetek/nimdetect.c b/drivers/amlogic/wetek/nimdetect + .mpeg_pol = 1, + .mpeg_mode = 0, + .mpeg_format = 0, -+ .demod_refclk = 4, ++ .demod_refclk = 9, + .mpeg_pin = 0, + .tuner_rfagc = 1, + .tuner_spectrum = 0, @@ -6553,7 +5940,7 @@ diff -Naur a/drivers/amlogic/wetek/nimdetect.c b/drivers/amlogic/wetek/nimdetect + .mpeg_pol = 1, + .mpeg_mode = 0, + .mpeg_format = 0, -+ .demod_refclk = 4, ++ .demod_refclk = 9, + .mpeg_pin = 0, + .tuner_rfagc = 1, + .tuner_spectrum = 0, @@ -6902,3 +6289,91 @@ diff -Naur a/drivers/amlogic/wetek/nimdetect.h b/drivers/amlogic/wetek/nimdetect +int set_external_vol_gpio(int *demod_id, int on); + +#endif /* __NIMDETECT_H */ +diff -Naur a/drivers/amlogic/wifi/wifi_dt.c b/drivers/amlogic/wifi/wifi_dt.c +--- a/drivers/amlogic/wifi/wifi_dt.c 2015-02-14 20:42:24.000000000 +0100 ++++ b/drivers/amlogic/wifi/wifi_dt.c 2015-02-14 20:24:00.000000000 +0100 +@@ -162,11 +162,48 @@ + .of_match_table = wifi_match + }, + }; ++struct pinctrl *bt_pinctrl = NULL; ++ ++static int bt_probe(struct platform_device *pdev) ++{ ++#ifdef CONFIG_OF ++ if (pdev->dev.of_node) { ++ bt_pinctrl = devm_pinctrl_get_select_default(&pdev->dev); ++ } ++#endif ++ return 0; ++} ++static int bt_remove(struct platform_device *pdev) ++{ ++ if (bt_pinctrl) ++ devm_pinctrl_put(bt_pinctrl); ++ ++ return 0; ++} ++#ifdef CONFIG_OF ++static const struct of_device_id bt_dev_dt_match[]={ ++ { .compatible = "amlogic,bt-dev", ++ }, ++ {}, ++}; ++#else ++#define bt_dev_dt_match NULL ++#endif ++ ++static struct platform_driver bt_driver = { ++ .driver = { ++ .name = "bt-dev", ++ .of_match_table = bt_dev_dt_match, ++ }, ++ .probe = bt_probe, ++ .remove = bt_remove, ++}; + + static int __init wifi_dt_init(void) + { + int ret; + ret = platform_driver_register(&wifi_plat_driver); ++ ret = platform_driver_register(&bt_driver); + return ret; + } + // module_init(wifi_dt_init); +@@ -175,6 +212,7 @@ + static void __exit wifi_dt_exit(void) + { + platform_driver_unregister(&wifi_plat_driver); ++ platform_driver_unregister(&bt_driver); + } + module_exit(wifi_dt_exit); + +@@ -247,6 +285,27 @@ + SHOW_PIN_OWN("power_on_pin2", wifi_info.power_on_pin2); + } + ++ if (bt_pinctrl) { ++ ++ printk("bt_setup\n"); ++ ret = amlogic_gpio_request(GPIOX_10, OWNER_NAME); ++ CHECK_RET(ret); ++ ret = amlogic_gpio_direction_output(GPIOX_10, 1, OWNER_NAME); ++ CHECK_RET(ret); ++ msleep(50); ++ ++ ++ ret = amlogic_gpio_request(GPIOE_11, OWNER_NAME); ++ CHECK_RET(ret); ++ ret = amlogic_gpio_direction_output(GPIOE_11, 0, OWNER_NAME); ++ CHECK_RET(ret); ++ msleep(20); ++ ++ ret = amlogic_gpio_direction_output(GPIOE_11, 1, OWNER_NAME); ++ CHECK_RET(ret); ++ msleep(50); ++ ++ } + return 0; + } + EXPORT_SYMBOL(wifi_setup_dt);