tuner_drv_wrap.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. /*
  2. *
  3. * drivers/media/isdbtmm/tuner_drv_wrap.c
  4. *
  5. * MM Tuner Driver
  6. *
  7. * Copyright (C) (2013, Samsung Electronics)
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation version 2.
  12. *
  13. * This program is distributed "as is" WITHOUT ANY WARRANTY of any
  14. * kind, whether express or implied; without even the implied warranty
  15. * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. */
  19. /******************************************************************************
  20. * include
  21. ******************************************************************************/
  22. #include <linux/module.h>
  23. #include <linux/kernel.h>
  24. #include <linux/init.h>
  25. #include <linux/types.h>
  26. #include <linux/fs.h>
  27. #include <linux/cdev.h>
  28. #include <linux/sched.h>
  29. #include <linux/platform_device.h>
  30. #include <linux/device.h>
  31. #include <linux/err.h>
  32. #include <linux/slab.h>
  33. #include <linux/i2c.h>
  34. #include <linux/i2c-dev.h>
  35. #include <linux/mm.h>
  36. #include <asm/uaccess.h>
  37. #include "tuner_drv.h"
  38. #include <asm/system_info.h>
  39. #include <linux/barcode_emul.h>
  40. #include <mach/gpio.h>
  41. #include <mach/gpiomux.h>
  42. #include <mach/isdbtmm_pdata.h>
  43. #if defined(CONFIG_TMM_CHG_CTRL)
  44. #include <linux/power_supply.h>
  45. #include <linux/battery/sec_charger.h>
  46. #define TUNER_SWITCHED_ON_SIGNAL -1
  47. #define TUNER_SWITCHED_OFF_SIGNAL -2
  48. #endif
  49. #include <linux/regulator/consumer.h>
  50. #ifdef TUNER_CONFIG_IRQ_PC_LINUX
  51. #include "../../../i2c-parport-x/i2c-parport.h"
  52. #endif /* TUNER_CONFIG_IRQ_PC_LINUX */
  53. #include "tuner.h"
  54. extern struct isdbtmm_platform_data *isdbtmm_pdata;
  55. /******************************************************************************/
  56. /* function */
  57. /******************************************************************************/
  58. int tuner_drv_ctl_power( int data );
  59. int tuner_drv_set_interrupt( void );
  60. void tuner_drv_release_interrupt( void );
  61. void tuner_drv_gpio_config_poweron( void );
  62. void tuner_drv_gpio_config_poweroff( void );
  63. /******************************************************************************
  64. * code area
  65. ******************************************************************************/
  66. /******************************************************************************
  67. * function: tuner_drv_ctl_power
  68. * brief : power control of a driver
  69. * date : 2011.08.26
  70. * author : M.Takahashi(*)
  71. *
  72. * return : 0 normal exit
  73. * : -1 error exit
  74. * input : data setting data
  75. * output : none
  76. ******************************************************************************/
  77. int tuner_drv_ctl_power( int data )
  78. {
  79. /* power on */
  80. if( data == TUNER_DRV_CTL_POWON )
  81. {
  82. printk("tuner_drv_ctl_power poweron\n");
  83. /* poweron gpio config setting */
  84. tuner_drv_gpio_config_poweron();
  85. /* TMM_PWR_EN high */
  86. gpio_set_value(isdbtmm_pdata->gpio_en, 1);
  87. /* 15ms sleep */
  88. usleep_range(15000, 15000);
  89. /* TMM_RST high */
  90. gpio_set_value(isdbtmm_pdata->gpio_rst, 1);
  91. /* 2ms sleep */
  92. usleep_range(2000, 2000);
  93. }
  94. /* power off */
  95. else
  96. {
  97. printk("tuner_drv_ctl_power poweroff\n");
  98. /* poweroff gpio config setting */
  99. tuner_drv_gpio_config_poweroff();
  100. gpio_set_value(isdbtmm_pdata->gpio_i2c_sda, 0);
  101. printk("ISDBTMM POWER OFF GPIO_I2C_SDA = %d\n",gpio_get_value_cansleep(isdbtmm_pdata->gpio_i2c_sda));
  102. gpio_set_value(isdbtmm_pdata->gpio_spi_di, 0);
  103. gpio_set_value(isdbtmm_pdata->gpio_spi_do, 0);
  104. gpio_set_value(isdbtmm_pdata->gpio_spi_clk, 0);
  105. gpio_set_value(isdbtmm_pdata->gpio_spi_cs, 0);
  106. /* 1ms sleep */
  107. usleep_range(1000, 1000);
  108. /* TMM_RST low */
  109. gpio_set_value(isdbtmm_pdata->gpio_rst, 0);
  110. /* 2ms sleep */
  111. usleep_range(2000, 2000);
  112. /* TMM_PWR_EN low */
  113. gpio_set_value(isdbtmm_pdata->gpio_en, 0);
  114. }
  115. return 0;
  116. }
  117. /******************************************************************************
  118. * function: tuner_drv_set_interrupt
  119. * brief : interruption registration control of a driver
  120. * date : 2011.08.26
  121. * author : M.Takahashi(*)
  122. *
  123. * return : 0 normal exit
  124. * : -1 error exit
  125. * input : pdev
  126. * output : none
  127. ******************************************************************************/
  128. int tuner_drv_set_interrupt( void )
  129. {
  130. #ifndef TUNER_CONFIG_IRQ_PC_LINUX
  131. int ret;
  132. ret = request_irq( isdbtmm_pdata->gpio_int,
  133. tuner_interrupt,
  134. IRQF_DISABLED | IRQF_TRIGGER_RISING,
  135. "mm_tuner",
  136. NULL );
  137. if( ret != 0 )
  138. {
  139. return -1;
  140. }
  141. #else /* TUNER_CONFIG_IRQ_PC_LINUX */
  142. i2c_set_interrupt( tuner_interrupt );
  143. #endif /* TUNER_CONFIG_IRQ_PC_LINUX */
  144. return 0;
  145. }
  146. /******************************************************************************
  147. * function: tuner_drv_release_interrupt
  148. * brief : interruption registration release control of a driver
  149. * date : 2011.08.26
  150. * author : M.Takahashi(*)
  151. *
  152. * return : none
  153. * input : none
  154. * output : none
  155. ******************************************************************************/
  156. void tuner_drv_release_interrupt( void )
  157. {
  158. #ifndef TUNER_CONFIG_IRQ_PC_LINUX
  159. free_irq( isdbtmm_pdata->gpio_int, NULL );
  160. #else /* TUNER_CONFIG_IRQ_PC_LINUX */
  161. i2c_release_interrupt( NULL );
  162. #endif /* TUNER_CONFIG_IRQ_PC_LINUX */
  163. }
  164. #ifdef TUNER_CONFIG_IRQ_LEVELTRIGGER
  165. /******************************************************************************
  166. * function: tuner_drv_enable_interrupt
  167. * brief : interruption registration enable control of a driver
  168. * date : 2011.09.18
  169. * author : M.Takahashi(*)(*)
  170. *
  171. * return : none
  172. * input : none
  173. * output : none
  174. ******************************************************************************/
  175. void tuner_drv_enable_interrupt( void )
  176. {
  177. #ifndef TUNER_CONFIG_IRQ_PC_LINUX
  178. enable_irq( isdbtmm_pdata->gpio_int);
  179. #else /* TUNER_CONFIG_IRQ_PC_LINUX */
  180. i2c_set_interrupt( tuner_interrupt );
  181. #endif /* TUNER_CONFIG_IRQ_PC_LINUX */
  182. return;
  183. }
  184. /******************************************************************************
  185. * function: tuner_drv_disable_interrupt
  186. * brief : interruption registration disable control of a driver
  187. * date : 2011.09.18
  188. * author : M.Takahashi(*)(*)
  189. *
  190. * return : none
  191. * input : none
  192. * output : none
  193. ******************************************************************************/
  194. void tuner_drv_disable_interrupt( void )
  195. {
  196. #ifndef TUNER_CONFIG_IRQ_PC_LINUX
  197. disable_irq( isdbtmm_pdata->gpio_int);
  198. #else /* TUNER_CONFIG_IRQ_PC_LINUX */
  199. i2c_release_interrupt( NULL );
  200. #endif /* TUNER_CONFIG_IRQ_PC_LINUX */
  201. return;
  202. }
  203. #endif /* TUNER_CONFIG_IRQ_LEVELTRIGGER */
  204. /******************************************************************************
  205. * function: tuner_drv_gpio_config_poweron
  206. * brief : interruption registration disable control of a driver
  207. * date : 2012.12.18
  208. * author : K.Matsumaru(*)(*)
  209. *
  210. * return : none
  211. * input : none
  212. * output : none
  213. ******************************************************************************/
  214. void tuner_drv_gpio_config_poweron( void )
  215. {
  216. #if defined(CONFIG_TMM_CHG_CTRL)
  217. union power_supply_propval value;
  218. tmm_chg_log("TMM Charge control: Sending TMM Tuner Powered ON Signal\n");
  219. value.intval = TUNER_SWITCHED_ON_SIGNAL;
  220. psy_do_property("battery", set, POWER_SUPPLY_PROP_CURRENT_NOW, value);
  221. #endif
  222. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_di, GPIOMUX_FUNC_1,
  223. GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
  224. GPIO_CFG_ENABLE);
  225. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_do, GPIOMUX_FUNC_1,
  226. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
  227. GPIO_CFG_ENABLE);
  228. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_cs, GPIOMUX_FUNC_1,
  229. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
  230. GPIO_CFG_ENABLE);
  231. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_clk, GPIOMUX_FUNC_1,
  232. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_8MA),
  233. GPIO_CFG_ENABLE);
  234. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_int, GPIOMUX_FUNC_1,
  235. GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
  236. GPIO_CFG_ENABLE);
  237. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_en, GPIOMUX_FUNC_GPIO,
  238. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
  239. GPIO_CFG_ENABLE);
  240. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_rst, GPIOMUX_FUNC_GPIO,
  241. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
  242. GPIO_CFG_ENABLE);
  243. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_i2c_sda, GPIOMUX_FUNC_3,
  244. GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  245. GPIO_CFG_ENABLE);
  246. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_i2c_scl, GPIOMUX_FUNC_3,
  247. GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  248. GPIO_CFG_ENABLE);
  249. return;
  250. }
  251. void driver_config_during_boot_up(void)
  252. {
  253. /* IORA GPIO control check failed.
  254. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_i2c_sda, GPIOMUX_FUNC_GPIO,
  255. GPIO_CFG_OUTPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  256. GPIO_CFG_ENABLE);
  257. printk("driver_config_during_boot_up()!\n");
  258. */
  259. }
  260. /******************************************************************************
  261. * function: tuner_drv_gpio_config_poweroff
  262. * brief : interruption registration disable control of a driver
  263. * date : 2012.12.18
  264. * author : K.Matsumaru(*)(*)
  265. *
  266. * return : none
  267. * input : none
  268. * output : none
  269. ******************************************************************************/
  270. void tuner_drv_gpio_config_poweroff( void )
  271. {
  272. #if defined(CONFIG_TMM_CHG_CTRL)
  273. union power_supply_propval value;
  274. tmm_chg_log("TMM Charge control: Sending TMM Tuner Powered OFF Signal\n");
  275. value.intval = TUNER_SWITCHED_OFF_SIGNAL;
  276. psy_do_property("battery", set, POWER_SUPPLY_PROP_CURRENT_NOW, value);
  277. #endif
  278. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_di, GPIOMUX_FUNC_GPIO,
  279. GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  280. GPIO_CFG_ENABLE);
  281. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_do, GPIOMUX_FUNC_GPIO,
  282. GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  283. GPIO_CFG_ENABLE);
  284. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_cs, GPIOMUX_FUNC_GPIO,
  285. GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  286. GPIO_CFG_ENABLE);
  287. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_spi_clk, GPIOMUX_FUNC_GPIO,
  288. GPIO_CFG_INPUT, GPIO_CFG_PULL_DOWN, GPIO_CFG_2MA),
  289. GPIO_CFG_ENABLE);
  290. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_int, GPIOMUX_FUNC_GPIO,
  291. GPIO_CFG_INPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
  292. GPIO_CFG_ENABLE);
  293. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_en, GPIOMUX_FUNC_GPIO,
  294. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
  295. GPIO_CFG_ENABLE);
  296. gpio_tlmm_config(GPIO_CFG(isdbtmm_pdata->gpio_rst, GPIOMUX_FUNC_GPIO,
  297. GPIO_CFG_OUTPUT, GPIO_CFG_NO_PULL, GPIO_CFG_2MA),
  298. GPIO_CFG_ENABLE);
  299. driver_config_during_boot_up();
  300. return;
  301. }